]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/accel.cpp
fixed problems with sometimes processing the events twice introduced in rev 1.170...
[wxWidgets.git] / src / generic / accel.cpp
index d99b55cea6e24ee55fa7bcfb1026674ed0f40c70..b9a49a85e6e18a38a383f50a292d0487531ba04b 100644 (file)
 // headers
 // ----------------------------------------------------------------------------
 
-#ifdef __GNUG__
-    #pragma implementation "accel.h"
-#endif
-
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
@@ -44,7 +40,7 @@
 
 WX_DECLARE_LIST(wxAcceleratorEntry, wxAccelList);
 #include "wx/listimpl.cpp"
-WX_DEFINE_LIST(wxAccelList);
+WX_DEFINE_LIST(wxAccelList)
 
 // ----------------------------------------------------------------------------
 // wxAccelRefData: the data used by wxAcceleratorTable
@@ -53,7 +49,20 @@ WX_DEFINE_LIST(wxAccelList);
 class wxAccelRefData : public wxObjectRefData
 {
 public:
-    wxAccelRefData() { m_accels.DeleteContents(TRUE); }
+    wxAccelRefData()
+    {
+    }
+
+    wxAccelRefData(const wxAccelRefData& data)
+        : wxObjectRefData()
+    {
+        m_accels = data.m_accels;
+    }
+
+    virtual ~wxAccelRefData()
+    {
+        WX_CLEAR_LIST(wxAccelList, m_accels);
+    }
 
     wxAccelList m_accels;
 };
@@ -61,6 +70,7 @@ public:
 // macro which can be used to access wxAccelRefData from wxAcceleratorTable
 #define M_ACCELDATA ((wxAccelRefData *)m_refData)
 
+
 // ============================================================================
 // implementation
 // ============================================================================
@@ -75,7 +85,7 @@ wxAcceleratorTable::wxAcceleratorTable()
 {
 }
 
-wxAcceleratorTable::wxAcceleratorTable(int n, wxAcceleratorEntry entries[])
+wxAcceleratorTable::wxAcceleratorTable(int n, const wxAcceleratorEntry entries[])
 {
     m_refData = new wxAccelRefData;
 
@@ -83,9 +93,7 @@ wxAcceleratorTable::wxAcceleratorTable(int n, wxAcceleratorEntry entries[])
     {
         const wxAcceleratorEntry& entry = entries[i];
 
-        int keycode = entry.GetKeyCode();
-        if ( wxIslower(keycode) )
-            keycode = wxToupper(keycode);
+        int keycode = wxToupper(entry.GetKeyCode());
 
         M_ACCELDATA->m_accels.Append(new wxAcceleratorEntry(entry.GetFlags(),
                                                             keycode,
@@ -108,6 +116,8 @@ bool wxAcceleratorTable::Ok() const
 
 void wxAcceleratorTable::Add(const wxAcceleratorEntry& entry)
 {
+    AllocExclusive();
+
     if ( !m_refData )
     {
         m_refData = new wxAccelRefData;
@@ -118,14 +128,21 @@ void wxAcceleratorTable::Add(const wxAcceleratorEntry& entry)
 
 void wxAcceleratorTable::Remove(const wxAcceleratorEntry& entry)
 {
-    wxAccelList::Node *node = M_ACCELDATA->m_accels.GetFirst();
+    AllocExclusive();
+
+    wxAccelList::compatibility_iterator node = M_ACCELDATA->m_accels.GetFirst();
     while ( node )
     {
         const wxAcceleratorEntry *entryCur = node->GetData();
 
-        if ( *entryCur == entry )
+        // given entry contains only the information of the accelerator key
+        // because it was set that way in wxGetAccelFromString()
+        // so do not perform full ( *entryCur == entry ) comparison
+        if ((entryCur->GetKeyCode() == entry.GetKeyCode()) &&
+            (entryCur->GetFlags() == entry.GetFlags()))
         {
-            M_ACCELDATA->m_accels.DeleteNode(node);
+            delete node->GetData();
+            M_ACCELDATA->m_accels.Erase(node);
 
             return;
         }
@@ -149,7 +166,7 @@ wxAcceleratorTable::GetEntry(const wxKeyEvent& event) const
         return NULL;
     }
 
-    wxAccelList::Node *node = M_ACCELDATA->m_accels.GetFirst();
+    wxAccelList::compatibility_iterator node = M_ACCELDATA->m_accels.GetFirst();
     while ( node )
     {
         const wxAcceleratorEntry *entry = node->GetData();
@@ -162,8 +179,7 @@ wxAcceleratorTable::GetEntry(const wxKeyEvent& event) const
             // now check flags
             if ( (((flags & wxACCEL_CTRL) != 0) == event.ControlDown()) &&
                  (((flags & wxACCEL_SHIFT) != 0) == event.ShiftDown()) &&
-                 (((flags & wxACCEL_ALT) != 0) ==
-                    (event.AltDown() || event.MetaDown())) )
+                 (((flags & wxACCEL_ALT) != 0) == event.AltDown()) )
             {
                 return entry;
             }
@@ -189,5 +205,15 @@ int wxAcceleratorTable::GetCommand(const wxKeyEvent& event) const
     return entry ? entry->GetCommand() : -1;
 }
 
+wxObjectRefData *wxAcceleratorTable::CreateRefData() const
+{
+    return new wxAccelRefData;
+}
+
+wxObjectRefData *wxAcceleratorTable::CloneRefData(const wxObjectRefData *data) const
+{
+    return new wxAccelRefData(*(wxAccelRefData *)data);
+}
+
 #endif // wxUSE_ACCEL