]> git.saurik.com Git - wxWidgets.git/blame - src/generic/accel.cpp
added missing wxListItem copy ctor to wxMSW, moved wxListItem to the header
[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
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
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 {
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
83IMPLEMENT_DYNAMIC_CLASS(wxAcceleratorTable, wxObject)
84
85wxAcceleratorTable::wxAcceleratorTable()
86{
87}
88
89wxAcceleratorTable::wxAcceleratorTable(int n, wxAcceleratorEntry entries[])
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
107wxAcceleratorTable::~wxAcceleratorTable()
108{
109}
110
111bool wxAcceleratorTable::Ok() const
112{
113 return m_refData != NULL;
114}
115
116// ----------------------------------------------------------------------------
117// wxAcceleratorTable updating
118// ----------------------------------------------------------------------------
119
120void 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
132void 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
158const wxAcceleratorEntry *
159wxAcceleratorTable::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
193wxMenuItem *wxAcceleratorTable::GetMenuItem(const wxKeyEvent& event) const
194{
195 const wxAcceleratorEntry *entry = GetEntry(event);
196
197 return entry ? entry->GetMenuItem() : NULL;
198}
199
200int wxAcceleratorTable::GetCommand(const wxKeyEvent& event) const
201{
202 const wxAcceleratorEntry *entry = GetEntry(event);
203
204 return entry ? entry->GetCommand() : -1;
205}
206
fa03793d
VS
207wxObjectRefData *wxAcceleratorTable::CreateRefData() const
208{
209 return new wxAccelRefData;
210}
211
212wxObjectRefData *wxAcceleratorTable::CloneRefData(const wxObjectRefData *data) const
213{
214 return new wxAccelRefData(*(wxAccelRefData *)data);
215}
216
b90c32b4
VZ
217#endif // wxUSE_ACCEL
218