]>
Commit | Line | Data |
---|---|---|
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 | |
8 | // Licence: wxWindows licence | |
9 | /////////////////////////////////////////////////////////////////////////////// | |
10 | ||
11 | // ============================================================================ | |
12 | // declarations | |
13 | // ============================================================================ | |
14 | ||
15 | // ---------------------------------------------------------------------------- | |
16 | // headers | |
17 | // ---------------------------------------------------------------------------- | |
18 | ||
19 | #ifdef __GNUG__ | |
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 | ||
45 | WX_DECLARE_LIST(wxAcceleratorEntry, wxAccelList); | |
46 | #include "wx/listimpl.cpp" | |
47 | WX_DEFINE_LIST(wxAccelList); | |
48 | ||
49 | // ---------------------------------------------------------------------------- | |
50 | // wxAccelRefData: the data used by wxAcceleratorTable | |
51 | // ---------------------------------------------------------------------------- | |
52 | ||
53 | class wxAccelRefData : public wxObjectRefData | |
54 | { | |
55 | public: | |
fa03793d VS |
56 | wxAccelRefData() |
57 | { | |
58 | m_accels.DeleteContents(TRUE); | |
59 | } | |
60 | ||
61 | wxAccelRefData(const wxAccelRefData& data) | |
d84afea9 | 62 | : wxObjectRefData() |
fa03793d VS |
63 | { |
64 | m_accels.DeleteContents(TRUE); | |
65 | m_accels = data.m_accels; | |
66 | } | |
b90c32b4 VZ |
67 | |
68 | wxAccelList m_accels; | |
69 | }; | |
70 | ||
71 | // macro which can be used to access wxAccelRefData from wxAcceleratorTable | |
72 | #define M_ACCELDATA ((wxAccelRefData *)m_refData) | |
73 | ||
fa03793d | 74 | |
b90c32b4 VZ |
75 | // ============================================================================ |
76 | // implementation | |
77 | // ============================================================================ | |
78 | ||
79 | // ---------------------------------------------------------------------------- | |
80 | // wxAcceleratorTable ctors | |
81 | // ---------------------------------------------------------------------------- | |
82 | ||
83 | IMPLEMENT_DYNAMIC_CLASS(wxAcceleratorTable, wxObject) | |
84 | ||
85 | wxAcceleratorTable::wxAcceleratorTable() | |
86 | { | |
87 | } | |
88 | ||
3c674514 | 89 | wxAcceleratorTable::wxAcceleratorTable(int n, const wxAcceleratorEntry entries[]) |
b90c32b4 VZ |
90 | { |
91 | m_refData = new wxAccelRefData; | |
92 | ||
93 | for ( int i = 0; i < n; i++ ) | |
94 | { | |
95 | const wxAcceleratorEntry& entry = entries[i]; | |
96 | ||
97 | int keycode = entry.GetKeyCode(); | |
98 | if ( wxIslower(keycode) ) | |
99 | keycode = wxToupper(keycode); | |
100 | ||
101 | M_ACCELDATA->m_accels.Append(new wxAcceleratorEntry(entry.GetFlags(), | |
102 | keycode, | |
103 | entry.GetCommand())); | |
104 | } | |
105 | } | |
106 | ||
107 | wxAcceleratorTable::~wxAcceleratorTable() | |
108 | { | |
109 | } | |
110 | ||
111 | bool wxAcceleratorTable::Ok() const | |
112 | { | |
113 | return m_refData != NULL; | |
114 | } | |
115 | ||
116 | // ---------------------------------------------------------------------------- | |
117 | // wxAcceleratorTable updating | |
118 | // ---------------------------------------------------------------------------- | |
119 | ||
120 | void wxAcceleratorTable::Add(const wxAcceleratorEntry& entry) | |
121 | { | |
fa03793d VS |
122 | AllocExclusive(); |
123 | ||
b90c32b4 VZ |
124 | if ( !m_refData ) |
125 | { | |
126 | m_refData = new wxAccelRefData; | |
127 | } | |
128 | ||
129 | M_ACCELDATA->m_accels.Append(new wxAcceleratorEntry(entry)); | |
130 | } | |
131 | ||
132 | void wxAcceleratorTable::Remove(const wxAcceleratorEntry& entry) | |
133 | { | |
fa03793d VS |
134 | AllocExclusive(); |
135 | ||
b90c32b4 VZ |
136 | wxAccelList::Node *node = M_ACCELDATA->m_accels.GetFirst(); |
137 | while ( node ) | |
138 | { | |
139 | const wxAcceleratorEntry *entryCur = node->GetData(); | |
140 | ||
141 | if ( *entryCur == entry ) | |
142 | { | |
143 | M_ACCELDATA->m_accels.DeleteNode(node); | |
144 | ||
145 | return; | |
146 | } | |
147 | ||
148 | node = node->GetNext(); | |
149 | } | |
150 | ||
151 | wxFAIL_MSG(_T("deleting inexistent accel from wxAcceleratorTable")); | |
152 | } | |
153 | ||
154 | // ---------------------------------------------------------------------------- | |
155 | // wxAcceleratorTable: find a command for the given key press | |
156 | // ---------------------------------------------------------------------------- | |
157 | ||
158 | const wxAcceleratorEntry * | |
159 | wxAcceleratorTable::GetEntry(const wxKeyEvent& event) const | |
160 | { | |
161 | if ( !Ok() ) | |
162 | { | |
163 | // not an error, the accel table is just empty | |
164 | return NULL; | |
165 | } | |
166 | ||
167 | wxAccelList::Node *node = M_ACCELDATA->m_accels.GetFirst(); | |
168 | while ( node ) | |
169 | { | |
170 | const wxAcceleratorEntry *entry = node->GetData(); | |
171 | ||
172 | // is the key the same? | |
173 | if ( event.m_keyCode == entry->GetKeyCode() ) | |
174 | { | |
175 | int flags = entry->GetFlags(); | |
176 | ||
177 | // now check flags | |
178 | if ( (((flags & wxACCEL_CTRL) != 0) == event.ControlDown()) && | |
179 | (((flags & wxACCEL_SHIFT) != 0) == event.ShiftDown()) && | |
180 | (((flags & wxACCEL_ALT) != 0) == | |
181 | (event.AltDown() || event.MetaDown())) ) | |
182 | { | |
183 | return entry; | |
184 | } | |
185 | } | |
186 | ||
187 | node = node->GetNext(); | |
188 | } | |
189 | ||
190 | return NULL; | |
191 | } | |
192 | ||
193 | wxMenuItem *wxAcceleratorTable::GetMenuItem(const wxKeyEvent& event) const | |
194 | { | |
195 | const wxAcceleratorEntry *entry = GetEntry(event); | |
196 | ||
197 | return entry ? entry->GetMenuItem() : NULL; | |
198 | } | |
199 | ||
200 | int wxAcceleratorTable::GetCommand(const wxKeyEvent& event) const | |
201 | { | |
202 | const wxAcceleratorEntry *entry = GetEntry(event); | |
203 | ||
204 | return entry ? entry->GetCommand() : -1; | |
205 | } | |
206 | ||
fa03793d VS |
207 | wxObjectRefData *wxAcceleratorTable::CreateRefData() const |
208 | { | |
209 | return new wxAccelRefData; | |
210 | } | |
211 | ||
212 | wxObjectRefData *wxAcceleratorTable::CloneRefData(const wxObjectRefData *data) const | |
213 | { | |
214 | return new wxAccelRefData(*(wxAccelRefData *)data); | |
215 | } | |
216 | ||
b90c32b4 VZ |
217 | #endif // wxUSE_ACCEL |
218 |