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