]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/accel.cpp
fix bug with wxCSConv("ASCII")
[wxWidgets.git] / src / os2 / accel.cpp
index 1b901b20c4bf966c9a73e4eb7975b8c80b231805..fc5f2a319b4c8ad5be8c07b36c424d7543646be6 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
-// Name:        accel.cpp
+// Name:        src/os2/accel.cpp
 // Purpose:     wxAcceleratorTable
 // Author:      David Webster
 // Modified by:
 // Purpose:     wxAcceleratorTable
 // Author:      David Webster
 // Modified by:
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
+#include "wx/accel.h"
+
 #ifndef WX_PRECOMP
 #ifndef WX_PRECOMP
-#include <stdio.h>
-#include "wx/setup.h"
-#include "wx/window.h"
-#include "wx/app.h"
-#include "wx/frame.h"
+    #include <stdio.h>
+    #include "wx/window.h"
+    #include "wx/app.h"
+    #include "wx/frame.h"
 #endif
 
 #endif
 
-#include "wx/os2/accel.h"
-
 #include "wx/os2/private.h"
 
 
 #include "wx/os2/private.h"
 
 
@@ -32,7 +31,7 @@ class WXDLLEXPORT wxAcceleratorRefData: public wxObjectRefData
     friend class WXDLLEXPORT wxAcceleratorTable;
 public:
     wxAcceleratorRefData();
     friend class WXDLLEXPORT wxAcceleratorTable;
 public:
     wxAcceleratorRefData();
-    ~wxAcceleratorRefData();
+    virtual ~wxAcceleratorRefData();
 
     inline HACCEL GetHACCEL() const { return m_hAccel; }
 protected:
 
     inline HACCEL GetHACCEL() const { return m_hAccel; }
 protected:
@@ -44,7 +43,7 @@ protected:
 
 wxAcceleratorRefData::wxAcceleratorRefData()
 {
 
 wxAcceleratorRefData::wxAcceleratorRefData()
 {
-    m_ok = FALSE;
+    m_ok = false;
     m_hAccel = 0;
 } // end of wxAcceleratorRefData::wxAcceleratorRefData
 
     m_hAccel = 0;
 } // end of wxAcceleratorRefData::wxAcceleratorRefData
 
@@ -76,7 +75,7 @@ wxAcceleratorTable::wxAcceleratorTable(
 
     m_refData = new wxAcceleratorRefData;
 
 
     m_refData = new wxAcceleratorRefData;
 
-    ulId = atol((char*)rResource.c_str());
+    ulId = atol(rResource.c_str());
     hAccel = ::WinLoadAccelTable( vHabmain
                                  ,NULL // resources always in .exe
                                  ,(ULONG)ulId
     hAccel = ::WinLoadAccelTable( vHabmain
                                  ,NULL // resources always in .exe
                                  ,(ULONG)ulId
@@ -90,7 +89,7 @@ wxAcceleratorTable::wxAcceleratorTable(
 
         ::WinSetAccelTable( vHabmain
                            ,hAccel
 
         ::WinSetAccelTable( vHabmain
                            ,hAccel
-                           ,(HWND)pFrame->GetHWND()
+                           ,(HWND)pFrame->GetFrame()
                           );
     }
     M_ACCELDATA->m_hAccel = hAccel;
                           );
     }
     M_ACCELDATA->m_hAccel = hAccel;
@@ -105,7 +104,7 @@ extern int wxCharCodeWXToOS2(
 // Create from an array
 wxAcceleratorTable::wxAcceleratorTable(
   int                               n
 // Create from an array
 wxAcceleratorTable::wxAcceleratorTable(
   int                               n
-, wxAcceleratorEntry                vaEntries[]
+, const wxAcceleratorEntry          vaEntries[]
 )
 {
     int                             nAccelLength = ((sizeof(ACCEL) * n) + sizeof(ACCELTABLE));
 )
 {
     int                             nAccelLength = ((sizeof(ACCEL) * n) + sizeof(ACCELTABLE));
@@ -120,26 +119,34 @@ wxAcceleratorTable::wxAcceleratorTable(
         USHORT                      uVirt = AF_CHAR;
 
         if (vaEntries[i].GetFlags() & wxACCEL_ALT)
         USHORT                      uVirt = AF_CHAR;
 
         if (vaEntries[i].GetFlags() & wxACCEL_ALT)
+        {
             uVirt |= AF_ALT;
             uVirt |= AF_ALT;
+            uVirt |= AF_VIRTUALKEY;
+        }
         if (vaEntries[i].GetFlags() & wxACCEL_SHIFT)
         if (vaEntries[i].GetFlags() & wxACCEL_SHIFT)
+        {
             uVirt |= AF_SHIFT;
             uVirt |= AF_SHIFT;
+            uVirt |= AF_VIRTUALKEY;
+        }
         if (vaEntries[i].GetFlags() & wxACCEL_CTRL)
         if (vaEntries[i].GetFlags() & wxACCEL_CTRL)
+        {
             uVirt |= AF_CONTROL;
             uVirt |= AF_CONTROL;
+            uVirt |= AF_VIRTUALKEY;
+        }
 
 
-        bool                        bIsVirtual;
-        USHORT                      uKey = wxCharCodeWXToOS2( vaEntries[i].GetKeyCode()
-                                                             ,&bIsVirtual
-                                                            );
+        bool bIsVirtual;
+        USHORT uKey = (USHORT)wxCharCodeWXToOS2( vaEntries[i].GetKeyCode(),
+                                                 &bIsVirtual);
         if (bIsVirtual)
             uVirt = AF_CHAR | AF_VIRTUALKEY;
 
         if (bIsVirtual)
             uVirt = AF_CHAR | AF_VIRTUALKEY;
 
-        USHORT                      uCmd = vaEntries[i].GetCommand();
+        USHORT uCmd = (USHORT)vaEntries[i].GetCommand();
 
         pArr->aaccel[i].fs  = uVirt;
         pArr->aaccel[i].key = uKey;
         pArr->aaccel[i].cmd = uCmd;
     }
 
         pArr->aaccel[i].fs  = uVirt;
         pArr->aaccel[i].key = uKey;
         pArr->aaccel[i].cmd = uCmd;
     }
-    pArr->codepage = 437; // default to english Fix???
+    pArr->codepage = (USHORT)::WinQueryCp(wxTheApp->m_hMq);
     pArr->cAccel = (USHORT)n;
     M_ACCELDATA->m_hAccel = ::WinCreateAccelTable( vHabmain
                                                   ,pArr
     pArr->cAccel = (USHORT)n;
     M_ACCELDATA->m_hAccel = ::WinCreateAccelTable( vHabmain
                                                   ,pArr
@@ -149,11 +156,11 @@ wxAcceleratorTable::wxAcceleratorTable(
         //
         // If we have accelerators the top window is the frame
         //
         //
         // If we have accelerators the top window is the frame
         //
-        wxFrame*                    pFrame = (wxFrame*)wxTheApp->GetTopWindow();
+        wxFrame* pFrame = (wxFrame*)wxTheApp->GetTopWindow();
 
         ::WinSetAccelTable( vHabmain
                            ,M_ACCELDATA->m_hAccel
 
         ::WinSetAccelTable( vHabmain
                            ,M_ACCELDATA->m_hAccel
-                           ,(HWND)pFrame->GetHWND()
+                           ,(HWND)pFrame->GetFrame()
                           );
     }
 
                           );
     }
 
@@ -161,10 +168,10 @@ wxAcceleratorTable::wxAcceleratorTable(
     M_ACCELDATA->m_ok = (M_ACCELDATA->m_hAccel != 0);
 } // end of wxAcceleratorTable::wxAcceleratorTable
 
     M_ACCELDATA->m_ok = (M_ACCELDATA->m_hAccel != 0);
 } // end of wxAcceleratorTable::wxAcceleratorTable
 
-bool wxAcceleratorTable::Ok() const
+bool wxAcceleratorTable::IsOk() const
 {
     return(M_ACCELDATA && (M_ACCELDATA->m_ok));
 {
     return(M_ACCELDATA && (M_ACCELDATA->m_ok));
-} // end of wxAcceleratorTable::Ok
+} // end of wxAcceleratorTable::IsOk
 
 void wxAcceleratorTable::SetHACCEL(WXHACCEL hAccel)
 {
 
 void wxAcceleratorTable::SetHACCEL(WXHACCEL hAccel)
 {
@@ -181,17 +188,56 @@ WXHACCEL wxAcceleratorTable::GetHACCEL() const
     return (WXHACCEL) M_ACCELDATA->m_hAccel;
 }
 
     return (WXHACCEL) M_ACCELDATA->m_hAccel;
 }
 
-bool wxAcceleratorTable::Translate(
-  WXHWND                            hWnd
-, WXMSG*                            pWxmsg
-) const
+bool wxAcceleratorTable::Translate( WXHWND  hWnd,
+                                    WXMSG*  pWxmsg ) const
 {
 {
-    PQMSG                           pMsg = (PQMSG)pWxmsg;
-
-    return Ok() && ::WinTranslateAccel( vHabmain
-                                       ,(HWND)hWnd
-                                       ,GetHaccel()
-                                       ,pMsg
-                                       );
+    PQMSG pMsg = (PQMSG)pWxmsg;
+    BOOL  rc = FALSE;
+
+    rc = ::WinTranslateAccel( vHabmain
+                             ,(HWND)hWnd
+                             ,GetHaccel()
+                             ,pMsg
+                            );
+    return (Ok() && rc);
 } // end of wxAcceleratorTable::Translate
 
 } // end of wxAcceleratorTable::Translate
 
+// ---------------------------------------------------------------------------
+// function for translating labels
+// ---------------------------------------------------------------------------
+
+wxString wxPMTextToLabel( const wxString& rsTitle )
+{
+    wxString      sTitle;
+    const wxChar* zPc;
+
+    if (rsTitle.empty())
+        return(sTitle);
+
+    for (zPc = rsTitle.c_str(); *zPc != wxT('\0'); zPc++)
+    {
+        if (*zPc == wxT('&'))
+        {
+            if (*(zPc + 1) == wxT('&'))
+            {
+                zPc++;
+                sTitle << wxT('&');
+            }
+            else
+                sTitle << wxT('~');
+        }
+        else
+        {
+            if ( *zPc == wxT('~'))
+            {
+                //
+                // Tildes must be doubled to prevent them from being
+                // interpreted as accelerator character prefix by PM ???
+                //
+                sTitle << *zPc;
+            }
+            sTitle << *zPc;
+        }
+    }
+    return(sTitle);
+} // end of wxPMTextToLabel