]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/checklst.cpp
X11-specific code doesn't work so well on wxCocoa
[wxWidgets.git] / src / msw / checklst.cpp
index 42ffa063a1097cf193fbbe4fbe667cc7611eea54..2a7e01108ecfb17e593f35a32ef3cfbca1b7ca6f 100644 (file)
@@ -6,7 +6,7 @@
 // Created:     16.11.97
 // RCS-ID:      $Id$
 // Copyright:   (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
-// Licence:     wxWindows license
+// Licence:     wxWindows licence
 ///////////////////////////////////////////////////////////////////////////////
 
 // ============================================================================
@@ -81,15 +81,20 @@ public:
   // drawing functions
   virtual bool OnDrawItem(wxDC& dc, const wxRect& rc, wxODAction act, wxODStatus stat);
 
-  // simple accessors
-  bool IsChecked() const  { return m_bChecked;        }
+  // simple accessors and operations
+  bool IsChecked() const { return m_bChecked; }
+
   void Check(bool bCheck);
   void Toggle() { Check(!IsChecked()); }
 
+  void SendEvent();
+
 private:
+
+    DECLARE_NO_COPY_CLASS(wxCheckListBoxItem)
   bool            m_bChecked;
   wxCheckListBox *m_pParent;
-  size_t            m_nIndex;
+  size_t          m_nIndex;
 };
 
 wxCheckListBoxItem::wxCheckListBoxItem(wxCheckListBox *pParent, size_t nIndex)
@@ -220,7 +225,7 @@ void wxCheckListBoxItem::Check(bool check)
 {
     m_bChecked = check;
 
-    // index may be chanegd because new items were added/deleted
+    // index may be changed because new items were added/deleted
     if ( m_pParent->GetItemIndex(this) != (int)m_nIndex )
     {
         // update it
@@ -253,7 +258,11 @@ void wxCheckListBoxItem::Check(bool check)
     #endif  // Win32/16
 
     InvalidateRect(hwndListbox, &rcUpdate, FALSE);
+}
 
+// send an "item checked" event
+void wxCheckListBoxItem::SendEvent()
+{
     wxCommandEvent event(wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, m_pParent->GetId());
     event.SetInt(m_nIndex);
     event.SetEventObject(m_pParent);
@@ -298,8 +307,9 @@ bool wxCheckListBox::Create(wxWindow *parent, wxWindowID id,
     return wxListBox::Create(parent, id, pos, size, n, choices,
                              style | wxLB_OWNERDRAW, validator, name);
 }
-                            
 
+// misc overloaded methods
+// -----------------------
 
 void wxCheckListBox::Delete(int N)
 {
@@ -385,7 +395,7 @@ void wxCheckListBox::OnKeyDown(wxKeyEvent& event)
         Clear
     } oper;
 
-    switch ( event.KeyCode() )
+    switch ( event.GetKeyCode() )
     {
         case WXK_SPACE:
             oper = Toggle;
@@ -408,15 +418,19 @@ void wxCheckListBox::OnKeyDown(wxKeyEvent& event)
     if ( oper != None )
     {
         wxArrayInt selections;
-        int count;
+        int count = 0;
         if ( HasMultipleSelection() )
         {
             count = GetSelections(selections);
         }
         else
         {
-            count = 1;
-            selections.Add(GetSelection());
+            int sel = GetSelection();
+            if (sel != -1)
+            {
+                count = 1;
+                selections.Add(sel);
+            }
         }
 
         for ( int i = 0; i < count; i++ )
@@ -442,6 +456,10 @@ void wxCheckListBox::OnKeyDown(wxKeyEvent& event)
                 default:
                     wxFAIL_MSG( _T("what should this key do?") );
             }
+
+            // we should send an event as this has been done by the user and
+            // not by the program
+            item->SendEvent();
         }
     }
     else // nothing to do
@@ -456,8 +474,11 @@ void wxCheckListBox::OnLeftClick(wxMouseEvent& event)
   if ( event.GetX() <= wxOwnerDrawn::GetDefaultMarginWidth() ) {
     int nItem = HitTest(event.GetX(), event.GetY());
 
-    if ( nItem != wxNOT_FOUND )
-      GetItem(nItem)->Toggle();
+    if ( nItem != wxNOT_FOUND ) {
+      wxCheckListBoxItem *item = GetItem(nItem);
+      item->Toggle();
+      item->SendEvent();
+    }
     //else: it's not an error, just click outside of client zone
   }
   else {