+// My frame constructor
+MyFrame::MyFrame(const wxString& title, int x, int y, int w, int h)
+ : wxFrame((wxFrame *)NULL, wxID_ANY, title, wxPoint(x, y), wxSize(w, h)),
+ m_treeCtrl(NULL)
+#if wxUSE_LOG
+ , m_textCtrl(NULL)
+#endif // wxUSE_LOG
+{
+ // This reduces flicker effects - even better would be to define
+ // OnEraseBackground to do nothing. When the tree control's scrollbars are
+ // show or hidden, the frame is sent a background erase event.
+ SetBackgroundColour(wxColour(255, 255, 255));
+
+ // Give it an icon
+ SetIcon(wxICON(mondrian));
+
+#if wxUSE_MENUS
+ // Make a menubar
+ wxMenu *file_menu = new wxMenu,
+ *style_menu = new wxMenu,
+ *tree_menu = new wxMenu,
+ *item_menu = new wxMenu;
+
+ file_menu->Append(TreeTest_About, wxT("&About..."));
+ file_menu->AppendSeparator();
+ file_menu->Append(TreeTest_Quit, wxT("E&xit\tAlt-X"));
+
+ style_menu->AppendCheckItem(TreeTest_TogButtons, wxT("Toggle &normal buttons"));
+ style_menu->AppendCheckItem(TreeTest_TogTwist, wxT("Toggle &twister buttons"));
+ style_menu->AppendCheckItem(TreeTest_ToggleButtons, wxT("Toggle image &buttons"));
+ style_menu->AppendSeparator();
+ style_menu->AppendCheckItem(TreeTest_TogLines, wxT("Toggle &connecting lines"));
+ style_menu->AppendCheckItem(TreeTest_TogRootLines, wxT("Toggle &lines at root"));
+ style_menu->AppendCheckItem(TreeTest_TogHideRoot, wxT("Toggle &hidden root"));
+ style_menu->AppendCheckItem(TreeTest_TogBorder, wxT("Toggle &item border"));
+ style_menu->AppendCheckItem(TreeTest_TogFullHighlight, wxT("Toggle &full row highlight"));
+ style_menu->AppendCheckItem(TreeTest_TogEdit, wxT("Toggle &edit mode"));
+#ifndef NO_MULTIPLE_SELECTION
+ style_menu->AppendCheckItem(TreeTest_ToggleSel, wxT("Toggle &selection mode"));
+#endif // NO_MULTIPLE_SELECTION
+ style_menu->AppendCheckItem(TreeTest_ToggleImages, wxT("Toggle show ima&ges"));
+ style_menu->Append(TreeTest_SetImageSize, wxT("Set image si&ze..."));
+ style_menu->AppendSeparator();
+ style_menu->Append(TreeTest_SetFgColour, wxT("Set &foreground colour..."));
+ style_menu->Append(TreeTest_SetBgColour, wxT("Set &background colour..."));
+ style_menu->AppendSeparator();
+ style_menu->Append(TreeTest_ResetStyle, wxT("&Reset to default\tF10"));
+
+ tree_menu->Append(TreeTest_Recreate, wxT("&Recreate the tree"));
+ tree_menu->Append(TreeTest_CollapseAndReset, wxT("C&ollapse and reset"));
+ tree_menu->AppendSeparator();
+ tree_menu->Append(TreeTest_AddItem, wxT("Append a &new item"));
+ tree_menu->Append(TreeTest_InsertItem, wxT("&Insert a new item"));
+ tree_menu->Append(TreeTest_Delete, wxT("&Delete this item"));
+ tree_menu->Append(TreeTest_DeleteChildren, wxT("Delete &children"));
+ tree_menu->Append(TreeTest_DeleteAll, wxT("Delete &all items"));
+ tree_menu->Append(TreeTest_SelectRoot, wxT("Select root item"));
+ tree_menu->AppendSeparator();
+ tree_menu->Append(TreeTest_Count, wxT("Count children of current item"));
+ tree_menu->Append(TreeTest_CountRec, wxT("Recursively count children of current item"));
+ tree_menu->AppendSeparator();
+ tree_menu->Append(TreeTest_Sort, wxT("Sort children of current item"));
+ tree_menu->Append(TreeTest_SortRev, wxT("Sort in reversed order"));
+ tree_menu->AppendSeparator();
+ tree_menu->Append(TreeTest_EnsureVisible, wxT("Make the last item &visible"));
+ tree_menu->AppendSeparator();
+ tree_menu->Append(TreeTest_IncIndent, wxT("Add 5 points to indentation\tAlt-I"));
+ tree_menu->Append(TreeTest_DecIndent, wxT("Reduce indentation by 5 points\tAlt-R"));
+ tree_menu->AppendSeparator();
+ tree_menu->Append(TreeTest_IncSpacing, wxT("Add 5 points to spacing\tCtrl-I"));
+ tree_menu->Append(TreeTest_DecSpacing, wxT("Reduce spacing by 5 points\tCtrl-R"));
+
+ item_menu->Append(TreeTest_Dump, wxT("&Dump item children"));
+ item_menu->Append(TreeTest_Rename, wxT("&Rename item..."));
+
+ item_menu->AppendSeparator();
+ item_menu->Append(TreeTest_SetBold, wxT("Make item &bold"));
+ item_menu->Append(TreeTest_ClearBold, wxT("Make item ¬ bold"));
+ item_menu->AppendSeparator();
+ item_menu->Append(TreeTest_ToggleIcon, wxT("Toggle the item's &icon"));
+
+#ifndef NO_MULTIPLE_SELECTION
+ item_menu->AppendSeparator();
+ item_menu->Append(TreeTest_DumpSelected, wxT("Dump selected items\tAlt-D"));
+ item_menu->Append(TreeTest_Select, wxT("Select current item\tAlt-S"));
+ item_menu->Append(TreeTest_Unselect, wxT("Unselect everything\tAlt-U"));
+#endif // NO_MULTIPLE_SELECTION
+
+ wxMenuBar *menu_bar = new wxMenuBar;
+ menu_bar->Append(file_menu, wxT("&File"));
+ menu_bar->Append(style_menu, wxT("&Style"));
+ menu_bar->Append(tree_menu, wxT("&Tree"));
+ menu_bar->Append(item_menu, wxT("&Item"));
+ SetMenuBar(menu_bar);
+#endif // wxUSE_MENUS
+
+#if wxUSE_LOG
+ // create the controls
+ m_textCtrl = new wxTextCtrl(this, wxID_ANY, wxT(""),
+ wxDefaultPosition, wxDefaultSize,
+ wxTE_MULTILINE | wxSUNKEN_BORDER);
+#endif // wxUSE_LOG
+
+ CreateTreeWithDefStyle();
+
+ menu_bar->Check(TreeTest_ToggleImages, true);
+
+#if wxUSE_STATUSBAR
+ // create a status bar
+ CreateStatusBar(2);
+#endif // wxUSE_STATUSBAR
+
+#if wxUSE_LOG
+#ifdef __WXMOTIF__
+ // For some reason, we get a memcpy crash in wxLogStream::DoLogStream
+ // on gcc/wxMotif, if we use wxLogTextCtl. Maybe it's just gcc?
+ delete wxLog::SetActiveTarget(new wxLogStderr);
+#else
+ // set our text control as the log target
+ wxLogTextCtrl *logWindow = new wxLogTextCtrl(m_textCtrl);
+ delete wxLog::SetActiveTarget(logWindow);