// macros
// ----------------------------------------------------------------------------
-#if !USE_SHARED_LIBRARY
- IMPLEMENT_DYNAMIC_CLASS(wxListCtrl, wxControl)
- IMPLEMENT_DYNAMIC_CLASS(wxListItem, wxObject)
-#endif // USE_SHARED_LIBRARY
+IMPLEMENT_DYNAMIC_CLASS(wxListCtrl, wxControl)
+IMPLEMENT_DYNAMIC_CLASS(wxListItem, wxObject)
// ============================================================================
// implementation
// ============================================================================
+// ----------------------------------------------------------------------------
+// wxListEvent
+// ----------------------------------------------------------------------------
+
+void wxListEvent::CopyObject(wxObject& object_dest) const
+{
+ wxListEvent *obj = (wxListEvent *)&object_dest;
+
+ wxNotifyEvent::CopyObject(object_dest);
+
+ obj->m_code = m_code;
+ obj->m_itemIndex = m_itemIndex;
+ obj->m_oldItemIndex = m_oldItemIndex;
+ obj->m_col = m_col;
+ obj->m_cancelled = m_cancelled;
+ obj->m_pointDrag = m_pointDrag;
+ obj->m_item.m_mask = m_item.m_mask;
+ obj->m_item.m_itemId = m_item.m_itemId;
+ obj->m_item.m_col = m_item.m_col;
+ obj->m_item.m_state = m_item.m_state;
+ obj->m_item.m_stateMask = m_item.m_stateMask;
+ obj->m_item.m_text = m_item.m_text;
+ obj->m_item.m_image = m_item.m_image;
+ obj->m_item.m_data = m_item.m_data;
+ obj->m_item.m_format = m_item.m_format;
+ obj->m_item.m_width = m_item.m_width;
+
+ if ( m_item.HasAttributes() )
+ {
+ obj->m_item.SetTextColour(m_item.GetTextColour());
+ obj->m_item.SetBackgroundColour(m_item.GetBackgroundColour());
+ obj->m_item.SetFont(m_item.GetFont());
+ }
+}
+
// ----------------------------------------------------------------------------
// wxListCtrl construction
// ----------------------------------------------------------------------------
const wxValidator& validator,
const wxString& name)
{
+#if wxUSE_VALIDATORS
SetValidator(validator);
+#endif // wxUSE_VALIDATORS
+
SetName(name);
int x = pos.x;
wxListCtrl::~wxListCtrl()
{
- if (m_textCtrl)
+ if ( m_hasAnyAttr )
+ {
+ for ( wxNode *node = m_attrs.Next(); node; node = m_attrs.Next() )
+ {
+ delete (wxListItemAttr *)node->Data();
+ }
+ }
+
+ if ( m_textCtrl )
{
m_textCtrl->UnsubclassWin();
m_textCtrl->SetHWND(0);
// check whether it has any custom attributes
if ( info.HasAttributes() )
{
- // FIXME it should be...
- wxASSERT_MSG( !info.GetData(),
- _T("can't have custom attributes and client data") );
-
- item.mask |= LVIF_PARAM;
- item.lParam = (long)info.GetAttributes();
+ m_attrs.Put(item.iItem, (wxObject *)new wxListItemAttr(*info.GetAttributes()));
m_hasAnyAttr = TRUE;
}
- else if ( m_hasAnyAttr )
- {
- item.mask |= LVIF_PARAM;
- item.lParam = 0;
- }
item.cchTextMax = 0;
bool ok = ListView_SetItem(GetHwnd(), &item) != 0;
// check whether it has any custom attributes
if ( info.HasAttributes() )
{
- // FIXME it should be...
- wxASSERT_MSG( !info.GetData(),
- _T("can't have custom attributes and client data") );
-
- item.mask |= LVIF_PARAM;
- item.lParam = (long)info.GetAttributes();
+ m_attrs.Put(item.iItem, (wxObject *)new wxListItemAttr(*info.GetAttributes()));
m_hasAnyAttr = TRUE;
}
- else if ( m_hasAnyAttr )
- {
- item.mask |= LVIF_PARAM;
- item.lParam = 0;
- }
return (long) ListView_InsertItem(GetHwnd(), & item);
}
// return TRUE to suppress all additional LVN_DELETEITEM
// notifications - this makes deleting all items from a list ctrl
- // much faster (but we can't do it if we have any custom drawn
- // items because we need to delete their attributes in
- // LVN_DELETEITEM below)
- if ( !m_hasAnyAttr )
- {
- *result = TRUE;
+ // much faster
+ *result = TRUE;
- return TRUE;
- }
- break;
+ return TRUE;
case LVN_DELETEITEM:
{
if ( m_hasAnyAttr )
{
- wxListItemAttr *attr = (wxListItemAttr *)hdr->lParam;
- delete attr;
+ delete (wxListItemAttr *)m_attrs.Delete(hdr->iItem);
}
}
break;
}
// else translate it into wxEVT_COMMAND_LIST_ITEM_ACTIVATED event
+ // if it happened on an item (and not on empty place)
{
- eventType = wxEVT_COMMAND_LIST_ITEM_ACTIVATED;
NM_LISTVIEW* hdr = (NM_LISTVIEW*)lParam;
+ if ( hdr->iItem == -1 )
+ {
+ // not on item
+ return FALSE;
+ }
+
+ eventType = wxEVT_COMMAND_LIST_ITEM_ACTIVATED;
event.m_itemIndex = hdr->iItem;
}
break;
break;
#endif // 0
-#ifdef NM_CUSTOMDRAW
+#if defined(_WIN32_IE) && _WIN32_IE >= 0x300
case NM_CUSTOMDRAW:
{
LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)lParam;
NMCUSTOMDRAW& nmcd = lplvcd->nmcd;
switch( nmcd.dwDrawStage )
{
- case CDDS_PREPAINT :
+ case CDDS_PREPAINT:
// if we've got any items with non standard attributes,
// notify us before painting each item
*result = m_hasAnyAttr ? CDRF_NOTIFYITEMDRAW
case CDDS_ITEMPREPAINT:
{
- if ( !nmcd.lItemlParam )
+ wxListItemAttr *attr =
+ (wxListItemAttr *)m_attrs.Get(nmcd.dwItemSpec);
+
+ if ( !attr )
{
// nothing to do for this item
return CDRF_DODEFAULT;
}
- wxListItemAttr *attr =
- (wxListItemAttr *)nmcd.lItemlParam;
+ HFONT hFont;
+ wxColour colText, colBack;
+ if ( attr->HasFont() )
+ {
+ wxFont font = attr->GetFont();
+ hFont = (HFONT)font.GetResourceHandle();
+ }
+ else
+ {
+ hFont = 0;
+ }
+
+ if ( attr->HasTextColour() )
+ {
+ colText = attr->GetTextColour();
+ }
+ else
+ {
+ colText = GetTextColour();
+ }
+
+ if ( attr->HasBackgroundColour() )
+ {
+ colBack = attr->GetBackgroundColour();
+ }
+ else
+ {
+ colBack = GetBackgroundColour();
+ }
- ::SelectObject(nmcd.hdc,
- (HFONT)((wxFont &)attr->GetFont()).
- GetResourceHandle());
- lplvcd->clrText =
- wxColourToRGB(attr->GetTextColour());
- lplvcd->clrTextBk =
- wxColourToRGB(attr->GetBackgroundColour());
+ // note that if we wanted to set colours for
+ // individual columns (subitems), we would have
+ // returned CDRF_NOTIFYSUBITEMREDRAW from here
+ if ( hFont )
+ {
+ ::SelectObject(nmcd.hdc, hFont);
- // if we wanted to set colours for individual
- // columns (subitems), we would have returned
- // CDRF_NOTIFYSUBITEMREDRAW from here
- *result = CDRF_NEWFONT;
+ *result = CDRF_NEWFONT;
+ }
+ else
+ {
+ *result = CDRF_DODEFAULT;
+ }
+
+ lplvcd->clrText = wxColourToRGB(colText);
+ lplvcd->clrTextBk = wxColourToRGB(colBack);
return TRUE;
}
+
+ default:
+ *result = CDRF_DODEFAULT;
+ return TRUE;
}
}
break;
-#endif // NM_CUSTOMDRAW
+#endif // _WIN32_IE >= 0x300
default:
return wxControl::MSWOnNotify(idCtrl, lParam, result);
m_attr = NULL;
}
+void wxListItem::Clear()
+{
+ m_mask = 0;
+ m_itemId = 0;
+ m_col = 0;
+ m_state = 0;
+ m_stateMask = 0;
+ m_image = 0;
+ m_data = 0;
+ m_format = wxLIST_FORMAT_CENTRE;
+ m_width = 0;
+ m_text = wxEmptyString;
+
+ if (m_attr) delete m_attr;
+ m_attr = NULL;
+}
+
+void wxListItem::ClearAttributes()
+{
+ if (m_attr) delete m_attr;
+ m_attr = NULL;
+}
+
static void wxConvertFromMSWListItem(const wxListCtrl *ctrl, wxListItem& info, LV_ITEM& lvItem, HWND getFullInfo)
{
info.m_data = lvItem.lParam;