X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f6bcfd974ef26faf6f91a62cac09827e09463fd1..d21d2e5adf7a5acf3b496a9c4e87eab220bd75d8:/src/msw/menu.cpp diff --git a/src/msw/menu.cpp b/src/msw/menu.cpp index bf7b961b17..93e92056ef 100644 --- a/src/msw/menu.cpp +++ b/src/msw/menu.cpp @@ -28,6 +28,8 @@ #pragma hdrstop #endif +#if wxUSE_MENUS + #ifndef WX_PRECOMP #include "wx/frame.h" #include "wx/menu.h" @@ -170,7 +172,7 @@ void wxMenu::UpdateAccel(wxMenuItem *item) if ( accel ) m_accels[n] = accel; else - m_accels.Remove(n); + m_accels.RemoveAt(n); } if ( IsAttached() ) @@ -273,7 +275,7 @@ bool wxMenu::DoInsertOrAppend(wxMenuItem *pItem, size_t pos) #endif // __WIN32__ // if we're already attached to the menubar, we must update it - if ( IsAttached() ) + if ( IsAttached() && m_menuBar->IsAttached() ) { m_menuBar->Refresh(); } @@ -315,7 +317,7 @@ wxMenuItem *wxMenu::DoRemove(wxMenuItem *item) { delete m_accels[n]; - m_accels.Remove(n); + m_accels.RemoveAt(n); } //else: this item doesn't have an accel, nothing to do #endif // wxUSE_ACCEL @@ -326,7 +328,7 @@ wxMenuItem *wxMenu::DoRemove(wxMenuItem *item) wxLogLastError(wxT("RemoveMenu")); } - if ( IsAttached() ) + if ( IsAttached() && m_menuBar->IsAttached() ) { // otherwise, the chane won't be visible m_menuBar->Refresh(); @@ -431,64 +433,20 @@ bool wxMenu::MSWCommand(WXUINT WXUNUSED(param), WXWORD id) // NB: VC++ generates wrong assembler for `if ( id != idMenuTitle )'!! if ( id != (WXWORD)idMenuTitle ) { - wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED); - event.SetEventObject( this ); - event.SetId( id ); - event.SetInt( id ); - ProcessCommand(event); + // VZ: previosuly, the command int was set to id too which was quite + // useless anyhow (as it could be retrieved using GetId()) and + // uncompatible with wxGTK, so now we use the command int instead + // to pass the checked status + SendEvent(id, ::GetMenuState(GetHmenu(), id, MF_BYCOMMAND) & MF_CHECKED); } return TRUE; } -bool wxMenu::ProcessCommand(wxCommandEvent & event) -{ - bool processed = FALSE; - -#if wxUSE_MENU_CALLBACK - // Try a callback - if (m_callback) - { - (void)(*(m_callback))(*this, event); - processed = TRUE; - } -#endif // wxUSE_MENU_CALLBACK - - // Try the menu's event handler - if ( !processed && GetEventHandler()) - { - processed = GetEventHandler()->ProcessEvent(event); - } - - // Try the window the menu was popped up from (and up through the - // hierarchy) - wxWindow *win = GetInvokingWindow(); - if ( !processed && win ) - processed = win->GetEventHandler()->ProcessEvent(event); - - return processed; -} - // --------------------------------------------------------------------------- // other // --------------------------------------------------------------------------- -void wxMenu::Attach(wxMenuBar *menubar) -{ - // menu can be in at most one menubar because otherwise they would both - // delete the menu pointer - wxASSERT_MSG( !m_menuBar, wxT("menu belongs to 2 menubars, expect a crash") ); - - m_menuBar = menubar; -} - -void wxMenu::Detach() -{ - wxASSERT_MSG( m_menuBar, wxT("can't detach menu if it's not attached") ); - - m_menuBar = NULL; -} - wxWindow *wxMenu::GetWindow() const { if ( m_invokingWindow != NULL ) @@ -506,7 +464,6 @@ wxWindow *wxMenu::GetWindow() const void wxMenuBar::Init() { m_eventHandler = this; - m_menuBarFrame = NULL; m_hMenu = 0; } @@ -547,16 +504,14 @@ void wxMenuBar::Refresh() { wxCHECK_RET( IsAttached(), wxT("can't refresh unattached menubar") ); - DrawMenuBar(GetHwndOf(m_menuBarFrame)); + DrawMenuBar(GetHwndOf(GetFrame())); } WXHMENU wxMenuBar::Create() { - if (m_hMenu != 0 ) + if ( m_hMenu != 0 ) return m_hMenu; - wxCHECK_MSG( !m_hMenu, TRUE, wxT("menubar already created") ); - m_hMenu = (WXHMENU)::CreateMenu(); if ( !m_hMenu ) @@ -694,8 +649,6 @@ bool wxMenuBar::Insert(size_t pos, wxMenu *menu, const wxString& title) m_titles.Insert(title, pos); - menu->Attach(this); - if ( IsAttached() ) { if ( !::InsertMenu(GetHmenu(), pos, @@ -727,7 +680,8 @@ bool wxMenuBar::Append(wxMenu *menu, const wxString& title) if ( !wxMenuBarBase::Append(menu, title) ) return FALSE; - menu->Attach(this); + // Already done in Append above + //menu->Attach(this); m_titles.Add(title); @@ -766,8 +720,6 @@ wxMenu *wxMenuBar::Remove(size_t pos) wxLogLastError(wxT("RemoveMenu")); } - menu->Detach(); - #if wxUSE_ACCEL if ( menu->HasAccels() ) { @@ -816,7 +768,7 @@ void wxMenuBar::RebuildAccelTable() void wxMenuBar::Attach(wxFrame *frame) { -// wxASSERT_MSG( !IsAttached(), wxT("menubar already attached!") ); + wxMenuBarBase::Attach(frame); m_menuBarFrame = frame; @@ -827,44 +779,9 @@ void wxMenuBar::Attach(wxFrame *frame) void wxMenuBar::Detach() { -// ::DestroyMenu((HMENU)m_hMenu); m_hMenu = (WXHMENU)NULL; - m_menuBarFrame = NULL; -} - - -// --------------------------------------------------------------------------- -// wxMenuBar searching for menu items -// --------------------------------------------------------------------------- - -// Find the itemString in menuString, and return the item id or wxNOT_FOUND -int wxMenuBar::FindMenuItem(const wxString& menuString, - const wxString& itemString) const -{ - wxString menuLabel = wxStripMenuCodes(menuString); - size_t count = GetMenuCount(); - for ( size_t i = 0; i < count; i++ ) - { - wxString title = wxStripMenuCodes(m_titles[i]); - if ( menuLabel == title ) - return m_menus[i]->FindItem(itemString); - } - - return wxNOT_FOUND; -} - -wxMenuItem *wxMenuBar::FindItem(int id, wxMenu **itemMenu) const -{ - if ( itemMenu ) - *itemMenu = NULL; - - wxMenuItem *item = NULL; - size_t count = GetMenuCount(); - for ( size_t i = 0; !item && (i < count); i++ ) - { - item = m_menus[i]->FindItem(id, itemMenu); - } - return item; + wxMenuBarBase::Detach(); } +#endif // wxUSE_MENUS