]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/choice.cpp
bug fix for vista in multi-selection tree
[wxWidgets.git] / src / msw / choice.cpp
index 4af53089a6a1e4c8f720c0a4178edac8ad333978..9eec9c2332422433a5166bbbd315c221a5af77cb 100644 (file)
@@ -211,63 +211,56 @@ WXDWORD wxChoice::MSWGetStyle(long style, WXDWORD *exstyle) const
 
 wxChoice::~wxChoice()
 {
-    Free();
+    Clear();
 }
 
 // ----------------------------------------------------------------------------
 // adding/deleting items to/from the list
 // ----------------------------------------------------------------------------
 
-int wxChoice::DoAppend(const wxString& item)
+int wxChoice::DoInsertItems(const wxArrayStringsAdapter& items,
+                            unsigned int pos,
+                            void **clientData, wxClientDataType type)
 {
-    int n = (int)SendMessage(GetHwnd(), CB_ADDSTRING, 0,
-                             (LPARAM)item.wx_str());
-    if ( n == CB_ERR )
-    {
-        wxLogLastError(wxT("SendMessage(CB_ADDSTRING)"));
-    }
-    else // ok
-    {
-        // we need to refresh our size in order to have enough space for the
-        // newly added items
-        if ( !IsFrozen() )
-            UpdateVisibleHeight();
-    }
+    MSWAllocStorage(items, CB_INITSTORAGE);
 
-    InvalidateBestSize();
-    return n;
-}
+    const bool append = pos == GetCount();
 
-int wxChoice::DoInsert(const wxString& item, unsigned int pos)
-{
-    wxCHECK_MSG(!(GetWindowStyle() & wxCB_SORT), -1, wxT("can't insert into sorted list"));
-    wxCHECK_MSG(IsValidInsert(pos), -1, wxT("invalid index"));
+    // use CB_ADDSTRING when appending at the end to make sure the control is
+    // resorted if it has wxCB_SORT style
+    const unsigned msg = append ? CB_ADDSTRING : CB_INSERTSTRING;
 
-    int n = (int)SendMessage(GetHwnd(), CB_INSERTSTRING, pos,
-                             (LPARAM)item.wx_str());
-    if ( n == CB_ERR )
-    {
-        wxLogLastError(wxT("SendMessage(CB_INSERTSTRING)"));
-    }
-    else // ok
+    if ( append )
+        pos = 0;
+
+    int n = wxNOT_FOUND;
+    const unsigned numItems = items.GetCount();
+    for ( unsigned i = 0; i < numItems; ++i )
     {
-        if ( !IsFrozen() )
-            UpdateVisibleHeight();
+        n = MSWInsertOrAppendItem(pos, items[i], msg);
+        if ( n == wxNOT_FOUND )
+            return n;
+
+        if ( !append )
+            pos++;
+
+        AssignNewItemClientData(n, clientData, i, type);
     }
 
+    // we need to refresh our size in order to have enough space for the
+    // newly added items
+    if ( !IsFrozen() )
+        UpdateVisibleHeight();
+
     InvalidateBestSize();
+
     return n;
 }
 
-void wxChoice::Delete(unsigned int n)
+void wxChoice::DoDeleteOneItem(unsigned int n)
 {
     wxCHECK_RET( IsValid(n), wxT("invalid item index in wxChoice::Delete") );
 
-    if ( HasClientObjectData() )
-    {
-        delete GetClientObject(n);
-    }
-
     SendMessage(GetHwnd(), CB_DELETESTRING, n, 0);
 
     if ( !IsFrozen() )
@@ -276,10 +269,8 @@ void wxChoice::Delete(unsigned int n)
     InvalidateBestSize();
 }
 
-void wxChoice::Clear()
+void wxChoice::DoClear()
 {
-    Free();
-
     SendMessage(GetHwnd(), CB_RESETCONTENT, 0, 0);
 
     if ( !IsFrozen() )
@@ -288,18 +279,6 @@ void wxChoice::Clear()
     InvalidateBestSize();
 }
 
-void wxChoice::Free()
-{
-    if ( HasClientObjectData() )
-    {
-        unsigned int count = GetCount();
-        for ( unsigned int n = 0; n < count; n++ )
-        {
-            delete GetClientObject(n);
-        }
-    }
-}
-
 // ----------------------------------------------------------------------------
 // selection
 // ----------------------------------------------------------------------------
@@ -384,25 +363,22 @@ void wxChoice::SetString(unsigned int n, const wxString& s)
     // we have to delete and add back the string as there is no way to change a
     // string in place
 
-    // we need to preserve the client data
-    void *data;
-    if ( m_clientDataItemsType != wxClientData_None )
-    {
-        data = DoGetItemClientData(n);
-    }
-    else // no client data
-    {
-        data = NULL;
-    }
+    // we need to preserve the client data manually
+    void *oldData = NULL;
+    wxClientData *oldObjData = NULL;
+    if ( HasClientUntypedData() )
+        oldData = GetClientData(n);
+    else if ( HasClientObjectData() )
+        oldObjData = GetClientObject(n);
 
     ::SendMessage(GetHwnd(), CB_DELETESTRING, n, 0);
     ::SendMessage(GetHwnd(), CB_INSERTSTRING, n, (LPARAM)s.wx_str() );
 
-    if ( data )
-    {
-        DoSetItemClientData(n, data);
-    }
-    //else: it's already NULL by default
+    // restore the client data
+    if ( oldData )
+        SetClientData(n, oldData);
+    else if ( oldObjData )
+        SetClientObject(n, oldObjData);
 
     InvalidateBestSize();
 }
@@ -456,16 +432,6 @@ void* wxChoice::DoGetItemClientData(unsigned int n) const
     return (void *)rc;
 }
 
-void wxChoice::DoSetItemClientObject(unsigned int n, wxClientData* clientData)
-{
-    DoSetItemClientData(n, clientData);
-}
-
-wxClientData* wxChoice::DoGetItemClientObject(unsigned int n) const
-{
-    return (wxClientData *)DoGetItemClientData(n);
-}
-
 // ----------------------------------------------------------------------------
 // wxMSW specific helpers
 // ----------------------------------------------------------------------------