Soren Jorvang d14efe561b Import r67258 of the wxWidgets trunk, which I expect will before
long become wxWidgets 2.9.2, which in turn is expected to be the
last 2.9 release before the 3.0 stable release.

Since the full wxWidgets distribution is rather large, I have
imported only the parts that we use, on a subdirectory basis:

art
include/wx/*.*
include/wx/aui
include/wx/cocoa
include/wx/generic
include/wx/gtk
include/wx/meta
include/wx/msw
include/wx/osx
include/wx/persist
include/wx/private
include/wx/protocol
include/wx/unix
src/aui
src/common
src/generic
src/gtk
src/msw
src/osx
src/unix


git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@7380 8ced0084-cf51-0410-be5f-012b33b47a6e
2011-03-20 18:05:19 +00:00

156 lines
4.1 KiB
C++

/////////////////////////////////////////////////////////////////////////////
// Name: src/msw/accel.cpp
// Purpose: wxAcceleratorTable
// Author: Julian Smart
// Modified by:
// Created: 04/01/98
// RCS-ID: $Id: accel.cpp 67254 2011-03-20 00:14:35Z DS $
// Copyright: (c) Julian Smart
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// ============================================================================
// declarations
// ============================================================================
// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#if wxUSE_ACCEL
#ifndef WX_PRECOMP
#include "wx/window.h"
#endif
#include "wx/accel.h"
#include "wx/msw/private.h"
#include "wx/msw/private/keyboard.h"
IMPLEMENT_DYNAMIC_CLASS(wxAcceleratorTable, wxObject)
// ----------------------------------------------------------------------------
// data defining wxAcceleratorTable
// ----------------------------------------------------------------------------
class WXDLLEXPORT wxAcceleratorRefData: public wxObjectRefData
{
friend class WXDLLIMPEXP_FWD_CORE wxAcceleratorTable;
public:
wxAcceleratorRefData();
virtual ~wxAcceleratorRefData();
inline HACCEL GetHACCEL() const { return m_hAccel; }
protected:
HACCEL m_hAccel;
bool m_ok;
wxDECLARE_NO_COPY_CLASS(wxAcceleratorRefData);
};
// ============================================================================
// implementation
// ============================================================================
// ----------------------------------------------------------------------------
// wxAcceleratorRefData
// ----------------------------------------------------------------------------
#define M_ACCELDATA ((wxAcceleratorRefData *)m_refData)
wxAcceleratorRefData::wxAcceleratorRefData()
{
m_ok = false;
m_hAccel = 0;
}
wxAcceleratorRefData::~wxAcceleratorRefData()
{
if (m_hAccel)
{
DestroyAcceleratorTable((HACCEL) m_hAccel);
}
}
// ----------------------------------------------------------------------------
// wxAcceleratorTable
// ----------------------------------------------------------------------------
// Load from .rc resource
wxAcceleratorTable::wxAcceleratorTable(const wxString& resource)
{
m_refData = new wxAcceleratorRefData;
HACCEL hAccel = ::LoadAccelerators(wxGetInstance(), resource.wx_str());
M_ACCELDATA->m_hAccel = hAccel;
M_ACCELDATA->m_ok = hAccel != 0;
}
// Create from an array
wxAcceleratorTable::wxAcceleratorTable(int n, const wxAcceleratorEntry entries[])
{
m_refData = new wxAcceleratorRefData;
ACCEL* arr = new ACCEL[n];
for ( int i = 0; i < n; i++ )
{
int flags = entries[i].GetFlags();
BYTE fVirt = FVIRTKEY;
if ( flags & wxACCEL_ALT )
fVirt |= FALT;
if ( flags & wxACCEL_SHIFT )
fVirt |= FSHIFT;
if ( flags & wxACCEL_CTRL )
fVirt |= FCONTROL;
WORD key = wxMSWKeyboard::WXToVK(entries[i].GetKeyCode());
arr[i].fVirt = fVirt;
arr[i].key = key;
arr[i].cmd = (WORD)entries[i].GetCommand();
}
M_ACCELDATA->m_hAccel = ::CreateAcceleratorTable(arr, n);
delete[] arr;
M_ACCELDATA->m_ok = (M_ACCELDATA->m_hAccel != 0);
}
bool wxAcceleratorTable::IsOk() 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;
}
bool wxAcceleratorTable::Translate(wxWindow *window, WXMSG *wxmsg) const
{
MSG *msg = (MSG *)wxmsg;
return Ok() && ::TranslateAccelerator(GetHwndOf(window), GetHaccel(), msg);
}
#endif // wxUSE_ACCEL