X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c0ab6adfedf92aa4457821422e77c19b80f10bee..dd107c50be43e8d4dbdba20df162faf119a3781c:/src/msw/menu.cpp?ds=sidebyside diff --git a/src/msw/menu.cpp b/src/msw/menu.cpp index 845c67a0b4..b35727d9a8 100644 --- a/src/msw/menu.cpp +++ b/src/msw/menu.cpp @@ -62,10 +62,8 @@ static const int idMenuTitle = -2; // macros // ---------------------------------------------------------------------------- -#if !USE_SHARED_LIBRARY - IMPLEMENT_DYNAMIC_CLASS(wxMenu, wxEvtHandler) - IMPLEMENT_DYNAMIC_CLASS(wxMenuBar, wxEvtHandler) -#endif +IMPLEMENT_DYNAMIC_CLASS(wxMenu, wxEvtHandler) +IMPLEMENT_DYNAMIC_CLASS(wxMenuBar, wxWindow) // ============================================================================ // implementation @@ -84,7 +82,7 @@ void wxMenu::Init() m_hMenu = (WXHMENU)CreatePopupMenu(); if ( !m_hMenu ) { - wxLogLastError("CreatePopupMenu"); + wxLogLastError(wxT("CreatePopupMenu")); } // if we have a title, insert it in the beginning of the menu @@ -105,7 +103,7 @@ wxMenu::~wxMenu() { if ( !::DestroyMenu(GetHmenu()) ) { - wxLogLastError("DestroyMenu"); + wxLogLastError(wxT("DestroyMenu")); } } @@ -137,35 +135,50 @@ int wxMenu::FindAccel(int id) const void wxMenu::UpdateAccel(wxMenuItem *item) { - // find the (new) accel for this item - wxAcceleratorEntry *accel = wxGetAccelFromString(item->GetText()); - if ( accel ) - accel->m_command = item->GetId(); - - // find the old one - int n = FindAccel(item->GetId()); - if ( n == wxNOT_FOUND ) + if ( item->IsSubMenu() ) { - // no old, add new if any - if ( accel ) - m_accels.Add(accel); - else - return; // skipping RebuildAccelTable() below + wxMenu *submenu = item->GetSubMenu(); + wxMenuItemList::Node *node = submenu->GetMenuItems().GetFirst(); + while ( node ) + { + UpdateAccel(node->GetData()); + + node = node->GetNext(); + } } - else + else if ( !item->IsSeparator() ) { - // replace old with new or just remove the old one if no new - delete m_accels[n]; + // find the (new) accel for this item + wxAcceleratorEntry *accel = wxGetAccelFromString(item->GetText()); if ( accel ) - m_accels[n] = accel; + accel->m_command = item->GetId(); + + // find the old one + int n = FindAccel(item->GetId()); + if ( n == wxNOT_FOUND ) + { + // no old, add new if any + if ( accel ) + m_accels.Add(accel); + else + return; // skipping RebuildAccelTable() below + } else - m_accels.Remove(n); - } + { + // replace old with new or just remove the old one if no new + delete m_accels[n]; + if ( accel ) + m_accels[n] = accel; + else + m_accels.Remove(n); + } - if ( IsAttached() ) - { - m_menuBar->RebuildAccelTable(); + if ( IsAttached() ) + { + m_menuBar->RebuildAccelTable(); + } } + //else: it is a separator, they can't have accels, nothing to do } #endif // wxUSE_ACCEL @@ -221,7 +234,7 @@ bool wxMenu::DoInsertOrAppend(wxMenuItem *pItem, size_t pos) // menu is just a normal string (passed in data parameter) flags |= MF_STRING; - pData = (char*)pItem->GetText().c_str(); + pData = (wxChar*)pItem->GetText().c_str(); } BOOL ok; @@ -236,7 +249,7 @@ bool wxMenu::DoInsertOrAppend(wxMenuItem *pItem, size_t pos) if ( !ok ) { - wxLogLastError("Insert or AppendMenu"); + wxLogLastError(wxT("Insert or AppendMenu")); return FALSE; } @@ -260,7 +273,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(); } @@ -310,10 +323,10 @@ wxMenuItem *wxMenu::DoRemove(wxMenuItem *item) // remove the item from the menu if ( !::RemoveMenu(GetHmenu(), (UINT)pos, MF_BYPOSITION) ) { - wxLogLastError("RemoveMenu"); + wxLogLastError(wxT("RemoveMenu")); } - if ( IsAttached() ) + if ( IsAttached() && m_menuBar->IsAttached() ) { // otherwise, the chane won't be visible m_menuBar->Refresh(); @@ -363,7 +376,7 @@ void wxMenu::SetTitle(const wxString& label) (unsigned)idMenuTitle, m_title) || !::InsertMenu(hMenu, 1u, MF_BYPOSITION, (unsigned)-1, NULL) ) { - wxLogLastError("InsertMenu"); + wxLogLastError(wxT("InsertMenu")); } } } @@ -375,7 +388,7 @@ void wxMenu::SetTitle(const wxString& label) if ( !RemoveMenu(hMenu, 0, MF_BYPOSITION) || !RemoveMenu(hMenu, 0, MF_BYPOSITION) ) { - wxLogLastError("RemoveMenu"); + wxLogLastError(wxT("RemoveMenu")); } } else @@ -385,7 +398,7 @@ void wxMenu::SetTitle(const wxString& label) MF_BYPOSITION | MF_STRING, (unsigned)idMenuTitle, m_title) ) { - wxLogLastError("ModifyMenu"); + wxLogLastError(wxT("ModifyMenu")); } } } @@ -401,7 +414,7 @@ void wxMenu::SetTitle(const wxString& label) if ( !SetMenuItemInfo(hMenu, (unsigned)idMenuTitle, FALSE, &mii) ) { - wxLogLastError("SetMenuItemInfo"); + wxLogLastError(wxT("SetMenuItemInfo")); } } #endif // Win32 @@ -421,7 +434,13 @@ bool wxMenu::MSWCommand(WXUINT WXUNUSED(param), WXWORD id) wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED); event.SetEventObject( this ); event.SetId( id ); - event.SetInt( id ); + + // 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 + event.SetInt(::GetMenuState(GetHmenu(), id, MF_BYCOMMAND) & MF_CHECKED); + ProcessCommand(event); } @@ -432,12 +451,14 @@ 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()) @@ -530,23 +551,21 @@ wxMenuBar::~wxMenuBar() void wxMenuBar::Refresh() { - wxCHECK_RET( IsAttached(), wxT("can't refresh unatteched menubar") ); + wxCHECK_RET( IsAttached(), wxT("can't refresh unattached menubar") ); DrawMenuBar(GetHwndOf(m_menuBarFrame)); } 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 ) { - wxLogLastError("CreateMenu"); + wxLogLastError(wxT("CreateMenu")); } else { @@ -557,7 +576,7 @@ WXHMENU wxMenuBar::Create() (UINT)m_menus[i]->GetHMenu(), m_titles[i]) ) { - wxLogLastError("AppendMenu"); + wxLogLastError(wxT("AppendMenu")); } } } @@ -618,7 +637,7 @@ void wxMenuBar::SetLabelTop(size_t pos, const wxString& label) if ( ::ModifyMenu(GetHmenu(), pos, MF_BYPOSITION | MF_STRING | flagsOld, id, label) == (int)0xFFFFFFFF ) { - wxLogLastError("ModifyMenu"); + wxLogLastError(wxT("ModifyMenu")); } Refresh(); @@ -632,22 +651,6 @@ wxString wxMenuBar::GetLabelTop(size_t pos) const return m_titles[pos]; } -int wxMenuBar::FindMenu(const wxString& title) -{ - wxString menuTitle = wxStripMenuCodes(title); - - size_t count = GetMenuCount(); - for ( size_t i = 0; i < count; i++ ) - { - wxString title = wxStripMenuCodes(m_titles[i]); - if ( menuTitle == title ) - return i; - } - - return wxNOT_FOUND; - -} - // --------------------------------------------------------------------------- // wxMenuBar construction // --------------------------------------------------------------------------- @@ -664,14 +667,14 @@ wxMenu *wxMenuBar::Replace(size_t pos, wxMenu *menu, const wxString& title) // can't use ModifyMenu() because it deletes the submenu it replaces if ( !::RemoveMenu(GetHmenu(), (UINT)pos, MF_BYPOSITION) ) { - wxLogLastError("RemoveMenu"); + wxLogLastError(wxT("RemoveMenu")); } if ( !::InsertMenu(GetHmenu(), (UINT)pos, MF_BYPOSITION | MF_POPUP | MF_STRING, (UINT)GetHmenuOf(menu), title) ) { - wxLogLastError("InsertMenu"); + wxLogLastError(wxT("InsertMenu")); } #if wxUSE_ACCEL @@ -703,7 +706,7 @@ bool wxMenuBar::Insert(size_t pos, wxMenu *menu, const wxString& title) MF_BYPOSITION | MF_POPUP | MF_STRING, (UINT)GetHmenuOf(menu), title) ) { - wxLogLastError("InsertMenu"); + wxLogLastError(wxT("InsertMenu")); } #if wxUSE_ACCEL @@ -764,7 +767,7 @@ wxMenu *wxMenuBar::Remove(size_t pos) { if ( !::RemoveMenu(GetHmenu(), (UINT)pos, MF_BYPOSITION) ) { - wxLogLastError("RemoveMenu"); + wxLogLastError(wxT("RemoveMenu")); } menu->Detach(); @@ -817,7 +820,7 @@ void wxMenuBar::RebuildAccelTable() void wxMenuBar::Attach(wxFrame *frame) { - wxASSERT_MSG( !IsAttached(), wxT("menubar already attached!") ); +// wxASSERT_MSG( !IsAttached(), wxT("menubar already attached!") ); m_menuBarFrame = frame; @@ -847,7 +850,7 @@ int wxMenuBar::FindMenuItem(const wxString& menuString, for ( size_t i = 0; i < count; i++ ) { wxString title = wxStripMenuCodes(m_titles[i]); - if ( menuString == title ) + if ( menuLabel == title ) return m_menus[i]->FindItem(itemString); }