]> git.saurik.com Git - wxWidgets.git/blobdiff - src/univ/listbox.cpp
Fix wxListCtrl background colour bug Part I
[wxWidgets.git] / src / univ / listbox.cpp
index 37fe1fbd72fef07519e04321bd44838de2478c48..725eafa5ec721fcc211e06ef094060a8589f41a0 100644 (file)
@@ -101,7 +101,14 @@ bool wxListBox::Create(wxWindow *parent,
     if ( !(style & (wxLB_MULTIPLE | wxLB_EXTENDED)) )
         style |= wxLB_SINGLE;
 
     if ( !(style & (wxLB_MULTIPLE | wxLB_EXTENDED)) )
         style |= wxLB_SINGLE;
 
-    if ( !wxControl::Create(parent, id, pos, size, style, wxDefaultValidator, name) )
+#if wxUSE_TWO_WINDOWS
+    style |=  wxVSCROLL|wxHSCROLL;
+    if ((style & wxBORDER_MASK) == 0)
+        style |= wxBORDER_SUNKEN;
+#endif
+
+    if ( !wxControl::Create(parent, id, pos, size, style, 
+                            wxDefaultValidator, name) )
         return FALSE;
 
     SetWindow(this);
         return FALSE;
 
     SetWindow(this);
@@ -805,11 +812,6 @@ wxSize wxListBox::DoGetBestClientSize() const
 
 bool wxListBox::SendEvent(wxEventType type, int item)
 {
 
 bool wxListBox::SendEvent(wxEventType type, int item)
 {
-    // don't generate select events while the mouse is captured, we will only
-    // send them once it is released
-    if ( (type == wxEVT_COMMAND_LISTBOX_SELECTED) && (GetCapture() == this) )
-        return FALSE;
-
     wxCommandEvent event(type, m_windowId);
     event.SetEventObject(this);
 
     wxCommandEvent event(type, m_windowId);
     event.SetEventObject(this);
 
@@ -1054,6 +1056,19 @@ void wxListBox::Activate(int item)
 // input handling
 // ----------------------------------------------------------------------------
 
 // input handling
 // ----------------------------------------------------------------------------
 
+/*
+   The numArg here is the listbox item index while the strArg is used
+   differently for the different actions:
+
+   a) for wxACTION_LISTBOX_FIND it has the natural meaning: this is the string
+      to find
+
+   b) for wxACTION_LISTBOX_SELECT and wxACTION_LISTBOX_EXTENDSEL it is used
+      to decide if the listbox should send the notification event (it is empty)
+      or not (it is not): this allows us to reuse the same action for when the
+      user is dragging the mouse when it has been released although in the
+      first case no notification is sent while in the second it is sent.
+ */
 bool wxListBox::PerformAction(const wxControlAction& action,
                               long numArg,
                               const wxString& strArg)
 bool wxListBox::PerformAction(const wxControlAction& action,
                               long numArg,
                               const wxString& strArg)
@@ -1061,9 +1076,13 @@ bool wxListBox::PerformAction(const wxControlAction& action,
     int item = (int)numArg;
 
     if ( action == wxACTION_LISTBOX_SETFOCUS )
     int item = (int)numArg;
 
     if ( action == wxACTION_LISTBOX_SETFOCUS )
+    {
         SetCurrentItem(item);
         SetCurrentItem(item);
+    }
     else if ( action == wxACTION_LISTBOX_ACTIVATE )
     else if ( action == wxACTION_LISTBOX_ACTIVATE )
+    {
         Activate(item);
         Activate(item);
+    }
     else if ( action == wxACTION_LISTBOX_TOGGLE )
     {
         if ( item == -1 )
     else if ( action == wxACTION_LISTBOX_TOGGLE )
     {
         if ( item == -1 )
@@ -1077,7 +1096,11 @@ bool wxListBox::PerformAction(const wxControlAction& action,
     else if ( action == wxACTION_LISTBOX_SELECT )
     {
         DeselectAll(item);
     else if ( action == wxACTION_LISTBOX_SELECT )
     {
         DeselectAll(item);
-        SelectAndNotify(item);
+
+        if ( strArg.empty() )
+            SelectAndNotify(item);
+        else
+            Select(TRUE, item);
     }
     else if ( action == wxACTION_LISTBOX_SELECTADD )
         Select(TRUE, item);
     }
     else if ( action == wxACTION_LISTBOX_SELECTADD )
         Select(TRUE, item);
@@ -1253,14 +1276,33 @@ bool wxStdListboxInputHandler::HandleKey(wxInputConsumer *consumer,
         switch ( keycode )
         {
             // movement
         switch ( keycode )
         {
             // movement
-            case WXK_UP:    action = wxACTION_LISTBOX_MOVEUP; break;
-            case WXK_DOWN:  action = wxACTION_LISTBOX_MOVEDOWN; break;
+            case WXK_UP:
+                action = wxACTION_LISTBOX_MOVEUP;
+                break;
+
+            case WXK_DOWN:
+                action = wxACTION_LISTBOX_MOVEDOWN;
+                break;
+
             case WXK_PAGEUP:
             case WXK_PAGEUP:
-            case WXK_PRIOR: action = wxACTION_LISTBOX_PAGEUP; break;
+
+            case WXK_PRIOR:
+                action = wxACTION_LISTBOX_PAGEUP;
+                break;
+
             case WXK_PAGEDOWN:
             case WXK_PAGEDOWN:
-            case WXK_NEXT:  action = wxACTION_LISTBOX_PAGEDOWN; break;
-            case WXK_HOME:  action = wxACTION_LISTBOX_START; break;
-            case WXK_END:   action = wxACTION_LISTBOX_END; break;
+
+            case WXK_NEXT:
+                action = wxACTION_LISTBOX_PAGEDOWN;
+                break;
+
+            case WXK_HOME:
+                action = wxACTION_LISTBOX_START;
+                break;
+
+            case WXK_END:
+                action = wxACTION_LISTBOX_END;
+                break;
 
             // selection
             case WXK_SPACE:
 
             // selection
             case WXK_SPACE:
@@ -1342,7 +1384,6 @@ bool wxStdListboxInputHandler::HandleMouse(wxInputConsumer *consumer,
             winCapture->ReleaseMouse();
             m_btnCapture = 0;
 
             winCapture->ReleaseMouse();
             m_btnCapture = 0;
 
-            // generate the last event to triiger sending the selection event
             action = m_actionMouse;
         }
         //else: the mouse wasn't presed over the listbox, only released here
             action = m_actionMouse;
         }
         //else: the mouse wasn't presed over the listbox, only released here
@@ -1392,7 +1433,9 @@ bool wxStdListboxInputHandler::HandleMouseMove(wxInputConsumer *consumer,
 
         if ( IsValidIndex(lbox, item) )
         {
 
         if ( IsValidIndex(lbox, item) )
         {
-            lbox->PerformAction(m_actionMouse, item);
+            // pass something into strArg to tell the listbox that it shouldn't
+            // send the notification message: see PerformAction() above
+            lbox->PerformAction(m_actionMouse, item, _T("no"));
         }
         // else: don't pass invalid index to the listbox
     }
         }
         // else: don't pass invalid index to the listbox
     }