]> git.saurik.com Git - wxWidgets.git/blob - samples/treectrl/treetest.cpp
In DialogEd, changed Close to Destroy to make it shut down properly.
[wxWidgets.git] / samples / treectrl / treetest.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: treetest.cpp
3 // Purpose: wxTreeCtrl sample
4 // Author: Julian Smart
5 // Modified by:
6 // Created: 04/01/98
7 // RCS-ID: $Id$
8 // Copyright: (c) Julian Smart and Markus Holzem
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
11
12 #ifdef __GNUG__
13 #pragma implementation
14 #pragma interface
15 #endif
16
17 // For compilers that support precompilation, includes "wx/wx.h".
18 #include "wx/wxprec.h"
19
20 #ifdef __BORLANDC__
21 #pragma hdrstop
22 #endif
23
24 #ifndef WX_PRECOMP
25 #include "wx/wx.h"
26 #endif
27
28 // under Windows the icons are in the .rc file
29 #ifndef __WXMSW__
30 #include "icon1.xpm"
31 #include "icon2.xpm"
32 #include "mondrian.xpm"
33 #endif
34
35 #include "wx/log.h"
36
37 #include "wx/imaglist.h"
38 #include "wx/treectrl.h"
39
40 #include "treetest.h"
41
42 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
43 EVT_MENU(TreeTest_Quit, MyFrame::OnQuit)
44 EVT_MENU(TreeTest_About, MyFrame::OnAbout)
45 EVT_MENU(TreeTest_Dump, MyFrame::OnDump)
46 EVT_MENU(TreeTest_Bold, MyFrame::OnSetBold)
47 EVT_MENU(TreeTest_UnBold, MyFrame::OnClearBold)
48 EVT_MENU(TreeTest_Delete, MyFrame::OnDelete)
49 EVT_MENU(TreeTest_DeleteChildren, MyFrame::OnDeleteChildren)
50 EVT_MENU(TreeTest_DeleteAll, MyFrame::OnDeleteAll)
51 EVT_MENU(TreeTest_Recreate, MyFrame::OnRecreate)
52 END_EVENT_TABLE()
53
54 BEGIN_EVENT_TABLE(MyTreeCtrl, wxTreeCtrl)
55 EVT_TREE_BEGIN_DRAG(TreeTest_Ctrl, MyTreeCtrl::OnBeginDrag)
56 EVT_TREE_BEGIN_RDRAG(TreeTest_Ctrl, MyTreeCtrl::OnBeginRDrag)
57 EVT_TREE_BEGIN_LABEL_EDIT(TreeTest_Ctrl, MyTreeCtrl::OnBeginLabelEdit)
58 EVT_TREE_END_LABEL_EDIT(TreeTest_Ctrl, MyTreeCtrl::OnEndLabelEdit)
59 EVT_TREE_DELETE_ITEM(TreeTest_Ctrl, MyTreeCtrl::OnDeleteItem)
60 EVT_TREE_GET_INFO(TreeTest_Ctrl, MyTreeCtrl::OnGetInfo)
61 EVT_TREE_SET_INFO(TreeTest_Ctrl, MyTreeCtrl::OnSetInfo)
62 EVT_TREE_ITEM_EXPANDED(TreeTest_Ctrl, MyTreeCtrl::OnItemExpanded)
63 EVT_TREE_ITEM_EXPANDING(TreeTest_Ctrl, MyTreeCtrl::OnItemExpanding)
64 EVT_TREE_ITEM_COLLAPSED(TreeTest_Ctrl, MyTreeCtrl::OnItemCollapsed)
65 EVT_TREE_ITEM_COLLAPSING(TreeTest_Ctrl, MyTreeCtrl::OnItemCollapsing)
66 EVT_TREE_SEL_CHANGED(TreeTest_Ctrl, MyTreeCtrl::OnSelChanged)
67 EVT_TREE_SEL_CHANGING(TreeTest_Ctrl, MyTreeCtrl::OnSelChanging)
68 EVT_TREE_KEY_DOWN(TreeTest_Ctrl, MyTreeCtrl::OnTreeKeyDown)
69 EVT_TREE_ITEM_ACTIVATED(TreeTest_Ctrl, MyTreeCtrl::OnItemActivated)
70 END_EVENT_TABLE()
71
72 IMPLEMENT_APP(MyApp)
73
74 // `Main program' equivalent, creating windows and returning main app frame
75 bool MyApp::OnInit()
76 {
77 // Create the main frame window
78 MyFrame *frame = new MyFrame("wxTreeCtrl Test", 50, 50, 450, 340);
79
80 // Show the frame
81 frame->Show(TRUE);
82 SetTopWindow(frame);
83
84 return TRUE;
85 }
86
87
88 // My frame constructor
89 MyFrame::MyFrame(const wxString& title, int x, int y, int w, int h)
90 : wxFrame((wxFrame *)NULL, -1, title, wxPoint(x, y), wxSize(w, h))
91 {
92 // This reduces flicker effects - even better would be to define
93 // OnEraseBackground to do nothing. When the tree control's scrollbars are
94 // show or hidden, the frame is sent a background erase event.
95 SetBackgroundColour(wxColour(255, 255, 255));
96
97 // Give it an icon
98 SetIcon(wxICON(mondrian));
99
100 // Make a menubar
101 wxMenu *file_menu = new wxMenu;
102
103 file_menu->Append(TreeTest_Dump, "D&ump tree items");
104 file_menu->Append(TreeTest_Recreate, "&Recreate the tree");
105 file_menu->AppendSeparator();
106 file_menu->Append(TreeTest_Delete, "&Delete this item");
107 file_menu->Append(TreeTest_DeleteChildren, "Delete &children");
108 file_menu->Append(TreeTest_DeleteAll, "Delete &all items");
109 file_menu->AppendSeparator();
110 file_menu->Append(TreeTest_Bold, "Make item &bold");
111 file_menu->Append(TreeTest_UnBold, "Make item &not bold");
112 file_menu->AppendSeparator();
113 file_menu->Append(TreeTest_About, "&About...");
114 file_menu->AppendSeparator();
115 file_menu->Append(TreeTest_Quit, "E&xit");
116
117 wxMenuBar *menu_bar = new wxMenuBar;
118 menu_bar->Append(file_menu, "&File");
119 SetMenuBar(menu_bar);
120
121 // Make a panel with a message
122 m_treeCtrl = new MyTreeCtrl(this, TreeTest_Ctrl,
123 wxDefaultPosition, wxDefaultSize,
124 wxTR_HAS_BUTTONS | wxSUNKEN_BORDER);
125 wxTextCtrl *textCtrl = new wxTextCtrl(this, -1, "",
126 wxDefaultPosition, wxDefaultSize,
127 wxTE_MULTILINE | wxSUNKEN_BORDER);
128
129 wxLayoutConstraints *c = new wxLayoutConstraints;
130 c->top.SameAs(this, wxTop);
131 c->left.SameAs(this, wxLeft);
132 c->right.SameAs(this, wxRight);
133 c->height.PercentOf(this, wxHeight, 66);
134 m_treeCtrl->SetConstraints(c);
135
136 c = new wxLayoutConstraints;
137 c->top.Below(m_treeCtrl);
138 c->left.SameAs(this, wxLeft);
139 c->right.SameAs(this, wxRight);
140 c->bottom.SameAs(this, wxBottom);
141 textCtrl->SetConstraints(c);
142 SetAutoLayout(TRUE);
143
144 // create a status bar with 3 panes
145 CreateStatusBar(3);
146 SetStatusText("", 0);
147
148 #ifdef __WXMOTIF__
149 // For some reason, we get a memcpy crash in wxLogStream::DoLogStream
150 // on gcc/wxMotif, if we use wxLogTextCtl. Maybe it's just gcc?
151 delete wxLog::SetActiveTarget(new wxLogStderr);
152 #else
153 // set our text control as the log target
154 wxLogTextCtrl *logWindow = new wxLogTextCtrl(textCtrl);
155 delete wxLog::SetActiveTarget(logWindow);
156 #endif
157 }
158
159 MyFrame::~MyFrame()
160 {
161 delete wxLog::SetActiveTarget(NULL);
162 }
163
164 void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
165 {
166 Close(TRUE);
167 }
168
169 void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
170 {
171 wxMessageDialog dialog(this,
172 "Tree test sample\n"
173 "Julian Smart (c) 1997",
174 "About tree test", wxOK);
175
176 dialog.ShowModal();
177 }
178
179 void MyFrame::OnDump(wxCommandEvent& WXUNUSED(event))
180 {
181 wxTreeItemId root = m_treeCtrl->GetSelection();
182 m_treeCtrl->GetItemsRecursively(root, -1);
183 }
184
185 void MyFrame::DoSetBold(bool bold)
186 {
187 m_treeCtrl->SetItemBold(m_treeCtrl->GetSelection(), bold);
188 }
189
190 void MyFrame::OnDelete(wxCommandEvent& WXUNUSED(event))
191 {
192 wxTreeItemId item = m_treeCtrl->GetSelection();
193 m_treeCtrl->Delete(item);
194 }
195
196 void MyFrame::OnDeleteChildren(wxCommandEvent& WXUNUSED(event))
197 {
198 wxTreeItemId item = m_treeCtrl->GetSelection();
199 m_treeCtrl->DeleteChildren(item);
200 }
201
202 void MyFrame::OnDeleteAll(wxCommandEvent& WXUNUSED(event))
203 {
204 m_treeCtrl->DeleteAllItems();
205 }
206
207 void MyFrame::OnRecreate(wxCommandEvent& event)
208 {
209 OnDeleteAll(event);
210 m_treeCtrl->AddTestItemsToTree(3, 2);
211 }
212
213 // MyTreeCtrl implementation
214 MyTreeCtrl::MyTreeCtrl(wxWindow *parent, const wxWindowID id,
215 const wxPoint& pos, const wxSize& size,
216 long style)
217 : wxTreeCtrl(parent, id, pos, size, style)
218 {
219 // Make an image list containing small icons
220 m_imageListNormal = new wxImageList(16, 16, TRUE);
221
222 // should correspond to TreeCtrlIcon_xxx enum
223 m_imageListNormal->Add(wxICON(icon1));
224 m_imageListNormal->Add(wxICON(icon2));
225
226 SetImageList(m_imageListNormal);
227
228 // Add some items to the tree
229 AddTestItemsToTree(3, 2);
230 }
231
232 MyTreeCtrl::~MyTreeCtrl()
233 {
234 delete m_imageListNormal;
235 }
236
237 void MyTreeCtrl::AddItemsRecursively(const wxTreeItemId& idParent,
238 size_t numChildren,
239 size_t depth,
240 size_t folder)
241 {
242 if ( depth > 0 )
243 {
244 wxString str;
245 for ( size_t n = 0; n < numChildren; n++ )
246 {
247 // at depth 1 elements won't have any more children
248 if (depth == 1)
249 str.Printf("%s child %d.%d", "File", folder, n + 1);
250 else
251 str.Printf("%s child %d","Folder", n + 1);
252
253 int image = depth == 1 ? TreeCtrlIcon_File : TreeCtrlIcon_Folder;
254 wxTreeItemId id = AppendItem(idParent, str, image, image,
255 new MyTreeItemData(str));
256 AddItemsRecursively(id, numChildren, depth - 1, n + 1);
257 }
258 }
259 //else: done!
260 }
261
262 void MyTreeCtrl::AddTestItemsToTree(size_t numChildren,
263 size_t depth)
264 {
265 wxTreeItemId rootId = AddRoot("Root",
266 TreeCtrlIcon_Folder, TreeCtrlIcon_Folder,
267 new MyTreeItemData("Root item"));
268
269 AddItemsRecursively(rootId, numChildren, depth, 0);
270 }
271
272 void MyTreeCtrl::GetItemsRecursively(const wxTreeItemId& idParent, long cookie)
273 {
274 wxTreeItemId id;
275
276 if( cookie == -1 )
277 id = GetFirstChild(idParent, cookie);
278 else
279 id = GetNextChild(idParent, cookie);
280
281 if(id <= 0)
282 return;
283
284 wxString text=GetItemText(id);
285 wxLogMessage(text);
286
287 if (ItemHasChildren(id))
288 GetItemsRecursively(id,-1);
289
290 GetItemsRecursively(idParent, cookie);
291 }
292
293
294 // avoid repetition
295 #define TREE_EVENT_HANDLER(name) \
296 void MyTreeCtrl::name(wxTreeEvent& WXUNUSED(event)) \
297 { \
298 wxLogMessage(#name); \
299 }
300
301 TREE_EVENT_HANDLER(OnBeginDrag)
302 TREE_EVENT_HANDLER(OnBeginRDrag)
303 TREE_EVENT_HANDLER(OnBeginLabelEdit)
304 TREE_EVENT_HANDLER(OnEndLabelEdit)
305 TREE_EVENT_HANDLER(OnDeleteItem)
306 TREE_EVENT_HANDLER(OnGetInfo)
307 TREE_EVENT_HANDLER(OnSetInfo)
308 TREE_EVENT_HANDLER(OnItemExpanded)
309 TREE_EVENT_HANDLER(OnItemExpanding)
310 TREE_EVENT_HANDLER(OnItemCollapsed)
311 TREE_EVENT_HANDLER(OnSelChanged)
312 TREE_EVENT_HANDLER(OnSelChanging)
313
314 #undef TREE_EVENT_HANDLER
315
316 void MyTreeCtrl::OnItemCollapsing(wxTreeEvent& event)
317 {
318 wxLogMessage("OnItemCollapsing");
319
320 // for testing, prevent the user from collapsing the root item
321 wxTreeItemId itemId = event.GetItem();
322 if ( !GetParent(itemId).IsOk() )
323 {
324 wxMessageBox("You can't collapse the root item.");
325
326 event.Veto();
327 }
328 }
329
330 void MyTreeCtrl::OnTreeKeyDown(wxTreeEvent&WXUNUSED(event))
331 {
332 wxLogMessage("OnTreeKeyDown");
333 }
334
335 void MyTreeCtrl::OnItemActivated(wxTreeEvent&WXUNUSED(event))
336 {
337 // show some info about this item
338 wxTreeItemId itemId = GetSelection();
339 MyTreeItemData *item = (MyTreeItemData *)GetItemData(itemId);
340
341 if ( item != NULL )
342 {
343 item->ShowInfo(this);
344 }
345
346 wxLogMessage("OnItemActivated");
347 }
348
349 static inline const char *Bool2String(bool b)
350 {
351 return b ? "" : "not ";
352 }
353
354 void MyTreeItemData::ShowInfo(wxTreeCtrl *tree)
355 {
356 wxLogMessage("Item '%s': %sselected, %sexpanded, %sbold,\n"
357 "%u children (%u immediately under this item).",
358 m_desc.c_str(),
359 Bool2String(tree->IsSelected(GetId())),
360 Bool2String(tree->IsExpanded(GetId())),
361 Bool2String(tree->IsBold(GetId())),
362 tree->GetChildrenCount(GetId()),
363 tree->GetChildrenCount(GetId(), FALSE));
364 }