1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        wx/generic/treectlg.h 
   3 // Purpose:     wxTreeCtrl class 
   4 // Author:      Robert Roebling 
   8 // Copyright:   (c) 1997,1998 Robert Roebling 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  12 #ifndef _GENERIC_TREECTRL_H_ 
  13 #define _GENERIC_TREECTRL_H_ 
  17 #include "wx/scrolwin.h" 
  20 // ----------------------------------------------------------------------------- 
  21 // forward declaration 
  22 // ----------------------------------------------------------------------------- 
  24 class WXDLLIMPEXP_FWD_CORE wxGenericTreeItem
; 
  26 class WXDLLIMPEXP_FWD_CORE wxTreeItemData
; 
  28 class WXDLLIMPEXP_FWD_CORE wxTreeRenameTimer
; 
  29 class WXDLLIMPEXP_FWD_CORE wxTreeFindTimer
; 
  30 class WXDLLIMPEXP_FWD_CORE wxTreeTextCtrl
; 
  31 class WXDLLIMPEXP_FWD_CORE wxTextCtrl
; 
  33 // ----------------------------------------------------------------------------- 
  34 // wxGenericTreeCtrl - the tree control 
  35 // ----------------------------------------------------------------------------- 
  37 class WXDLLIMPEXP_CORE wxGenericTreeCtrl 
: public wxTreeCtrlBase
, 
  44     wxGenericTreeCtrl() : wxTreeCtrlBase(), wxScrollHelper(this) { Init(); } 
  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
) 
  56         Create(parent
, id
, pos
, size
, style
, validator
, name
); 
  59     virtual ~wxGenericTreeCtrl(); 
  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
); 
  69     // implement base class pure virtuals 
  70     // ---------------------------------- 
  72     virtual unsigned int GetCount() const; 
  74     virtual unsigned int GetIndent() const { return m_indent
; } 
  75     virtual void SetIndent(unsigned int indent
); 
  78     virtual void SetImageList(wxImageList 
*imageList
); 
  79     virtual void SetStateImageList(wxImageList 
*imageList
); 
  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; 
  89     virtual void SetItemText(const wxTreeItemId
& item
, const wxString
& text
); 
  90     virtual void SetItemImage(const wxTreeItemId
& item
, 
  92                               wxTreeItemIcon which 
= wxTreeItemIcon_Normal
); 
  93     virtual void SetItemData(const wxTreeItemId
& item
, wxTreeItemData 
*data
); 
  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
); 
 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; 
 108     virtual size_t GetChildrenCount(const wxTreeItemId
& item
, 
 109                                     bool recursively 
= true) const; 
 114     virtual wxTreeItemId 
GetRootItem() const { return m_anchor
; } 
 115     virtual wxTreeItemId 
GetSelection() const 
 117         wxASSERT_MSG( !HasFlag(wxTR_MULTIPLE
), 
 118                        wxT("must use GetSelections() with this control") ); 
 122     virtual size_t GetSelections(wxArrayTreeItemIds
&) const; 
 123     virtual wxTreeItemId 
GetFocusedItem() const { return m_current
; } 
 125     virtual wxTreeItemId 
GetItemParent(const wxTreeItemId
& item
) const; 
 126     virtual wxTreeItemId 
GetFirstChild(const wxTreeItemId
& item
, 
 127                                        wxTreeItemIdValue
& cookie
) const; 
 128     virtual wxTreeItemId 
GetNextChild(const wxTreeItemId
& item
, 
 129                                       wxTreeItemIdValue
& cookie
) const; 
 130     virtual wxTreeItemId 
GetLastChild(const wxTreeItemId
& item
) const; 
 131     virtual wxTreeItemId 
GetNextSibling(const wxTreeItemId
& item
) const; 
 132     virtual wxTreeItemId 
GetPrevSibling(const wxTreeItemId
& item
) const; 
 134     virtual wxTreeItemId 
GetFirstVisibleItem() const; 
 135     virtual wxTreeItemId 
GetNextVisible(const wxTreeItemId
& item
) const; 
 136     virtual wxTreeItemId 
GetPrevVisible(const wxTreeItemId
& item
) const; 
 142     virtual wxTreeItemId 
AddRoot(const wxString
& text
, 
 143                          int image 
= -1, int selectedImage 
= -1, 
 144                          wxTreeItemData 
*data 
= NULL
); 
 146     virtual void Delete(const wxTreeItemId
& item
); 
 147     virtual void DeleteChildren(const wxTreeItemId
& item
); 
 148     virtual void DeleteAllItems(); 
 150     virtual void Expand(const wxTreeItemId
& item
); 
 151     virtual void Collapse(const wxTreeItemId
& item
); 
 152     virtual void CollapseAndReset(const wxTreeItemId
& item
); 
 153     virtual void Toggle(const wxTreeItemId
& item
); 
 155     virtual void Unselect(); 
 156     virtual void UnselectAll(); 
 157     virtual void SelectItem(const wxTreeItemId
& item
, bool select 
= true); 
 159     virtual void EnsureVisible(const wxTreeItemId
& item
); 
 160     virtual void ScrollTo(const wxTreeItemId
& item
); 
 162     virtual wxTextCtrl 
*EditLabel(const wxTreeItemId
& item
, 
 163                           wxClassInfo
* textCtrlClass 
= CLASSINFO(wxTextCtrl
)); 
 164     virtual wxTextCtrl 
*GetEditControl() const; 
 165     virtual void EndEditLabel(const wxTreeItemId
& item
, 
 166                               bool discardChanges 
= false); 
 168     virtual void SortChildren(const wxTreeItemId
& item
); 
 173     virtual bool GetBoundingRect(const wxTreeItemId
& item
, 
 175                                  bool textOnly 
= false) const; 
 178     // this version specific methods 
 179     // ----------------------------- 
 181     wxImageList 
*GetButtonsImageList() const { return m_imageListButtons
; } 
 182     void SetButtonsImageList(wxImageList 
*imageList
); 
 183     void AssignButtonsImageList(wxImageList 
*imageList
); 
 185     void SetDropEffectAboveItem( bool above 
= false ) { m_dropEffectAboveItem 
= above
; } 
 186     bool GetDropEffectAboveItem() const { return m_dropEffectAboveItem
; } 
 188     wxTreeItemId 
GetNext(const wxTreeItemId
& item
) const; 
 190 #if WXWIN_COMPATIBILITY_2_6 
 191     // use EditLabel() instead 
 192     void Edit( const wxTreeItemId
& item 
) { EditLabel(item
); } 
 193 #endif // WXWIN_COMPATIBILITY_2_6 
 195     // implementation only from now on 
 197     // overridden base class virtuals 
 198     virtual bool SetBackgroundColour(const wxColour
& colour
); 
 199     virtual bool SetForegroundColour(const wxColour
& colour
); 
 201     virtual void Refresh(bool eraseBackground 
= true, const wxRect 
*rect 
= NULL
); 
 203     virtual bool SetFont( const wxFont 
&font 
); 
 204     virtual void SetWindowStyle(const long styles
); 
 207     void OnPaint( wxPaintEvent 
&event 
); 
 208     void OnSetFocus( wxFocusEvent 
&event 
); 
 209     void OnKillFocus( wxFocusEvent 
&event 
); 
 210     void OnChar( wxKeyEvent 
&event 
); 
 211     void OnMouse( wxMouseEvent 
&event 
); 
 212     void OnGetToolTip( wxTreeEvent 
&event 
); 
 213     void OnSize( wxSizeEvent 
&event 
); 
 214     void OnInternalIdle( ); 
 216     virtual wxVisualAttributes 
GetDefaultAttributes() const 
 218         return GetClassDefaultAttributes(GetWindowVariant()); 
 221     static wxVisualAttributes
 
 222     GetClassDefaultAttributes(wxWindowVariant variant 
= wxWINDOW_VARIANT_NORMAL
); 
 224     // implementation helpers 
 225     void AdjustMyScrollbars(); 
 227     WX_FORWARD_TO_SCROLL_HELPER() 
 230     friend class wxGenericTreeItem
; 
 231     friend class wxTreeRenameTimer
; 
 232     friend class wxTreeFindTimer
; 
 233     friend class wxTreeTextCtrl
; 
 238     wxGenericTreeItem   
*m_anchor
; 
 239     wxGenericTreeItem   
*m_current
, 
 241                         // A hint to select a parent item after deleting a child 
 243     unsigned short       m_indent
; 
 246     wxBrush             
*m_hilightBrush
, 
 247                         *m_hilightUnfocusedBrush
; 
 250     bool                 m_ownsImageListButtons
; 
 251     bool                 m_isDragging
; // true between BEGIN/END drag events 
 252     bool                 m_lastOnSame
;  // last click on the same item as prev 
 253     wxImageList         
*m_imageListButtons
; 
 257     wxGenericTreeItem   
*m_dropTarget
; 
 258     wxCursor             m_oldCursor
;  // cursor is changed while dragging 
 259     wxGenericTreeItem   
*m_oldSelection
; 
 260     wxGenericTreeItem   
*m_underMouse
; // for visual effects 
 262     enum { NoEffect
, BorderEffect
, AboveEffect
, BelowEffect 
} m_dndEffect
; 
 263     wxGenericTreeItem   
*m_dndEffectItem
; 
 265     wxTreeTextCtrl      
*m_textCtrl
; 
 268     wxTimer             
*m_renameTimer
; 
 270     // incremental search data 
 271     wxString             m_findPrefix
; 
 272     wxTimer             
*m_findTimer
; 
 274     bool                 m_dropEffectAboveItem
; 
 276     // the common part of all ctors 
 279     // overridden wxWindow methods 
 280     virtual void DoThaw(); 
 283     void SendDeleteEvent(wxGenericTreeItem 
*itemBeingDeleted
); 
 285     void DrawBorder(const wxTreeItemId
& item
); 
 286     void DrawLine(const wxTreeItemId
& item
, bool below
); 
 287     void DrawDropEffect(wxGenericTreeItem 
*item
); 
 289     void DoSelectItem(const wxTreeItemId
& id
, 
 290                       bool unselect_others 
= true, 
 291                       bool extended_select 
= false); 
 293     virtual int DoGetItemState(const wxTreeItemId
& item
) const; 
 294     virtual void DoSetItemState(const wxTreeItemId
& item
, int state
); 
 296     virtual wxTreeItemId 
DoInsertItem(const wxTreeItemId
& parent
, 
 298                                       const wxString
& text
, 
 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; 
 309     // called by wxTextTreeCtrl when it marks itself for deletion 
 310     void ResetTextControl(); 
 312     // find the first item starting with the given prefix after the given item 
 313     wxTreeItemId 
FindItem(const wxTreeItemId
& id
, const wxString
& prefix
) const; 
 315     bool HasButtons() const { return HasFlag(wxTR_HAS_BUTTONS
); } 
 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
); 
 322     void CalculateLevel( wxGenericTreeItem 
*item
, wxDC 
&dc
, int level
, int &y 
); 
 323     void CalculatePositions(); 
 325     void RefreshSubtree( wxGenericTreeItem 
*item 
); 
 326     void RefreshLine( wxGenericTreeItem 
*item 
); 
 328     // redraw all selected items 
 329     void RefreshSelected(); 
 331     // RefreshSelected() recursive helper 
 332     void RefreshSelectedUnder(wxGenericTreeItem 
*item
); 
 334     void OnRenameTimer(); 
 335     bool OnRenameAccept(wxGenericTreeItem 
*item
, const wxString
& value
); 
 336     void OnRenameCancelled(wxGenericTreeItem 
*item
); 
 338     void FillArray(wxGenericTreeItem
*, wxArrayTreeItemIds
&) const; 
 339     void SelectItemRange( wxGenericTreeItem 
*item1
, wxGenericTreeItem 
*item2 
); 
 340     bool TagAllChildrenUntilLast(wxGenericTreeItem 
*crt_item
, wxGenericTreeItem 
*last_item
, bool select
); 
 341     bool TagNextChildren(wxGenericTreeItem 
*crt_item
, wxGenericTreeItem 
*last_item
, bool select
); 
 342     void UnselectAllChildren( wxGenericTreeItem 
*item 
); 
 343     void ChildrenClosing(wxGenericTreeItem
* item
); 
 345     void DoDirtyProcessing(); 
 347     virtual wxSize 
DoGetBestSize() const; 
 350     DECLARE_EVENT_TABLE() 
 351     DECLARE_DYNAMIC_CLASS(wxGenericTreeCtrl
) 
 352     wxDECLARE_NO_COPY_CLASS(wxGenericTreeCtrl
); 
 355 #if !defined(__WXMSW__) || defined(__WXUNIVERSAL__) 
 357  * wxTreeCtrl has to be a real class or we have problems with 
 358  * the run-time information. 
 361 class WXDLLIMPEXP_CORE wxTreeCtrl
: public wxGenericTreeCtrl
 
 363     DECLARE_DYNAMIC_CLASS(wxTreeCtrl
) 
 368     wxTreeCtrl(wxWindow 
*parent
, wxWindowID id 
= wxID_ANY
, 
 369                const wxPoint
& pos 
= wxDefaultPosition
, 
 370                const wxSize
& size 
= wxDefaultSize
, 
 371                long style 
= wxTR_DEFAULT_STYLE
, 
 372                const wxValidator 
&validator 
= wxDefaultValidator
, 
 373                const wxString
& name 
= wxTreeCtrlNameStr
) 
 374     : wxGenericTreeCtrl(parent
, id
, pos
, size
, style
, validator
, name
) 
 378 #endif // !__WXMSW__ || __WXUNIVERSAL__ 
 380 #endif // wxUSE_TREECTRL 
 382 #endif // _GENERIC_TREECTRL_H_