File indexing completed on 2026-08-09 09:25:05
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #ifndef ROOT_TGListTree
0013 #define ROOT_TGListTree
0014
0015
0016 #include "TGCanvas.h"
0017 #include "TGWidget.h"
0018 #include "TGDNDManager.h"
0019
0020 class TGPicture;
0021 class TGToolTip;
0022 class TGCanvas;
0023 class TList;
0024 class TBufferFile;
0025
0026 class TGListTreeItem
0027 {
0028 friend class TGListTree;
0029
0030 private:
0031 TGListTreeItem(const TGListTreeItem&) = delete;
0032 TGListTreeItem& operator=(const TGListTreeItem&) = delete;
0033
0034 protected:
0035 TGClient *fClient;
0036 TGListTreeItem *fParent;
0037 TGListTreeItem *fFirstchild;
0038 TGListTreeItem *fLastchild;
0039 TGListTreeItem *fPrevsibling;
0040 TGListTreeItem *fNextsibling;
0041
0042 Bool_t fOpen;
0043
0044 Int_t fDNDState;
0045
0046
0047
0048 Int_t fY;
0049 Int_t fXtext;
0050 Int_t fYtext;
0051 UInt_t fHeight;
0052
0053
0054 virtual TString SaveTreeItem(std::ostream &, const char *, const char *) { return ""; }
0055
0056 public:
0057 TGListTreeItem(TGClient *client = gClient);
0058 virtual ~TGListTreeItem() {}
0059
0060 TGListTreeItem *GetParent() const { return fParent; }
0061 TGListTreeItem *GetFirstChild() const { return fFirstchild; }
0062 TGListTreeItem *GetLastChild() const { return fLastchild; }
0063 TGListTreeItem *GetPrevSibling() const { return fPrevsibling; }
0064 TGListTreeItem *GetNextSibling() const { return fNextsibling; }
0065
0066 virtual Bool_t IsOpen() const { return fOpen; }
0067 virtual void SetOpen(Bool_t o) { fOpen = o; }
0068
0069 virtual Bool_t IsActive() const = 0;
0070 virtual Pixel_t GetActiveColor() const = 0;
0071 virtual void SetActive(Bool_t) {}
0072
0073 void Rename(const char* new_name) { SetText(new_name); }
0074 virtual const char *GetText() const = 0;
0075 virtual Int_t GetTextLength() const = 0;
0076 virtual const char *GetTipText() const = 0;
0077 virtual Int_t GetTipTextLength() const = 0;
0078 virtual void SetText(const char *) {}
0079 virtual void SetTipText(const char *) {}
0080
0081 virtual void SetUserData(void *, Bool_t=kFALSE) {}
0082 virtual void *GetUserData() const = 0;
0083
0084 virtual const TGPicture*GetPicture() const = 0;
0085 virtual void SetPictures(const TGPicture*, const TGPicture*) {}
0086 virtual const TGPicture*GetCheckBoxPicture() const = 0;
0087 virtual void SetCheckBoxPictures(const TGPicture*, const TGPicture*) {}
0088 virtual UInt_t GetPicWidth() const;
0089
0090 virtual void SetCheckBox(Bool_t=kTRUE) {}
0091 virtual Bool_t HasCheckBox() const = 0;
0092 virtual void CheckItem(Bool_t=kTRUE) = 0;
0093 virtual void Toggle() { SetCheckBox( ! IsChecked()); }
0094 virtual Bool_t IsChecked() const = 0;
0095
0096
0097 virtual void CheckAllChildren(Bool_t=kTRUE) {}
0098 virtual void CheckChildren(TGListTreeItem*, Bool_t) {}
0099 virtual Bool_t HasCheckedChild(Bool_t=kFALSE) { return kTRUE; }
0100 virtual Bool_t HasUnCheckedChild(Bool_t=kFALSE) { return kTRUE; }
0101 virtual void UpdateState() {}
0102
0103
0104 virtual Bool_t HasColor() const = 0;
0105 virtual Color_t GetColor() const = 0;
0106 virtual void SetColor(Color_t) {}
0107 virtual void ClearColor() {}
0108
0109
0110 void SetDNDSource(Bool_t onoff)
0111 { if (onoff) fDNDState |= kIsDNDSource; else fDNDState &= ~kIsDNDSource; }
0112 void SetDNDTarget(Bool_t onoff)
0113 { if (onoff) fDNDState |= kIsDNDTarget; else fDNDState &= ~kIsDNDTarget; }
0114 Bool_t IsDNDSource() const { return fDNDState & kIsDNDSource; }
0115 Bool_t IsDNDTarget() const { return fDNDState & kIsDNDTarget; }
0116
0117
0118 virtual Bool_t HandlesDragAndDrop() const { return kFALSE; }
0119 virtual void HandleDrag() {}
0120 virtual void HandleDrop() {}
0121
0122 ClassDef(TGListTreeItem,0)
0123 };
0124
0125
0126 class TGListTreeItemStd : public TGListTreeItem
0127 {
0128 private:
0129 Bool_t fActive;
0130 Bool_t fCheckBox;
0131 Bool_t fChecked;
0132 Bool_t fOwnsData;
0133 TString fText;
0134 TString fTipText;
0135 const TGPicture *fOpenPic;
0136 const TGPicture *fClosedPic;
0137 const TGPicture *fCheckedPic;
0138 const TGPicture *fUncheckedPic;
0139 void *fUserData;
0140
0141 Bool_t fHasColor;
0142 Color_t fColor;
0143
0144 TGListTreeItemStd(const TGListTreeItemStd&) = delete;
0145 TGListTreeItemStd& operator=(const TGListTreeItemStd&) = delete;
0146
0147 protected:
0148
0149 TString SaveTreeItem(std::ostream &out, const char *treevarname, const char *parent_var_name) override;
0150
0151 public:
0152 TGListTreeItemStd(TGClient *fClient = gClient, const char *name = nullptr,
0153 const TGPicture *opened = nullptr, const TGPicture *closed = nullptr,
0154 Bool_t checkbox = kFALSE);
0155 ~TGListTreeItemStd() override;
0156
0157 Pixel_t GetActiveColor() const override;
0158 Bool_t IsActive() const override { return fActive; }
0159 void SetActive(Bool_t a) override { fActive = a; }
0160
0161 const char *GetText() const override { return fText.Data(); }
0162 Int_t GetTextLength() const override { return fText.Length(); }
0163 const char *GetTipText() const override { return fTipText.Data(); }
0164 Int_t GetTipTextLength() const override { return fTipText.Length(); }
0165 void SetText(const char *text) override { fText = text; }
0166 void SetTipText(const char *tip) override { fTipText = tip; }
0167
0168 void SetUserData(void *userData, Bool_t own = kFALSE) override { fUserData = userData; fOwnsData=own; }
0169 void *GetUserData() const override { return fUserData; }
0170
0171 const TGPicture *GetPicture() const override { return fOpen ? fOpenPic : fClosedPic; }
0172 const TGPicture *GetCheckBoxPicture() const override { return fCheckBox ? (fChecked ? fCheckedPic : fUncheckedPic) : nullptr; }
0173 void SetPictures(const TGPicture *opened, const TGPicture *closed) override;
0174 void SetCheckBoxPictures(const TGPicture *checked, const TGPicture *unchecked) override;
0175
0176 void SetCheckBox(Bool_t on = kTRUE) override;
0177 Bool_t HasCheckBox() const override { return fCheckBox; }
0178 void CheckItem(Bool_t checked = kTRUE) override { fChecked = checked; }
0179 void Toggle() override { fChecked = !fChecked; }
0180 Bool_t IsChecked() const override { return fChecked; }
0181
0182 void CheckAllChildren(Bool_t state = kTRUE) override;
0183 void CheckChildren(TGListTreeItem *item, Bool_t state) override;
0184 Bool_t HasCheckedChild(Bool_t first=kFALSE) override;
0185 Bool_t HasUnCheckedChild(Bool_t first=kFALSE) override;
0186 void UpdateState() override;
0187
0188 Bool_t HasColor() const override { return fHasColor; }
0189 Color_t GetColor() const override { return fColor; }
0190 void SetColor(Color_t color) override { fHasColor = true;fColor = color; }
0191 void ClearColor() override { fHasColor = false; }
0192
0193 ClassDefOverride(TGListTreeItemStd,0)
0194 };
0195
0196
0197 class TGListTree : public TGContainer {
0198
0199 public:
0200
0201 enum EColorMarkupMode {
0202
0203 #if defined(__clang__) && __clang_major__ < 20
0204 #pragma clang diagnostic push
0205 #pragma clang diagnostic ignored "-Wshadow"
0206 #endif
0207 kDefault = 0,
0208 #if defined(__clang__) && __clang_major__ < 20
0209 #pragma clang diagnostic pop
0210 #endif
0211 kColorUnderline = BIT(0),
0212 kColorBox = BIT(1)
0213 };
0214 enum ECheckMode {
0215 kSimple = BIT(2),
0216 kRecursive = BIT(3)
0217 };
0218
0219 protected:
0220 TGListTreeItem *fFirst;
0221 TGListTreeItem *fLast;
0222 TGListTreeItem *fSelected;
0223 TGListTreeItem *fCurrent;
0224 TGListTreeItem *fBelowMouse;
0225 Int_t fHspacing;
0226 Int_t fVspacing;
0227 Int_t fIndent;
0228 Int_t fMargin;
0229 Pixel_t fGrayPixel;
0230 GContext_t fActiveGC;
0231 GContext_t fDrawGC;
0232 GContext_t fLineGC;
0233 GContext_t fHighlightGC;
0234 FontStruct_t fFont;
0235 UInt_t fDefw;
0236 UInt_t fDefh;
0237 Int_t fExposeTop;
0238 Int_t fExposeBottom;
0239 TGToolTip *fTip;
0240 TGListTreeItem *fTipItem;
0241 TBufferFile *fBuf;
0242 TDNDData fDNDData;
0243 Atom_t *fDNDTypeList;
0244 TGListTreeItem *fDropItem;
0245 Bool_t fAutoTips;
0246 Bool_t fAutoCheckBoxPic;
0247 Bool_t fDisableOpen;
0248 Bool_t fUserControlled;
0249 Bool_t fEventHandled;
0250 UInt_t fLastEventState;
0251
0252 EColorMarkupMode fColorMode;
0253 ECheckMode fCheckMode;
0254 GContext_t fColorGC;
0255
0256 static Pixel_t fgGrayPixel;
0257 static const TGFont *fgDefaultFont;
0258 static TGGC *fgActiveGC;
0259 static TGGC *fgDrawGC;
0260 static TGGC *fgLineGC;
0261 static TGGC *fgHighlightGC;
0262 static TGGC *fgColorGC;
0263 static const TGPicture *fgOpenPic;
0264 static const TGPicture *fgClosedPic;
0265 static const TGPicture *fgCheckedPic;
0266 static const TGPicture *fgUncheckedPic;
0267
0268 static Pixel_t GetGrayPixel();
0269 static FontStruct_t GetDefaultFontStruct();
0270 static const TGGC &GetActiveGC();
0271 static const TGGC &GetDrawGC();
0272 static const TGGC &GetLineGC();
0273 static const TGGC &GetHighlightGC();
0274 static const TGGC &GetColorGC();
0275
0276 void Draw(Handle_t id, Int_t yevent, Int_t hevent);
0277 void Draw(Option_t * ="") override { MayNotUse("Draw(Option_t*)"); }
0278 Int_t DrawChildren(Handle_t id, TGListTreeItem *item, Int_t x, Int_t y, Int_t xroot);
0279 void DrawItem(Handle_t id, TGListTreeItem *item, Int_t x, Int_t y, Int_t *xroot,
0280 UInt_t *retwidth, UInt_t *retheight);
0281 void DrawItemName(Handle_t id, TGListTreeItem *item);
0282 void DrawNode(Handle_t id, TGListTreeItem *item, Int_t x, Int_t y);
0283 virtual void UpdateChecked(TGListTreeItem *item, Bool_t redraw = kFALSE);
0284
0285 void SaveChildren(std::ostream &out, const char *parent_var_name, TGListTreeItem *item);
0286 void RemoveReference(TGListTreeItem *item);
0287 void PDeleteItem(TGListTreeItem *item);
0288 void PDeleteChildren(TGListTreeItem *item);
0289 void InsertChild(TGListTreeItem *parent, TGListTreeItem *item);
0290 void InsertChildren(TGListTreeItem *parent, TGListTreeItem *item);
0291 Int_t SearchChildren(TGListTreeItem *item, Int_t y, Int_t findy,
0292 TGListTreeItem **finditem);
0293 TGListTreeItem *FindItem(Int_t findy);
0294 void *FindItem(const TString& name,
0295 Bool_t direction = kTRUE,
0296 Bool_t caseSensitive = kTRUE,
0297 Bool_t beginWith = kFALSE) override
0298 { return TGContainer::FindItem(name, direction, caseSensitive, beginWith); }
0299
0300 void Layout() override {}
0301
0302 void OnMouseOver(TGFrame*) override { }
0303 void CurrentChanged(Int_t , Int_t ) override { }
0304 void CurrentChanged(TGFrame *) override { }
0305 void ReturnPressed(TGFrame*) override { }
0306 void Clicked(TGFrame *, Int_t ) override { }
0307 void Clicked(TGFrame *, Int_t , Int_t , Int_t ) override { }
0308 void DoubleClicked(TGFrame *, Int_t ) override { }
0309 void DoubleClicked(TGFrame *, Int_t , Int_t , Int_t ) override { }
0310 void KeyPressed(TGFrame *, UInt_t , UInt_t ) override { }
0311
0312 private:
0313 TGListTree(const TGListTree&) = delete;
0314 TGListTree& operator=(const TGListTree&) = delete;
0315
0316 public:
0317 TGListTree(TGWindow *p = nullptr, UInt_t w = 1, UInt_t h = 1,
0318 UInt_t options = 0, Pixel_t back = GetWhitePixel());
0319 TGListTree(TGCanvas *p, UInt_t options, Pixel_t back = GetWhitePixel());
0320
0321 ~TGListTree() override;
0322
0323 Bool_t HandleButton(Event_t *event) override;
0324 Bool_t HandleDoubleClick(Event_t *event) override;
0325 Bool_t HandleCrossing(Event_t *event) override;
0326 Bool_t HandleMotion(Event_t *event) override;
0327 Bool_t HandleKey(Event_t *event) override;
0328
0329 virtual void SetCanvas(TGCanvas *canvas) { fCanvas = canvas; }
0330 void DrawRegion(Int_t x, Int_t y, UInt_t w, UInt_t h) override;
0331
0332 virtual void DrawOutline(Handle_t id, TGListTreeItem *item, Pixel_t col=0xbbbbbb,
0333 Bool_t clear=kFALSE);
0334 virtual void DrawActive(Handle_t id, TGListTreeItem *item);
0335
0336 TGDimension GetDefaultSize() const override
0337 { return TGDimension(fDefw, fDefh); }
0338
0339 void AddItem(TGListTreeItem *parent, TGListTreeItem *item);
0340 TGListTreeItem *AddItem(TGListTreeItem *parent, const char *string,
0341 const TGPicture *open = nullptr,
0342 const TGPicture *closed = nullptr,
0343 Bool_t checkbox = kFALSE);
0344 TGListTreeItem *AddItem(TGListTreeItem *parent, const char *string,
0345 void *userData, const TGPicture *open = nullptr,
0346 const TGPicture *closed = nullptr,
0347 Bool_t checkbox = kFALSE);
0348 void RenameItem(TGListTreeItem *item, const char *string);
0349 Int_t DeleteItem(TGListTreeItem *item);
0350 void OpenItem(TGListTreeItem *item);
0351 void CloseItem(TGListTreeItem *item);
0352 void CheckItem(TGListTreeItem *item, Bool_t check = kTRUE);
0353 void SetCheckBox(TGListTreeItem *item, Bool_t on = kTRUE);
0354 void ToggleItem(TGListTreeItem *item);
0355 Int_t RecursiveDeleteItem(TGListTreeItem *item, void *userData);
0356
0357 Int_t DeleteChildren(TGListTreeItem *item);
0358 Int_t Reparent(TGListTreeItem *item, TGListTreeItem *newparent);
0359 Int_t ReparentChildren(TGListTreeItem *item, TGListTreeItem *newparent);
0360 void SetToolTipItem(TGListTreeItem *item, const char *string);
0361 void SetAutoTips(Bool_t on = kTRUE) { fAutoTips = on; }
0362 void SetAutoCheckBoxPic(Bool_t on) { fAutoCheckBoxPic = on; }
0363 void SetSelected(TGListTreeItem *item) { fSelected = item; }
0364 void AdjustPosition(TGListTreeItem *item);
0365 void AdjustPosition() override { TGContainer::AdjustPosition(); }
0366
0367
0368 void Home(Bool_t select = kFALSE) override;
0369 void End(Bool_t select = kFALSE) override;
0370 void PageUp(Bool_t select = kFALSE) override;
0371 void PageDown(Bool_t select = kFALSE) override;
0372 void LineUp(Bool_t select = kFALSE) override;
0373 void LineDown(Bool_t select = kFALSE) override;
0374 void Search(Bool_t close = kTRUE) override;
0375
0376 Int_t Sort(TGListTreeItem *item);
0377 Int_t SortSiblings(TGListTreeItem *item);
0378 Int_t SortChildren(TGListTreeItem *item);
0379 void HighlightItem(TGListTreeItem *item);
0380 void ClearHighlighted();
0381 void GetPathnameFromItem(TGListTreeItem *item, char *path, Int_t depth = 0);
0382 void UnselectAll(Bool_t draw);
0383 void SetToolTipText(const char *text, Int_t x, Int_t y, Long_t delayms);
0384 void HighlightItem(TGListTreeItem *item, Bool_t state, Bool_t draw);
0385 void HighlightChildren(TGListTreeItem *item, Bool_t state, Bool_t draw);
0386 void DisableOpen(Bool_t disable = kTRUE) { fDisableOpen = disable;}
0387 void GetChecked(TList *checked);
0388 void GetCheckedChildren(TList *checked, TGListTreeItem *item);
0389 void CheckAllChildren(TGListTreeItem *item, Bool_t state);
0390
0391 TGListTreeItem *GetFirstItem() const { return fFirst; }
0392 TGListTreeItem *GetSelected() const { return fSelected; }
0393 TGListTreeItem *GetCurrent() const { return fCurrent; }
0394 TGListTreeItem *GetBelowMouse() const { return fBelowMouse; }
0395 TGListTreeItem *FindSiblingByName(TGListTreeItem *item, const char *name);
0396 TGListTreeItem *FindSiblingByData(TGListTreeItem *item, void *userData);
0397 TGListTreeItem *FindChildByName(TGListTreeItem *item, const char *name);
0398 TGListTreeItem *FindChildByData(TGListTreeItem *item, void *userData);
0399 TGListTreeItem *FindItemByPathname(const char *path);
0400 TGListTreeItem *FindItemByObj(TGListTreeItem *item, void *ptr);
0401
0402 void AddItem(const char *string) { AddItem(fSelected, string); }
0403 void AddRoot(const char *string) { AddItem(nullptr, string); }
0404 Int_t DeleteSelected() { return fSelected ? DeleteItem(fSelected) : 0; }
0405 void RenameSelected(const char *string) { if (fSelected) RenameItem(fSelected, string); }
0406
0407 virtual void MouseOver(TGListTreeItem *entry);
0408 virtual void MouseOver(TGListTreeItem *entry, UInt_t mask);
0409 virtual void KeyPressed(TGListTreeItem *entry, UInt_t keysym, UInt_t mask);
0410 virtual void ReturnPressed(TGListTreeItem *entry);
0411 virtual void Clicked(TGListTreeItem *entry, Int_t btn);
0412 virtual void Clicked(TGListTreeItem *entry, Int_t btn, Int_t x, Int_t y);
0413 virtual void Clicked(TGListTreeItem *entry, Int_t btn, UInt_t mask, Int_t x, Int_t y);
0414 virtual void DoubleClicked(TGListTreeItem *entry, Int_t btn);
0415 virtual void DoubleClicked(TGListTreeItem *entry, Int_t btn, Int_t x, Int_t y);
0416 virtual void Checked(TObject *obj, Bool_t check);
0417 virtual void DataDropped(TGListTreeItem *item, TDNDData *data);
0418
0419
0420 Int_t FontHeight();
0421 Int_t FontAscent();
0422 Int_t TextWidth(const char *c);
0423
0424 static const TGPicture *GetOpenPic();
0425 static const TGPicture *GetClosedPic();
0426 static const TGPicture *GetCheckedPic();
0427 static const TGPicture *GetUncheckedPic();
0428
0429
0430 void SetUserControl(Bool_t ctrl=kTRUE) { fUserControlled = ctrl; }
0431 Bool_t HasUserControl() const { return fUserControlled; }
0432 void SetEventHandled(Bool_t eh=kTRUE) { fEventHandled = eh; }
0433 Bool_t IsEventHandled() const { return fEventHandled; }
0434
0435 Bool_t HandleDNDDrop(TDNDData *data) override;
0436 Atom_t HandleDNDPosition(Int_t x, Int_t y, Atom_t action,
0437 Int_t xroot, Int_t yroot) override;
0438 Atom_t HandleDNDEnter(Atom_t * typelist) override;
0439 Bool_t HandleDNDLeave() override;
0440
0441 TDNDData *GetDNDData(Atom_t) override { return &fDNDData; }
0442
0443 EColorMarkupMode GetColorMode() const { return fColorMode; }
0444 void SetColorMode(EColorMarkupMode colorMode) { fColorMode = colorMode; }
0445
0446 ECheckMode GetCheckMode() const { return fCheckMode; }
0447 void SetCheckMode(ECheckMode mode) { fCheckMode = mode; }
0448
0449 void SavePrimitive(std::ostream &out, Option_t *option = "") override;
0450
0451 ClassDefOverride(TGListTree,0)
0452 };
0453
0454 #endif