]> git.saurik.com Git - wxWidgets.git/blame - src/common/treebase.cpp
wxPickerBase derives from wxControl, not wxWindow
[wxWidgets.git] / src / common / treebase.cpp
CommitLineData
484523cf
JS
1/////////////////////////////////////////////////////////////////////////////
2// Name: treebase.cpp
3// Purpose: Base wxTreeCtrl classes
4// Author: Julian Smart
5// Created: 01/02/97
6// Modified:
7// Id: $Id$
8// Copyright: (c) 1998 Robert Roebling, Julian Smart et al
65571936 9// Licence: wxWindows licence
484523cf
JS
10/////////////////////////////////////////////////////////////////////////////
11
12// =============================================================================
13// declarations
14// =============================================================================
15
16// -----------------------------------------------------------------------------
17// headers
18// -----------------------------------------------------------------------------
19
484523cf
JS
20// For compilers that support precompilation, includes "wx.h".
21#include "wx/wxprec.h"
22
23#ifdef __BORLANDC__
1e6feb95 24 #pragma hdrstop
484523cf
JS
25#endif
26
1e6feb95
VZ
27#if wxUSE_TREECTRL
28
8cee4a30 29#include "wx/treectrl.h"
42e53e77 30#include "wx/imaglist.h"
ed2ec17c
GT
31
32// ----------------------------------------------------------------------------
33// events
34// ----------------------------------------------------------------------------
35
36DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_BEGIN_DRAG)
37DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_BEGIN_RDRAG)
38DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT)
39DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_END_LABEL_EDIT)
40DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_DELETE_ITEM)
41DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_GET_INFO)
42DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_SET_INFO)
43DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_EXPANDED)
44DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_EXPANDING)
45DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_COLLAPSED)
46DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_COLLAPSING)
47DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_SEL_CHANGED)
48DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_SEL_CHANGING)
49DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_KEY_DOWN)
50DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_ACTIVATED)
51DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_RIGHT_CLICK)
52DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_MIDDLE_CLICK)
53DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_END_DRAG)
ae8c4b33 54DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_STATE_IMAGE_CLICK)
156194e1 55DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_GETTOOLTIP)
f7c6f947 56DEFINE_EVENT_TYPE(wxEVT_COMMAND_TREE_ITEM_MENU)
ed2ec17c 57
484523cf
JS
58// ----------------------------------------------------------------------------
59// Tree event
60// ----------------------------------------------------------------------------
61
09f277d6 62IMPLEMENT_ABSTRACT_CLASS(wxTreeEvent, wxNotifyEvent)
b8fbf1a0
RD
63
64
09f277d6
VZ
65wxTreeEvent::wxTreeEvent(wxEventType commandType,
66 wxTreeCtrlBase *tree,
67 const wxTreeItemId& item)
68 : wxNotifyEvent(commandType, tree->GetId()),
69 m_item(item)
484523cf 70{
cb719f2e 71 m_editCancelled = false;
09f277d6
VZ
72
73 SetEventObject(tree);
74
75 if ( item.IsOk() )
76 SetClientObject(tree->GetItemData(item));
484523cf
JS
77}
78
0cd936a4
WS
79wxTreeEvent::wxTreeEvent(const wxTreeEvent & event)
80 : wxNotifyEvent(event)
81{
82 m_evtKey = event.m_evtKey;
83 m_item = event.m_item;
84 m_itemOld = event.m_itemOld;
85 m_pointDrag = event.m_pointDrag;
86 m_label = event.m_label;
87 m_editCancelled = event.m_editCancelled;
88}
89
8cee4a30
VZ
90// ----------------------------------------------------------------------------
91// wxTreeCtrlBase
92// ----------------------------------------------------------------------------
93
94wxTreeCtrlBase::~wxTreeCtrlBase()
95{
96 if (m_ownsImageListNormal)
97 delete m_imageListNormal;
98 if (m_ownsImageListState)
99 delete m_imageListState;
100}
101
7c384067
JS
102static void wxGetBestTreeSize(const wxTreeCtrlBase* treeCtrl, const wxTreeItemId& id, wxSize& size)
103{
104 wxRect rect;
105
106 if ( treeCtrl->GetBoundingRect(id, rect, true) )
107 {
108 if ( size.x < rect.x + rect.width )
109 size.x = rect.x + rect.width;
110 if ( size.y < rect.y + rect.height )
111 size.y = rect.y + rect.height;
112 }
113
114 wxTreeItemIdValue cookie;
115 for ( wxTreeItemId item = treeCtrl->GetFirstChild(id, cookie);
116 item.IsOk();
117 item = treeCtrl->GetNextChild(item, cookie) )
118 {
119 wxGetBestTreeSize(treeCtrl, item, size);
120 }
121}
122
8cee4a30
VZ
123wxSize wxTreeCtrlBase::DoGetBestSize() const
124{
125 wxSize size;
126
127 // this doesn't really compute the total bounding rectangle of all items
128 // but a not too bad guess of it which has the advantage of not having to
129 // examine all (potentially hundreds or thousands) items in the control
7c384067
JS
130
131 if (GetQuickBestSize())
8cee4a30 132 {
7c384067
JS
133 for ( wxTreeItemId item = GetRootItem();
134 item.IsOk();
135 item = GetLastChild(item) )
8cee4a30 136 {
7c384067
JS
137 wxRect rect;
138
139 // last parameter is "true" to get only the dimensions of the text
140 // label, we don't want to get the entire item width as it's determined
141 // by the current size
142 if ( GetBoundingRect(item, rect, true) )
143 {
144 if ( size.x < rect.x + rect.width )
145 size.x = rect.x + rect.width;
146 if ( size.y < rect.y + rect.height )
147 size.y = rect.y + rect.height;
148 }
8cee4a30
VZ
149 }
150 }
7c384067
JS
151 else
152 wxGetBestTreeSize(this, GetRootItem(), size);
8cee4a30
VZ
153
154 // need some minimal size even for empty tree
155 if ( !size.x || !size.y )
156 size = wxControl::DoGetBestSize();
b24069f2
VZ
157 else
158 CacheBestSize(size);
8cee4a30
VZ
159
160 return size;
161}
162
1e6feb95
VZ
163#endif // wxUSE_TREECTRL
164