Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
TGListTree.h
Go to the documentation of this file.
1 // @(#)root/gui:$Id$
2 // Author: Fons Rademakers 25/02/98
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers. *
6  * All rights reserved. *
7  * *
8  * For the licensing terms see $ROOTSYS/LICENSE. *
9  * For the list of contributors see $ROOTSYS/README/CREDITS. *
10  *************************************************************************/
11 
12 #ifndef ROOT_TGListTree
13 #define ROOT_TGListTree
14 
15 
16 //////////////////////////////////////////////////////////////////////////
17 // //
18 // TGListTree and TGListTreeItem //
19 // //
20 // A list tree is a widget that can contain a number of items //
21 // arranged in a tree structure. The items are represented by small //
22 // folder icons that can be either open or closed. //
23 // //
24 // The TGListTree is user callable. The TGListTreeItem is a service //
25 // class of the list tree. //
26 // //
27 // A list tree can generate the following events: //
28 // kC_LISTTREE, kCT_ITEMCLICK, which button, location (y<<16|x). //
29 // kC_LISTTREE, kCT_ITEMDBLCLICK, which button, location (y<<16|x). //
30 // //
31 //////////////////////////////////////////////////////////////////////////
32 
33 #include "TGCanvas.h"
34 #include "TGWidget.h"
35 #include "TGDNDManager.h"
36 
37 class TGPicture;
38 class TGToolTip;
39 class TGCanvas;
40 class TList;
41 class TBufferFile;
42 
43 class TGListTreeItem
44 {
45  friend class TGListTree;
46 
47 private:
48  TGListTreeItem(const TGListTreeItem&); // not implemented
49  TGListTreeItem& operator=(const TGListTreeItem&); // not implemented
50 
51 protected:
52  TGClient *fClient; // pointer to TGClient
53  TGListTreeItem *fParent; // pointer to parent
54  TGListTreeItem *fFirstchild; // pointer to first child item
55  TGListTreeItem *fLastchild; // pointer to last child item
56  TGListTreeItem *fPrevsibling; // pointer to previous sibling
57  TGListTreeItem *fNextsibling; // pointer to next sibling
58 
59  Bool_t fOpen; // true if item is open
60 
61  Int_t fDNDState; // EDNDFlags
62 
63  // State managed by TGListTree during drawing.
64  Int_t fY; // y position of item
65  Int_t fXtext; // x position of item text
66  Int_t fYtext; // y position of item text
67  UInt_t fHeight; // item height
68 
69 public:
70  TGListTreeItem(TGClient *client=gClient);
71  virtual ~TGListTreeItem() {}
72 
73  TGListTreeItem *GetParent() const { return fParent; }
74  TGListTreeItem *GetFirstChild() const { return fFirstchild; }
75  TGListTreeItem *GetLastChild() const { return fLastchild; }
76  TGListTreeItem *GetPrevSibling() const { return fPrevsibling; }
77  TGListTreeItem *GetNextSibling() const { return fNextsibling; }
78 
79  virtual Bool_t IsOpen() const { return fOpen; }
80  virtual void SetOpen(Bool_t o) { fOpen = o; }
81 
82  virtual Bool_t IsActive() const = 0;
83  virtual Pixel_t GetActiveColor() const = 0;
84  virtual void SetActive(Bool_t) {}
85 
86  void Rename(const char* new_name) { SetText(new_name); }
87  virtual const char *GetText() const = 0;
88  virtual Int_t GetTextLength() const = 0;
89  virtual const char *GetTipText() const = 0;
90  virtual Int_t GetTipTextLength() const = 0;
91  virtual void SetText(const char *) {}
92  virtual void SetTipText(const char *) {}
93 
94  virtual void SetUserData(void *, Bool_t=kFALSE) {}
95  virtual void *GetUserData() const = 0;
96 
97  virtual const TGPicture*GetPicture() const = 0;
98  virtual void SetPictures(const TGPicture*, const TGPicture*) {}
99  virtual const TGPicture*GetCheckBoxPicture() const = 0;
100  virtual void SetCheckBoxPictures(const TGPicture*, const TGPicture*) {}
101  virtual UInt_t GetPicWidth() const;
102 
103  virtual void SetCheckBox(Bool_t=kTRUE) {}
104  virtual Bool_t HasCheckBox() const = 0;
105  virtual void CheckItem(Bool_t=kTRUE) = 0;
106  virtual void Toggle() { SetCheckBox( ! IsChecked()); }
107  virtual Bool_t IsChecked() const = 0;
108 
109  // Propagation of checked-state form children to parents.
110  virtual void CheckAllChildren(Bool_t=kTRUE) {}
111  virtual void CheckChildren(TGListTreeItem*, Bool_t) {}
112  virtual Bool_t HasCheckedChild(Bool_t=kFALSE) { return kTRUE; } // !!!!
113  virtual Bool_t HasUnCheckedChild(Bool_t=kFALSE) { return kTRUE; } // !!!!
114  virtual void UpdateState() {}
115 
116  // Item coloration (underline + minibox)
117  virtual Bool_t HasColor() const = 0;
118  virtual Color_t GetColor() const = 0;
119  virtual void SetColor(Color_t) {}
120  virtual void ClearColor() {}
121 
122  // Drag and drop.
123  void SetDNDSource(Bool_t onoff)
124  { if (onoff) fDNDState |= kIsDNDSource; else fDNDState &= ~kIsDNDSource; }
125  void SetDNDTarget(Bool_t onoff)
126  { if (onoff) fDNDState |= kIsDNDTarget; else fDNDState &= ~kIsDNDTarget; }
127  Bool_t IsDNDSource() const { return fDNDState & kIsDNDSource; }
128  Bool_t IsDNDTarget() const { return fDNDState & kIsDNDTarget; }
129 
130  // Allow handling by the items themselves ... NOT USED in TGListTree yet !!!!
131  virtual Bool_t HandlesDragAndDrop() const { return kFALSE; }
132  virtual void HandleDrag() {}
133  virtual void HandleDrop() {}
134 
135  virtual void SavePrimitive(std::ostream&, Option_t*, Int_t) {}
136 
137  ClassDef(TGListTreeItem,0) // Abstract base-class for items that go into a TGListTree container.
138 };
139 
140 
141 class TGListTreeItemStd : public TGListTreeItem
142 {
143 private:
144  Bool_t fActive; // true if item is active
145  Bool_t fCheckBox; // true if checkbox is visible
146  Bool_t fChecked; // true if item is checked
147  Bool_t fOwnsData; // true if user data has to be deleted
148  TString fText; // item text
149  TString fTipText; // tooltip text
150  const TGPicture *fOpenPic; // icon for open state
151  const TGPicture *fClosedPic; // icon for closed state
152  const TGPicture *fCheckedPic; // icon for checked item
153  const TGPicture *fUncheckedPic; // icon for unchecked item
154  void *fUserData; // pointer to user data structure
155 
156  Bool_t fHasColor; // true if item has assigned color
157  Color_t fColor; // item's color
158 
159  TGListTreeItemStd(const TGListTreeItemStd&); // not implemented
160  TGListTreeItemStd& operator=(const TGListTreeItemStd&); // not implemented
161 
162 public:
163  TGListTreeItemStd(TGClient *fClient = gClient, const char *name = 0,
164  const TGPicture *opened = 0, const TGPicture *closed = 0,
165  Bool_t checkbox = kFALSE);
166  virtual ~TGListTreeItemStd();
167 
168  virtual Pixel_t GetActiveColor() const;
169  virtual Bool_t IsActive() const { return fActive; }
170  virtual void SetActive(Bool_t a) { fActive = a; }
171 
172  virtual const char *GetText() const { return fText.Data(); }
173  virtual Int_t GetTextLength() const { return fText.Length(); }
174  virtual const char *GetTipText() const { return fTipText.Data(); }
175  virtual Int_t GetTipTextLength() const { return fTipText.Length(); }
176  virtual void SetText(const char *text) { fText = text; }
177  virtual void SetTipText(const char *tip) { fTipText = tip; }
178 
179  virtual void SetUserData(void *userData, Bool_t own=kFALSE) { fUserData = userData; fOwnsData=own; }
180  virtual void *GetUserData() const { return fUserData; }
181 
182  virtual const TGPicture*GetPicture() const { return fOpen ? fOpenPic : fClosedPic; }
183  virtual const TGPicture*GetCheckBoxPicture() const { return fCheckBox ? (fChecked ? fCheckedPic : fUncheckedPic) : 0; }
184  virtual void SetPictures(const TGPicture *opened, const TGPicture *closed);
185  virtual void SetCheckBoxPictures(const TGPicture *checked, const TGPicture *unchecked);
186 
187  virtual void SetCheckBox(Bool_t on = kTRUE);
188  virtual Bool_t HasCheckBox() const { return fCheckBox; }
189  virtual void CheckItem(Bool_t checked = kTRUE) { fChecked = checked; }
190  virtual void Toggle() { fChecked = !fChecked; }
191  virtual Bool_t IsChecked() const { return fChecked; }
192 
193  virtual void CheckAllChildren(Bool_t state = kTRUE);
194  virtual void CheckChildren(TGListTreeItem *item, Bool_t state);
195  virtual Bool_t HasCheckedChild(Bool_t first=kFALSE);
196  virtual Bool_t HasUnCheckedChild(Bool_t first=kFALSE);
197  virtual void UpdateState();
198 
199  virtual Bool_t HasColor() const { return fHasColor; }
200  virtual Color_t GetColor() const { return fColor; }
201  virtual void SetColor(Color_t color) { fHasColor = true;fColor = color; }
202  virtual void ClearColor() { fHasColor = false; }
203 
204  virtual void SavePrimitive(std::ostream &out, Option_t *option, Int_t n);
205 
206  ClassDef(TGListTreeItemStd,0) //Item that goes into a TGListTree container
207 };
208 
209 
210 class TGListTree : public TGContainer {
211 
212 public:
213  //---- color markup mode of tree items
214  enum EColorMarkupMode {
215  kDefault = 0,
216  kColorUnderline = BIT(0),
217  kColorBox = BIT(1)
218  };
219  enum ECheckMode {
220  kSimple = BIT(2),
221  kRecursive = BIT(3)
222  };
223 
224 protected:
225  TGListTreeItem *fFirst; // pointer to first item in list
226  TGListTreeItem *fLast; // pointer to last item in list
227  TGListTreeItem *fSelected; // pointer to selected item in list
228  TGListTreeItem *fCurrent; // pointer to current item in list
229  TGListTreeItem *fBelowMouse; // pointer to item below mouses cursor
230  Int_t fHspacing; // horizontal spacing between items
231  Int_t fVspacing; // vertical spacing between items
232  Int_t fIndent; // number of pixels indentation
233  Int_t fMargin; // number of pixels margin from left side
234  Pixel_t fGrayPixel; // gray draw color
235  GContext_t fActiveGC; // activated (selected) drawing context
236  GContext_t fDrawGC; // icon drawing context
237  GContext_t fLineGC; // dashed line drawing context
238  GContext_t fHighlightGC; // highlighted icon drawing context
239  FontStruct_t fFont; // font used to draw item text
240  UInt_t fDefw; // default list width
241  UInt_t fDefh; // default list height
242  Int_t fExposeTop; // top y postion of visible region
243  Int_t fExposeBottom; // bottom y position of visible region
244  TGToolTip *fTip; // tooltip shown when moving over list items
245  TGListTreeItem *fTipItem; // item for which tooltip is set
246  TBufferFile *fBuf; // buffer used for Drag and Drop
247  TDNDData fDNDData; // Drag and Drop data
248  Atom_t *fDNDTypeList; // handles DND types
249  TGListTreeItem *fDropItem; // item on which DND is over
250  Bool_t fAutoTips; // assume item->fUserData is TObject and use GetTitle() for tip text
251  Bool_t fAutoCheckBoxPic;// change check box picture if parent and children have diffrent state
252  Bool_t fDisableOpen; // disable branch opening on double-clicks
253  Bool_t fUserControlled; // let user decides what is the behaviour on events
254  Bool_t fEventHandled; // flag used from user code to bypass standard event handling
255  UInt_t fLastEventState; // modifier state of the last keyboard event
256 
257  EColorMarkupMode fColorMode; // if/how to render item's main color
258  ECheckMode fCheckMode; // how to propagate check properties through the tree
259  GContext_t fColorGC; // drawing context for main item color
260 
261  static Pixel_t fgGrayPixel;
262  static const TGFont *fgDefaultFont;
263  static TGGC *fgActiveGC;
264  static TGGC *fgDrawGC;
265  static TGGC *fgLineGC;
266  static TGGC *fgHighlightGC;
267  static TGGC *fgColorGC;
268  static const TGPicture *fgOpenPic; // icon for open item
269  static const TGPicture *fgClosedPic; // icon for closed item
270  static const TGPicture *fgCheckedPic; // icon for checked item
271  static const TGPicture *fgUncheckedPic; // icon for unchecked item
272 
273  static Pixel_t GetGrayPixel();
274  static FontStruct_t GetDefaultFontStruct();
275  static const TGGC &GetActiveGC();
276  static const TGGC &GetDrawGC();
277  static const TGGC &GetLineGC();
278  static const TGGC &GetHighlightGC();
279  static const TGGC &GetColorGC();
280 
281  void Draw(Handle_t id, Int_t yevent, Int_t hevent);
282  void Draw(Option_t * ="") { MayNotUse("Draw(Option_t*)"); }
283  Int_t DrawChildren(Handle_t id, TGListTreeItem *item, Int_t x, Int_t y, Int_t xroot);
284  void DrawItem(Handle_t id, TGListTreeItem *item, Int_t x, Int_t y, Int_t *xroot,
285  UInt_t *retwidth, UInt_t *retheight);
286  void DrawItemName(Handle_t id, TGListTreeItem *item);
287  void DrawNode(Handle_t id, TGListTreeItem *item, Int_t x, Int_t y);
288  virtual void UpdateChecked(TGListTreeItem *item, Bool_t redraw = kFALSE);
289 
290  void SaveChildren(std::ostream &out, TGListTreeItem *item, Int_t &n);
291  void RemoveReference(TGListTreeItem *item);
292  void PDeleteItem(TGListTreeItem *item);
293  void PDeleteChildren(TGListTreeItem *item);
294  void InsertChild(TGListTreeItem *parent, TGListTreeItem *item);
295  void InsertChildren(TGListTreeItem *parent, TGListTreeItem *item);
296  Int_t SearchChildren(TGListTreeItem *item, Int_t y, Int_t findy,
297  TGListTreeItem **finditem);
298  TGListTreeItem *FindItem(Int_t findy);
299  void *FindItem(const TString& name,
300  Bool_t direction = kTRUE,
301  Bool_t caseSensitive = kTRUE,
302  Bool_t beginWith = kFALSE)
303  { return TGContainer::FindItem(name, direction, caseSensitive, beginWith); }
304 
305  virtual void Layout() {}
306 
307  void OnMouseOver(TGFrame*) { }
308  void CurrentChanged(Int_t /*x*/, Int_t /*y*/) { }
309  void CurrentChanged(TGFrame *) { }
310  void ReturnPressed(TGFrame*) { }
311  void Clicked(TGFrame *, Int_t /*btn*/) { }
312  void Clicked(TGFrame *, Int_t /*btn*/, Int_t /*x*/, Int_t /*y*/) { }
313  void DoubleClicked(TGFrame *, Int_t /*btn*/) { }
314  void DoubleClicked(TGFrame *, Int_t /*btn*/, Int_t /*x*/, Int_t /*y*/) { }
315  void KeyPressed(TGFrame *, UInt_t /*keysym*/, UInt_t /*mask*/) { }
316 
317 private:
318  TGListTree(const TGListTree&); // not implemented
319  TGListTree& operator=(const TGListTree&); // not implemented
320 
321 public:
322  TGListTree(TGWindow *p = 0, UInt_t w = 1, UInt_t h = 1,
323  UInt_t options = 0, Pixel_t back = GetWhitePixel());
324  TGListTree(TGCanvas *p, UInt_t options, Pixel_t back = GetWhitePixel());
325 
326  virtual ~TGListTree();
327 
328  virtual Bool_t HandleButton(Event_t *event);
329  virtual Bool_t HandleDoubleClick(Event_t *event);
330  virtual Bool_t HandleCrossing(Event_t *event);
331  virtual Bool_t HandleMotion(Event_t *event);
332  virtual Bool_t HandleKey(Event_t *event);
333 
334  virtual void SetCanvas(TGCanvas *canvas) { fCanvas = canvas; }
335  virtual void DrawRegion(Int_t x, Int_t y, UInt_t w, UInt_t h);
336 
337  virtual void DrawOutline(Handle_t id, TGListTreeItem *item, Pixel_t col=0xbbbbbb,
338  Bool_t clear=kFALSE);
339  virtual void DrawActive(Handle_t id, TGListTreeItem *item);
340 
341  virtual TGDimension GetDefaultSize() const
342  { return TGDimension(fDefw, fDefh); }
343 
344  void AddItem(TGListTreeItem *parent, TGListTreeItem *item);
345  TGListTreeItem *AddItem(TGListTreeItem *parent, const char *string,
346  const TGPicture *open = 0,
347  const TGPicture *closed = 0,
348  Bool_t checkbox = kFALSE);
349  TGListTreeItem *AddItem(TGListTreeItem *parent, const char *string,
350  void *userData, const TGPicture *open = 0,
351  const TGPicture *closed = 0,
352  Bool_t checkbox = kFALSE);
353  void RenameItem(TGListTreeItem *item, const char *string);
354  Int_t DeleteItem(TGListTreeItem *item);
355  void OpenItem(TGListTreeItem *item);
356  void CloseItem(TGListTreeItem *item);
357  void CheckItem(TGListTreeItem *item, Bool_t check = kTRUE);
358  void SetCheckBox(TGListTreeItem *item, Bool_t on = kTRUE);
359  void ToggleItem(TGListTreeItem *item);
360  Int_t RecursiveDeleteItem(TGListTreeItem *item, void *userData);
361 
362  Int_t DeleteChildren(TGListTreeItem *item);
363  Int_t Reparent(TGListTreeItem *item, TGListTreeItem *newparent);
364  Int_t ReparentChildren(TGListTreeItem *item, TGListTreeItem *newparent);
365  void SetToolTipItem(TGListTreeItem *item, const char *string);
366  void SetAutoTips(Bool_t on = kTRUE) { fAutoTips = on; }
367  void SetAutoCheckBoxPic(Bool_t on) { fAutoCheckBoxPic = on; }
368  void SetSelected(TGListTreeItem *item) { fSelected = item; }
369  void AdjustPosition(TGListTreeItem *item);
370  void AdjustPosition() { TGContainer::AdjustPosition(); }
371 
372  // overwrite TGContainer's methods
373  void Home(Bool_t select = kFALSE);
374  void End(Bool_t select = kFALSE);
375  void PageUp(Bool_t select = kFALSE);
376  void PageDown(Bool_t select = kFALSE);
377  void LineUp(Bool_t select = kFALSE);
378  void LineDown(Bool_t select = kFALSE);
379  void Search(Bool_t close = kTRUE);
380 
381  Int_t Sort(TGListTreeItem *item);
382  Int_t SortSiblings(TGListTreeItem *item);
383  Int_t SortChildren(TGListTreeItem *item);
384  void HighlightItem(TGListTreeItem *item);
385  void ClearHighlighted();
386  void GetPathnameFromItem(TGListTreeItem *item, char *path, Int_t depth = 0);
387  void UnselectAll(Bool_t draw);
388  void SetToolTipText(const char *text, Int_t x, Int_t y, Long_t delayms);
389  void HighlightItem(TGListTreeItem *item, Bool_t state, Bool_t draw);
390  void HighlightChildren(TGListTreeItem *item, Bool_t state, Bool_t draw);
391  void DisableOpen(Bool_t disable = kTRUE) { fDisableOpen = disable;}
392  void GetChecked(TList *checked);
393  void GetCheckedChildren(TList *checked, TGListTreeItem *item);
394  void CheckAllChildren(TGListTreeItem *item, Bool_t state);
395 
396  TGListTreeItem *GetFirstItem() const { return fFirst; }
397  TGListTreeItem *GetSelected() const { return fSelected; }
398  TGListTreeItem *GetCurrent() const { return fCurrent; }
399  TGListTreeItem *GetBelowMouse() const { return fBelowMouse; }
400  TGListTreeItem *FindSiblingByName(TGListTreeItem *item, const char *name);
401  TGListTreeItem *FindSiblingByData(TGListTreeItem *item, void *userData);
402  TGListTreeItem *FindChildByName(TGListTreeItem *item, const char *name);
403  TGListTreeItem *FindChildByData(TGListTreeItem *item, void *userData);
404  TGListTreeItem *FindItemByPathname(const char *path);
405  TGListTreeItem *FindItemByObj(TGListTreeItem *item, void *ptr);
406 
407  void AddItem(const char *string) { AddItem(fSelected, string); } //*MENU*
408  void AddRoot(const char *string) { AddItem(0, string); } //*MENU*
409  Int_t DeleteSelected() { return (fSelected ? DeleteItem(fSelected) : 0); } //*MENU*
410  void RenameSelected(const char *string) { if (fSelected) RenameItem(fSelected, string); } //*MENU*
411 
412  virtual void MouseOver(TGListTreeItem *entry); //*SIGNAL*
413  virtual void MouseOver(TGListTreeItem *entry, UInt_t mask); //*SIGNAL*
414  virtual void KeyPressed(TGListTreeItem *entry, UInt_t keysym, UInt_t mask); //*SIGNAL*
415  virtual void ReturnPressed(TGListTreeItem *entry); //*SIGNAL*
416  virtual void Clicked(TGListTreeItem *entry, Int_t btn); //*SIGNAL*
417  virtual void Clicked(TGListTreeItem *entry, Int_t btn, Int_t x, Int_t y); //*SIGNAL*
418  virtual void Clicked(TGListTreeItem *entry, Int_t btn, UInt_t mask, Int_t x, Int_t y); //*SIGNAL*
419  virtual void DoubleClicked(TGListTreeItem *entry, Int_t btn); //*SIGNAL*
420  virtual void DoubleClicked(TGListTreeItem *entry, Int_t btn, Int_t x, Int_t y); //*SIGNAL*
421  virtual void Checked(TObject *obj, Bool_t check); //*SIGNAL*
422  virtual void DataDropped(TGListTreeItem *item, TDNDData *data); //*SIGNAL*
423 
424  // Utility functions
425  Int_t FontHeight();
426  Int_t FontAscent();
427  Int_t TextWidth(const char *c);
428 
429  static const TGPicture *GetOpenPic();
430  static const TGPicture *GetClosedPic();
431  static const TGPicture *GetCheckedPic();
432  static const TGPicture *GetUncheckedPic();
433 
434  // User control
435  void SetUserControl(Bool_t ctrl=kTRUE) { fUserControlled = ctrl; }
436  Bool_t HasUserControl() const { return fUserControlled; }
437  void SetEventHandled(Bool_t eh=kTRUE) { fEventHandled = eh; }
438  Bool_t IsEventHandled() const { return fEventHandled; }
439 
440  Bool_t HandleDNDDrop(TDNDData *data);
441  Atom_t HandleDNDPosition(Int_t x, Int_t y, Atom_t action,
442  Int_t xroot, Int_t yroot);
443  Atom_t HandleDNDEnter(Atom_t * typelist);
444  Bool_t HandleDNDLeave();
445 
446  virtual TDNDData *GetDNDData(Atom_t) {
447  return &fDNDData;
448  }
449 
450  EColorMarkupMode GetColorMode() const { return fColorMode; }
451  void SetColorMode(EColorMarkupMode colorMode) { fColorMode = colorMode; }
452 
453  ECheckMode GetCheckMode() const { return fCheckMode; }
454  void SetCheckMode(ECheckMode mode) { fCheckMode = mode; }
455 
456  virtual void SavePrimitive(std::ostream &out, Option_t *option = "");
457 
458  ClassDef(TGListTree,0) //Show items in a tree structured list
459 };
460 
461 #endif