]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/mac/carbon/accel.cpp
making implementation independent of a wx-peer of that control
[wxWidgets.git] / src / mac / carbon / accel.cpp
... / ...
CommitLineData
1/////////////////////////////////////////////////////////////////////////////
2// Name: accel.cpp
3// Purpose: wxAcceleratorTable
4// Author: Stefan Csomor
5// Modified by:
6// Created: 1998-01-01
7// RCS-ID: $Id$
8// Copyright: (c) Stefan Csomor
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
13#pragma implementation "accel.h"
14#endif
15
16#include "wx/wxprec.h"
17
18#include "wx/accel.h"
19#include "wx/string.h"
20
21#if !USE_SHARED_LIBRARIES
22IMPLEMENT_DYNAMIC_CLASS(wxAcceleratorTable, wxObject)
23#endif
24
25// ----------------------------------------------------------------------------
26// wxAccelList: a list of wxAcceleratorEntries
27// ----------------------------------------------------------------------------
28
29WX_DECLARE_LIST(wxAcceleratorEntry, wxAccelList);
30#include "wx/listimpl.cpp"
31WX_DEFINE_LIST(wxAccelList);
32
33// ----------------------------------------------------------------------------
34// wxAccelRefData: the data used by wxAcceleratorTable
35// ----------------------------------------------------------------------------
36
37class WXDLLEXPORT wxAcceleratorRefData: public wxObjectRefData
38{
39 friend class WXDLLEXPORT wxAcceleratorTable;
40public:
41 wxAcceleratorRefData();
42 ~wxAcceleratorRefData();
43
44 wxAccelList m_accels;
45};
46
47#define M_ACCELDATA ((wxAcceleratorRefData *)m_refData)
48
49wxAcceleratorRefData::wxAcceleratorRefData()
50 : m_accels()
51{
52}
53
54wxAcceleratorRefData::~wxAcceleratorRefData()
55{
56 WX_CLEAR_LIST( wxAccelList, m_accels );
57}
58
59wxAcceleratorTable::wxAcceleratorTable()
60{
61 m_refData = NULL;
62}
63
64wxAcceleratorTable::~wxAcceleratorTable()
65{
66}
67
68// Create from an array
69wxAcceleratorTable::wxAcceleratorTable(int n, const wxAcceleratorEntry entries[])
70{
71 m_refData = new wxAcceleratorRefData;
72
73 for (int i = 0; i < n; i++)
74 {
75 int flag = entries[i].GetFlags();
76 int keycode = entries[i].GetKeyCode();
77 int command = entries[i].GetCommand();
78 if ((keycode >= (int)'a') && (keycode <= (int)'z')) keycode = (int)toupper( (char)keycode );
79 M_ACCELDATA->m_accels.Append( new wxAcceleratorEntry( flag, keycode, command ) );
80 }
81}
82
83bool wxAcceleratorTable::Ok() const
84{
85 return (m_refData != NULL);
86}
87
88int wxAcceleratorTable::GetCommand( wxKeyEvent &event )
89{
90 if (!Ok()) return -1;
91
92 wxAccelList::compatibility_iterator node = M_ACCELDATA->m_accels.GetFirst();
93 while (node)
94 {
95 wxAcceleratorEntry *entry = node->GetData();
96 if ((event.m_keyCode == entry->GetKeyCode()) &&
97 (((entry->GetFlags() & wxACCEL_CTRL) == 0) || event.ControlDown()) &&
98 (((entry->GetFlags() & wxACCEL_SHIFT) == 0) || event.ShiftDown()) &&
99 (((entry->GetFlags() & wxACCEL_ALT) == 0) || event.AltDown() || event.MetaDown()))
100 {
101 return entry->GetCommand();
102 }
103 node = node->GetNext();
104 }
105
106 return -1;
107}
108
109