X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7798a18ec81d3733082bc60a958fac1d4510faca..cb6780ff0129b790a29c0660e936430b0b063db8:/src/generic/treectrl.cpp?ds=sidebyside diff --git a/src/generic/treectrl.cpp b/src/generic/treectrl.cpp index d1b0650a95..440747a71e 100644 --- a/src/generic/treectrl.cpp +++ b/src/generic/treectrl.cpp @@ -3,9 +3,9 @@ // Purpose: // Author: Robert Roebling // Created: 01/02/97 -// Id: +// Id: $Id$ // Copyright: (c) 1998 Robert Roebling, Julian Smart and Markus Holzem -// Licence: wxWindows licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #ifdef __GNUG__ @@ -14,6 +14,8 @@ #include "wx/treectrl.h" #include "wx/settings.h" +#include "wx/log.h" +#include //----------------------------------------------------------------------------- // wxTreeItem @@ -21,7 +23,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxTreeItem, wxObject) -wxTreeItem::wxTreeItem(void) +wxTreeItem::wxTreeItem() { m_mask = 0; m_itemId = 0; @@ -69,7 +71,7 @@ wxGenericTreeItem::wxGenericTreeItem( wxGenericTreeItem *parent, const wxTreeIte void wxGenericTreeItem::SetItem( const wxTreeItem &item, wxDC *dc ) { - if ((item.m_mask & wxTREE_MASK_HANDLE) == wxTREE_MASK_HANDLE) + if ((item.m_mask & wxTREE_MASK_HANDLE) == wxTREE_MASK_HANDLE) m_itemId = item.m_itemId; if ((item.m_mask & wxTREE_MASK_STATE) == wxTREE_MASK_STATE) m_state = item.m_state; @@ -100,7 +102,7 @@ void wxGenericTreeItem::SetText( const wxString &text, wxDC *dc ) m_height = lh; }; -void wxGenericTreeItem::Reset(void) +void wxGenericTreeItem::Reset() { m_itemId = -1; m_state = 0; @@ -118,6 +120,7 @@ void wxGenericTreeItem::Reset(void) m_yCross = 0; m_level = 0; m_children.DeleteContents( TRUE ); + m_isCollapsed = TRUE; m_parent = NULL; }; @@ -137,17 +140,20 @@ void wxGenericTreeItem::GetItem( wxTreeItem &item ) const item.m_data = m_data; }; -bool wxGenericTreeItem::HasChildren(void) +bool wxGenericTreeItem::HasChildren() { return m_hasChildren; }; -bool wxGenericTreeItem::HasPlus(void) +bool wxGenericTreeItem::HasPlus() { - return (m_hasChildren && (m_children.Number() == 0)); + if ( !HasChildren() ) + return FALSE; + + return !IsExpanded(); }; -int wxGenericTreeItem::NumberOfVisibleDescendents(void) +int wxGenericTreeItem::NumberOfVisibleDescendents() { int ret = m_children.Number(); wxNode *node = m_children.First(); @@ -160,9 +166,9 @@ int wxGenericTreeItem::NumberOfVisibleDescendents(void) return ret; }; -int wxGenericTreeItem::NumberOfVisibleChildren(void) +int wxGenericTreeItem::NumberOfVisibleChildren() { - return m_children.Number(); + return m_isCollapsed ? 0 : m_children.Number(); }; wxGenericTreeItem *wxGenericTreeItem::FindItem( long itemId ) const @@ -206,14 +212,13 @@ void wxGenericTreeItem::GetSize( int &x, int &y ) long wxGenericTreeItem::HitTest( const wxPoint& point, int &flags ) { - if (m_parent && ((point.y > m_y) && (point.y < m_y+m_height))) + if ((point.y > m_y) && (point.y < m_y+m_height)) { if ((point.x > m_xCross-5) && (point.x < m_xCross+5) && (point.y > m_yCross-5) && (point.y < m_yCross+5) && - (m_hasChildren) - ) + (m_hasChildren)) { flags = wxTREE_HITTEST_ONITEMBUTTON; return m_itemId; @@ -233,13 +238,16 @@ long wxGenericTreeItem::HitTest( const wxPoint& point, int &flags ) } else { - wxNode *node = m_children.First(); - while (node) + if (!m_isCollapsed) { - wxGenericTreeItem *child = (wxGenericTreeItem*)node->Data(); - long res = child->HitTest( point, flags ); - if (res != -1) return res; - node = node->Next(); + wxNode *node = m_children.First(); + while (node) + { + wxGenericTreeItem *child = (wxGenericTreeItem*)node->Data(); + long res = child->HitTest( point, flags ); + if (res != -1) return res; + node = node->Next(); + }; }; }; return -1; @@ -278,8 +286,7 @@ void wxGenericTreeItem::SendSelected( wxWindow *target ) void wxGenericTreeItem::SendDelete( wxWindow *target ) { - wxTreeEvent event( wxEVT_COMMAND_TREE_DELETE_ITEM, - target->GetId() ); + wxTreeEvent event( wxEVT_COMMAND_TREE_DELETE_ITEM, target->GetId() ); PrepareEvent( event ); event.SetEventObject( target ); target->ProcessEvent( event ); @@ -287,10 +294,29 @@ void wxGenericTreeItem::SendDelete( wxWindow *target ) void wxGenericTreeItem::SendExpand( wxWindow *target ) { - wxTreeEvent event( wxEVT_COMMAND_TREE_ITEM_EXPANDED, - target->GetId() ); + m_isCollapsed = FALSE; + + wxTreeEvent event( wxEVT_COMMAND_TREE_ITEM_EXPANDING, target->GetId() ); + event.SetEventObject( target ); PrepareEvent( event ); + target->ProcessEvent( event ); + + event.SetEventType(wxEVT_COMMAND_TREE_ITEM_EXPANDED); + PrepareEvent( event ); + target->ProcessEvent( event ); +}; + +void wxGenericTreeItem::SendCollapse( wxWindow *target ) +{ + m_isCollapsed = TRUE; + + wxTreeEvent event( wxEVT_COMMAND_TREE_ITEM_COLLAPSING, target->GetId() ); event.SetEventObject( target ); + PrepareEvent( event ); + target->ProcessEvent( event ); + + event.SetEventType(wxEVT_COMMAND_TREE_ITEM_COLLAPSED); + PrepareEvent( event ); target->ProcessEvent( event ); }; @@ -299,7 +325,7 @@ void wxGenericTreeItem::SetHilight( bool set ) m_hasHilight = set; }; -bool wxGenericTreeItem::HasHilight(void) +bool wxGenericTreeItem::HasHilight() { return m_hasHilight; }; @@ -308,8 +334,7 @@ bool wxGenericTreeItem::HasHilight(void) // wxTreeCtrl //----------------------------------------------------------------------------- -IMPLEMENT_DYNAMIC_CLASS(wxTreeCtrl,wxScrolledWindow -) +IMPLEMENT_DYNAMIC_CLASS(wxTreeCtrl,wxScrolledWindow) BEGIN_EVENT_TABLE(wxTreeCtrl,wxScrolledWindow) EVT_PAINT (wxTreeCtrl::OnPaint) @@ -319,7 +344,7 @@ BEGIN_EVENT_TABLE(wxTreeCtrl,wxScrolledWindow) EVT_KILL_FOCUS (wxTreeCtrl::OnKillFocus) END_EVENT_TABLE() -wxTreeCtrl::wxTreeCtrl(void) +wxTreeCtrl::wxTreeCtrl() { m_current = NULL; m_anchor = NULL; @@ -330,14 +355,14 @@ wxTreeCtrl::wxTreeCtrl(void) m_lineHeight = 10; m_indent = 15; m_isCreated = FALSE; - m_dc = NULL; m_hilightBrush = new wxBrush( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_HIGHLIGHT), wxSOLID ); + m_imageList = NULL; + m_smallImageList = NULL; }; -wxTreeCtrl::wxTreeCtrl(wxWindow *parent, const wxWindowID id, - const wxPoint& pos, - const wxSize& size, - const long style, const wxString& name ) +wxTreeCtrl::wxTreeCtrl(wxWindow *parent, wxWindowID id, + const wxPoint& pos, const wxSize& size, + long style, const wxString& name ) { m_current = NULL; m_anchor = NULL; @@ -348,21 +373,19 @@ wxTreeCtrl::wxTreeCtrl(wxWindow *parent, const wxWindowID id, m_lineHeight = 10; m_indent = 15; m_isCreated = FALSE; - m_dc = NULL; m_hilightBrush = new wxBrush( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_HIGHLIGHT), wxSOLID ); + m_imageList = NULL; + m_smallImageList = NULL; Create( parent, id, pos, size, style, name ); }; -wxTreeCtrl::~wxTreeCtrl(void) +wxTreeCtrl::~wxTreeCtrl() { - if (m_dc) delete m_dc; }; -bool wxTreeCtrl::Create(wxWindow *parent, const wxWindowID id, - const wxPoint& pos, - const wxSize& size, - const long style -, const wxString& name ) +bool wxTreeCtrl::Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos, const wxSize& size, + long style, const wxString& name ) { wxScrolledWindow::Create( parent, id, pos, size, style, name ); SetBackgroundColour( *wxWHITE ); @@ -370,14 +393,14 @@ bool wxTreeCtrl::Create(wxWindow *parent, const wxWindowID id, return TRUE; }; -int wxTreeCtrl::GetCount(void) const +int wxTreeCtrl::GetCount() const { if (!m_anchor) return 0; return m_anchor->NumberOfVisibleDescendents(); }; -long wxTreeCtrl::InsertItem( const long parent, const wxString& label, const int image, - const int selImage, const long WXUNUSED(insertAfter) ) +long wxTreeCtrl::InsertItem( long parent, const wxString& label, int image, + int selImage, long WXUNUSED(insertAfter) ) { wxGenericTreeItem *p = NULL; if (parent == 0) @@ -408,26 +431,31 @@ long wxTreeCtrl::InsertItem( const long parent, const wxString& label, const int item.m_selectedImage = selImage; item.m_mask |= wxTREE_MASK_SELECTED_IMAGE; }; - + wxClientDC dc(this); wxGenericTreeItem *new_child = new wxGenericTreeItem( p, item, &dc ); - if (p) + if (p) p->AddChild( new_child ); else m_anchor = new_child; - + if (p) { CalculatePositions(); - + + if (!p->HasChildren()) p->m_hasChildren = TRUE; + int ch = 0; GetClientSize( NULL, &ch ); + + PrepareDC( dc ); wxRectangle rect; - rect.x = 0; rect.y = 0; - rect.width = 10000; rect.height = ch; - - PrepareDC( dc ); + rect.x = dc.LogicalToDeviceX( 0 ); + rect.y = 0; + rect.width = 10000; + rect.height = ch; + if (p->m_children.Number() == 1) { rect.y = dc.LogicalToDeviceY( p->m_y ); @@ -438,27 +466,22 @@ long wxTreeCtrl::InsertItem( const long parent, const wxString& label, const int wxGenericTreeItem* last_child = (wxGenericTreeItem*)node->Data(); rect.y = dc.LogicalToDeviceY( last_child->m_y ); }; - - long doX = 0; - long doY = 0; - dc.GetDeviceOrigin( &doX, &doY ); - rect.height = ch-rect.y-doY; - + AdjustMyScrollbars(); - + if (rect.height > 0) Refresh( FALSE, &rect); } else { AdjustMyScrollbars(); - + Refresh(); }; - + return m_lastId; }; -long wxTreeCtrl::InsertItem( const long parent, wxTreeItem &info, const long WXUNUSED(insertAfter) ) +long wxTreeCtrl::InsertItem( long parent, wxTreeItem &info, long WXUNUSED(insertAfter) ) { int oldMask = info.m_mask; wxGenericTreeItem *p = NULL; @@ -487,26 +510,31 @@ long wxTreeCtrl::InsertItem( const long parent, wxTreeItem &info, const long WXU { ret = info.m_itemId; }; - + wxClientDC dc(this); wxGenericTreeItem *new_child = new wxGenericTreeItem( p, info, &dc ); - if (p) + if (p) p->AddChild( new_child ); else m_anchor = new_child; - + if (p) { CalculatePositions(); - + + if (!p->HasChildren()) p->m_hasChildren = TRUE; + int ch = 0; GetClientSize( NULL, &ch ); + + PrepareDC( dc ); wxRectangle rect; - rect.x = 0; rect.y = 0; - rect.width = 10000; rect.height = ch; - - PrepareDC( dc ); + rect.x = dc.LogicalToDeviceX( 0 ); + rect.y = 0; + rect.width = 10000; + rect.height = ch; + if (p->m_children.Number() == 1) { rect.y = dc.LogicalToDeviceY( p->m_y ); @@ -517,38 +545,36 @@ long wxTreeCtrl::InsertItem( const long parent, wxTreeItem &info, const long WXU wxGenericTreeItem* last_child = (wxGenericTreeItem*)node->Data(); rect.y = dc.LogicalToDeviceY( last_child->m_y ); }; - - long doX = 0; - long doY = 0; - dc.GetDeviceOrigin( &doX, &doY ); - rect.height = ch-rect.y-doY; - + AdjustMyScrollbars(); - + if (rect.height > 0) Refresh( FALSE, &rect); } else { AdjustMyScrollbars(); - + Refresh(); }; - + info.m_mask = oldMask; return ret; }; -bool wxTreeCtrl::ExpandItem( const long item, const int action ) +bool wxTreeCtrl::ExpandItem( long item, int action ) { wxGenericTreeItem *i = FindItem( item ); - if (!i) return FALSE; + if (!i) + return FALSE; + switch (action) { case wxTREE_EXPAND_EXPAND: { i->SendExpand( this ); break; - }; + } + case wxTREE_EXPAND_COLLAPSE_RESET: case wxTREE_EXPAND_COLLAPSE: { @@ -556,42 +582,67 @@ bool wxTreeCtrl::ExpandItem( const long item, const int action ) while (node) { wxGenericTreeItem *child = (wxGenericTreeItem*)node->Data(); - child->SendDelete( this ); - delete node; - node = i->m_children.First(); + if ( child->IsExpanded() ) + ExpandItem( child->m_itemId, wxTREE_EXPAND_COLLAPSE ); + node = node->Next(); }; - - int cw = 0; - int ch = 0; - GetClientSize( &cw, &ch ); - wxRect rect; - rect.x = 0; - rect.width = cw; - wxClientDC dc(this); - PrepareDC(dc); - rect.y = dc.LogicalToDeviceY( i->m_y ); - - long doY = 0; - dc.GetDeviceOrigin( NULL, &doY ); - rect.height = ch-rect.y-doY; - Refresh( TRUE, &rect ); - - AdjustMyScrollbars(); + + CalculatePositions(); + + i->SendCollapse( this ); break; - }; + } + case wxTREE_EXPAND_TOGGLE: { - if (i->HasPlus()) - ExpandItem( item, wxTREE_EXPAND_EXPAND ); - else + if ( i->IsExpanded() ) ExpandItem( item, wxTREE_EXPAND_COLLAPSE ); - break; - }; + else + ExpandItem( item, wxTREE_EXPAND_EXPAND ); + return TRUE; + } }; + + wxClientDC dc(this); + PrepareDC(dc); + + int cw = 0; + int ch = 0; + GetClientSize( &cw, &ch ); + + wxRect rect; + rect.x = dc.LogicalToDeviceX( 0 ); + rect.width = cw; + rect.y = dc.LogicalToDeviceY( i->m_y ); + rect.height = ch; + Refresh( TRUE, &rect ); + + AdjustMyScrollbars(); + return TRUE; }; -bool wxTreeCtrl::DeleteAllItems(void) +void wxTreeCtrl::DeleteItem( long item ) +{ + wxGenericTreeItem *pItem = FindItem( item ); + wxCHECK_RET( pItem != NULL, _("wxTreeCtrl::DeleteItem: no such pItem.") ); + + pItem->m_parent->m_children.DeleteObject(pItem); + + Refresh(); +} + +void wxTreeCtrl::DeleteChildren( long item ) +{ + wxGenericTreeItem *pItem = FindItem( item ); + wxCHECK_RET( pItem != NULL, _("wxTreeCtrl::DeleteChildren: no such pItem.") ); + + pItem->m_children.Clear(); + + Refresh(); +} + +bool wxTreeCtrl::DeleteAllItems() { delete m_anchor; m_anchor = NULL; @@ -607,21 +658,27 @@ bool wxTreeCtrl::GetItem( wxTreeItem &info ) const return TRUE; }; -long wxTreeCtrl::GetItemData( const long item ) const +long wxTreeCtrl::GetItemData( long item ) const { wxGenericTreeItem *i = FindItem( item ); if (!i) return 0; return i->m_data; }; -wxString wxTreeCtrl::GetItemText( const long item ) const +wxString wxTreeCtrl::GetItemText( long item ) const { wxGenericTreeItem *i = FindItem( item ); if (!i) return ""; return i->m_text; }; -long wxTreeCtrl::GetParent( const long item ) const +int wxTreeCtrl::GetItemImage(long item) const +{ + wxGenericTreeItem *i = FindItem( item ); + return i == 0 ? -1 : i->GetImage(); +} + +long wxTreeCtrl::GetParent( long item ) const { wxGenericTreeItem *i = FindItem( item ); if (!i) return -1; @@ -630,36 +687,62 @@ long wxTreeCtrl::GetParent( const long item ) const return i->m_parent->m_itemId; }; -long wxTreeCtrl::GetRootItem(void) const +long wxTreeCtrl::GetRootItem() const { if (m_anchor) return m_anchor->m_itemId; return -1; }; -long wxTreeCtrl::GetSelection(void) const +long wxTreeCtrl::GetSelection() const { - return 0; + return m_current ? m_current->GetItemId() : -1; }; -bool wxTreeCtrl::SelectItem( const long WXUNUSED(item) ) const +bool wxTreeCtrl::SelectItem(long itemId) { - return FALSE; + wxGenericTreeItem *pItem = FindItem(itemId); + if ( !pItem ) { + wxLogDebug(_("Can't select an item %d which doesn't exist."), itemId); + + return FALSE; + } + + SelectItem(pItem); + + return TRUE; }; -bool wxTreeCtrl::ItemHasChildren( const long item ) const +void wxTreeCtrl::SelectItem(wxGenericTreeItem *item) +{ + if (m_current != item) + { + if (m_current) + { + m_current->SetHilight( FALSE ); + RefreshLine( m_current ); + }; + m_current = item; + m_current->SetHilight( TRUE ); + RefreshLine( m_current ); + + m_current->SendSelected( this ); + } +} + +bool wxTreeCtrl::ItemHasChildren( long item ) const { wxGenericTreeItem *i = FindItem( item ); if (!i) return FALSE; return i->m_hasChildren; }; -void wxTreeCtrl::SetIndent( const int indent ) +void wxTreeCtrl::SetIndent( int indent ) { m_indent = indent; Refresh(); }; -int wxTreeCtrl::GetIndent(void) const +int wxTreeCtrl::GetIndent() const { return m_indent; }; @@ -670,10 +753,11 @@ bool wxTreeCtrl::SetItem( wxTreeItem &info ) if (!i) return FALSE; wxClientDC dc(this); i->SetItem( info, &dc ); + Refresh(); return TRUE; }; -bool wxTreeCtrl::SetItemData( const long item, const long data ) +bool wxTreeCtrl::SetItemData( long item, long data ) { wxGenericTreeItem *i = FindItem( item ); if (!i) return FALSE; @@ -681,7 +765,7 @@ bool wxTreeCtrl::SetItemData( const long item, const long data ) return TRUE; }; -bool wxTreeCtrl::SetItemText( const long item, const wxString &text ) +bool wxTreeCtrl::SetItemText( long item, const wxString &text ) { wxGenericTreeItem *i = FindItem( item ); if (!i) return FALSE; @@ -690,6 +774,15 @@ bool wxTreeCtrl::SetItemText( const long item, const wxString &text ) return TRUE; }; +void wxTreeCtrl::SetItemImage(long item, int image, int imageSel) const +{ + wxGenericTreeItem *i = FindItem( item ); + if ( i != 0 ) { + i->SetImage(image); + i->SetSelectedImage(imageSel); + } +} + long wxTreeCtrl::HitTest( const wxPoint& point, int &flags ) { flags = 0; @@ -697,7 +790,27 @@ long wxTreeCtrl::HitTest( const wxPoint& point, int &flags ) return m_anchor->HitTest( point, flags ); }; -void wxTreeCtrl::AdjustMyScrollbars(void) +wxImageList *wxTreeCtrl::GetImageList( int which ) const +{ + if (which == wxIMAGE_LIST_NORMAL) return m_imageList; + return m_smallImageList; +}; + +void wxTreeCtrl::SetImageList( wxImageList *imageList, int which ) +{ + if (which == wxIMAGE_LIST_NORMAL) + { + if (m_imageList) delete m_imageList; + m_imageList = imageList; + } + else + { + if (m_smallImageList) delete m_smallImageList; + m_smallImageList = imageList; + }; +}; + +void wxTreeCtrl::AdjustMyScrollbars() { if (m_anchor) { @@ -717,95 +830,107 @@ void wxTreeCtrl::AdjustMyScrollbars(void) void wxTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxPaintDC &dc, int level, int &y ) { - int horizX = level*m_indent+10; + int horizX = level*m_indent; + + item->m_x = horizX+33; + item->m_y = y-m_lineHeight/3; + item->m_height = m_lineHeight; + + item->SetCross( horizX+15, y ); + int oldY = y; - wxNode *node = item->m_children.First(); - while (node) + + int exposed_x = dc.LogicalToDeviceX( 0 ); + int exposed_y = dc.LogicalToDeviceY( item->m_y-2 ); + + if (IsExposed( exposed_x, exposed_y, 1000, m_lineHeight+4 )) { - wxGenericTreeItem *child = (wxGenericTreeItem *)node->Data(); - dc.SetPen( m_dottedPen ); - - child->SetCross( horizX+15, y ); - - if (!node->Next()) - { - if (level != 0) oldY -= (m_lineHeight-5); - dc.DrawLine( horizX, oldY, horizX, y ); - }; - - child->m_x = horizX+33; - child->m_y = y-m_lineHeight/3; - child->m_height = m_lineHeight; + int startX = horizX; + int endX = horizX + 10; + + if (!item->HasChildren()) endX += 20; - if (IsExposed( 0, child->m_y-2, 10000, m_lineHeight+4 )) - { - int startX,endX; - if ((node->Previous()) || (level != 0)) - startX = horizX; else startX = horizX-10; - if (child->HasChildren()) - endX = horizX+10; else endX = horizX+30; - dc.DrawLine( startX, y, endX, y ); - - if (child->HasChildren()) + dc.DrawLine( startX, y, endX, y ); + + if (item->HasChildren()) { dc.DrawLine( horizX+20, y, horizX+30, y ); dc.SetPen( *wxGREY_PEN ); dc.DrawRectangle( horizX+10, y-4, 11, 9 ); dc.SetPen( *wxBLACK_PEN ); - dc.DrawLine( horizX+13, y, horizX+17, y ); - if (child->HasPlus()) - dc.DrawLine( horizX+15, y-2, horizX+15, y+2 ); + dc.DrawLine( horizX+13, y, horizX+18, y ); + if (item->HasPlus()) + dc.DrawLine( horizX+15, y-2, horizX+15, y+3 ); }; - - if (child->HasHilight()) + + if (item->HasHilight()) { - dc.SetTextForeground( wxSystemSettings::GetSystemColour( wxSYS_COLOUR_HIGHLIGHTTEXT ) ); - dc.SetBrush( *m_hilightBrush ); - if (m_hasFocus) - dc.SetPen( wxBLACK_PEN ); - else - dc.SetPen( wxTRANSPARENT_PEN ); - long tw = 0; - long th = 0; - dc.GetTextExtent( child->m_text, &tw, &th ); - dc.DrawRectangle( child->m_x-2, child->m_y-2, tw+4, th+4 ); - }; - - dc.DrawText( child->m_text, child->m_x, child->m_y ); + dc.SetTextForeground( wxSystemSettings::GetSystemColour( wxSYS_COLOUR_HIGHLIGHTTEXT ) ); + dc.SetBrush( *m_hilightBrush ); + long tw, th; + dc.GetTextExtent( item->m_text, &tw, &th ); + if (m_hasFocus) + { + dc.SetPen( *wxBLACK_PEN ); + dc.DrawRectangle( item->m_x-2, item->m_y-2, tw+4, th+4 ); + } + else + { + dc.SetPen( *wxTRANSPARENT_PEN ); + dc.DrawRectangle( item->m_x-2, item->m_y-2, tw+4, th+4 ); + } + dc.DrawText( item->m_text, item->m_x, item->m_y ); - if (child->HasHilight()) + dc.SetPen( *wxBLACK_PEN ); + dc.SetTextForeground( *wxBLACK ); + dc.SetBrush( *wxWHITE_BRUSH ); + } + else { - dc.SetTextForeground( *wxBLACK ); - dc.SetBrush( *wxWHITE_BRUSH ); - dc.SetPen( *wxBLACK_PEN ); + dc.SetBrush( *wxWHITE_BRUSH ); + dc.SetPen( *wxTRANSPARENT_PEN ); + long tw, th; + dc.GetTextExtent( item->m_text, &tw, &th ); + dc.DrawRectangle( item->m_x-2, item->m_y-2, tw+4, th+4 ); + dc.DrawText( item->m_text, item->m_x, item->m_y ); + dc.SetPen( *wxBLACK_PEN ); }; - - }; - + }; + + if (item->NumberOfVisibleChildren() == 0) return; + + int semiOldY = y; + + wxNode *node = item->m_children.First(); + while (node) + { + wxGenericTreeItem *child = (wxGenericTreeItem *)node->Data(); + y += m_lineHeight; - if (child->NumberOfVisibleChildren() > 0) - PaintLevel( child, dc, level+1, y ); + semiOldY = y; + + PaintLevel( child, dc, level+1, y ); + node = node->Next(); }; -}; + + dc.DrawLine( horizX+15, oldY+5, horizX+15, semiOldY ); +} void wxTreeCtrl::OnPaint( const wxPaintEvent &WXUNUSED(event) ) { if (!m_anchor) return; - if (!m_dc) - { - m_dc = new wxPaintDC(this); - PrepareDC( *m_dc ); - }; - - m_dc->SetFont( wxSystemSettings::GetSystemFont( wxSYS_SYSTEM_FONT ) ); - - m_dc->SetPen( m_dottedPen ); - m_lineHeight = (int)(m_dc->GetCharHeight() + 4); - + wxPaintDC dc(this); + PrepareDC( dc ); + + dc.SetFont( wxSystemSettings::GetSystemFont( wxSYS_SYSTEM_FONT ) ); + + dc.SetPen( m_dottedPen ); + m_lineHeight = (int)(dc.GetCharHeight() + 4); + int y = m_lineHeight / 2 + 2; - PaintLevel( m_anchor, *m_dc, 0, y ); + PaintLevel( m_anchor, dc, 0, y ); }; void wxTreeCtrl::OnSetFocus( const wxFocusEvent &WXUNUSED(event) ) @@ -829,36 +954,27 @@ void wxTreeCtrl::OnMouse( const wxMouseEvent &event ) { if (!event.LeftDown() && !event.LeftDClick()) return; - + wxClientDC dc(this); PrepareDC(dc); long x = dc.DeviceToLogicalX( (long)event.GetX() ); long y = dc.DeviceToLogicalY( (long)event.GetY() ); - + int flag = 0; long id = HitTest( wxPoint(x,y), flag ); - if (id == -1) return; + if (id == -1) + return; wxGenericTreeItem *item = FindItem( id ); - + if (!item) return; if ((flag != wxTREE_HITTEST_ONITEMBUTTON) && (flag != wxTREE_HITTEST_ONITEMLABEL)) return; - - if (m_current != item) - { - if (m_current) - { - m_current->SetHilight( FALSE ); - RefreshLine( m_current ); - }; - m_current = item; - m_current->SetHilight( TRUE ); - RefreshLine( m_current ); - m_current->SendSelected( this ); - }; - - if (event.LeftDClick()) m_current->SendKeyDown( this ); - + + SelectItem(item); + + if (event.LeftDClick()) + m_current->SendKeyDown( this ); + if (flag == wxTREE_HITTEST_ONITEMBUTTON) { ExpandItem( item->m_itemId, wxTREE_EXPAND_TOGGLE ); @@ -868,43 +984,39 @@ void wxTreeCtrl::OnMouse( const wxMouseEvent &event ) void wxTreeCtrl::CalculateLevel( wxGenericTreeItem *item, wxPaintDC &dc, int level, int &y ) { - int horizX = level*m_indent+10; + int horizX = level*m_indent; + + item->m_x = horizX+33; + item->m_y = y-m_lineHeight/3-2; + item->m_height = m_lineHeight; + + if (item->NumberOfVisibleChildren() == 0) return; + wxNode *node = item->m_children.First(); while (node) { wxGenericTreeItem *child = (wxGenericTreeItem *)node->Data(); - dc.SetPen( m_dottedPen ); - - int startX,endX; - if ((node->Previous()) || (level != 0)) - startX = horizX; else startX = horizX-10; - if (child->HasChildren()) - endX = horizX+10; else endX = horizX+30; - - child->m_x = horizX+33; - child->m_y = y-m_lineHeight/3-2; - child->m_height = m_lineHeight; - + y += m_lineHeight; - if (child->NumberOfVisibleChildren() > 0) - CalculateLevel( child, dc, level+1, y ); - + CalculateLevel( child, dc, level+1, y ); + node = node->Next(); }; }; -void wxTreeCtrl::CalculatePositions(void) +void wxTreeCtrl::CalculatePositions() { - if (!m_anchor) return; - + if (!m_anchor) + return; + wxClientDC dc(this); PrepareDC( dc ); - + dc.SetFont( wxSystemSettings::GetSystemFont( wxSYS_SYSTEM_FONT ) ); - + dc.SetPen( m_dottedPen ); m_lineHeight = (int)(dc.GetCharHeight() + 4); - + int y = m_lineHeight / 2 + 2; CalculateLevel( m_anchor, dc, 0, y ); }; @@ -924,7 +1036,7 @@ void wxTreeCtrl::RefreshLine( wxGenericTreeItem *item ) rect.x = dc.LogicalToDeviceX( item->m_x-2 ); rect.y = dc.LogicalToDeviceY( item->m_y-2 ); rect.width = 1000; - rect.height = dc.GetCharHeight()+4; + rect.height = dc.GetCharHeight()+6; Refresh( TRUE, &rect ); };