]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/choice.cpp
added wxUTF8StringBuffer for writing UTF8 data into wxString efficiently, similarly...
[wxWidgets.git] / src / os2 / choice.cpp
index a6264e0f8d79befcaf66b4c03e6096a750eb553e..18650fc4f86de3f991a228a9f9461cc241c51d87 100644 (file)
@@ -14,8 +14,9 @@
 
 #if wxUSE_CHOICE
 
 
 #if wxUSE_CHOICE
 
+#include "wx/choice.h"
+
 #ifndef WX_PRECOMP
 #ifndef WX_PRECOMP
-    #include "wx/choice.h"
     #include "wx/utils.h"
     #include "wx/log.h"
     #include "wx/settings.h"
     #include "wx/utils.h"
     #include "wx/log.h"
     #include "wx/settings.h"
@@ -23,7 +24,7 @@
 
 #include "wx/os2/private.h"
 
 
 #include "wx/os2/private.h"
 
-IMPLEMENT_DYNAMIC_CLASS(wxChoice, wxControl)
+IMPLEMENT_DYNAMIC_CLASS(wxChoice, wxControlWithItems)
 
 bool wxChoice::Create(
   wxWindow*                         pParent
 
 bool wxChoice::Create(
   wxWindow*                         pParent
@@ -69,8 +70,9 @@ bool wxChoice::Create(
               WS_TABSTOP       |
               WS_VISIBLE;
 
               WS_TABSTOP       |
               WS_VISIBLE;
 
-    if (lStyle & wxCLIP_SIBLINGS )
-        lSstyle |= WS_CLIPSIBLINGS;
+    // clipping siblings does not yet work
+    // if (lStyle & wxCLIP_SIBLINGS )
+    //     lSstyle |= WS_CLIPSIBLINGS;
 
     wxASSERT_MSG( !(lStyle & wxCB_DROPDOWN) &&
                   !(lStyle & wxCB_READONLY) &&
 
     wxASSERT_MSG( !(lStyle & wxCB_DROPDOWN) &&
                   !(lStyle & wxCB_READONLY) &&
@@ -88,6 +90,8 @@ bool wxChoice::Create(
     // on global settings) rather than inheriting the parent's background colour.
     //
     SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
     // on global settings) rather than inheriting the parent's background colour.
     //
     SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
+
+    // initialize the controls contents
     for (int i = 0; i < n; i++)
     {
         Append(asChoices[i]);
     for (int i = 0; i < n; i++)
     {
         Append(asChoices[i]);
@@ -97,64 +101,75 @@ bool wxChoice::Create(
             ,rSize.x
             ,rSize.y
            );
             ,rSize.x
             ,rSize.y
            );
+
+    // Set height to use with sizers i.e. without the dropdown listbox
+    wxFont vFont = GetFont();
+    int  nEditHeight;
+    wxGetCharSize( GetHWND(), NULL, &nEditHeight, &vFont );
+    nEditHeight = EDIT_HEIGHT_FROM_CHAR_HEIGHT(nEditHeight);
+    SetInitialSize(wxSize(-1,nEditHeight+4));   // +2x2 for the border
+
     return true;
 } // end of wxChoice::Create
 
     return true;
 } // end of wxChoice::Create
 
+wxChoice::~wxChoice()
+{
+    Clear();
+}
+
 // ----------------------------------------------------------------------------
 // adding/deleting items to/from the list
 // ----------------------------------------------------------------------------
 
 // ----------------------------------------------------------------------------
 // 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;
     LONG                            nIndexType = 0;
-
-    if (m_windowStyle & wxLB_SORT)
+    bool                            incrementPos = false;
+    if ( IsSorted() )
         nIndexType = LIT_SORTASCENDING;
         nIndexType = LIT_SORTASCENDING;
-    else
+    else if (pos == GetCount())
         nIndexType = LIT_END;
         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, int pos )
-{
-    wxCHECK_MSG(!(GetWindowStyle() & wxCB_SORT), -1, wxT("can't insert into sorted list"));
-    wxCHECK_MSG(IsValidInsert(pos), -1, wxT("invalid index"));
-
-    if ((size_t)pos == GetCount())
-        return DoAppend(rsItem);
-
-    int  nIndex;
-    LONG nIndexType = 0;
-
-    if (m_windowStyle & wxLB_SORT)
-        nIndexType = LIT_SORTASCENDING;
     else
     else
+    {
         nIndexType = pos;
         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;
     return nIndex;
-} // end of wxChoice::DoInsert
+} // end of wxChoice::DoInsertAppendItemsWithData
 
 
-void wxChoice::Delete( int n )
+void wxChoice::DoDeleteOneItem(unsigned int n)
 {
     wxCHECK_RET( IsValid(n), wxT("invalid item index in wxChoice::Delete") );
 {
     wxCHECK_RET( IsValid(n), wxT("invalid item index in wxChoice::Delete") );
+
     ::WinSendMsg(GetHwnd(), LM_DELETEITEM, (MPARAM)n, (MPARAM)0);
 } // end of wxChoice::Delete
 
     ::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
 
     ::WinSendMsg(GetHwnd(), LM_DELETEALL, (MPARAM)0, (MPARAM)0);
 } // end of wxChoice::Clear
 
@@ -182,12 +197,12 @@ void wxChoice::SetSelection(
 // string list functions
 // ----------------------------------------------------------------------------
 
 // string list functions
 // ----------------------------------------------------------------------------
 
-size_t wxChoice::GetCount() const
+unsigned int wxChoice::GetCount() const
 {
 {
-    return((size_t)LONGFROMMR(::WinSendMsg(GetHwnd(), LM_QUERYITEMCOUNT, (MPARAM)0, (MPARAM)0)));
+    return((unsigned int)LONGFROMMR(::WinSendMsg(GetHwnd(), LM_QUERYITEMCOUNT, (MPARAM)0, (MPARAM)0)));
 } // end of wxChoice::GetCount
 
 } // end of wxChoice::GetCount
 
-void wxChoice::SetString( int n, const wxString& rsStr )
+void wxChoice::SetString(unsigned int n, const wxString& rsStr)
 {
     LONG  nIndexType = 0;
     void* pData;
 {
     LONG  nIndexType = 0;
     void* pData;
@@ -203,25 +218,23 @@ void wxChoice::SetString( int n, const wxString& rsStr )
 
     ::WinSendMsg(GetHwnd(), LM_DELETEITEM, (MPARAM)n, 0);
 
 
     ::WinSendMsg(GetHwnd(), LM_DELETEITEM, (MPARAM)n, 0);
 
-    if (m_windowStyle & wxLB_SORT)
+    if (m_windowStyle & wxCB_SORT)
         nIndexType = LIT_SORTASCENDING;
     else
         nIndexType = LIT_END;
     ::WinSendMsg( GetHwnd()
                  ,LM_INSERTITEM
                  ,(MPARAM)nIndexType
         nIndexType = LIT_SORTASCENDING;
     else
         nIndexType = LIT_END;
     ::WinSendMsg( GetHwnd()
                  ,LM_INSERTITEM
                  ,(MPARAM)nIndexType
-                 ,(MPARAM)rsStr.c_str()
+                 ,(MPARAM)rsStr.wx_str()
                 );
 
     if (pData)
     {
                 );
 
     if (pData)
     {
-        DoSetItemClientData( n
-                            ,pData
-                           );
+        DoSetItemClientData(n, pData);
     }
 } // end of wxChoice::SetString
 
     }
 } // end of wxChoice::SetString
 
-wxString wxChoice::GetString(int n) const
+wxString wxChoice::GetString(unsigned int n) const
 {
     int      nLen = 0;
     wxString sStr = wxEmptyString;
 {
     int      nLen = 0;
     wxString sStr = wxEmptyString;
@@ -230,7 +243,7 @@ wxString wxChoice::GetString(int n) const
     nLen = (size_t)LONGFROMMR(::WinSendMsg(GetHwnd(), LM_QUERYITEMTEXTLENGTH, (MPARAM)n, (MPARAM)0));
     if (nLen != LIT_ERROR && nLen > 0)
     {
     nLen = (size_t)LONGFROMMR(::WinSendMsg(GetHwnd(), LM_QUERYITEMTEXTLENGTH, (MPARAM)n, (MPARAM)0));
     if (nLen != LIT_ERROR && nLen > 0)
     {
-        zBuf = new wxChar[nLen + 1];
+        zBuf = new wxChar[++nLen];
         ::WinSendMsg( GetHwnd()
                      ,LM_QUERYITEMTEXT
                      ,MPFROM2SHORT((SHORT)n, (SHORT)nLen)
         ::WinSendMsg( GetHwnd()
                      ,LM_QUERYITEMTEXT
                      ,MPFROM2SHORT((SHORT)n, (SHORT)nLen)
@@ -246,38 +259,16 @@ wxString wxChoice::GetString(int n) const
 // client data
 // ----------------------------------------------------------------------------
 
 // client data
 // ----------------------------------------------------------------------------
 
-void wxChoice::DoSetItemClientData(
-  int                               n
-, void*                             pClientData
-)
+void wxChoice::DoSetItemClientData(unsigned int n, void* pClientData)
 {
     ::WinSendMsg(GetHwnd(), LM_SETITEMHANDLE, (MPARAM)n, MPFROMP(pClientData));
 } // end of wxChoice::DoSetItemClientData
 
 {
     ::WinSendMsg(GetHwnd(), LM_SETITEMHANDLE, (MPARAM)n, MPFROMP(pClientData));
 } // end of wxChoice::DoSetItemClientData
 
-void* wxChoice::DoGetItemClientData( int n ) const
+void* wxChoice::DoGetItemClientData(unsigned int n) const
 {
 {
-    MRESULT                         rc = 0L;
-
-    rc = ::WinSendMsg(GetHwnd(), LM_QUERYITEMHANDLE, (MPARAM)n, (MPARAM)0);
+    MRESULT rc = ::WinSendMsg(GetHwnd(), LM_QUERYITEMHANDLE, (MPARAM)n, (MPARAM)0);
     return((void*)rc);
     return((void*)rc);
-} // end of wxChoice::DoSetItemClientData
-
-void wxChoice::DoSetItemClientObject(
-  int                               n
-, wxClientData*                     pClientData
-)
-{
-    DoSetItemClientData( n
-                        ,pClientData
-                       );
-} // end of wxChoice::DoSetItemClientObject
-
-wxClientData* wxChoice::DoGetItemClientObject(
-  int                               n
-) const
-{
-    return (wxClientData *)DoGetItemClientData(n);
-} // end of wxChoice::DoGetItemClientObject
+} // end of wxChoice::DoGetItemClientData
 
 // ----------------------------------------------------------------------------
 // wxOS2 specific helpers
 
 // ----------------------------------------------------------------------------
 // wxOS2 specific helpers
@@ -315,9 +306,9 @@ wxSize wxChoice::DoGetBestSize() const
     int    nCy;
     wxFont vFont = (wxFont)GetFont();
 
     int    nCy;
     wxFont vFont = (wxFont)GetFont();
 
-    const size_t nItems = GetCount();
+    const unsigned int nItems = GetCount();
 
 
-    for (size_t i = 0; i < nItems; i++)
+    for (unsigned int i = 0; i < nItems; i++)
     {
         wxString sStr(GetString(i));
         GetTextExtent( sStr, &nLineWidth, NULL );
     {
         wxString sStr(GetString(i));
         GetTextExtent( sStr, &nLineWidth, NULL );
@@ -341,12 +332,10 @@ wxSize wxChoice::DoGetBestSize() const
     //
     // Choice drop-down list depends on number of items (limited to 10)
     //
     //
     // Choice drop-down list depends on number of items (limited to 10)
     //
-    size_t                          nStrings = nItems == 0 ? 10 : wxMin(10, nItems) + 1;
-    int                             nChoiceHeight = EDIT_HEIGHT_FROM_CHAR_HEIGHT(nCy) * nStrings;
+    size_t nStrings = nItems == 0 ? 10 : wxMin(10, nItems) + 1;
+    int    nChoiceHeight = EDIT_HEIGHT_FROM_CHAR_HEIGHT(nCy) * nStrings;
 
 
-    return wxSize( nChoiceWidth
-                  ,nChoiceHeight
-                 );
+    return wxSize(nChoiceWidth, nChoiceHeight);
 } // end of wxChoice::DoGetBestSize
 
 MRESULT wxChoice::OS2WindowProc(
 } // end of wxChoice::DoGetBestSize
 
 MRESULT wxChoice::OS2WindowProc(
@@ -393,17 +382,4 @@ bool wxChoice::OS2Command(
     return true;
 } // end of wxChoice::OS2Command
 
     return true;
 } // end of wxChoice::OS2Command
 
-void wxChoice::Free()
-{
-    if (HasClientObjectData())
-    {
-        const size_t nCount = GetCount();
-
-        for (size_t n = 0; n < nCount; n++)
-        {
-            delete GetClientObject(n);
-        }
-    }
-} // end of wxChoice::Free
-
 #endif // wxUSE_CHOICE
 #endif // wxUSE_CHOICE