X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a96b4743ff1eb85279194a28f7c388dc5fcab648..1d529ef7eed851db9d007821decb9639e4e7fc16:/src/msw/menu.cpp diff --git a/src/msw/menu.cpp b/src/msw/menu.cpp index f8b1c4377b..25ea2adc19 100644 --- a/src/msw/menu.cpp +++ b/src/msw/menu.cpp @@ -73,7 +73,7 @@ extern wxMenu *wxCurrentPopupMenu; // ---------------------------------------------------------------------------- // the (popup) menu title has this special id -static const int idMenuTitle = -2; +static const int idMenuTitle = -3; // ---------------------------------------------------------------------------- // private functions @@ -433,9 +433,9 @@ void wxMenu::EndRadioGroup() m_startRadioGroup = -1; } -bool wxMenu::DoAppend(wxMenuItem *item) +wxMenuItem* wxMenu::DoAppend(wxMenuItem *item) { - wxCHECK_MSG( item, FALSE, _T("NULL item in wxMenu::DoAppend") ); + wxCHECK_MSG( item, NULL, _T("NULL item in wxMenu::DoAppend") ); bool check = FALSE; @@ -478,7 +478,7 @@ bool wxMenu::DoAppend(wxMenuItem *item) if ( !wxMenuBase::DoAppend(item) || !DoInsertOrAppend(item) ) { - return FALSE; + return NULL; } if ( check ) @@ -487,12 +487,15 @@ bool wxMenu::DoAppend(wxMenuItem *item) item->Check(TRUE); } - return TRUE; + return item; } -bool wxMenu::DoInsert(size_t pos, wxMenuItem *item) +wxMenuItem* wxMenu::DoInsert(size_t pos, wxMenuItem *item) { - return wxMenuBase::DoInsert(pos, item) && DoInsertOrAppend(item, pos); + if (wxMenuBase::DoInsert(pos, item) && DoInsertOrAppend(item, pos)) + return item; + else + return NULL; } wxMenuItem *wxMenu::DoRemove(wxMenuItem *item) @@ -824,6 +827,33 @@ WXHMENU wxMenuBar::Create() #endif } +int wxMenuBar::MSWPositionForWxMenu(wxMenu *menu, int wxpos) +{ + wxASSERT(menu); + wxASSERT(menu->GetHMenu()); + wxASSERT(m_hMenu); + +#if defined(__WXWINCE__) + int totalMSWItems = GetMenuCount(); +#else + int totalMSWItems = GetMenuItemCount((HMENU)m_hMenu); +#endif + + int i; // For old C++ compatibility + for(i=wxpos; iGetHMenu()) + return i; + } + for(i=0; iGetHMenu()) + return i; + } + wxFAIL; + return -1; +} + // --------------------------------------------------------------------------- // wxMenuBar functions to work with the top level submenus // --------------------------------------------------------------------------- @@ -834,10 +864,11 @@ WXHMENU wxMenuBar::Create() void wxMenuBar::EnableTop(size_t pos, bool enable) { wxCHECK_RET( IsAttached(), wxT("doesn't work with unattached menubars") ); + wxCHECK_RET( pos < GetMenuCount(), wxT("invalid menu index") ); int flag = enable ? MF_ENABLED : MF_GRAYED; - EnableMenuItem((HMENU)m_hMenu, pos, MF_BYPOSITION | flag); + EnableMenuItem((HMENU)m_hMenu, MSWPositionForWxMenu(GetMenu(pos),pos), MF_BYPOSITION | flag); Refresh(); } @@ -854,8 +885,10 @@ void wxMenuBar::SetLabelTop(size_t pos, const wxString& label) } //else: have to modify the existing menu + int mswpos = MSWPositionForWxMenu(GetMenu(pos),pos); + UINT id; - UINT flagsOld = ::GetMenuState((HMENU)m_hMenu, pos, MF_BYPOSITION); + UINT flagsOld = ::GetMenuState((HMENU)m_hMenu, mswpos, MF_BYPOSITION); if ( flagsOld == 0xFFFFFFFF ) { wxLogLastError(wxT("GetMenuState")); @@ -867,7 +900,7 @@ void wxMenuBar::SetLabelTop(size_t pos, const wxString& label) { // HIBYTE contains the number of items in the submenu in this case flagsOld &= 0xff; - id = (UINT)::GetSubMenu((HMENU)m_hMenu, pos); + id = (UINT)::GetSubMenu((HMENU)m_hMenu, mswpos); } else { @@ -888,7 +921,7 @@ void wxMenuBar::SetLabelTop(size_t pos, const wxString& label) } #else - if ( ::ModifyMenu(GetHmenu(), pos, MF_BYPOSITION | MF_STRING | flagsOld, + if ( ::ModifyMenu(GetHmenu(), mswpos, MF_BYPOSITION | MF_STRING | flagsOld, id, label) == (int)0xFFFFFFFF ) { wxLogLastError(wxT("ModifyMenu")); @@ -920,13 +953,15 @@ wxMenu *wxMenuBar::Replace(size_t pos, wxMenu *menu, const wxString& title) if ( IsAttached() ) { + int mswpos = MSWPositionForWxMenu(menuOld,pos); + // can't use ModifyMenu() because it deletes the submenu it replaces - if ( !::RemoveMenu(GetHmenu(), (UINT)pos, MF_BYPOSITION) ) + if ( !::RemoveMenu(GetHmenu(), (UINT)mswpos, MF_BYPOSITION) ) { wxLogLastError(wxT("RemoveMenu")); } - if ( !::InsertMenu(GetHmenu(), (UINT)pos, + if ( !::InsertMenu(GetHmenu(), (UINT)mswpos, MF_BYPOSITION | MF_POPUP | MF_STRING, (UINT)GetHmenuOf(menu), title) ) { @@ -949,6 +984,13 @@ wxMenu *wxMenuBar::Replace(size_t pos, wxMenu *menu, const wxString& title) bool wxMenuBar::Insert(size_t pos, wxMenu *menu, const wxString& title) { + // Find out which MSW item before which we'll be inserting before + // wxMenuBarBase::Insert is called and GetMenu(pos) is the new menu. + // If IsAttached() is false this won't be used anyway + int mswpos = (!IsAttached() || (pos == m_menus.GetCount())) + ? -1 // append the menu + : MSWPositionForWxMenu(GetMenu(pos),pos); + if ( !wxMenuBarBase::Insert(pos, menu, title) ) return FALSE; @@ -977,7 +1019,7 @@ bool wxMenuBar::Insert(size_t pos, wxMenu *menu, const wxString& title) return FALSE; } #else - if ( !::InsertMenu(GetHmenu(), pos, + if ( !::InsertMenu(GetHmenu(), mswpos, MF_BYPOSITION | MF_POPUP | MF_STRING, (UINT)GetHmenuOf(menu), title) ) { @@ -1070,7 +1112,7 @@ wxMenu *wxMenuBar::Remove(size_t pos) } } #else - if ( !::RemoveMenu(GetHmenu(), (UINT)pos, MF_BYPOSITION) ) + if ( !::RemoveMenu(GetHmenu(), (UINT)MSWPositionForWxMenu(menu,pos), MF_BYPOSITION) ) { wxLogLastError(wxT("RemoveMenu")); }