- // Create the main frame window
- MyFrame *frame = new MyFrame((wxFrame *) NULL, (char *) "wxTreeCtrl Test", 50, 50, 450, 340);
-
- // 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.
- frame->SetBackgroundColour(wxColour(255, 255, 255));
-
- // Give it an icon
- frame->SetIcon(wxICON(mondrian));
-
- // Make an image list containing small icons
- m_imageListNormal = new wxImageList(16, 16, TRUE);
-
- m_imageListNormal->Add(wxICON(icon1));
- m_imageListNormal->Add(wxICON(icon2));
-
- // Make a menubar
- wxMenu *file_menu = new wxMenu;
-
- file_menu->Append(TREE_ABOUT, "&About");
- file_menu->Append(TREE_QUIT, "E&xit");
- wxMenuBar *menu_bar = new wxMenuBar;
- menu_bar->Append(file_menu, "&File");
- frame->SetMenuBar(menu_bar);
-
- // Make a panel with a message
- frame->m_treeCtrl = new MyTreeCtrl(frame, TREE_CTRL, wxPoint(0, 0), wxSize(400, 200),
- wxTR_HAS_BUTTONS|wxSUNKEN_BORDER);
- frame->m_logWindow = new wxTextCtrl(frame, -1, "", wxPoint(0, 0), wxSize(400, 200),
- wxTE_MULTILINE|wxSUNKEN_BORDER);
-
- wxLayoutConstraints *c = new wxLayoutConstraints;
- c->top.SameAs (frame, wxTop);
- c->left.SameAs (frame, wxLeft);
- c->right.SameAs (frame, wxRight);
- c->height.PercentOf (frame, wxHeight, 66);
- frame->m_treeCtrl->SetConstraints(c);
-
- c = new wxLayoutConstraints;
- c->top.Below (frame->m_treeCtrl);
- c->left.SameAs (frame, wxLeft);
- c->right.SameAs (frame, wxRight);
- c->bottom.SameAs (frame, wxBottom);
- frame->m_logWindow->SetConstraints(c);
- frame->SetAutoLayout(TRUE);
-
- frame->m_treeCtrl->SetImageList(wxGetApp().m_imageListNormal, wxIMAGE_LIST_NORMAL);
-
- long rootId = frame->m_treeCtrl->InsertItem(0, "Root", 0);
-
- char buf[20];
- int i;
- wxString str;
-
- for ( i = 0; i < 10; i++)
- {
- sprintf(buf, "Folder child %d", i);
- str = buf;
- long id = frame->m_treeCtrl->InsertItem(rootId, str, 0);
- int j;
- for ( j = 0; j < 5; j++)
+ // Create the main frame window
+ MyFrame *frame = new MyFrame(wxT("wxTreeCtrl Test"), 50, 50, 450, 600);
+
+ // Show the frame
+ frame->Show(TRUE);
+ SetTopWindow(frame);
+
+ return TRUE;
+}
+
+
+// My frame constructor
+MyFrame::MyFrame(const wxString& title, int x, int y, int w, int h)
+ : wxFrame((wxFrame *)NULL, -1, title, wxPoint(x, y), wxSize(w, h)),
+ m_treeCtrl(NULL), m_textCtrl(NULL)
+{
+ // 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->Append(TreeTest_TogButtons, "Toggle &normal buttons", _T(""), TRUE);
+ style_menu->Append(TreeTest_TogTwist, "Toggle &twister buttons", _T(""), TRUE);
+ style_menu->Append(TreeTest_ToggleButtons, "Toggle image &buttons", _T(""), TRUE);
+ style_menu->AppendSeparator();
+ style_menu->Append(TreeTest_TogLines, "Toggle &connecting lines", _T(""), TRUE);
+ style_menu->Append(TreeTest_TogRootLines, "Toggle &lines at root", _T(""), TRUE);
+ style_menu->Append(TreeTest_TogHideRoot, "Toggle &hidden root", _T(""), TRUE);
+ style_menu->Append(TreeTest_TogBorder, "Toggle &item border", _T(""), TRUE);
+ style_menu->Append(TreeTest_TogFullHighlight, "Toggle &full row highlight", _T(""), TRUE);
+ style_menu->Append(TreeTest_TogEdit, "Toggle &edit mode", _T(""), TRUE);
+#ifndef NO_MULTIPLE_SELECTION
+ style_menu->Append(TreeTest_ToggleSel, wxT("Toggle &selection mode"), _T(""), TRUE);
+#endif // NO_MULTIPLE_SELECTION
+ style_menu->Append(TreeTest_ToggleImages, wxT("Toggle show ima&ges"), _T(""), TRUE);
+ 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, "&Recreate the tree");
+ tree_menu->Append(TreeTest_CollapseAndReset, "C&ollapse and reset");
+ tree_menu->AppendSeparator();
+ tree_menu->Append(TreeTest_AddItem, "Append a &new item");
+ tree_menu->Append(TreeTest_InsertItem, "&Insert a new item");
+ tree_menu->Append(TreeTest_Delete, "&Delete this item");
+ tree_menu->Append(TreeTest_DeleteChildren, "Delete &children");
+ tree_menu->Append(TreeTest_DeleteAll, "Delete &all items");
+ tree_menu->AppendSeparator();
+ tree_menu->Append(TreeTest_Count, "Count children of current item");
+ tree_menu->Append(TreeTest_CountRec, "Recursively count children of current item");
+ tree_menu->AppendSeparator();
+ tree_menu->Append(TreeTest_Sort, "Sort children of current item");
+ tree_menu->Append(TreeTest_SortRev, "Sort in reversed order");
+ tree_menu->AppendSeparator();
+ tree_menu->Append(TreeTest_EnsureVisible, "Make the last item &visible");
+ tree_menu->AppendSeparator();
+ tree_menu->Append(TreeTest_IncIndent, "Add 5 points to indentation\tAlt-I");
+ tree_menu->Append(TreeTest_DecIndent, "Reduce indentation by 5 points\tAlt-R");
+ tree_menu->AppendSeparator();
+ tree_menu->Append(TreeTest_IncSpacing, "Add 5 points to spacing\tCtrl-I");
+ tree_menu->Append(TreeTest_DecSpacing, "Reduce spacing by 5 points\tCtrl-R");
+
+ item_menu->Append(TreeTest_Dump, "&Dump item children");
+ item_menu->Append(TreeTest_Rename, "&Rename item...");
+
+ item_menu->AppendSeparator();
+ item_menu->Append(TreeTest_SetBold, "Make item &bold");
+ item_menu->Append(TreeTest_ClearBold, "Make item ¬ bold");
+ item_menu->AppendSeparator();
+ item_menu->Append(TreeTest_ToggleIcon, "Toggle the item's &icon");
+
+#ifndef NO_MULTIPLE_SELECTION
+ item_menu->AppendSeparator();
+ item_menu->Append(TreeTest_DumpSelected, "Dump selected items\tAlt-D");
+ item_menu->Append(TreeTest_Select, "Select current item\tAlt-S");
+ item_menu->Append(TreeTest_Unselect, "Unselect everything\tAlt-U");
+#endif // NO_MULTIPLE_SELECTION
+
+ wxMenuBar *menu_bar = new wxMenuBar;
+ menu_bar->Append(file_menu, "&File");
+ menu_bar->Append(style_menu, "&Style");
+ menu_bar->Append(tree_menu, "&Tree");
+ menu_bar->Append(item_menu, "&Item");
+ SetMenuBar(menu_bar);
+#endif // wxUSE_MENUS
+
+ // create the controls
+ m_textCtrl = new wxTextCtrl(this, -1, "",
+ wxDefaultPosition, wxDefaultSize,
+ wxTE_MULTILINE | wxSUNKEN_BORDER);
+
+ CreateTreeWithDefStyle();
+
+ menu_bar->Check(TreeTest_ToggleImages, TRUE);
+
+ // create a status bar with 3 panes
+ CreateStatusBar(3);
+ SetStatusText("", 0);
+
+#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);
+#endif
+}
+
+MyFrame::~MyFrame()
+{
+ delete wxLog::SetActiveTarget(NULL);
+}
+
+void MyFrame::CreateTreeWithDefStyle()
+{
+ long style = wxTR_DEFAULT_STYLE |
+#ifndef NO_VARIABLE_HEIGHT
+ wxTR_HAS_VARIABLE_ROW_HEIGHT |
+#endif
+ wxTR_EDIT_LABELS;
+
+ CreateTree(style | wxSUNKEN_BORDER);
+
+ // as we don't know what wxTR_DEFAULT_STYLE could contain, test for
+ // everything
+ wxMenuBar *mbar = GetMenuBar();
+ mbar->Check(TreeTest_TogButtons, (style & wxTR_HAS_BUTTONS) != 0);
+ mbar->Check(TreeTest_TogButtons, (style & wxTR_TWIST_BUTTONS) != 0);
+ mbar->Check(TreeTest_TogLines, (style & wxTR_NO_LINES) == 0);
+ mbar->Check(TreeTest_TogRootLines, (style & wxTR_LINES_AT_ROOT) != 0);
+ mbar->Check(TreeTest_TogHideRoot, (style & wxTR_HIDE_ROOT) != 0);
+ mbar->Check(TreeTest_TogEdit, (style & wxTR_EDIT_LABELS) != 0);
+ mbar->Check(TreeTest_TogBorder, (style & wxTR_ROW_LINES) != 0);
+ mbar->Check(TreeTest_TogFullHighlight, (style & wxTR_FULL_ROW_HIGHLIGHT) != 0);
+}
+
+void MyFrame::CreateTree(long style)
+{
+ m_treeCtrl = new MyTreeCtrl(this, TreeTest_Ctrl,
+ wxDefaultPosition, wxDefaultSize,
+ style);
+ Resize();
+}
+
+void MyFrame::TogStyle(int id, long flag)
+{
+ long style = m_treeCtrl->GetWindowStyle() ^ flag;
+
+ // most treectrl styles can't be changed on the fly using the native
+ // control and the tree must be recreated
+#ifndef __WXMSW__
+ m_treeCtrl->SetWindowStyle(style);
+#else // MSW
+ delete m_treeCtrl;
+ CreateTree(style);
+#endif // !MSW/MSW
+
+ GetMenuBar()->Check(id, (style & flag) != 0);
+}
+
+void MyFrame::OnSize(wxSizeEvent& event)
+{
+ if ( m_treeCtrl && m_textCtrl )