]> git.saurik.com Git - wxWidgets.git/blame - src/generic/accel.cpp
no_rtti fix was not having correct eval order
[wxWidgets.git] / src / generic / accel.cpp
CommitLineData
b90c32b4
VZ
1///////////////////////////////////////////////////////////////////////////////
2// Name: generic/accel.cpp
3// Purpose: generic implementation of wxAcceleratorTable class
4// Author: Robert Roebling
5// Modified: VZ pn 31.05.01: use typed lists, Unicode cleanup, Add/Remove
6// Id: $Id$
7// Copyright: (c) 1998 Robert Roebling
65571936 8// Licence: wxWindows licence
b90c32b4
VZ
9///////////////////////////////////////////////////////////////////////////////
10
11// ============================================================================
12// declarations
13// ============================================================================
14
15// ----------------------------------------------------------------------------
16// headers
17// ----------------------------------------------------------------------------
18
14f355c2 19#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
b90c32b4
VZ
20 #pragma implementation "accel.h"
21#endif
22
23// For compilers that support precompilation, includes "wx.h".
24#include "wx/wxprec.h"
25
26#ifdef __BORLANDC__
27 #pragma hdrstop
28#endif
29
30#if wxUSE_ACCEL
31
32#ifndef WX_PRECOMP
33 #include "wx/event.h"
34 #include "wx/list.h"
35#endif // WX_PRECOMP
36
37#include "wx/accel.h"
38
39#include <ctype.h>
40
41// ----------------------------------------------------------------------------
42// wxAccelList: a list of wxAcceleratorEntries
43// ----------------------------------------------------------------------------
44
45WX_DECLARE_LIST(wxAcceleratorEntry, wxAccelList);
46#include "wx/listimpl.cpp"
47WX_DEFINE_LIST(wxAccelList);
48
49// ----------------------------------------------------------------------------
50// wxAccelRefData: the data used by wxAcceleratorTable
51// ----------------------------------------------------------------------------
52
53class wxAccelRefData : public wxObjectRefData
54{
55public:
fa03793d
VS
56 wxAccelRefData()
57 {
fa03793d
VS
58 }
59
60 wxAccelRefData(const wxAccelRefData& data)
d84afea9 61 : wxObjectRefData()
fa03793d 62 {
fa03793d
VS
63 m_accels = data.m_accels;
64 }
b90c32b4 65
222ed1d6
MB
66 virtual ~wxAccelRefData()
67 {
68 WX_CLEAR_LIST(wxAccelList, m_accels);
69 }
70
b90c32b4
VZ
71 wxAccelList m_accels;
72};
73
74// macro which can be used to access wxAccelRefData from wxAcceleratorTable
75#define M_ACCELDATA ((wxAccelRefData *)m_refData)
76
fa03793d 77
b90c32b4
VZ
78// ============================================================================
79// implementation
80// ============================================================================
81
82// ----------------------------------------------------------------------------
83// wxAcceleratorTable ctors
84// ----------------------------------------------------------------------------
85
86IMPLEMENT_DYNAMIC_CLASS(wxAcceleratorTable, wxObject)
87
88wxAcceleratorTable::wxAcceleratorTable()
89{
90}
91
3c674514 92wxAcceleratorTable::wxAcceleratorTable(int n, const wxAcceleratorEntry entries[])
b90c32b4
VZ
93{
94 m_refData = new wxAccelRefData;
95
96 for ( int i = 0; i < n; i++ )
97 {
98 const wxAcceleratorEntry& entry = entries[i];
99
32b13913 100 int keycode = wxToupper(entry.GetKeyCode());
b90c32b4
VZ
101
102 M_ACCELDATA->m_accels.Append(new wxAcceleratorEntry(entry.GetFlags(),
103 keycode,
104 entry.GetCommand()));
105 }
106}
107
108wxAcceleratorTable::~wxAcceleratorTable()
109{
110}
111
112bool wxAcceleratorTable::Ok() const
113{
114 return m_refData != NULL;
115}
116
117// ----------------------------------------------------------------------------
118// wxAcceleratorTable updating
119// ----------------------------------------------------------------------------
120
121void wxAcceleratorTable::Add(const wxAcceleratorEntry& entry)
122{
fa03793d
VS
123 AllocExclusive();
124
b90c32b4
VZ
125 if ( !m_refData )
126 {
127 m_refData = new wxAccelRefData;
128 }
129
130 M_ACCELDATA->m_accels.Append(new wxAcceleratorEntry(entry));
131}
132
133void wxAcceleratorTable::Remove(const wxAcceleratorEntry& entry)
134{
fa03793d
VS
135 AllocExclusive();
136
222ed1d6 137 wxAccelList::compatibility_iterator node = M_ACCELDATA->m_accels.GetFirst();
b90c32b4
VZ
138 while ( node )
139 {
140 const wxAcceleratorEntry *entryCur = node->GetData();
141
d61f7200
WS
142 // given entry contains only the information of the accelerator key
143 // because it was set that way in wxGetAccelFromString()
144 // so do not perform full ( *entryCur == entry ) comparison
145 if ((entryCur->GetKeyCode() == entry.GetKeyCode()) &&
146 (entryCur->GetFlags() == entry.GetFlags()))
b90c32b4 147 {
222ed1d6
MB
148 delete node->GetData();
149 M_ACCELDATA->m_accels.Erase(node);
b90c32b4
VZ
150
151 return;
152 }
153
154 node = node->GetNext();
155 }
156
157 wxFAIL_MSG(_T("deleting inexistent accel from wxAcceleratorTable"));
158}
159
160// ----------------------------------------------------------------------------
161// wxAcceleratorTable: find a command for the given key press
162// ----------------------------------------------------------------------------
163
164const wxAcceleratorEntry *
165wxAcceleratorTable::GetEntry(const wxKeyEvent& event) const
166{
167 if ( !Ok() )
168 {
169 // not an error, the accel table is just empty
170 return NULL;
171 }
172
222ed1d6 173 wxAccelList::compatibility_iterator node = M_ACCELDATA->m_accels.GetFirst();
b90c32b4
VZ
174 while ( node )
175 {
176 const wxAcceleratorEntry *entry = node->GetData();
177
178 // is the key the same?
179 if ( event.m_keyCode == entry->GetKeyCode() )
180 {
181 int flags = entry->GetFlags();
182
183 // now check flags
184 if ( (((flags & wxACCEL_CTRL) != 0) == event.ControlDown()) &&
185 (((flags & wxACCEL_SHIFT) != 0) == event.ShiftDown()) &&
cea43339 186 (((flags & wxACCEL_ALT) != 0) == event.AltDown()) )
b90c32b4
VZ
187 {
188 return entry;
189 }
190 }
191
192 node = node->GetNext();
193 }
194
195 return NULL;
196}
197
198wxMenuItem *wxAcceleratorTable::GetMenuItem(const wxKeyEvent& event) const
199{
200 const wxAcceleratorEntry *entry = GetEntry(event);
201
202 return entry ? entry->GetMenuItem() : NULL;
203}
204
205int wxAcceleratorTable::GetCommand(const wxKeyEvent& event) const
206{
207 const wxAcceleratorEntry *entry = GetEntry(event);
208
209 return entry ? entry->GetCommand() : -1;
210}
211
fa03793d
VS
212wxObjectRefData *wxAcceleratorTable::CreateRefData() const
213{
214 return new wxAccelRefData;
215}
216
217wxObjectRefData *wxAcceleratorTable::CloneRefData(const wxObjectRefData *data) const
218{
219 return new wxAccelRefData(*(wxAccelRefData *)data);
220}
221
b90c32b4
VZ
222#endif // wxUSE_ACCEL
223