]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/accel.cpp
Fixed error in moving code from app.cpp in evtloop.cpp - caused accelerator
[wxWidgets.git] / src / os2 / accel.cpp
index 438c075e32c783c5162645b9917d25cc743ec2ed..e21a611fe03f6e979f0745f720e2a2c3e1121da5 100644 (file)
@@ -1,11 +1,11 @@
 /////////////////////////////////////////////////////////////////////////////
 // Name:        accel.cpp
 // Purpose:     wxAcceleratorTable
-// Author:      AUTHOR
+// Author:      David Webster
 // Modified by:
-// Created:     ??/??/98
+// Created:     10/13/99
 // RCS-ID:      $Id$
-// Copyright:   (c) AUTHOR
+// Copyright:   (c) David Webster
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
@@ -16,6 +16,8 @@
 #include <stdio.h>
 #include "wx/setup.h"
 #include "wx/window.h"
+#include "wx/app.h"
+#include "wx/frame.h"
 #endif
 
 #include "wx/os2/accel.h"
@@ -23,9 +25,7 @@
 #include "wx/os2/private.h"
 
 
-#if !USE_SHARED_LIBRARIES
 IMPLEMENT_DYNAMIC_CLASS(wxAcceleratorTable, wxObject)
-#endif
 
 class WXDLLEXPORT wxAcceleratorRefData: public wxObjectRefData
 {
@@ -37,63 +37,143 @@ public:
     inline HACCEL GetHACCEL() const { return m_hAccel; }
 protected:
     HACCEL      m_hAccel;
+    bool        m_ok;
 };
 
 #define M_ACCELDATA ((wxAcceleratorRefData *)m_refData)
 
 wxAcceleratorRefData::wxAcceleratorRefData()
 {
-    // TODO
-/*
-    HACCEL      m_hAccel;
-*/
-}
+    m_ok = FALSE;
+    m_hAccel = 0;
+} // end of wxAcceleratorRefData::wxAcceleratorRefData
 
 wxAcceleratorRefData::~wxAcceleratorRefData()
 {
-/*
-  if (m_hAccel)
-  {
-    DestroyAcceleratorTable((HACCEL) m_hAccel);
-  }
-  m_hAccel = 0 ;
-*/
-}
+    if (m_hAccel)
+    {
+        WinDestroyAccelTable((HACCEL) m_hAccel);
+    }
+    m_hAccel = 0 ;
+} // end of wxAcceleratorRefData::~wxAcceleratorRefData
 
 wxAcceleratorTable::wxAcceleratorTable()
 {
-  m_refData = NULL;
-}
+    m_refData = NULL;
+} // end of wxAcceleratorTable::wxAcceleratorTable
 
 wxAcceleratorTable::~wxAcceleratorTable()
 {
-}
+} // end of wxAcceleratorTable::~wxAcceleratorTable
 
 // Load from .rc resource
-wxAcceleratorTable::wxAcceleratorTable(const wxString& resource)
+wxAcceleratorTable::wxAcceleratorTable(
+  const wxString&                  rResource
+)
 {
+    HACCEL                          hAccel;
+    ULONG                           ulId;
+
     m_refData = new wxAcceleratorRefData;
 
-/* TODO: load acelerator from resource, if appropriate for your platform
+    ulId = atol((char*)rResource.c_str());
+    hAccel = ::WinLoadAccelTable( vHabmain
+                                 ,NULL // resources always in .exe
+                                 ,(ULONG)ulId
+                                );
+    if (wxTheApp->GetTopWindow() != NULL)
+    {
+        //
+        // If we have accelerators the top window is the frame
+        //
+        wxFrame*                    pFrame = (wxFrame*)wxTheApp->GetTopWindow();
+
+        ::WinSetAccelTable( vHabmain
+                           ,hAccel
+                           ,(HWND)pFrame->GetFrame()
+                          );
+    }
     M_ACCELDATA->m_hAccel = hAccel;
     M_ACCELDATA->m_ok = (hAccel != 0);
-*/
 }
 
+extern int wxCharCodeWXToOS2(
+  int                               nId
+, bool*                             pbIsVirtual
+);
+
 // Create from an array
-wxAcceleratorTable::wxAcceleratorTable(int n, wxAcceleratorEntry entries[])
+wxAcceleratorTable::wxAcceleratorTable(
+  int                               n
+, const wxAcceleratorEntry          vaEntries[]
+)
 {
-    m_refData = new wxAcceleratorRefData;
+    int                             nAccelLength = ((sizeof(ACCEL) * n) + sizeof(ACCELTABLE));
+    PACCELTABLE                     pArr;
+    int                             i;
 
-/* TODO: create table from entries
- */
-}
+    m_refData = new wxAcceleratorRefData;
+    pArr = (PACCELTABLE) new BYTE[nAccelLength];
+
+    for (i = 0; i < n; i++)
+    {
+        USHORT                      uVirt = AF_CHAR;
+
+        if (vaEntries[i].GetFlags() & wxACCEL_ALT)
+        {
+            uVirt |= AF_ALT;
+            uVirt |= AF_VIRTUALKEY;
+        }
+        if (vaEntries[i].GetFlags() & wxACCEL_SHIFT)
+        {
+            uVirt |= AF_SHIFT;
+            uVirt |= AF_VIRTUALKEY;
+        }
+        if (vaEntries[i].GetFlags() & wxACCEL_CTRL)
+        {
+            uVirt |= AF_CONTROL;
+            uVirt |= AF_VIRTUALKEY;
+        }
+
+        bool                        bIsVirtual;
+        USHORT                      uKey = wxCharCodeWXToOS2( vaEntries[i].GetKeyCode()
+                                                             ,&bIsVirtual
+                                                            );
+        if (bIsVirtual)
+            uVirt = AF_CHAR | AF_VIRTUALKEY;
+
+        USHORT                      uCmd = vaEntries[i].GetCommand();
+
+        pArr->aaccel[i].fs  = uVirt;
+        pArr->aaccel[i].key = uKey;
+        pArr->aaccel[i].cmd = uCmd;
+    }
+    pArr->codepage = ::WinQueryCp(wxTheApp->m_hMq);
+    pArr->cAccel = (USHORT)n;
+    M_ACCELDATA->m_hAccel = ::WinCreateAccelTable( vHabmain
+                                                  ,pArr
+                                                 );
+    if (wxTheApp->GetTopWindow() != NULL)
+    {
+        //
+        // If we have accelerators the top window is the frame
+        //
+        wxFrame*                    pFrame = (wxFrame*)wxTheApp->GetTopWindow();
+
+        ::WinSetAccelTable( vHabmain
+                           ,M_ACCELDATA->m_hAccel
+                           ,(HWND)pFrame->GetFrame()
+                          );
+    }
+
+    delete[] pArr;
+    M_ACCELDATA->m_ok = (M_ACCELDATA->m_hAccel != 0);
+} // end of wxAcceleratorTable::wxAcceleratorTable
 
 bool wxAcceleratorTable::Ok() const
 {
-    // TODO
-    return FALSE;
-}
+    return(M_ACCELDATA && (M_ACCELDATA->m_ok));
+} // end of wxAcceleratorTable::Ok
 
 void wxAcceleratorTable::SetHACCEL(WXHACCEL hAccel)
 {
@@ -110,14 +190,65 @@ WXHACCEL wxAcceleratorTable::GetHACCEL() const
     return (WXHACCEL) M_ACCELDATA->m_hAccel;
 }
 
-bool wxAcceleratorTable::Translate(wxWindow *window, WXMSG *wxmsg) const
+bool wxAcceleratorTable::Translate(
+  WXHWND                            hWnd
+, WXMSG*                            pWxmsg
+) const
 {
-    // TODO:
-/*
-    MSG *msg = (MSG *)wxmsg;
-
-    return Ok() && ::TranslateAccelerator(GetHwndOf(window), GetHaccel(), msg);
-*/
-    return FALSE;
-}
+    PQMSG                           pMsg = (PQMSG)pWxmsg;
+    BOOL                            rc = FALSE;
+
+    rc = ::WinTranslateAccel( vHabmain
+                             ,(HWND)hWnd
+                             ,GetHaccel()
+                             ,pMsg
+                            );
+    if (rc)
+    {
+        int x = 1;
+    }
+    return (Ok() && rc);
+} // end of wxAcceleratorTable::Translate
+
+// ---------------------------------------------------------------------------
+// function for translating labels
+// ---------------------------------------------------------------------------
+
+wxString wxPMTextToLabel(
+  const wxString&                   rsTitle
+)
+{
+    wxString                        sTitle;
+    const wxChar*                   zPc;
+
+    if (rsTitle.IsEmpty())
+        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