]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/menucmn.cpp
make string at least empty (instead of containing garbage) if malloc() failed
[wxWidgets.git] / src / common / menucmn.cpp
index 05bb4f7f8c1c8ef5ede084d4eee852280b571fea..5422c06677e80909c61e6338fa9a50355e712a9f 100644 (file)
@@ -6,7 +6,7 @@
 // Created:     26.10.99
 // RCS-ID:      $Id$
 // Copyright:   (c) wxWindows team
-// Licence:     wxWindows license
+// Licence:     wxWindows licence
 ///////////////////////////////////////////////////////////////////////////////
 
 // ============================================================================
@@ -81,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)
@@ -94,11 +103,11 @@ 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 {
                     // we may have "Ctrl-+", for example, but we still want to
@@ -132,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?
@@ -147,51 +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;
-                    }
-                    else if ( current == wxT("ENTER") || current == wxT("RETURN") ) {
+                    else if ( current == wxT("ENTER") || current == wxT("RETURN") )
                         keyCode = WXK_RETURN;
-                    }
-                    else if ( current == wxT("PGUP") ) {
+                    else if ( current == wxT("PGUP") )
                         keyCode = WXK_PRIOR;
-                    }
-                    else if ( current == wxT("PGDN") ) {
+                    else if ( current == wxT("PGDN") )
                         keyCode = WXK_NEXT;
-                    }
-                    else if ( current == wxT("LEFT") ) {
+                    else if ( current == wxT("LEFT") )
                         keyCode = WXK_LEFT;
-                    }
-                    else if ( current == wxT("RIGHT") ) {
+                    else if ( current == wxT("RIGHT") )
                         keyCode = WXK_RIGHT;
-                    }
-                    else if ( current == wxT("UP") ) {
+                    else if ( current == wxT("UP") )
                         keyCode = WXK_UP;
-                    }
-                    else if ( current == wxT("DOWN") ) {
+                    else if ( current == wxT("DOWN") )
                         keyCode = WXK_DOWN;
-                    }
-                    else if ( current == wxT("HOME") ) {
+                    else if ( current == wxT("HOME") )
                         keyCode = WXK_HOME;
-                    }
-                    else if ( current == wxT("END") ) {
+                    else if ( current == wxT("END") )
                         keyCode = WXK_END;
-                    }
-                    else if ( current == wxT("SPACE") ) {
+                    else if ( current == wxT("SPACE") )
                         keyCode = WXK_SPACE;
-                    }
-                    else if ( current == wxT("TAB") ) {
+                    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."),
@@ -283,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()
@@ -317,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());
@@ -350,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());
@@ -378,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 )
     {
@@ -515,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
 // ----------------------------------------------------------------------------
@@ -543,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())
@@ -556,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();
     }
@@ -570,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 )
     {