treetest.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  1. /////////////////////////////////////////////////////////////////////////////
  2. // Name: treectrl.h
  3. // Purpose: wxTreeCtrl sample
  4. // Author: Julian Smart
  5. // Modified by:
  6. // Created: 04/01/98
  7. // Copyright: (c) Julian Smart
  8. // Licence: wxWindows licence
  9. /////////////////////////////////////////////////////////////////////////////
  10. #define USE_GENERIC_TREECTRL 0
  11. #if USE_GENERIC_TREECTRL
  12. #include "wx/generic/treectlg.h"
  13. #ifndef wxTreeCtrl
  14. #define wxTreeCtrl wxGenericTreeCtrl
  15. #define sm_classwxTreeCtrl sm_classwxGenericTreeCtrl
  16. #endif
  17. #endif
  18. // Define a new application type
  19. class MyApp : public wxApp
  20. {
  21. public:
  22. MyApp() { m_showImages = true; m_showStates = true; m_showButtons = false; }
  23. bool OnInit();
  24. void SetShowImages(bool show) { m_showImages = show; }
  25. bool ShowImages() const { return m_showImages; }
  26. void SetShowStates(bool show) { m_showStates = show; }
  27. bool ShowStates() const { return m_showStates; }
  28. void SetShowButtons(bool show) { m_showButtons = show; }
  29. bool ShowButtons() const { return m_showButtons; }
  30. private:
  31. bool m_showImages, m_showStates, m_showButtons;
  32. };
  33. class MyTreeItemData : public wxTreeItemData
  34. {
  35. public:
  36. MyTreeItemData(const wxString& desc) : m_desc(desc) { }
  37. void ShowInfo(wxTreeCtrl *tree);
  38. wxString const& GetDesc() const { return m_desc; }
  39. private:
  40. wxString m_desc;
  41. };
  42. class MyTreeCtrl : public wxTreeCtrl
  43. {
  44. public:
  45. enum
  46. {
  47. TreeCtrlIcon_File,
  48. TreeCtrlIcon_FileSelected,
  49. TreeCtrlIcon_Folder,
  50. TreeCtrlIcon_FolderSelected,
  51. TreeCtrlIcon_FolderOpened
  52. };
  53. MyTreeCtrl() { m_alternateImages = false; m_alternateStates = false; }
  54. MyTreeCtrl(wxWindow *parent, const wxWindowID id,
  55. const wxPoint& pos, const wxSize& size,
  56. long style);
  57. virtual ~MyTreeCtrl(){};
  58. void OnBeginDrag(wxTreeEvent& event);
  59. void OnBeginRDrag(wxTreeEvent& event);
  60. void OnEndDrag(wxTreeEvent& event);
  61. void OnBeginLabelEdit(wxTreeEvent& event);
  62. void OnEndLabelEdit(wxTreeEvent& event);
  63. void OnDeleteItem(wxTreeEvent& event);
  64. void OnContextMenu(wxContextMenuEvent& event);
  65. void OnItemMenu(wxTreeEvent& event);
  66. void OnGetInfo(wxTreeEvent& event);
  67. void OnSetInfo(wxTreeEvent& event);
  68. void OnItemExpanded(wxTreeEvent& event);
  69. void OnItemExpanding(wxTreeEvent& event);
  70. void OnItemCollapsed(wxTreeEvent& event);
  71. void OnItemCollapsing(wxTreeEvent& event);
  72. void OnSelChanged(wxTreeEvent& event);
  73. void OnSelChanging(wxTreeEvent& event);
  74. void OnTreeKeyDown(wxTreeEvent& event);
  75. void OnItemActivated(wxTreeEvent& event);
  76. void OnItemStateClick(wxTreeEvent& event);
  77. void OnItemRClick(wxTreeEvent& event);
  78. void OnRMouseDown(wxMouseEvent& event);
  79. void OnRMouseUp(wxMouseEvent& event);
  80. void OnRMouseDClick(wxMouseEvent& event);
  81. void GetItemsRecursively(const wxTreeItemId& idParent,
  82. wxTreeItemIdValue cookie = 0);
  83. void CreateImageList(int size = 16);
  84. void CreateButtonsImageList(int size = 11);
  85. void CreateStateImageList(bool del = false);
  86. void AddTestItemsToTree(size_t numChildren, size_t depth);
  87. void DoSortChildren(const wxTreeItemId& item, bool reverse = false)
  88. { m_reverseSort = reverse; wxTreeCtrl::SortChildren(item); }
  89. void DoEnsureVisible() { if (m_lastItem.IsOk()) EnsureVisible(m_lastItem); }
  90. void DoToggleIcon(const wxTreeItemId& item);
  91. void DoToggleState(const wxTreeItemId& item);
  92. void ShowMenu(wxTreeItemId id, const wxPoint& pt);
  93. int ImageSize(void) const { return m_imageSize; }
  94. void SetLastItem(wxTreeItemId id) { m_lastItem = id; }
  95. void SetAlternateImages(bool show) { m_alternateImages = show; }
  96. bool AlternateImages() const { return m_alternateImages; }
  97. void SetAlternateStates(bool show) { m_alternateStates = show; }
  98. bool AlternateStates() const { return m_alternateStates; }
  99. void ResetBrokenStateImages()
  100. {
  101. const size_t count = GetStateImageList()->GetImageCount();
  102. int state = count > 0 ? count - 1 : wxTREE_ITEMSTATE_NONE;
  103. DoResetBrokenStateImages(GetRootItem(), 0, state);
  104. }
  105. protected:
  106. virtual int OnCompareItems(const wxTreeItemId& i1, const wxTreeItemId& i2);
  107. // is this the test item which we use in several event handlers?
  108. bool IsTestItem(const wxTreeItemId& item)
  109. {
  110. // the test item is the first child folder
  111. return GetItemParent(item) == GetRootItem() && !GetPrevSibling(item);
  112. }
  113. private:
  114. void AddItemsRecursively(const wxTreeItemId& idParent,
  115. size_t nChildren,
  116. size_t depth,
  117. size_t folder);
  118. void DoResetBrokenStateImages(const wxTreeItemId& idParent,
  119. wxTreeItemIdValue cookie, int state);
  120. void LogEvent(const wxChar *name, const wxTreeEvent& event);
  121. int m_imageSize; // current size of images
  122. bool m_reverseSort; // flag for OnCompareItems
  123. wxTreeItemId m_lastItem, // for OnEnsureVisible()
  124. m_draggedItem; // item being dragged right now
  125. bool m_alternateImages;
  126. bool m_alternateStates;
  127. // NB: due to an ugly wxMSW hack you _must_ use wxDECLARE_DYNAMIC_CLASS();
  128. // if you want your overloaded OnCompareItems() to be called.
  129. // OTOH, if you don't want it you may omit the next line - this will
  130. // make default (alphabetical) sorting much faster under wxMSW.
  131. wxDECLARE_DYNAMIC_CLASS(MyTreeCtrl);
  132. wxDECLARE_EVENT_TABLE();
  133. };
  134. // Define a new frame type
  135. class MyFrame: public wxFrame
  136. {
  137. public:
  138. // ctor and dtor
  139. MyFrame(const wxString& title, int x, int y, int w, int h);
  140. virtual ~MyFrame();
  141. // menu callbacks
  142. void OnQuit(wxCommandEvent& event);
  143. void OnAbout(wxCommandEvent& event);
  144. void OnClearLog(wxCommandEvent& event);
  145. void OnTogButtons(wxCommandEvent& event)
  146. { TogStyle(event.GetId(), wxTR_HAS_BUTTONS); }
  147. void OnTogTwist(wxCommandEvent& event)
  148. { TogStyle(event.GetId(), wxTR_TWIST_BUTTONS); }
  149. void OnTogLines(wxCommandEvent& event)
  150. { TogStyle(event.GetId(), wxTR_NO_LINES); }
  151. void OnTogEdit(wxCommandEvent& event)
  152. { TogStyle(event.GetId(), wxTR_EDIT_LABELS); }
  153. void OnTogHideRoot(wxCommandEvent& event)
  154. { TogStyle(event.GetId(), wxTR_HIDE_ROOT); }
  155. void OnTogRootLines(wxCommandEvent& event)
  156. { TogStyle(event.GetId(), wxTR_LINES_AT_ROOT); }
  157. void OnTogBorder(wxCommandEvent& event)
  158. { TogStyle(event.GetId(), wxTR_ROW_LINES); }
  159. void OnTogFullHighlight(wxCommandEvent& event)
  160. { TogStyle(event.GetId(), wxTR_FULL_ROW_HIGHLIGHT); }
  161. void OnResetStyle(wxCommandEvent& WXUNUSED(event))
  162. { CreateTreeWithDefStyle(); }
  163. void OnSetFgColour(wxCommandEvent& event);
  164. void OnSetBgColour(wxCommandEvent& event);
  165. void OnHighlight(wxCommandEvent& event);
  166. void OnDump(wxCommandEvent& event);
  167. #ifndef NO_MULTIPLE_SELECTION
  168. void OnDumpSelected(wxCommandEvent& event);
  169. void OnSelect(wxCommandEvent& event);
  170. void OnUnselect(wxCommandEvent& event);
  171. void OnToggleSel(wxCommandEvent& event);
  172. void OnSelectChildren(wxCommandEvent& event);
  173. #endif // NO_MULTIPLE_SELECTION
  174. void OnSelectRoot(wxCommandEvent& event);
  175. void OnSetFocusedRoot(wxCommandEvent& event);
  176. void OnClearFocused(wxCommandEvent& event);
  177. void OnDelete(wxCommandEvent& event);
  178. void OnDeleteChildren(wxCommandEvent& event);
  179. void OnDeleteAll(wxCommandEvent& event);
  180. void OnRecreate(wxCommandEvent& event);
  181. void OnToggleButtons(wxCommandEvent& event);
  182. void OnToggleImages(wxCommandEvent& event);
  183. void OnToggleStates(wxCommandEvent& event);
  184. void OnToggleBell(wxCommandEvent& event);
  185. void OnToggleAlternateImages(wxCommandEvent& event);
  186. void OnToggleAlternateStates(wxCommandEvent& event);
  187. void OnSetImageSize(wxCommandEvent& event);
  188. void OnCollapseAndReset(wxCommandEvent& event);
  189. void OnSetBold(wxCommandEvent& WXUNUSED(event)) { DoSetBold(true); }
  190. void OnClearBold(wxCommandEvent& WXUNUSED(event)) { DoSetBold(false); }
  191. void OnEnsureVisible(wxCommandEvent& event);
  192. void OnSetFocus(wxCommandEvent& event);
  193. void OnCount(wxCommandEvent& event);
  194. void OnCountRec(wxCommandEvent& event);
  195. void OnRename(wxCommandEvent& event);
  196. void OnSort(wxCommandEvent& WXUNUSED(event)) { DoSort(); }
  197. void OnSortRev(wxCommandEvent& WXUNUSED(event)) { DoSort(true); }
  198. void OnAddItem(wxCommandEvent& event);
  199. void OnAddManyItems(wxCommandEvent& event);
  200. void OnInsertItem(wxCommandEvent& event);
  201. void OnIncIndent(wxCommandEvent& event);
  202. void OnDecIndent(wxCommandEvent& event);
  203. void OnIncSpacing(wxCommandEvent& event);
  204. void OnDecSpacing(wxCommandEvent& event);
  205. void OnToggleIcon(wxCommandEvent& event);
  206. void OnToggleState(wxCommandEvent& event);
  207. void OnShowFirstVisible(wxCommandEvent& WXUNUSED(event))
  208. { DoShowFirstOrLast(&wxTreeCtrl::GetFirstVisibleItem, "first visible"); }
  209. #ifdef wxHAS_LAST_VISIBLE // we don't have it currently but may add later
  210. void OnShowLastVisible(wxCommandEvent& WXUNUSED(event))
  211. { DoShowFirstOrLast(&wxTreeCtrl::GetLastVisibleItem, "last visible"); }
  212. #endif // wxHAS_LAST_VISIBLE
  213. void OnShowNextVisible(wxCommandEvent& WXUNUSED(event))
  214. { DoShowRelativeItem(&wxTreeCtrl::GetNextVisible, "next visible"); }
  215. void OnShowPrevVisible(wxCommandEvent& WXUNUSED(event))
  216. { DoShowRelativeItem(&wxTreeCtrl::GetPrevVisible, "previous visible"); }
  217. void OnShowParent(wxCommandEvent& WXUNUSED(event))
  218. { DoShowRelativeItem(&wxTreeCtrl::GetItemParent, "parent"); }
  219. void OnShowPrevSibling(wxCommandEvent& WXUNUSED(event))
  220. { DoShowRelativeItem(&wxTreeCtrl::GetPrevSibling, "previous sibling"); }
  221. void OnShowNextSibling(wxCommandEvent& WXUNUSED(event))
  222. { DoShowRelativeItem(&wxTreeCtrl::GetNextSibling, "next sibling"); }
  223. void OnScrollTo(wxCommandEvent& event);
  224. void OnSelectLast(wxCommandEvent& event);
  225. void OnIdle(wxIdleEvent& event);
  226. void OnSize(wxSizeEvent& event);
  227. private:
  228. void TogStyle(int id, long flag);
  229. void DoSort(bool reverse = false);
  230. void Resize();
  231. void CreateTreeWithDefStyle();
  232. void CreateTree(long style);
  233. // common parts of OnShowFirst/LastVisible() and OnShowNext/PrevVisible()
  234. typedef wxTreeItemId (wxTreeCtrl::*TreeFunc0_t)() const;
  235. void DoShowFirstOrLast(TreeFunc0_t pfn, const wxString& label);
  236. typedef wxTreeItemId (wxTreeCtrl::*TreeFunc1_t)(const wxTreeItemId&) const;
  237. void DoShowRelativeItem(TreeFunc1_t pfn, const wxString& label);
  238. wxPanel *m_panel;
  239. MyTreeCtrl *m_treeCtrl;
  240. #if wxUSE_LOG
  241. wxTextCtrl *m_textCtrl;
  242. #endif // wxUSE_LOG
  243. void DoSetBold(bool bold = true);
  244. wxDECLARE_EVENT_TABLE();
  245. };
  246. // menu and control ids
  247. enum
  248. {
  249. TreeTest_Quit = wxID_EXIT,
  250. TreeTest_About = wxID_ABOUT,
  251. TreeTest_ClearLog = wxID_CLEAR,
  252. TreeTest_TogButtons = wxID_HIGHEST,
  253. TreeTest_TogTwist,
  254. TreeTest_TogLines,
  255. TreeTest_TogEdit,
  256. TreeTest_TogHideRoot,
  257. TreeTest_TogRootLines,
  258. TreeTest_TogBorder,
  259. TreeTest_TogFullHighlight,
  260. TreeTest_SetFgColour,
  261. TreeTest_SetBgColour,
  262. TreeTest_ResetStyle,
  263. TreeTest_Highlight,
  264. TreeTest_Dump,
  265. TreeTest_DumpSelected,
  266. TreeTest_Count,
  267. TreeTest_CountRec,
  268. TreeTest_Sort,
  269. TreeTest_SortRev,
  270. TreeTest_SetBold,
  271. TreeTest_ClearBold,
  272. TreeTest_Rename,
  273. TreeTest_Delete,
  274. TreeTest_DeleteChildren,
  275. TreeTest_DeleteAll,
  276. TreeTest_Recreate,
  277. TreeTest_ToggleImages,
  278. TreeTest_ToggleStates,
  279. TreeTest_ToggleBell,
  280. TreeTest_ToggleAlternateImages,
  281. TreeTest_ToggleAlternateStates,
  282. TreeTest_ToggleButtons,
  283. TreeTest_SetImageSize,
  284. TreeTest_ToggleSel,
  285. TreeTest_CollapseAndReset,
  286. TreeTest_EnsureVisible,
  287. TreeTest_SetFocus,
  288. TreeTest_AddItem,
  289. TreeTest_AddManyItems,
  290. TreeTest_InsertItem,
  291. TreeTest_IncIndent,
  292. TreeTest_DecIndent,
  293. TreeTest_IncSpacing,
  294. TreeTest_DecSpacing,
  295. TreeTest_ToggleIcon,
  296. TreeTest_ToggleState,
  297. TreeTest_Select,
  298. TreeTest_Unselect,
  299. TreeTest_SelectRoot,
  300. TreeTest_ClearFocused,
  301. TreeTest_SetFocusedRoot,
  302. TreeTest_SelectChildren,
  303. TreeTest_ShowFirstVisible,
  304. TreeTest_ShowLastVisible,
  305. TreeTest_ShowNextVisible,
  306. TreeTest_ShowPrevVisible,
  307. TreeTest_ShowParent,
  308. TreeTest_ShowPrevSibling,
  309. TreeTest_ShowNextSibling,
  310. TreeTest_ScrollTo,
  311. TreeTest_SelectLast,
  312. TreeTest_Ctrl = 1000
  313. };