]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/accelcmn.cpp
avoid accepting an invalid color, ignore it, as other ports do, fixes #13720
[wxWidgets.git] / src / common / accelcmn.cpp
index 718275e160520564ffbdb7ca9330b28f5c4ead28..1ed6c5947d99c540eab849196cdc9cfaf435c470 100644 (file)
 #if wxUSE_ACCEL
 
 #ifndef WX_PRECOMP
+    #include "wx/accel.h"
     #include "wx/string.h"
     #include "wx/intl.h"
     #include "wx/log.h"
-    #include "wx/accel.h"
     #include "wx/crt.h"
 #endif //WX_PRECOMP
 
+wxAcceleratorTable wxNullAcceleratorTable;
+
 // ============================================================================
 // wxAcceleratorEntry implementation
 // ============================================================================
@@ -158,11 +160,13 @@ wxAcceleratorEntry::ParseAccel(const wxString& text, int *flagsOut, int *keyOut)
 {
     // the parser won't like trailing spaces
     wxString label = text;
-    label.Trim(true);  // the initial \t must be preserved so don't strip leading whitespaces
+    label.Trim(true);
 
-    // If we're passed the entire menu item label instead of just the
-    // accelerator, skip the label part and only look after the TAB.
-    // check for accelerators: they are given after '\t'
+    // For compatibility with the old wx versions which accepted (and actually
+    // even required) a TAB character in the string passed to this function we
+    // ignore anything up to the first TAB. Notice however that the correct
+    // input consists of just the accelerator itself and nothing else, this is
+    // done for compatibility and compatibility only.
     int posTab = label.Find(wxT('\t'));
     if ( posTab == wxNOT_FOUND )
         posTab = 0;
@@ -182,6 +186,8 @@ wxAcceleratorEntry::ParseAccel(const wxString& text, int *flagsOut, int *keyOut)
                 accelFlags |= wxACCEL_ALT;
             else if ( CompareAccelString(current, wxTRANSLATE("shift")) )
                 accelFlags |= wxACCEL_SHIFT;
+            else if ( CompareAccelString(current, wxTRANSLATE("rawctrl")) )
+                accelFlags |= wxACCEL_RAW_CTRL;
             else // not a recognized modifier name
             {
                 // we may have "Ctrl-+", for example, but we still want to
@@ -274,9 +280,18 @@ wxAcceleratorEntry::ParseAccel(const wxString& text, int *flagsOut, int *keyOut)
 /* static */
 wxAcceleratorEntry *wxAcceleratorEntry::Create(const wxString& str)
 {
+    const wxString accelStr = str.AfterFirst('\t');
+    if ( accelStr.empty() )
+    {
+        // It's ok to pass strings not containing any accelerators at all to
+        // this function, wxMenuItem code does it and we should just return
+        // NULL in this case.
+        return NULL;
+    }
+
     int flags,
         keyCode;
-    if ( !ParseAccel(str, &flags, &keyCode) )
+    if ( !ParseAccel(accelStr, &flags, &keyCode) )
         return NULL;
 
     return new wxAcceleratorEntry(flags, keyCode);
@@ -298,7 +313,11 @@ wxString wxAcceleratorEntry::ToString() const
         text += _("Ctrl+");
     if ( flags & wxACCEL_SHIFT )
         text += _("Shift+");
-
+#if defined(__WXMAC__) || defined(__WXCOCOA__)
+    if ( flags & wxACCEL_RAW_CTRL )
+        text += _("RawCtrl+");
+#endif
+    
     const int code = GetKeyCode();
 
     if ( code >= WXK_F1 && code <= WXK_F12 )
@@ -329,7 +348,7 @@ wxString wxAcceleratorEntry::ToString() const
                  // build as they're only defined for the ASCII range (or EOF)
                  wxIsascii(code) &&
 #endif // ANSI
-                    wxIsalnum(code) )
+                    wxIsprint(code) )
             {
                 text << (wxChar)code;
             }