]> git.saurik.com Git - wxWidgets.git/blob - include/wx/generic/treectlg.h
Add wxActivateEvent::GetActivationReason().
[wxWidgets.git] / include / wx / generic / treectlg.h
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: wx/generic/treectlg.h
3 // Purpose: wxTreeCtrl class
4 // Author: Robert Roebling
5 // Modified by:
6 // Created: 01/02/97
7 // Copyright: (c) 1997,1998 Robert Roebling
8 // Licence: wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
10
11 #ifndef _GENERIC_TREECTRL_H_
12 #define _GENERIC_TREECTRL_H_
13
14 #if wxUSE_TREECTRL
15
16 #include "wx/scrolwin.h"
17 #include "wx/pen.h"
18
19 // -----------------------------------------------------------------------------
20 // forward declaration
21 // -----------------------------------------------------------------------------
22
23 class WXDLLIMPEXP_FWD_CORE wxGenericTreeItem;
24
25 class WXDLLIMPEXP_FWD_CORE wxTreeItemData;
26
27 class WXDLLIMPEXP_FWD_CORE wxTreeRenameTimer;
28 class WXDLLIMPEXP_FWD_CORE wxTreeFindTimer;
29 class WXDLLIMPEXP_FWD_CORE wxTreeTextCtrl;
30 class WXDLLIMPEXP_FWD_CORE wxTextCtrl;
31
32 // -----------------------------------------------------------------------------
33 // wxGenericTreeCtrl - the tree control
34 // -----------------------------------------------------------------------------
35
36 class WXDLLIMPEXP_CORE wxGenericTreeCtrl : public wxTreeCtrlBase,
37 public wxScrollHelper
38 {
39 public:
40 // creation
41 // --------
42
43 wxGenericTreeCtrl() : wxTreeCtrlBase(), wxScrollHelper(this) { Init(); }
44
45 wxGenericTreeCtrl(wxWindow *parent, wxWindowID id = wxID_ANY,
46 const wxPoint& pos = wxDefaultPosition,
47 const wxSize& size = wxDefaultSize,
48 long style = wxTR_DEFAULT_STYLE,
49 const wxValidator &validator = wxDefaultValidator,
50 const wxString& name = wxTreeCtrlNameStr)
51 : wxTreeCtrlBase(),
52 wxScrollHelper(this)
53 {
54 Init();
55 Create(parent, id, pos, size, style, validator, name);
56 }
57
58 virtual ~wxGenericTreeCtrl();
59
60 bool Create(wxWindow *parent, wxWindowID id = wxID_ANY,
61 const wxPoint& pos = wxDefaultPosition,
62 const wxSize& size = wxDefaultSize,
63 long style = wxTR_DEFAULT_STYLE,
64 const wxValidator &validator = wxDefaultValidator,
65 const wxString& name = wxTreeCtrlNameStr);
66
67 // implement base class pure virtuals
68 // ----------------------------------
69
70 virtual unsigned int GetCount() const;
71
72 virtual unsigned int GetIndent() const { return m_indent; }
73 virtual void SetIndent(unsigned int indent);
74
75
76 virtual void SetImageList(wxImageList *imageList);
77 virtual void SetStateImageList(wxImageList *imageList);
78
79 virtual wxString GetItemText(const wxTreeItemId& item) const;
80 virtual int GetItemImage(const wxTreeItemId& item,
81 wxTreeItemIcon which = wxTreeItemIcon_Normal) const;
82 virtual wxTreeItemData *GetItemData(const wxTreeItemId& item) const;
83 virtual wxColour GetItemTextColour(const wxTreeItemId& item) const;
84 virtual wxColour GetItemBackgroundColour(const wxTreeItemId& item) const;
85 virtual wxFont GetItemFont(const wxTreeItemId& item) const;
86
87 virtual void SetItemText(const wxTreeItemId& item, const wxString& text);
88 virtual void SetItemImage(const wxTreeItemId& item,
89 int image,
90 wxTreeItemIcon which = wxTreeItemIcon_Normal);
91 virtual void SetItemData(const wxTreeItemId& item, wxTreeItemData *data);
92
93 virtual void SetItemHasChildren(const wxTreeItemId& item, bool has = true);
94 virtual void SetItemBold(const wxTreeItemId& item, bool bold = true);
95 virtual void SetItemDropHighlight(const wxTreeItemId& item, bool highlight = true);
96 virtual void SetItemTextColour(const wxTreeItemId& item, const wxColour& col);
97 virtual void SetItemBackgroundColour(const wxTreeItemId& item, const wxColour& col);
98 virtual void SetItemFont(const wxTreeItemId& item, const wxFont& font);
99
100 virtual bool IsVisible(const wxTreeItemId& item) const;
101 virtual bool ItemHasChildren(const wxTreeItemId& item) const;
102 virtual bool IsExpanded(const wxTreeItemId& item) const;
103 virtual bool IsSelected(const wxTreeItemId& item) const;
104 virtual bool IsBold(const wxTreeItemId& item) const;
105
106 virtual size_t GetChildrenCount(const wxTreeItemId& item,
107 bool recursively = true) const;
108
109 // navigation
110 // ----------
111
112 virtual wxTreeItemId GetRootItem() const { return m_anchor; }
113 virtual wxTreeItemId GetSelection() const
114 {
115 wxASSERT_MSG( !HasFlag(wxTR_MULTIPLE),
116 wxT("must use GetSelections() with this control") );
117
118 return m_current;
119 }
120 virtual size_t GetSelections(wxArrayTreeItemIds&) const;
121 virtual wxTreeItemId GetFocusedItem() const { return m_current; }
122
123 virtual void ClearFocusedItem();
124 virtual void SetFocusedItem(const wxTreeItemId& item);
125
126 virtual wxTreeItemId GetItemParent(const wxTreeItemId& item) const;
127 virtual wxTreeItemId GetFirstChild(const wxTreeItemId& item,
128 wxTreeItemIdValue& cookie) const;
129 virtual wxTreeItemId GetNextChild(const wxTreeItemId& item,
130 wxTreeItemIdValue& cookie) const;
131 virtual wxTreeItemId GetLastChild(const wxTreeItemId& item) const;
132 virtual wxTreeItemId GetNextSibling(const wxTreeItemId& item) const;
133 virtual wxTreeItemId GetPrevSibling(const wxTreeItemId& item) const;
134
135 virtual wxTreeItemId GetFirstVisibleItem() const;
136 virtual wxTreeItemId GetNextVisible(const wxTreeItemId& item) const;
137 virtual wxTreeItemId GetPrevVisible(const wxTreeItemId& item) const;
138
139
140 // operations
141 // ----------
142
143 virtual wxTreeItemId AddRoot(const wxString& text,
144 int image = -1, int selectedImage = -1,
145 wxTreeItemData *data = NULL);
146
147 virtual void Delete(const wxTreeItemId& item);
148 virtual void DeleteChildren(const wxTreeItemId& item);
149 virtual void DeleteAllItems();
150
151 virtual void Expand(const wxTreeItemId& item);
152 virtual void Collapse(const wxTreeItemId& item);
153 virtual void CollapseAndReset(const wxTreeItemId& item);
154 virtual void Toggle(const wxTreeItemId& item);
155
156 virtual void Unselect();
157 virtual void UnselectAll();
158 virtual void SelectItem(const wxTreeItemId& item, bool select = true);
159 virtual void SelectChildren(const wxTreeItemId& parent);
160
161 virtual void EnsureVisible(const wxTreeItemId& item);
162 virtual void ScrollTo(const wxTreeItemId& item);
163
164 virtual wxTextCtrl *EditLabel(const wxTreeItemId& item,
165 wxClassInfo* textCtrlClass = wxCLASSINFO(wxTextCtrl));
166 virtual wxTextCtrl *GetEditControl() const;
167 virtual void EndEditLabel(const wxTreeItemId& item,
168 bool discardChanges = false);
169
170 virtual void EnableBellOnNoMatch(bool on = true);
171
172 virtual void SortChildren(const wxTreeItemId& item);
173
174 // items geometry
175 // --------------
176
177 virtual bool GetBoundingRect(const wxTreeItemId& item,
178 wxRect& rect,
179 bool textOnly = false) const;
180
181
182 // this version specific methods
183 // -----------------------------
184
185 wxImageList *GetButtonsImageList() const { return m_imageListButtons; }
186 void SetButtonsImageList(wxImageList *imageList);
187 void AssignButtonsImageList(wxImageList *imageList);
188
189 void SetDropEffectAboveItem( bool above = false ) { m_dropEffectAboveItem = above; }
190 bool GetDropEffectAboveItem() const { return m_dropEffectAboveItem; }
191
192 wxTreeItemId GetNext(const wxTreeItemId& item) const;
193
194 #if WXWIN_COMPATIBILITY_2_6
195 // use EditLabel() instead
196 void Edit( const wxTreeItemId& item ) { EditLabel(item); }
197 #endif // WXWIN_COMPATIBILITY_2_6
198
199 // implementation only from now on
200
201 // overridden base class virtuals
202 virtual bool SetBackgroundColour(const wxColour& colour);
203 virtual bool SetForegroundColour(const wxColour& colour);
204
205 virtual void Refresh(bool eraseBackground = true, const wxRect *rect = NULL);
206
207 virtual bool SetFont( const wxFont &font );
208 virtual void SetWindowStyle(const long styles);
209
210 // callbacks
211 void OnPaint( wxPaintEvent &event );
212 void OnSetFocus( wxFocusEvent &event );
213 void OnKillFocus( wxFocusEvent &event );
214 void OnKeyDown( wxKeyEvent &event );
215 void OnChar( wxKeyEvent &event );
216 void OnMouse( wxMouseEvent &event );
217 void OnGetToolTip( wxTreeEvent &event );
218 void OnSize( wxSizeEvent &event );
219 void OnInternalIdle( );
220
221 virtual wxVisualAttributes GetDefaultAttributes() const
222 {
223 return GetClassDefaultAttributes(GetWindowVariant());
224 }
225
226 static wxVisualAttributes
227 GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL);
228
229 // implementation helpers
230 void AdjustMyScrollbars();
231
232 WX_FORWARD_TO_SCROLL_HELPER()
233
234 protected:
235 friend class wxGenericTreeItem;
236 friend class wxTreeRenameTimer;
237 friend class wxTreeFindTimer;
238 friend class wxTreeTextCtrl;
239
240 wxFont m_normalFont;
241 wxFont m_boldFont;
242
243 wxGenericTreeItem *m_anchor;
244 wxGenericTreeItem *m_current,
245 *m_key_current,
246 // A hint to select a parent item after deleting a child
247 *m_select_me;
248 unsigned short m_indent;
249 int m_lineHeight;
250 wxPen m_dottedPen;
251 wxBrush *m_hilightBrush,
252 *m_hilightUnfocusedBrush;
253 bool m_hasFocus;
254 bool m_dirty;
255 bool m_ownsImageListButtons;
256 bool m_isDragging; // true between BEGIN/END drag events
257 bool m_lastOnSame; // last click on the same item as prev
258 wxImageList *m_imageListButtons;
259
260 int m_dragCount;
261 wxPoint m_dragStart;
262 wxGenericTreeItem *m_dropTarget;
263 wxCursor m_oldCursor; // cursor is changed while dragging
264 wxGenericTreeItem *m_oldSelection;
265 wxGenericTreeItem *m_underMouse; // for visual effects
266
267 enum { NoEffect, BorderEffect, AboveEffect, BelowEffect } m_dndEffect;
268 wxGenericTreeItem *m_dndEffectItem;
269
270 wxTreeTextCtrl *m_textCtrl;
271
272
273 wxTimer *m_renameTimer;
274
275 // incremental search data
276 wxString m_findPrefix;
277 wxTimer *m_findTimer;
278 // This flag is set to 0 if the bell is disabled, 1 if it is enabled and -1
279 // if it is globally enabled but has been temporarily disabled because we
280 // had already beeped for this particular search.
281 int m_findBell;
282
283 bool m_dropEffectAboveItem;
284
285 // the common part of all ctors
286 void Init();
287
288 // overridden wxWindow methods
289 virtual void DoThaw();
290
291 // misc helpers
292 void SendDeleteEvent(wxGenericTreeItem *itemBeingDeleted);
293
294 void DrawBorder(const wxTreeItemId& item);
295 void DrawLine(const wxTreeItemId& item, bool below);
296 void DrawDropEffect(wxGenericTreeItem *item);
297
298 void DoSelectItem(const wxTreeItemId& id,
299 bool unselect_others = true,
300 bool extended_select = false);
301
302 virtual int DoGetItemState(const wxTreeItemId& item) const;
303 virtual void DoSetItemState(const wxTreeItemId& item, int state);
304
305 virtual wxTreeItemId DoInsertItem(const wxTreeItemId& parent,
306 size_t previous,
307 const wxString& text,
308 int image,
309 int selectedImage,
310 wxTreeItemData *data);
311 virtual wxTreeItemId DoInsertAfter(const wxTreeItemId& parent,
312 const wxTreeItemId& idPrevious,
313 const wxString& text,
314 int image = -1, int selImage = -1,
315 wxTreeItemData *data = NULL);
316 virtual wxTreeItemId DoTreeHitTest(const wxPoint& point, int& flags) const;
317
318 // called by wxTextTreeCtrl when it marks itself for deletion
319 void ResetTextControl();
320
321 // find the first item starting with the given prefix after the given item
322 wxTreeItemId FindItem(const wxTreeItemId& id, const wxString& prefix) const;
323
324 bool HasButtons() const { return HasFlag(wxTR_HAS_BUTTONS); }
325
326 void CalculateLineHeight();
327 int GetLineHeight(wxGenericTreeItem *item) const;
328 void PaintLevel( wxGenericTreeItem *item, wxDC& dc, int level, int &y );
329 void PaintItem( wxGenericTreeItem *item, wxDC& dc);
330
331 void CalculateLevel( wxGenericTreeItem *item, wxDC &dc, int level, int &y );
332 void CalculatePositions();
333
334 void RefreshSubtree( wxGenericTreeItem *item );
335 void RefreshLine( wxGenericTreeItem *item );
336
337 // redraw all selected items
338 void RefreshSelected();
339
340 // RefreshSelected() recursive helper
341 void RefreshSelectedUnder(wxGenericTreeItem *item);
342
343 void OnRenameTimer();
344 bool OnRenameAccept(wxGenericTreeItem *item, const wxString& value);
345 void OnRenameCancelled(wxGenericTreeItem *item);
346
347 void FillArray(wxGenericTreeItem*, wxArrayTreeItemIds&) const;
348 void SelectItemRange( wxGenericTreeItem *item1, wxGenericTreeItem *item2 );
349 bool TagAllChildrenUntilLast(wxGenericTreeItem *crt_item, wxGenericTreeItem *last_item, bool select);
350 bool TagNextChildren(wxGenericTreeItem *crt_item, wxGenericTreeItem *last_item, bool select);
351 void UnselectAllChildren( wxGenericTreeItem *item );
352 void ChildrenClosing(wxGenericTreeItem* item);
353
354 void DoDirtyProcessing();
355
356 virtual wxSize DoGetBestSize() const;
357
358 private:
359 // Reset the state of the last find (i.e. keyboard incremental search)
360 // operation.
361 void ResetFindState();
362
363 DECLARE_EVENT_TABLE()
364 DECLARE_DYNAMIC_CLASS(wxGenericTreeCtrl)
365 wxDECLARE_NO_COPY_CLASS(wxGenericTreeCtrl);
366 };
367
368 #if !defined(__WXMSW__) || defined(__WXUNIVERSAL__)
369 /*
370 * wxTreeCtrl has to be a real class or we have problems with
371 * the run-time information.
372 */
373
374 class WXDLLIMPEXP_CORE wxTreeCtrl: public wxGenericTreeCtrl
375 {
376 DECLARE_DYNAMIC_CLASS(wxTreeCtrl)
377
378 public:
379 wxTreeCtrl() {}
380
381 wxTreeCtrl(wxWindow *parent, wxWindowID id = wxID_ANY,
382 const wxPoint& pos = wxDefaultPosition,
383 const wxSize& size = wxDefaultSize,
384 long style = wxTR_DEFAULT_STYLE,
385 const wxValidator &validator = wxDefaultValidator,
386 const wxString& name = wxTreeCtrlNameStr)
387 : wxGenericTreeCtrl(parent, id, pos, size, style, validator, name)
388 {
389 }
390 };
391 #endif // !__WXMSW__ || __WXUNIVERSAL__
392
393 #endif // wxUSE_TREECTRL
394
395 #endif // _GENERIC_TREECTRL_H_