]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/listbox.cpp
added automatic growing of in-place wxTextCtrls for generic wxListCtrl and wxTreeCtrl
[wxWidgets.git] / src / msw / listbox.cpp
index b4a83da00ce8fa1c0ee1a482e89cfca2e19c7a4f..98d9b64dd4751fce5c7cab926ca2e47e9f782199 100644 (file)
 #endif
 
 #ifndef __TWIN32__
-    #if defined(__GNUWIN32__)
-        #ifndef wxUSE_NORLANDER_HEADERS
-            #include "wx/msw/gnuwin32/extra.h"
-        #endif
+    #ifdef __GNUWIN32_OLD__
+        #include "wx/msw/gnuwin32/extra.h"
     #endif
 #endif
 
@@ -82,9 +80,7 @@
   #endif
 #endif
 
-#if !USE_SHARED_LIBRARY
     IMPLEMENT_DYNAMIC_CLASS(wxListBox, wxControl)
-#endif
 
 // ============================================================================
 // list box item declaration and implementation
@@ -140,7 +136,9 @@ bool wxListBox::Create(wxWindow *parent,
     m_selected = 0;
 
     SetName(name);
+#if wxUSE_VALIDATORS
     SetValidator(validator);
+#endif // wxUSE_VALIDATORS
 
     if (parent)
         parent->AddChild(this);
@@ -158,7 +156,7 @@ bool wxListBox::Create(wxWindow *parent,
     m_windowStyle = style;
 
     DWORD wstyle = WS_VISIBLE | WS_VSCROLL | WS_TABSTOP |
-                   LBS_NOTIFY | LBS_HASSTRINGS;
+                   LBS_NOTIFY | LBS_HASSTRINGS /* | WS_CLIPSIBLINGS */;
     if (m_windowStyle & wxLB_MULTIPLE)
         wstyle |= LBS_MULTIPLESEL;
     else if (m_windowStyle & wxLB_EXTENDED)
@@ -223,8 +221,6 @@ bool wxListBox::Create(wxWindow *parent,
 
     SetSize(x, y, width, height);
 
-    Show(TRUE);
-
     return TRUE;
 }
 
@@ -283,6 +279,7 @@ int wxListBox::DoAppend(const wxString& item)
         pNewItem->SetName(item);
         m_aItems.Add(pNewItem);
         ListBox_SetItemData(GetHwnd(), index, pNewItem);
+        pNewItem->SetFont(GetFont());
     }
 #endif
 
@@ -293,7 +290,12 @@ int wxListBox::DoAppend(const wxString& item)
 
 void wxListBox::DoSetItems(const wxArrayString& choices, void** clientData)
 {
-    ShowWindow(GetHwnd(), SW_HIDE);
+    // avoid flicker - but don't need to do this for a hidden listbox
+    bool hideAndShow = IsShown();
+    if ( hideAndShow )
+    {
+        ShowWindow(GetHwnd(), SW_HIDE);
+    }
 
     ListBox_ResetContent(GetHwnd());
 
@@ -305,8 +307,12 @@ void wxListBox::DoSetItems(const wxArrayString& choices, void** clientData)
         if ( clientData )
         {
 #if wxUSE_OWNER_DRAWN
-            wxASSERT_MSG(clientData[i] == NULL,
-                         wxT("Can't use client data with owner-drawn listboxes"));
+            if ( m_windowStyle & wxLB_OWNERDRAW )
+            {
+                wxASSERT_MSG(clientData[i] == NULL,
+                             wxT("Can't use client data with owner-drawn listboxes"));
+            }
+            ListBox_SetItemData(GetHwnd(), i, clientData[i]);
 #else // !wxUSE_OWNER_DRAWN
             ListBox_SetItemData(GetHwnd(), i, clientData[i]);
 #endif // wxUSE_OWNER_DRAWN/!wxUSE_OWNER_DRAWN
@@ -334,7 +340,11 @@ void wxListBox::DoSetItems(const wxArrayString& choices, void** clientData)
 
     SetHorizontalExtent();
 
-    ShowWindow(GetHwnd(), SW_SHOW);
+    if ( hideAndShow )
+    {
+        // show the listbox back if we hid it
+        ShowWindow(GetHwnd(), SW_SHOW);
+    }
 }
 
 int wxListBox::FindString(const wxString& s) const
@@ -468,9 +478,10 @@ int wxListBox::GetSelections(wxArrayInt& aSelections) const
     }
     else  // single-selection listbox
     {
-        aSelections.Add(ListBox_GetCurSel(GetHwnd()));
+        if (ListBox_GetCurSel(GetHwnd()) > -1)
+            aSelections.Add(ListBox_GetCurSel(GetHwnd()));
 
-        return 1;
+        return aSelections.Count();
     }
 }
 
@@ -479,8 +490,7 @@ int wxListBox::GetSelection() const
 {
     wxCHECK_MSG( !HasMultipleSelection(),
                  -1,
-                 wxT("GetSelection() can't be used with multiple-selection "
-                    "listboxes, use GetSelections() instead.") );
+                 wxT("GetSelection() can't be used with multiple-selection listboxes, use GetSelections() instead.") );
 
     return ListBox_GetCurSel(GetHwnd());
 }
@@ -695,33 +705,6 @@ bool wxListBox::MSWCommand(WXUINT param, WXWORD WXUNUSED(id))
     return FALSE;
 }
 
-WXHBRUSH wxListBox::OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor,
-                               WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
-{
-#if wxUSE_CTL3D
-    if ( m_useCtl3D )
-    {
-        HBRUSH hbrush = Ctl3dCtlColorEx(message, wParam, lParam);
-        return (WXHBRUSH) hbrush;
-    }
-#endif
-
-    if (GetParent()->GetTransparentBackground())
-        SetBkMode((HDC) pDC, TRANSPARENT);
-    else
-        SetBkMode((HDC) pDC, OPAQUE);
-
-    ::SetBkColor((HDC) pDC, RGB(GetBackgroundColour().Red(), GetBackgroundColour().Green(), GetBackgroundColour().Blue()));
-    ::SetTextColor((HDC) pDC, RGB(GetForegroundColour().Red(), GetForegroundColour().Green(), GetForegroundColour().Blue()));
-
-    wxBrush *backgroundBrush = wxTheBrushList->FindOrCreateBrush(GetBackgroundColour(), wxSOLID);
-
-    // Note that this will be cleaned up in wxApp::OnIdle, if backgroundBrush
-    // has a zero usage count.
-    backgroundBrush->RealizeResource();
-    return (WXHBRUSH) backgroundBrush->GetResourceHandle();
-}
-
 // ----------------------------------------------------------------------------
 // wxCheckListBox support
 // ----------------------------------------------------------------------------
@@ -770,6 +753,11 @@ bool wxListBox::MSWOnDraw(WXDRAWITEMSTRUCT *item)
     wxCHECK( ((m_windowStyle & wxLB_OWNERDRAW) == wxLB_OWNERDRAW), FALSE );
 
     DRAWITEMSTRUCT *pStruct = (DRAWITEMSTRUCT *)item;
+    UINT itemID = pStruct->itemID;
+
+    // the item may be -1 for an empty listbox
+    if ( itemID == (UINT)-1 )
+        return FALSE;
 
     long data = ListBox_GetItemData(GetHwnd(), pStruct->itemID);
 
@@ -780,7 +768,7 @@ bool wxListBox::MSWOnDraw(WXDRAWITEMSTRUCT *item)
     wxDC dc;
     dc.SetHDC((WXHDC)pStruct->hDC, FALSE);
     wxRect rect(wxPoint(pStruct->rcItem.left, pStruct->rcItem.top),
-            wxPoint(pStruct->rcItem.right, pStruct->rcItem.bottom));
+                wxPoint(pStruct->rcItem.right, pStruct->rcItem.bottom));
 
     return pItem->OnDrawItem(dc, rect,
             (wxOwnerDrawn::wxODAction)pStruct->itemAction,