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