X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2173b18fc874406b56eeb8676980f6996f7546c1..fb8d7eb7a880f1f2e32d8830f9c5e12b2536e05f:/src/os2/menu.cpp diff --git a/src/os2/menu.cpp b/src/os2/menu.cpp index c4567c4253..73b5a56cfa 100644 --- a/src/os2/menu.cpp +++ b/src/os2/menu.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: menu.cpp +// Name: src/os2/menu.cpp // Purpose: wxMenu, wxMenuBar, wxMenuItem // Author: David Webster // Modified by: @@ -9,17 +9,14 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ - #pragma implementation "menu.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" +#include "wx/menu.h" + #ifndef WX_PRECOMP #include "wx/app.h" #include "wx/frame.h" - #include "wx/menu.h" #include "wx/utils.h" #include "wx/intl.h" #include "wx/log.h" @@ -58,9 +55,6 @@ USHORT wxMenu::m_nextMenuId = 0; // macros // ---------------------------------------------------------------------------- - IMPLEMENT_DYNAMIC_CLASS(wxMenu, wxEvtHandler) - IMPLEMENT_DYNAMIC_CLASS(wxMenuBar, wxEvtHandler) - // ============================================================================ // implementation // ============================================================================ @@ -74,7 +68,7 @@ USHORT wxMenu::m_nextMenuId = 0; // void wxMenu::Init() { - m_bDoBreak = FALSE; + m_bDoBreak = false; m_nStartRadioGroup = -1; // @@ -107,7 +101,7 @@ void wxMenu::Init() // // If we have a title, insert it in the beginning of the menu // - if (!m_title.IsEmpty()) + if (!m_title.empty()) { Append( idMenuTitle ,m_title @@ -146,7 +140,7 @@ wxMenu::~wxMenu() void wxMenu::Break() { // this will take effect during the next call to Append() - m_bDoBreak = TRUE; + m_bDoBreak = true; } // end of wxMenu::Break void wxMenu::Attach( @@ -189,10 +183,22 @@ void wxMenu::UpdateAccel( } else if (!pItem->IsSeparator()) { + // + // Recurse upwards: we should only modify m_accels of the top level + // menus, not of the submenus as wxMenuBar doesn't look at them + // (alternative and arguable cleaner solution would be to recurse + // downwards in GetAccelCount() and CopyAccels()) + // + if (GetParent()) + { + GetParent()->UpdateAccel(pItem); + return; + } + // // Find the (new) accel for this item // - wxAcceleratorEntry* pAccel = wxGetAccelFromString(pItem->GetText()); + wxAcceleratorEntry* pAccel = wxAcceleratorEntry::Create(pItem->GetItemLabel()); if (pAccel) pAccel->m_command = pItem->GetId(); @@ -236,17 +242,15 @@ void wxMenu::UpdateAccel( // // Append a new item or submenu to the menu // -bool wxMenu::DoInsertOrAppend( - wxMenuItem* pItem -, size_t nPos -) +bool wxMenu::DoInsertOrAppend( wxMenuItem* pItem, + size_t nPos ) { - wxMenu* pSubmenu = pItem->GetSubMenu(); - MENUITEM& rItem = (pSubmenu != NULL)?pSubmenu->m_vMenuData: - pItem->m_vMenuData; + wxMenu* pSubmenu = pItem->GetSubMenu(); + MENUITEM& rItem = (pSubmenu != NULL)?pSubmenu->m_vMenuData: + pItem->m_vMenuData; - ERRORID vError; - wxString sError; + ERRORID vError; + wxString sError; #if wxUSE_ACCEL UpdateAccel(pItem); @@ -259,7 +263,7 @@ bool wxMenu::DoInsertOrAppend( if (m_bDoBreak) { rItem.afStyle |= MIS_BREAK; - m_bDoBreak = FALSE; + m_bDoBreak = false; } // @@ -277,10 +281,10 @@ bool wxMenu::DoInsertOrAppend( } else { - rItem.id = pItem->GetId(); + rItem.id = (USHORT)pItem->GetId(); } - BYTE* pData=NULL; + char *pData = NULL; #if wxUSE_OWNER_DRAWN if (pItem->IsOwnerDrawn()) @@ -291,7 +295,7 @@ bool wxMenu::DoInsertOrAppend( // Will eventually need to set the image handle somewhere into vItem.hItem // rItem.afStyle |= MIS_OWNERDRAW; - pData = (BYTE*)NULL; + pData = NULL; rItem.hItem = (HBITMAP)pItem->GetBitmap().GetHBITMAP(); pItem->m_vMenuData.afStyle = rItem.afStyle; pItem->m_vMenuData.hItem = rItem.hItem; @@ -316,7 +320,7 @@ bool wxMenu::DoInsertOrAppend( // rItem.afStyle |= MIS_TEXT; } - pData = (char*)pItem->GetText().c_str(); + pData = (char*) pItem->GetItemLabel().wx_str(); } if (nPos == (size_t)-1) @@ -325,7 +329,7 @@ bool wxMenu::DoInsertOrAppend( } else { - rItem.iPosition = nPos; + rItem.iPosition = (SHORT)nPos; } APIRET rc; @@ -349,26 +353,25 @@ bool wxMenu::DoInsertOrAppend( ); } #endif + if (rc == (APIRET)MIT_MEMERROR || rc == (APIRET)MIT_ERROR) { vError = ::WinGetLastError(vHabmain); sError = wxPMErrorToStr(vError); wxLogError(wxT("Error inserting or appending a menuitem. Error: %s\n"), sError.c_str()); wxLogLastError(wxT("Insert or AppendMenu")); - return FALSE; + return false; } - else + + // + // If we're already attached to the menubar, we must update it + // + if (IsAttached() && GetMenuBar()->IsAttached()) { - // - // If we're already attached to the menubar, we must update it - // - if (IsAttached() && GetMenuBar()->IsAttached()) - { - GetMenuBar()->Refresh(); - } - return TRUE; + GetMenuBar()->Refresh(); } - return FALSE; + + return true; } // end of wxMenu::DoInsertOrAppend void wxMenu::EndRadioGroup() @@ -379,13 +382,11 @@ void wxMenu::EndRadioGroup() m_nStartRadioGroup = -1; } // end of wxMenu::EndRadioGroup -wxMenuItem* wxMenu::DoAppend( - wxMenuItem* pItem -) +wxMenuItem* wxMenu::DoAppend( wxMenuItem* pItem ) { - wxCHECK_MSG( pItem, NULL, _T("NULL item in wxMenu::DoAppend") ); + wxCHECK_MSG( pItem, NULL, wxT("NULL item in wxMenu::DoAppend") ); - bool bCheck = FALSE; + bool bCheck = false; if (pItem->GetKind() == wxITEM_RADIO) { @@ -407,7 +408,7 @@ wxMenuItem* wxMenu::DoAppend( // // Ensure that we have a checked item in the radio group // - bCheck = TRUE; + bCheck = true; } else // extend the current radio group { @@ -424,7 +425,7 @@ wxMenuItem* wxMenu::DoAppend( } else { - wxFAIL_MSG( _T("where is the radio group start item?") ); + wxFAIL_MSG( wxT("where is the radio group start item?") ); } } } @@ -442,7 +443,7 @@ wxMenuItem* wxMenu::DoAppend( // // Check the item initially // - pItem->Check(TRUE); + pItem->Check(true); } return pItem; } // end of wxMenu::DoAppend @@ -548,19 +549,17 @@ size_t wxMenu::CopyAccels( // set wxMenu title // --------------------------------------------------------------------------- -void wxMenu::SetTitle( - const wxString& rLabel -) +void wxMenu::SetTitle( const wxString& rLabel ) { - bool bHasNoTitle = m_title.IsEmpty(); - HWND hMenu = GetHmenu(); + bool bHasNoTitle = m_title.empty(); + HWND hMenu = GetHmenu(); m_title = rLabel; if (bHasNoTitle) { - if (!rLabel.IsEmpty()) + if (!rLabel.empty()) { - if (!::WinSetWindowText(hMenu, (PSZ)rLabel.c_str())) + if (!::WinSetWindowText(hMenu, rLabel.c_str())) { wxLogLastError(wxT("SetMenuTitle")); } @@ -568,7 +567,7 @@ void wxMenu::SetTitle( } else { - if (rLabel.IsEmpty() ) + if (rLabel.empty() ) { ::WinSendMsg( GetHmenu() ,MM_REMOVEITEM @@ -581,7 +580,7 @@ void wxMenu::SetTitle( // // Modify the title // - if (!::WinSetWindowText(hMenu, (PSZ)rLabel.c_str())) + if (!::WinSetWindowText(hMenu, rLabel.c_str())) { wxLogLastError(wxT("SetMenuTitle")); } @@ -593,10 +592,8 @@ void wxMenu::SetTitle( // event processing // --------------------------------------------------------------------------- -bool wxMenu::OS2Command( - WXUINT WXUNUSED(uParam) -, WXWORD vId -) +bool wxMenu::OS2Command( WXUINT WXUNUSED(uParam), + WXWORD vId ) { // // Ignore commands from the menu title @@ -612,7 +609,7 @@ bool wxMenu::OS2Command( ) ); } - return TRUE; + return true; } // end of wxMenu::OS2Command // --------------------------------------------------------------------------- @@ -737,7 +734,7 @@ void wxMenuBar::Refresh() WXHMENU wxMenuBar::Create() { - HWND hFrame; + HWND hFrame; if (m_hMenu != 0 ) return m_hMenu; @@ -756,7 +753,7 @@ WXHMENU wxMenuBar::Create() // if ((m_hMenu = ::WinCreateWindow( hFrame ,WC_MENU - ,(PSZ)NULL + ,NULL ,MS_ACTIONBAR | WS_SYNCPAINT | WS_VISIBLE ,0L ,0L @@ -773,14 +770,14 @@ WXHMENU wxMenuBar::Create() } else { - size_t nCount = GetMenuCount(), i; - wxMenuList::iterator it; + size_t nCount = GetMenuCount(), i; + wxMenuList::iterator it; for (i = 0, it = m_menus.begin(); i < nCount; i++, it++) { - APIRET rc; - ERRORID vError; - wxString sError; - HWND hSubMenu; + APIRET rc; + ERRORID vError; + wxString sError; + HWND hSubMenu; // // Set the parent and owner of the submenues to be the menubar, not the desktop @@ -802,9 +799,9 @@ WXHMENU wxMenuBar::Create() return NULLHANDLE; } - (*it)->m_vMenuData.iPosition = i; + (*it)->m_vMenuData.iPosition = (SHORT)i; - rc = (APIRET)::WinSendMsg(m_hMenu, MM_INSERTITEM, (MPARAM)&(*it)->m_vMenuData, (MPARAM)m_titles[i].c_str()); + rc = (APIRET)::WinSendMsg(m_hMenu, MM_INSERTITEM, (MPARAM)&(*it)->m_vMenuData, (MPARAM)m_titles[i].wx_str()); if (rc == (APIRET)MIT_MEMERROR || rc == (APIRET)MIT_ERROR) { vError = ::WinGetLastError(vHabmain); @@ -847,7 +844,7 @@ void wxMenuBar::EnableTop( Refresh(); } // end of wxMenuBar::EnableTop -void wxMenuBar::SetLabelTop( +void wxMenuBar::SetMenuLabel( size_t nPos , const wxString& rLabel ) @@ -879,21 +876,21 @@ void wxMenuBar::SetLabelTop( } nId = vItem.id; - if (::WinSendMsg(GetHmenu(), MM_SETITEMTEXT, MPFROMSHORT(nId), (MPARAM)rLabel.c_str())); + if (::WinSendMsg(GetHmenu(), MM_SETITEMTEXT, MPFROMSHORT(nId), (MPARAM)rLabel.wx_str())); { wxLogLastError(wxT("ModifyMenu")); } Refresh(); -} // end of wxMenuBar::SetLabelTop +} // end of wxMenuBar::SetMenuLabel -wxString wxMenuBar::GetLabelTop( +wxString wxMenuBar::GetMenuLabel( size_t nPos ) const { wxCHECK_MSG( nPos < GetMenuCount(), wxEmptyString, - wxT("invalid menu index in wxMenuBar::GetLabelTop") ); + wxT("invalid menu index in wxMenuBar::GetMenuLabel") ); return m_titles[nPos]; -} // end of wxMenuBar::GetLabelTop +} // end of wxMenuBar::GetMenuLabel // --------------------------------------------------------------------------- // wxMenuBar construction @@ -925,7 +922,7 @@ wxMenu* wxMenuBar::Replace( if (IsAttached()) { ::WinSendMsg((HWND)m_hMenu, MM_REMOVEITEM, MPFROM2SHORT(nId, TRUE), (MPARAM)0); - ::WinSendMsg((HWND)m_hMenu, MM_INSERTITEM, (MPARAM)&pMenu->m_vMenuData, (MPARAM)sTitle.c_str()); + ::WinSendMsg((HWND)m_hMenu, MM_INSERTITEM, (MPARAM)&pMenu->m_vMenuData, (MPARAM)sTitle.wx_str()); #if wxUSE_ACCEL if (pMenuOld->HasAccels() || pMenu->HasAccels()) @@ -941,31 +938,24 @@ wxMenu* wxMenuBar::Replace( return pMenuOld; } // end of wxMenuBar::Replace -bool wxMenuBar::Insert( - size_t nPos -, wxMenu* pMenu -, const wxString& rTitle -) +bool wxMenuBar::Insert( size_t nPos, + wxMenu* pMenu, + const wxString& rTitle ) { - wxString sTitle = wxPMTextToLabel(rTitle); + wxString sTitle = wxPMTextToLabel(rTitle); - if (!wxMenuBarBase::Insert( nPos - ,pMenu - ,sTitle - )) - return FALSE; + if (!wxMenuBarBase::Insert( nPos, pMenu, sTitle )) + return false; - m_titles.Insert( sTitle - ,nPos - ); + m_titles.Insert( sTitle, nPos ); if (IsAttached()) { - pMenu->m_vMenuData.iPosition = nPos; + pMenu->m_vMenuData.iPosition = (SHORT)nPos; ::WinSendMsg( (HWND)m_hMenu ,MM_INSERTITEM ,(MPARAM)&pMenu->m_vMenuData - ,(MPARAM)sTitle.c_str() + ,(MPARAM)sTitle.wx_str() ); #if wxUSE_ACCEL if (pMenu->HasAccels()) @@ -976,29 +966,28 @@ bool wxMenuBar::Insert( #endif // wxUSE_ACCEL Refresh(); } - return TRUE; + + return true; } // end of wxMenuBar::Insert -bool wxMenuBar::Append( - wxMenu* pMenu -, const wxString& rsTitle -) +bool wxMenuBar::Append( wxMenu* pMenu, + const wxString& rsTitle ) { - WXHMENU hSubmenu = pMenu ? pMenu->GetHMenu() : 0; + WXHMENU hSubmenu = pMenu ? pMenu->GetHMenu() : 0; - wxCHECK_MSG(hSubmenu, FALSE, wxT("can't append invalid menu to menubar")); + wxCHECK_MSG(hSubmenu, false, wxT("can't append invalid menu to menubar")); - wxString sTitle = wxPMTextToLabel(rsTitle); + wxString sTitle = wxPMTextToLabel(rsTitle); if (!wxMenuBarBase::Append(pMenu, sTitle)) - return FALSE; + return false; m_titles.Add(sTitle); if ( IsAttached() ) { pMenu->m_vMenuData.iPosition = MIT_END; - ::WinSendMsg((HWND)m_hMenu, MM_INSERTITEM, (MPARAM)&pMenu->m_vMenuData, (MPARAM)sTitle.c_str()); + ::WinSendMsg((HWND)m_hMenu, MM_INSERTITEM, (MPARAM)&pMenu->m_vMenuData, (MPARAM)sTitle.wx_str()); #if wxUSE_ACCEL if (pMenu->HasAccels()) { @@ -1010,7 +999,7 @@ bool wxMenuBar::Append( #endif // wxUSE_ACCEL Refresh(); } - return TRUE; + return true; } // end of wxMenuBar::Append wxMenu* wxMenuBar::Remove( @@ -1105,7 +1094,9 @@ void wxMenuBar::Attach( ,m_vAccelTable.GetHACCEL() ,(HWND)pFrame->GetFrame() )) + { wxLogLastError(wxT("WinSetAccelTable")); + } #endif // wxUSE_ACCEL } // end of wxMenuBar::Attach @@ -1182,4 +1173,3 @@ wxMenuItem* wxMenuBar::FindItem( } return pItem; } // end of wxMenuBar::FindItem -