]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/utilscmn.cpp
a base for geometry operations
[wxWidgets.git] / src / common / utilscmn.cpp
index f41b535fca8b6085a0a228af418ed88a468b5ea7..ec09523cc72792eb76a717b543dc6bb4e92c45e5 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
 
     #include <clib.h>
 #endif
 
-// Pattern matching code. (FIXME)
-// Yes, this path is deliberate (for Borland compilation)
-#ifdef wx_mac /* MATTHEW: [5] Mac doesn't like paths with "/" */
-#include "glob.inc"
-#else
-#include "../common/glob.inc"
-#endif
-
 #ifdef __WXMSW__
     #include "windows.h"
 #endif
@@ -124,7 +122,7 @@ int strncasecmp(const char *str_1, const char *str_2, size_t maxchar)
 }
 #endif // wxMAC
 
-#ifdef __VMS__
+#if defined( __VMS__ ) && ( __VMS_VER < 70000000 )
 // we have no strI functions under VMS, therefore I have implemented
 // an inefficient but portable version: convert copies of strings to lowercase
 // and then use the normal comparison
@@ -145,7 +143,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 +205,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 +285,7 @@ IntToString (int number)
 {
   static wxChar buf[20];
 
-  wxSprintf (buf, T("%d"), number);
+  wxSprintf (buf, wxT("%d"), number);
   return buf;
 }
 
@@ -296,27 +294,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 +390,7 @@ wxString wxNow()
 #if wxUSE_GUI
 
 // ----------------------------------------------------------------------------
-// Strip out any menu codes
+// Menu accelerators related functions
 // ----------------------------------------------------------------------------
 
 wxChar *wxStripMenuCodes (wxChar *in, wxChar *out)
@@ -407,13 +405,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 +423,7 @@ wxChar *wxStripMenuCodes (wxChar *in, wxChar *out)
         *out++ = *in++;
     }                                // while
 
-  *out = T('\0');
+  *out = wxT('\0');
 
   return tmpOut;
 }
@@ -439,6 +437,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
 // ----------------------------------------------------------------------------
@@ -782,19 +865,14 @@ int wxMessageBox(const wxString& message, const wxString& caption, long style,
     {
         case wxID_OK:
             return wxOK;
-            break;
         case wxID_YES:
             return wxYES;
-            break;
         case wxID_NO:
             return wxNO;
-            break;
         default:
         case wxID_CANCEL:
             return wxCANCEL;
-            break;
     }
-    return ans;
 }
 
 #if wxUSE_TEXTDLG
@@ -869,7 +947,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 +963,7 @@ wxString wxGetEmailAddress()
         if ( !!user )
         {
             wxString email(user);
-            email << T('@') << host;
+            email << wxT('@') << host;
         }
     }
 
@@ -950,3 +1028,44 @@ wxString wxGetFullHostName()
     return buf;
 }
 
+wxString wxGetHomeDir()
+{
+    wxString home;
+    wxGetHomeDir(&home);
+
+    return home;
+}
+
+#if 0
+
+wxString wxGetCurrentDir()
+{
+    wxString dir;
+    size_t len = 1024;
+    bool ok;
+    do
+    {
+        ok = getcwd(dir.GetWriteBuf(len + 1), len) != NULL;
+        dir.UngetWriteBuf();
+
+        if ( !ok )
+        {
+            if ( errno != ERANGE )
+            {
+                wxLogSysError(_T("Failed to get current directory"));
+
+                return wxEmptyString;
+            }
+            else
+            {
+                // buffer was too small, retry with a larger one
+                len *= 2;
+            }
+        }
+        //else: ok
+    } while ( !ok );
+
+    return dir;
+}
+
+#endif // 0