X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b1294ada8e87725409f290328da02306e5c8f4eb..3225a4b8b8656f25dac6cb20684a3c2c273cf796:/src/os2/listbox.cpp diff --git a/src/os2/listbox.cpp b/src/os2/listbox.cpp index 334fd18f48..c3018a0314 100644 --- a/src/os2/listbox.cpp +++ b/src/os2/listbox.cpp @@ -29,6 +29,7 @@ #include "wx/window.h" #endif +#include "wx/os2/dcclient.h" #include "wx/os2/private.h" #define INCL_M @@ -38,8 +39,6 @@ #include "wx/ownerdrw.h" #endif -IMPLEMENT_DYNAMIC_CLASS(wxListBox, wxControlWithItems) - // ============================================================================ // list box item declaration and implementation // ============================================================================ @@ -49,25 +48,25 @@ IMPLEMENT_DYNAMIC_CLASS(wxListBox, wxControlWithItems) class wxListBoxItem : public wxOwnerDrawn { public: - wxListBoxItem(const wxString& rsStr = wxEmptyString); -}; + wxListBoxItem(wxListBox *parent) + { m_parent = parent; } -wxListBoxItem::wxListBoxItem( - const wxString& rsStr -) -: wxOwnerDrawn( rsStr - ,false - ) -{ - // - // No bitmaps/checkmarks - // - SetMarginWidth(0); -} // end of wxListBoxItem::wxListBoxItem + wxListBox *GetParent() const + { return m_parent; } + + int GetIndex() const + { return m_parent->GetItemIndex(const_cast(this)); } + + wxString GetName() const + { return m_parent->GetString(GetIndex()); } + +private: + wxListBox *m_parent; +}; wxOwnerDrawn* wxListBox::CreateItem( size_t WXUNUSED(n) ) { - return new wxListBoxItem(); + return new wxListBoxItem(this); } // end of wxListBox::CreateItem #endif //USE_OWNER_DRAWN @@ -224,14 +223,7 @@ bool wxListBox::Create( wxWindow* pParent, wxListBox::~wxListBox() { -#if wxUSE_OWNER_DRAWN - size_t lUiCount = m_aItems.Count(); - - while (lUiCount-- != 0) - { - delete m_aItems[lUiCount]; - } -#endif // wxUSE_OWNER_DRAWN + Clear(); } // end of wxListBox::~wxListBox void wxListBox::SetupColours() @@ -260,7 +252,7 @@ void wxListBox::DoDeleteOneItem(unsigned int n) #if wxUSE_OWNER_DRAWN delete m_aItems[n]; m_aItems.RemoveAt(n); -#endif // wxUSE_OWNER_DRAWN/!wxUSE_OWNER_DRAWN +#endif // wxUSE_OWNER_DRAWN ::WinSendMsg(GetHwnd(), LM_DELETEITEM, (MPARAM)n, (MPARAM)0); m_nNumItems--; @@ -293,7 +285,7 @@ int wxListBox::DoInsertItems(const wxArrayStringsAdapter & items, n = (int)::WinSendMsg(GetHwnd(), LM_INSERTITEM, (MPARAM)lIndexType, (MPARAM)items[i].wx_str()); if (n < 0) { - wxLogLastError(_T("WinSendMsg(LM_INSERTITEM)")); + wxLogLastError(wxT("WinSendMsg(LM_INSERTITEM)")); n = wxNOT_FOUND; break; } @@ -302,13 +294,9 @@ int wxListBox::DoInsertItems(const wxArrayStringsAdapter & items, #if wxUSE_OWNER_DRAWN if (HasFlag(wxLB_OWNERDRAW)) { - wxOwnerDrawn* pNewItem = CreateItem(n); // dummy argument - wxScreenDC vDc; // FIXME: is it really needed here? - - pNewItem->SetName(items[i]); - m_aItems.Insert(pNewItem, n); - ::WinSendMsg(GetHwnd(), LM_SETITEMHANDLE, (MPARAM)n, MPFROMP(pNewItem)); + wxOwnerDrawn* pNewItem = CreateItem(n); // dummy argument pNewItem->SetFont(GetFont()); + m_aItems.Insert(pNewItem, n); } #endif AssignNewItemClientData(n, clientData, i, type); @@ -323,14 +311,10 @@ int wxListBox::DoInsertItems(const wxArrayStringsAdapter & items, void wxListBox::DoClear() { #if wxUSE_OWNER_DRAWN - unsigned int lUiCount = m_aItems.Count(); - - while (lUiCount-- != 0) + if ( m_windowStyle & wxLB_OWNERDRAW ) { - delete m_aItems[lUiCount]; + WX_CLEAR_ARRAY(m_aItems); } - - m_aItems.Clear(); #endif // wxUSE_OWNER_DRAWN ::WinSendMsg(GetHwnd(), LM_DELETEALL, (MPARAM)0, (MPARAM)0); @@ -384,17 +368,6 @@ 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 @@ -510,9 +483,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); // @@ -548,14 +521,6 @@ void wxListBox::SetString(unsigned int n, const wxString& rsString) // if (bWasSelected) Select(n); - -#if wxUSE_OWNER_DRAWN - if (m_windowStyle & wxLB_OWNERDRAW) - // - // Update item's text - // - m_aItems[n]->SetName(rsString); -#endif //USE_OWNER_DRAWN } // end of wxListBox::SetString unsigned int wxListBox::GetCount() const @@ -660,7 +625,7 @@ bool wxListBox::OS2Command( n = -1; } vEvent.SetInt(n); - return GetEventHandler()->ProcessEvent(vEvent); + return HandleWindowEvent(vEvent); } // end of wxListBox::OS2Command // ---------------------------------------------------------------------------- @@ -713,7 +678,6 @@ bool wxListBox::OS2OnDraw ( ) { POWNERITEM pDrawStruct = (POWNERITEM)pItem; - LONG lItemID = pDrawStruct->idItem; int eAction = 0; int eStatus = 0; @@ -726,24 +690,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) { @@ -811,7 +769,7 @@ bool wxListBox::OS2OnDraw ( return pData->OnDrawItem( vDc ,vRect ,(wxOwnerDrawn::wxODAction)eAction - ,(wxOwnerDrawn::wxODStatus)eStatus + ,(wxOwnerDrawn::wxODStatus)(eStatus | wxOwnerDrawn::wxODHidePrefix) ); } // end of wxListBox::OS2OnDraw