From 110f32055efdffb06ab5c98fb45de2bb2b7a57d9 Mon Sep 17 00:00:00 2001 From: Julian Smart Date: Fri, 31 Jul 1998 13:22:58 +0000 Subject: [PATCH] Added wxAccelerationTable class git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@407 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/msw/accel.h | 78 +++++++++++++++++++++ src/msw/accel.cpp | 152 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 230 insertions(+) create mode 100644 include/wx/msw/accel.h create mode 100644 src/msw/accel.cpp diff --git a/include/wx/msw/accel.h b/include/wx/msw/accel.h new file mode 100644 index 0000000000..863af19f0d --- /dev/null +++ b/include/wx/msw/accel.h @@ -0,0 +1,78 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: accel.h +// Purpose: wxAcceleratorTable class +// Author: Julian Smart +// Modified by: +// Created: 31/7/98 +// RCS-ID: $Id$ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_ACCEL_H_ +#define _WX_ACCEL_H_ + +#ifdef __GNUG__ +#pragma interface "accel.h" +#endif + +#include "wx/object.h" + +class WXDLLEXPORT wxAcceleratorTable; + +// Hold Ctrl key down +#define wxACCEL_ALT 0x01 + +// Hold Ctrl key down +#define wxACCEL_CTRL 0x02 + + // Hold Shift key down +#define wxACCEL_SHIFT 0x04 + +class WXDLLEXPORT wxAcceleratorEntry +{ +public: + wxAcceleratorEntry(int flags = 0, int keyCode = 0, int cmd = 0) + { + m_flags = flags; m_keyCode = keyCode; m_command = cmd; + } + + inline void Set(int flags, int keyCode, int cmd) + { m_flags = flags; m_keyCode = keyCode; m_command = cmd; } + + inline int GetFlags() const { return m_flags; } + inline int GetKeyCode() const { return m_keyCode; } + inline int GetCommand() const { return m_command; } + + int m_flags; + int m_keyCode; // ASCII or virtual keycode + int m_command; // Command id to generate +}; + +class WXDLLEXPORT wxAcceleratorTable: public wxObject +{ +DECLARE_DYNAMIC_CLASS(wxAcceleratorTable) +public: + wxAcceleratorTable(); + wxAcceleratorTable(const wxString& resource); // Load from .rc resource + wxAcceleratorTable(int n, wxAcceleratorEntry entries[]); // Load from array + + // Copy constructors + inline wxAcceleratorTable(const wxAcceleratorTable& accel) { Ref(accel); } + inline wxAcceleratorTable(const wxAcceleratorTable* accel) { if (accel) Ref(*accel); } + + ~wxAcceleratorTable(); + + inline wxAcceleratorTable& operator = (const wxAcceleratorTable& accel) { if (*this == accel) return (*this); Ref(accel); return *this; } + inline bool operator == (const wxAcceleratorTable& accel) { return m_refData == accel.m_refData; } + inline bool operator != (const wxAcceleratorTable& accel) { return m_refData != accel.m_refData; } + + bool Ok(void) const; + void SetHACCEL(WXHACCEL hAccel); + WXHACCEL GetHACCEL() const; +}; + +WXDLLEXPORT_DATA(extern wxAcceleratorTable) wxNullAcceleratorTable; + +#endif + // _WX_ACCEL_H_ diff --git a/src/msw/accel.cpp b/src/msw/accel.cpp new file mode 100644 index 0000000000..391937f23a --- /dev/null +++ b/src/msw/accel.cpp @@ -0,0 +1,152 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: accel.cpp +// Purpose: wxAcceleratorTable +// Author: Julian Smart +// Modified by: +// Created: 04/01/98 +// RCS-ID: $Id$ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifdef __GNUG__ +#pragma implementation "accel.h" +#endif + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ +#pragma hdrstop +#endif + +#ifndef WX_PRECOMP +#include +#include "wx/setup.h" +#endif + +#include "wx/msw/private.h" +#include "wx/msw/accel.h" + +#ifdef LoadAccelerators +#undef LoadAccelerators +#endif + +#if !USE_SHARED_LIBRARIES +IMPLEMENT_DYNAMIC_CLASS(wxAcceleratorTable, wxObject) +#endif + +class WXDLLEXPORT wxAcceleratorRefData: public wxObjectRefData +{ + friend class WXDLLEXPORT wxAcceleratorTable; +public: + wxAcceleratorRefData(void); + ~wxAcceleratorRefData(void); + + inline HACCEL GetHACCEL() const { return m_hAccel; } +protected: + HACCEL m_hAccel; + bool m_ok; +}; + +#define M_ACCELDATA ((wxAcceleratorRefData *)m_refData) + +wxAcceleratorRefData::wxAcceleratorRefData() +{ + m_ok = FALSE; + m_hAccel = 0; +} + +wxAcceleratorRefData::~wxAcceleratorRefData() +{ + if (m_hAccel) + { + DestroyAcceleratorTable((HACCEL) m_hAccel); + } + m_hAccel = 0 ; +} + +wxAcceleratorTable::wxAcceleratorTable() +{ + m_refData = NULL; +} + +wxAcceleratorTable::~wxAcceleratorTable() +{ +} + +// Load from .rc resource +wxAcceleratorTable::wxAcceleratorTable(const wxString& resource) +{ + m_refData = new wxAcceleratorRefData; + + HACCEL hAccel = +#ifdef __WIN32__ +#ifdef UNICODE + ::LoadAcceleratorsW(wxGetInstance(), (const char *)resource); +#else + ::LoadAcceleratorsA(wxGetInstance(), (const char *)resource); +#endif +#else + ::LoadAccelerators(wxGetInstance(), (const char *)resource); +#endif + M_ACCELDATA->m_hAccel = hAccel; + M_ACCELDATA->m_ok = (hAccel != 0); +} + +extern int wxCharCodeWXToMSW(int id, bool *isVirtual); + +// Create from an array +wxAcceleratorTable::wxAcceleratorTable(int n, wxAcceleratorEntry entries[]) +{ + m_refData = new wxAcceleratorRefData; + + ACCEL* arr = new ACCEL[n]; + int i; + for (i = 0; i < n; i++) + { + BYTE fVirt = 0; + if (entries[i].m_flags & wxACCEL_ALT) + fVirt |= FALT; + if (entries[i].m_flags & wxACCEL_SHIFT) + fVirt |= FSHIFT; + if (entries[i].m_flags & wxACCEL_CTRL) + fVirt |= FCONTROL; + + bool isVirtual; + WORD key = wxCharCodeWXToMSW(entries[i].m_keyCode, & isVirtual); + fVirt |= FVIRTKEY; + + WORD cmd = entries[i].m_command; + + arr[i].fVirt = fVirt; + arr[i].key = key; + arr[i].cmd = cmd; + } + + M_ACCELDATA->m_hAccel = ::CreateAcceleratorTable(arr, n); + delete[] arr; + + M_ACCELDATA->m_ok = (M_ACCELDATA->m_hAccel != 0); +} + +bool wxAcceleratorTable::Ok(void) const +{ + return (M_ACCELDATA && (M_ACCELDATA->m_ok)); +} + +void wxAcceleratorTable::SetHACCEL(WXHACCEL hAccel) +{ + if (!M_ACCELDATA) + m_refData = new wxAcceleratorRefData; + + M_ACCELDATA->m_hAccel = (HACCEL) hAccel; +} + +WXHACCEL wxAcceleratorTable::GetHACCEL() const +{ + if (!M_ACCELDATA) + return 0; + return (WXHACCEL) M_ACCELDATA->m_hAccel; +} + -- 2.45.2