#ifdef __GNUG__
#pragma implementation "listctrl.h"
+ #pragma implementation "listctrlbase.h"
#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/msw/private.h"
-#if defined(__GNUWIN32__) && !defined(wxUSE_NORLANDER_HEADERS)
+#ifdef __GNUWIN32_OLD__
#include "wx/msw/gnuwin32/extra.h"
#else
#include <commctrl.h>
// 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()
+void wxListCtrl::FreeAllAttrs(bool dontRecreate)
{
if ( m_hasAnyAttr )
{
{
delete (wxListItemAttr *)node->Data();
}
+
+ m_attrs.Destroy();
+ if ( !dontRecreate )
+ {
+ m_attrs.Create(wxKEY_INTEGER, 1000); // just as def ctor
+ }
+
+ m_hasAnyAttr = FALSE;
}
+}
+
+wxListCtrl::~wxListCtrl()
+{
+ FreeAllAttrs(TRUE /* no need to recreate hash any more */);
if ( m_textCtrl )
{
// accessors
// ----------------------------------------------------------------------------
-// Sets the background colour (GetBackgroundColour already implicit in
-// wxWindow class)
+// Sets the foreground, i.e. text, colour
+bool wxListCtrl::SetForegroundColour(const wxColour& col)
+{
+ if ( !wxWindow::SetForegroundColour(col) )
+ return FALSE;
+
+ ListView_SetTextColor(GetHwnd(), wxColourToRGB(col));
+
+ return TRUE;
+}
+
+// Sets the background colour
bool wxListCtrl::SetBackgroundColour(const wxColour& col)
{
if ( !wxWindow::SetBackgroundColour(col) )
return FALSE;
- ListView_SetBkColor(GetHwnd(), PALETTERGB(col.Red(), col.Green(), col.Blue()));
+ // we set the same colour for both the "empty" background and the items
+ // background
+ COLORREF color = wxColourToRGB(col);
+ ListView_SetBkColor(GetHwnd(), color);
+ ListView_SetTextBkColor(GetHwnd(), color);
return TRUE;
}
// visible area of the list control (list or report view)
// or the total number of items in the list control (icon
// or small icon view)
-int wxListCtrl::GetCountPerPage(void) const
+int wxListCtrl::GetCountPerPage() const
{
return ListView_GetCountPerPage(GetHwnd());
}
// Gets the edit control for editing labels.
-wxTextCtrl* wxListCtrl::GetEditControl(void) const
+wxTextCtrl* wxListCtrl::GetEditControl() const
{
return m_textCtrl;
}
}
// Gets the number of items in the list control
-int wxListCtrl::GetItemCount(void) const
+int wxListCtrl::GetItemCount() const
{
return ListView_GetItemCount(GetHwnd());
}
}
// Gets the number of selected items in the list control
-int wxListCtrl::GetSelectedItemCount(void) const
+int wxListCtrl::GetSelectedItemCount() const
{
return ListView_GetSelectedCount(GetHwnd());
}
// Gets the text colour of the listview
-wxColour wxListCtrl::GetTextColour(void) const
+wxColour wxListCtrl::GetTextColour() const
{
COLORREF ref = ListView_GetTextColor(GetHwnd());
wxColour col(GetRValue(ref), GetGValue(ref), GetBValue(ref));
// Gets the index of the topmost visible item when in
// list or report view
-long wxListCtrl::GetTopItem(void) const
+long wxListCtrl::GetTopItem() const
{
return (long) ListView_GetTopIndex(GetHwnd());
}
}
case LVN_DELETEALLITEMS:
- // what's the sense of generating a wxWin event for this when
- // it's absolutely not portable?
-#if 0
eventType = wxEVT_COMMAND_LIST_DELETE_ALL_ITEMS;
event.m_itemIndex = -1;
-#endif // 0
- // return TRUE to suppress all additional LVN_DELETEITEM
- // notifications - this makes deleting all items from a list ctrl
- // much faster
- *result = TRUE;
+ FreeAllAttrs();
- return TRUE;
+ break;
case LVN_DELETEITEM:
{
if ( m_hasAnyAttr )
{
- delete m_attrs.Delete(hdr->iItem);
+ 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;
}
}
break;
-#endif // NM_CUSTOMDRAW
+#endif // _WIN32_IE >= 0x300
default:
return wxControl::MSWOnNotify(idCtrl, lParam, result);
switch ( (int)nmhdr->code )
{
+ case LVN_DELETEALLITEMS:
+ // always return TRUE to suppress all additional LVN_DELETEITEM
+ // notifications - this makes deleting all items from a list ctrl
+ // much faster
+ *result = TRUE;
+
+ return TRUE;
+
case LVN_GETDISPINFO:
{
LV_DISPINFO *info = (LV_DISPINFO *)lParam;
*result = event.IsAllowed();
return TRUE;
}
- default:
- break;
}
*result = !event.IsAllowed();
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;