]> git.saurik.com Git - wxWidgets.git/blob - src/generic/accel.cpp
reduce black background flicker a bit - there is still some left sometimes initially...
[wxWidgets.git] / src / generic / accel.cpp
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 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
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:
56 wxAccelRefData()
57 {
58 }
59
60 wxAccelRefData(const wxAccelRefData& data)
61 : wxObjectRefData()
62 {
63 m_accels = data.m_accels;
64 }
65
66 virtual ~wxAccelRefData()
67 {
68 WX_CLEAR_LIST(wxAccelList, m_accels);
69 }
70
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
77
78 // ============================================================================
79 // implementation
80 // ============================================================================
81
82 // ----------------------------------------------------------------------------
83 // wxAcceleratorTable ctors
84 // ----------------------------------------------------------------------------
85
86 IMPLEMENT_DYNAMIC_CLASS(wxAcceleratorTable, wxObject)
87
88 wxAcceleratorTable::wxAcceleratorTable()
89 {
90 }
91
92 wxAcceleratorTable::wxAcceleratorTable(int n, const wxAcceleratorEntry entries[])
93 {
94 m_refData = new wxAccelRefData;
95
96 for ( int i = 0; i < n; i++ )
97 {
98 const wxAcceleratorEntry& entry = entries[i];
99
100 int keycode = wxToupper(entry.GetKeyCode());
101
102 M_ACCELDATA->m_accels.Append(new wxAcceleratorEntry(entry.GetFlags(),
103 keycode,
104 entry.GetCommand()));
105 }
106 }
107
108 wxAcceleratorTable::~wxAcceleratorTable()
109 {
110 }
111
112 bool wxAcceleratorTable::Ok() const
113 {
114 return m_refData != NULL;
115 }
116
117 // ----------------------------------------------------------------------------
118 // wxAcceleratorTable updating
119 // ----------------------------------------------------------------------------
120
121 void wxAcceleratorTable::Add(const wxAcceleratorEntry& entry)
122 {
123 AllocExclusive();
124
125 if ( !m_refData )
126 {
127 m_refData = new wxAccelRefData;
128 }
129
130 M_ACCELDATA->m_accels.Append(new wxAcceleratorEntry(entry));
131 }
132
133 void wxAcceleratorTable::Remove(const wxAcceleratorEntry& entry)
134 {
135 AllocExclusive();
136
137 wxAccelList::compatibility_iterator node = M_ACCELDATA->m_accels.GetFirst();
138 while ( node )
139 {
140 const wxAcceleratorEntry *entryCur = node->GetData();
141
142 if ( *entryCur == entry )
143 {
144 delete node->GetData();
145 M_ACCELDATA->m_accels.Erase(node);
146
147 return;
148 }
149
150 node = node->GetNext();
151 }
152
153 wxFAIL_MSG(_T("deleting inexistent accel from wxAcceleratorTable"));
154 }
155
156 // ----------------------------------------------------------------------------
157 // wxAcceleratorTable: find a command for the given key press
158 // ----------------------------------------------------------------------------
159
160 const wxAcceleratorEntry *
161 wxAcceleratorTable::GetEntry(const wxKeyEvent& event) const
162 {
163 if ( !Ok() )
164 {
165 // not an error, the accel table is just empty
166 return NULL;
167 }
168
169 wxAccelList::compatibility_iterator node = M_ACCELDATA->m_accels.GetFirst();
170 while ( node )
171 {
172 const wxAcceleratorEntry *entry = node->GetData();
173
174 // is the key the same?
175 if ( event.m_keyCode == entry->GetKeyCode() )
176 {
177 int flags = entry->GetFlags();
178
179 // now check flags
180 if ( (((flags & wxACCEL_CTRL) != 0) == event.ControlDown()) &&
181 (((flags & wxACCEL_SHIFT) != 0) == event.ShiftDown()) &&
182 (((flags & wxACCEL_ALT) != 0) == event.AltDown()) )
183 {
184 return entry;
185 }
186 }
187
188 node = node->GetNext();
189 }
190
191 return NULL;
192 }
193
194 wxMenuItem *wxAcceleratorTable::GetMenuItem(const wxKeyEvent& event) const
195 {
196 const wxAcceleratorEntry *entry = GetEntry(event);
197
198 return entry ? entry->GetMenuItem() : NULL;
199 }
200
201 int wxAcceleratorTable::GetCommand(const wxKeyEvent& event) const
202 {
203 const wxAcceleratorEntry *entry = GetEntry(event);
204
205 return entry ? entry->GetCommand() : -1;
206 }
207
208 wxObjectRefData *wxAcceleratorTable::CreateRefData() const
209 {
210 return new wxAccelRefData;
211 }
212
213 wxObjectRefData *wxAcceleratorTable::CloneRefData(const wxObjectRefData *data) const
214 {
215 return new wxAccelRefData(*(wxAccelRefData *)data);
216 }
217
218 #endif // wxUSE_ACCEL
219