]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/treectrl/treetest.cpp
corrected (?) wxStringList::Delete()
[wxWidgets.git] / samples / treectrl / treetest.cpp
index 8c3e7ba0fa8962b3d903705b4cad57d8bbf8af00..17d2ac3490bb6aeccb22f70fedb8a539dc7aa8ec 100644 (file)
 #include "treetest.h"
 
 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
-  EVT_MENU(TREE_QUIT, MyFrame::OnQuit)
-  EVT_MENU(TREE_ABOUT, MyFrame::OnAbout)
+  EVT_MENU(TreeTest_Quit, MyFrame::OnQuit)
+  EVT_MENU(TreeTest_About, MyFrame::OnAbout)
+  EVT_MENU(TreeTest_Dump, MyFrame::OnDump)
+  EVT_MENU(TreeTest_Bold, MyFrame::OnSetBold)
+  EVT_MENU(TreeTest_UnBold, MyFrame::OnClearBold)
+  EVT_MENU(TreeTest_Delete, MyFrame::OnDelete)
+  EVT_MENU(TreeTest_DeleteAll, MyFrame::OnDeleteAll)
+  EVT_MENU(TreeTest_Recreate, MyFrame::OnRecreate)
 END_EVENT_TABLE()
 
 BEGIN_EVENT_TABLE(MyTreeCtrl, wxTreeCtrl)
-  EVT_TREE_BEGIN_DRAG(TREE_CTRL, MyTreeCtrl::OnBeginDrag)
-  EVT_TREE_BEGIN_RDRAG(TREE_CTRL, MyTreeCtrl::OnBeginRDrag)
-  EVT_TREE_BEGIN_LABEL_EDIT(TREE_CTRL, MyTreeCtrl::OnBeginLabelEdit)
-  EVT_TREE_END_LABEL_EDIT(TREE_CTRL, MyTreeCtrl::OnEndLabelEdit)
-  EVT_TREE_DELETE_ITEM(TREE_CTRL, MyTreeCtrl::OnDeleteItem)
-  EVT_TREE_GET_INFO(TREE_CTRL, MyTreeCtrl::OnGetInfo)
-  EVT_TREE_SET_INFO(TREE_CTRL, MyTreeCtrl::OnSetInfo)
-  EVT_TREE_ITEM_EXPANDED(TREE_CTRL, MyTreeCtrl::OnItemExpanded)
-  EVT_TREE_ITEM_EXPANDING(TREE_CTRL, MyTreeCtrl::OnItemExpanding)
-  EVT_TREE_ITEM_COLLAPSED(TREE_CTRL, MyTreeCtrl::OnItemCollapsed)
-  EVT_TREE_ITEM_COLLAPSING(TREE_CTRL, MyTreeCtrl::OnItemCollapsing)
-  EVT_TREE_SEL_CHANGED(TREE_CTRL, MyTreeCtrl::OnSelChanged)
-  EVT_TREE_SEL_CHANGING(TREE_CTRL, MyTreeCtrl::OnSelChanging)
-  EVT_TREE_KEY_DOWN(TREE_CTRL, MyTreeCtrl::OnKeyDown)
+  EVT_TREE_BEGIN_DRAG(TreeTest_Ctrl, MyTreeCtrl::OnBeginDrag)
+  EVT_TREE_BEGIN_RDRAG(TreeTest_Ctrl, MyTreeCtrl::OnBeginRDrag)
+  EVT_TREE_BEGIN_LABEL_EDIT(TreeTest_Ctrl, MyTreeCtrl::OnBeginLabelEdit)
+  EVT_TREE_END_LABEL_EDIT(TreeTest_Ctrl, MyTreeCtrl::OnEndLabelEdit)
+  EVT_TREE_DELETE_ITEM(TreeTest_Ctrl, MyTreeCtrl::OnDeleteItem)
+  EVT_TREE_GET_INFO(TreeTest_Ctrl, MyTreeCtrl::OnGetInfo)
+  EVT_TREE_SET_INFO(TreeTest_Ctrl, MyTreeCtrl::OnSetInfo)
+  EVT_TREE_ITEM_EXPANDED(TreeTest_Ctrl, MyTreeCtrl::OnItemExpanded)
+  EVT_TREE_ITEM_EXPANDING(TreeTest_Ctrl, MyTreeCtrl::OnItemExpanding)
+  EVT_TREE_ITEM_COLLAPSED(TreeTest_Ctrl, MyTreeCtrl::OnItemCollapsed)
+  EVT_TREE_ITEM_COLLAPSING(TreeTest_Ctrl, MyTreeCtrl::OnItemCollapsing)
+  EVT_TREE_SEL_CHANGED(TreeTest_Ctrl, MyTreeCtrl::OnSelChanged)
+  EVT_TREE_SEL_CHANGING(TreeTest_Ctrl, MyTreeCtrl::OnSelChanging)
+  EVT_TREE_KEY_DOWN(TreeTest_Ctrl, MyTreeCtrl::OnTreeKeyDown)
 END_EVENT_TABLE()
 
 IMPLEMENT_APP(MyApp)
@@ -92,14 +98,24 @@ MyFrame::MyFrame(const wxString& title, int x, int y, int w, int h)
   // Make a menubar
   wxMenu *file_menu = new wxMenu;
 
-  file_menu->Append(TREE_ABOUT, "&About...");
-  file_menu->Append(TREE_QUIT, "E&xit");
+  file_menu->Append(TreeTest_Dump, "D&ump tree items");
+  file_menu->Append(TreeTest_Delete, "&Delete this item");
+  file_menu->Append(TreeTest_DeleteAll, "Delete &all items");
+  file_menu->Append(TreeTest_Recreate, "&Recreate the tree");
+  file_menu->AppendSeparator();
+  file_menu->Append(TreeTest_Bold, "Make item &bold");
+  file_menu->Append(TreeTest_UnBold, "Make item &not bold");
+  file_menu->AppendSeparator();
+  file_menu->Append(TreeTest_About, "&About...");
+  file_menu->AppendSeparator();
+  file_menu->Append(TreeTest_Quit, "E&xit");
+
   wxMenuBar *menu_bar = new wxMenuBar;
   menu_bar->Append(file_menu, "&File");
   SetMenuBar(menu_bar);
 
   // Make a panel with a message
-  m_treeCtrl = new MyTreeCtrl(this, TREE_CTRL,
+  m_treeCtrl = new MyTreeCtrl(this, TreeTest_Ctrl,
                               wxDefaultPosition, wxDefaultSize,
                               wxTR_HAS_BUTTONS | wxSUNKEN_BORDER);
   wxTextCtrl *textCtrl = new wxTextCtrl(this, -1, "",
@@ -125,9 +141,15 @@ MyFrame::MyFrame(const wxString& title, int x, int y, int w, int h)
   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(textCtrl);
   delete wxLog::SetActiveTarget(logWindow);
+#endif
 }
 
 MyFrame::~MyFrame()
@@ -142,12 +164,42 @@ void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
 
 void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
 {
-  wxMessageDialog dialog(this, "Tree test sample\nJulian Smart (c) 1997",
+  wxMessageDialog dialog(this,
+                         "Tree test sample\n"
+                         "Julian Smart (c) 1997",
                          "About tree test", wxOK);
 
   dialog.ShowModal();
 }
 
+void MyFrame::OnDump(wxCommandEvent& WXUNUSED(event))
+{
+  wxTreeItemId root = m_treeCtrl->GetSelection();
+  m_treeCtrl->GetItemsRecursively(root, -1);
+}
+
+void MyFrame::DoSetBold(bool bold)
+{
+  m_treeCtrl->SetItemBold(m_treeCtrl->GetSelection(), bold);
+}
+
+void MyFrame::OnDelete(wxCommandEvent& WXUNUSED(event))
+{
+  wxTreeItemId item = m_treeCtrl->GetSelection();
+  m_treeCtrl->Delete(item);
+}
+
+void MyFrame::OnDeleteAll(wxCommandEvent& WXUNUSED(event))
+{
+  m_treeCtrl->DeleteAllItems();
+}
+
+void MyFrame::OnRecreate(wxCommandEvent& event)
+{
+  OnDeleteAll(event);
+  m_treeCtrl->AddTestItemsToTree(3, 2);
+}
+
 // MyTreeCtrl implementation
 MyTreeCtrl::MyTreeCtrl(wxWindow *parent, const wxWindowID id,
                        const wxPoint& pos, const wxSize& size,
@@ -164,7 +216,7 @@ MyTreeCtrl::MyTreeCtrl(wxWindow *parent, const wxWindowID id,
   SetImageList(m_imageListNormal);
 
   // Add some items to the tree
-  AddTestItemsToTree(4, 3);
+  AddTestItemsToTree(3, 2);
 }
 
 MyTreeCtrl::~MyTreeCtrl()
@@ -174,7 +226,8 @@ MyTreeCtrl::~MyTreeCtrl()
 
 void MyTreeCtrl::AddItemsRecursively(const wxTreeItemId& idParent,
                                      size_t numChildren,
-                                     size_t depth)
+                                     size_t depth,
+                                     size_t folder)
 {
   if ( depth > 0 )
   {
@@ -182,11 +235,15 @@ void MyTreeCtrl::AddItemsRecursively(const wxTreeItemId& idParent,
     for ( size_t n = 0; n < numChildren; n++ )
     {
       // at depth 1 elements won't have any more children
-      str.Printf("%s child %d", depth == 1 ? "File" : "Folder", n + 1);
+      if (depth == 1)
+        str.Printf("%s child %d.%d", "File", folder, n + 1);
+      else
+        str.Printf("%s child %d","Folder", n + 1);
+
       int image = depth == 1 ? TreeCtrlIcon_File : TreeCtrlIcon_Folder;
       wxTreeItemId id = AppendItem(idParent, str, image, image,
                                    new MyTreeItemData(str));
-      AddItemsRecursively(id, numChildren, depth - 1);
+      AddItemsRecursively(id, numChildren, depth - 1, n + 1);
     }
   }
   //else: done!
@@ -195,13 +252,35 @@ void MyTreeCtrl::AddItemsRecursively(const wxTreeItemId& idParent,
 void MyTreeCtrl::AddTestItemsToTree(size_t numChildren,
                                     size_t depth)
 {
-  long rootId = AddRoot("Root",
+  wxTreeItemId rootId = AddRoot("Root",
                         TreeCtrlIcon_Folder, TreeCtrlIcon_Folder,
                         new MyTreeItemData("Root item"));
 
-  AddItemsRecursively(rootId, numChildren, depth);
+  AddItemsRecursively(rootId, numChildren, depth, 0);
 }
 
+void MyTreeCtrl::GetItemsRecursively(const wxTreeItemId& idParent, long cookie)
+{
+  wxTreeItemId id;
+
+  if( cookie == -1 )
+    id = GetFirstChild(idParent, cookie);
+  else
+    id = GetNextChild(idParent, cookie);
+
+  if(id <= 0)
+    return;
+
+  wxString text=GetItemText(id);
+  wxLogMessage(text);
+
+  if (ItemHasChildren(id))
+    GetItemsRecursively(id,-1);
+
+  GetItemsRecursively(idParent, cookie);
+}
+
+
 // avoid repetition
 #define TREE_EVENT_HANDLER(name)                                \
     void MyTreeCtrl::name(wxTreeEvent& WXUNUSED(event))         \
@@ -238,7 +317,7 @@ void MyTreeCtrl::OnItemCollapsing(wxTreeEvent& event)
   }
 }
 
-void MyTreeCtrl::OnKeyDown(wxTreeEvent& event)
+void MyTreeCtrl::OnTreeKeyDown(wxTreeEvent&WXUNUSED(event))
 {
   // show some info about this item
   wxTreeItemId itemId = GetSelection();
@@ -249,7 +328,7 @@ void MyTreeCtrl::OnKeyDown(wxTreeEvent& event)
     item->ShowInfo(this);
   }
 
-  wxLogMessage("OnKeyDown");
+  wxLogMessage("OnTreeKeyDown");
 }
 
 static inline const char *Bool2String(bool b)
@@ -259,8 +338,12 @@ static inline const char *Bool2String(bool b)
 
 void MyTreeItemData::ShowInfo(wxTreeCtrl *tree)
 {
-  wxLogMessage("Item '%s': %sselected, %sexpanded.",
+  wxLogMessage("Item '%s': %sselected, %sexpanded, %sbold,\n"
+               "%u children (%u immediately under this item).",
                m_desc.c_str(),
                Bool2String(tree->IsSelected(GetId())),
-               Bool2String(tree->IsExpanded(GetId())));
+               Bool2String(tree->IsExpanded(GetId())),
+               Bool2String(tree->IsBold(GetId())),
+               tree->GetChildrenCount(GetId()),
+               tree->GetChildrenCount(GetId(), FALSE));
 }