GSI Object Oriented Online Offline (Go4)  GO4-6.3.0
TGo4FolderProxy.cxx
Go to the documentation of this file.
1 // $Id$
2 //-----------------------------------------------------------------------
3 // The GSI Online Offline Object Oriented (Go4) Project
4 // Experiment Data Processing at EE department, GSI
5 //-----------------------------------------------------------------------
6 // Copyright (C) 2000- GSI Helmholtzzentrum fuer Schwerionenforschung GmbH
7 // Planckstr. 1, 64291 Darmstadt, Germany
8 // Contact: http://go4.gsi.de
9 //-----------------------------------------------------------------------
10 // This software can be used under the license agreements as stated
11 // in Go4License.txt file which is part of the distribution.
12 //-----------------------------------------------------------------------
13 
14 #include "TGo4FolderProxy.h"
15 
16 #include "TROOT.h"
17 #include "TTree.h"
18 #include "TFolder.h"
19 #include "TCanvas.h"
20 #include "THStack.h"
21 
22 #include "TGo4ObjectProxy.h"
23 #include "TGo4DirProxy.h"
24 #include "TGo4TreeProxy.h"
25 #include "TGo4CanvasProxy.h"
26 #include "TGo4HStackProxy.h"
27 #include "TGo4Slot.h"
28 
29 
31  public:
32  TGo4FolderLevelIter(TFolder *folder) :
34  {
35  fIter = folder->GetListOfFolders()->MakeIterator();
36  }
37 
39  {
40  delete fIter;
41  }
42 
43  Bool_t next() override
44  {
45  fCurrent = fIter->Next();
46  return fCurrent;
47  }
48 
49  Bool_t isfolder() override
50  {
51  return (dynamic_cast<TFolder *>(fCurrent) != nullptr) ||
52  (dynamic_cast<TDirectory *>(fCurrent) != nullptr) ||
53  (dynamic_cast<TTree *>(fCurrent) != nullptr) ||
54  (dynamic_cast<TCanvas *>(fCurrent) != nullptr) ||
55  (dynamic_cast<THStack *>(fCurrent) != nullptr);
56  }
57 
59  {
60  TTree *tr = dynamic_cast<TTree *>(fCurrent);
61  if (tr) return TGo4TreeProxy::ProduceIter(tr);
62  TDirectory *dir = dynamic_cast<TDirectory *>(fCurrent);
63  if (dir) return TGo4DirProxy::ProduceIter(dir, kFALSE);
64  TCanvas *canv = dynamic_cast<TCanvas *>(fCurrent);
65  if (canv) return TGo4CanvasProxy::ProduceIter(canv);
66  THStack *hs = dynamic_cast<THStack *> (fCurrent);
67  if (hs) return TGo4HStackProxy::ProduceIter(hs);
68  return new TGo4FolderLevelIter((TFolder *)fCurrent);
69  }
70 
71  const char *name() override
72  {
73  return fCurrent->GetName();
74  }
75 
76  const char *info() override
77  {
78  return fCurrent->ClassName();
79  }
80 
81  Int_t GetKind() override
82  {
84  }
85 
86  const char *GetClassName() override
87  {
88  return fCurrent->ClassName();
89  }
90 
91  protected:
92  TIterator *fIter{nullptr};
93  TObject *fCurrent{nullptr};
94 };
95 
96 // ****************************************************************
97 
99  TGo4Proxy()
100 {
101 }
102 
103 TGo4FolderProxy::TGo4FolderProxy(TFolder *f, Bool_t owner, const char *rootfolder) :
104  TGo4Proxy(),
105  fFolder(f),
106  fOwner(owner),
107  fRootFolderName(rootfolder)
108 {
109 }
110 
112 {
113  if (fOwner) delete fFolder;
114 }
115 
117 {
119 }
120 
122 {
123  return fFolder ? fFolder->ClassName() : nullptr;
124 }
125 
126 void TGo4FolderProxy::WriteData(TGo4Slot *slot, TDirectory *dir, Bool_t onlyobjs)
127 {
128  if (!onlyobjs) {
129  const char *foldername = fRootFolderName.Length() > 0 ? fRootFolderName.Data() : nullptr;
130  slot->SetPar("FolderProxy::RootFolder", foldername);
131  }
132 }
133 
134 void TGo4FolderProxy::ReadData(TGo4Slot *slot, TDirectory *dir)
135 {
136  const char *foldername = slot->GetPar("FolderProxy::RootFolder");
137 
138  fFolder = LocateROOTFolder(foldername);
139  if (fFolder)
140  fRootFolderName = foldername;
141  fOwner = kFALSE;
142 }
143 
144 TFolder *TGo4FolderProxy::LocateROOTFolder(const char *rootfolder)
145 {
146  TFolder *res = nullptr;
147  if (rootfolder) {
148  if (strcmp(rootfolder,"//root/") == 0)
149  res = gROOT->GetRootFolder();
150  else
151  res = dynamic_cast<TFolder *>(gROOT->GetRootFolder()->FindObject(rootfolder));
152  }
153  return res;
154 }
155 
156 
157 std::unique_ptr<TGo4Access> TGo4FolderProxy::CreateAccess(TFolder *folder, const char *name)
158 {
159  if (!folder) return nullptr;
160  if (!name || !*name)
161  return std::make_unique<TGo4ObjectAccess>(folder);
162 
163  TFolder *curfold = folder;
164  const char *curname = name;
165 
166  while (curfold) {
167  const char *slash = strchr(curname,'/');
168  UInt_t len = slash ? slash - curname : strlen(curname);
169  TIter iter(curfold->GetListOfFolders());
170  TObject *obj = nullptr;
171  while ((obj = iter()) != nullptr)
172  if ((strlen(obj->GetName()) == len) &&
173  (strncmp(obj->GetName(), curname, len) == 0)) break;
174  if (!obj) return nullptr;
175 
176  if (!slash)
177  return std::make_unique<TGo4ObjectAccess>(obj);
178 
179  curname = slash+1;
180 
181  TTree *tr = dynamic_cast<TTree *> (obj);
182  if (tr)
183  return TGo4TreeProxy::CreateAccess(tr, curname);
184 
185  TDirectory *dir = dynamic_cast<TDirectory *> (obj);
186  if (dir)
187  return TGo4DirProxy::CreateAccess(dir, kFALSE, curname);
188 
189  TCanvas *canv = dynamic_cast<TCanvas *> (obj);
190  if (canv)
191  return TGo4CanvasProxy::CreateAccess(canv, curname);
192 
193  THStack *hs = dynamic_cast<THStack *> (obj);
194  if (hs)
195  return TGo4HStackProxy::CreateAccess(hs, curname);
196 
197  curfold = dynamic_cast<TFolder *>(obj);
198  }
199 
200  return nullptr;
201 }
202 
204 {
205  return new TGo4FolderLevelIter(folder);
206 }
TGo4FolderLevelIter(TFolder *folder)
TGo4LevelIter * subiterator() override
void ReadData(TGo4Slot *slot, TDirectory *dir) override
TString fRootFolderName
static TGo4LevelIter * ProduceIter(TTree *tree)
static TGo4LevelIter * ProduceIter(THStack *hs)
Bool_t next() override
virtual ~TGo4FolderLevelIter()
static TGo4LevelIter * ProduceIter(TCanvas *canv)
static TGo4LevelIter * ProduceIter(TDirectory *dir, Bool_t readright)
static TFolder * LocateROOTFolder(const char *rootfolder)
void WriteData(TGo4Slot *slot, TDirectory *dir, Bool_t onlyobjs) override
static std::unique_ptr< TGo4Access > CreateAccess(TFolder *folder, const char *name)
static std::unique_ptr< TGo4Access > CreateAccess(TCanvas *canv, const char *name)
Int_t GetKind() override
const char * name() override
const char * GetClassName() override
const char * GetPar(const char *name) const
Definition: TGo4Slot.cxx:598
static std::unique_ptr< TGo4Access > CreateAccess(TTree *tree, const char *name)
const char * GetContainedClassName() const override
Int_t GetObjectKind() const override
virtual ~TGo4FolderProxy()
Bool_t isfolder() override
static TGo4LevelIter * ProduceIter(TFolder *folder)
void SetPar(const char *name, const char *value)
Definition: TGo4Slot.cxx:586
const char * info() override
static std::unique_ptr< TGo4Access > CreateAccess(THStack *hs, const char *name)
static std::unique_ptr< TGo4Access > CreateAccess(TDirectory *dir, Bool_t readright, const char *name, TGo4Slot *browser_slot=nullptr)