Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
TObjectElement.cxx
Go to the documentation of this file.
1/*************************************************************************
2 * Copyright (C) 1995-2021, Rene Brun and Fons Rademakers. *
3 * All rights reserved. *
4 * *
5 * For the licensing terms see $ROOTSYS/LICENSE. *
6 * For the list of contributors see $ROOTSYS/README/CREDITS. *
7 *************************************************************************/
8
14
15#include <ROOT/RLogger.hxx>
16
17#include "TBrowser.h"
18#include "TBrowserImp.h"
19#include "TFolder.h"
20#include "TList.h"
21#include "TColor.h"
22#include "TDirectory.h"
23#include "TFile.h"
24#include "TBufferJSON.h"
25
26#include <sstream>
27
28using namespace std::string_literals;
29
30using namespace ROOT::Experimental::Browsable;
31
32
33/** \class TObjectLevelIter
34\ingroup rbrowser
35
36Iterator over list of elements, designed for support TBrowser usage
37*/
38
40
41 std::vector<std::shared_ptr<RElement>> fElements;
42
43 int fCounter{-1};
44
45public:
46 explicit TObjectLevelIter() {}
47
48 virtual ~TObjectLevelIter() = default;
49
50 void AddElement(std::shared_ptr<RElement> &&elem)
51 {
52 fElements.emplace_back(std::move(elem));
53 }
54
55 auto NumElements() const { return fElements.size(); }
56
57 bool Next() override { return ++fCounter < (int) fElements.size(); }
58
59 // use default implementation for now
60 // bool Find(const std::string &name) override { return FindDirEntry(name); }
61
62 std::string GetItemName() const override { return fElements[fCounter]->GetName(); }
63
64 bool CanItemHaveChilds() const override
65 {
66 std::shared_ptr<TObjectElement> telem = std::dynamic_pointer_cast<TObjectElement>(fElements[fCounter]);
67 return telem ? telem->IsFolder() : false;
68 }
69
70 /** Create element for the browser */
71 std::unique_ptr<RItem> CreateItem() override
72 {
73 return fElements[fCounter] ? fElements[fCounter]->CreateItem() : nullptr;
74 }
75
76 /** Returns full information for current element */
77 std::shared_ptr<RElement> GetElement() override
78 {
79 return fElements[fCounter];
80 }
81
82 bool Find(const std::string &name, int indx = -1) override
83 {
84 if ((indx >= 0) && (indx < (int) fElements.size()) && (name == fElements[indx]->GetName())) {
85 fCounter = indx;
86 return true;
87 }
88
89 return RLevelIter::Find(name, -1);
90 }
91
92};
93
94// ===============================================================================================================
95
96class TMyBrowserImp : public TBrowserImp {
97 TObjectLevelIter *fIter{nullptr}; ///<! back-reference on iterator
98 const TObject *fBrowseObj{nullptr}; ///<! object which will be browsed
99 bool fDuplicated{false}; ///<! is object was duplicated?
100 bool fIgnore{false}; ///<! ignore browsing, used during TBrowser constructor
101
102public:
103
104 TMyBrowserImp(TObjectLevelIter *iter, TObject *obj) : TBrowserImp(nullptr), fIter(iter), fBrowseObj(obj) {}
105 virtual ~TMyBrowserImp() = default;
106
107 void SetIgnore(bool on = true) { fIgnore = on; }
108
109 bool IsDuplicated() const { return fDuplicated; }
110
111 void Add(TObject* obj, const char* name, Int_t) override
112 {
113 if (fIgnore) return;
114
115 // prevent duplication of object itself - ignore such browsing
116 if (fBrowseObj == obj) fDuplicated = true;
117 if (fDuplicated) return;
118
119 std::unique_ptr<RHolder> holder = std::make_unique<TObjectHolder>(obj);
120
121 std::shared_ptr<RElement> elem = RProvider::Browse(holder);
122
123 if (name && *name) {
124 std::shared_ptr<TObjectElement> telem = std::dynamic_pointer_cast<TObjectElement>(elem);
125 if (telem) telem->SetName(name);
126 }
127
128 fIter->AddElement(std::move(elem));
129 }
130
131 void BrowseObj(TObject* obj) override
132 {
133 if (fIgnore) return;
134
135 Add(obj, nullptr, 0);
136 }
137
138};
139
140// ===============================================================================================================
141
142/** \class TCollectionIter
143\ingroup rbrowser
144
145Iterator over elements in TCollection
146*/
147
149
151
152public:
153 explicit TCollectionIter(const TFolder *f) : RLevelIter(), fIter(f->GetListOfFolders()) {}
154
155 explicit TCollectionIter(const TCollection *coll) : RLevelIter(), fIter(coll) {}
156
157 virtual ~TCollectionIter() = default;
158
159 bool Next() override { return fIter.Next() != nullptr; }
160
161 std::string GetItemName() const override
162 {
163 auto obj = *fIter;
164 if (!obj) return ""s;
165 std::string name = obj->GetName();
166
167 if (name.empty()) {
168 std::unique_ptr<RHolder> holder = std::make_unique<TObjectHolder>(obj, kFALSE);
169 auto elem = RProvider::Browse(holder);
170 if (elem) name = elem->CreateItem()->GetName();
171 }
172 return name;
173 }
174
175 /** Check if item can be expanded */
176 bool CanItemHaveChilds() const override
177 {
178 auto obj = *fIter;
179 if (!obj || !obj->IsFolder())
180 return false;
181 return !RProvider::NotShowChilds(obj->IsA());
182 }
183
184 /** Create item for current TObject */
185 std::unique_ptr<RItem> CreateItem() override
186 {
187 auto obj = *fIter;
188 if (!obj) return RLevelIter::CreateItem();
189
190 std::unique_ptr<RHolder> holder = std::make_unique<TObjectHolder>(obj, kFALSE);
191
192 auto elem = RProvider::Browse(holder);
193
194 if (!elem)
195 elem = std::make_shared<TObjectElement>(holder);
196
197 return elem->CreateItem();
198 }
199
200 /** Returns full information for current element */
201 std::shared_ptr<RElement> GetElement() override
202 {
203 std::unique_ptr<RHolder> holder = std::make_unique<TObjectHolder>(*fIter, kFALSE);
204
205 return RProvider::Browse(holder);
206 }
207
208};
209
210
211// ==============================================================================================
212
213/** \class TFolderElement
214\ingroup rbrowser
215
216Browsable element for TFolder
217*/
218
219
221
222public:
223
224 TFolderElement(std::unique_ptr<RHolder> &obj) : TObjectElement(obj) { }
225
226 std::unique_ptr<RLevelIter> GetChildsIter() override
227 {
228 auto folder = fObject->Get<TFolder>();
229 if (folder)
230 return std::make_unique<TCollectionIter>(folder->GetListOfFolders());
231
233 }
234
235 int GetNumChilds() override
236 {
237 auto folder = fObject->Get<TFolder>();
238 return folder && folder->GetListOfFolders() ? folder->GetListOfFolders()->GetEntries() : 0;
239 }
240};
241
242// ==============================================================================================
243
244/** \class TCollectionElement
245\ingroup rbrowser
246
247Browsable element for TCollection
248*/
249
250
252public:
253
254 TCollectionElement(std::unique_ptr<RHolder> &obj) : TObjectElement(obj) {}
255
256 std::unique_ptr<RLevelIter> GetChildsIter() override
257 {
258 auto coll = fObject->Get<TCollection>();
259 if (coll && (coll->GetSize() > 0))
260 return std::make_unique<TCollectionIter>(coll);
261
263 }
264
265 int GetNumChilds() override
266 {
267 auto coll = fObject->Get<TCollection>();
268 return coll ? coll->GetSize() : 0;
269 }
270};
271
272// =================================================================================
273
274////////////////////////////////////////////////////////////////////////////////
275/// Constructor with plain TObject* as argument - ownership is not defined
276
277TObjectElement::TObjectElement(TObject *obj, const std::string &name, bool _hide_childs)
278{
279 SetObject(obj);
280 fName = name;
281 if (fName.empty())
282 fName = fObj->GetName();
283 SetHideChilds(_hide_childs);
284}
285
286////////////////////////////////////////////////////////////////////////////////
287/// Constructor with std::unique_ptr<RHolder> as argument
288
289TObjectElement::TObjectElement(std::unique_ptr<RHolder> &obj, const std::string &name, bool _hide_childs)
290{
291 fObject = std::move(obj); // take responsibility
292 fObj = const_cast<TObject *>(fObject->Get<TObject>()); // try to cast into TObject
293
294 fName = name;
295 if (!fObj)
296 fObject.reset();
297 else if (fName.empty())
298 fName = fObj->GetName();
299
300 SetHideChilds(_hide_childs);
301}
302
303////////////////////////////////////////////////////////////////////////////////
304/// Constructor with std::unique_ptr<RHolder> as argument
305
307{
308 fObject = std::make_unique<TObjectHolder>(obj);
309 fObj = obj;
310}
311
312////////////////////////////////////////////////////////////////////////////////
313/// Forget object, use when it was deleted behind the scene
314
316{
317 const_cast<TObjectElement *>(this)->fObj = nullptr;
318}
319
320////////////////////////////////////////////////////////////////////////////////
321/// Check if object still exists
322
324{
325 if (!fObj)
326 return nullptr;
327 if (fObj->IsZombie()) {
328 ForgetObject();
329 return nullptr;
330 }
331 return fObj;
332}
333
334////////////////////////////////////////////////////////////////////////////////
335/// Returns true if object can have child elements
336
338{
339 if (IsHideChilds())
340 return false;
341
342 return CheckObject() ? fObj->IsFolder() : false;
343}
344
345////////////////////////////////////////////////////////////////////////////////
346/// Returns name of the TObject
347
348std::string TObjectElement::GetName() const
349{
350 if (!fName.empty())
351 return fName;
352
353 return CheckObject() ? fObj->GetName() : "";
354}
355
356////////////////////////////////////////////////////////////////////////////////
357/// Returns title of the TObject
358
359std::string TObjectElement::GetTitle() const
360{
361 return CheckObject() ? fObj->GetTitle() : "";
362}
363
364////////////////////////////////////////////////////////////////////////////////
365/// Create iterator for childs elements if any
366
367std::unique_ptr<RLevelIter> TObjectElement::GetChildsIter()
368{
369 if (!IsFolder())
370 return nullptr;
371
372 auto iter = std::make_unique<TObjectLevelIter>();
373
374 TMyBrowserImp *imp = new TMyBrowserImp(iter.get(), fObj);
375
376 // ignore browsing during TBrowser constructor, avoid gROOT adding
377 imp->SetIgnore(true);
378
379 // must be new, otherwise TBrowser constructor ignores imp
380 TBrowser *br = new TBrowser("name", "title", imp);
381
382 imp->SetIgnore(false);
383
384 fObj->Browse(br);
385
386 auto dupl = imp->IsDuplicated();
387
388 delete br; // also will destroy implementation
389
390 if (dupl || (iter->NumElements() == 0)) return nullptr;
391
392 return iter;
393}
394
395////////////////////////////////////////////////////////////////////////////////
396/// Returns copy of TObject holder - if possible
397
398std::unique_ptr<RHolder> TObjectElement::GetObject()
399{
400 if (!fObject)
401 return nullptr;
402
403 return fObject->Copy();
404}
405
406////////////////////////////////////////////////////////////////////////////////
407/// Returns true if holding specified object
408
410{
411 if (CheckObject() == obj)
412 return true;
413
414 return fObject && (fObject->get_object<TObject>() == obj);
415}
416
417////////////////////////////////////////////////////////////////////////////////
418/// Returns true if object is still valid
419
421{
422 return CheckObject() != nullptr;
423}
424
425////////////////////////////////////////////////////////////////////////////////
426/// Returns class for contained object
427
429{
430 return CheckObject() ? fObj->IsA() : nullptr;
431}
432
433////////////////////////////////////////////////////////////////////////////////
434/// Provides default action which can be performed with the object
435
437{
438 auto cl = GetClass();
439 if (!cl) return kActNone;
440 std::string clname = cl->GetName();
441 if ("TCanvas"s == clname) return kActCanvas;
442 if (("TTree"s == clname) || ("TNtuple"s == clname)) return kActTree;
443 if (("TGeoManager"s == clname) || (clname.compare(0, 10, "TGeoVolume"s) == 0) || (clname.compare(0, 8, "TGeoNode"s) == 0)) return kActGeom;
444 if (RProvider::CanDraw6(cl)) return kActDraw6;
445 if (RProvider::CanDraw7(cl)) return kActDraw7;
446 if (RProvider::CanHaveChilds(cl)) return kActBrowse;
447 return kActNone;
448}
449
450////////////////////////////////////////////////////////////////////////////////
451/// Create item
452
453std::unique_ptr<RItem> TObjectElement::CreateItem() const
454{
455 auto obj = CheckObject();
456 if (!obj)
457 return RElement::CreateItem();
458
459 auto isfolder = !IsHideChilds() && obj->IsFolder();
460
461 auto item = std::make_unique<TObjectItem>(obj->GetName(), isfolder ? -1 : 0);
462
463 if (item->GetName().empty())
464 item->SetName(GetName());
465
466 item->SetTitle(obj->GetTitle());
467 if (item->GetTitle().empty())
468 item->SetTitle(GetTitle());
469
470 item->SetClassName(obj->ClassName());
471 item->SetIcon(RProvider::GetClassIcon(obj->IsA(), isfolder));
472
473 auto sz = GetSize();
474 if (sz > 0)
475 item->SetSize(sz);
476
477 auto tm = GetMTime();
478 if (!tm.empty())
479 item->SetMTime(tm);
480
481 return item;
482}
483
484////////////////////////////////////////////////////////////////////////////////
485/// Check object capability
486
488{
489 auto cl = GetClass();
490 if (!cl) return false;
491
492 std::string clname = cl->GetName();
493
494 switch(action) {
495 case kActBrowse: return RProvider::CanHaveChilds(cl);
496 case kActEdit: return true;
497 case kActImage:
498 case kActDraw6: return RProvider::CanDraw6(cl); // if can draw in TCanvas, can produce image
499 case kActDraw7: return RProvider::CanDraw7(cl);
500 case kActCanvas: return "TCanvas"s == clname;
501 case kActTree: return ("TTree"s == clname) || ("TNtuple"s == clname) ||
502 (clname.compare(0, 7, "TBranch"s) == 0) || (clname.compare(0, 5, "TLeaf"s) == 0);
503 case kActGeom: return ("TGeoManager"s == clname) || (clname.compare(0, 10, "TGeoVolume"s) == 0) || (clname.compare(0, 8, "TGeoNode"s) == 0);
504 default: return false;
505 }
506
507 return false;
508}
509
510////////////////////////////////////////////////////////////////////////////////
511/// Creates iterator for TCollection object
512
513std::unique_ptr<RLevelIter> TObjectElement::GetCollectionIter(const TCollection *coll)
514{
515 return std::make_unique<TCollectionIter>(coll);
516}
517
518////////////////////////////////////////////////////////////////////////////////
519/// Element representing TColor
520
522
523public:
524 TColorElement(std::unique_ptr<RHolder> &obj) : TObjectElement(obj)
525 {
526 if (fName.empty()) {
527 auto col = fObject->Get<TColor>();
528 if (col)
529 fName = "Color"s + std::to_string(col->GetNumber());
530 }
531 }
532
533 EActionKind GetDefaultAction() const override { return kActEdit; }
534
535};
536
537// ==============================================================================================
538
539/** \class RTObjectProvider
540\ingroup rbrowser
541
542Provider for all known TObject-based classes
543*/
544
546
547public:
548 //////////////////////////////////////////////////////////////////////////////////
549 // Register TObject-based class with standard browsing/drawing libs
550
551 void RegisterTObject(const std::string &clname, const std::string &iconname, bool can_browse = false, int can_draw = 3, const std::string &drawopt = ""s)
552 {
553 RegisterClass(clname,
554 iconname,
555 can_browse ? "dflt"s : ""s,
556 can_draw & 1 ? "libROOTObjectDraw6Provider"s : ""s,
557 can_draw & 2 ? "libROOTObjectDraw7Provider"s : ""s,
558 drawopt);
559 }
560
562 {
563 RegisterClass("TTree", "sap-icon://tree", "libROOTBranchBrowseProvider");
564 RegisterClass("TNtuple", "sap-icon://tree", "libROOTBranchBrowseProvider");
565 RegisterClass("TBranchElement", "sap-icon://e-care", "libROOTBranchBrowseProvider", "libROOTLeafDraw6Provider", "libROOTLeafDraw7Provider");
566 RegisterClass("TLeaf", "sap-icon://e-care", ""s, "libROOTLeafDraw6Provider", "libROOTLeafDraw7Provider");
567 RegisterClass("TBranch", "sap-icon://e-care", "libROOTBranchBrowseProvider"s, "libROOTLeafDraw6Provider", "libROOTLeafDraw7Provider");
568 RegisterClass("TVirtualBranchBrowsable", "sap-icon://e-care", ""s, "libROOTLeafDraw6Provider", "libROOTLeafDraw7Provider");
569 RegisterClass("TColor", "sap-icon://palette");
570 RegisterClass("TStyle", "sap-icon://badge");
571
572 RegisterTObject("TDirectory", "sap-icon://folder-blank", true, 0);
573 RegisterTObject("TClass", "sap-icon://tag-cloud-chart", false, 0);
574 RegisterTObject("TQClass", "sap-icon://tag-cloud-chart", false, 0);
575 RegisterTObject("TH1", "sap-icon://bar-chart", false, 3, ""s);
576 RegisterTObject("TH2", "sap-icon://pixelate", false, 3, "col"s);
577 RegisterTObject("TH3", "sap-icon://product");
578 RegisterTObject("TProfile", "sap-icon://vertical-bar-chart", false, 3, ""s);
579 RegisterTObject("TGraph", "sap-icon://line-chart");
580 RegisterTObject("TCanvas", "sap-icon://business-objects-experience", false, 1); // only can use TWebCanvas
581 RegisterTObject("TASImage", "sap-icon://picture", false, 1); // only can use TWebCanvas
582
583 RegisterTObject("THStack", "sap-icon://multiple-bar-chart");
584 RegisterTObject("TMultiGraph", "sap-icon://multiple-line-chart");
585
586 RegisterTObject("TCollection", "sap-icon://list", true, 0);
587 RegisterTObject("TGeoManager", "sap-icon://overview-chart", true, 0);
588 RegisterTObject("TGeoVolume", "sap-icon://product", true, 0);
589 RegisterTObject("TGeoNode", "sap-icon://product", true, 0);
590
591 RegisterBrowse(TFolder::Class(), [](std::unique_ptr<RHolder> &object) -> std::shared_ptr<RElement> {
592 return std::make_shared<TFolderElement>(object);
593 });
594
595 RegisterBrowse(TCollection::Class(), [](std::unique_ptr<RHolder> &object) -> std::shared_ptr<RElement> {
596 return std::make_shared<TCollectionElement>(object);
597 });
598
599 RegisterBrowse(TColor::Class(), [](std::unique_ptr<RHolder> &object) -> std::shared_ptr<RElement> {
600 return std::make_shared<TColorElement>(object);
601 });
602
603 RegisterBrowse(nullptr, [](std::unique_ptr<RHolder> &object) -> std::shared_ptr<RElement> {
604 if (object->CanCastTo<TObject>())
605 return std::make_shared<TObjectElement>(object, "", NotShowChilds(object->GetClass()));
606 return nullptr;
607 });
608
609 }
610
#define f(i)
Definition RSha256.hxx:104
constexpr Bool_t kFALSE
Definition RtypesCore.h:101
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void on
char name[80]
Definition TGX11.cxx:110
RTObjectProvider newRTObjectProvider
EActionKind
Possible actions on double-click.
Definition RElement.hxx:51
@ kActEdit
can provide data for text editor
Definition RElement.hxx:54
@ kActCanvas
indicate that it is canvas and should be drawn directly
Definition RElement.hxx:58
@ kActBrowse
just browse (expand) item
Definition RElement.hxx:53
@ kActGeom
can be shown in geometry viewer
Definition RElement.hxx:60
@ kActDraw7
can be drawn inside ROOT7 canvas
Definition RElement.hxx:57
@ kActTree
can be shown in tree viewer
Definition RElement.hxx:59
@ kActImage
can be shown in image viewer, can provide image
Definition RElement.hxx:55
@ kActDraw6
can be drawn inside ROOT6 canvas
Definition RElement.hxx:56
virtual std::unique_ptr< RItem > CreateItem() const
Returns item with element description.
Definition RElement.cxx:104
Iterator over single level hierarchy like any array, keys list, ...
virtual std::unique_ptr< RItem > CreateItem()
Create generic description item for RBrowser.
virtual bool Find(const std::string &name, int indx=-1)
Find item with specified name Default implementation, should work for all If index specified,...
Provider of different browsing methods for supported classes.
Definition RProvider.hxx:36
static bool CanDraw6(const ClassArg &)
Return true if provided class can be drawn on the TCanvas.
static std::shared_ptr< RElement > Browse(std::unique_ptr< RHolder > &obj)
Create browsable element for the object Created element may take ownership over the object.
static bool CanDraw7(const ClassArg &)
Return true if provided class can be drawn on the RCanvas.
static std::string GetClassIcon(const ClassArg &, bool=false)
Return icon name for the given class - either class name or TClass *.
static bool CanHaveChilds(const ClassArg &)
Return true if provided class can have childs.
static bool NotShowChilds(const ClassArg &)
Check if showing of sub-elements was disabled.
Access to TObject basic properties for RBrowsable.
std::unique_ptr< RHolder > GetObject() override
Return copy of TObject holder - if possible.
const TClass * GetClass() const
Returns class for contained object.
bool CheckValid() override
Returns true if object is still valid.
bool IsCapable(EActionKind) const override
Check object capability.
static std::unique_ptr< RLevelIter > GetCollectionIter(const TCollection *)
Creates iterator for TCollection object.
TObjectElement(TObject *obj, const std::string &name="", bool _hide_childs=false)
Constructor with plain TObject* as argument - ownership is not defined.
void SetObject(TObject *obj)
Constructor with std::unique_ptr<RHolder> as argument.
std::string GetTitle() const override
Title of TObject.
virtual const TObject * CheckObject() const
Check if object still exists.
std::unique_ptr< RLevelIter > GetChildsIter() override
Create iterator for childs elements if any.
bool IsObject(void *) override
Returns true if holding specified object.
EActionKind GetDefaultAction() const override
Provides default action which can be performed with the object.
std::string GetName() const override
Name of TObject.
bool IsFolder() const override
Returns true if object can have child elements.
void SetHideChilds(bool on)
Set flag to hide all potential object childs.
bool IsHideChilds() const
Is flag to hide all potential object childs set.
void ForgetObject() const
Forget object, use when it was deleted behind the scene.
std::unique_ptr< RItem > CreateItem() const override
Create item.
Provider for all known TObject-based classes.
void RegisterTObject(const std::string &clname, const std::string &iconname, bool can_browse=false, int can_draw=3, const std::string &drawopt=""s)
ABC describing GUI independent browser implementation protocol.
Definition TBrowserImp.h:29
Using a TBrowser one can browse all ROOT objects.
Definition TBrowser.h:37
TClass instances represent classes, structs and namespaces in the ROOT type system.
Definition TClass.h:81
Browsable element for TCollection.
int GetNumChilds() override
Returns number of childs By default creates iterator and iterates over all items.
std::unique_ptr< RLevelIter > GetChildsIter() override
Create iterator for childs elements if any.
TCollectionElement(std::unique_ptr< RHolder > &obj)
Iterator over elements in TCollection.
std::unique_ptr< RItem > CreateItem() override
Create item for current TObject.
TCollectionIter(const TFolder *f)
bool CanItemHaveChilds() const override
Check if item can be expanded.
bool Next() override
Shift to next entry.
virtual ~TCollectionIter()=default
TCollectionIter(const TCollection *coll)
std::shared_ptr< RElement > GetElement() override
Returns full information for current element.
std::string GetItemName() const override
Returns current entry name
Collection abstract base class.
Definition TCollection.h:65
static TClass * Class()
virtual Int_t GetEntries() const
virtual Int_t GetSize() const
Return the capacity of the collection, i.e.
Element representing TColor.
EActionKind GetDefaultAction() const override
Get default action.
TColorElement(std::unique_ptr< RHolder > &obj)
The color creation and management class.
Definition TColor.h:19
static TClass * Class()
Browsable element for TFolder.
TFolderElement(std::unique_ptr< RHolder > &obj)
std::unique_ptr< RLevelIter > GetChildsIter() override
Create iterator for childs elements if any.
int GetNumChilds() override
Returns number of childs By default creates iterator and iterates over all items.
<div class="legacybox"><h2>Legacy Code</h2> TFolder is a legacy interface: there will be no bug fixes...
Definition TFolder.h:30
TCollection * GetListOfFolders() const
Definition TFolder.h:55
static TClass * Class()
TObject * Next()
bool fDuplicated
! is object was duplicated?
virtual ~TMyBrowserImp()=default
TObjectLevelIter * fIter
! back-reference on iterator
void BrowseObj(TObject *obj) override
void Add(TObject *obj, const char *name, Int_t) override
void SetIgnore(bool on=true)
bool fIgnore
! ignore browsing, used during TBrowser constructor
const TObject * fBrowseObj
! object which will be browsed
bool IsDuplicated() const
TMyBrowserImp(TObjectLevelIter *iter, TObject *obj)
void Copy(TObject &named) const override
Copy this to obj.
Definition TNamed.cxx:94
Iterator over list of elements, designed for support TBrowser usage.
std::unique_ptr< RItem > CreateItem() override
Create element for the browser.
std::vector< std::shared_ptr< RElement > > fElements
bool CanItemHaveChilds() const override
Returns true if current item can have childs.
std::string GetItemName() const override
Returns current entry name
void AddElement(std::shared_ptr< RElement > &&elem)
auto NumElements() const
bool Next() override
Shift to next entry.
std::shared_ptr< RElement > GetElement() override
Returns full information for current element.
bool Find(const std::string &name, int indx=-1) override
Find item with specified name Default implementation, should work for all If index specified,...
virtual ~TObjectLevelIter()=default
Mother of all ROOT objects.
Definition TObject.h:41
virtual Bool_t IsFolder() const
Returns kTRUE in case object contains browsable objects (like containers or lists of other objects).
Definition TObject.cxx:555
virtual const char * GetName() const
Returns name of object.
Definition TObject.cxx:439
virtual void Browse(TBrowser *b)
Browse object. May be overridden for another default action.
Definition TObject.cxx:198
R__ALWAYS_INLINE Bool_t IsZombie() const
Definition TObject.h:153
virtual const char * GetTitle() const
Returns title of object.
Definition TObject.cxx:483
virtual TClass * IsA() const
Definition TObject.h:245