X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/11e62fe658531aaa2891351f19bd0a4c076717ae..8e1a5bf979fcdf82238b20cda1209a4f67f394c0:/src/os2/choice.cpp?ds=sidebyside diff --git a/src/os2/choice.cpp b/src/os2/choice.cpp index 8235ed3532..b8940322b3 100644 --- a/src/os2/choice.cpp +++ b/src/os2/choice.cpp @@ -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,12 +206,12 @@ 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 -void wxChoice::SetString( int n, const wxString& rsStr ) +void wxChoice::SetString(unsigned int n, const wxString& rsStr) { LONG nIndexType = 0; void* pData; @@ -229,13 +239,11 @@ void wxChoice::SetString( int n, const wxString& rsStr ) 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; @@ -260,35 +268,23 @@ wxString wxChoice::GetString(int n) const // 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 @@ -323,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(); + + const unsigned int nItems = GetCount(); - GetTextExtent( sStr - ,&nLineWidth - ,NULL - ); + for (unsigned int i = 0; i < nItems; i++) + { + wxString sStr(GetString(i)); + GetTextExtent( sStr, &nLineWidth, NULL ); if (nLineWidth > nChoiceWidth) nChoiceWidth = nLineWidth; } @@ -352,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( @@ -418,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); }