]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/utilscmn.cpp
Committing in .
[wxWidgets.git] / src / common / utilscmn.cpp
index f41b535fca8b6085a0a228af418ed88a468b5ea7..5aef920b31ecbb171be4820cba97a0828ca5e2a0 100644 (file)
@@ -32,6 +32,8 @@
     #include "wx/defs.h"
     #include "wx/string.h"
     #include "wx/utils.h"
+    #include "wx/intl.h"
+    #include "wx/log.h"
 
     #if wxUSE_GUI
         #include "wx/window.h"
         #include "wx/frame.h"
         #include "wx/msgdlg.h"
         #include "wx/textdlg.h"
+        #if wxUSE_ACCEL
+            #include "wx/menuitem.h"
+            #include "wx/accel.h"
+        #endif // wxUSE_ACCEL
     #endif // wxUSE_GUI
 #endif // WX_PRECOMP
 
@@ -145,7 +151,7 @@ int strcasecmp(const char *str_1, const char *str_2)
   myLowerString(temp1);
   myLowerString(temp2);
 
-  int result = strcmp(temp1,temp2);
+  int result = wxStrcmp(temp1,temp2);
   delete[] temp1;
   delete[] temp2;
 
@@ -207,7 +213,7 @@ extern "C"
 wxChar *
 copystring (const wxChar *s)
 {
-  if (s == NULL) s = T("");
+  if (s == NULL) s = wxT("");
   size_t len = wxStrlen (s) + 1;
 
   wxChar *news = new wxChar[len];
@@ -287,7 +293,7 @@ IntToString (int number)
 {
   static wxChar buf[20];
 
-  wxSprintf (buf, T("%d"), number);
+  wxSprintf (buf, wxT("%d"), number);
   return buf;
 }
 
@@ -296,27 +302,27 @@ LongToString (long number)
 {
   static wxChar buf[20];
 
-  wxSprintf (buf, T("%ld"), number);
+  wxSprintf (buf, wxT("%ld"), number);
   return buf;
 }
 
 // Array used in DecToHex conversion routine.
-static wxChar hexArray[] = T("0123456789ABCDEF");
+static wxChar hexArray[] = wxT("0123456789ABCDEF");
 
 // Convert 2-digit hex number to decimal
 int wxHexToDec(const wxString& buf)
 {
   int firstDigit, secondDigit;
 
-  if (buf.GetChar(0) >= T('A'))
-    firstDigit = buf.GetChar(0) - T('A') + 10;
+  if (buf.GetChar(0) >= wxT('A'))
+    firstDigit = buf.GetChar(0) - wxT('A') + 10;
   else
-    firstDigit = buf.GetChar(0) - T('0');
+    firstDigit = buf.GetChar(0) - wxT('0');
 
-  if (buf.GetChar(1) >= T('A'))
-    secondDigit = buf.GetChar(1) - T('A') + 10;
+  if (buf.GetChar(1) >= wxT('A'))
+    secondDigit = buf.GetChar(1) - wxT('A') + 10;
   else
-    secondDigit = buf.GetChar(1) - T('0');
+    secondDigit = buf.GetChar(1) - wxT('0');
 
   return firstDigit * 16 + secondDigit;
 }
@@ -392,7 +398,7 @@ wxString wxNow()
 #if wxUSE_GUI
 
 // ----------------------------------------------------------------------------
-// Strip out any menu codes
+// Menu accelerators related functions
 // ----------------------------------------------------------------------------
 
 wxChar *wxStripMenuCodes (wxChar *in, wxChar *out)
@@ -407,13 +413,13 @@ wxChar *wxStripMenuCodes (wxChar *in, wxChar *out)
 
   while (*in)
     {
-      if (*in == T('&'))
+      if (*in == wxT('&'))
         {
           // Check && -> &, &x -> x
-          if (*++in == T('&'))
+          if (*++in == wxT('&'))
             *out++ = *in++;
         }
-      else if (*in == T('\t'))
+      else if (*in == wxT('\t'))
         {
           // Remove all stuff after \t in X mode, and let the stuff as is
           // in Windows mode.
@@ -425,7 +431,7 @@ wxChar *wxStripMenuCodes (wxChar *in, wxChar *out)
         *out++ = *in++;
     }                                // while
 
-  *out = T('\0');
+  *out = wxT('\0');
 
   return tmpOut;
 }
@@ -439,6 +445,91 @@ wxString wxStripMenuCodes(const wxString& str)
     return str1;
 }
 
+#if wxUSE_ACCEL
+
+// return wxAcceleratorEntry for the given menu string or NULL if none
+// specified
+wxAcceleratorEntry *wxGetAccelFromString(const wxString& label)
+{
+    // check for accelerators: they are given after '\t'
+    int posTab = label.Find(wxT('\t'));
+    if ( posTab != wxNOT_FOUND ) {
+        // parse the accelerator string
+        int keyCode = 0;
+        int accelFlags = wxACCEL_NORMAL;
+        wxString current;
+        for ( size_t n = (size_t)posTab + 1; n < label.Len(); n++ ) {
+            if ( (label[n] == '+') || (label[n] == '-') ) {
+                if ( current == _("ctrl") )
+                    accelFlags |= wxACCEL_CTRL;
+                else if ( current == _("alt") )
+                    accelFlags |= wxACCEL_ALT;
+                else if ( current == _("shift") )
+                    accelFlags |= wxACCEL_SHIFT;
+                else {
+                    wxLogDebug(wxT("Unknown accel modifier: '%s'"),
+                               current.c_str());
+                }
+
+                current.Empty();
+            }
+            else {
+                current += wxTolower(label[n]);
+            }
+        }
+
+        if ( current.IsEmpty() ) {
+            wxLogDebug(wxT("No accel key found, accel string ignored."));
+        }
+        else {
+            if ( current.Len() == 1 ) {
+                // it's a letter
+                keyCode = wxToupper(current[0U]);
+            }
+            else {
+                // is it a function key?
+                if ( current[0U] == 'f' && isdigit(current[1U]) &&
+                     (current.Len() == 2 ||
+                     (current.Len() == 3 && isdigit(current[2U]))) ) {
+                    int n;
+                    wxSscanf(current.c_str() + 1, wxT("%d"), &n);
+
+                    keyCode = WXK_F1 + n - 1;
+                }
+                else {
+#if 0 // this is not supported by GTK+, apparently
+                    // several special cases
+                    current.MakeUpper();
+                    if ( current == wxT("DEL") ) {
+                        keyCode = VK_DELETE;
+                    }
+                    else if ( current == wxT("PGUP") ) {
+                        keyCode = VK_PRIOR;
+                    }
+                    else if ( current == wxT("PGDN") ) {
+                        keyCode = VK_NEXT;
+                    }
+                    else
+#endif // 0
+                    {
+                        wxLogDebug(wxT("Unrecognized accel key '%s', accel "
+                                       "string ignored."), current.c_str());
+                    }
+                }
+            }
+        }
+
+        if ( keyCode ) {
+            // we do have something
+            return new wxAcceleratorEntry(accelFlags, keyCode);
+        }
+    }
+
+    return (wxAcceleratorEntry *)NULL;
+}
+
+#endif // wxUSE_ACCEL
+
 // ----------------------------------------------------------------------------
 // Window search functions
 // ----------------------------------------------------------------------------
@@ -869,7 +960,7 @@ bool wxGetEmailAddress(wxChar *address, int maxSize)
         return FALSE;
 
     wxStrncpy(address, email, maxSize - 1);
-    address[maxSize - 1] = T('\0');
+    address[maxSize - 1] = wxT('\0');
 
     return TRUE;
 }
@@ -885,7 +976,7 @@ wxString wxGetEmailAddress()
         if ( !!user )
         {
             wxString email(user);
-            email << T('@') << host;
+            email << wxT('@') << host;
         }
     }