#include "wx/window.h"
#endif
+#include "wx/os2/dcclient.h"
#include "wx/os2/private.h"
#define INCL_M
#include "wx/ownerdrw.h"
#endif
-IMPLEMENT_DYNAMIC_CLASS(wxListBox, wxControlWithItems)
-
// ============================================================================
// list box item declaration and implementation
// ============================================================================
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<wxListBoxItem*>(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
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()
#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--;
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;
}
#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);
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);
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
//
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
)
{
POWNERITEM pDrawStruct = (POWNERITEM)pItem;
- LONG lItemID = pDrawStruct->idItem;
int eAction = 0;
int eStatus = 0;
//
// 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)
{
return pData->OnDrawItem( vDc
,vRect
,(wxOwnerDrawn::wxODAction)eAction
- ,(wxOwnerDrawn::wxODStatus)eStatus
+ ,(wxOwnerDrawn::wxODStatus)(eStatus | wxOwnerDrawn::wxODHidePrefix)
);
} // end of wxListBox::OS2OnDraw