X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/74fd4fd42a1b530b346ff3b9518e1bdba7e813f4..6a8cbe1b9202ee5eb7a8bfa9b2ce66afeadfad6a:/src/os2/choice.cpp diff --git a/src/os2/choice.cpp b/src/os2/choice.cpp index cea4402332..9f0360a9fc 100644 --- a/src/os2/choice.cpp +++ b/src/os2/choice.cpp @@ -12,12 +12,11 @@ // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" -#include "wx/defs.h" - #if wxUSE_CHOICE +#include "wx/choice.h" + #ifndef WX_PRECOMP - #include "wx/choice.h" #include "wx/utils.h" #include "wx/log.h" #include "wx/settings.h" @@ -25,7 +24,7 @@ #include "wx/os2/private.h" -IMPLEMENT_DYNAMIC_CLASS(wxChoice, wxControl) +IMPLEMENT_DYNAMIC_CLASS(wxChoice, wxControlWithItems) bool wxChoice::Create( wxWindow* pParent @@ -71,8 +70,9 @@ bool wxChoice::Create( 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) && @@ -90,6 +90,8 @@ 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]); @@ -99,69 +101,75 @@ bool wxChoice::Create( ,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 +wxChoice::~wxChoice() +{ + 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 & wxLB_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, - 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")); - - if (pos == GetCount()) - return DoAppend(rsItem); - - int nIndex; - LONG nIndexType = 0; - - if (m_windowStyle & wxLB_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( - int n -) +void wxChoice::DoDeleteOneItem(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") ); + ::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 @@ -189,17 +197,17 @@ 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; - if ( m_clientDataItemsType != wxClientData_None ) + if ( HasClientData() ) { pData = DoGetItemClientData(n); } @@ -210,25 +218,23 @@ void wxChoice::SetString( int n, const wxString& rsStr ) ::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 - ,(MPARAM)rsStr.c_str() + ,(MPARAM)rsStr.wx_str() ); 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; @@ -237,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) { - zBuf = new wxChar[nLen + 1]; + zBuf = new wxChar[++nLen]; ::WinSendMsg( GetHwnd() ,LM_QUERYITEMTEXT ,MPFROM2SHORT((SHORT)n, (SHORT)nLen) @@ -253,38 +259,16 @@ 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 - -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 @@ -316,21 +300,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; } @@ -345,22 +326,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( @@ -407,17 +382,4 @@ bool wxChoice::OS2Command( return true; } // end of wxChoice::OS2Command -void wxChoice::Free() -{ - if (HasClientObjectData()) - { - size_t nCount = GetCount(); - - for (size_t n = 0; n < nCount; n++) - { - delete GetClientObject(n); - } - } -} // end of wxChoice::Free - #endif // wxUSE_CHOICE