1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/os2/accel.cpp
3 // Purpose: wxAcceleratorTable
4 // Author: David Webster
8 // Copyright: (c) David Webster
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 // For compilers that support precompilation, includes "wx.h".
13 #include "wx/wxprec.h"
19 #include "wx/window.h"
24 #include "wx/os2/private.h"
27 IMPLEMENT_DYNAMIC_CLASS(wxAcceleratorTable
, wxObject
)
29 class WXDLLEXPORT wxAcceleratorRefData
: public wxObjectRefData
31 friend class WXDLLEXPORT wxAcceleratorTable
;
33 wxAcceleratorRefData();
34 ~wxAcceleratorRefData();
36 inline HACCEL
GetHACCEL() const { return m_hAccel
; }
42 #define M_ACCELDATA ((wxAcceleratorRefData *)m_refData)
44 wxAcceleratorRefData::wxAcceleratorRefData()
48 } // end of wxAcceleratorRefData::wxAcceleratorRefData
50 wxAcceleratorRefData::~wxAcceleratorRefData()
54 WinDestroyAccelTable((HACCEL
) m_hAccel
);
57 } // end of wxAcceleratorRefData::~wxAcceleratorRefData
59 wxAcceleratorTable::wxAcceleratorTable()
62 } // end of wxAcceleratorTable::wxAcceleratorTable
64 wxAcceleratorTable::~wxAcceleratorTable()
66 } // end of wxAcceleratorTable::~wxAcceleratorTable
68 // Load from .rc resource
69 wxAcceleratorTable::wxAcceleratorTable(
70 const wxString
& rResource
76 m_refData
= new wxAcceleratorRefData
;
78 ulId
= atol((char*)rResource
.c_str());
79 hAccel
= ::WinLoadAccelTable( vHabmain
80 ,NULL
// resources always in .exe
83 if (wxTheApp
->GetTopWindow() != NULL
)
86 // If we have accelerators the top window is the frame
88 wxFrame
* pFrame
= (wxFrame
*)wxTheApp
->GetTopWindow();
90 ::WinSetAccelTable( vHabmain
92 ,(HWND
)pFrame
->GetFrame()
95 M_ACCELDATA
->m_hAccel
= hAccel
;
96 M_ACCELDATA
->m_ok
= (hAccel
!= 0);
99 extern int wxCharCodeWXToOS2(
104 // Create from an array
105 wxAcceleratorTable::wxAcceleratorTable(
107 , const wxAcceleratorEntry vaEntries
[]
110 int nAccelLength
= ((sizeof(ACCEL
) * n
) + sizeof(ACCELTABLE
));
114 m_refData
= new wxAcceleratorRefData
;
115 pArr
= (PACCELTABLE
) new BYTE
[nAccelLength
];
117 for (i
= 0; i
< n
; i
++)
119 USHORT uVirt
= AF_CHAR
;
121 if (vaEntries
[i
].GetFlags() & wxACCEL_ALT
)
124 uVirt
|= AF_VIRTUALKEY
;
126 if (vaEntries
[i
].GetFlags() & wxACCEL_SHIFT
)
129 uVirt
|= AF_VIRTUALKEY
;
131 if (vaEntries
[i
].GetFlags() & wxACCEL_CTRL
)
134 uVirt
|= AF_VIRTUALKEY
;
138 USHORT uKey
= (USHORT
)wxCharCodeWXToOS2( vaEntries
[i
].GetKeyCode(),
141 uVirt
= AF_CHAR
| AF_VIRTUALKEY
;
143 USHORT uCmd
= (USHORT
)vaEntries
[i
].GetCommand();
145 pArr
->aaccel
[i
].fs
= uVirt
;
146 pArr
->aaccel
[i
].key
= uKey
;
147 pArr
->aaccel
[i
].cmd
= uCmd
;
149 pArr
->codepage
= (USHORT
)::WinQueryCp(wxTheApp
->m_hMq
);
150 pArr
->cAccel
= (USHORT
)n
;
151 M_ACCELDATA
->m_hAccel
= ::WinCreateAccelTable( vHabmain
154 if (wxTheApp
->GetTopWindow() != NULL
)
157 // If we have accelerators the top window is the frame
159 wxFrame
* pFrame
= (wxFrame
*)wxTheApp
->GetTopWindow();
161 ::WinSetAccelTable( vHabmain
162 ,M_ACCELDATA
->m_hAccel
163 ,(HWND
)pFrame
->GetFrame()
168 M_ACCELDATA
->m_ok
= (M_ACCELDATA
->m_hAccel
!= 0);
169 } // end of wxAcceleratorTable::wxAcceleratorTable
171 bool wxAcceleratorTable::Ok() const
173 return(M_ACCELDATA
&& (M_ACCELDATA
->m_ok
));
174 } // end of wxAcceleratorTable::Ok
176 void wxAcceleratorTable::SetHACCEL(WXHACCEL hAccel
)
179 m_refData
= new wxAcceleratorRefData
;
181 M_ACCELDATA
->m_hAccel
= (HACCEL
) hAccel
;
184 WXHACCEL
wxAcceleratorTable::GetHACCEL() const
188 return (WXHACCEL
) M_ACCELDATA
->m_hAccel
;
191 bool wxAcceleratorTable::Translate( WXHWND hWnd
,
192 WXMSG
* pWxmsg
) const
194 PQMSG pMsg
= (PQMSG
)pWxmsg
;
197 rc
= ::WinTranslateAccel( vHabmain
203 } // end of wxAcceleratorTable::Translate
205 // ---------------------------------------------------------------------------
206 // function for translating labels
207 // ---------------------------------------------------------------------------
209 wxString
wxPMTextToLabel( const wxString
& rsTitle
)
217 for (zPc
= rsTitle
.c_str(); *zPc
!= wxT('\0'); zPc
++)
219 if (*zPc
== wxT('&'))
221 if (*(zPc
+ 1) == wxT('&'))
231 if ( *zPc
== wxT('~'))
234 // Tildes must be doubled to prevent them from being
235 // interpreted as accelerator character prefix by PM ???
243 } // end of wxPMTextToLabel