1 /////////////////////////////////////////////////////////////////////////////// 2 // Name: wx/treebook.h 3 // Purpose: wxTreebook: wxNotebook-like control presenting pages in a tree 4 // Author: Evgeniy Tarassov, Vadim Zeitlin 5 // Modified by: 6 // Created: 2005-09-15 7 // Copyright: (c) 2005 Vadim Zeitlin <vadim@wxwidgets.org> 8 // Licence: wxWindows licence 9 /////////////////////////////////////////////////////////////////////////////// 10 11 #ifndef _WX_TREEBOOK_H_ 12 #define _WX_TREEBOOK_H_ 13 14 #include "wx/defs.h" 15 16 #if wxUSE_TREEBOOK 17 18 #include "wx/bookctrl.h" 19 #include "wx/containr.h" 20 #include "wx/treectrl.h" // for wxArrayTreeItemIds 21 22 typedef wxWindow wxTreebookPage; 23 24 class WXDLLIMPEXP_FWD_CORE wxTreeEvent; 25 26 // ---------------------------------------------------------------------------- 27 // wxTreebook 28 // ---------------------------------------------------------------------------- 29 30 class WXDLLIMPEXP_CORE wxTreebook : public wxNavigationEnabled<wxBookCtrlBase> 31 { 32 public: 33 // Constructors and such 34 // --------------------- 35 36 // Default ctor doesn't create the control, use Create() afterwards wxTreebook()37 wxTreebook() 38 { 39 Init(); 40 } 41 42 // This ctor creates the tree book control 43 wxTreebook(wxWindow *parent, 44 wxWindowID id, 45 const wxPoint& pos = wxDefaultPosition, 46 const wxSize& size = wxDefaultSize, 47 long style = wxBK_DEFAULT, 48 const wxString& name = wxEmptyString) 49 { 50 Init(); 51 52 (void)Create(parent, id, pos, size, style, name); 53 } 54 55 // Really creates the control 56 bool Create(wxWindow *parent, 57 wxWindowID id, 58 const wxPoint& pos = wxDefaultPosition, 59 const wxSize& size = wxDefaultSize, 60 long style = wxBK_DEFAULT, 61 const wxString& name = wxEmptyString); 62 63 64 // Page insertion operations 65 // ------------------------- 66 67 // Notice that page pointer may be NULL in which case the next non NULL 68 // page (usually the first child page of a node) is shown when this page is 69 // selected 70 71 // Inserts a new page just before the page indicated by page. 72 // The new page is placed on the same level as page. 73 virtual bool InsertPage(size_t pos, 74 wxWindow *page, 75 const wxString& text, 76 bool bSelect = false, 77 int imageId = NO_IMAGE); 78 79 // Inserts a new sub-page to the end of children of the page at given pos. 80 virtual bool InsertSubPage(size_t pos, 81 wxWindow *page, 82 const wxString& text, 83 bool bSelect = false, 84 int imageId = NO_IMAGE); 85 86 // Adds a new page at top level after all other pages. 87 virtual bool AddPage(wxWindow *page, 88 const wxString& text, 89 bool bSelect = false, 90 int imageId = NO_IMAGE); 91 92 // Adds a new child-page to the last top-level page inserted. 93 // Useful when constructing 1 level tree structure. 94 virtual bool AddSubPage(wxWindow *page, 95 const wxString& text, 96 bool bSelect = false, 97 int imageId = NO_IMAGE); 98 99 // Deletes the page and ALL its children. Could trigger page selection 100 // change in a case when selected page is removed. In that case its parent 101 // is selected (or the next page if no parent). 102 virtual bool DeletePage(size_t pos); 103 104 105 // Tree operations 106 // --------------- 107 108 // Gets the page node state -- node is expanded or collapsed 109 virtual bool IsNodeExpanded(size_t pos) const; 110 111 // Expands or collapses the page node. Returns the previous state. 112 // May generate page changing events (if selected page 113 // is under the collapsed branch, then parent is autoselected). 114 virtual bool ExpandNode(size_t pos, bool expand = true); 115 116 // shortcut for ExpandNode(pos, false) CollapseNode(size_t pos)117 bool CollapseNode(size_t pos) { return ExpandNode(pos, false); } 118 119 // get the parent page or wxNOT_FOUND if this is a top level page 120 int GetPageParent(size_t pos) const; 121 122 // the tree control we use for showing the pages index tree GetTreeCtrl()123 wxTreeCtrl* GetTreeCtrl() const { return (wxTreeCtrl*)m_bookctrl; } 124 125 126 // Standard operations inherited from wxBookCtrlBase 127 // ------------------------------------------------- 128 129 virtual bool SetPageText(size_t n, const wxString& strText); 130 virtual wxString GetPageText(size_t n) const; 131 virtual int GetPageImage(size_t n) const; 132 virtual bool SetPageImage(size_t n, int imageId); SetSelection(size_t n)133 virtual int SetSelection(size_t n) { return DoSetSelection(n, SetSelection_SendEvent); } ChangeSelection(size_t n)134 virtual int ChangeSelection(size_t n) { return DoSetSelection(n); } 135 virtual int HitTest(const wxPoint& pt, long *flags = NULL) const; 136 virtual void SetImageList(wxImageList *imageList); 137 virtual void AssignImageList(wxImageList *imageList); 138 virtual bool DeleteAllPages(); 139 140 protected: 141 // Implementation of a page removal. See DeletPage for comments. 142 wxTreebookPage *DoRemovePage(size_t pos); 143 144 // This subclass of wxBookCtrlBase accepts NULL page pointers (empty pages) AllowNullPage()145 virtual bool AllowNullPage() const { return true; } 146 147 // event handlers 148 void OnTreeSelectionChange(wxTreeEvent& event); 149 void OnTreeNodeExpandedCollapsed(wxTreeEvent& event); 150 151 // array of page ids and page windows 152 wxArrayTreeItemIds m_treeIds; 153 154 // in the situation when m_selection page is not wxNOT_FOUND but page is 155 // NULL this is the first (sub)child that has a non-NULL page 156 int m_actualSelection; 157 158 private: 159 // common part of all constructors 160 void Init(); 161 162 // The real implementations of page insertion functions 163 // ------------------------------------------------------ 164 // All DoInsert/Add(Sub)Page functions add the page into : 165 // - the base class 166 // - the tree control 167 // - update the index/TreeItemId corespondance array 168 bool DoInsertPage(size_t pos, 169 wxWindow *page, 170 const wxString& text, 171 bool bSelect = false, 172 int imageId = NO_IMAGE); 173 bool DoInsertSubPage(size_t pos, 174 wxWindow *page, 175 const wxString& text, 176 bool bSelect = false, 177 int imageId = NO_IMAGE); 178 bool DoAddSubPage(wxWindow *page, 179 const wxString& text, 180 bool bSelect = false, 181 int imageId = NO_IMAGE); 182 183 // Sets selection in the tree control and updates the page being shown. 184 int DoSetSelection(size_t pos, int flags = 0); 185 186 // Returns currently shown page. In a case when selected the node 187 // has empty (NULL) page finds first (sub)child with not-empty page. 188 wxTreebookPage *DoGetCurrentPage() const; 189 190 // Does the selection update. Called from page insertion functions 191 // to update selection if the selected page was pushed by the newly inserted 192 void DoUpdateSelection(bool bSelect, int page); 193 194 195 // Operations on the internal private members of the class 196 // ------------------------------------------------------- 197 // Returns the page TreeItemId for the page. 198 // Or, if the page index is incorrect, a fake one (fakePage.IsOk() == false) 199 wxTreeItemId DoInternalGetPage(size_t pos) const; 200 201 // Linear search for a page with the id specified. If no page 202 // found wxNOT_FOUND is returned. The function is used when we catch an event 203 // from m_tree (wxTreeCtrl) component. 204 int DoInternalFindPageById(wxTreeItemId page) const; 205 206 // Updates page and wxTreeItemId correspondance. 207 void DoInternalAddPage(size_t newPos, wxWindow *page, wxTreeItemId pageId); 208 209 // Removes the page from internal structure. DoInternalRemovePage(size_t pos)210 void DoInternalRemovePage(size_t pos) 211 { DoInternalRemovePageRange(pos, 0); } 212 213 // Removes the page and all its children designated by subCount 214 // from internal structures of the control. 215 void DoInternalRemovePageRange(size_t pos, size_t subCount); 216 217 // Returns internal number of pages which can be different from 218 // GetPageCount() while performing a page insertion or removal. DoInternalGetPageCount()219 size_t DoInternalGetPageCount() const { return m_treeIds.GetCount(); } 220 221 222 DECLARE_EVENT_TABLE() 223 DECLARE_DYNAMIC_CLASS_NO_COPY(wxTreebook) 224 }; 225 226 227 // ---------------------------------------------------------------------------- 228 // treebook event class and related stuff 229 // ---------------------------------------------------------------------------- 230 231 // wxTreebookEvent is obsolete and defined for compatibility only 232 #define wxTreebookEvent wxBookCtrlEvent 233 typedef wxBookCtrlEventFunction wxTreebookEventFunction; 234 #define wxTreebookEventHandler(func) wxBookCtrlEventHandler(func) 235 236 237 wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREEBOOK_PAGE_CHANGED, wxBookCtrlEvent ); 238 wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREEBOOK_PAGE_CHANGING, wxBookCtrlEvent ); 239 wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREEBOOK_NODE_COLLAPSED, wxBookCtrlEvent ); 240 wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_TREEBOOK_NODE_EXPANDED, wxBookCtrlEvent ); 241 242 #define EVT_TREEBOOK_PAGE_CHANGED(winid, fn) \ 243 wx__DECLARE_EVT1(wxEVT_TREEBOOK_PAGE_CHANGED, winid, wxBookCtrlEventHandler(fn)) 244 245 #define EVT_TREEBOOK_PAGE_CHANGING(winid, fn) \ 246 wx__DECLARE_EVT1(wxEVT_TREEBOOK_PAGE_CHANGING, winid, wxBookCtrlEventHandler(fn)) 247 248 #define EVT_TREEBOOK_NODE_COLLAPSED(winid, fn) \ 249 wx__DECLARE_EVT1(wxEVT_TREEBOOK_NODE_COLLAPSED, winid, wxBookCtrlEventHandler(fn)) 250 251 #define EVT_TREEBOOK_NODE_EXPANDED(winid, fn) \ 252 wx__DECLARE_EVT1(wxEVT_TREEBOOK_NODE_EXPANDED, winid, wxBookCtrlEventHandler(fn)) 253 254 // old wxEVT_COMMAND_* constants 255 #define wxEVT_COMMAND_TREEBOOK_PAGE_CHANGED wxEVT_TREEBOOK_PAGE_CHANGED 256 #define wxEVT_COMMAND_TREEBOOK_PAGE_CHANGING wxEVT_TREEBOOK_PAGE_CHANGING 257 #define wxEVT_COMMAND_TREEBOOK_NODE_COLLAPSED wxEVT_TREEBOOK_NODE_COLLAPSED 258 #define wxEVT_COMMAND_TREEBOOK_NODE_EXPANDED wxEVT_TREEBOOK_NODE_EXPANDED 259 260 261 #endif // wxUSE_TREEBOOK 262 263 #endif // _WX_TREEBOOK_H_ 264