]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/listbox.cpp
1. wxFontMapper starts to materialise
[wxWidgets.git] / src / msw / listbox.cpp
index 3d234296176f3057cbda48dc190fe8ba5b75ad43..2168734e0123f4fc4639fa5a378f30a48444cd18 100644 (file)
@@ -50,7 +50,7 @@
 #ifndef __TWIN32__
     #if defined(__GNUWIN32__)
         #ifndef wxUSE_NORLANDER_HEADERS
-            #include <wx/msw/gnuwin32/extra.h>
+            #include "wx/msw/gnuwin32/extra.h"
         #endif
     #endif
 #endif
@@ -230,12 +230,7 @@ bool wxListBox::Create(wxWindow *parent,
 
 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()
@@ -261,6 +256,16 @@ void wxListBox::Delete(int N)
     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
+
     SendMessage(GetHwnd(), LB_DELETESTRING, N, 0);
     m_noItems--;
 
@@ -300,7 +305,7 @@ void wxListBox::DoSetItems(const wxArrayString& choices, void** clientData)
         if ( clientData )
         {
 #if wxUSE_OWNER_DRAWN
-            wxASSERT_MSG(clientData[ui] == NULL,
+            wxASSERT_MSG(clientData[i] == NULL,
                          wxT("Can't use client data with owner-drawn listboxes"));
 #else // !wxUSE_OWNER_DRAWN
             ListBox_SetItemData(GetHwnd(), i, clientData[i]);
@@ -343,19 +348,35 @@ int wxListBox::FindString(const wxString& s) const
 
 void wxListBox::Clear()
 {
+    Free();
+
     ListBox_ResetContent(GetHwnd());
 
+    m_noItems = 0;
+    SetHorizontalExtent();
+}
+
+void wxListBox::Free()
+{
 #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();
+        m_aItems.Clear();
+    }
+    else
 #endif // wxUSE_OWNER_DRAWN
-
-    m_noItems = 0;
-    SetHorizontalExtent();
+    if ( HasClientObjectData() )
+    {
+        for ( size_t n = 0; n < (size_t)m_noItems; n++ )
+        {
+            delete GetClientObject(n);
+        }
+    }
 }
 
 void wxListBox::SetSelection(int N, bool select)
@@ -381,12 +402,12 @@ bool wxListBox::IsSelected(int N) const
     return SendMessage(GetHwnd(), LB_GETSEL, N, 0) == 0 ? FALSE : TRUE;
 }
 
-wxClientData* wxListBox::DoGetClientObject(int n) const
+wxClientData* wxListBox::DoGetItemClientObject(int n) const
 {
-    return (wxClientData *)DoGetClientData(n);
+    return (wxClientData *)DoGetItemClientData(n);
 }
 
-void *wxListBox::DoGetClientData(int n) const
+void *wxListBox::DoGetItemClientData(int n) const
 {
     wxCHECK_MSG( n >= 0 && n < m_noItems, NULL,
                  wxT("invalid index in wxListBox::GetClientData") );
@@ -394,12 +415,12 @@ void *wxListBox::DoGetClientData(int n) const
     return (void *)SendMessage(GetHwnd(), LB_GETITEMDATA, n, 0);
 }
 
-void wxListBox::DoSetClientObject(int n, wxClientData* clientData)
+void wxListBox::DoSetItemClientObject(int n, wxClientData* clientData)
 {
-    DoSetClientData(n, clientData);
+    DoSetItemClientData(n, clientData);
 }
 
-void wxListBox::DoSetClientData(int n, void *clientData)
+void wxListBox::DoSetItemClientData(int n, void *clientData)
 {
     wxCHECK_RET( n >= 0 && n < m_noItems,
                  wxT("invalid index in wxListBox::SetClientData") );
@@ -637,44 +658,39 @@ wxSize wxListBox::DoGetBestSize()
 
 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);
+        event.SetEventObject( this );
+
         wxArrayInt aSelections;
-        int count = GetSelections(aSelections);
+        int n, count = GetSelections(aSelections);
         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
         {
-            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 );
-        GetEventHandler()->ProcessEvent(event);
-        return TRUE;
+
+        return GetEventHandler()->ProcessEvent(event);
     }
+    //else:
 
     return FALSE;
 }