X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/aa61d3525370a9b9fa8c797d9b7f89d96994db5f..ada175836e7b9e456b7f32d82bfb5f6b21d5608d:/src/os2/listbox.cpp?ds=sidebyside diff --git a/src/os2/listbox.cpp b/src/os2/listbox.cpp index b8adb5cec7..2c636032e0 100644 --- a/src/os2/listbox.cpp +++ b/src/os2/listbox.cpp @@ -14,31 +14,32 @@ #if wxUSE_LISTBOX -#include "wx/window.h" -#include "wx/os2/private.h" +#include "wx/listbox.h" #ifndef WX_PRECOMP -#include "wx/listbox.h" -#include "wx/settings.h" -#include "wx/brush.h" -#include "wx/font.h" -#include "wx/dc.h" -#include "wx/dcscreen.h" -#include "wx/utils.h" -#include "wx/scrolwin.h" + #include "wx/dynarray.h" + #include "wx/settings.h" + #include "wx/brush.h" + #include "wx/font.h" + #include "wx/dc.h" + #include "wx/dcscreen.h" + #include "wx/utils.h" + #include "wx/scrolwin.h" + #include "wx/log.h" + #include "wx/window.h" #endif +#include "wx/os2/dcclient.h" +#include "wx/os2/private.h" + #define INCL_M #include -#include "wx/dynarray.h" -#include "wx/log.h" - #if wxUSE_OWNER_DRAWN #include "wx/ownerdrw.h" #endif - IMPLEMENT_DYNAMIC_CLASS(wxListBox, wxControl) +IMPLEMENT_DYNAMIC_CLASS(wxListBox, wxControlWithItems) // ============================================================================ // list box item declaration and implementation @@ -252,7 +253,7 @@ void wxListBox::DoSetFirstItem(int N) ::WinSendMsg(GetHwnd(), LM_SETTOPINDEX, MPFROMLONG(N), (MPARAM)0); } // end of wxListBox::DoSetFirstItem -void wxListBox::Delete(unsigned int n) +void wxListBox::DoDeleteOneItem(unsigned int n) { wxCHECK_RET( IsValid(n), wxT("invalid index in wxListBox::Delete") ); @@ -260,102 +261,66 @@ void wxListBox::Delete(unsigned int n) #if wxUSE_OWNER_DRAWN delete m_aItems[n]; m_aItems.RemoveAt(n); -#else // !wxUSE_OWNER_DRAWN - if (HasClientObjectData()) - { - delete GetClientObject(n); - } #endif // wxUSE_OWNER_DRAWN/!wxUSE_OWNER_DRAWN ::WinSendMsg(GetHwnd(), LM_DELETEITEM, (MPARAM)n, (MPARAM)0); m_nNumItems--; } // end of wxListBox::DoSetFirstItem -int wxListBox::DoAppend(const wxString& rsItem) +int wxListBox::DoInsertItems(const wxArrayStringsAdapter & items, + unsigned int pos, + void **clientData, + wxClientDataType type) { long lIndex = 0; LONG lIndexType = 0; + bool incrementPos = false; - if (m_windowStyle & wxLB_SORT) + if (IsSorted()) lIndexType = LIT_SORTASCENDING; - else + else if (pos == GetCount()) lIndexType = LIT_END; - - lIndex = (long)::WinSendMsg(GetHwnd(), LM_INSERTITEM, (MPARAM)lIndexType, (MPARAM)rsItem.c_str()); - m_nNumItems++; - -#if wxUSE_OWNER_DRAWN - if (m_windowStyle & wxLB_OWNERDRAW) + else { - wxOwnerDrawn* pNewItem = CreateItem(lIndex); // dummy argument - wxScreenDC vDc; - - - pNewItem->SetName(rsItem); - m_aItems.Insert(pNewItem, lIndex); - ::WinSendMsg(GetHwnd(), LM_SETITEMHANDLE, (MPARAM)lIndex, MPFROMP(pNewItem)); - pNewItem->SetFont(GetFont()); + lIndexType = (LONG)pos; + incrementPos = true; } -#endif - return (int)lIndex; -} // end of wxListBox::DoAppend -void wxListBox::DoSetItems( const wxArrayString& raChoices, - void** ppClientData ) -{ - BOOL bHideAndShow = IsShown(); - LONG lIndexType = 0; + int n = wxNOT_FOUND; - if (bHideAndShow) - { - ::WinShowWindow(GetHwnd(), FALSE); - } - ::WinSendMsg(GetHwnd(), LM_DELETEALL, (MPARAM)0, (MPARAM)0); - m_nNumItems = raChoices.GetCount(); - for (unsigned int i = 0; i < m_nNumItems; i++) + unsigned int count = items.GetCount(); + for (unsigned int i = 0; i < count; i++) { - if (m_windowStyle & wxLB_SORT) - lIndexType = LIT_SORTASCENDING; - else - lIndexType = LIT_END; - ::WinSendMsg(GetHwnd(), LM_INSERTITEM, (MPARAM)lIndexType, (MPARAM)raChoices[i].c_str()); - - if (ppClientData) + n = (int)::WinSendMsg(GetHwnd(), LM_INSERTITEM, (MPARAM)lIndexType, (MPARAM)items[i].wx_str()); + if (n < 0) { -#if wxUSE_OWNER_DRAWN - wxASSERT_MSG(ppClientData[i] == NULL, - wxT("Can't use client data with owner-drawn listboxes")); -#else // !wxUSE_OWNER_DRAWN - ::WinSendMsg(WinUtil_GetHwnd(), LM_SETITEMHANDLE, MPFROMLONG(lCount), MPFROMP(ppClientData[i])); -#endif // wxUSE_OWNER_DRAWN/!wxUSE_OWNER_DRAWN + wxLogLastError(wxT("WinSendMsg(LM_INSERTITEM)")); + n = wxNOT_FOUND; + break; } - } + ++m_nNumItems; #if wxUSE_OWNER_DRAWN - if ( m_windowStyle & wxLB_OWNERDRAW ) - { - // - // First delete old items - // - WX_CLEAR_ARRAY(m_aItems); - - // - // Then create new ones - // - for (unsigned int ui = 0; ui < m_nNumItems; ui++) + if (HasFlag(wxLB_OWNERDRAW)) { - wxOwnerDrawn* pNewItem = CreateItem(ui); + wxOwnerDrawn* pNewItem = CreateItem(n); // dummy argument + wxScreenDC vDc; // FIXME: is it really needed here? - pNewItem->SetName(raChoices[ui]); - m_aItems.Add(pNewItem); - ::WinSendMsg(GetHwnd(), LM_SETITEMHANDLE, MPFROMLONG(ui), MPFROMP(pNewItem)); + pNewItem->SetName(items[i]); + m_aItems.Insert(pNewItem, n); + pNewItem->SetFont(GetFont()); } +#endif + AssignNewItemClientData(n, clientData, i, type); + + if (incrementPos) + ++lIndexType; } -#endif // wxUSE_OWNER_DRAWN - ::WinShowWindow(GetHwnd(), TRUE); -} // end of wxListBox::DoSetItems -void wxListBox::Clear() + return n; +} // end of wxListBox::DoInsertAppendItemsWithData + +void wxListBox::DoClear() { #if wxUSE_OWNER_DRAWN unsigned int lUiCount = m_aItems.Count(); @@ -366,15 +331,7 @@ void wxListBox::Clear() } m_aItems.Clear(); -#else // !wxUSE_OWNER_DRAWN - if (HasClientObjectData()) - { - for (unsigned int n = 0; n < m_lNumItems; n++) - { - delete GetClientObject(n); - } - } -#endif // wxUSE_OWNER_DRAWN/!wxUSE_OWNER_DRAWN +#endif // wxUSE_OWNER_DRAWN ::WinSendMsg(GetHwnd(), LM_DELETEALL, (MPARAM)0, (MPARAM)0); m_nNumItems = 0; @@ -414,11 +371,6 @@ bool wxListBox::IsSelected( int N ) const return (lItem == (LONG)N && lItem != LIT_NONE); } // end of wxListBox::IsSelected -wxClientData* wxListBox::DoGetItemClientObject(unsigned int n) const -{ - return (wxClientData *)DoGetItemClientData(n); -} - void* wxListBox::DoGetItemClientData(unsigned int n) const { wxCHECK_MSG( IsValid(n), NULL, @@ -427,27 +379,11 @@ void* wxListBox::DoGetItemClientData(unsigned int n) const return((void *)::WinSendMsg(GetHwnd(), LM_QUERYITEMHANDLE, MPFROMLONG(n), (MPARAM)0)); } // end of wxListBox::DoGetItemClientData -void wxListBox::DoSetItemClientObject(unsigned int n, wxClientData* pClientData) -{ - DoSetItemClientData(n, pClientData); -} // end of wxListBox::DoSetItemClientObject - void wxListBox::DoSetItemClientData(unsigned int n, void* pClientData) { wxCHECK_RET( IsValid(n), wxT("invalid index in wxListBox::SetClientData") ); -#if wxUSE_OWNER_DRAWN - if ( m_windowStyle & wxLB_OWNERDRAW ) - { - // - // Client data must be pointer to wxOwnerDrawn, otherwise we would crash - // in OnMeasure/OnDraw. - // - wxFAIL_MSG(wxT("Can't use client data with owner-drawn listboxes")); - } -#endif // wxUSE_OWNER_DRAWN - ::WinSendMsg(GetHwnd(), LM_SETITEMHANDLE, MPFROMLONG(n), MPFROMP(pClientData)); } // end of wxListBox::DoSetItemClientData @@ -551,34 +487,6 @@ wxString wxListBox::GetString(unsigned int n) const return sResult; } // end of wxListBox::GetString -void wxListBox::DoInsertItems(const wxArrayString& asItems, unsigned int nPos) -{ - wxCHECK_RET( IsValidInsert(nPos), - wxT("invalid index in wxListBox::InsertItems") ); - - unsigned int nItems = asItems.GetCount(); - - for (unsigned int i = 0; i < nItems; i++) - { - int nIndex = (int)::WinSendMsg( GetHwnd(), - LM_INSERTITEM, - MPFROMLONG((LONG)(i + nPos)), - (MPARAM)asItems[i].c_str() ); - - wxOwnerDrawn* pNewItem = CreateItem(nIndex); - - pNewItem->SetName(asItems[i]); - pNewItem->SetFont(GetFont()); - m_aItems.Insert(pNewItem, nIndex); - ::WinSendMsg( GetHwnd() - ,LM_SETITEMHANDLE - ,(MPARAM)((LONG)nIndex) - ,MPFROMP(pNewItem) - ); - m_nNumItems += nItems; - } -} // end of wxListBox::DoInsertItems - void wxListBox::SetString(unsigned int n, const wxString& rsString) { wxCHECK_RET( IsValid(n), @@ -591,9 +499,9 @@ void wxListBox::SetString(unsigned int n, const wxString& rsString) void* pOldData = NULL; wxClientData* pOldObjData = NULL; - if (m_clientDataItemsType == wxClientData_Void) + if ( HasClientUntypedData() ) pOldData = GetClientData(n); - else if (m_clientDataItemsType == wxClientData_Object) + else if ( HasClientObjectData() ) pOldObjData = GetClientObject(n); // @@ -607,13 +515,13 @@ void wxListBox::SetString(unsigned int n, const wxString& rsString) int nNewN = n; - if (n == (int)(m_nNumItems - 1)) + if (n == (m_nNumItems - 1)) nNewN = -1; ::WinSendMsg( GetHwnd() ,LM_INSERTITEM ,(MPARAM)nNewN - ,(MPARAM)rsString.c_str() + ,(MPARAM)rsString.wx_str() ); // @@ -741,7 +649,7 @@ bool wxListBox::OS2Command( n = -1; } vEvent.SetInt(n); - return GetEventHandler()->ProcessEvent(vEvent); + return HandleWindowEvent(vEvent); } // end of wxListBox::OS2Command // ---------------------------------------------------------------------------- @@ -794,7 +702,6 @@ bool wxListBox::OS2OnDraw ( ) { POWNERITEM pDrawStruct = (POWNERITEM)pItem; - LONG lItemID = pDrawStruct->idItem; int eAction = 0; int eStatus = 0; @@ -807,24 +714,18 @@ bool wxListBox::OS2OnDraw ( // // The item may be -1 for an empty listbox // - if (lItemID == -1L) + if (pDrawStruct->idItem == -1L) return false; - wxListBoxItem* pData = (wxListBoxItem*)PVOIDFROMMR( ::WinSendMsg( GetHwnd() - ,LM_QUERYITEMHANDLE - ,MPFROMLONG(pDrawStruct->idItem) - ,(MPARAM)0 - ) - ); - - wxCHECK(pData, false ); + wxListBoxItem* pData = (wxListBoxItem*)m_aItems[pDrawStruct->idItem]; - wxDC vDc; + wxClientDC vDc(this); + wxPMDCImpl *impl = (wxPMDCImpl*) vDc.GetImpl(); wxPoint pt1( pDrawStruct->rclItem.xLeft, pDrawStruct->rclItem.yTop ); wxPoint pt2( pDrawStruct->rclItem.xRight, pDrawStruct->rclItem.yBottom ); wxRect vRect( pt1, pt2 ); - vDc.SetHPS(pDrawStruct->hps); + impl->SetHPS(pDrawStruct->hps); if (pDrawStruct->fsAttribute == pDrawStruct->fsAttributeOld) {