X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4c6819972f9536b2508dd21100eb0c09ed8350a9..520e470fdd0daef09c77938db642e4583933c90d:/src/generic/treectrl.cpp diff --git a/src/generic/treectrl.cpp b/src/generic/treectrl.cpp index 91f7733f4f..2008aa3fba 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,8 @@ #include "wx/treectrl.h" #include "wx/settings.h" +#include "wx/log.h" +#include //----------------------------------------------------------------------------- // wxTreeItem @@ -31,7 +33,7 @@ wxTreeItem::wxTreeItem() m_selectedImage = -1; m_children = 0; m_data = 0; -}; +} //----------------------------------------------------------------------------- // wxTreeEvent @@ -44,7 +46,7 @@ wxTreeEvent::wxTreeEvent( wxEventType commandType, int id ) : { m_code = 0; m_oldItem = 0; -}; +} //----------------------------------------------------------------------------- // wxGenericTreeItem @@ -57,7 +59,7 @@ wxGenericTreeItem::wxGenericTreeItem( wxGenericTreeItem *parent ) Reset(); m_parent = parent; m_hasHilight = FALSE; -}; +} wxGenericTreeItem::wxGenericTreeItem( wxGenericTreeItem *parent, const wxTreeItem& item, wxDC *dc ) { @@ -65,7 +67,7 @@ wxGenericTreeItem::wxGenericTreeItem( wxGenericTreeItem *parent, const wxTreeIte SetItem( item, dc ); m_parent = parent; m_hasHilight = FALSE; -}; +} void wxGenericTreeItem::SetItem( const wxTreeItem &item, wxDC *dc ) { @@ -88,7 +90,7 @@ void wxGenericTreeItem::SetItem( const wxTreeItem &item, wxDC *dc ) dc->GetTextExtent( m_text, &lw, &lh ); m_width = lw; m_height = lh; -}; +} void wxGenericTreeItem::SetText( const wxString &text, wxDC *dc ) { @@ -98,7 +100,7 @@ void wxGenericTreeItem::SetText( const wxString &text, wxDC *dc ) dc->GetTextExtent( m_text, &lw, &lh ); m_width = lw; m_height = lh; -}; +} void wxGenericTreeItem::Reset() { @@ -119,8 +121,8 @@ void wxGenericTreeItem::Reset() m_level = 0; m_children.DeleteContents( TRUE ); m_isCollapsed = TRUE; - m_parent = NULL; -}; + m_parent = (wxGenericTreeItem *) NULL; +} void wxGenericTreeItem::GetItem( wxTreeItem &item ) const { @@ -136,12 +138,12 @@ void wxGenericTreeItem::GetItem( wxTreeItem &item ) const item.m_children = (int)m_hasChildren; if ((item.m_mask & wxTREE_MASK_DATA) == wxTREE_MASK_DATA) item.m_data = m_data; -}; +} bool wxGenericTreeItem::HasChildren() { return m_hasChildren; -}; +} bool wxGenericTreeItem::HasPlus() { @@ -149,7 +151,7 @@ bool wxGenericTreeItem::HasPlus() return FALSE; return !IsExpanded(); -}; +} int wxGenericTreeItem::NumberOfVisibleDescendents() { @@ -160,14 +162,14 @@ int wxGenericTreeItem::NumberOfVisibleDescendents() wxGenericTreeItem *item = (wxGenericTreeItem*)node->Data(); ret += item->NumberOfVisibleDescendents(); node = node->Next(); - }; + } return ret; -}; +} int wxGenericTreeItem::NumberOfVisibleChildren() { return m_isCollapsed ? 0 : m_children.Number(); -}; +} wxGenericTreeItem *wxGenericTreeItem::FindItem( long itemId ) const { @@ -179,20 +181,20 @@ wxGenericTreeItem *wxGenericTreeItem::FindItem( long itemId ) const wxGenericTreeItem *res = item->FindItem( itemId ); if (res) return (wxGenericTreeItem*)(res); node = node->Next(); - }; - return NULL; -}; + } + return (wxGenericTreeItem *) NULL; +} void wxGenericTreeItem::AddChild( wxGenericTreeItem *child ) { m_children.Append( child ); -}; +} void wxGenericTreeItem::SetCross( int x, int y ) { m_xCross = x; m_yCross = y; -}; +} void wxGenericTreeItem::GetSize( int &x, int &y ) { @@ -205,8 +207,8 @@ void wxGenericTreeItem::GetSize( int &x, int &y ) wxGenericTreeItem *item = (wxGenericTreeItem*)node->Data(); item->GetSize( x, y ); node = node->Next(); - }; -}; + } +} long wxGenericTreeItem::HitTest( const wxPoint& point, int &flags ) { @@ -220,33 +222,36 @@ long wxGenericTreeItem::HitTest( const wxPoint& point, int &flags ) { flags = wxTREE_HITTEST_ONITEMBUTTON; return m_itemId; - }; + } if ((point.x > m_x) && (point.x < m_x+m_width)) { flags = wxTREE_HITTEST_ONITEMLABEL; return m_itemId; - }; + } if (point.x > m_x) { flags = wxTREE_HITTEST_ONITEMRIGHT; return m_itemId; - }; + } flags = wxTREE_HITTEST_ONITEMINDENT; return m_itemId; } 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; -}; +} void wxGenericTreeItem::PrepareEvent( wxTreeEvent &event ) { @@ -261,7 +266,7 @@ void wxGenericTreeItem::PrepareEvent( wxTreeEvent &event ) event.m_code = 0; event.m_pointDrag.x = 0; event.m_pointDrag.y = 0; -}; +} void wxGenericTreeItem::SendKeyDown( wxWindow *target ) { @@ -269,7 +274,7 @@ void wxGenericTreeItem::SendKeyDown( wxWindow *target ) PrepareEvent( event ); event.SetEventObject( target ); target->ProcessEvent( event ); -}; +} void wxGenericTreeItem::SendSelected( wxWindow *target ) { @@ -277,7 +282,7 @@ void wxGenericTreeItem::SendSelected( wxWindow *target ) PrepareEvent( event ); event.SetEventObject( target ); target->ProcessEvent( event ); -}; +} void wxGenericTreeItem::SendDelete( wxWindow *target ) { @@ -285,7 +290,7 @@ void wxGenericTreeItem::SendDelete( wxWindow *target ) PrepareEvent( event ); event.SetEventObject( target ); target->ProcessEvent( event ); -}; +} void wxGenericTreeItem::SendExpand( wxWindow *target ) { @@ -299,7 +304,7 @@ void wxGenericTreeItem::SendExpand( wxWindow *target ) event.SetEventType(wxEVT_COMMAND_TREE_ITEM_EXPANDED); PrepareEvent( event ); target->ProcessEvent( event ); -}; +} void wxGenericTreeItem::SendCollapse( wxWindow *target ) { @@ -313,17 +318,17 @@ void wxGenericTreeItem::SendCollapse( wxWindow *target ) event.SetEventType(wxEVT_COMMAND_TREE_ITEM_COLLAPSED); PrepareEvent( event ); target->ProcessEvent( event ); -}; +} void wxGenericTreeItem::SetHilight( bool set ) { m_hasHilight = set; -}; +} bool wxGenericTreeItem::HasHilight() { return m_hasHilight; -}; +} //----------------------------------------------------------------------------- // wxTreeCtrl @@ -341,8 +346,8 @@ END_EVENT_TABLE() wxTreeCtrl::wxTreeCtrl() { - m_current = NULL; - m_anchor = NULL; + m_current = (wxGenericTreeItem *) NULL; + m_anchor = (wxGenericTreeItem *) NULL; m_hasFocus = FALSE; m_xScroll = 0; m_yScroll = 0; @@ -350,16 +355,17 @@ wxTreeCtrl::wxTreeCtrl() m_lineHeight = 10; m_indent = 15; m_isCreated = FALSE; - m_dc = NULL; m_hilightBrush = new wxBrush( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_HIGHLIGHT), wxSOLID ); -}; + m_imageList = (wxImageList *) NULL; + m_smallImageList = (wxImageList *) NULL; +} wxTreeCtrl::wxTreeCtrl(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name ) { - m_current = NULL; - m_anchor = NULL; + m_current = (wxGenericTreeItem *) NULL; + m_anchor = (wxGenericTreeItem *) NULL; m_hasFocus = FALSE; m_xScroll = 0; m_yScroll = 0; @@ -367,15 +373,17 @@ wxTreeCtrl::wxTreeCtrl(wxWindow *parent, 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 = (wxImageList *) NULL; + m_smallImageList = (wxImageList *) NULL; Create( parent, id, pos, size, style, name ); -}; +} wxTreeCtrl::~wxTreeCtrl() { - if (m_dc) delete m_dc; -}; + if (m_hilightBrush) delete m_hilightBrush; + if (m_anchor) delete m_anchor; +} bool wxTreeCtrl::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, @@ -385,18 +393,18 @@ bool wxTreeCtrl::Create(wxWindow *parent, wxWindowID id, SetBackgroundColour( *wxWHITE ); m_dottedPen = wxPen( *wxBLACK, 0, 0 ); return TRUE; -}; +} int wxTreeCtrl::GetCount() const { if (!m_anchor) return 0; return m_anchor->NumberOfVisibleDescendents(); -}; +} long wxTreeCtrl::InsertItem( long parent, const wxString& label, int image, int selImage, long WXUNUSED(insertAfter) ) { - wxGenericTreeItem *p = NULL; + wxGenericTreeItem *p = (wxGenericTreeItem *) NULL; if (parent == 0) { if (m_anchor) return -1; @@ -405,7 +413,7 @@ long wxTreeCtrl::InsertItem( long parent, const wxString& label, int image, { p = FindItem( parent ); if (!p) return -1; - }; + } wxTreeItem item; m_lastId++; item.m_mask = wxTREE_MASK_HANDLE; @@ -414,17 +422,17 @@ long wxTreeCtrl::InsertItem( long parent, const wxString& label, int image, { item.m_text = label; item.m_mask |= wxTREE_MASK_TEXT; - }; + } if (image >= 0) { item.m_image = image; item.m_mask |= wxTREE_MASK_IMAGE; - }; + } if (selImage >= 0) { item.m_selectedImage = selImage; item.m_mask |= wxTREE_MASK_SELECTED_IMAGE; - }; + } wxClientDC dc(this); wxGenericTreeItem *new_child = new wxGenericTreeItem( p, item, &dc ); @@ -437,14 +445,19 @@ long wxTreeCtrl::InsertItem( long parent, const wxString& label, int image, { CalculatePositions(); + if (!p->HasChildren()) p->m_hasChildren = TRUE; + int ch = 0; - GetClientSize( NULL, &ch ); + GetClientSize( (int *) NULL, &ch ); + PrepareDC( dc ); + wxRectangle rect; - rect.x = 0; rect.y = 0; - rect.width = 10000; rect.height = ch; + rect.x = dc.LogicalToDeviceX( 0 ); + rect.y = 0; + rect.width = 10000; + rect.height = ch; - PrepareDC( dc ); if (p->m_children.Number() == 1) { rect.y = dc.LogicalToDeviceY( p->m_y ); @@ -454,12 +467,7 @@ long wxTreeCtrl::InsertItem( long parent, const wxString& label, int image, wxNode *node = p->m_children.Member( new_child )->Previous(); 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(); @@ -470,15 +478,15 @@ long wxTreeCtrl::InsertItem( long parent, const wxString& label, int image, AdjustMyScrollbars(); Refresh(); - }; + } return m_lastId; -}; +} long wxTreeCtrl::InsertItem( long parent, wxTreeItem &info, long WXUNUSED(insertAfter) ) { int oldMask = info.m_mask; - wxGenericTreeItem *p = NULL; + wxGenericTreeItem *p = (wxGenericTreeItem *) NULL; if (parent == 0) { if (m_anchor) return -1; @@ -490,8 +498,8 @@ long wxTreeCtrl::InsertItem( long parent, wxTreeItem &info, long WXUNUSED(insert { printf( "TreeItem not found.\n" ); return -1; - }; - }; + } + } long ret = 0; if ((info.m_mask & wxTREE_MASK_HANDLE) == 0) { @@ -503,7 +511,7 @@ long wxTreeCtrl::InsertItem( long parent, wxTreeItem &info, long WXUNUSED(insert else { ret = info.m_itemId; - }; + } wxClientDC dc(this); wxGenericTreeItem *new_child = new wxGenericTreeItem( p, info, &dc ); @@ -516,14 +524,19 @@ long wxTreeCtrl::InsertItem( long parent, wxTreeItem &info, long WXUNUSED(insert { CalculatePositions(); + if (!p->HasChildren()) p->m_hasChildren = TRUE; + int ch = 0; - GetClientSize( NULL, &ch ); + GetClientSize( (int *) NULL, &ch ); + PrepareDC( dc ); + wxRectangle rect; - rect.x = 0; rect.y = 0; - rect.width = 10000; rect.height = ch; + rect.x = dc.LogicalToDeviceX( 0 ); + rect.y = 0; + rect.width = 10000; + rect.height = ch; - PrepareDC( dc ); if (p->m_children.Number() == 1) { rect.y = dc.LogicalToDeviceY( p->m_y ); @@ -533,12 +546,7 @@ long wxTreeCtrl::InsertItem( long parent, wxTreeItem &info, long WXUNUSED(insert wxNode *node = p->m_children.Member( new_child )->Previous(); 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(); @@ -549,11 +557,11 @@ long wxTreeCtrl::InsertItem( long parent, wxTreeItem &info, long WXUNUSED(insert AdjustMyScrollbars(); Refresh(); - }; + } info.m_mask = oldMask; return ret; -}; +} bool wxTreeCtrl::ExpandItem( long item, int action ) { @@ -579,7 +587,9 @@ bool wxTreeCtrl::ExpandItem( long item, int action ) if ( child->IsExpanded() ) ExpandItem( child->m_itemId, wxTREE_EXPAND_COLLAPSE ); node = node->Next(); - }; + } + + CalculatePositions(); i->SendCollapse( this ); break; @@ -593,55 +603,54 @@ bool wxTreeCtrl::ExpandItem( long item, int action ) 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 = 0; + rect.x = dc.LogicalToDeviceX( 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; + rect.height = ch; Refresh( TRUE, &rect ); AdjustMyScrollbars(); return TRUE; -}; +} void wxTreeCtrl::DeleteItem( long item ) { wxGenericTreeItem *pItem = FindItem( item ); - wxCHECK_RET( pItem != NULL, "wxTreeCtrl::DeleteItem: no such pItem." ); - + 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." ); - + wxCHECK_RET( pItem != NULL, _("wxTreeCtrl::DeleteChildren: no such pItem.") ); + pItem->m_children.Clear(); - + Refresh(); } bool wxTreeCtrl::DeleteAllItems() { delete m_anchor; - m_anchor = NULL; + m_anchor = (wxGenericTreeItem *) NULL; Refresh(); return TRUE; -}; +} bool wxTreeCtrl::GetItem( wxTreeItem &info ) const { @@ -649,21 +658,21 @@ bool wxTreeCtrl::GetItem( wxTreeItem &info ) const if (!i) return FALSE; i->GetItem( info ); return TRUE; -}; +} long wxTreeCtrl::GetItemData( long item ) const { wxGenericTreeItem *i = FindItem( item ); if (!i) return 0; return i->m_data; -}; +} wxString wxTreeCtrl::GetItemText( long item ) const { wxGenericTreeItem *i = FindItem( item ); if (!i) return ""; return i->m_text; -}; +} int wxTreeCtrl::GetItemImage(long item) const { @@ -678,41 +687,119 @@ long wxTreeCtrl::GetParent( long item ) const i = i->m_parent; if (!i) return -1; return i->m_parent->m_itemId; -}; +} long wxTreeCtrl::GetRootItem() const { if (m_anchor) return m_anchor->m_itemId; return -1; -}; +} + +long wxTreeCtrl::GetChild( long item ) const +{ + wxGenericTreeItem *i = FindItem( item ); + if (!i) return -1; + if (!i->HasChildren()) return -1; + wxNode *node = i->m_children.First(); + i = (wxGenericTreeItem *)node->Data(); + return i->m_itemId; +} + +long wxTreeCtrl::GetNextItem( long item, int code ) const +{ + switch (code) + { + case wxTREE_NEXT_CARET: return GetSelection(); + case wxTREE_NEXT_CHILD: return GetChild( item ); + case wxTREE_NEXT_ROOT: return GetRootItem(); + case wxTREE_NEXT_PARENT: return GetParent( item ); + case wxTREE_NEXT_NEXT: + { + wxGenericTreeItem *i = FindItem( item ); + if (!i) return -1; + if (i->m_parent) + { + wxNode *node = i->m_parent->m_children.Member( i ); + if (!node) return -1; + node = node->Next(); + if (!node) return -1; + i = (wxGenericTreeItem *)node->Data(); + return i->m_itemId; + } + break; + } + case wxTREE_NEXT_PREVIOUS: + { + wxGenericTreeItem *i = FindItem( item ); + if (!i) return -1; + if (i->m_parent) + { + wxNode *node = i->m_parent->m_children.Member( i ); + if (!node) return -1; + node = node->Previous(); + if (!node) return -1; + i = (wxGenericTreeItem *)node->Data(); + return i->m_itemId; + } + break; + } + } + return -1; +} long wxTreeCtrl::GetSelection() const { - return 0; -}; + return m_current ? m_current->GetItemId() : -1; +} + +bool wxTreeCtrl::SelectItem( long itemId ) +{ + 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::SelectItem( long WXUNUSED(item) ) const +void wxTreeCtrl::SelectItem(wxGenericTreeItem *item) { - return FALSE; -}; + 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( int indent ) { m_indent = indent; Refresh(); -}; +} int wxTreeCtrl::GetIndent() const { return m_indent; -}; +} bool wxTreeCtrl::SetItem( wxTreeItem &info ) { @@ -722,7 +809,7 @@ bool wxTreeCtrl::SetItem( wxTreeItem &info ) i->SetItem( info, &dc ); Refresh(); return TRUE; -}; +} bool wxTreeCtrl::SetItemData( long item, long data ) { @@ -730,7 +817,7 @@ bool wxTreeCtrl::SetItemData( long item, long data ) if (!i) return FALSE; i->m_data = data; return TRUE; -}; +} bool wxTreeCtrl::SetItemText( long item, const wxString &text ) { @@ -739,23 +826,95 @@ bool wxTreeCtrl::SetItemText( long item, const wxString &text ) wxClientDC dc(this); i->SetText( text, &dc ); return TRUE; -}; +} void wxTreeCtrl::SetItemImage(long item, int image, int imageSel) const { wxGenericTreeItem *i = FindItem( item ); - if ( i != 0 ) { + if ( i != 0 ) + { i->SetImage(image); i->SetSelectedImage(imageSel); } } +int wxTreeCtrl::GetItemState( long item, long stateMask ) const +{ + wxGenericTreeItem *i = FindItem( item ); + if (!i) return 0; + int ret = 0; + + // Currently, an item is always selected _and_ focussed in wxGTK + + if (stateMask & wxTREE_STATE_FOCUSED) + if (m_current == i) + ret += wxTREE_STATE_FOCUSED; + + if (stateMask & wxTREE_STATE_SELECTED) + if (m_current == i) + ret += wxTREE_STATE_SELECTED; + + if (stateMask & wxTREE_STATE_EXPANDED) + if (i->IsExpanded()) + ret += wxTREE_STATE_EXPANDED; + + return ret; +} + +bool wxTreeCtrl::SetItemState( long item, long state, long stateMask ) +{ + wxGenericTreeItem *i = FindItem( item ); + if (!i) return FALSE; + + if (stateMask & wxTREE_STATE_FOCUSED) + { + if (state & wxTREE_STATE_FOCUSED) + SelectItem( i ); + } + + if (stateMask & wxTREE_STATE_SELECTED) + { + if (state & wxTREE_STATE_SELECTED) + SelectItem( i ); + } + + if (stateMask & wxTREE_STATE_EXPANDED) + { + if (state & wxTREE_STATE_EXPANDED) + ExpandItem( i->m_itemId, wxTREE_EXPAND_EXPAND ); + else + ExpandItem( i->m_itemId, wxTREE_EXPAND_COLLAPSE ); + } + + return TRUE; +} + long wxTreeCtrl::HitTest( const wxPoint& point, int &flags ) { flags = 0; if (!m_anchor) return -1; 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() { @@ -772,28 +931,32 @@ void wxTreeCtrl::AdjustMyScrollbars() else { SetScrollbars( 0, 0, 0, 0 ); - }; -}; + } +} -void wxTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxPaintDC &dc, int level, int &y ) +void wxTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxDC &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 exposed_x = dc.LogicalToDeviceX( 0 ); + int exposed_y = dc.LogicalToDeviceY( item->m_y-2 ); + + if (IsExposed( exposed_x, exposed_y, 1000, 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()) { @@ -804,87 +967,94 @@ void wxTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxPaintDC &dc, int level, dc.DrawLine( horizX+13, y, horizX+18, y ); if (item->HasPlus()) dc.DrawLine( horizX+15, y-2, horizX+15, y+3 ); - }; + } if (item->HasHilight()) { 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.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; + 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) ) { if (!m_anchor) return; - if (!m_dc) - { - m_dc = new wxPaintDC(this); - PrepareDC( *m_dc ); - }; + wxPaintDC dc(this); + PrepareDC( dc ); - m_dc->SetFont( wxSystemSettings::GetSystemFont( wxSYS_SYSTEM_FONT ) ); + dc.SetFont( wxSystemSettings::GetSystemFont( wxSYS_SYSTEM_FONT ) ); - m_dc->SetPen( m_dottedPen ); - m_lineHeight = (int)(m_dc->GetCharHeight() + 4); + 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) ) { m_hasFocus = TRUE; if (m_current) RefreshLine( m_current ); -}; +} void wxTreeCtrl::OnKillFocus( const wxFocusEvent &WXUNUSED(event) ) { m_hasFocus = FALSE; if (m_current) RefreshLine( m_current ); -}; +} void wxTreeCtrl::OnChar( wxKeyEvent &event ) { event.Skip(); -}; +} void wxTreeCtrl::OnMouse( const wxMouseEvent &event ) { @@ -906,18 +1076,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 ); @@ -926,30 +1085,30 @@ void wxTreeCtrl::OnMouse( const wxMouseEvent &event ) { ExpandItem( item->m_itemId, wxTREE_EXPAND_TOGGLE ); return; - }; -}; + } +} -void wxTreeCtrl::CalculateLevel( wxGenericTreeItem *item, wxPaintDC &dc, int level, int &y ) +void wxTreeCtrl::CalculateLevel( wxGenericTreeItem *item, wxDC &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 ); node = node->Next(); - }; -}; + } +} void wxTreeCtrl::CalculatePositions() { @@ -966,13 +1125,13 @@ void wxTreeCtrl::CalculatePositions() int y = m_lineHeight / 2 + 2; CalculateLevel( m_anchor, dc, 0, y ); -}; +} wxGenericTreeItem *wxTreeCtrl::FindItem( long itemId ) const { - if (!m_anchor) return NULL; + if (!m_anchor) return (wxGenericTreeItem *) NULL; return m_anchor->FindItem( itemId ); -}; +} void wxTreeCtrl::RefreshLine( wxGenericTreeItem *item ) { @@ -983,9 +1142,9 @@ 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 ); -}; +}