X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/974e8d946f30af2bd79b9029d1d2fb9e0d5b2dd4..353149f8f21d4698a68ae77623ebc0439893b2d1:/src/msw/menuitem.cpp diff --git a/src/msw/menuitem.cpp b/src/msw/menuitem.cpp index 09c4986f15..e281013c2d 100644 --- a/src/msw/menuitem.cpp +++ b/src/msw/menuitem.cpp @@ -42,6 +42,10 @@ #include "wx/menuitem.h" #include "wx/log.h" +#if wxUSE_ACCEL + #include "wx/accel.h" +#endif // wxUSE_ACCEL + #include "wx/msw/private.h" // --------------------------------------------------------------------------- @@ -66,13 +70,11 @@ // dynamic classes implementation // ---------------------------------------------------------------------------- -#if !defined(USE_SHARED_LIBRARY) || !USE_SHARED_LIBRARY #if wxUSE_OWNER_DRAWN IMPLEMENT_DYNAMIC_CLASS2(wxMenuItem, wxMenuItemBase, wxOwnerDrawn) #else //!USE_OWNER_DRAWN IMPLEMENT_DYNAMIC_CLASS(wxMenuItem, wxMenuItemBase) #endif //USE_OWNER_DRAWN -#endif //USE_SHARED_LIBRARY // ---------------------------------------------------------------------------- // wxMenuItem @@ -86,9 +88,9 @@ wxMenuItem::wxMenuItem(wxMenu *pParentMenu, const wxString& text, const wxString& strHelp, bool bCheckable, - wxMenu *pSubMenu) : + wxMenu *pSubMenu) #if wxUSE_OWNER_DRAWN - wxOwnerDrawn(text, bCheckable) + : wxOwnerDrawn(text, bCheckable) #endif // owner drawn { wxASSERT_MSG( pParentMenu != NULL, wxT("a menu item should have a parent") ); @@ -129,49 +131,71 @@ int wxMenuItem::GetRealId() const return m_subMenu ? (int)m_subMenu->GetHMenu() : GetId(); } -// delete the sub menu -// ------------------- -void wxMenuItem::DeleteSubMenu() +// get item state +// -------------- + +bool wxMenuItem::IsChecked() const { - delete m_subMenu; - m_subMenu = NULL; + int flag = ::GetMenuState(GetHMenuOf(m_parentMenu), GetId(), MF_BYCOMMAND); + + return (flag & MF_CHECKED) != 0; } +/* static */ +wxString wxMenuItemBase::GetLabelFromText(const wxString& text) +{ + return wxStripMenuCodes(text); +} + +// accelerators +// ------------ + +#if wxUSE_ACCEL + +wxAcceleratorEntry *wxMenuItem::GetAccel() const +{ + return wxGetAccelFromString(GetText()); +} + +#endif // wxUSE_ACCEL + // change item state // ----------------- -void wxMenuItem::Enable(bool bDoEnable) +void wxMenuItem::Enable(bool enable) { - if ( m_isEnabled != bDoEnable ) { - long rc = EnableMenuItem(GetHMenuOf(m_parentMenu), - GetRealId(), - MF_BYCOMMAND | - (bDoEnable ? MF_ENABLED : MF_GRAYED)); - - if ( rc == -1 ) { - wxLogLastError("EnableMenuItem"); - } + if ( m_isEnabled == enable ) + return; + + long rc = EnableMenuItem(GetHMenuOf(m_parentMenu), + GetRealId(), + MF_BYCOMMAND | + (enable ? MF_ENABLED : MF_GRAYED)); - wxMenuItemBase::Enable(m_isEnabled); + if ( rc == -1 ) { + wxLogLastError(wxT("EnableMenuItem")); } + + wxMenuItemBase::Enable(enable); } -void wxMenuItem::Check(bool bDoCheck) +void wxMenuItem::Check(bool check) { wxCHECK_RET( m_isCheckable, wxT("only checkable items may be checked") ); - if ( m_isChecked != bDoCheck ) { - long rc = CheckMenuItem(GetHMenuOf(m_parentMenu), - GetId(), - MF_BYCOMMAND | - (bDoCheck ? MF_CHECKED : MF_UNCHECKED)); + if ( m_isChecked == check ) + return; - if ( rc == -1 ) { - wxLogLastError("CheckMenuItem"); - } + long rc = CheckMenuItem(GetHMenuOf(m_parentMenu), + GetRealId(), + MF_BYCOMMAND | + (check ? MF_CHECKED : MF_UNCHECKED)); - wxMenuItemBase::Check(m_isChecked); + if ( rc == -1 ) { + wxLogLastError(wxT("CheckMenuItem")); } + + wxMenuItemBase::Check(check); } void wxMenuItem::SetText(const wxString& text) @@ -184,12 +208,17 @@ void wxMenuItem::SetText(const wxString& text) OWNER_DRAWN_ONLY( wxOwnerDrawn::SetName(text) ); HMENU hMenu = GetHMenuOf(m_parentMenu); + wxCHECK_RET( hMenu, wxT("menuitem without menu") ); + +#if wxUSE_ACCEL + m_parentMenu->UpdateAccel(this); +#endif // wxUSE_ACCEL UINT id = GetRealId(); UINT flagsOld = ::GetMenuState(hMenu, id, MF_BYCOMMAND); if ( flagsOld == 0xFFFFFFFF ) { - wxLogLastError("GetMenuState"); + wxLogLastError(wxT("GetMenuState")); } else { @@ -212,7 +241,7 @@ void wxMenuItem::SetText(const wxString& text) #endif //owner drawn { flagsOld |= MF_STRING; - data = (char*) text.c_str(); + data = (wxChar*) text.c_str(); } if ( ::ModifyMenu(hMenu, id,