]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/choice.cpp
call gtk_toolbar_set_tooltips() from GtkSetStyle(); removed erroneous wxTB_TOOLTIPS
[wxWidgets.git] / src / os2 / choice.cpp
index 7a5cee50855d16c24309d0386915790d1183e5db..b8940322b37ee4e5900101b8780052c3417e9b23 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        choice.cpp
+// Name:        src/os2/choice.cpp
 // Purpose:     wxChoice
 // Author:      David Webster
 // Modified by:
@@ -12,8 +12,6 @@
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
-#include "wx/defs.h"
-
 #if wxUSE_CHOICE
 
 #ifndef WX_PRECOMP
@@ -90,25 +88,25 @@ bool wxChoice::Create(
     // 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]);
     }
-    wxFont*                          pTextFont = new wxFont( 10
-                                                            ,wxMODERN
-                                                            ,wxNORMAL
-                                                            ,wxNORMAL
-                                                           );
-    SetFont(*pTextFont);
     SetSize( rPos.x
             ,rPos.y
             ,rSize.x
             ,rSize.y
            );
-    delete pTextFont;
     return true;
 } // end of wxChoice::Create
 
+wxChoice::~wxChoice()
+{
+    Free();
+}
+
 // ----------------------------------------------------------------------------
 // adding/deleting items to/from the list
 // ----------------------------------------------------------------------------
@@ -132,19 +130,16 @@ int wxChoice::DoAppend(
     return nIndex;
 } // end of wxChoice::DoAppend
 
-int wxChoice::DoInsert(
-  const wxString&                   rsItem,
-  int                               pos
-)
+int wxChoice::DoInsert( const wxString& rsItem, unsigned int pos )
 {
     wxCHECK_MSG(!(GetWindowStyle() & wxCB_SORT), -1, wxT("can't insert into sorted list"));
-    wxCHECK_MSG((pos>=0) && (pos<=GetCount()), -1, wxT("invalid index"));
+    wxCHECK_MSG(IsValidInsert(pos), -1, wxT("invalid index"));
 
     if (pos == GetCount())
         return DoAppend(rsItem);
 
-    int                             nIndex;
-    LONG                            nIndexType = 0;
+    int  nIndex;
+    LONG nIndexType = 0;
 
     if (m_windowStyle & wxLB_SORT)
         nIndexType = LIT_SORTASCENDING;
@@ -158,11 +153,15 @@ int wxChoice::DoInsert(
     return nIndex;
 } // end of wxChoice::DoInsert
 
-void wxChoice::Delete(
-  int                               n
-)
+void wxChoice::Delete(unsigned int n)
 {
-    wxCHECK_RET( n < GetCount(), wxT("invalid item index in wxChoice::Delete") );
+    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
 
@@ -177,6 +176,17 @@ void wxChoice::Clear()
 // ----------------------------------------------------------------------------
 
 int wxChoice::GetSelection() const
+{
+    // if m_lastAcceptedSelection is set, it means that the dropdown is
+    // currently shown and that we want to use the last "permanent" selection
+    // instead of whatever is under the mouse pointer currently
+    //
+    // otherwise, get the selection from the control
+    return m_lastAcceptedSelection == wxID_NONE ? GetCurrentSelection()
+                                                : m_lastAcceptedSelection;
+}
+
+int wxChoice::GetCurrentSelection() const
 {
     return((int)LONGFROMMR(::WinSendMsg(GetHwnd(), LM_QUERYSELECTION, (MPARAM)LIT_FIRST, (MPARAM)0)));
 } // end of wxChoice::GetSelection
@@ -196,43 +206,15 @@ void wxChoice::SetSelection(
 // string list functions
 // ----------------------------------------------------------------------------
 
-int wxChoice::GetCount() const
+unsigned int wxChoice::GetCount() const
 {
-    return((int)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
 
-int wxChoice::FindString(
-  const wxString&                   rsStr
-) const
+void wxChoice::SetString(unsigned int n, const wxString& rsStr)
 {
-    int                             nPos;
-    int                             nTextLength;
-    PSZ                             zStr;
-    int                             nItemCount;
-
-    nItemCount = (int)LONGFROMMR(::WinSendMsg(GetHwnd(), LM_QUERYITEMCOUNT, (MPARAM)0, (MPARAM)0));
-    for (nPos = 0; nPos < nItemCount; nPos++)
-    {
-        nTextLength = (int)LONGFROMMR(::WinSendMsg(GetHwnd(), LM_QUERYITEMTEXTLENGTH, (MPARAM)nPos, (MPARAM)0));
-        zStr = new char[nTextLength + 1];
-        ::WinSendMsg(GetHwnd(), LM_QUERYITEMTEXT, MPFROM2SHORT((SHORT)nPos, (SHORT)nTextLength), (MPARAM)zStr);
-        if (rsStr == (wxChar*)zStr)
-        {
-            delete [] zStr;
-            break;
-        }
-        delete [] zStr;
-    }
-    return nPos;
-} // end of wxChoice::FindString
-
-void wxChoice::SetString(
-  int                               n
-, const wxString&                   rsStr
-)
-{
-    LONG                            nIndexType = 0;
-    void*                           pData;
+    LONG  nIndexType = 0;
+    void* pData;
 
     if ( m_clientDataItemsType != wxClientData_None )
     {
@@ -257,19 +239,15 @@ void wxChoice::SetString(
 
     if (pData)
     {
-        DoSetItemClientData( n
-                            ,pData
-                           );
+        DoSetItemClientData(n, pData);
     }
 } // end of wxChoice::SetString
 
-wxString wxChoice::GetString(
-  int                               n
-) const
+wxString wxChoice::GetString(unsigned int n) const
 {
-    int                             nLen = 0;
-    wxString                        sStr = wxEmptyString;
-    wxChar*                         zBuf;
+    int      nLen = 0;
+    wxString sStr = wxEmptyString;
+    wxChar*  zBuf;
 
     nLen = (size_t)LONGFROMMR(::WinSendMsg(GetHwnd(), LM_QUERYITEMTEXTLENGTH, (MPARAM)n, (MPARAM)0));
     if (nLen != LIT_ERROR && nLen > 0)
@@ -290,35 +268,23 @@ wxString wxChoice::GetString(
 // 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
 
-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);
-} // end of wxChoice::DoSetItemClientData
+} // end of wxChoice::DoGetItemClientData
 
-void wxChoice::DoSetItemClientObject(
-  int                               n
-, wxClientData*                     pClientData
-)
+void wxChoice::DoSetItemClientObject(unsigned int n, wxClientData* pClientData)
 {
-    DoSetItemClientData( n
-                        ,pClientData
-                       );
+    DoSetItemClientData(n, pClientData);
 } // end of wxChoice::DoSetItemClientObject
 
-wxClientData* wxChoice::DoGetItemClientObject(
-  int                               n
-) const
+wxClientData* wxChoice::DoGetItemClientObject(unsigned int n) const
 {
     return (wxClientData *)DoGetItemClientData(n);
 } // end of wxChoice::DoGetItemClientObject
@@ -327,13 +293,11 @@ wxClientData* wxChoice::DoGetItemClientObject(
 // wxOS2 specific helpers
 // ----------------------------------------------------------------------------
 
-void wxChoice::DoSetSize(
-  int                               nX
-, int                               nY
-, int                               nWidth
-, int                               nHeight
-, int                               nSizeFlags
-)
+void wxChoice::DoSetSize(int nX,
+                         int nY,
+                         int nWidth,
+                         int WXUNUSED(nHeight),
+                         int nSizeFlags)
 {
     //
     // Ignore height parameter because height doesn't mean 'initially
@@ -345,7 +309,7 @@ void wxChoice::DoSetSize(
     wxControl::DoSetSize( nX
                          ,nY
                          ,nWidth
-                         ,-1
+                         ,wxDefaultCoord
                          ,nSizeFlags
                         );
 } // end of wxChoice::DoSetSize
@@ -355,21 +319,18 @@ wxSize wxChoice::DoGetBestSize() const
     //
     // Find the widest string
     //
-    int                             nLineWidth;
-    int                             nChoiceWidth = 0;
-    int                             nItems = GetCount();
-    int                             nCx;
-    int                             nCy;
-    wxFont                          vFont = (wxFont)GetFont();
-
-    for (int i = 0; i < nItems; i++)
-    {
-        wxString                    sStr(GetString(i));
+    int    nLineWidth;
+    int    nChoiceWidth = 0;
+    int    nCx;
+    int    nCy;
+    wxFont vFont = (wxFont)GetFont();
 
-        GetTextExtent( sStr
-                      ,&nLineWidth
-                      ,NULL
-                     );
+    const unsigned int nItems = GetCount();
+
+    for (unsigned int i = 0; i < nItems; i++)
+    {
+        wxString sStr(GetString(i));
+        GetTextExtent( sStr, &nLineWidth, NULL );
         if (nLineWidth > nChoiceWidth)
             nChoiceWidth = nLineWidth;
     }
@@ -384,22 +345,16 @@ wxSize wxChoice::DoGetBestSize() const
     //
     // The combobox should be larger than the widest string
     //
-    wxGetCharSize( GetHWND()
-                  ,&nCx
-                  ,&nCy
-                  ,&vFont
-                 );
+    wxGetCharSize( GetHWND(), &nCx, &nCy, &vFont );
     nChoiceWidth += 5 * nCx;
 
     //
     // 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(
@@ -450,9 +405,9 @@ void wxChoice::Free()
 {
     if (HasClientObjectData())
     {
-        size_t                      nCount = GetCount();
+        const unsigned int nCount = GetCount();
 
-        for (size_t n = 0; n < nCount; n++)
+        for (unsigned int n = 0; n < nCount; n++)
         {
             delete GetClientObject(n);
         }