Exemplo n.º 1
0
    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 ) );
        }
    }