1 /////////////////////////////////////////////////////////////////////////////
4 // Author: Robert Roebling
7 // Copyright: (c) 1998 Robert Roebling, Julian Smart and Markus Holzem
8 // Licence: wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
12 #pragma implementation "treectrl.h"
15 #include "wx/treectrl.h"
16 #include "wx/settings.h"
18 //-----------------------------------------------------------------------------
20 //-----------------------------------------------------------------------------
22 IMPLEMENT_DYNAMIC_CLASS(wxTreeItem
, wxObject
)
24 wxTreeItem::wxTreeItem()
36 //-----------------------------------------------------------------------------
38 //-----------------------------------------------------------------------------
40 IMPLEMENT_DYNAMIC_CLASS(wxTreeEvent
,wxCommandEvent
)
42 wxTreeEvent::wxTreeEvent( wxEventType commandType
, int id
) :
43 wxCommandEvent( commandType
, id
)
49 //-----------------------------------------------------------------------------
51 //-----------------------------------------------------------------------------
53 IMPLEMENT_DYNAMIC_CLASS(wxGenericTreeItem
,wxObject
)
55 wxGenericTreeItem::wxGenericTreeItem( wxGenericTreeItem
*parent
)
62 wxGenericTreeItem::wxGenericTreeItem( wxGenericTreeItem
*parent
, const wxTreeItem
& item
, wxDC
*dc
)
70 void wxGenericTreeItem::SetItem( const wxTreeItem
&item
, wxDC
*dc
)
72 if ((item
.m_mask
& wxTREE_MASK_HANDLE
) == wxTREE_MASK_HANDLE
)
73 m_itemId
= item
.m_itemId
;
74 if ((item
.m_mask
& wxTREE_MASK_STATE
) == wxTREE_MASK_STATE
)
75 m_state
= item
.m_state
;
76 if ((item
.m_mask
& wxTREE_MASK_TEXT
) == wxTREE_MASK_TEXT
)
78 if ((item
.m_mask
& wxTREE_MASK_IMAGE
) == wxTREE_MASK_IMAGE
)
79 m_image
= item
.m_image
;
80 if ((item
.m_mask
& wxTREE_MASK_SELECTED_IMAGE
) == wxTREE_MASK_SELECTED_IMAGE
)
81 m_selectedImage
= item
.m_selectedImage
;
82 if ((item
.m_mask
& wxTREE_MASK_CHILDREN
) == wxTREE_MASK_CHILDREN
)
83 m_hasChildren
= (item
.m_children
> 0);
84 if ((item
.m_mask
& wxTREE_MASK_DATA
) == wxTREE_MASK_DATA
)
88 dc
->GetTextExtent( m_text
, &lw
, &lh
);
93 void wxGenericTreeItem::SetText( const wxString
&text
, wxDC
*dc
)
98 dc
->GetTextExtent( m_text
, &lw
, &lh
);
103 void wxGenericTreeItem::Reset()
109 m_selectedImage
= -1;
111 m_hasChildren
= FALSE
;
120 m_children
.DeleteContents( TRUE
);
121 m_isCollapsed
= TRUE
;
125 void wxGenericTreeItem::GetItem( wxTreeItem
&item
) const
127 if ((item
.m_mask
& wxTREE_MASK_STATE
) == wxTREE_MASK_STATE
)
128 item
.m_state
= m_state
;
129 if ((item
.m_mask
& wxTREE_MASK_TEXT
) == wxTREE_MASK_TEXT
)
130 item
.m_text
= m_text
;
131 if ((item
.m_mask
& wxTREE_MASK_IMAGE
) == wxTREE_MASK_IMAGE
)
132 item
.m_image
= m_image
;
133 if ((item
.m_mask
& wxTREE_MASK_SELECTED_IMAGE
) == wxTREE_MASK_SELECTED_IMAGE
)
134 item
.m_selectedImage
= m_selectedImage
;
135 if ((item
.m_mask
& wxTREE_MASK_CHILDREN
) == wxTREE_MASK_CHILDREN
)
136 item
.m_children
= (int)m_hasChildren
;
137 if ((item
.m_mask
& wxTREE_MASK_DATA
) == wxTREE_MASK_DATA
)
138 item
.m_data
= m_data
;
141 bool wxGenericTreeItem::HasChildren()
143 return m_hasChildren
;
146 bool wxGenericTreeItem::HasPlus()
148 if ( !HasChildren() )
151 return !IsExpanded();
154 int wxGenericTreeItem::NumberOfVisibleDescendents()
156 int ret
= m_children
.Number();
157 wxNode
*node
= m_children
.First();
160 wxGenericTreeItem
*item
= (wxGenericTreeItem
*)node
->Data();
161 ret
+= item
->NumberOfVisibleDescendents();
167 int wxGenericTreeItem::NumberOfVisibleChildren()
169 return m_isCollapsed
? 0 : m_children
.Number();
172 wxGenericTreeItem
*wxGenericTreeItem::FindItem( long itemId
) const
174 if (m_itemId
== itemId
) return (wxGenericTreeItem
*)(this);
175 wxNode
*node
= m_children
.First();
178 wxGenericTreeItem
*item
= (wxGenericTreeItem
*)node
->Data();
179 wxGenericTreeItem
*res
= item
->FindItem( itemId
);
180 if (res
) return (wxGenericTreeItem
*)(res
);
186 void wxGenericTreeItem::AddChild( wxGenericTreeItem
*child
)
188 m_children
.Append( child
);
191 void wxGenericTreeItem::SetCross( int x
, int y
)
197 void wxGenericTreeItem::GetSize( int &x
, int &y
)
199 if (y
< m_y
+ 10) y
= m_y
+10;
200 int width
= m_x
+ m_width
;
201 if (width
> x
) x
= width
;
202 wxNode
*node
= m_children
.First();
205 wxGenericTreeItem
*item
= (wxGenericTreeItem
*)node
->Data();
206 item
->GetSize( x
, y
);
211 long wxGenericTreeItem::HitTest( const wxPoint
& point
, int &flags
)
213 if ((point
.y
> m_y
) && (point
.y
< m_y
+m_height
))
215 if ((point
.x
> m_xCross
-5) &&
216 (point
.x
< m_xCross
+5) &&
217 (point
.y
> m_yCross
-5) &&
218 (point
.y
< m_yCross
+5) &&
221 flags
= wxTREE_HITTEST_ONITEMBUTTON
;
224 if ((point
.x
> m_x
) && (point
.x
< m_x
+m_width
))
226 flags
= wxTREE_HITTEST_ONITEMLABEL
;
231 flags
= wxTREE_HITTEST_ONITEMRIGHT
;
234 flags
= wxTREE_HITTEST_ONITEMINDENT
;
241 wxNode
*node
= m_children
.First();
244 wxGenericTreeItem
*child
= (wxGenericTreeItem
*)node
->Data();
245 long res
= child
->HitTest( point
, flags
);
246 if (res
!= -1) return res
;
254 void wxGenericTreeItem::PrepareEvent( wxTreeEvent
&event
)
256 event
.m_item
.m_itemId
= m_itemId
;
257 event
.m_item
.m_state
= m_state
;
258 event
.m_item
.m_text
= m_text
;
259 event
.m_item
.m_image
= m_image
;
260 event
.m_item
.m_selectedImage
= m_selectedImage
;
261 event
.m_item
.m_children
= (int)m_hasChildren
;
262 event
.m_item
.m_data
= m_data
;
265 event
.m_pointDrag
.x
= 0;
266 event
.m_pointDrag
.y
= 0;
269 void wxGenericTreeItem::SendKeyDown( wxWindow
*target
)
271 wxTreeEvent
event( wxEVT_COMMAND_TREE_KEY_DOWN
, target
->GetId() );
272 PrepareEvent( event
);
273 event
.SetEventObject( target
);
274 target
->ProcessEvent( event
);
277 void wxGenericTreeItem::SendSelected( wxWindow
*target
)
279 wxTreeEvent
event( wxEVT_COMMAND_TREE_SEL_CHANGED
, target
->GetId() );
280 PrepareEvent( event
);
281 event
.SetEventObject( target
);
282 target
->ProcessEvent( event
);
285 void wxGenericTreeItem::SendDelete( wxWindow
*target
)
287 wxTreeEvent
event( wxEVT_COMMAND_TREE_DELETE_ITEM
, target
->GetId() );
288 PrepareEvent( event
);
289 event
.SetEventObject( target
);
290 target
->ProcessEvent( event
);
293 void wxGenericTreeItem::SendExpand( wxWindow
*target
)
295 m_isCollapsed
= FALSE
;
297 wxTreeEvent
event( wxEVT_COMMAND_TREE_ITEM_EXPANDING
, target
->GetId() );
298 event
.SetEventObject( target
);
299 PrepareEvent( event
);
300 target
->ProcessEvent( event
);
302 event
.SetEventType(wxEVT_COMMAND_TREE_ITEM_EXPANDED
);
303 PrepareEvent( event
);
304 target
->ProcessEvent( event
);
307 void wxGenericTreeItem::SendCollapse( wxWindow
*target
)
309 m_isCollapsed
= TRUE
;
311 wxTreeEvent
event( wxEVT_COMMAND_TREE_ITEM_COLLAPSING
, target
->GetId() );
312 event
.SetEventObject( target
);
313 PrepareEvent( event
);
314 target
->ProcessEvent( event
);
316 event
.SetEventType(wxEVT_COMMAND_TREE_ITEM_COLLAPSED
);
317 PrepareEvent( event
);
318 target
->ProcessEvent( event
);
321 void wxGenericTreeItem::SetHilight( bool set
)
326 bool wxGenericTreeItem::HasHilight()
331 //-----------------------------------------------------------------------------
333 //-----------------------------------------------------------------------------
335 IMPLEMENT_DYNAMIC_CLASS(wxTreeCtrl
,wxScrolledWindow
)
337 BEGIN_EVENT_TABLE(wxTreeCtrl
,wxScrolledWindow
)
338 EVT_PAINT (wxTreeCtrl::OnPaint
)
339 EVT_MOUSE_EVENTS (wxTreeCtrl::OnMouse
)
340 EVT_CHAR (wxTreeCtrl::OnChar
)
341 EVT_SET_FOCUS (wxTreeCtrl::OnSetFocus
)
342 EVT_KILL_FOCUS (wxTreeCtrl::OnKillFocus
)
345 wxTreeCtrl::wxTreeCtrl()
357 m_hilightBrush
= new wxBrush( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_HIGHLIGHT
), wxSOLID
);
359 m_smallImageList
= NULL
;
362 wxTreeCtrl::wxTreeCtrl(wxWindow
*parent
, wxWindowID id
,
363 const wxPoint
& pos
, const wxSize
& size
,
364 long style
, const wxString
& name
)
376 m_hilightBrush
= new wxBrush( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_HIGHLIGHT
), wxSOLID
);
378 m_smallImageList
= NULL
;
379 Create( parent
, id
, pos
, size
, style
, name
);
382 wxTreeCtrl::~wxTreeCtrl()
384 if (m_dc
) delete m_dc
;
387 bool wxTreeCtrl::Create(wxWindow
*parent
, wxWindowID id
,
388 const wxPoint
& pos
, const wxSize
& size
,
389 long style
, const wxString
& name
)
391 wxScrolledWindow::Create( parent
, id
, pos
, size
, style
, name
);
392 SetBackgroundColour( *wxWHITE
);
393 m_dottedPen
= wxPen( *wxBLACK
, 0, 0 );
397 int wxTreeCtrl::GetCount() const
399 if (!m_anchor
) return 0;
400 return m_anchor
->NumberOfVisibleDescendents();
403 long wxTreeCtrl::InsertItem( long parent
, const wxString
& label
, int image
,
404 int selImage
, long WXUNUSED(insertAfter
) )
406 wxGenericTreeItem
*p
= NULL
;
409 if (m_anchor
) return -1;
413 p
= FindItem( parent
);
418 item
.m_mask
= wxTREE_MASK_HANDLE
;
419 item
.m_itemId
= m_lastId
;
420 if (!label
.IsNull() || (label
== ""))
423 item
.m_mask
|= wxTREE_MASK_TEXT
;
427 item
.m_image
= image
;
428 item
.m_mask
|= wxTREE_MASK_IMAGE
;
432 item
.m_selectedImage
= selImage
;
433 item
.m_mask
|= wxTREE_MASK_SELECTED_IMAGE
;
437 wxGenericTreeItem
*new_child
= new wxGenericTreeItem( p
, item
, &dc
);
439 p
->AddChild( new_child
);
441 m_anchor
= new_child
;
445 CalculatePositions();
447 if (!p
->HasChildren()) p
->m_hasChildren
= TRUE
;
450 GetClientSize( NULL
, &ch
);
453 rect
.x
= 0; rect
.y
= 0;
454 rect
.width
= 10000; rect
.height
= ch
;
457 if (p
->m_children
.Number() == 1)
459 rect
.y
= dc
.LogicalToDeviceY( p
->m_y
);
463 wxNode
*node
= p
->m_children
.Member( new_child
)->Previous();
464 wxGenericTreeItem
* last_child
= (wxGenericTreeItem
*)node
->Data();
465 rect
.y
= dc
.LogicalToDeviceY( last_child
->m_y
);
470 dc
.GetDeviceOrigin( &doX
, &doY
);
471 rect
.height
= ch
-rect
.y
-doY
;
473 AdjustMyScrollbars();
475 if (rect
.height
> 0) Refresh( FALSE
, &rect
);
479 AdjustMyScrollbars();
487 long wxTreeCtrl::InsertItem( long parent
, wxTreeItem
&info
, long WXUNUSED(insertAfter
) )
489 int oldMask
= info
.m_mask
;
490 wxGenericTreeItem
*p
= NULL
;
493 if (m_anchor
) return -1;
497 p
= FindItem( parent
);
500 printf( "TreeItem not found.\n" );
505 if ((info
.m_mask
& wxTREE_MASK_HANDLE
) == 0)
508 info
.m_itemId
= m_lastId
;
509 info
.m_mask
|= wxTREE_MASK_HANDLE
;
518 wxGenericTreeItem
*new_child
= new wxGenericTreeItem( p
, info
, &dc
);
520 p
->AddChild( new_child
);
522 m_anchor
= new_child
;
526 CalculatePositions();
528 if (!p
->HasChildren()) p
->m_hasChildren
= TRUE
;
531 GetClientSize( NULL
, &ch
);
534 rect
.x
= 0; rect
.y
= 0;
535 rect
.width
= 10000; rect
.height
= ch
;
538 if (p
->m_children
.Number() == 1)
540 rect
.y
= dc
.LogicalToDeviceY( p
->m_y
);
544 wxNode
*node
= p
->m_children
.Member( new_child
)->Previous();
545 wxGenericTreeItem
* last_child
= (wxGenericTreeItem
*)node
->Data();
546 rect
.y
= dc
.LogicalToDeviceY( last_child
->m_y
);
551 dc
.GetDeviceOrigin( &doX
, &doY
);
552 rect
.height
= ch
-rect
.y
-doY
;
554 AdjustMyScrollbars();
556 if (rect
.height
> 0) Refresh( FALSE
, &rect
);
560 AdjustMyScrollbars();
565 info
.m_mask
= oldMask
;
569 bool wxTreeCtrl::ExpandItem( long item
, int action
)
571 wxGenericTreeItem
*i
= FindItem( item
);
577 case wxTREE_EXPAND_EXPAND
:
579 i
->SendExpand( this );
583 case wxTREE_EXPAND_COLLAPSE_RESET
:
584 case wxTREE_EXPAND_COLLAPSE
:
586 wxNode
*node
= i
->m_children
.First();
589 wxGenericTreeItem
*child
= (wxGenericTreeItem
*)node
->Data();
590 if ( child
->IsExpanded() )
591 ExpandItem( child
->m_itemId
, wxTREE_EXPAND_COLLAPSE
);
595 CalculatePositions();
597 i
->SendCollapse( this );
601 case wxTREE_EXPAND_TOGGLE
:
603 if ( i
->IsExpanded() )
604 ExpandItem( item
, wxTREE_EXPAND_COLLAPSE
);
606 ExpandItem( item
, wxTREE_EXPAND_EXPAND
);
613 GetClientSize( &cw
, &ch
);
619 rect
.y
= dc
.LogicalToDeviceY( i
->m_y
);
622 dc
.GetDeviceOrigin( NULL
, &doY
);
623 rect
.height
= ch
-rect
.y
-doY
;
624 Refresh( TRUE
, &rect
);
626 AdjustMyScrollbars();
631 void wxTreeCtrl::DeleteItem( long item
)
633 wxGenericTreeItem
*pItem
= FindItem( item
);
634 wxCHECK_RET( pItem
!= NULL
, "wxTreeCtrl::DeleteItem: no such pItem." );
636 pItem
->m_parent
->m_children
.DeleteObject(pItem
);
641 void wxTreeCtrl::DeleteChildren( long item
)
643 wxGenericTreeItem
*pItem
= FindItem( item
);
644 wxCHECK_RET( pItem
!= NULL
, "wxTreeCtrl::DeleteChildren: no such pItem." );
646 pItem
->m_children
.Clear();
651 bool wxTreeCtrl::DeleteAllItems()
659 bool wxTreeCtrl::GetItem( wxTreeItem
&info
) const
661 wxGenericTreeItem
*i
= FindItem( info
.m_itemId
);
662 if (!i
) return FALSE
;
667 long wxTreeCtrl::GetItemData( long item
) const
669 wxGenericTreeItem
*i
= FindItem( item
);
674 wxString
wxTreeCtrl::GetItemText( long item
) const
676 wxGenericTreeItem
*i
= FindItem( item
);
681 int wxTreeCtrl::GetItemImage(long item
) const
683 wxGenericTreeItem
*i
= FindItem( item
);
684 return i
== 0 ? -1 : i
->GetImage();
687 long wxTreeCtrl::GetParent( long item
) const
689 wxGenericTreeItem
*i
= FindItem( item
);
693 return i
->m_parent
->m_itemId
;
696 long wxTreeCtrl::GetRootItem() const
698 if (m_anchor
) return m_anchor
->m_itemId
;
702 long wxTreeCtrl::GetSelection() const
707 bool wxTreeCtrl::SelectItem( long WXUNUSED(item
) ) const
712 bool wxTreeCtrl::ItemHasChildren( long item
) const
714 wxGenericTreeItem
*i
= FindItem( item
);
715 if (!i
) return FALSE
;
716 return i
->m_hasChildren
;
719 void wxTreeCtrl::SetIndent( int indent
)
725 int wxTreeCtrl::GetIndent() const
730 bool wxTreeCtrl::SetItem( wxTreeItem
&info
)
732 wxGenericTreeItem
*i
= FindItem( info
.m_itemId
);
733 if (!i
) return FALSE
;
735 i
->SetItem( info
, &dc
);
740 bool wxTreeCtrl::SetItemData( long item
, long data
)
742 wxGenericTreeItem
*i
= FindItem( item
);
743 if (!i
) return FALSE
;
748 bool wxTreeCtrl::SetItemText( long item
, const wxString
&text
)
750 wxGenericTreeItem
*i
= FindItem( item
);
751 if (!i
) return FALSE
;
753 i
->SetText( text
, &dc
);
757 void wxTreeCtrl::SetItemImage(long item
, int image
, int imageSel
) const
759 wxGenericTreeItem
*i
= FindItem( item
);
762 i
->SetSelectedImage(imageSel
);
766 long wxTreeCtrl::HitTest( const wxPoint
& point
, int &flags
)
769 if (!m_anchor
) return -1;
770 return m_anchor
->HitTest( point
, flags
);
773 wxImageList
*wxTreeCtrl::GetImageList( int which
) const
775 if (which
== wxIMAGE_LIST_NORMAL
) return m_imageList
;
776 return m_smallImageList
;
779 void wxTreeCtrl::SetImageList( wxImageList
*imageList
, int which
)
781 if (which
== wxIMAGE_LIST_NORMAL
)
783 if (m_imageList
) delete m_imageList
;
784 m_imageList
= imageList
;
788 if (m_smallImageList
) delete m_smallImageList
;
789 m_smallImageList
= imageList
;
793 void wxTreeCtrl::AdjustMyScrollbars()
799 m_anchor
->GetSize( x
, y
);
801 int x_pos
= GetScrollPos( wxHORIZONTAL
);
802 int y_pos
= GetScrollPos( wxVERTICAL
);
803 SetScrollbars( 10, 10, x
/10, y
/10, x_pos
, y_pos
);
807 SetScrollbars( 0, 0, 0, 0 );
811 void wxTreeCtrl::PaintLevel( wxGenericTreeItem
*item
, wxPaintDC
&dc
, int level
, int &y
)
813 int horizX
= level
*m_indent
;
815 item
->m_x
= horizX
+33;
816 item
->m_y
= y
-m_lineHeight
/3;
817 item
->m_height
= m_lineHeight
;
819 item
->SetCross( horizX
+15, y
);
823 if (IsExposed( 0, item
->m_y
-2, 10000, m_lineHeight
+4 ))
826 int endX
= horizX
+ 10;
828 if (!item
->HasChildren()) endX
+= 20;
829 dc
.DrawLine( startX
, y
, endX
, y
);
831 if (item
->HasChildren())
833 dc
.DrawLine( horizX
+20, y
, horizX
+30, y
);
834 dc
.SetPen( *wxGREY_PEN
);
835 dc
.DrawRectangle( horizX
+10, y
-4, 11, 9 );
836 dc
.SetPen( *wxBLACK_PEN
);
837 dc
.DrawLine( horizX
+13, y
, horizX
+18, y
);
839 dc
.DrawLine( horizX
+15, y
-2, horizX
+15, y
+3 );
842 if (item
->HasHilight())
844 dc
.SetTextForeground( wxSystemSettings::GetSystemColour( wxSYS_COLOUR_HIGHLIGHTTEXT
) );
845 dc
.SetBrush( *m_hilightBrush
);
847 dc
.GetTextExtent( item
->m_text
, &tw
, &th
);
850 dc
.SetPen( *wxBLACK_PEN
);
851 dc
.DrawRectangle( item
->m_x
-2, item
->m_y
-2, tw
+4, th
+4 );
855 dc
.SetPen( *wxTRANSPARENT_PEN
);
856 dc
.DrawRectangle( item
->m_x
-2, item
->m_y
-2, tw
+4, th
+4 );
858 dc
.DrawText( item
->m_text
, item
->m_x
, item
->m_y
);
860 dc
.SetPen( *wxBLACK_PEN
);
861 dc
.SetTextForeground( *wxBLACK
);
862 dc
.SetBrush( *wxWHITE_BRUSH
);
866 dc
.SetPen( *wxTRANSPARENT_PEN
);
868 dc
.GetTextExtent( item
->m_text
, &tw
, &th
);
869 dc
.DrawRectangle( item
->m_x
-2, item
->m_y
-2, tw
+4, th
+4 );
870 dc
.DrawText( item
->m_text
, item
->m_x
, item
->m_y
);
871 dc
.SetPen( *wxBLACK_PEN
);
875 if (item
->NumberOfVisibleChildren() == 0) return;
879 wxNode
*node
= item
->m_children
.First();
882 wxGenericTreeItem
*child
= (wxGenericTreeItem
*)node
->Data();
887 PaintLevel( child
, dc
, level
+1, y
);
892 dc
.DrawLine( horizX
+15, oldY
+5, horizX
+15, semiOldY
);
895 void wxTreeCtrl::OnPaint( const wxPaintEvent
&WXUNUSED(event
) )
897 if (!m_anchor
) return;
901 m_dc
= new wxPaintDC(this);
905 m_dc
->SetFont( wxSystemSettings::GetSystemFont( wxSYS_SYSTEM_FONT
) );
907 m_dc
->SetPen( m_dottedPen
);
908 m_lineHeight
= (int)(m_dc
->GetCharHeight() + 4);
910 int y
= m_lineHeight
/ 2 + 2;
911 PaintLevel( m_anchor
, *m_dc
, 0, y
);
914 void wxTreeCtrl::OnSetFocus( const wxFocusEvent
&WXUNUSED(event
) )
917 if (m_current
) RefreshLine( m_current
);
920 void wxTreeCtrl::OnKillFocus( const wxFocusEvent
&WXUNUSED(event
) )
923 if (m_current
) RefreshLine( m_current
);
926 void wxTreeCtrl::OnChar( wxKeyEvent
&event
)
931 void wxTreeCtrl::OnMouse( const wxMouseEvent
&event
)
933 if (!event
.LeftDown() &&
934 !event
.LeftDClick()) return;
938 long x
= dc
.DeviceToLogicalX( (long)event
.GetX() );
939 long y
= dc
.DeviceToLogicalY( (long)event
.GetY() );
942 long id
= HitTest( wxPoint(x
,y
), flag
);
945 wxGenericTreeItem
*item
= FindItem( id
);
948 if ((flag
!= wxTREE_HITTEST_ONITEMBUTTON
) &&
949 (flag
!= wxTREE_HITTEST_ONITEMLABEL
)) return;
951 if (m_current
!= item
)
955 m_current
->SetHilight( FALSE
);
956 RefreshLine( m_current
);
959 m_current
->SetHilight( TRUE
);
960 RefreshLine( m_current
);
961 m_current
->SendSelected( this );
964 if (event
.LeftDClick())
965 m_current
->SendKeyDown( this );
967 if (flag
== wxTREE_HITTEST_ONITEMBUTTON
)
969 ExpandItem( item
->m_itemId
, wxTREE_EXPAND_TOGGLE
);
974 void wxTreeCtrl::CalculateLevel( wxGenericTreeItem
*item
, wxPaintDC
&dc
, int level
, int &y
)
976 int horizX
= level
*m_indent
;
978 item
->m_x
= horizX
+33;
979 item
->m_y
= y
-m_lineHeight
/3-2;
980 item
->m_height
= m_lineHeight
;
982 if (item
->NumberOfVisibleChildren() == 0) return;
984 wxNode
*node
= item
->m_children
.First();
987 wxGenericTreeItem
*child
= (wxGenericTreeItem
*)node
->Data();
990 CalculateLevel( child
, dc
, level
+1, y
);
996 void wxTreeCtrl::CalculatePositions()
1001 wxClientDC
dc(this);
1004 dc
.SetFont( wxSystemSettings::GetSystemFont( wxSYS_SYSTEM_FONT
) );
1006 dc
.SetPen( m_dottedPen
);
1007 m_lineHeight
= (int)(dc
.GetCharHeight() + 4);
1009 int y
= m_lineHeight
/ 2 + 2;
1010 CalculateLevel( m_anchor
, dc
, 0, y
);
1013 wxGenericTreeItem
*wxTreeCtrl::FindItem( long itemId
) const
1015 if (!m_anchor
) return NULL
;
1016 return m_anchor
->FindItem( itemId
);
1019 void wxTreeCtrl::RefreshLine( wxGenericTreeItem
*item
)
1022 wxClientDC
dc(this);
1025 rect
.x
= dc
.LogicalToDeviceX( item
->m_x
-2 );
1026 rect
.y
= dc
.LogicalToDeviceY( item
->m_y
-2 );
1028 rect
.height
= dc
.GetCharHeight()+4;
1029 Refresh( TRUE
, &rect
);