X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4c6819972f9536b2508dd21100eb0c09ed8350a9..246037e22990a4719c672c2e2a8b62b99cc4d49c:/src/generic/treectrl.cpp diff --git a/src/generic/treectrl.cpp b/src/generic/treectrl.cpp index 91f7733f4f..bd94192309 100644 --- a/src/generic/treectrl.cpp +++ b/src/generic/treectrl.cpp @@ -3,7 +3,7 @@ // Purpose: // Author: Robert Roebling // Created: 01/02/97 -// Id: +// Id: $Id$ // Copyright: (c) 1998 Robert Roebling, Julian Smart and Markus Holzem // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -14,6 +14,7 @@ #include "wx/treectrl.h" #include "wx/settings.h" +#include "wx/log.h" //----------------------------------------------------------------------------- // wxTreeItem @@ -236,13 +237,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; @@ -352,6 +356,8 @@ wxTreeCtrl::wxTreeCtrl() 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, wxWindowID id, @@ -369,6 +375,8 @@ wxTreeCtrl::wxTreeCtrl(wxWindow *parent, wxWindowID id, 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 ); }; @@ -437,6 +445,8 @@ long wxTreeCtrl::InsertItem( long parent, const wxString& label, int image, { CalculatePositions(); + if (!p->HasChildren()) p->m_hasChildren = TRUE; + int ch = 0; GetClientSize( NULL, &ch ); @@ -516,6 +526,8 @@ long wxTreeCtrl::InsertItem( long parent, wxTreeItem &info, long WXUNUSED(insert { CalculatePositions(); + if (!p->HasChildren()) p->m_hasChildren = TRUE; + int ch = 0; GetClientSize( NULL, &ch ); @@ -581,6 +593,8 @@ bool wxTreeCtrl::ExpandItem( long item, int action ) node = node->Next(); }; + CalculatePositions(); + i->SendCollapse( this ); break; } @@ -619,9 +633,9 @@ 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(); } @@ -629,9 +643,9 @@ void wxTreeCtrl::DeleteChildren( long item ) { wxGenericTreeItem *pItem = FindItem( item ); wxCHECK_RET( pItem != NULL, "wxTreeCtrl::DeleteChildren: no such pItem." ); - + pItem->m_children.Clear(); - + Refresh(); } @@ -688,14 +702,41 @@ long wxTreeCtrl::GetRootItem() const long wxTreeCtrl::GetSelection() const { - return 0; + return m_current ? m_current->GetItemId() : -1; }; -bool wxTreeCtrl::SelectItem( 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, FALSE /* no events */); + + return TRUE; }; +void wxTreeCtrl::SelectItem(wxGenericTreeItem *item, bool bDoEvents) +{ + if (m_current != item) + { + if (m_current) + { + m_current->SetHilight( FALSE ); + RefreshLine( m_current ); + }; + m_current = item; + m_current->SetHilight( TRUE ); + RefreshLine( m_current ); + + if ( bDoEvents ) + m_current->SendSelected( this ); + } +} + bool wxTreeCtrl::ItemHasChildren( long item ) const { wxGenericTreeItem *i = FindItem( item ); @@ -757,6 +798,26 @@ long wxTreeCtrl::HitTest( const wxPoint& point, int &flags ) return m_anchor->HitTest( point, flags ); }; +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) @@ -778,22 +839,22 @@ void wxTreeCtrl::AdjustMyScrollbars() void wxTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxPaintDC &dc, int level, int &y ) { 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; - + if (IsExposed( 0, item->m_y-2, 10000, m_lineHeight+4 )) { int startX = horizX; int endX = horizX + 10; if (!item->HasChildren()) endX += 20; - dc.DrawLine( startX, y, endX, y ); + dc.DrawLine( startX, y, endX, y ); if (item->HasChildren()) { @@ -810,22 +871,27 @@ void wxTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxPaintDC &dc, int level, { 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( *wxWHITE_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.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 ); dc.SetPen( *wxBLACK_PEN ); dc.SetTextForeground( *wxBLACK ); - dc.SetBrush( *wxWHITE_BRUSH ); + dc.SetBrush( *wxWHITE_BRUSH ); } else { - dc.SetPen( *wxWHITE_PEN ); + 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 ); @@ -835,19 +901,23 @@ void wxTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxPaintDC &dc, int level, }; if (item->NumberOfVisibleChildren() == 0) return; - + + int semiOldY = y; + wxNode *node = item->m_children.First(); while (node) { wxGenericTreeItem *child = (wxGenericTreeItem *)node->Data(); y += m_lineHeight; + semiOldY = y; + PaintLevel( child, dc, level+1, y ); - + node = node->Next(); }; - dc.DrawLine( horizX+15, oldY+5, horizX+15, y ); + dc.DrawLine( horizX+15, oldY+5, horizX+15, semiOldY ); } void wxTreeCtrl::OnPaint( const wxPaintEvent &WXUNUSED(event) ) @@ -906,18 +976,7 @@ void wxTreeCtrl::OnMouse( const wxMouseEvent &event ) 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 ); - }; + SelectItem(item); if (event.LeftDClick()) m_current->SendKeyDown( this ); @@ -932,18 +991,18 @@ void wxTreeCtrl::OnMouse( const wxMouseEvent &event ) void wxTreeCtrl::CalculateLevel( wxGenericTreeItem *item, wxPaintDC &dc, int level, int &y ) { 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(); - + y += m_lineHeight; CalculateLevel( child, dc, level+1, y );