]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/listbox.cpp
added test mode to wxLongLongWx which allowed to find the bug in operator*=()
[wxWidgets.git] / src / msw / listbox.cpp
index 4eb467f5036a21bf5e61e5c0fd88ef0be31ea135..128111853e8d173a71dfe3578d3a7fbb462c2f2f 100644 (file)
@@ -50,7 +50,7 @@
 #ifndef __TWIN32__
     #if defined(__GNUWIN32__)
         #ifndef wxUSE_NORLANDER_HEADERS
 #ifndef __TWIN32__
     #if defined(__GNUWIN32__)
         #ifndef wxUSE_NORLANDER_HEADERS
-            #include <wx/msw/gnuwin32/extra.h>
+            #include "wx/msw/gnuwin32/extra.h"
         #endif
     #endif
 #endif
         #endif
     #endif
 #endif
@@ -82,9 +82,7 @@
   #endif
 #endif
 
   #endif
 #endif
 
-#if !USE_SHARED_LIBRARY
     IMPLEMENT_DYNAMIC_CLASS(wxListBox, wxControl)
     IMPLEMENT_DYNAMIC_CLASS(wxListBox, wxControl)
-#endif
 
 // ============================================================================
 // list box item declaration and implementation
 
 // ============================================================================
 // list box item declaration and implementation
@@ -140,7 +138,9 @@ bool wxListBox::Create(wxWindow *parent,
     m_selected = 0;
 
     SetName(name);
     m_selected = 0;
 
     SetName(name);
+#if wxUSE_VALIDATORS
     SetValidator(validator);
     SetValidator(validator);
+#endif // wxUSE_VALIDATORS
 
     if (parent)
         parent->AddChild(this);
 
     if (parent)
         parent->AddChild(this);
@@ -230,12 +230,7 @@ bool wxListBox::Create(wxWindow *parent,
 
 wxListBox::~wxListBox()
 {
 
 wxListBox::~wxListBox()
 {
-#if wxUSE_OWNER_DRAWN
-    size_t uiCount = m_aItems.Count();
-    while ( uiCount-- != 0 ) {
-        delete m_aItems[uiCount];
-    }
-#endif // wxUSE_OWNER_DRAWN
+    Free();
 }
 
 void wxListBox::SetupColours()
 }
 
 void wxListBox::SetupColours()
@@ -261,15 +256,15 @@ void wxListBox::Delete(int N)
     wxCHECK_RET( N >= 0 && N < m_noItems,
                  wxT("invalid index in wxListBox::Delete") );
 
     wxCHECK_RET( N >= 0 && N < m_noItems,
                  wxT("invalid index in wxListBox::Delete") );
 
-#if wxUSE_OWNER_DRAWN
-    delete m_aItems[N];
-    m_aItems.Remove(N);
-#else // !wxUSE_OWNER_DRAWN
-    if ( HasClientObjectData() )
-    {
-        delete GetClientObject(N);
-    }
-#endif // wxUSE_OWNER_DRAWN/!wxUSE_OWNER_DRAWN
+    // for owner drawn objects, the data is used for storing wxOwnerDrawn
+    // pointers and we shouldn't touch it
+#if !wxUSE_OWNER_DRAWN
+    if ( !(m_windowStyle & wxLB_OWNERDRAW) )
+#endif // !wxUSE_OWNER_DRAWN
+        if ( HasClientObjectData() )
+        {
+            delete GetClientObject(N);
+        }
 
     SendMessage(GetHwnd(), LB_DELETESTRING, N, 0);
     m_noItems--;
 
     SendMessage(GetHwnd(), LB_DELETESTRING, N, 0);
     m_noItems--;
@@ -288,6 +283,7 @@ int wxListBox::DoAppend(const wxString& item)
         pNewItem->SetName(item);
         m_aItems.Add(pNewItem);
         ListBox_SetItemData(GetHwnd(), index, pNewItem);
         pNewItem->SetName(item);
         m_aItems.Add(pNewItem);
         ListBox_SetItemData(GetHwnd(), index, pNewItem);
+        pNewItem->SetFont(GetFont());
     }
 #endif
 
     }
 #endif
 
@@ -352,15 +348,29 @@ int wxListBox::FindString(const wxString& s) const
 }
 
 void wxListBox::Clear()
 }
 
 void wxListBox::Clear()
+{
+    Free();
+
+    ListBox_ResetContent(GetHwnd());
+
+    m_noItems = 0;
+    SetHorizontalExtent();
+}
+
+void wxListBox::Free()
 {
 #if wxUSE_OWNER_DRAWN
 {
 #if wxUSE_OWNER_DRAWN
-    size_t uiCount = m_aItems.Count();
-    while ( uiCount-- != 0 ) {
-        delete m_aItems[uiCount];
-    }
+    if ( m_windowStyle & wxLB_OWNERDRAW )
+    {
+        size_t uiCount = m_aItems.Count();
+        while ( uiCount-- != 0 ) {
+            delete m_aItems[uiCount];
+        }
 
 
-    m_aItems.Clear();
-#else // !wxUSE_OWNER_DRAWN
+        m_aItems.Clear();
+    }
+    else
+#endif // wxUSE_OWNER_DRAWN
     if ( HasClientObjectData() )
     {
         for ( size_t n = 0; n < (size_t)m_noItems; n++ )
     if ( HasClientObjectData() )
     {
         for ( size_t n = 0; n < (size_t)m_noItems; n++ )
@@ -368,12 +378,6 @@ void wxListBox::Clear()
             delete GetClientObject(n);
         }
     }
             delete GetClientObject(n);
         }
     }
-#endif // wxUSE_OWNER_DRAWN/!wxUSE_OWNER_DRAWN
-
-    ListBox_ResetContent(GetHwnd());
-
-    m_noItems = 0;
-    SetHorizontalExtent();
 }
 
 void wxListBox::SetSelection(int N, bool select)
 }
 
 void wxListBox::SetSelection(int N, bool select)
@@ -620,7 +624,7 @@ void wxListBox::SetHorizontalExtent(const wxString& s)
     }
 }
 
     }
 }
 
-wxSize wxListBox::DoGetBestSize()
+wxSize wxListBox::DoGetBestSize() const
 {
     // find the widest string
     int wLine;
 {
     // find the widest string
     int wLine;
@@ -655,73 +659,41 @@ wxSize wxListBox::DoGetBestSize()
 
 bool wxListBox::MSWCommand(WXUINT param, WXWORD WXUNUSED(id))
 {
 
 bool wxListBox::MSWCommand(WXUINT param, WXWORD WXUNUSED(id))
 {
-    /*
-       if (param == LBN_SELCANCEL)
-       {
-       event.extraLong = FALSE;
-       }
-     */
-    if (param == LBN_SELCHANGE)
+    if ( param == LBN_SELCHANGE )
     {
         wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, m_windowId);
     {
         wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, m_windowId);
+        event.SetEventObject( this );
+
         wxArrayInt aSelections;
         wxArrayInt aSelections;
-        int count = GetSelections(aSelections);
+        int n, count = GetSelections(aSelections);
         if ( count > 0 )
         {
         if ( count > 0 )
         {
-            event.m_commandInt = aSelections[0];
-            event.m_clientData = GetClientData(event.m_commandInt);
-            wxString str(GetString(event.m_commandInt));
-            if (str != wxT(""))
-            {
-               event.m_commandString = str;
-            }
+            n = aSelections[0];
+            if ( HasClientObjectData() )
+                event.SetClientObject( GetClientObject(n) );
+            else if ( HasClientUntypedData() )
+                event.SetClientData( GetClientData(n) );
+            event.SetString( GetString(n) );
         }
         else
         {
         }
         else
         {
-            event.m_commandInt = -1;
-            event.m_commandString.Empty();
+            n = -1;
         }
 
         }
 
-        event.SetEventObject( this );
-        ProcessCommand(event);
-        return TRUE;
+        event.m_commandInt = n;
+
+        return GetEventHandler()->ProcessEvent(event);
     }
     }
-    else if (param == LBN_DBLCLK)
+    else if ( param == LBN_DBLCLK )
     {
         wxCommandEvent event(wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, m_windowId);
         event.SetEventObject( this );
     {
         wxCommandEvent event(wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, m_windowId);
         event.SetEventObject( this );
-        GetEventHandler()->ProcessEvent(event);
-        return TRUE;
-    }
 
 
-    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;
+        return GetEventHandler()->ProcessEvent(event);
     }
     }
-#endif
-
-    if (GetParent()->GetTransparentBackground())
-        SetBkMode((HDC) pDC, TRANSPARENT);
-    else
-        SetBkMode((HDC) pDC, OPAQUE);
+    //else:
 
 
-    ::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();
+    return FALSE;
 }
 
 // ----------------------------------------------------------------------------
 }
 
 // ----------------------------------------------------------------------------
@@ -749,13 +721,19 @@ bool wxListBox::MSWOnMeasure(WXMEASUREITEMSTRUCT *item)
 
     MEASUREITEMSTRUCT *pStruct = (MEASUREITEMSTRUCT *)item;
 
 
     MEASUREITEMSTRUCT *pStruct = (MEASUREITEMSTRUCT *)item;
 
+    HDC hdc = CreateIC(wxT("DISPLAY"), NULL, NULL, 0);
+
     wxDC dc;
     wxDC dc;
-    dc.SetHDC((WXHDC)CreateIC(wxT("DISPLAY"), NULL, NULL, 0));
+    dc.SetHDC((WXHDC)hdc);
     dc.SetFont(wxSystemSettings::GetSystemFont(wxSYS_ANSI_VAR_FONT));
 
     pStruct->itemHeight = dc.GetCharHeight() + 2*OWNER_DRAWN_LISTBOX_EXTRA_SPACE;
     pStruct->itemWidth  = dc.GetCharWidth();
 
     dc.SetFont(wxSystemSettings::GetSystemFont(wxSYS_ANSI_VAR_FONT));
 
     pStruct->itemHeight = dc.GetCharHeight() + 2*OWNER_DRAWN_LISTBOX_EXTRA_SPACE;
     pStruct->itemWidth  = dc.GetCharWidth();
 
+    dc.SetHDC(0);
+
+    DeleteDC(hdc);
+
     return TRUE;
 }
 
     return TRUE;
 }