49 #include "RConfigure.h"
52 const char rootdir[] =
"\\";
54 const char rootdir[] =
"/";
57 const char *filters[] = {
74 class TCursorSwitcher {
79 TCursorSwitcher(TGWindow *w1, TGWindow *w2) : fW1(w1), fW2(w2) {
80 if (w1) gVirtualX->SetCursor(w1->GetId(), gVirtualX->CreateCursor(kWatch));
81 if (w2) gVirtualX->SetCursor(w2->GetId(), gVirtualX->CreateCursor(kWatch));
84 if (fW1) gVirtualX->SetCursor(fW1->GetId(), gVirtualX->CreateCursor(kPointer));
85 if (fW2) gVirtualX->SetCursor(fW2->GetId(), gVirtualX->CreateCursor(kPointer));
97 ClassImp(TGFileBrowser);
102 TGFileBrowser::TGFileBrowser(
const TGWindow *p, TBrowser* b, UInt_t w, UInt_t h)
103 : TGMainFrame(p, w, h), TBrowserImp(b), fNewBrowser(0)
105 if (p && p != gClient->GetDefaultRoot())
106 fNewBrowser = (TRootBrowser *)p->GetMainFrame();
108 fNewBrowser->SetActBrowser(
this);
111 if (fBrowser) Show();
117 void TGFileBrowser::CreateBrowser()
120 SetCleanup(kDeepCleanup);
122 fTopFrame =
new TGHorizontalFrame(
this, 100, 30);
123 fDrawOption =
new TGComboBox(fTopFrame,
"");
124 TGTextEntry *dropt_entry = fDrawOption->GetTextEntry();
125 dropt_entry->SetToolTipText(
"Object Draw Option", 300);
126 fDrawOption->Resize(80, 20);
127 TGListBox *lb = fDrawOption->GetListBox();
128 lb->Resize(lb->GetWidth(), 120);
130 fDrawOption->AddEntry(
"", dropt++);
131 fDrawOption->AddEntry(
"box", dropt++);
132 fDrawOption->AddEntry(
"colz", dropt++);
133 fDrawOption->AddEntry(
"lego", dropt++);
134 fDrawOption->AddEntry(
"lego1", dropt++);
135 fDrawOption->AddEntry(
"lego2", dropt++);
136 fDrawOption->AddEntry(
"same", dropt++);
137 fDrawOption->AddEntry(
"surf", dropt++);
138 fDrawOption->AddEntry(
"surf1", dropt++);
139 fDrawOption->AddEntry(
"surf2", dropt++);
140 fDrawOption->AddEntry(
"surf3", dropt++);
141 fDrawOption->AddEntry(
"surf4", dropt++);
142 fDrawOption->AddEntry(
"surf5", dropt++);
143 fDrawOption->AddEntry(
"text", dropt++);
144 fTopFrame->AddFrame(fDrawOption,
new TGLayoutHints(kLHintsCenterY |
145 kLHintsRight, 2, 2, 2, 2));
146 fTopFrame->AddFrame(
new TGLabel(fTopFrame,
"Draw Option:"),
147 new TGLayoutHints(kLHintsCenterY | kLHintsRight,
150 fSortButton =
new TGPictureButton(fTopFrame,
"bld_sortup.png");
151 fSortButton->SetStyle(gClient->GetStyle());
152 fSortButton->SetToolTipText(
"Sort Alphabetically\n(Current folder only)");
153 fTopFrame->AddFrame(fSortButton,
new TGLayoutHints(kLHintsCenterY |
154 kLHintsLeft, 2, 2, 2, 2));
155 fSortButton->Connect(
"Clicked()",
"TGFileBrowser",
this,
"ToggleSort()");
157 fFilterButton =
new TGPictureButton(fTopFrame,
"filter.png");
158 fFilterButton->SetStyle(gClient->GetStyle());
159 fFilterButton->SetToolTipText(
"Filter Content");
160 fTopFrame->AddFrame(fFilterButton,
new TGLayoutHints(kLHintsCenterY |
161 kLHintsLeft, 2, 2, 2, 2));
162 fFilterButton->Connect(
"Clicked()",
"TGFileBrowser",
this,
"RequestFilter()");
164 fRefreshButton =
new TGPictureButton(fTopFrame,
"refresh.png");
165 fRefreshButton->SetStyle(gClient->GetStyle());
166 fRefreshButton->SetToolTipText(
"Refresh Current Folder");
167 fTopFrame->AddFrame(fRefreshButton,
new TGLayoutHints(kLHintsCenterY |
168 kLHintsLeft, 2, 5, 2, 2));
169 fRefreshButton->Connect(
"Clicked()",
"TGFileBrowser",
this,
"Refresh()");
171 AddFrame(fTopFrame,
new TGLayoutHints(kLHintsLeft | kLHintsTop |
172 kLHintsExpandX, 2, 2, 2, 2));
173 fCanvas =
new TGCanvas(
this, 100, 100);
174 fListTree =
new TGListTree(fCanvas, kHorizontalFrame);
175 AddFrame(fCanvas,
new TGLayoutHints(kLHintsLeft | kLHintsTop |
176 kLHintsExpandX | kLHintsExpandY));
177 fListTree->Connect(
"DoubleClicked(TGListTreeItem *, Int_t)",
178 "TGFileBrowser",
this,
"DoubleClicked(TGListTreeItem *, Int_t)");
179 fListTree->Connect(
"Clicked(TGListTreeItem *, Int_t, Int_t, Int_t)",
180 "TGFileBrowser",
this,
"Clicked(TGListTreeItem *, Int_t, Int_t, Int_t)");
181 fListTree->Connect(
"Checked(TObject*, Bool_t)",
"TGFileBrowser",
182 this,
"Checked(TObject*, Bool_t)");
184 fRootIcon = gClient->GetPicture(
"rootdb_t.xpm");
185 fFileIcon = gClient->GetPicture(
"doc_t.xpm");
187 fBotFrame =
new TGHorizontalFrame(
this, 100, 30);
188 fBotFrame->AddFrame(
new TGLabel(fBotFrame,
"Filter: "),
189 new TGLayoutHints(kLHintsCenterY | kLHintsLeft,
191 fFileType =
new TGComboBox(fBotFrame,
" All Files (*.*)");
193 fFileType->AddEntry(
" All Files (*.*)", ftype++);
194 fFileType->AddEntry(
" C/C++ Files (*.c;*.cxx;*.h;...)", ftype++);
195 fFileType->AddEntry(
" ROOT Files (*.root)", ftype++);
196 fFileType->AddEntry(
" Text Files (*.txt)", ftype++);
197 fFileType->Resize(200, 20);
198 fBotFrame->AddFrame(fFileType,
new TGLayoutHints(kLHintsLeft | kLHintsTop |
199 kLHintsExpandX, 2, 2, 2, 2));
200 fFileType->Connect(
"Selected(Int_t)",
"TGFileBrowser",
this,
201 "ApplyFilter(Int_t)");
202 fFileType->GetTextEntry()->Connect(
"ReturnPressed()",
"TGFileBrowser",
203 this,
"ApplyFilter(Int_t = -1)");
204 AddFrame(fBotFrame,
new TGLayoutHints(kLHintsLeft | kLHintsTop |
205 kLHintsExpandX, 2, 2, 2, 2));
207 fContextMenu =
new TContextMenu(
"FileBrowserContextMenu");
219 TString gv = gEnv->GetValue(
"Browser.GroupView",
"1000");
220 Int_t igv = atoi(gv.Data());
224 if (gEnv->GetValue(
"Browser.ShowHidden", 0))
227 fShowHidden = kFALSE;
231 if (TClass::GetClass(
"TGHtmlBrowser"))
232 TQObject::Connect(
"TGHtmlBrowser",
"Clicked(char*)",
233 "TGFileBrowser",
this,
"Selected(char*)");
235 TQObject::Connect(
"TPad",
"Modified()",
236 "TGFileBrowser",
this,
"PadModified()");
240 Resize(GetDefaultSize());
247 TGFileBrowser::~TGFileBrowser()
249 if (TClass::GetClass(
"TGHtmlBrowser"))
250 TQObject::Disconnect(
"TGHtmlBrowser",
"Clicked(char*)");
251 TQObject::Disconnect(
"TPad",
"Modified()");
255 if (fRootIcon) fClient->FreePicture(fRootIcon);
256 if (fCachedPic && (fCachedPic != fFileIcon))
257 fClient->FreePicture(fCachedPic);
258 if (fFileIcon) fClient->FreePicture(fFileIcon);
265 static Bool_t IsObjectEditable(TClass *cl)
268 TList* bcl = cl->GetListOfBases();
270 while ((base = (TBaseClass*) next())) {
271 cl = base->GetClassPointer();
272 if (cl && TClass::GetClass(Form(
"%sEditor", cl->GetName())))
274 if (IsObjectEditable(cl))
283 static const char *FormatToolTip(TObject *obj, Int_t maxlen=0)
285 static TString infos;
290 infos = obj->GetName();
291 if (obj->GetTitle()) {
293 infos += obj->GetTitle();
295 if (maxlen > 0 && infos.Length() > maxlen) {
296 infos.Remove(maxlen - 3);
299 TString objinfo = obj->GetObjectInfo(1, 1);
300 if (!objinfo.IsNull() && !objinfo.BeginsWith(
"x=")) {
301 Long64_t bsize, fsize, objsize;
302 objsize = objinfo.Atoll();
305 bsize = fsize = objsize;
310 infos += TString::Format(
"Size: %lld.%lldM", fsize/1024,
313 infos += TString::Format(
"Size: %lld.%lldK", bsize/1024,
317 infos += TString::Format(
"Size: %lld bytes", bsize);
334 void TGFileBrowser::Add(TObject *obj,
const char *name, Int_t check)
336 if (fListLevel && !strcmp(fListLevel->GetText(),
"Classes") &&
337 fListLevel->GetParent() &&
338 !strcmp(fListLevel->GetParent()->GetText(),
"root")) {
342 if (obj && obj->InheritsFrom(
"TApplication"))
344 if (obj && obj->InheritsFrom(
"TSystemDirectory"))
349 if (name) oname = name;
350 else if (obj) oname = obj->GetName();
352 mFiltered_i it = fFilteredItems.find(fListLevel);
353 if (it != fFilteredItems.end()) {
355 const char *filter = (
const char *)(*it).second;
356 TRegexp re(filter, kTRUE);
358 if (oname.Index(re) == kNPOS)
return;
361 const TGPicture *pic=0;
362 if (obj && obj->InheritsFrom(
"TKey") && (obj->IsA() != TClass::Class()))
363 AddKey(fListLevel, obj, name);
365 GetObjPicture(&pic, obj);
366 if (!name) name = obj->GetName();
368 if (!fListTree->FindChildByName(fListLevel, name)) {
369 TGListTreeItem *item = fListTree->AddItem(fListLevel, name, obj,
371 if ((pic != fFileIcon) && (pic != fCachedPic))
372 fClient->FreePicture(pic);
373 if (item) fListTree->CheckItem(item, (Bool_t)check);
374 fListTree->SetToolTipItem(item, FormatToolTip(obj, 32));
379 Bool_t isRemote = kFALSE;
380 if (obj->InheritsFrom(
"TRemoteObject"))
382 else if (fListLevel) {
384 TGListTreeItem *top = fListLevel;
385 while (top->GetParent()) {
386 TObject *tobj = (TObject *) top->GetUserData();
387 if (tobj && (tobj->InheritsFrom(
"TRemoteObject") ||
388 tobj->InheritsFrom(
"TApplicationRemote"))) {
392 top = top->GetParent();
396 TRemoteObject *robj = (TRemoteObject *)obj;
397 if (!strcmp(robj->GetClassName(),
"TKey")) {
398 AddKey(fListLevel, obj, name);
401 TString fname = name;
403 if (!fShowHidden && fname.BeginsWith(
"."))
409 if (!fListTree->FindChildByName(fListLevel, name)) {
410 TGListTreeItem *item = fListTree->AddItem(fListLevel, name, obj, pic, pic);
411 if ((pic != fFileIcon) && (pic != fCachedPic))
412 fClient->FreePicture(pic);
413 if (item && obj && obj->InheritsFrom(
"TObject"))
414 item->SetDNDSource(kTRUE);
415 fListTree->SetToolTipItem(item, FormatToolTip(obj, 32));
425 void TGFileBrowser::AddRemoteFile(TObject *obj)
430 const TGPicture *spic;
438 TRemoteObject *robj = (TRemoteObject *)obj;
440 robj->GetFileStat(&sbuf);
441 is_link = sbuf.fIsLink;
443 filename = robj->GetName();
444 if (R_ISDIR(type) || fFilter == 0 ||
445 (fFilter && filename.Index(*fFilter) != kNPOS)) {
447 GetFilePictures(&spic, type, is_link, filename);
449 pic = (TGPicture*)spic; pic->AddReference();
451 if ((!fListTree->FindChildByName(fListLevel, filename)) &&
452 (!fListTree->FindChildByData(fListLevel, obj)))
453 fListTree->AddItem(fListLevel, filename, obj, pic, pic);
462 void TGFileBrowser::BrowseObj(TObject *obj)
465 fNewBrowser->SetActBrowser(
this);
467 if (!fListTree->FindItemByObj(fListTree->GetFirstItem(), obj)) {
470 fListLevel = fListTree->FindItemByObj(fListTree->GetFirstItem(), obj);
471 fListTree->HighlightItem(fListLevel);
473 fListTree->OpenItem(fListLevel);
474 fListTree->ClearViewPort();
475 fListTree->AdjustPosition(fListLevel);
478 if (fBrowser) obj->Browse(fBrowser);
480 TList *volumes = gSystem->GetVolumes(
"all");
481 TList *curvol = gSystem->GetVolumes(
"cur");
482 if (volumes && curvol) {
483 const char *curdrive;
484 TNamed *named = (TNamed *)curvol->At(0);
486 curdrive = named->GetName();
491 while ((drive = (TNamed *)next())) {
492 AddFSDirectory(TString::Format(
"%s\\", drive->GetName()), drive->GetTitle(),
493 (strcmp(drive->GetName(), curdrive) == 0) ?
494 "SetRootDir" :
"Add");
502 GotoDir(gSystem->WorkingDirectory());
503 if (gROOT->GetListOfFiles() && !gROOT->GetListOfFiles()->IsEmpty())
511 void TGFileBrowser::Checked(TObject *obj, Bool_t checked)
514 fNewBrowser->Checked(obj, checked);
520 Option_t *TGFileBrowser::GetDrawOption()
const
522 return fDrawOption->GetTextEntry()->GetText();
528 void TGFileBrowser::GetFilePictures(
const TGPicture **pic, Int_t file_type,
529 Bool_t is_link,
const char *name)
531 static TString cached_ext;
532 static const TGPicture *cached_spic = 0;
533 const char *ext = name ? strrchr(name,
'.') : 0;
534 TString sname = name ? name :
" ";
537 if (ext && cached_spic && (cached_ext == ext)) {
542 if (R_ISREG(file_type)) {
543 *pic = gClient->GetMimeTypeList()->GetIcon(name, kTRUE);
557 *pic = gClient->GetPicture(
"doc_t.xpm");
559 if (R_ISREG(file_type) && (file_type) & kS_IXUSR) {
560 *pic = gClient->GetPicture(
"app_t.xpm");
562 if (R_ISDIR(file_type)) {
563 *pic = gClient->GetPicture(
"folder_t.xpm");
565 if(sname.EndsWith(
".root")) {
566 *pic = gClient->GetPicture(
"rootdb_t.xpm");
571 *pic = gClient->GetPicture(
"slink_t.xpm");
581 void TGFileBrowser::RecursiveRemove(TObject *obj)
583 TGListTreeItem *itm = 0, *item = 0;
584 if (obj->InheritsFrom(
"TFile")) {
585 itm = fListTree->FindChildByData(0, gROOT->GetListOfFiles());
587 item = fListTree->FindChildByData(itm, obj);
591 if (CheckFiltered(item))
592 fFilteredItems.erase(item);
593 fListTree->DeleteItem(item);
595 itm = fRootDir ? fRootDir->GetFirstChild() : 0;
597 item = fListTree->FindItemByObj(itm, obj);
599 fListTree->DeleteChildren(item);
600 item->SetUserData(0);
602 itm = itm->GetNextSibling();
605 if (!obj->InheritsFrom(
"TFile") && fRootDir) {
606 item = fListTree->FindItemByObj(fRootDir, obj);
608 if (item && CheckFiltered(item))
609 fFilteredItems.erase(item);
610 fListTree->RecursiveDeleteItem(fRootDir, obj);
618 void TGFileBrowser::Refresh(Bool_t )
620 TTimer::SingleShot(200,
"TGFileBrowser",
this,
"Update()");
623 TCursorSwitcher cursorSwitcher(
this, fListTree);
624 static UInt_t prev = 0;
625 UInt_t curr = gROOT->GetListOfBrowsables()->GetSize();
626 if (!prev) prev = curr;
629 TGListTreeItem *sav = fListLevel;
640 void TGFileBrowser::Update()
643 Long_t
id = 0, flags = 0, modtime = 0;
645 TGListTreeItem *item = fCurrentDir;
646 if (!item) item = fRootDir;
649 TGListTreeItem *curr = fListTree->GetSelected();
651 TObject *obj = (TObject *) curr->GetUserData();
652 if (obj && !obj->TestBit(kNotDeleted)) {
655 if (CheckFiltered(curr))
656 fFilteredItems.erase(curr);
657 fListTree->DeleteItem(curr);
661 else if (obj && obj->TestBit(kNotDeleted) &&
662 obj->InheritsFrom(
"TObjString") && curr->GetParent()) {
663 fListTree->GetPathnameFromItem(curr->GetParent(), path);
664 if (strlen(path) > 1) {
665 TString dirpath = FullPathName(curr->GetParent());
666 Int_t res = gSystem->GetPathInfo(dirpath.Data(), &id, &size,
668 if ((res == 0) && (flags & 2)) {
669 TString fullpath = FullPathName(curr);
670 if (gSystem->AccessPathName(fullpath.Data())) {
673 if (CheckFiltered(curr))
674 fFilteredItems.erase(curr);
675 fListTree->DeleteItem(curr);
683 TString actpath = FullPathName(item);
684 flags =
id = size = modtime = 0;
685 if (gSystem->GetPathInfo(actpath.Data(), &id, &size, &flags, &modtime) == 0) {
686 Int_t isdir = (Int_t)flags & 2;
688 TString savdir = gSystem->WorkingDirectory();
690 TGListTreeItem *del = 0, *itm = item->GetFirstChild();
692 fListTree->GetPathnameFromItem(itm, path);
693 if (strlen(path) > 1) {
694 TString recpath = FullPathName(itm);
695 if (gSystem->AccessPathName(recpath.Data())) {
697 itm = itm->GetNextSibling();
700 if (CheckFiltered(del))
701 fFilteredItems.erase(del);
702 fListTree->DeleteItem(del);
708 itm = itm->GetNextSibling();
712 TGListTreeItem *sav = fListLevel;
713 DoubleClicked(item, 1);
715 CheckFiltered(fListLevel, kTRUE);
725 void TGFileBrowser::AddFSDirectory(
const char *entry,
const char *path,
728 TGListTreeItem *item = 0;
729 if ((opt == 0) || (!opt[0])) {
730 if (fRootDir == 0 && !fListTree->FindChildByName(0, rootdir))
731 item = fRootDir = fListTree->AddItem(0, rootdir);
734 if (strstr(opt,
"SetRootDir")) {
735 if (!fListTree->FindChildByName(0, entry))
736 item = fRootDir = fListTree->AddItem(0, entry);
738 else if (strstr(opt,
"Add")) {
743 if (!fListTree->FindChildByName(0, entry))
744 item = fListTree->AddItem(0, entry);
747 TString infos = path;
748 item->SetTipText(path);
750 if (infos.Contains(
"Removable"))
751 pic = (TGPicture *)gClient->GetPicture(
"fdisk_t.xpm");
752 else if (infos.Contains(
"Local"))
753 pic = (TGPicture *)gClient->GetPicture(
"hdisk_t.xpm");
754 else if (infos.Contains(
"CD"))
755 pic = (TGPicture *)gClient->GetPicture(
"cdrom_t.xpm");
756 else if (infos.Contains(
"Network"))
757 pic = (TGPicture *)gClient->GetPicture(
"netdisk_t.xpm");
759 item->SetPictures(pic, pic);
766 void TGFileBrowser::AddKey(TGListTreeItem *itm, TObject *obj,
const char *name)
769 TGListTreeItem *where;
770 static TGListTreeItem *olditem = itm;
771 static TGListTreeItem *item = itm;
772 const TGPicture *pic;
774 if (itm == 0)
return;
776 if ((fCnt == 0) || (olditem != itm)) {
777 olditem = item = itm;
779 if (!name) name = obj->GetName();
780 if (fNKeys > fGroupSize) {
781 where = itm->GetFirstChild();
783 if (fListTree->FindItemByObj(where, obj))
785 where = where->GetNextSibling();
788 if ((fNKeys > fGroupSize) && (fCnt % fGroupSize == 0)) {
790 TString newname = TString::Format(
"%s-%s", item->GetText(), name);
791 item->Rename(newname.Data());
793 item = fListTree->AddItem(itm, name);
794 item->SetDNDSource(kTRUE);
796 if ((fCnt > fGroupSize) && (fCnt >= fNKeys-1)) {
797 TString newname = TString::Format(
"%s-%s", item->GetText(), name);
798 item->Rename(newname.Data());
800 GetObjPicture(&pic, obj);
801 if (!fListTree->FindChildByName(item, name)) {
802 TGListTreeItem *it = fListTree->AddItem(item, name, obj, pic, pic);
803 if (pic && (pic != fFileIcon) && (pic != fCachedPic))
804 fClient->FreePicture(pic);
805 it->SetDNDSource(kTRUE);
806 it->SetTipText(FormatToolTip(obj, 32));
814 void TGFileBrowser::ApplyFilter(Int_t
id)
819 if (fFilter)
delete fFilter;
821 if ((
id > 1) && (
id < 5))
822 fFilter =
new TRegexp(filters[
id], kTRUE);
823 else if ((
id < 0) || (
id > 4)) {
824 TGTextLBEntry *lbe = (TGTextLBEntry *)fFileType->GetSelectedEntry();
826 const char *text = lbe->GetTitle();
827 fFilter =
new TRegexp(text, kTRUE);
830 TGListTreeItem *item = fCurrentDir;
834 fListTree->DeleteChildren(item);
835 DoubleClicked(item, 1);
837 fListTree->ClearViewPort();
843 void TGFileBrowser::Chdir(TGListTreeItem *item)
846 TGListTreeItem *i = item;
848 TObject *obj = (TObject*) i->GetUserData();
849 if ((obj) && obj->InheritsFrom(
"TDirectory")) {
850 ((TDirectory *)obj)->cd();
861 void TGFileBrowser::CheckRemote(TGListTreeItem *item)
864 TObject *obj = (TObject *) item->GetUserData();
866 if (obj->InheritsFrom(
"TApplicationRemote")) {
867 if (!gApplication->GetAppRemote()) {
868 gROOT->ProcessLine(TString::Format(
".R %s", item->GetText()));
869 if (gApplication->GetAppRemote()) {
870 Getlinem(kInit, TString::Format(
"\n%s:root [0]",
871 gApplication->GetAppRemote()->ApplicationName()));
875 if (item->GetParent() && item->GetParent()->GetUserData() &&
876 ((TObject *)item->GetParent()->GetUserData())->InheritsFrom(
"TApplicationRemote")) {
878 if (!gApplication->GetAppRemote()) {
879 gROOT->ProcessLine(TString::Format(
".R %s", item->GetParent()->GetText()));
880 if (gApplication->GetAppRemote()) {
881 Getlinem(kInit, TString::Format(
"\n%s:root [0]",
882 gApplication->GetAppRemote()->ApplicationName()));
885 else if (!strcmp(item->GetText(),
"ROOT Files")) {
887 gApplication->SetBit(TApplication::kProcessRemotely);
888 gApplication->ProcessLine(
"((TApplicationServer *)gApplication)->BrowseFile(0);");
894 TGListTreeItem *top = item;
895 while (top->GetParent()) {
896 top = top->GetParent();
898 TObject *topobj = (TObject *) top->GetUserData();
899 if (topobj && topobj->InheritsFrom(
"TApplicationRemote")) {
901 if (!gApplication->GetAppRemote()) {
903 gROOT->ProcessLine(TString::Format(
".R %s", top->GetText()));
904 if (gApplication->GetAppRemote()) {
905 Getlinem(kInit, TString::Format(
"\n%s:root [0]",
906 gApplication->GetAppRemote()->ApplicationName()));
910 else if (gApplication->GetAppRemote()) {
912 gApplication->ProcessLine(
".R");
913 Getlinem(kInit,
"\nroot [0]");
917 else if (gApplication->GetAppRemote()) {
919 gApplication->ProcessLine(
".R");
920 Getlinem(kInit,
"\nroot [0]");
929 Bool_t TGFileBrowser::CheckFiltered(TGListTreeItem *item, Bool_t but)
931 Bool_t found = kFALSE;
934 if (fFilteredItems.empty())
936 mFiltered_i it = fFilteredItems.find(item);
937 if (it != fFilteredItems.end()) {
939 filter = (
const char *)(*it).second;
946 fFilterButton->SetState(found ? kButtonEngaged : kButtonUp);
949 filter.Prepend(
"Showing only \'");
951 fFilterButton->SetToolTipText(filter.Data());
955 fFilterButton->SetToolTipText(
"Filter Content...");
965 Bool_t TGFileBrowser::CheckSorted(TGListTreeItem *item, Bool_t but)
967 Bool_t found = kFALSE;
968 TGListTreeItem *i, *itm;
969 if (item->GetFirstChild())
972 itm = item->GetParent();
973 for (sLTI_i p=fSortedItems.begin(); p!=fSortedItems.end(); ++p) {
974 i = (TGListTreeItem *)(*p);
980 if (but) fSortButton->SetState(found ? kButtonEngaged : kButtonUp);
987 void TGFileBrowser::Clicked(TGListTreeItem *item, Int_t btn, Int_t x, Int_t y)
991 Long_t
id = 0, flags = 0, modtime = 0;
994 CheckSorted(item, kTRUE);
995 CheckFiltered(item, kTRUE);
997 TObject *selected = 0;
998 TString fullpath = FullPathName(item);
999 TObject *obj = (TObject *) item->GetUserData();
1000 if (obj && (!obj->InheritsFrom(
"TObjString") ||
1001 gSystem->AccessPathName(fullpath.Data()))) {
1002 if (obj->InheritsFrom(
"TKey") && (obj->IsA() != TClass::Class())) {
1004 const char *clname = ((TKey *)obj)->GetClassName();
1005 if (clname && strcmp(clname,
"TGeoManager")) {
1006 TClass *cl = TClass::GetClass(clname);
1007 TString name = ((TKey *)obj)->GetName();
1009 name += ((TKey *)obj)->GetCycle();
1010 void *add = gDirectory->FindObjectAny((
char *) name.Data());
1011 if (add && cl->IsTObject()) {
1012 obj = (TObject*)add;
1017 if (obj->InheritsFrom(
"TDirectory") || obj->InheritsFrom(
"TList"))
1018 item->SetUserData(obj);
1022 if (obj->InheritsFrom(
"TLeaf") ||
1023 obj->InheritsFrom(
"TBranch")) {
1026 if (btn == kButton3)
1027 fContextMenu->Popup(x, y, obj, fBrowser);
1031 fListTree->GetPathnameFromItem(item, path);
1032 if (strlen(path) > 3) {
1033 if (gSystem->GetPathInfo(fullpath.Data(), &id, &size, &flags, &modtime) == 0) {
1036 if (btn == kButton3) {
1037 if (fDir)
delete fDir;
1038 fDir =
new TSystemDirectory(item->GetText(), fullpath.Data());
1039 fContextMenu->Popup(x, y, fDir, fBrowser);
1043 fCurrentDir = item->GetParent();
1044 if (btn == kButton3) {
1045 if (fFile)
delete fFile;
1046 fFile =
new TSystemFile(item->GetText(), fullpath.Data());
1047 fContextMenu->Popup(x, y, fFile, fBrowser);
1053 fListTree->ClearViewPort();
1054 if (selected && (selected->IsA() != TClass::Class())) {
1055 if (selected->InheritsFrom(
"TLeaf"))
1056 selected = (TObject *)gROOT->ProcessLine(TString::Format(
"((TLeaf *)0x%lx)->GetBranch()->GetTree();", (ULong_t)selected));
1057 if (selected->InheritsFrom(
"TBranch"))
1058 selected = (TObject *)gROOT->ProcessLine(TString::Format(
"((TBranch *)0x%lx)->GetTree();", (ULong_t)selected));
1059 if (selected->InheritsFrom(
"TTree")) {
1062 TDirectory *tdir = (TDirectory *)gROOT->ProcessLine(TString::Format(
"((TTree *)0x%lx)->GetDirectory();", (ULong_t)selected));
1064 gROOT->ProcessLine(TString::Format(
"((TTree *)0x%lx)->SetDirectory(gDirectory);", (ULong_t)selected));
1068 if (selected && gPad && IsObjectEditable(selected->IsA())) {
1069 TVirtualPadEditor *ved = TVirtualPadEditor::GetPadEditor(kFALSE);
1071 TGedEditor *ged = (TGedEditor *)ved;
1072 ged->SetModel(gPad, selected, kButton1Down);
1080 TString TGFileBrowser::FullPathName(TGListTreeItem* item)
1082 TGListTreeItem *parent, *itm = item;
1083 TString dirname = itm->GetText();
1085 while ((parent=itm->GetParent())) {
1086 char *s = gSystem->ConcatFileName(parent->GetText(), dirname);
1091 dirname = gSystem->ExpandPathName(dirname.Data());
1094 while (dirname.Contains(
".lnk")) {
1095 Ssiz_t idx = dirname.Index(
".lnk") + 4;
1096 TString resolved = dirname;
1097 resolved.Remove(idx);
1098 resolved = gSystem->ExpandPathName(resolved.Data());
1099 dirname = resolved.Append(dirname.Remove(0, idx));
1108 TString TGFileBrowser::DirName(TGListTreeItem* item)
1111 TString fullpath = FullPathName(item);
1118 _splitpath(fullpath.Data(), winDrive, winDir, winName, winExt);
1119 dirname = TString::Format(
"%s%s", winDrive, winDir);
1121 dirname = gSystem->DirName(fullpath);
1132 static Bool_t IsTextFile(
const char *candidate)
1136 Int_t weirdcount = 0;
1141 if (gSystem->GetPathInfo(candidate, buf) || !(buf.fMode & kS_IFREG))
1144 infile = fopen(candidate,
"r");
1147 nchars = fread(buffer, 1, 512, infile);
1150 for (i = 0; i < nchars; i++) {
1151 if (buffer[i] & 128)
1153 if (buffer[i] ==
'\0')
1157 if ((nchars > 0) && ((weirdcount * 100 / nchars) > 30))
1170 static const TGPicture *MakeLinkPic(
const TGPicture *pic)
1172 const TGPicture *merged;
1173 TImage *img1, *img2;
1175 img1 = TImage::Create();
1176 if (img1 == 0)
return pic;
1177 img1->SetImage(((
const TGPicture *)pic)->GetPicture(),
1178 ((
const TGPicture *)pic)->GetMask());
1179 img2 = TImage::Open(
"slink_t.xpm");
1180 if (img2) img1->Merge(img2);
1181 TString lnk_name = ((
const TGPicture *)pic)->GetName();
1182 lnk_name.Prepend(
"lnk_");
1183 merged = gClient->GetPicturePool()->GetPicture(lnk_name.Data(),
1184 img1->GetPixmap(), img1->GetMask());
1185 if (img2)
delete img2;
1195 void TGFileBrowser::DoubleClicked(TGListTreeItem *item, Int_t )
1197 const TGPicture *pic=0;
1198 TString dirname = DirName(item);
1199 TString fullpath = FullPathName(item);
1200 TGListTreeItem *itm;
1203 Long_t id, flags, modtime;
1206 Bool_t is_link = kFALSE;
1207 if (!gSystem->GetPathInfo(item->GetText(), sbuf) && sbuf.fIsLink) {
1209 fullpath = gSystem->ExpandPathName(item->GetText());
1213 fNewBrowser->SetActBrowser(
this);
1214 TCursorSwitcher switcher(
this, fListTree);
1216 CheckSorted(item, kTRUE);
1217 CheckFiltered(item, kTRUE);
1219 TGListTreeItem *pitem = item->GetParent();
1220 TObject *obj = (TObject *) item->GetUserData();
1221 if (obj && !obj->InheritsFrom(
"TSystemFile")) {
1222 TString ext = obj->GetName();
1223 if (obj->InheritsFrom(
"TDirectory") && (obj->IsA() != TClass::Class())) {
1224 if (((TDirectory *)obj)->GetListOfKeys())
1225 fNKeys = ((TDirectory *)obj)->GetListOfKeys()->GetEntries();
1229 else if (obj->InheritsFrom(
"TKey") && (obj->IsA() != TClass::Class())) {
1231 const char *clname = ((TKey *)obj)->GetClassName();
1233 TClass *cl = TClass::GetClass(clname);
1234 TString name = ((TKey *)obj)->GetName();
1236 name += ((TKey *)obj)->GetCycle();
1237 void *add = gDirectory->FindObjectAny((
char *) name.Data());
1238 if (add && cl->IsTObject()) {
1239 obj = (TObject*)add;
1244 if (obj->InheritsFrom(
"TDirectory") || obj->InheritsFrom(
"TList"))
1245 item->SetUserData(obj);
1249 else if (obj->InheritsFrom(
"TLeaf") || obj->InheritsFrom(
"TBranch")) {
1252 else if (obj->InheritsFrom(
"TRemoteObject")) {
1254 TRemoteObject *robj = (TRemoteObject *)obj;
1255 if (!strcmp(robj->GetClassName(),
"TKey")) {
1256 TGListTreeItem *parent = item;
1257 TRemoteObject *probj = (TRemoteObject *)parent->GetUserData();
1259 while ( probj && strcmp(probj->GetClassName(),
"TFile")) {
1260 parent = parent->GetParent();
1261 probj = (TRemoteObject *)parent->GetUserData();
1263 if (probj && !strcmp(probj->GetClassName(),
"TFile")) {
1265 gApplication->SetBit(TApplication::kProcessRemotely);
1266 gApplication->ProcessLine(
1267 TString::Format(
"((TApplicationServer *)gApplication)->BrowseFile(\"%s\");",
1269 gSystem->Sleep(250);
1272 if (gClient->GetMimeTypeList()->GetAction(obj->GetName(), action)) {
1274 act.ReplaceAll(
"%s", obj->GetName());
1275 if ((act[0] !=
'!') && (strcmp(pitem->GetText(),
"ROOT Files"))) {
1277 gApplication->SetBit(TApplication::kProcessRemotely);
1278 gApplication->ProcessLine(act.Data());
1281 if ((ext.EndsWith(
".root")) && (strcmp(pitem->GetText(),
"ROOT Files"))) {
1282 gApplication->SetBit(TApplication::kProcessRemotely);
1283 gApplication->ProcessLine(
"((TApplicationServer *)gApplication)->BrowseFile(0);");
1286 if (!obj->InheritsFrom(
"TObjString") ||
1287 gSystem->AccessPathName(fullpath.Data())) {
1288 if (fBrowser) fBrowser->SetDrawOption(GetDrawOption());
1290 if (gClient->GetMimeTypeList()->GetAction(obj->IsA()->GetName(), action)) {
1292 if (fBrowser && act.Contains(
"->Browse()")) obj->Browse(fBrowser);
1293 else if (act.Contains(
"->Draw()")) obj->Draw(GetDrawOption());
1295 if (act.Contains(
"%s")) act.ReplaceAll(
"%s", obj->GetName());
1296 else act.Prepend(obj->GetName());
1297 gInterpreter->SaveGlobalsContext();
1298 if (act[0] ==
'!') {
1300 gSystem->Exec(act.Data());
1303 if (obj->InheritsFrom(
"TRemoteObject"))
1304 gApplication->SetBit(TApplication::kProcessRemotely);
1305 gApplication->ProcessLine(act.Data());
1309 else if (obj->InheritsFrom(
"TCanvas") && fNewBrowser &&
1310 fNewBrowser->GetTabRight() &&
1311 fNewBrowser->GetTabRight()->GetTabTab(obj->GetName())) {
1316 else if (fBrowser && !obj->InheritsFrom(
"TFormula"))
1317 obj->Browse(fBrowser);
1321 fListTree->ClearViewPort();
1322 if (gPad) gPad->Update();
1326 flags =
id = size = modtime = 0;
1327 if (gSystem->GetPathInfo(fullpath.Data(), &id, &size, &flags, &modtime) != 0)
1329 Int_t isdir = (Int_t)flags & 2;
1331 TString savdir = gSystem->WorkingDirectory();
1335 TSystemDirectory dir(item->GetText(),FullPathName(item));
1336 TList *files = dir.GetListOfFiles();
1341 TString fname, pname;
1344 while ((file=(TSystemFile*)next())) {
1345 fname = file->GetName();
1346 if (file->IsDirectory()) {
1347 if (!fShowHidden && fname.BeginsWith(
"."))
1349 if ((fname!=
"..") && (fname!=
".")) {
1350 if (!fListTree->FindChildByName(item, fname)) {
1351 itm = fListTree->AddItem(item, fname);
1352 if (!gSystem->GetPathInfo(fname, sbuf) &&
1356 const TGPicture *opened = 0, *l_opened = 0;
1357 const TGPicture *closed = 0, *l_closed = 0;
1358 opened = fClient->GetPicture(
"ofolder_t.xpm");
1359 if (opened) l_opened = MakeLinkPic(opened);
1360 closed = fClient->GetPicture(
"folder_t.xpm");
1361 if (closed) l_closed = MakeLinkPic(closed);
1362 if (l_opened && l_closed)
1363 itm->SetPictures(l_opened, l_closed);
1364 if (opened) fClient->FreePicture(opened);
1365 if (closed) fClient->FreePicture(closed);
1366 if (l_opened) fClient->FreePicture(l_opened);
1367 if (l_closed) fClient->FreePicture(l_closed);
1372 itm->SetUserData(0);
1379 while ((file=(TSystemFile*)nextf())) {
1380 fname = pname = file->GetName();
1381 if (!file->IsDirectory() && (fFilter == 0 ||
1382 (fFilter && fname.Index(*fFilter) != kNPOS))) {
1383 if (!fShowHidden && fname.BeginsWith(
"."))
1386 if (gSystem->GetPathInfo(fname, sbuf) == 0) {
1388 modtime = sbuf.fMtime;
1390 if (sbuf.fIsLink && pname.EndsWith(
".lnk"))
1391 pname.Remove(pname.Length()-4);
1392 pic = gClient->GetMimeTypeList()->GetIcon(pname, kTRUE);
1396 pic = MakeLinkPic(pic);
1397 if (!fListTree->FindChildByName(item, fname)) {
1398 itm = fListTree->AddItem(item, fname, pic, pic);
1399 if (pic != fFileIcon)
1400 fClient->FreePicture(pic);
1402 itm->SetUserData(
new TObjString(TString::Format(
"file://%s\r\n",
1403 gSystem->ExpandPathName(file->GetName()))), kTRUE);
1405 itm->SetUserData(
new TObjString(TString::Format(
"file://%s/%s\r\n",
1406 gSystem->UnixPathName(file->GetTitle()),
1407 file->GetName())), kTRUE);
1408 itm->SetDNDSource(kTRUE);
1409 if (size && modtime) {
1410 char *tiptext = FormatFileInfo(fname.Data(), size, modtime);
1411 itm->SetTipText(tiptext);
1422 TString lnkname = item->GetText();
1423 if (is_link && lnkname.EndsWith(
".lnk"))
1424 lnkname.Remove(lnkname.Length()-4);
1425 fCurrentDir = item->GetParent();
1426 TSystemFile f(lnkname.Data(), fullpath.Data());
1427 TString fname = f.GetName();
1428 if (fname.EndsWith(
".root")) {
1429 TDirectory *rfile = 0;
1430 gSystem->ChangeDirectory(dirname.Data());
1431 rfile = (TDirectory *)gROOT->GetListOfFiles()->FindObject(obj);
1433 rfile = (TDirectory *)gROOT->ProcessLine(TString::Format(
"new TFile(\"%s\")",fname.Data()));
1437 if (item->GetUserData()) {
1439 TObject *obj2 =
static_cast<TObject *
>(item->GetUserData());
1442 TObjString *ostr =
dynamic_cast<TObjString *
>(obj2);
1443 if (ostr)
delete ostr;
1445 item->SetUserData(rfile);
1446 fNKeys = rfile->GetListOfKeys()->GetEntries();
1448 if (fBrowser) rfile->Browse(fBrowser);
1453 else if (fname.EndsWith(
".png")) {
1454 gSystem->ChangeDirectory(dirname.Data());
1455 XXExecuteDefaultAction(&f);
1456 gSystem->ChangeDirectory(savdir.Data());
1458 else if (IsTextFile(fullpath.Data())) {
1459 gSystem->ChangeDirectory(dirname.Data());
1461 TGFrameElement *fe = 0;
1462 TGTab *tabRight = fNewBrowser->GetTabRight();
1463 TGCompositeFrame *frame = tabRight->GetCurrentContainer();
1465 fe = (TGFrameElement *)frame->GetList()->First();
1467 TGCompositeFrame *embed = (TGCompositeFrame *)fe->fFrame;
1468 TString fullname = f.GetTitle();
1469 fullname.ReplaceAll(
"\\",
"\\\\");
1470 if (embed->InheritsFrom(
"TGTextEditor")) {
1471 gROOT->ProcessLine(TString::Format(
"((TGTextEditor *)0x%lx)->LoadFile(\"%s\");",
1472 (ULong_t)embed, fullname.Data()));
1474 else if (embed->InheritsFrom(
"TGTextEdit")) {
1475 gROOT->ProcessLine(TString::Format(
"((TGTextEdit *)0x%lx)->LoadFile(\"%s\");",
1476 (ULong_t)embed, fullname.Data()));
1479 XXExecuteDefaultAction(&f);
1483 XXExecuteDefaultAction(&f);
1486 gSystem->ChangeDirectory(savdir.Data());
1489 gSystem->ChangeDirectory(dirname.Data());
1490 XXExecuteDefaultAction(&f);
1491 gSystem->ChangeDirectory(savdir.Data());
1495 fListTree->ClearViewPort();
1502 Long_t TGFileBrowser::XXExecuteDefaultAction(TObject *obj)
1506 TString ext = obj->GetName();
1507 if (fBrowser) fBrowser->SetDrawOption(GetDrawOption());
1509 if (gClient->GetMimeTypeList()->GetAction(obj->GetName(), action)) {
1511 act.ReplaceAll(
"%s", obj->GetName());
1512 gInterpreter->SaveGlobalsContext();
1514 if (act[0] ==
'!') {
1516 gSystem->Exec(act.Data());
1520 if (obj->InheritsFrom(
"TRemoteObject"))
1521 gApplication->SetBit(TApplication::kProcessRemotely);
1523 const Long_t res = gApplication->ProcessLine(act.Data());
1525 if (act.Contains(
".x") || act.Contains(
".X")) {
1526 if (gPad) gPad->Update();
1538 char *TGFileBrowser::FormatFileInfo(
const char *fname, Long64_t size, Long_t modtime)
1540 Long64_t fsize, bsize;
1541 TString infos = fname;
1544 fsize = bsize = size;
1549 infos += TString::Format(
"Size: %lld.%lldM", fsize/1024, (fsize%1024)/103);
1551 infos += TString::Format(
"Size: %lld.%lldK", bsize/1024, (bsize%1024)/103);
1554 infos += TString::Format(
"Size: %lld", bsize);
1557 time_t loctime = (time_t) modtime;
1558 newtime = localtime(&loctime);
1561 infos += TString::Format(
"%d-%02d-%02d %02d:%02d",
1562 newtime->tm_year + 1900,
1563 newtime->tm_mon+1, newtime->tm_mday,
1564 newtime->tm_hour, newtime->tm_min);
1566 return StrDup(infos.Data());
1573 void TGFileBrowser::GetObjPicture(
const TGPicture **pic, TObject *obj)
1575 const char *clname = 0;
1576 TClass *objClass = 0;
1577 static TImage *im = 0;
1579 im = TImage::Create();
1582 if (obj->IsA() == TClass::Class()) {
1583 objClass = obj->IsA();
1585 clname = objClass->GetName();
1587 else if (obj->InheritsFrom(
"TKey")) {
1588 clname = ((TKey *)obj)->GetClassName();
1590 else if (obj->InheritsFrom(
"TKeyMapFile")) {
1591 clname = ((TKeyMapFile *)obj)->GetTitle();
1593 else if (obj->InheritsFrom(
"TRemoteObject")) {
1595 TRemoteObject *robj = (TRemoteObject *)obj;
1596 if (!strcmp(robj->GetClassName(),
"TKey"))
1597 clname = robj->GetKeyClassName();
1599 clname = robj->GetClassName();
1602 objClass = obj->IsA();
1604 clname = objClass->GetName();
1609 const char *name = obj->GetIconName() ? obj->GetIconName() : clname;
1610 TString xpm_magic(name, 3);
1611 Bool_t xpm = xpm_magic ==
"/* ";
1612 const char *iconname = xpm ? obj->GetName() : name;
1614 if (obj->IsA()->InheritsFrom(
"TGeoVolume")) {
1615 iconname = obj->GetIconName() ? obj->GetIconName() : obj->IsA()->GetName();
1618 if (fCachedPicName == iconname) {
1622 *pic = gClient->GetMimeTypeList()->GetIcon(iconname, kTRUE);
1623 if (!(*pic) && xpm) {
1624 if (im && im->SetImageBuffer((
char**)&name, TImage::kXpm)) {
1625 im->Scale(im->GetWidth()/4, im->GetHeight()/4);
1626 *pic = gClient->GetPicturePool()->GetPicture(iconname, im->GetPixmap(),
1629 gClient->GetMimeTypeList()->AddType(
"[thumbnail]", iconname, iconname, iconname,
"->Browse()");
1632 if (fCachedPic && (fCachedPic != fFileIcon))
1633 fClient->FreePicture(fCachedPic);
1635 if (!obj->IsFolder())
1639 fCachedPicName = iconname;
1645 void TGFileBrowser::GotoDir(
const char *path)
1647 TGListTreeItem *item, *itm;
1649 Long_t bsize, blocks, bfree;
1650 Bool_t expand = kTRUE;
1651 TString sPath(gSystem->UnixPathName(path));
1653 if (item == 0)
return;
1654 fListTree->OpenItem(item);
1655 TObjArray *tokens = sPath.Tokenize(
"/");
1656 if (tokens->IsEmpty()) {
1657 fListTree->HighlightItem(item);
1658 DoubleClicked(item, 1);
1660 fListTree->ClearViewPort();
1661 fListTree->AdjustPosition(item);
1666 TString str = gEnv->GetValue(
"Browser.ExpandDirectories",
"yes");
1668 expand = (str ==
"yes") ? kTRUE : kFALSE;
1669 TString first = ((TObjString*)tokens->At(0))->GetName();
1675 if (!gSystem->GetFsInfo(path, (Long_t *)&
id, &bsize, &blocks, &bfree))
1676 if (
id == 0x5346414f ||
id == 0x6969 ||
id == 0x65735546 ||
id == 0xff534d42 ||
id == 0x517b)
1678 if (first.Length() == 2 && first.EndsWith(
":")) {
1679 TList *curvol = gSystem->GetVolumes(
"cur");
1681 TNamed *drive = (TNamed *)curvol->At(0);
1682 if (first == drive->GetName()) {
1683 TString infos = drive->GetTitle();
1684 if (infos.Contains(
"Network"))
1690 for (Int_t i = 0; i < tokens->GetEntriesFast(); ++i) {
1691 TString token = ((TObjString*)tokens->At(i))->GetName();
1692 if (token.Length() == 2 && token.EndsWith(
":")) {
1694 itm = fListTree->FindChildByName(0, token);
1697 fListTree->OpenItem(item);
1699 DoubleClicked(item, 1);
1703 itm = fListTree->FindChildByName(item, token);
1706 fListTree->OpenItem(item);
1708 DoubleClicked(item, 1);
1711 itm = fListTree->AddItem(item, token);
1713 fListTree->OpenItem(item);
1715 DoubleClicked(item, 1);
1718 fListTree->HighlightItem(item);
1719 DoubleClicked(item, 1);
1721 fListTree->ClearViewPort();
1722 fListTree->AdjustPosition(item);
1730 void TGFileBrowser::PadModified()
1732 if (fDblClick && fNewBrowser) {
1734 TGTab *tabRight = fNewBrowser->GetTabRight();
1735 for (i=0;i<tabRight->GetNumberOfTabs();++i) {
1736 TGFrameElement *fe = 0;
1737 TGCompositeFrame *embed = 0;
1738 TGCompositeFrame *frame = tabRight->GetTabContainer(i);
1740 fe = (TGFrameElement *)frame->GetList()->First();
1742 embed = (TGCompositeFrame *)fe->fFrame;
1743 if (embed && embed->InheritsFrom(
"TRootCanvas")) {
1744 ULong_t canvas = gROOT->ProcessLine(TString::Format(
"((TRootCanvas *)0x%lx)->Canvas();",
1746 if ((canvas) && (canvas == (ULong_t)gPad ||
1747 canvas == (ULong_t)gPad->GetCanvas())) {
1748 tabRight->SetTab(i, kTRUE);
1761 void TGFileBrowser::RequestFilter()
1767 snprintf(filter,
sizeof(filter),
"%s", fFilterStr.Data());
1768 new TGInputDialog(gClient->GetRoot(),
this,
1769 "Enter filter expression:\n(empty string \"\" or \"*\" to remove filter)",
1773 if ((filter[0] == 0) && (filter[1] == 0)) {
1774 CheckFiltered(fListLevel, kTRUE);
1777 else if (((filter[0] == 0) && (filter[1] == 1)) || !strcmp(filter,
"*")) {
1780 fFilterButton->SetState(kButtonUp);
1781 fFilteredItems.erase(fListLevel);
1786 fFilterStr = filter;
1787 fFilterButton->SetState(kButtonEngaged);
1789 if (CheckFiltered(fListLevel))
1790 fFilteredItems.erase(fListLevel);
1792 fFilteredItems.insert(std::make_pair(fListLevel, StrDup(filter)));
1795 fListTree->DeleteChildren(fListLevel);
1796 DoubleClicked(fListLevel, 1);
1797 fListTree->ClearViewPort();
1798 fListTree->AdjustPosition(fListLevel);
1804 void TGFileBrowser::Selected(
char *)
1806 TGListTreeItem *itm = fListTree->FindChildByData(0, gROOT->GetListOfFiles());
1808 fListTree->ClearHighlighted();
1810 fListTree->HighlightItem(fListLevel);
1811 fListTree->OpenItem(fListLevel);
1812 BrowseObj(gROOT->GetListOfFiles());
1813 fListTree->ClearViewPort();
1814 fListTree->AdjustPosition(fListLevel);
1821 void TGFileBrowser::ToggleSort()
1823 if (!fListLevel)
return;
1825 TGListTreeItem *item = fListLevel;
1826 if (!fListLevel->GetFirstChild()) {
1827 item = fListLevel->GetParent();
1828 itemname = StrDup(fListLevel->GetText());
1835 Bool_t is_sorted = CheckSorted(item);
1838 fListTree->SortChildren(item);
1839 fSortedItems.push_back(item);
1840 fSortButton->SetState(kButtonEngaged);
1843 fListTree->DeleteChildren(item);
1844 DoubleClicked(item, 1);
1845 fSortedItems.remove(item);
1846 fSortButton->SetState(kButtonUp);
1847 gClient->NeedRedraw(fListTree, kTRUE);
1848 gClient->HandleInput();
1850 TGListTreeItem *itm = fListTree->FindChildByName(item, itemname);
1852 fListTree->ClearHighlighted();
1853 Clicked(itm, 1, 0, 0);
1854 itm->SetActive(kTRUE);
1855 fListTree->SetSelected(itm);
1856 fListTree->HighlightItem(itm, kTRUE, kTRUE);
1862 fListTree->ClearViewPort();
1863 fListTree->AdjustPosition(fListLevel);