]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/vlbox.cpp
destroying native and wx controls
[wxWidgets.git] / src / generic / vlbox.cpp
index 86501ead577034d4827e9063200a250793c4b7ef..89438eaae9e23a17c6b79efe7c0411ee3bb5bae9 100644 (file)
@@ -24,6 +24,8 @@
     #pragma hdrstop
 #endif
 
+#if wxUSE_LISTBOX
+
 #ifndef WX_PRECOMP
     #include "wx/settings.h"
     #include "wx/dcclient.h"
@@ -48,6 +50,8 @@ END_EVENT_TABLE()
 // implementation
 // ============================================================================
 
+IMPLEMENT_ABSTRACT_CLASS(wxVListBox, wxVScrolledWindow)
+
 // ----------------------------------------------------------------------------
 // wxVListBox creation
 // ----------------------------------------------------------------------------
@@ -66,13 +70,16 @@ bool wxVListBox::Create(wxWindow *parent,
                         long style,
                         const wxString& name)
 {
+    style |= wxWANTS_CHARS | wxFULL_REPAINT_ON_RESIZE;
     if ( !wxVScrolledWindow::Create(parent, id, pos, size, style, name) )
         return false;
 
     if ( style & wxLB_MULTIPLE )
         m_selStore = new wxSelectionStore;
 
-    SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_LISTBOX));
+    // make sure the native widget has the right colour since we do
+    // transparent drawing by default
+    SetBackgroundColour(GetBackgroundColour());
     m_colBgSel = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT);
 
     return true;
@@ -238,7 +245,7 @@ void wxVListBox::SendSelectedEvent()
 
     wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, GetId());
     event.SetEventObject(this);
-    event.m_commandInt = m_current;
+    event.SetInt(m_current);
 
     (void)GetEventHandler()->ProcessEvent(event);
 }
@@ -249,8 +256,11 @@ void wxVListBox::SetSelection(int selection)
                   (selection >= 0 && (size_t)selection < GetItemCount()),
                   _T("wxVListBox::SetSelection(): invalid item index") );
 
-    wxASSERT_MSG( !HasMultipleSelection(),
-                  _T("SetSelection() is invalid with multiselection listbox") );
+    if ( HasMultipleSelection() )
+    {
+        Select(selection);
+        m_anchor = selection;
+    }
 
     DoSetCurrent(selection);
 }
@@ -316,7 +326,30 @@ void wxVListBox::OnDrawSeparator(wxDC& WXUNUSED(dc),
 {
 }
 
-void wxVListBox::OnPaint(wxPaintEvent& event)
+void wxVListBox::OnDrawBackground(wxDC& dc, const wxRect& rect, size_t n) const
+{
+    // we need to render selected and current items differently
+    const bool isSelected = IsSelected(n),
+               isCurrent = IsCurrent(n);
+    if ( isSelected || isCurrent )
+    {
+        if ( isSelected )
+        {
+            dc.SetBrush(wxBrush(m_colBgSel, wxSOLID));
+        }
+        else // !selected
+        {
+            dc.SetBrush(*wxTRANSPARENT_BRUSH);
+        }
+
+        dc.SetPen(*(isCurrent ? wxBLACK_PEN : wxTRANSPARENT_PEN));
+
+        dc.DrawRectangle(rect);
+    }
+    //else: do nothing for the normal items
+}
+
+void wxVListBox::OnPaint(wxPaintEvent& WXUNUSED(event))
 {
     wxPaintDC dc(this);
 
@@ -341,25 +374,9 @@ void wxVListBox::OnPaint(wxPaintEvent& event)
             // don't allow drawing outside of the lines rectangle
             wxDCClipper clip(dc, rectLine);
 
-            // we need to render selected and current items differently
-            const bool isSelected = IsSelected(line);
-            if ( isSelected || IsCurrent(line) )
-            {
-                if ( isSelected )
-                {
-                    dc.SetBrush(wxBrush(m_colBgSel, wxSOLID));
-                }
-                else // !selected
-                {
-                    dc.SetBrush(*wxTRANSPARENT_BRUSH);
-                }
-
-                dc.SetPen(*(IsCurrent(line) ? wxBLACK_PEN : wxTRANSPARENT_PEN));
-
-                dc.DrawRectangle(rectLine);
-            }
-
             wxRect rect = rectLine;
+            OnDrawBackground(dc, rect, line);
+
             OnDrawSeparator(dc, rect, line);
 
             rect.Deflate(m_ptMargins.x, m_ptMargins.y);
@@ -474,7 +491,7 @@ void wxVListBox::OnKeyDown(wxKeyEvent& event)
     // flags for DoHandleItemClick()
     int flags = ItemClick_Kbd;
 
-    int current = 0; // just to silent the stupid compiler warnings
+    int current;
     switch ( event.GetKeyCode() )
     {
         case WXK_HOME:
@@ -525,8 +542,23 @@ void wxVListBox::OnKeyDown(wxKeyEvent& event)
             current = m_current;
             break;
 
+#ifdef __WXMSW__
+        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);
+            }
+            // fall through to default
+#endif
         default:
             event.Skip();
+            current = 0; // just to silent the stupid compiler warnings
+            wxUnusedVar(current);
             return;
     }
 
@@ -544,6 +576,8 @@ void wxVListBox::OnKeyDown(wxKeyEvent& event)
 
 void wxVListBox::OnLeftDown(wxMouseEvent& event)
 {
+    SetFocus();
+    
     int item = HitTest(event.GetPosition());
 
     if ( item != wxNOT_FOUND )
@@ -572,9 +606,24 @@ void wxVListBox::OnLeftDClick(wxMouseEvent& event)
     {
         wxCommandEvent event(wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, GetId());
         event.SetEventObject(this);
-        event.m_commandInt = item;
+        event.SetInt(item);
 
         (void)GetEventHandler()->ProcessEvent(event);
     }
 }
 
+
+// ----------------------------------------------------------------------------
+// use the same default attributes as wxListBox
+// ----------------------------------------------------------------------------
+
+#include "wx/listbox.h"
+
+//static
+wxVisualAttributes
+wxVListBox::GetClassDefaultAttributes(wxWindowVariant variant)
+{
+    return wxListBox::GetClassDefaultAttributes(variant);
+}
+
+#endif