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