void SetMenu( wxMenu* menu, const OS_string& items, EnabledCallback enabledCallback = NULL ) { // protect the MRU so that it is only tied to one menu HELIUM_ASSERT( m_Menu == NULL || m_Menu == menu ); m_Menu = menu; m_MenuItemIDToString.clear(); // Clear out the old menu items while ( m_Menu->GetMenuItemCount() > 0 ) { m_Menu->Delete( *( m_Menu->GetMenuItems().begin() ) ); } // Build a new list of menu items from the MRU OS_string::ReverseIterator mruItr = items.ReverseBegin(); OS_string::ReverseIterator mruEnd = items.ReverseEnd(); for ( ; mruItr != mruEnd; ++mruItr ) { const tstring& item = *mruItr; wxMenuItem* menuItem = menu->Append( wxID_ANY, item.c_str() ); bool enabled = true; if ( enabledCallback ) { enabled = (*enabledCallback)( item ); } if ( enabled ) { Connect( menuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MenuMRUEvtHandler::OnMRUMenuItem ), NULL, this ); } else { menuItem->SetItemLabel( ( item + TXT( " (missing)" ) ).c_str() ); menuItem->Enable( false ); } m_MenuItemIDToString.insert( M_MenuItemIDToString::value_type( menuItem->GetId(), item ) ); } }