X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5ce61d9fd2a225e5579c07a60a71bd481a282d99..6f8c67e71020cb3b7779b1267dda8702423e7c42:/src/common/menucmn.cpp diff --git a/src/common/menucmn.cpp b/src/common/menucmn.cpp index 62118b53b5..a423b41f9b 100644 --- a/src/common/menucmn.cpp +++ b/src/common/menucmn.cpp @@ -5,7 +5,7 @@ // Modified by: // Created: 26.10.99 // RCS-ID: $Id$ -// Copyright: (c) wxWindows team +// Copyright: (c) wxWidgets team // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -68,8 +68,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) @@ -98,6 +98,8 @@ static inline bool CompareAccelString(const wxString& str, const wxChar *accel) // specified wxAcceleratorEntry *wxGetAccelFromString(const wxString& label) { + // wxPrintf( wxT("label %s\n"), label.c_str() ); + // check for accelerators: they are given after '\t' int posTab = label.Find(wxT('\t')); if ( posTab != wxNOT_FOUND ) { @@ -139,7 +141,7 @@ wxAcceleratorEntry *wxGetAccelFromString(const wxString& label) } } - if ( current.IsEmpty() ) { + if ( current.empty() ) { wxLogDebug(wxT("No accel key found, accel string ignored.")); } else { @@ -158,10 +160,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 @@ -200,10 +199,109 @@ wxAcceleratorEntry *wxGetAccelFromString(const wxString& label) 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("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; } } } @@ -276,6 +374,8 @@ void wxMenuItemBase::SetAccel(wxAcceleratorEntry *accel) #endif // wxUSE_ACCEL +bool wxMenuBase::ms_locked = true; + // ---------------------------------------------------------------------------- // wxMenu ctor and dtor // ---------------------------------------------------------------------------- @@ -306,11 +406,6 @@ void wxMenuBase::AddSubMenu(wxMenu *submenu) { wxCHECK_RET( submenu, _T("can't add a NULL submenu") ); - if ( m_menuBar ) - { - submenu->Attach(m_menuBar); - } - submenu->SetParent((wxMenu *)this); } @@ -338,7 +433,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); @@ -350,7 +445,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); @@ -386,6 +481,8 @@ wxMenuItem *wxMenuBase::DoRemove(wxMenuItem *item) if ( submenu ) { submenu->SetParent((wxMenu *)NULL); + if ( submenu->IsAttached() ) + submenu->Detach(); } return item; @@ -393,7 +490,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); } @@ -401,19 +498,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); } @@ -421,18 +518,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); @@ -590,7 +687,7 @@ 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 ) @@ -625,6 +722,13 @@ bool wxMenuBase::SendEvent(int id, int checked) // wxMenu attaching/detaching to/from menu bar // ---------------------------------------------------------------------------- +wxMenuBar* wxMenuBase::GetMenuBar() const +{ + if(GetParent()) + return GetParent()->GetMenuBar(); + return m_menuBar; +} + void wxMenuBase::Attach(wxMenuBarBase *menubar) { // use Detach() instead! @@ -661,7 +765,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(); } @@ -679,7 +783,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(); } @@ -697,7 +801,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(); } @@ -715,7 +819,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(); } @@ -750,12 +854,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, @@ -767,15 +871,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; } } @@ -908,7 +1012,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(); } @@ -917,7 +1021,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(); }