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 
   7 // Copyright:   (c) 1998 Robert Roebling 
   8 // Licence:     wxWindows licence 
   9 /////////////////////////////////////////////////////////////////////////////// 
  11 // ============================================================================ 
  13 // ============================================================================ 
  15 // ---------------------------------------------------------------------------- 
  17 // ---------------------------------------------------------------------------- 
  19 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) 
  20     #pragma implementation "accel.h" 
  23 // For compilers that support precompilation, includes "wx.h". 
  24 #include "wx/wxprec.h" 
  41 // ---------------------------------------------------------------------------- 
  42 // wxAccelList: a list of wxAcceleratorEntries 
  43 // ---------------------------------------------------------------------------- 
  45 WX_DECLARE_LIST(wxAcceleratorEntry
, wxAccelList
); 
  46 #include "wx/listimpl.cpp" 
  47 WX_DEFINE_LIST(wxAccelList
); 
  49 // ---------------------------------------------------------------------------- 
  50 // wxAccelRefData: the data used by wxAcceleratorTable 
  51 // ---------------------------------------------------------------------------- 
  53 class wxAccelRefData 
: public wxObjectRefData
 
  60     wxAccelRefData(const wxAccelRefData
& data
) 
  63         m_accels 
= data
.m_accels
; 
  66     virtual ~wxAccelRefData() 
  68         WX_CLEAR_LIST(wxAccelList
, m_accels
); 
  74 // macro which can be used to access wxAccelRefData from wxAcceleratorTable 
  75 #define M_ACCELDATA ((wxAccelRefData *)m_refData) 
  78 // ============================================================================ 
  80 // ============================================================================ 
  82 // ---------------------------------------------------------------------------- 
  83 // wxAcceleratorTable ctors 
  84 // ---------------------------------------------------------------------------- 
  86 IMPLEMENT_DYNAMIC_CLASS(wxAcceleratorTable
, wxObject
) 
  88 wxAcceleratorTable::wxAcceleratorTable() 
  92 wxAcceleratorTable::wxAcceleratorTable(int n
, const wxAcceleratorEntry entries
[]) 
  94     m_refData 
= new wxAccelRefData
; 
  96     for ( int i 
= 0; i 
< n
; i
++ ) 
  98         const wxAcceleratorEntry
& entry 
= entries
[i
]; 
 100         int keycode 
= entry
.GetKeyCode(); 
 101         if ( wxIslower(keycode
) ) 
 102             keycode 
= wxToupper(keycode
); 
 104         M_ACCELDATA
->m_accels
.Append(new wxAcceleratorEntry(entry
.GetFlags(), 
 106                                                             entry
.GetCommand())); 
 110 wxAcceleratorTable::~wxAcceleratorTable() 
 114 bool wxAcceleratorTable::Ok() const 
 116     return m_refData 
!= NULL
; 
 119 // ---------------------------------------------------------------------------- 
 120 // wxAcceleratorTable updating 
 121 // ---------------------------------------------------------------------------- 
 123 void wxAcceleratorTable::Add(const wxAcceleratorEntry
& entry
) 
 129         m_refData 
= new wxAccelRefData
; 
 132     M_ACCELDATA
->m_accels
.Append(new wxAcceleratorEntry(entry
)); 
 135 void wxAcceleratorTable::Remove(const wxAcceleratorEntry
& entry
) 
 139     wxAccelList::compatibility_iterator node 
= M_ACCELDATA
->m_accels
.GetFirst(); 
 142         const wxAcceleratorEntry 
*entryCur 
= node
->GetData(); 
 144         if ( *entryCur 
== entry 
) 
 146             delete node
->GetData(); 
 147             M_ACCELDATA
->m_accels
.Erase(node
); 
 152         node 
= node
->GetNext(); 
 155     wxFAIL_MSG(_T("deleting inexistent accel from wxAcceleratorTable")); 
 158 // ---------------------------------------------------------------------------- 
 159 // wxAcceleratorTable: find a command for the given key press 
 160 // ---------------------------------------------------------------------------- 
 162 const wxAcceleratorEntry 
* 
 163 wxAcceleratorTable::GetEntry(const wxKeyEvent
& event
) const 
 167         // not an error, the accel table is just empty 
 171     wxAccelList::compatibility_iterator node 
= M_ACCELDATA
->m_accels
.GetFirst(); 
 174         const wxAcceleratorEntry 
*entry 
= node
->GetData(); 
 176         // is the key the same? 
 177         if ( event
.m_keyCode 
== entry
->GetKeyCode() ) 
 179             int flags 
= entry
->GetFlags(); 
 182             if ( (((flags 
& wxACCEL_CTRL
) != 0) == event
.ControlDown()) && 
 183                  (((flags 
& wxACCEL_SHIFT
) != 0) == event
.ShiftDown()) && 
 184                  (((flags 
& wxACCEL_ALT
) != 0) == 
 185                     (event
.AltDown() || event
.MetaDown())) ) 
 191         node 
= node
->GetNext(); 
 197 wxMenuItem 
*wxAcceleratorTable::GetMenuItem(const wxKeyEvent
& event
) const 
 199     const wxAcceleratorEntry 
*entry 
= GetEntry(event
); 
 201     return entry 
? entry
->GetMenuItem() : NULL
; 
 204 int wxAcceleratorTable::GetCommand(const wxKeyEvent
& event
) const 
 206     const wxAcceleratorEntry 
*entry 
= GetEntry(event
); 
 208     return entry 
? entry
->GetCommand() : -1; 
 211 wxObjectRefData 
*wxAcceleratorTable::CreateRefData() const 
 213     return new wxAccelRefData
; 
 216 wxObjectRefData 
*wxAcceleratorTable::CloneRefData(const wxObjectRefData 
*data
) const 
 218     return new wxAccelRefData(*(wxAccelRefData 
*)data
); 
 221 #endif // wxUSE_ACCEL