]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/choice.cpp
Fix another crash when conversion fails in Unix PostScript code.
[wxWidgets.git] / src / os2 / choice.cpp
index 770da88cccc274c1e4c1cba5edc3043f166adca9..ab7747cea2e7b57825c41316e0e0b3d9aa1883d4 100644 (file)
@@ -4,7 +4,6 @@
 // Author:      David Webster
 // Modified by:
 // Created:     10/13/99
-// RCS-ID:      $Id$
 // Copyright:   (c) David Webster
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
@@ -24,8 +23,6 @@
 
 #include "wx/os2/private.h"
 
-IMPLEMENT_DYNAMIC_CLASS(wxChoice, wxControl)
-
 bool wxChoice::Create(
   wxWindow*                         pParent
 , wxWindowID                        vId
@@ -107,76 +104,69 @@ bool wxChoice::Create(
     int  nEditHeight;
     wxGetCharSize( GetHWND(), NULL, &nEditHeight, &vFont );
     nEditHeight = EDIT_HEIGHT_FROM_CHAR_HEIGHT(nEditHeight);
-    SetBestFittingSize(wxSize(-1,nEditHeight+4));   // +2x2 for the border
+    SetInitialSize(wxSize(-1,nEditHeight+4));   // +2x2 for the border
 
     return true;
 } // end of wxChoice::Create
 
 wxChoice::~wxChoice()
 {
-    Free();
+    Clear();
 }
 
 // ----------------------------------------------------------------------------
 // adding/deleting items to/from the list
 // ----------------------------------------------------------------------------
 
-int wxChoice::DoAppend(
-  const wxString&                   rsItem
-)
+int wxChoice::DoInsertItems(const wxArrayStringsAdapter& items
+                           , unsigned int pos
+                           , void **clientData
+                           , wxClientDataType type
+                           )
 {
-    int                             nIndex;
+    int                             nIndex = wxNOT_FOUND;
     LONG                            nIndexType = 0;
-    if (m_windowStyle & wxCB_SORT)
+    bool                            incrementPos = false;
+    if ( IsSorted() )
         nIndexType = LIT_SORTASCENDING;
-    else
+    else if (pos == GetCount())
         nIndexType = LIT_END;
-    nIndex = (int)::WinSendMsg( GetHwnd()
-                               ,LM_INSERTITEM
-                               ,(MPARAM)nIndexType
-                               ,(MPARAM)rsItem.c_str()
-                              );
-    return nIndex;
-} // end of wxChoice::DoAppend
-
-int wxChoice::DoInsert( const wxString& rsItem, unsigned int pos )
-{
-    wxCHECK_MSG(!(GetWindowStyle() & wxCB_SORT), -1, wxT("can't insert into sorted list"));
-    wxCHECK_MSG(IsValidInsert(pos), -1, wxT("invalid index"));
-
-    if (pos == GetCount())
-        return DoAppend(rsItem);
-
-    int  nIndex;
-    LONG nIndexType = 0;
-
-    if (m_windowStyle & wxCB_SORT)
-        nIndexType = LIT_SORTASCENDING;
     else
+    {
         nIndexType = pos;
-    nIndex = (int)::WinSendMsg( GetHwnd()
-                               ,LM_INSERTITEM
-                               ,(MPARAM)nIndexType
-                               ,(MPARAM)rsItem.c_str()
-                              );
+        incrementPos = true;
+    }
+
+    const unsigned int count = items.GetCount();
+    for( unsigned int i = 0; i < count; ++i )
+    {
+        nIndex = (int)::WinSendMsg( GetHwnd()
+                                   ,LM_INSERTITEM
+                                   ,(MPARAM)nIndexType
+                                   ,(MPARAM)items[i].wx_str()
+                                  );
+        if (nIndex < 0)
+        {
+            nIndex = wxNOT_FOUND;
+            break;
+        }
+        AssignNewItemClientData(nIndex, clientData, i, type);
+
+        if (incrementPos)
+            ++nIndexType;
+    }
     return nIndex;
-} // end of wxChoice::DoInsert
+} // end of wxChoice::DoInsertAppendItemsWithData
 
-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);
-    }
-
     ::WinSendMsg(GetHwnd(), LM_DELETEITEM, (MPARAM)n, (MPARAM)0);
 } // end of wxChoice::Delete
 
-void wxChoice::Clear()
+void wxChoice::DoClear()
 {
-    Free();
     ::WinSendMsg(GetHwnd(), LM_DELETEALL, (MPARAM)0, (MPARAM)0);
 } // end of wxChoice::Clear
 
@@ -214,7 +204,7 @@ void wxChoice::SetString(unsigned int n, const wxString& rsStr)
     LONG  nIndexType = 0;
     void* pData;
 
-    if ( m_clientDataItemsType != wxClientData_None )
+    if ( HasClientData() )
     {
         pData = DoGetItemClientData(n);
     }
@@ -232,7 +222,7 @@ void wxChoice::SetString(unsigned int n, const wxString& rsStr)
     ::WinSendMsg( GetHwnd()
                  ,LM_INSERTITEM
                  ,(MPARAM)nIndexType
-                 ,(MPARAM)rsStr.c_str()
+                 ,(MPARAM)rsStr.wx_str()
                 );
 
     if (pData)
@@ -277,16 +267,6 @@ void* wxChoice::DoGetItemClientData(unsigned int n) const
     return((void*)rc);
 } // end of wxChoice::DoGetItemClientData
 
-void wxChoice::DoSetItemClientObject(unsigned int n, wxClientData* pClientData)
-{
-    DoSetItemClientData(n, pClientData);
-} // end of wxChoice::DoSetItemClientObject
-
-wxClientData* wxChoice::DoGetItemClientObject(unsigned int n) const
-{
-    return (wxClientData *)DoGetItemClientData(n);
-} // end of wxChoice::DoGetItemClientObject
-
 // ----------------------------------------------------------------------------
 // wxOS2 specific helpers
 // ----------------------------------------------------------------------------
@@ -383,7 +363,7 @@ bool wxChoice::OS2Command(
 
     if (n > -1)
     {
-        wxCommandEvent              vEvent( wxEVT_COMMAND_CHOICE_SELECTED
+        wxCommandEvent              vEvent( wxEVT_CHOICE
                                            ,m_windowId
                                           );
 
@@ -399,17 +379,4 @@ bool wxChoice::OS2Command(
     return true;
 } // end of wxChoice::OS2Command
 
-void wxChoice::Free()
-{
-    if (HasClientObjectData())
-    {
-        const unsigned int nCount = GetCount();
-
-        for (unsigned int n = 0; n < nCount; n++)
-        {
-            delete GetClientObject(n);
-        }
-    }
-} // end of wxChoice::Free
-
 #endif // wxUSE_CHOICE