#include "wx/textctrl.h"
#include "wx/imaglist.h"
-
#include "wx/listctrl.h"
+#include "wx/dcclient.h"
#include "wx/msw/private.h"
IMPLEMENT_DYNAMIC_CLASS(wxListCtrl, wxControl)
IMPLEMENT_DYNAMIC_CLASS(wxListItem, wxObject)
+BEGIN_EVENT_TABLE(wxListCtrl, wxControl)
+ EVT_PAINT(wxListCtrl::OnPaint)
+END_EVENT_TABLE()
+
// ============================================================================
// implementation
// ============================================================================
m_imageListNormal = NULL;
m_imageListSmall = NULL;
m_imageListState = NULL;
+ m_ownsImageListNormal = m_ownsImageListSmall = m_ownsImageListState = FALSE;
m_baseStyle = 0;
m_colCount = 0;
m_textCtrl = NULL;
delete m_textCtrl;
m_textCtrl = NULL;
}
+
+ if (m_ownsImageListNormal) delete m_imageListNormal;
+ if (m_ownsImageListSmall) delete m_imageListSmall;
+ if (m_ownsImageListState) delete m_imageListState;
}
// ----------------------------------------------------------------------------
if (info.m_mask & wxLIST_MASK_DATA)
lvItem.mask |= LVIF_PARAM;
+ if (info.m_mask & wxLIST_MASK_IMAGE)
+ lvItem.mask |= LVIF_IMAGE;
+
if ( info.m_mask & wxLIST_MASK_STATE )
{
lvItem.mask |= LVIF_STATE;
// check whether it has any custom attributes
if ( info.HasAttributes() )
{
- m_attrs.Delete(item.iItem); // remove existing attributes
- m_attrs.Put(item.iItem, (wxObject *)new wxListItemAttr(*info.GetAttributes()));
+
+ wxListItemAttr *attr;
+ attr = (wxListItemAttr*) m_attrs.Get(item.iItem);
+
+ if (attr == NULL)
+
+ m_attrs.Put(item.iItem, (wxObject *)new wxListItemAttr(*info.GetAttributes()));
+
+ else *attr = *info.GetAttributes();
m_hasAnyAttr = TRUE;
}
rect.x = rect2.left;
rect.y = rect2.top;
rect.width = rect2.right - rect2.left;
- rect.height = rect2.bottom - rect2.left;
+ rect.height = rect2.bottom - rect2.top;
return success;
}
if ( which == wxIMAGE_LIST_NORMAL )
{
flags = LVSIL_NORMAL;
+ if (m_ownsImageListNormal) delete m_imageListNormal;
m_imageListNormal = imageList;
+ m_ownsImageListNormal = FALSE;
}
else if ( which == wxIMAGE_LIST_SMALL )
{
flags = LVSIL_SMALL;
+ if (m_ownsImageListSmall) delete m_imageListSmall;
m_imageListSmall = imageList;
+ m_ownsImageListSmall = FALSE;
}
else if ( which == wxIMAGE_LIST_STATE )
{
flags = LVSIL_STATE;
+ if (m_ownsImageListState) delete m_imageListState;
m_imageListState = imageList;
+ m_ownsImageListState = FALSE;
}
ListView_SetImageList(GetHwnd(), (HIMAGELIST) imageList ? imageList->GetHIMAGELIST() : 0, flags);
}
+void wxListCtrl::AssignImageList(wxImageList *imageList, int which)
+{
+ SetImageList(imageList, which);
+ if ( which == wxIMAGE_LIST_NORMAL )
+ m_ownsImageListNormal = TRUE;
+ else if ( which == wxIMAGE_LIST_SMALL )
+ m_ownsImageListSmall = TRUE;
+ else if ( which == wxIMAGE_LIST_STATE )
+ m_ownsImageListState = TRUE;
+}
+
// ----------------------------------------------------------------------------
// Operations
// ----------------------------------------------------------------------------
// check whether it has any custom attributes
if ( info.HasAttributes() )
{
- m_attrs.Put(item.iItem, (wxObject *)new wxListItemAttr(*info.GetAttributes()));
+
+ wxListItemAttr *attr;
+ attr = (wxListItemAttr*) m_attrs.Get(item.iItem);
+
+ if (attr == NULL)
+
+ m_attrs.Put(item.iItem, (wxObject *)new wxListItemAttr(*info.GetAttributes()));
+
+ else *attr = *info.GetAttributes();
m_hasAnyAttr = TRUE;
}
return (wxChar *)node->Data();
}
+// Necessary for drawing hrules and vrules, if specified
+void wxListCtrl::OnPaint(wxPaintEvent& event)
+{
+ wxPaintDC dc(this);
+
+ wxControl::OnPaint(event);
+
+ // Reset the device origin since it may have been set
+ dc.SetDeviceOrigin(0, 0);
+
+ bool drawHRules = ((GetWindowStyle() & wxLC_HRULES) != 0);
+ bool drawVRules = ((GetWindowStyle() & wxLC_VRULES) != 0);
+
+ if (!drawHRules && !drawVRules)
+ return;
+ if ((GetWindowStyle() & wxLC_REPORT) == 0)
+ return;
+
+ wxPen pen(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DLIGHT), 1, wxSOLID);
+ dc.SetPen(pen);
+ dc.SetBrush(* wxTRANSPARENT_BRUSH);
+
+ wxSize clientSize = GetClientSize();
+ wxRect itemRect;
+ int cy=0;
+
+ int itemCount = GetItemCount();
+ int i;
+ for (i = 0; i < itemCount; i++)
+ {
+ if (GetItemRect(i, itemRect))
+ {
+ cy = itemRect.GetTop();
+ if (i != 0) // Don't draw the first one
+ {
+ dc.DrawLine(0, cy, clientSize.x, cy);
+
+ // Draw last line
+ if (i == (GetItemCount() - 1))
+ {
+ cy = itemRect.GetBottom();
+ dc.DrawLine(0, cy, clientSize.x, cy);
+ }
+ }
+ }
+ }
+ i = (GetItemCount() - 1);
+ if (drawVRules && (i > -1))
+ {
+ wxRect firstItemRect;
+ GetItemRect(0, firstItemRect);
+
+ if (GetItemRect(i, itemRect))
+ {
+ int col;
+ int x = itemRect.GetX();
+ for (col = 0; col < GetColumnCount(); col++)
+ {
+ int colWidth = GetColumnWidth(col);
+ x += colWidth ;
+ dc.DrawLine(x, firstItemRect.GetY() - 2, x, itemRect.GetBottom());
+ }
+ }
+ }
+}
+
// ----------------------------------------------------------------------------
// wxListItem
// ----------------------------------------------------------------------------