GSI Object Oriented Online Offline (Go4) GO4-6.4.0
Loading...
Searching...
No Matches
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
102
103TGo4FolderProxy::TGo4FolderProxy(TFolder *f, Bool_t owner, const char *rootfolder) :
104 TGo4Proxy(),
105 fFolder(f),
106 fOwner(owner),
107 fRootFolderName(rootfolder)
108{
109}
110
115
120
122{
123 return fFolder ? fFolder->ClassName() : nullptr;
124}
125
126void 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
134void 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
144TFolder *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
157std::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}
static std::unique_ptr< TGo4Access > CreateAccess(TCanvas *canv, const char *name)
static TGo4LevelIter * ProduceIter(TCanvas *canv)
static std::unique_ptr< TGo4Access > CreateAccess(TDirectory *dir, Bool_t readright, const char *name, TGo4Slot *browser_slot=nullptr)
static TGo4LevelIter * ProduceIter(TDirectory *dir, Bool_t readright)
const char * name() override
const char * GetClassName() override
Bool_t next() override
const char * info() override
TGo4LevelIter * subiterator() override
TGo4FolderLevelIter(TFolder *folder)
Bool_t isfolder() override
Int_t GetKind() override
void WriteData(TGo4Slot *slot, TDirectory *dir, Bool_t onlyobjs) override
const char * GetContainedClassName() const override
void ReadData(TGo4Slot *slot, TDirectory *dir) override
static TGo4LevelIter * ProduceIter(TFolder *folder)
Int_t GetObjectKind() const override
static TFolder * LocateROOTFolder(const char *rootfolder)
static std::unique_ptr< TGo4Access > CreateAccess(TFolder *folder, const char *name)
static TGo4LevelIter * ProduceIter(THStack *hs)
static std::unique_ptr< TGo4Access > CreateAccess(THStack *hs, const char *name)
void SetPar(const char *name, const char *value)
Definition TGo4Slot.cxx:586
const char * GetPar(const char *name) const
Definition TGo4Slot.cxx:598
static std::unique_ptr< TGo4Access > CreateAccess(TTree *tree, const char *name)
static TGo4LevelIter * ProduceIter(TTree *tree)