]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/choice.cpp
Clean up memory if have to exit early
[wxWidgets.git] / src / msw / choice.cpp
index 6c9206a7960773f5a61ec7fbdb0955408f6fa968..58a2f6a17d14939d26989d00e4a8829fa3380184 100644 (file)
@@ -83,7 +83,7 @@ bool wxChoice::Create(wxWindow *parent,
 
     // A choice/combobox normally has a white background (or other, depending
     // on global settings) rather than inheriting the parent's background colour.
-    SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_WINDOW));
+    SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
 
     for ( int i = 0; i < n; i++ )
     {
@@ -191,25 +191,53 @@ int wxChoice::FindString(const wxString& s) const
 #endif // Watcom/!Watcom
 }
 
-void wxChoice::SetString(int WXUNUSED(n), const wxString& WXUNUSED(s))
+void wxChoice::SetString(int n, const wxString& s)
 {
-    wxFAIL_MSG(wxT("not implemented"));
+    wxCHECK_RET( n >= 0 && n < GetCount(),
+                 wxT("invalid item index in wxChoice::SetString") );
 
-#if 0 // should do this, but no Insert() so far
-    Delete(n);
-    Insert(n + 1, s);
-#endif
+    // 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;
+    }
+
+    ::SendMessage(GetHwnd(), CB_DELETESTRING, n, 0);
+    ::SendMessage(GetHwnd(), CB_INSERTSTRING, n, (LPARAM)s.c_str() );
+
+    if ( data )
+    {
+        DoSetItemClientData(n, data);
+    }
+    //else: it's already NULL by default
 }
 
 wxString wxChoice::GetString(int n) const
 {
-    size_t len = (size_t)::SendMessage(GetHwnd(), CB_GETLBTEXTLEN, n, 0);
+    int len = (int)::SendMessage(GetHwnd(), CB_GETLBTEXTLEN, n, 0);
+
     wxString str;
-    if (len) {
-        if ( ::SendMessage(GetHwnd(), CB_GETLBTEXT, n,
-                           (LPARAM)str.GetWriteBuf(len)) == CB_ERR ) {
+    if ( len != CB_ERR && len > 0 )
+    {
+        if ( ::SendMessage
+               (
+                GetHwnd(),
+                CB_GETLBTEXT,
+                n,
+                (LPARAM)(wxChar *)wxStringBuffer(str, len)
+               ) == CB_ERR )
+        {
             wxLogLastError(wxT("SendMessage(CB_GETLBTEXT)"));
         }
+
         str.UngetWriteBuf();
     }
 
@@ -222,7 +250,8 @@ wxString wxChoice::GetString(int n) const
 
 void wxChoice::DoSetItemClientData( int n, void* clientData )
 {
-    if ( SendMessage(GetHwnd(), CB_SETITEMDATA, n, (LPARAM)clientData) == CB_ERR )
+    if ( ::SendMessage(GetHwnd(), CB_SETITEMDATA,
+                       n, (LPARAM)clientData) == CB_ERR )
     {
         wxLogLastError(wxT("CB_SETITEMDATA"));
     }
@@ -283,6 +312,7 @@ void wxChoice::DoSetSize(int x, int y,
     // wxWindows interpretation is different; also, getting the size returns
     // the _displayed_ size (NOT the drop down menu size) so
     // setting-getting-setting size would not work.
+
     wxControl::DoSetSize(x, y, width, -1, sizeFlags);
 }
 
@@ -391,7 +421,7 @@ WXHBRUSH wxChoice::OnCtlColor(WXHDC pDC, WXHWND WXUNUSED(pWnd), WXUINT WXUNUSED(
     wxColour colBack = GetBackgroundColour();
 
     if (!IsEnabled())
-        colBack = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE);
+        colBack = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
 
     ::SetBkColor(hdc, wxColourToRGB(colBack));
     ::SetTextColor(hdc, wxColourToRGB(GetForegroundColour()));