X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b3260bce473ab247edd8ca1d3aee4eb648b4b97e..cc5de8fe047e00cf3fbaa16b3a02a9aac7caf16e:/src/os2/choice.cpp diff --git a/src/os2/choice.cpp b/src/os2/choice.cpp index 21bdbb4151..770da88ccc 100644 --- a/src/os2/choice.cpp +++ b/src/os2/choice.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: choice.cpp +// Name: src/os2/choice.cpp // Purpose: wxChoice // Author: David Webster // Modified by: @@ -12,8 +12,11 @@ // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.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" @@ -23,6 +26,23 @@ IMPLEMENT_DYNAMIC_CLASS(wxChoice, wxControl) +bool wxChoice::Create( + wxWindow* pParent +, wxWindowID vId +, const wxPoint& rPos +, const wxSize& rSize +, const wxArrayString& asChoices +, long lStyle +, const wxValidator& rValidator +, const wxString& rsName +) +{ + wxCArrayString chs(asChoices); + + return Create(pParent, vId, rPos, rSize, chs.GetCount(), chs.GetStrings(), + lStyle, rValidator, rsName); +} + bool wxChoice::Create( wxWindow* pParent , wxWindowID vId @@ -31,31 +51,28 @@ bool wxChoice::Create( , int n , const wxString asChoices[] , long lStyle -#if wxUSE_VALIDATORS , const wxValidator& rValidator -#endif , const wxString& rsName ) { long lSstyle; - if (!OS2CreateControl( pParent - ,vId - ,rPos - ,rSize - ,lStyle -#if wxUSE_VALIDATORS - ,rValidator -#endif - ,rsName - )) - return FALSE; + if (!CreateControl( pParent + ,vId + ,rPos + ,rSize + ,lStyle + ,rValidator + ,rsName + )) + return false; lSstyle = CBS_DROPDOWNLIST | 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) && @@ -66,32 +83,40 @@ bool wxChoice::Create( if (!OS2CreateControl( wxT("COMBOBOX") ,lSstyle )) - return FALSE; + return false; // // A choice/combobox normally has a white background (or other, depending // 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; + + // 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); + SetBestFittingSize(wxSize(-1,nEditHeight+4)); // +2x2 for the border + + return true; } // end of wxChoice::Create +wxChoice::~wxChoice() +{ + Free(); +} + // ---------------------------------------------------------------------------- // adding/deleting items to/from the list // ---------------------------------------------------------------------------- @@ -101,9 +126,8 @@ int wxChoice::DoAppend( ) { int nIndex; - SHORT nIndexType = 0; - - if (m_windowStyle & wxLB_SORT) + LONG nIndexType = 0; + if (m_windowStyle & wxCB_SORT) nIndexType = LIT_SORTASCENDING; else nIndexType = LIT_END; @@ -115,11 +139,38 @@ int wxChoice::DoAppend( return nIndex; } // end of wxChoice::DoAppend -void wxChoice::Delete( - int n -) +int wxChoice::DoInsert( const wxString& rsItem, unsigned int pos ) { - wxCHECK_RET( n < GetCount(), wxT("invalid item index in wxChoice::Delete") ); + 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() + ); + return nIndex; +} // end of wxChoice::DoInsert + +void wxChoice::Delete(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 @@ -153,61 +204,53 @@ 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; + LONG nIndexType = 0; + void* pData; - nItemCount = (int)LONGFROMMR(::WinSendMsg(GetHwnd(), LM_QUERYITEMCOUNT, (MPARAM)0, (MPARAM)0)); - for (nPos = 0; nPos < nItemCount; nPos++) + if ( m_clientDataItemsType != wxClientData_None ) { - 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 == (char*)zStr) - { - delete [] zStr; - break; - } - delete [] zStr; + pData = DoGetItemClientData(n); + } + else // no client data + { + pData = NULL; } - return nPos; -} // end of wxChoice::FindString -void wxChoice::SetString( - int n -, const wxString& rsStr -) -{ - wxFAIL_MSG(wxT("not implemented")); + ::WinSendMsg(GetHwnd(), LM_DELETEITEM, (MPARAM)n, 0); -#if 0 // should do this, but no Insert() so far - Delete(n); - Insert(n + 1, s); -#endif + if (m_windowStyle & wxCB_SORT) + nIndexType = LIT_SORTASCENDING; + else + nIndexType = LIT_END; + ::WinSendMsg( GetHwnd() + ,LM_INSERTITEM + ,(MPARAM)nIndexType + ,(MPARAM)rsStr.c_str() + ); + + if (pData) + { + DoSetItemClientData(n, pData); + } } // end of wxChoice::SetString -wxString wxChoice::GetString( - int n -) const +wxString wxChoice::GetString(unsigned int n) const { - size_t nLen = 0; - wxString sStr = ""; - char* zBuf; + int nLen = 0; + wxString sStr = wxEmptyString; + wxChar* zBuf; nLen = (size_t)LONGFROMMR(::WinSendMsg(GetHwnd(), LM_QUERYITEMTEXTLENGTH, (MPARAM)n, (MPARAM)0)); - if (nLen) + if (nLen != LIT_ERROR && nLen > 0) { - zBuf = new char[nLen + 1]; + zBuf = new wxChar[++nLen]; ::WinSendMsg( GetHwnd() ,LM_QUERYITEMTEXT ,MPFROM2SHORT((SHORT)n, (SHORT)nLen) @@ -223,35 +266,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 @@ -260,25 +291,23 @@ 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 // displayed' height, it refers to the drop-down menu as well. The - // wxWindows interpretation is different; also, getting the size returns + // wxWidgets interpretation is different; also, getting the size returns // the _displayed_ size (NOT the drop down menu size) so // setting-getting-setting size would not work. // wxControl::DoSetSize( nX ,nY ,nWidth - ,-1 + ,wxDefaultCoord ,nSizeFlags ); } // end of wxChoice::DoSetSize @@ -288,20 +317,18 @@ wxSize wxChoice::DoGetBestSize() const // // Find the widest string // - int nLineWidth; - int nChoiceWidth = 0; - int nItems = GetCount(); - int nCx; - int nCy; + int nLineWidth; + int nChoiceWidth = 0; + int nCx; + int nCy; + wxFont vFont = (wxFont)GetFont(); - for (int i = 0; i < nItems; i++) - { - wxString sStr(GetString(i)); + 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; } @@ -316,22 +343,16 @@ wxSize wxChoice::DoGetBestSize() const // // The combobox should be larger than the widest string // - wxGetCharSize( GetHWND() - ,&nCx - ,&nCy - ,(wxFont*)&GetFont() - ); + 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( @@ -356,7 +377,7 @@ bool wxChoice::OS2Command( // // "selection changed" is the only event we're after // - return FALSE; + return false; } int n = GetSelection(); @@ -368,25 +389,27 @@ bool wxChoice::OS2Command( vEvent.SetInt(n); vEvent.SetEventObject(this); - vEvent.SetString((char*)GetStringSelection().c_str()); + vEvent.SetString(GetStringSelection()); if (HasClientObjectData()) vEvent.SetClientObject(GetClientObject(n)); else if (HasClientUntypedData()) vEvent.SetClientData(GetClientData(n)); ProcessCommand(vEvent); } - return TRUE; + return true; } // end of wxChoice::OS2Command 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); } } -} // end of wxhoice::Free +} // end of wxChoice::Free + +#endif // wxUSE_CHOICE