From 2b84e565c6c26711e245bab5d4ce0fe1fe3e4078 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=A1clav=20Slav=C3=ADk?= Date: Fri, 23 Nov 2001 19:39:04 +0000 Subject: [PATCH] applied Greg's refinment of hist treectrl patch git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@12626 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/treebase.h | 18 ++++---------- src/generic/treectlg.cpp | 53 +++++++++++++++++++++++++++------------- 2 files changed, 41 insertions(+), 30 deletions(-) diff --git a/include/wx/treebase.h b/include/wx/treebase.h index af9c822f9e..9ebd385512 100644 --- a/include/wx/treebase.h +++ b/include/wx/treebase.h @@ -110,22 +110,15 @@ enum wxTreeItemIcon wxTreeItemIcon_Max }; -enum wxButtonImage // effectively the same as wxTreeItemIcon -{ - wxCLOSED_BUTTON = 0, // closed, not selected - wxCLOSED_BUTTON_SELECTED, // closed, selected - wxOPEN_BUTTON, // open, not selected - wxOPEN_BUTTON_SELECTED // open, selected -}; - /* * wxTreeCtrl flags */ // TODO: maybe renumber these? #define wxTR_NO_BUTTONS 0x0000 // for convenience -#define wxTR_HAS_BUTTONS 0x0004 // generates a +/- button -#define wxTR_TWIST_BUTTONS 0x0008 // twister buttons -#define wxTR_NO_LINES 0x0100 // don't generate level connectors +#define wxTR_HAS_BUTTONS 0x0001 // generates a +/- button +#define wxTR_TWIST_BUTTONS 0x0002 // generates a twister button +#define wxTR_NO_LINES 0x0004 // don't generate level connectors +#define wxTR_LINES_AT_ROOT 0x0008 // connect top-level nodes #define wxTR_MAC_BUTTONS wxTR_TWIST_BUTTONS // backward compatibility #define wxTR_SINGLE 0x0000 // for convenience @@ -133,9 +126,8 @@ enum wxButtonImage // effectively the same as wxTreeItemIcon #define wxTR_EXTENDED 0x0040 // TODO: allow extended selection #define wxTR_EDIT_LABELS 0x0200 // can edit item labels -#define wxTR_LINES_AT_ROOT 0x0010 // specific to wxMSW -#define wxTR_HIDE_ROOT 0x0800 // don't display root node #define wxTR_ROW_LINES 0x0400 // put border around items +#define wxTR_HIDE_ROOT 0x0800 // don't display root node #define wxTR_HAS_VARIABLE_ROW_HEIGHT 0x0080 // what it says // TODO: different default styles for wxGTK, wxMotif, whatever? diff --git a/src/generic/treectlg.cpp b/src/generic/treectlg.cpp index 3176b1eb92..2cf921e755 100644 --- a/src/generic/treectlg.cpp +++ b/src/generic/treectlg.cpp @@ -108,7 +108,6 @@ public: wxGenericTreeItem() { m_data = NULL; } wxGenericTreeItem( wxGenericTreeItem *parent, const wxString& text, - wxDC& dc, int image, int selImage, wxTreeItemData *data ); @@ -366,7 +365,6 @@ void wxTreeTextCtrl::OnKillFocus( wxFocusEvent &WXUNUSED(event) ) wxGenericTreeItem::wxGenericTreeItem(wxGenericTreeItem *parent, const wxString& text, - wxDC& WXUNUSED(dc), int image, int selImage, wxTreeItemData *data) : m_text(text) @@ -1077,9 +1075,8 @@ wxTreeItemId wxGenericTreeCtrl::DoInsertItem(const wxTreeItemId& parentId, m_dirty = TRUE; // do this first so stuff below doesn't cause flicker - wxClientDC dc(this); wxGenericTreeItem *item = - new wxGenericTreeItem( parent, text, dc, image, selImage, data ); + new wxGenericTreeItem( parent, text, image, selImage, data ); if ( data != NULL ) { @@ -1099,8 +1096,7 @@ wxTreeItemId wxGenericTreeCtrl::AddRoot(const wxString& text, m_dirty = TRUE; // do this first so stuff below doesn't cause flicker - wxClientDC dc(this); - m_anchor = new wxGenericTreeItem((wxGenericTreeItem *)NULL, text, dc, + m_anchor = new wxGenericTreeItem((wxGenericTreeItem *)NULL, text, image, selImage, data); if (HasFlag(wxTR_HIDE_ROOT)) { @@ -1889,10 +1885,26 @@ void wxGenericTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxDC &dc, int level } else if (level == 0) { + // always expand hidden root + int origY = y; wxArrayGenericTreeItems& children = item->GetChildren(); - size_t n, count = children.Count(); - for (n = 0; n < count; ++n) - PaintLevel(children[n], dc, 1, y); + int count = children.Count(); + if (count > 0) + { + int n = 0, oldY; + do { + oldY = y; + PaintLevel(children[n], dc, 1, y); + } while (++n < count); + + if (!HasFlag(wxTR_NO_LINES) && HasFlag(wxTR_LINES_AT_ROOT) && count > 1) + { + // draw line down to last child + origY += GetLineHeight(children[0])>>1; + oldY += GetLineHeight(children[n-1])>>1; + dc.DrawLine(3, origY, 3, oldY); + } + } return; } @@ -1913,18 +1925,20 @@ void wxGenericTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxDC &dc, int level { if (!HasFlag(wxTR_NO_LINES)) { - if (x > (signed)m_indent || HasFlag(wxTR_LINES_AT_ROOT)) + if (x > (signed)m_indent) dc.DrawLine(x - m_indent, y_mid, x - 5, y_mid); + else if (HasFlag(wxTR_LINES_AT_ROOT)) + dc.DrawLine(3, y_mid, x - 5, y_mid); dc.DrawLine(x + 5, y_mid, x + m_spacing, y_mid); } if (m_imageListButtons != NULL) { // draw the image button here - int image_h = 0, image_w = 0, image = wxCLOSED_BUTTON; - if (item->IsExpanded()) image = wxOPEN_BUTTON; + int image_h = 0, image_w = 0, image = wxTreeItemIcon_Normal; + if (item->IsExpanded()) image = wxTreeItemIcon_Expanded; if (item->IsSelected()) - image += wxOPEN_BUTTON_SELECTED - wxOPEN_BUTTON; + image += wxTreeItemIcon_Selected - wxTreeItemIcon_Normal; m_imageListButtons->GetSize(image, image_w, image_h); int xx = x - (image_w>>1); int yy = y_mid - (image_h>>1); @@ -1980,8 +1994,10 @@ void wxGenericTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxDC &dc, int level { // draw the horizontal line here int x_start = x; - if (x > (signed)m_indent || HasFlag(wxTR_LINES_AT_ROOT)) + if (x > (signed)m_indent) x_start -= m_indent; + else if (HasFlag(wxTR_LINES_AT_ROOT)) + x_start = 3; dc.DrawLine(x_start, y_mid, x + m_spacing, y_mid); } @@ -2016,7 +2032,10 @@ void wxGenericTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxDC &dc, int level if (HasFlag(wxTR_ROW_LINES)) { - dc.SetPen(*wxWHITE_PEN); + // if the background colour is white, choose a + // contrasting color for the lines + dc.SetPen(*((GetBackgroundColour() == *wxWHITE) + ? wxMEDIUM_GREY_PEN : wxWHITE_PEN)); dc.DrawLine(0, y_top, 10000, y_top); dc.DrawLine(0, y, 10000, y); } @@ -2040,10 +2059,10 @@ void wxGenericTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxDC &dc, int level PaintLevel(children[n], dc, level, y); } while (++n < count); - if (!HasFlag(wxTR_NO_LINES)) + if (!HasFlag(wxTR_NO_LINES) && count > 1) { // draw line down to last child - oldY += GetLineHeight(children[n-1])/2; + oldY += GetLineHeight(children[n-1])>>1; if (HasButtons()) y_mid += 5; dc.DrawLine(x, y_mid, x, oldY); }