]> git.saurik.com Git - wxWidgets.git/commitdiff
applied Greg's refinment of hist treectrl patch
authorVáclav Slavík <vslavik@fastmail.fm>
Fri, 23 Nov 2001 19:39:04 +0000 (19:39 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Fri, 23 Nov 2001 19:39:04 +0000 (19:39 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@12626 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/treebase.h
src/generic/treectlg.cpp

index af9c822f9ee820a29ed501910554d6cbbcef3839..9ebd385512c912e45d3cf2ed6037758220e4091b 100644 (file)
@@ -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?
index 3176b1eb9280dd407f86ef7e2933c929381d3e47..2cf921e755f08fcbba4f98f462ab7cb86f595f12 100644 (file)
@@ -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);
             }