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
This commit is contained in:
Václav Slavík
2001-11-23 19:39:04 +00:00
parent 717510eb58
commit 2b84e565c6
2 changed files with 41 additions and 30 deletions

View File

@@ -110,22 +110,15 @@ enum wxTreeItemIcon
wxTreeItemIcon_Max 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 * wxTreeCtrl flags
*/ */
// TODO: maybe renumber these? // TODO: maybe renumber these?
#define wxTR_NO_BUTTONS 0x0000 // for convenience #define wxTR_NO_BUTTONS 0x0000 // for convenience
#define wxTR_HAS_BUTTONS 0x0004 // generates a +/- button #define wxTR_HAS_BUTTONS 0x0001 // generates a +/- button
#define wxTR_TWIST_BUTTONS 0x0008 // twister buttons #define wxTR_TWIST_BUTTONS 0x0002 // generates a twister button
#define wxTR_NO_LINES 0x0100 // don't generate level connectors #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_MAC_BUTTONS wxTR_TWIST_BUTTONS // backward compatibility
#define wxTR_SINGLE 0x0000 // for convenience #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_EXTENDED 0x0040 // TODO: allow extended selection
#define wxTR_EDIT_LABELS 0x0200 // can edit item labels #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_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 #define wxTR_HAS_VARIABLE_ROW_HEIGHT 0x0080 // what it says
// TODO: different default styles for wxGTK, wxMotif, whatever? // TODO: different default styles for wxGTK, wxMotif, whatever?

View File

@@ -108,7 +108,6 @@ public:
wxGenericTreeItem() { m_data = NULL; } wxGenericTreeItem() { m_data = NULL; }
wxGenericTreeItem( wxGenericTreeItem *parent, wxGenericTreeItem( wxGenericTreeItem *parent,
const wxString& text, const wxString& text,
wxDC& dc,
int image, int image,
int selImage, int selImage,
wxTreeItemData *data ); wxTreeItemData *data );
@@ -366,7 +365,6 @@ void wxTreeTextCtrl::OnKillFocus( wxFocusEvent &WXUNUSED(event) )
wxGenericTreeItem::wxGenericTreeItem(wxGenericTreeItem *parent, wxGenericTreeItem::wxGenericTreeItem(wxGenericTreeItem *parent,
const wxString& text, const wxString& text,
wxDC& WXUNUSED(dc),
int image, int selImage, int image, int selImage,
wxTreeItemData *data) wxTreeItemData *data)
: m_text(text) : 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 m_dirty = TRUE; // do this first so stuff below doesn't cause flicker
wxClientDC dc(this);
wxGenericTreeItem *item = wxGenericTreeItem *item =
new wxGenericTreeItem( parent, text, dc, image, selImage, data ); new wxGenericTreeItem( parent, text, image, selImage, data );
if ( data != NULL ) 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 m_dirty = TRUE; // do this first so stuff below doesn't cause flicker
wxClientDC dc(this); m_anchor = new wxGenericTreeItem((wxGenericTreeItem *)NULL, text,
m_anchor = new wxGenericTreeItem((wxGenericTreeItem *)NULL, text, dc,
image, selImage, data); image, selImage, data);
if (HasFlag(wxTR_HIDE_ROOT)) if (HasFlag(wxTR_HIDE_ROOT))
{ {
@@ -1889,10 +1885,26 @@ void wxGenericTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxDC &dc, int level
} }
else if (level == 0) else if (level == 0)
{ {
// always expand hidden root
int origY = y;
wxArrayGenericTreeItems& children = item->GetChildren(); wxArrayGenericTreeItems& children = item->GetChildren();
size_t n, count = children.Count(); int count = children.Count();
for (n = 0; n < count; ++n) if (count > 0)
PaintLevel(children[n], dc, 1, y); {
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; return;
} }
@@ -1913,18 +1925,20 @@ void wxGenericTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxDC &dc, int level
{ {
if (!HasFlag(wxTR_NO_LINES)) 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); 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); dc.DrawLine(x + 5, y_mid, x + m_spacing, y_mid);
} }
if (m_imageListButtons != NULL) if (m_imageListButtons != NULL)
{ {
// draw the image button here // draw the image button here
int image_h = 0, image_w = 0, image = wxCLOSED_BUTTON; int image_h = 0, image_w = 0, image = wxTreeItemIcon_Normal;
if (item->IsExpanded()) image = wxOPEN_BUTTON; if (item->IsExpanded()) image = wxTreeItemIcon_Expanded;
if (item->IsSelected()) if (item->IsSelected())
image += wxOPEN_BUTTON_SELECTED - wxOPEN_BUTTON; image += wxTreeItemIcon_Selected - wxTreeItemIcon_Normal;
m_imageListButtons->GetSize(image, image_w, image_h); m_imageListButtons->GetSize(image, image_w, image_h);
int xx = x - (image_w>>1); int xx = x - (image_w>>1);
int yy = y_mid - (image_h>>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 // draw the horizontal line here
int x_start = x; int x_start = x;
if (x > (signed)m_indent || HasFlag(wxTR_LINES_AT_ROOT)) if (x > (signed)m_indent)
x_start -= 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); 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)) 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_top, 10000, y_top);
dc.DrawLine(0, y, 10000, y); 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); PaintLevel(children[n], dc, level, y);
} while (++n < count); } while (++n < count);
if (!HasFlag(wxTR_NO_LINES)) if (!HasFlag(wxTR_NO_LINES) && count > 1)
{ {
// draw line down to last child // draw line down to last child
oldY += GetLineHeight(children[n-1])/2; oldY += GetLineHeight(children[n-1])>>1;
if (HasButtons()) y_mid += 5; if (HasButtons()) y_mid += 5;
dc.DrawLine(x, y_mid, x, oldY); dc.DrawLine(x, y_mid, x, oldY);
} }