X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/75f11ad7ca4201f7e2626a2bf5ad84a01296eb4a..83498ef2b0a77944b3f7f3539b7bef6387c384a0:/src/os2/accel.cpp diff --git a/src/os2/accel.cpp b/src/os2/accel.cpp index 438c075e32..34be764815 100644 --- a/src/os2/accel.cpp +++ b/src/os2/accel.cpp @@ -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 #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,142 @@ 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 = (USHORT)wxCharCodeWXToOS2( vaEntries[i].GetKeyCode(), + &bIsVirtual); + if (bIsVirtual) + uVirt = AF_CHAR | AF_VIRTUALKEY; + + USHORT uCmd = (USHORT)vaEntries[i].GetCommand(); + + pArr->aaccel[i].fs = uVirt; + pArr->aaccel[i].key = uKey; + pArr->aaccel[i].cmd = uCmd; + } + pArr->codepage = (USHORT)::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 +189,58 @@ 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 + ); + return (Ok() && rc); +} // 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