X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1e6feb95a79834836e88143b15d9f424ebe79621..430ff602284deeeca03259b9b21d53d26c4a64a9:/src/common/menucmn.cpp?ds=sidebyside diff --git a/src/common/menucmn.cpp b/src/common/menucmn.cpp index b9ecb0cf07..5422c06677 100644 --- a/src/common/menucmn.cpp +++ b/src/common/menucmn.cpp @@ -6,7 +6,7 @@ // Created: 26.10.99 // RCS-ID: $Id$ // Copyright: (c) wxWindows team -// Licence: wxWindows license +// Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// // ============================================================================ @@ -55,6 +55,25 @@ WX_DEFINE_LIST(wxMenuItemList); // wxMenuItem // ---------------------------------------------------------------------------- +wxMenuItemBase::wxMenuItemBase(wxMenu *parentMenu, + int id, + const wxString& text, + const wxString& help, + wxItemKind kind, + wxMenu *subMenu) + : m_text(text), + m_help(help) +{ + wxASSERT_MSG( parentMenu != NULL, wxT("menuitem should have a menu") ); + + m_parentMenu = parentMenu; + m_subMenu = subMenu; + m_isEnabled = TRUE; + m_isChecked = FALSE; + m_id = id; + m_kind = kind; +} + wxMenuItemBase::~wxMenuItemBase() { delete m_subMenu; @@ -62,6 +81,15 @@ wxMenuItemBase::~wxMenuItemBase() #if wxUSE_ACCEL +static inline bool CompareAccelString(const wxString& str, const wxChar *accel) +{ +#if wxUSE_INTL + return str == accel || str == wxGetTranslation(accel); +#else + return str == accel; +#endif +} + // return wxAcceleratorEntry for the given menu string or NULL if none // specified wxAcceleratorEntry *wxGetAccelFromString(const wxString& label) @@ -75,18 +103,32 @@ wxAcceleratorEntry *wxGetAccelFromString(const wxString& label) wxString current; for ( size_t n = (size_t)posTab + 1; n < label.Len(); n++ ) { if ( (label[n] == '+') || (label[n] == '-') ) { - if ( current == _("ctrl") ) + if ( CompareAccelString(current, wxTRANSLATE("ctrl")) ) accelFlags |= wxACCEL_CTRL; - else if ( current == _("alt") ) + else if ( CompareAccelString(current, wxTRANSLATE("alt")) ) accelFlags |= wxACCEL_ALT; - else if ( current == _("shift") ) + else if ( CompareAccelString(current, wxTRANSLATE("shift")) ) accelFlags |= wxACCEL_SHIFT; else { - wxLogDebug(wxT("Unknown accel modifier: '%s'"), - current.c_str()); + // we may have "Ctrl-+", for example, but we still want to + // catch typos like "Crtl-A" so only give the warning if we + // have something before the current '+' or '-', else take + // it as a literal symbol + if ( current.empty() ) + { + current += label[n]; + + // skip clearing it below + continue; + } + else + { + wxLogDebug(wxT("Unknown accel modifier: '%s'"), + current.c_str()); + } } - current.Empty(); + current.clear(); } else { current += wxTolower(label[n]); @@ -99,7 +141,13 @@ wxAcceleratorEntry *wxGetAccelFromString(const wxString& label) else { if ( current.Len() == 1 ) { // it's a letter - keyCode = wxToupper(current[0U]); + keyCode = current[0U]; + + // Only call wxToupper if control, alt, or shift is held down, + // otherwise lower case accelerators won't work. + if (accelFlags != wxACCEL_NORMAL) { + keyCode = wxToupper(keyCode); + } } else { // is it a function key? @@ -114,26 +162,38 @@ wxAcceleratorEntry *wxGetAccelFromString(const wxString& label) else { // several special cases current.MakeUpper(); - if ( current == wxT("DEL") ) { + if ( current == wxT("DEL") ) keyCode = WXK_DELETE; - } - else if ( current == wxT("DELETE") ) { + else if ( current == wxT("DELETE") ) keyCode = WXK_DELETE; - } - else if ( current == wxT("INS") ) { + else if ( current == wxT("INS") ) keyCode = WXK_INSERT; - } - else if ( current == wxT("INSERT") ) { + else if ( current == wxT("INSERT") ) keyCode = WXK_INSERT; - } -#if 0 - else if ( current == wxT("PGUP") ) { - keyCode = VK_PRIOR; - } - else if ( current == wxT("PGDN") ) { - keyCode = VK_NEXT; - } -#endif + else if ( current == wxT("ENTER") || current == wxT("RETURN") ) + keyCode = WXK_RETURN; + else if ( current == wxT("PGUP") ) + keyCode = WXK_PRIOR; + else if ( current == wxT("PGDN") ) + keyCode = WXK_NEXT; + else if ( current == wxT("LEFT") ) + keyCode = WXK_LEFT; + else if ( current == wxT("RIGHT") ) + keyCode = WXK_RIGHT; + else if ( current == wxT("UP") ) + keyCode = WXK_UP; + else if ( current == wxT("DOWN") ) + keyCode = WXK_DOWN; + else if ( current == wxT("HOME") ) + keyCode = WXK_HOME; + else if ( current == wxT("END") ) + keyCode = WXK_END; + else if ( current == wxT("SPACE") ) + keyCode = WXK_SPACE; + else if ( current == wxT("TAB") ) + keyCode = WXK_TAB; + else if ( current == wxT("ESC") || current == wxT("ESCAPE") ) + keyCode = WXK_ESCAPE; else { wxLogDebug(wxT("Unrecognized accel key '%s', accel string ignored."), @@ -225,10 +285,6 @@ void wxMenuBase::Init(long style) m_style = style; m_clientData = (void *)NULL; m_eventHandler = this; - -#if wxUSE_MENU_CALLBACK - m_callback = (wxFunction) NULL; -#endif // wxUSE_MENU_CALLBACK } wxMenuBase::~wxMenuBase() @@ -259,6 +315,7 @@ bool wxMenuBase::DoAppend(wxMenuItem *item) wxCHECK_MSG( item, FALSE, wxT("invalid item in wxMenu::Append()") ); m_items.Append(item); + item->SetMenu((wxMenu*)this); if ( item->IsSubMenu() ) { AddSubMenu(item->GetSubMenu()); @@ -292,6 +349,7 @@ bool wxMenuBase::DoInsert(size_t pos, wxMenuItem *item) wxCHECK_MSG( node, FALSE, wxT("invalid index in wxMenu::Insert()") ); m_items.Insert(node, item); + item->SetMenu((wxMenu*)this); if ( item->IsSubMenu() ) { AddSubMenu(item->GetSubMenu()); @@ -320,6 +378,7 @@ wxMenuItem *wxMenuBase::DoRemove(wxMenuItem *item) m_items.DeleteNode(node); // item isn't attached to anything any more + item->SetMenu((wxMenu *)NULL); wxMenu *submenu = item->GetSubMenu(); if ( submenu ) { @@ -457,6 +516,15 @@ wxMenuItem *wxMenuBase::FindChildItem(int id, size_t *ppos) const return item; } +// find by position +wxMenuItem* wxMenuBase::FindItemByPosition(size_t position) const +{ + wxCHECK_MSG( position < m_items.GetCount(), NULL, + _T("wxMenu::FindItemByPosition(): invalid menu index") ); + + return m_items.Item( position )->GetData(); +} + // ---------------------------------------------------------------------------- // wxMenu helpers used by derived classes // ---------------------------------------------------------------------------- @@ -485,7 +553,7 @@ void wxMenuBase::UpdateUI(wxEvtHandler* source) if ( source->ProcessEvent(event) ) { - // if anything changed, update the chanegd attribute + // if anything changed, update the changed attribute if (event.GetSetText()) SetLabel(id, event.GetText()); if (event.GetSetChecked()) @@ -498,7 +566,7 @@ void wxMenuBase::UpdateUI(wxEvtHandler* source) if ( item->GetSubMenu() ) item->GetSubMenu()->UpdateUI(source); } - //else: item is a separator (which don't process update UI events) + //else: item is a separator (which doesn't process update UI events) node = node->GetNext(); } @@ -512,15 +580,6 @@ bool wxMenuBase::SendEvent(int id, int checked) bool processed = FALSE; -#if wxUSE_MENU_CALLBACK - // Try a callback - if (m_callback) - { - (void)(*(m_callback))(*this, event); - processed = TRUE; - } -#endif // wxUSE_MENU_CALLBACK - // Try the menu's event handler if ( !processed ) { @@ -756,7 +815,7 @@ int wxMenuBarBase::FindMenu(const wxString& title) const (wxMenuItem::GetLabelFromText(title2) == label) ) { // found - return (int)i; + return (int)i; } }