X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/655719367ac5e131d9642e5783f3ecf64d1a3385..cb0b7b7d811356f729315fc14c7e0d311f43384d:/src/common/menucmn.cpp diff --git a/src/common/menucmn.cpp b/src/common/menucmn.cpp index 8ab7f2b95f..edf51cab54 100644 --- a/src/common/menucmn.cpp +++ b/src/common/menucmn.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////////// -// Name: common/menucmn.cpp +// Name: src/common/menucmn.cpp // Purpose: wxMenu and wxMenuBar methods common to all ports // Author: Vadim Zeitlin // Modified by: @@ -17,10 +17,6 @@ // headers // ---------------------------------------------------------------------------- -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma implementation "menubase.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -44,8 +40,8 @@ #include "wx/listimpl.cpp" -WX_DEFINE_LIST(wxMenuList); -WX_DEFINE_LIST(wxMenuItemList); +WX_DEFINE_LIST(wxMenuList) +WX_DEFINE_LIST(wxMenuItemList) // ============================================================================ // implementation @@ -68,8 +64,8 @@ wxMenuItemBase::wxMenuItemBase(wxMenu *parentMenu, m_parentMenu = parentMenu; m_subMenu = subMenu; - m_isEnabled = TRUE; - m_isChecked = FALSE; + m_isEnabled = true; + m_isChecked = false; m_id = id; m_kind = kind; if (m_id == wxID_ANY) @@ -141,7 +137,7 @@ wxAcceleratorEntry *wxGetAccelFromString(const wxString& label) } } - if ( current.IsEmpty() ) { + if ( current.empty() ) { wxLogDebug(wxT("No accel key found, accel string ignored.")); } else { @@ -160,10 +156,7 @@ wxAcceleratorEntry *wxGetAccelFromString(const wxString& label) if ( current[0U] == 'f' && wxIsdigit(current[1U]) && (current.Len() == 2 || (current.Len() == 3 && wxIsdigit(current[2U]))) ) { - int n; - wxSscanf(current.c_str() + 1, wxT("%d"), &n); - - keyCode = WXK_F1 + n - 1; + keyCode = WXK_F1 + wxAtoi(current.c_str() + 1) - 1; } else { // several special cases @@ -196,16 +189,113 @@ wxAcceleratorEntry *wxGetAccelFromString(const wxString& label) keyCode = WXK_HOME; else if ( current == wxT("END") ) keyCode = WXK_END; - else if ( current == wxT("SPACE") ) + else if ( current == wxT("SPACE") || current == _("SPACE") ) keyCode = WXK_SPACE; else if ( current == wxT("TAB") ) keyCode = WXK_TAB; else if ( current == wxT("ESC") || current == wxT("ESCAPE") ) keyCode = WXK_ESCAPE; + else if ( current == wxT("CANCEL") ) + keyCode = WXK_CANCEL; + else if ( current == wxT("CLEAR") ) + keyCode = WXK_CLEAR; + else if ( current == wxT("MENU") ) + keyCode = WXK_MENU; + else if ( current == wxT("PAUSE") ) + keyCode = WXK_PAUSE; + else if ( current == wxT("CAPITAL") ) + keyCode = WXK_CAPITAL; + else if ( current == wxT("SELECT") ) + keyCode = WXK_SELECT; + else if ( current == wxT("PRINT") ) + keyCode = WXK_PRINT; + else if ( current == wxT("EXECUTE") ) + keyCode = WXK_EXECUTE; + else if ( current == wxT("SNAPSHOT") ) + keyCode = WXK_SNAPSHOT; + else if ( current == wxT("HELP") ) + keyCode = WXK_HELP; + else if ( current == wxT("ADD") ) + keyCode = WXK_ADD; + else if ( current == wxT("SEPARATOR") ) + keyCode = WXK_SEPARATOR; + else if ( current == wxT("SUBTRACT") ) + keyCode = WXK_SUBTRACT; + else if ( current == wxT("DECIMAL") ) + keyCode = WXK_DECIMAL; + else if ( current == wxT("DIVIDE") ) + keyCode = WXK_DIVIDE; + else if ( current == wxT("NUM_LOCK") ) + keyCode = WXK_NUMLOCK; + else if ( current == wxT("SCROLL_LOCK") ) + keyCode = WXK_SCROLL; + else if ( current == wxT("PAGEUP") ) + keyCode = WXK_PAGEUP; + else if ( current == wxT("PAGEDOWN") ) + keyCode = WXK_PAGEDOWN; + else if ( current == wxT("KP_SPACE") ) + keyCode = WXK_NUMPAD_SPACE; + else if ( current == wxT("KP_TAB") ) + keyCode = WXK_NUMPAD_TAB; + else if ( current == wxT("KP_ENTER") ) + keyCode = WXK_NUMPAD_ENTER; + else if ( current == wxT("KP_HOME") ) + keyCode = WXK_NUMPAD_HOME; + else if ( current == wxT("KP_LEFT") ) + keyCode = WXK_NUMPAD_LEFT; + else if ( current == wxT("KP_UP") ) + keyCode = WXK_NUMPAD_UP; + else if ( current == wxT("KP_RIGHT") ) + keyCode = WXK_NUMPAD_RIGHT; + else if ( current == wxT("KP_DOWN") ) + keyCode = WXK_NUMPAD_DOWN; + else if ( current == wxT("KP_PRIOR") ) + keyCode = WXK_NUMPAD_PRIOR; + else if ( current == wxT("KP_PAGEUP") ) + keyCode = WXK_NUMPAD_PAGEUP; + else if ( current == wxT("KP_NEXT;") ) + keyCode = WXK_NUMPAD_NEXT; + else if ( current == wxT("KP_PAGEDOWN") ) + keyCode = WXK_NUMPAD_PAGEDOWN; + else if ( current == wxT("KP_END") ) + keyCode = WXK_NUMPAD_END; + else if ( current == wxT("KP_BEGIN") ) + keyCode = WXK_NUMPAD_BEGIN; + else if ( current == wxT("KP_INSERT") ) + keyCode = WXK_NUMPAD_INSERT; + else if ( current == wxT("KP_DELETE") ) + keyCode = WXK_NUMPAD_DELETE; + else if ( current == wxT("KP_EQUAL") ) + keyCode = WXK_NUMPAD_EQUAL; + else if ( current == wxT("KP_MULTIPLY") ) + keyCode = WXK_NUMPAD_MULTIPLY; + else if ( current == wxT("KP_ADD") ) + keyCode = WXK_NUMPAD_ADD; + else if ( current == wxT("KP_SEPARATOR") ) + keyCode = WXK_NUMPAD_SEPARATOR; + else if ( current == wxT("KP_SUBTRACT") ) + keyCode = WXK_NUMPAD_SUBTRACT; + else if ( current == wxT("KP_DECIMAL") ) + keyCode = WXK_NUMPAD_DECIMAL; + else if ( current == wxT("KP_DIVIDE") ) + keyCode = WXK_NUMPAD_DIVIDE; + else if ( current == wxT("WINDOWS_LEFT") ) + keyCode = WXK_WINDOWS_LEFT; + else if ( current == wxT("WINDOWS_RIGHT") ) + keyCode = WXK_WINDOWS_RIGHT; + else if ( current == wxT("WINDOWS_MENU") ) + keyCode = WXK_WINDOWS_MENU; + else if ( current == wxT("COMMAND") ) + keyCode = WXK_COMMAND; + else if ( current.Left(3) == wxT("KP_") && wxIsdigit(current[3U]) ) + keyCode = WXK_NUMPAD0 + wxAtoi(current.c_str() + 3); + else if ( current.Left(7) == wxT("SPECIAL") && wxIsdigit(current[7U]) ) + keyCode = WXK_SPECIAL1 + wxAtoi(current.c_str() + 7) - 1; else { wxLogDebug(wxT("Unrecognized accel key '%s', accel string ignored."), current.c_str()); + return NULL; } } } @@ -337,7 +427,7 @@ wxMenuItem* wxMenuBase::Insert(size_t pos, wxMenuItem *item) } else { - wxCHECK_MSG( pos < GetMenuItemCount(), FALSE, + wxCHECK_MSG( pos < GetMenuItemCount(), NULL, wxT("invalid index in wxMenu::Insert") ); return DoInsert(pos, item); @@ -349,7 +439,7 @@ wxMenuItem* wxMenuBase::DoInsert(size_t pos, wxMenuItem *item) wxCHECK_MSG( item, NULL, wxT("invalid item in wxMenu::Insert()") ); wxMenuItemList::compatibility_iterator node = m_items.Item(pos); - wxCHECK_MSG( node, FALSE, wxT("invalid index in wxMenu::Insert()") ); + wxCHECK_MSG( node, NULL, wxT("invalid index in wxMenu::Insert()") ); m_items.Insert(node, item); item->SetMenu((wxMenu*)this); @@ -385,6 +475,8 @@ wxMenuItem *wxMenuBase::DoRemove(wxMenuItem *item) if ( submenu ) { submenu->SetParent((wxMenu *)NULL); + if ( submenu->IsAttached() ) + submenu->Detach(); } return item; @@ -392,7 +484,7 @@ wxMenuItem *wxMenuBase::DoRemove(wxMenuItem *item) bool wxMenuBase::Delete(wxMenuItem *item) { - wxCHECK_MSG( item, FALSE, wxT("invalid item in wxMenu::Delete") ); + wxCHECK_MSG( item, false, wxT("invalid item in wxMenu::Delete") ); return DoDelete(item); } @@ -400,19 +492,19 @@ bool wxMenuBase::Delete(wxMenuItem *item) bool wxMenuBase::DoDelete(wxMenuItem *item) { wxMenuItem *item2 = DoRemove(item); - wxCHECK_MSG( item2, FALSE, wxT("failed to delete menu item") ); + wxCHECK_MSG( item2, false, wxT("failed to delete menu item") ); // don't delete the submenu item2->SetSubMenu((wxMenu *)NULL); delete item2; - return TRUE; + return true; } bool wxMenuBase::Destroy(wxMenuItem *item) { - wxCHECK_MSG( item, FALSE, wxT("invalid item in wxMenu::Destroy") ); + wxCHECK_MSG( item, false, wxT("invalid item in wxMenu::Destroy") ); return DoDestroy(item); } @@ -420,18 +512,18 @@ bool wxMenuBase::Destroy(wxMenuItem *item) bool wxMenuBase::DoDestroy(wxMenuItem *item) { wxMenuItem *item2 = DoRemove(item); - wxCHECK_MSG( item2, FALSE, wxT("failed to delete menu item") ); + wxCHECK_MSG( item2, false, wxT("failed to delete menu item") ); delete item2; - return TRUE; + return true; } // ---------------------------------------------------------------------------- // wxMenu searching for items // ---------------------------------------------------------------------------- -// Finds the item id matching the given string, -1 if not found. +// Finds the item id matching the given string, wxNOT_FOUND if not found. int wxMenuBase::FindItem(const wxString& text) const { wxString label = wxMenuItem::GetLabelFromText(text); @@ -589,10 +681,10 @@ bool wxMenuBase::SendEvent(int id, int checked) event.SetEventObject(this); event.SetInt(checked); - bool processed = FALSE; + bool processed = false; // Try the menu's event handler - if ( !processed ) + // if ( !processed ) { wxEvtHandler *handler = GetEventHandler(); if ( handler ) @@ -667,7 +759,7 @@ bool wxMenuBase::IsEnabled( int id ) const { wxMenuItem *item = FindItem(id); - wxCHECK_MSG( item, FALSE, wxT("wxMenu::IsEnabled: no such item") ); + wxCHECK_MSG( item, false, wxT("wxMenu::IsEnabled: no such item") ); return item->IsEnabled(); } @@ -685,7 +777,7 @@ bool wxMenuBase::IsChecked( int id ) const { wxMenuItem *item = FindItem(id); - wxCHECK_MSG( item, FALSE, wxT("wxMenu::IsChecked: no such item") ); + wxCHECK_MSG( item, false, wxT("wxMenu::IsChecked: no such item") ); return item->IsChecked(); } @@ -703,7 +795,7 @@ wxString wxMenuBase::GetLabel( int id ) const { wxMenuItem *item = FindItem(id); - wxCHECK_MSG( item, wxT(""), wxT("wxMenu::GetLabel: no such item") ); + wxCHECK_MSG( item, wxEmptyString, wxT("wxMenu::GetLabel: no such item") ); return item->GetText(); } @@ -721,7 +813,7 @@ wxString wxMenuBase::GetHelpString( int id ) const { wxMenuItem *item = FindItem(id); - wxCHECK_MSG( item, wxT(""), wxT("wxMenu::GetHelpString: no such item") ); + wxCHECK_MSG( item, wxEmptyString, wxT("wxMenu::GetHelpString: no such item") ); return item->GetHelp(); } @@ -756,12 +848,12 @@ wxMenu *wxMenuBarBase::GetMenu(size_t pos) const bool wxMenuBarBase::Append(wxMenu *menu, const wxString& WXUNUSED(title)) { - wxCHECK_MSG( menu, FALSE, wxT("can't append NULL menu") ); + wxCHECK_MSG( menu, false, wxT("can't append NULL menu") ); m_menus.Append(menu); menu->Attach(this); - return TRUE; + return true; } bool wxMenuBarBase::Insert(size_t pos, wxMenu *menu, @@ -773,15 +865,15 @@ bool wxMenuBarBase::Insert(size_t pos, wxMenu *menu, } else // not at the end { - wxCHECK_MSG( menu, FALSE, wxT("can't insert NULL menu") ); + wxCHECK_MSG( menu, false, wxT("can't insert NULL menu") ); wxMenuList::compatibility_iterator node = m_menus.Item(pos); - wxCHECK_MSG( node, FALSE, wxT("bad index in wxMenuBar::Insert()") ); + wxCHECK_MSG( node, false, wxT("bad index in wxMenuBar::Insert()") ); m_menus.Insert(node, menu); menu->Attach(this); - return TRUE; + return true; } } @@ -914,7 +1006,7 @@ bool wxMenuBarBase::IsChecked(int id) const { wxMenuItem *item = FindItem(id); - wxCHECK_MSG( item, FALSE, wxT("wxMenuBar::IsChecked(): no such item") ); + wxCHECK_MSG( item, false, wxT("wxMenuBar::IsChecked(): no such item") ); return item->IsChecked(); } @@ -923,7 +1015,7 @@ bool wxMenuBarBase::IsEnabled(int id) const { wxMenuItem *item = FindItem(id); - wxCHECK_MSG( item, FALSE, wxT("wxMenuBar::IsEnabled(): no such item") ); + wxCHECK_MSG( item, false, wxT("wxMenuBar::IsEnabled(): no such item") ); return item->IsEnabled(); } @@ -966,4 +1058,21 @@ wxString wxMenuBarBase::GetHelpString(int id) const return item->GetHelp(); } +void wxMenuBarBase::UpdateMenus( void ) +{ + wxEvtHandler* source; + wxMenu* menu; + int nCount = GetMenuCount(); + for (int n = 0; n < nCount; n++) + { + menu = GetMenu( n ); + if (menu != NULL) + { + source = menu->GetEventHandler(); + if (source != NULL) + menu->UpdateUI( source ); + } + } +} + #endif // wxUSE_MENUS