94 static const char *gFolderD[64];
95 static Int_t gFolderLevel = -1;
96 static char gFolderPath[512];
98 enum { kOwnFolderList = BIT(15) };
108 TFolder::TFolder() : TNamed()
118 TFolder::TFolder(
const char *name,
const char *title) : TNamed(name,title)
120 fFolders =
new TList();
121 SetBit(kOwnFolderList);
128 TFolder::TFolder(
const TFolder &folder) : TNamed(folder),fFolders(0),fIsOwner(kFALSE)
130 ((TFolder&)folder).Copy(*
this);
139 TCollection::StartGarbageCollection();
142 if (fFolders->IsOwner()) {
145 if (TestBit(kOwnFolderList)) {
146 TObjLink *iter = ((TList*)fFolders)->FirstLink();
148 TObject *obj = iter->GetObject();
149 TObjLink *next = iter->Next();
150 if (obj && obj->IsA() == TFolder::Class()) {
151 ((TList*)fFolders)->Remove(iter);
156 fFolders->Clear(
"nodelete");
157 SafeDelete(fFolders);
161 TCollection::EmptyGarbageCollection();
164 std::cerr <<
"TFolder dtor called for "<< GetName() << std::endl;
170 void TFolder::Add(TObject *obj)
172 if (obj == 0 || fFolders == 0)
return;
173 obj->SetBit(kMustCleanup);
186 TFolder *TFolder::AddFolder(
const char *name,
const char *title, TCollection *collection)
188 if (strchr(name,
'/')) {
189 ::Error(
"TFolder::TFolder",
"folder name cannot contain a slash: %s", name);
192 if (strlen(GetName()) == 0) {
193 ::Error(
"TFolder::TFolder",
"folder name cannot be \"\"");
196 TFolder *folder =
new TFolder();
197 folder->SetName(name);
198 folder->SetTitle(title);
200 fFolders =
new TList();
201 SetBit(kOwnFolderList);
203 fFolders->Add(folder);
206 folder->fFolders = collection;
208 folder->fFolders =
new TList();
209 folder->SetBit(kOwnFolderList);
217 void TFolder::Browse(TBrowser *b)
219 if (fFolders) fFolders->Browse(b);
225 void TFolder::Clear(Option_t *option)
227 if (fFolders) fFolders->Clear(option);
235 const char *TFolder::FindFullPathName(
const char *name)
const
237 TObject *obj = FindObject(name);
238 if (obj || !fFolders) {
240 gFolderD[gFolderLevel] = GetName();
241 if (strcmp(gFolderD[0],
"root")==0) {
242 strlcpy(gFolderPath,
"//root/",
sizeof(gFolderPath));
244 gFolderPath[0] =
'\0';
246 for (Int_t l = 1; l<=gFolderLevel;l++) {
247 strlcat(gFolderPath, gFolderD[l],
sizeof(gFolderPath));
248 strlcat(gFolderPath,
"/",
sizeof(gFolderPath));
250 strlcat(gFolderPath,name,
sizeof(gFolderPath));
254 if (name[0] ==
'/')
return 0;
255 TIter next(fFolders);
259 gFolderD[gFolderLevel] = GetName();
260 while ((obj=next())) {
264 if (obj->IsA()->InheritsFrom(TClass::Class()))
continue;
266 if (!obj->InheritsFrom(TFolder::Class()))
continue;
267 folder = (TFolder*)obj;
268 found = folder->FindFullPathName(name);
269 if (found)
return found;
280 const char *TFolder::FindFullPathName(
const TObject *)
const
282 Error(
"FindFullPathname",
"Not yet implemented");
289 TObject *TFolder::FindObject(
const TObject *)
const
291 Error(
"FindObject",
"Not yet implemented");
310 TObject *TFolder::FindObject(
const char *name)
const
312 if (!fFolders)
return 0;
313 if (name == 0)
return 0;
314 if (name[0] ==
'/') {
315 if (name[1] ==
'/') {
316 if (!strstr(name,
"//root/"))
return 0;
317 return gROOT->GetRootFolder()->FindObject(name+7);
319 return gROOT->GetRootFolder()->FindObject(name+1);
322 Int_t nch = strlen(name);
325 if (nch < (
int)
sizeof(csname))
328 cname =
new char[nch+1];
331 char *slash = strchr(cname,
'/');
334 obj = fFolders->FindObject(cname);
336 if (nch >= (
int)
sizeof(csname))
delete [] cname;
339 TObject *ret = obj->FindObject(slash+1);
340 if (nch >= (
int)
sizeof(csname))
delete [] cname;
343 TObject *ret = fFolders->FindObject(cname);
344 if (nch >= (
int)
sizeof(csname))
delete [] cname;
352 TObject *TFolder::FindObjectAny(
const char *name)
const
354 TObject *obj = FindObject(name);
355 if (obj || !fFolders)
return obj;
358 if (name[0] ==
'/')
return 0;
359 TIter next(fFolders);
362 if (gFolderLevel >= 0) gFolderD[gFolderLevel] = GetName();
363 while ((obj=next())) {
364 if (!obj->InheritsFrom(TFolder::Class()))
continue;
365 if (obj->IsA() == TClass::Class())
continue;
366 folder = (TFolder*)obj;
367 found = folder->FindObjectAny(name);
368 if (found)
return found;
378 Bool_t TFolder::IsOwner()
const
380 if (!fFolders)
return kFALSE;
381 return fFolders->IsOwner();
397 void TFolder::ls(Option_t *option)
const
399 if (!fFolders)
return;
400 TROOT::IndentLevel();
401 std::cout <<ClassName()<<
"*\t\t"<<GetName()<<
"\t"<<GetTitle()<<std::endl;
402 TROOT::IncreaseDirLevel();
404 TString opt = option;
405 Ssiz_t dump = opt.Index(
"dump", 0, TString::kIgnoreCase);
408 Ssiz_t print = opt.Index(
"print", 0, TString::kIgnoreCase);
410 opt.Remove(print, 5);
411 opt = opt.Strip(TString::kBoth);
414 TRegexp re(opt, kTRUE);
417 TIter nextobj(fFolders);
418 while ((obj = (TObject *) nextobj())) {
419 TString s = obj->GetName();
420 if (s.Index(re) == kNPOS)
continue;
427 TROOT::DecreaseDirLevel();
436 Int_t TFolder::Occurence(
const TObject *
object)
const
439 if (!fFolders)
return 0;
440 TIter next(fFolders);
442 while ((obj=next())) {
443 if (strcmp(obj->GetName(),
object->GetName()) == 0) n++;
445 if (n <=1)
return n-1;
448 while ((obj=next())) {
449 if (strcmp(obj->GetName(),
object->GetName()) == 0) n++;
450 if (obj ==
object)
return n;
458 void TFolder::RecursiveRemove(TObject *obj)
460 if (fFolders) fFolders->RecursiveRemove(obj);
466 void TFolder::Remove(TObject *obj)
468 if (obj == 0 || fFolders == 0)
return;
469 fFolders->Remove(obj);
477 void TFolder::SaveAs(
const char *filename, Option_t *option)
const
479 if (gDirectory) gDirectory->SaveObjectAs(
this,filename,option);
492 void TFolder::SetOwner(Bool_t owner)
494 if (!fFolders) fFolders =
new TList();
495 fFolders->SetOwner(owner);