]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/vlbox.cpp
fix the wrong #ifdef WXWIN_COMPATIBILITY_2_8 checks, #if should be used (#9644)
[wxWidgets.git] / src / generic / vlbox.cpp
index d9d03f063f23418679d86c1dc78600b3eda8d09a..f94031bca57ebfd874e64defa6c9696efa028f29 100644 (file)
@@ -77,6 +77,11 @@ bool wxVListBox::Create(wxWindow *parent,
                         long style,
                         const wxString& name)
 {
+#ifdef __WXMSW__
+    if ( (style & wxBORDER_MASK) == wxDEFAULT )
+        style |= wxBORDER_THEME;
+#endif
+
     style |= wxWANTS_CHARS | wxFULL_REPAINT_ON_RESIZE;
     if ( !wxVScrolledWindow::Create(parent, id, pos, size, style, name) )
         return false;
@@ -105,6 +110,10 @@ wxVListBox::~wxVListBox()
 
 void wxVListBox::SetItemCount(size_t count)
 {
+    // don't leave the current index invalid
+    if ( m_current != wxNOT_FOUND && (size_t)m_current >= count )
+        m_current = count - 1; // also ok when count == 0 as wxNOT_FOUND == -1
+
     if ( m_selStore )
     {
         // tell the selection store that our number of items has changed
@@ -350,29 +359,40 @@ void wxVListBox::OnDrawSeparator(wxDC& WXUNUSED(dc),
 {
 }
 
-void wxVListBox::OnDrawBackground(wxDC& dc, const wxRect& rect, size_t n) const
+bool
+wxVListBox::DoDrawSolidBackground(const wxColour& col,
+                                  wxDC& dc,
+                                  const wxRect& rect,
+                                  size_t n) const
 {
-    if ( m_colBgSel.IsOk() )
+    if ( !col.IsOk() )
+        return false;
+
+    // we need to render selected and current items differently
+    const bool isSelected = IsSelected(n),
+               isCurrent = IsCurrent(n);
+    if ( isSelected || isCurrent )
     {
-        // we need to render selected and current items differently
-        const bool isSelected = IsSelected(n),
-                   isCurrent = IsCurrent(n);
-        if ( isSelected || isCurrent )
+        if ( isSelected )
         {
-            if ( isSelected )
-            {
-                dc.SetBrush(wxBrush(m_colBgSel, wxSOLID));
-            }
-            else // !selected
-            {
-                dc.SetBrush(*wxTRANSPARENT_BRUSH);
-            }
-            dc.SetPen(*(isCurrent ? wxBLACK_PEN : wxTRANSPARENT_PEN));
-            dc.DrawRectangle(rect);
+            dc.SetBrush(wxBrush(col, wxBRUSHSTYLE_SOLID));
         }
-        //else: do nothing for the normal items
+        else // !selected
+        {
+            dc.SetBrush(*wxTRANSPARENT_BRUSH);
+        }
+        dc.SetPen(*(isCurrent ? wxBLACK_PEN : wxTRANSPARENT_PEN));
+        dc.DrawRectangle(rect);
     }
-    else // use wxRendererNative for a more native look&feel:
+    //else: do nothing for the normal items
+
+    return true;
+}
+
+void wxVListBox::OnDrawBackground(wxDC& dc, const wxRect& rect, size_t n) const
+{
+    // use wxRendererNative for more native look unless we use custom bg colour
+    if ( !DoDrawSolidBackground(m_colBgSel, dc, rect, n) )
     {
         int flags = 0;
         if ( IsSelected(n) )
@@ -597,13 +617,7 @@ void wxVListBox::OnKeyDown(wxKeyEvent& event)
         case WXK_TAB:
             // Since we are using wxWANTS_CHARS we need to send navigation
             // events for the tabs on MSW
-            {
-                wxNavigationKeyEvent ne;
-                ne.SetDirection(!event.ShiftDown());
-                ne.SetCurrentFocus(this);
-                ne.SetEventObject(this);
-                GetParent()->GetEventHandler()->ProcessEvent(ne);
-            }
+            HandleAsNavigationKey(event);
             // fall through to default
 #endif
         default:
@@ -629,7 +643,7 @@ void wxVListBox::OnLeftDown(wxMouseEvent& event)
 {
     SetFocus();
 
-    int item = HitTest(event.GetPosition());
+    int item = VirtualHitTest(event.GetPosition().y);
 
     if ( item != wxNOT_FOUND )
     {
@@ -652,7 +666,7 @@ void wxVListBox::OnLeftDown(wxMouseEvent& event)
 
 void wxVListBox::OnLeftDClick(wxMouseEvent& eventMouse)
 {
-    int item = HitTest(eventMouse.GetPosition());
+    int item = VirtualHitTest(eventMouse.GetPosition().y);
     if ( item != wxNOT_FOUND )
     {