From 2702ed5a3d9eaee3c7b7d072716c8405191043de Mon Sep 17 00:00:00 2001 From: Julian Smart Date: Tue, 5 Sep 2000 11:39:14 +0000 Subject: [PATCH] Added rules to wxListCtrl (MSW now, GTK+ soon) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@8254 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/defs.h | 2 + include/wx/msw/listctrl.h | 6 +++ src/msw/listctrl.cpp | 79 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+) diff --git a/include/wx/defs.h b/include/wx/defs.h index 9959ec2d59..8743441215 100644 --- a/include/wx/defs.h +++ b/include/wx/defs.h @@ -1096,6 +1096,8 @@ enum wxStretch /* * wxListCtrl flags */ +#define wxLC_VRULES 0x0001 +#define wxLC_HRULES 0x0002 #define wxLC_ICON 0x0004 #define wxLC_SMALL_ICON 0x0008 #define wxLC_LIST 0x0010 diff --git a/include/wx/msw/listctrl.h b/include/wx/msw/listctrl.h index b918bb063a..91e526c88c 100644 --- a/include/wx/msw/listctrl.h +++ b/include/wx/msw/listctrl.h @@ -329,6 +329,11 @@ public: // still exist across 3 callbacks. wxChar *AddPool(const wxString& str); + // Event handlers + //////////////////////////////////////////////////////////////////////////// + // Necessary for drawing hrules and vrules, if specified + void OnPaint(wxPaintEvent& event); + protected: // common part of all ctors void Init(); @@ -356,6 +361,7 @@ private: bool DoCreateControl(int x, int y, int w, int h); DECLARE_DYNAMIC_CLASS(wxListCtrl) + DECLARE_EVENT_TABLE() }; #endif diff --git a/src/msw/listctrl.cpp b/src/msw/listctrl.cpp index 8d58bde1da..c785f4c165 100644 --- a/src/msw/listctrl.cpp +++ b/src/msw/listctrl.cpp @@ -78,6 +78,10 @@ static void wxConvertFromMSWListItem(const wxListCtrl *ctrl, wxListItem& info, L IMPLEMENT_DYNAMIC_CLASS(wxListCtrl, wxControl) IMPLEMENT_DYNAMIC_CLASS(wxListItem, wxObject) +BEGIN_EVENT_TABLE(wxListCtrl, wxControl) + EVT_PAINT(wxListCtrl::OnPaint) +END_EVENT_TABLE() + // ============================================================================ // implementation // ============================================================================ @@ -632,10 +636,14 @@ bool wxListCtrl::SetItem(wxListItem& info) // check whether it has any custom attributes if ( info.HasAttributes() ) { + 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; @@ -1128,10 +1136,14 @@ long wxListCtrl::InsertItem(wxListItem& info) // check whether it has any custom attributes if ( info.HasAttributes() ) { + 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; @@ -1674,6 +1686,73 @@ wxChar *wxListCtrl::AddPool(const wxString& str) 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 lastH = 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 // ---------------------------------------------------------------------------- -- 2.47.2