home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
wxos2240.zip
/
wxWindows-2.4.0
/
src
/
os2
/
accel.cpp
next >
Wrap
C/C++ Source or Header
|
2002-08-25
|
6KB
|
213 lines
/////////////////////////////////////////////////////////////////////////////
// Name: accel.cpp
// Purpose: wxAcceleratorTable
// Author: David Webster
// Modified by:
// Created: 10/13/99
// RCS-ID: $Id: ACCEL.CPP,v 1.15 2002/08/25 17:53:55 SN Exp $
// Copyright: (c) David Webster
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifndef WX_PRECOMP
#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"
#include "wx/os2/private.h"
IMPLEMENT_DYNAMIC_CLASS(wxAcceleratorTable, wxObject)
class WXDLLEXPORT wxAcceleratorRefData: public wxObjectRefData
{
friend class WXDLLEXPORT wxAcceleratorTable;
public:
wxAcceleratorRefData();
~wxAcceleratorRefData();
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;
} // end of wxAcceleratorRefData::wxAcceleratorRefData
wxAcceleratorRefData::~wxAcceleratorRefData()
{
if (m_hAccel)
{
WinDestroyAccelTable((HACCEL) m_hAccel);
}
m_hAccel = 0 ;
} // end of wxAcceleratorRefData::~wxAcceleratorRefData
wxAcceleratorTable::wxAcceleratorTable()
{
m_refData = NULL;
} // end of wxAcceleratorTable::wxAcceleratorTable
wxAcceleratorTable::~wxAcceleratorTable()
{
} // end of wxAcceleratorTable::~wxAcceleratorTable
// Load from .rc resource
wxAcceleratorTable::wxAcceleratorTable(
const wxString& rResource
)
{
HACCEL hAccel;
ULONG ulId;
m_refData = new wxAcceleratorRefData;
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
, const wxAcceleratorEntry vaEntries[]
)
{
int nAccelLength = ((sizeof(ACCEL) * n) + sizeof(ACCELTABLE));
PACCELTABLE pArr;
int i;
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
{
return(M_ACCELDATA && (M_ACCELDATA->m_ok));
} // end of wxAcceleratorTable::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(
WXHWND hWnd
, WXMSG* pWxmsg
) const
{
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