1 ///////////////////////////////////////////////////////////////////////////// 
   3 // Purpose:     Base wxTreeCtrl classes 
   4 // Author:      Julian Smart 
   8 // Copyright:   (c) 1998 Robert Roebling, Julian Smart et al 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  12 // ============================================================================= 
  14 // ============================================================================= 
  16 // ----------------------------------------------------------------------------- 
  18 // ----------------------------------------------------------------------------- 
  20 // For compilers that support precompilation, includes "wx.h". 
  21 #include "wx/wxprec.h" 
  29 #include "wx/treectrl.h" 
  30 #include "wx/imaglist.h" 
  32 // ---------------------------------------------------------------------------- 
  34 // ---------------------------------------------------------------------------- 
  36 DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_BEGIN_DRAG
) 
  37 DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_BEGIN_RDRAG
) 
  38 DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT
) 
  39 DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_END_LABEL_EDIT
) 
  40 DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_DELETE_ITEM
) 
  41 DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_GET_INFO
) 
  42 DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_SET_INFO
) 
  43 DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_EXPANDED
) 
  44 DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_EXPANDING
) 
  45 DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_COLLAPSED
) 
  46 DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_COLLAPSING
) 
  47 DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_SEL_CHANGED
) 
  48 DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_SEL_CHANGING
) 
  49 DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_KEY_DOWN
) 
  50 DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_ACTIVATED
) 
  51 DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_RIGHT_CLICK
) 
  52 DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_MIDDLE_CLICK
) 
  53 DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_END_DRAG
) 
  54 DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_STATE_IMAGE_CLICK
) 
  55 DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_GETTOOLTIP
) 
  56 DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_MENU
) 
  58 // ---------------------------------------------------------------------------- 
  60 // ---------------------------------------------------------------------------- 
  62 IMPLEMENT_DYNAMIC_CLASS(wxTreeEvent
, wxNotifyEvent
) 
  65 wxTreeEvent::wxTreeEvent(wxEventType commandType
, int id
) 
  66            : wxNotifyEvent(commandType
, id
) 
  69     m_editCancelled 
= false; 
  72 wxTreeEvent::wxTreeEvent(const wxTreeEvent 
& event
) 
  73            : wxNotifyEvent(event
) 
  75     m_evtKey 
= event
.m_evtKey
; 
  76     m_item 
= event
.m_item
; 
  77     m_itemOld 
= event
.m_itemOld
; 
  78     m_pointDrag 
= event
.m_pointDrag
; 
  79     m_label 
= event
.m_label
; 
  80     m_editCancelled 
= event
.m_editCancelled
; 
  83 // ---------------------------------------------------------------------------- 
  85 // ---------------------------------------------------------------------------- 
  87 wxTreeCtrlBase::~wxTreeCtrlBase() 
  89     if (m_ownsImageListNormal
) 
  90         delete m_imageListNormal
; 
  91     if (m_ownsImageListState
) 
  92         delete m_imageListState
; 
  95 wxSize 
wxTreeCtrlBase::DoGetBestSize() const 
  99     // this doesn't really compute the total bounding rectangle of all items 
 100     // but a not too bad guess of it which has the advantage of not having to 
 101     // examine all (potentially hundreds or thousands) items in the control 
 102     for ( wxTreeItemId item 
= GetRootItem(); 
 104           item 
= GetLastChild(item
) ) 
 108         // last parameter is "true" to get only the dimensions of the text 
 109         // label, we don't want to get the entire item width as it's determined 
 110         // by the current size 
 111         if ( GetBoundingRect(item
, rect
, true) ) 
 113             if ( size
.x 
< rect
.x 
+ rect
.width 
) 
 114                 size
.x 
= rect
.x 
+ rect
.width
; 
 115             if ( size
.y 
< rect
.y 
+ rect
.height 
) 
 116                 size
.y 
= rect
.y 
+ rect
.height
; 
 120     // need some minimal size even for empty tree 
 121     if ( !size
.x 
|| !size
.y 
) 
 122         size 
= wxControl::DoGetBestSize(); 
 127 #endif // wxUSE_TREECTRL