2 #include "ReveManager.h"
5 #include "VSDSelector.h"
6 #include <Reve/PointSet.h>
7 #include <Reve/Track.h>
9 #include "TGFileBrowser.h"
12 #include <Riostream.h>
18 #include <TVirtualX.h>
21 #include <TApplication.h>
23 #include <TClassMenuItem.h>
28 #include <TGSplitter.h>
29 #include <TGStatusBar.h>
31 #include <TGPicture.h>
32 #include <TGToolBar.h>
34 #include <TGXYLayout.h>
35 #include <TGNumberEntry.h>
36 #include <KeySymbols.h>
38 #include <TGLSAViewer.h>
39 #include <TGLSAFrame.h>
42 #include <TGeoVolume.h>
47 //______________________________________________________________________
54 RGLTEFrame::RGLTEFrame(const Text_t* name, Int_t width, Int_t height) :
55 TGMainFrame(gClient->GetRoot(), width, height),
60 SetCleanup(kNoCleanup);
62 fFrame = new TGCompositeFrame(this, width, height, kVerticalFrame);
65 fLTFrame = new TGCompositeFrame(fFrame, width, 3*height/7, kVerticalFrame);
66 fLTCanvas = new TGCanvas(fLTFrame, 10, 10, kSunkenFrame | kDoubleBorder);
67 fListTree = new TGListTree(fLTCanvas->GetViewPort(), 10, 10, kHorizontalFrame);
68 fListTree->SetCanvas(fLTCanvas);
69 fListTree->Associate(fFrame);
70 fListTree->SetColorMode(TGListTree::EColorMarkupMode(TGListTree::kColorUnderline | TGListTree::kColorBox));
71 fListTree->SetAutoCheckBoxPic(kFALSE);
72 fLTCanvas->SetContainer(fListTree);
73 fLTFrame->AddFrame(fLTCanvas, new TGLayoutHints
74 (kLHintsNormal | kLHintsExpandX | kLHintsExpandY, 1, 1, 1, 1));
75 fFrame ->AddFrame(fLTFrame, new TGLayoutHints
76 (kLHintsNormal | kLHintsExpandX | kLHintsExpandY));
79 fSplitter = new TGHSplitter(fFrame);
80 fFrame->AddFrame(fSplitter, new TGLayoutHints(kLHintsTop | kLHintsExpandX, 1,1,2,2));
83 fFrame->SetEditDisabled(kEditEnable);
84 fFrame->SetEditable();
85 fEditor = new RGEditor(0, width, 4*height/7);
86 fEditor->SetGlobal(kFALSE);
87 fEditor->ChangeOptions(fEditor->GetOptions() | kFixedHeight);
88 fFrame->SetEditable(kEditDisable);
89 fFrame->SetEditable(kFALSE);
91 TGFrameElement *el = 0;
92 TIter next(fFrame->GetList());
93 while ((el = (TGFrameElement *) next())) {
94 if (el->fFrame == fEditor)
96 el->fLayout->SetLayoutHints(kLHintsTop | kLHintsExpandX);
97 el->fLayout->SetPadLeft(0); el->fLayout->SetPadRight(1);
98 el->fLayout->SetPadTop(2); el->fLayout->SetPadBottom(1);
103 fSplitter->SetFrame(fEditor, kFALSE);
105 AddFrame(fFrame, new TGLayoutHints(kLHintsNormal | kLHintsExpandX | kLHintsExpandY));
107 fCtxMenu = new TContextMenu("", "");
109 fListTree->Connect("Checked(TObject*,Bool_t)", "Reve::RGLTEFrame",
110 this, "ItemChecked(TObject*, Bool_t)");
111 fListTree->Connect("Clicked(TGListTreeItem*, Int_t, Int_t, Int_t)", "Reve::RGLTEFrame",
112 this, "ItemClicked(TGListTreeItem*, Int_t, Int_t, Int_t)");
113 fListTree->Connect("DoubleClicked(TGListTreeItem*, Int_t)", "Reve::RGLTEFrame",
114 this, "ItemDblClicked(TGListTreeItem*, Int_t)");
115 fListTree->Connect("KeyPressed(TGListTreeItem*, ULong_t, ULong_t)", "Reve::RGLTEFrame",
116 this, "ItemKeyPress(TGListTreeItem*, UInt_t, UInt_t)");
123 RGLTEFrame::~RGLTEFrame()
127 // Should un-register editor, all items and list-tree from gReve ... eventually.
137 /**************************************************************************/
139 void RGLTEFrame::ReconfToHorizontal()
143 fFrame->ChangeOptions(kHorizontalFrame);
144 fLTFrame->ChangeOptions(kHorizontalFrame);
145 fListTree->ChangeOptions(kVerticalFrame);
147 TGFrameElement *el = 0;
148 TIter next(fFrame->GetList());
149 while ((el = (TGFrameElement *) next()))
151 if (el->fFrame == fSplitter)
154 el->fFrame = fSplitter = new TGVSplitter(fFrame);
155 el->fLayout->SetLayoutHints(kLHintsLeft | kLHintsExpandY);
156 el->fLayout->SetPadLeft(2); el->fLayout->SetPadRight (2);
157 el->fLayout->SetPadTop (1); el->fLayout->SetPadBottom(1);
159 else if (el->fFrame == fEditor)
161 fEditor->ChangeOptions(fEditor->GetOptions() & (~kFixedHeight));
162 fEditor->ChangeOptions(fEditor->GetOptions() | kFixedWidth);
163 el->fLayout->SetLayoutHints(kLHintsLeft | kLHintsExpandY);
167 fEditor->Resize(fEditor->GetWidth() / 2 - 1, fEditor->GetHeight());
168 fSplitter->SetFrame(fEditor, kFALSE);
172 //fLTFrame->Layout();
173 //fLTCanvas->Layout();
174 //fListTree->ClearViewPort();
179 void RGLTEFrame::ReconfToVertical()
183 fFrame->ChangeOptions(kVerticalFrame);
184 fLTFrame->ChangeOptions(kVerticalFrame);
185 fListTree->ChangeOptions(kHorizontalFrame);
187 TGFrameElement *el = 0;
188 TIter next(fFrame->GetList());
189 while ((el = (TGFrameElement *) next()))
191 if (el->fFrame == fSplitter)
194 el->fFrame = fSplitter = new TGHSplitter(fFrame);
195 el->fLayout->SetLayoutHints(kLHintsTop | kLHintsExpandX);
196 el->fLayout->SetPadLeft(2); el->fLayout->SetPadRight (2);
197 el->fLayout->SetPadTop (1); el->fLayout->SetPadBottom(1);
199 else if (el->fFrame == fEditor)
201 fEditor->ChangeOptions(fEditor->GetOptions() & (~kFixedWidth));
202 fEditor->ChangeOptions(fEditor->GetOptions() | kFixedHeight);
203 el->fLayout->SetLayoutHints(kLHintsTop | kLHintsExpandX);
207 fEditor->Resize(fEditor->GetWidth(), fEditor->GetHeight() / 2 - 1);
208 fSplitter->SetFrame(fEditor, kFALSE);
212 //fLTFrame->Layout();
213 //fLTCanvas->Layout();
214 //fListTree->ClearViewPort();
219 /**************************************************************************/
221 void RGLTEFrame::ItemChecked(TObject* obj, Bool_t state)
223 // Item's user-data is blindly casted into TObject.
224 // We recast it blindly back into the render element.
226 RenderElement* rnrEl = (RenderElement*) obj;
227 gReve->RenderElementChecked(rnrEl, state);
231 void RGLTEFrame::ItemClicked(TGListTreeItem *item, Int_t btn, Int_t x, Int_t y)
233 //printf("ItemClicked item %s List %d btn=%d, x=%d, y=%d\n",
234 // item->GetText(),fDisplayFrame->GetList()->GetEntries(), btn, x, y);
236 RenderElement* re = (RenderElement*)item->GetUserData();
238 TObject* obj = re->GetObject();
243 gReve->RenderElementSelect(re);
247 if (gReve->RenderElementPaste(re))
252 // If control pressed, show menu for render-element itself.
253 // event->fState & kKeyControlMask
254 // ??? how do i get current event?
255 if (obj) fCtxMenu->Popup(x, y, obj);
263 void RGLTEFrame::ItemDblClicked(TGListTreeItem* item, Int_t btn)
265 if (btn != 1) return;
267 RenderElement* re = (RenderElement*) item->GetUserData();
270 re->ExpandIntoListTree(fListTree, item);
272 TObject* obj = re->GetObject();
276 if (obj->IsA()->InheritsFrom(TGeoNode::Class()))
278 TGeoNode* n = dynamic_cast<TGeoNode*>(obj);
279 if (item->GetFirstChild() == 0 && n->GetNdaughters())
281 fListTree->DeleteChildren(item);
282 for (Int_t i=0; i< n->GetNdaughters(); i++)
285 title.Form("%d : %s[%d]", i,
286 n->GetDaughter(i)->GetVolume()->GetName(),
287 n->GetDaughter(i)->GetNdaughters());
289 TGListTreeItem* child = fListTree->AddItem( item, title.Data());
290 child->SetUserData(n->GetDaughter(i));
297 void RGLTEFrame::ItemKeyPress(TGListTreeItem *entry, UInt_t keysym, UInt_t /*mask*/)
299 static const Exc_t eH("RGLTEFrame::ItemKeyPress ");
301 // replace entry with selected!
302 entry = fListTree->GetSelected();
303 if (entry == 0) return;
305 if (keysym == kKey_Delete)
307 RenderElement* rnr_el = dynamic_cast<RenderElement*>
308 ((RenderElement*) entry->GetUserData());
312 if (entry->GetParent())
314 if (rnr_el->GetDenyDestroy() > 0 && rnr_el->GetNItems() == 1)
315 throw(eH + "DestroyDenied set for this item.");
317 RenderElement* parent_re = dynamic_cast<RenderElement*>
318 ((RenderElement*) entry->GetParent()->GetUserData());
322 ResetSelectedTimer(entry);
323 gReve->RemoveRenderElement(rnr_el, parent_re);
329 if (rnr_el->GetDenyDestroy() > 0)
330 throw(eH + "DestroyDenied set for this top-level item.");
331 ResetSelectedTimer(entry);
332 gReve->RemoveFromListTree(rnr_el, fListTree, entry);
338 void RGLTEFrame::ResetSelectedTimer(TGListTreeItem* lti)
340 fNewSelected = lti->GetPrevSibling();
341 if (! fNewSelected) {
342 fNewSelected = lti->GetNextSibling();
344 fNewSelected = lti->GetParent();
347 TTimer::SingleShot(0, IsA()->GetName(), this, "ResetSelected()");
350 void RGLTEFrame::ResetSelected()
352 fListTree->HighlightItem(fNewSelected);
353 fListTree->SetSelected(fNewSelected);
358 /**************************************************************************/
359 /**************************************************************************/
361 //______________________________________________________________________
368 void RGBrowser::SetupCintExport(TClass* cl)
370 TList* l = cl->GetMenuList();
371 TClassMenuItem* n = new TClassMenuItem(TClassMenuItem::kPopupUserFunction, cl,
372 "Export to CINT", "ExportToCINT", this, "const char*,TObject*", 1);
377 void RGBrowser::CalculateReparentXY(TGObject* parent, Int_t& x, Int_t& y)
381 gVirtualX->GetWindowSize(parent->GetId(), x, y, w, h);
382 gVirtualX->TranslateCoordinates(parent->GetId(),
383 gClient->GetDefaultRoot()->GetId(),
384 0, 0, x, y, childdum);
387 /**************************************************************************/
392 kNewViewer, kNewScene, kNewProjector,
393 kNewBrowser, kNewCanvas, kNewCanvasExt, kNewTextEditor, kNewHtmlBrowser,
398 RGBrowser::RGBrowser(UInt_t w, UInt_t h) :
399 TGNewBrowser("Reve Main Window", w, h, kFALSE),
402 // Construct Reve menu
404 fRevePopup = new TGPopupMenu(gClient->GetRoot());
405 fRevePopup->AddEntry("New &Viewer", kNewViewer);
406 fRevePopup->AddEntry("New &Scene", kNewScene);
407 fRevePopup->AddEntry("New &Projector", kNewProjector);
408 fRevePopup->AddSeparator();
409 fRevePopup->AddEntry("New &Browser", kNewBrowser);
410 fRevePopup->AddEntry("New &Canvas", kNewCanvas);
411 fRevePopup->AddEntry("New Canvas Ext", kNewCanvasExt);
412 fRevePopup->AddEntry("New Text Editor", kNewTextEditor);
413 // fRevePopup->AddEntry("New HTML Browser", kNewHtmlBrowser);
414 fRevePopup->AddSeparator();
415 fRevePopup->AddEntry("Vertical browser", kVerticalBrowser);
416 fRevePopup->CheckEntry(kVerticalBrowser);
418 fRevePopup->Connect("Activated(Int_t)", "Reve::RGBrowser",
419 this, "ReveMenu(Int_t)");
421 fMenuBar->RemovePopup("Framework");
422 // ?? should disconnect / delete.
423 fMenuBar->AddPopup("&Reve", fRevePopup, new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 0, 0));
425 fPreMenuFrame->ChangeOptions(fPreMenuFrame->GetOptions() | kRaisedFrame);
426 fTopMenuFrame->Layout();
427 fTopMenuFrame->MapSubwindows();
430 /**************************************************************************/
432 void RGBrowser::ReveMenu(Int_t id)
437 gReve->SpawnNewViewer("Viewer Pepe");
441 gReve->SpawnNewScene("Scena Mica");
444 case kNewProjector: {
445 RenderElement* pr = (RenderElement*) (gROOT->GetClass("Reve::NLTProjector")->New());
446 pr->SetRnrElNameTitle("Projector", "User-created projector.");
447 gReve->AddToListTree(pr, kTRUE);
451 gROOT->ProcessLineFast("new TBrowser");
456 gROOT->ProcessLineFast("new TCanvas");
458 SetTabTitle("Canvas", 1);
462 gROOT->ProcessLineFast("new TCanvas");
467 gROOT->ProcessLineFast(Form("new TGTextEditor((const char *)0, (const TGWindow *)0x%lx)", gClient->GetRoot()));
469 SetTabTitle("Editor", 1);
472 case kNewHtmlBrowser:
473 gSystem->Load("libGuiHtml");
474 if (gSystem->Load("libRHtml") >= 0)
477 gROOT->ProcessLine(Form("new TGHtmlBrowser(\"http://root.cern.ch/root/html/ClassIndex.html\", \
478 (const TGWindow *)0x%lx)", gClient->GetRoot()));
480 SetTabTitle("HTML", 1);
484 case kVerticalBrowser:
485 if (fRevePopup->IsEntryChecked(kVerticalBrowser)) {
486 gReve->GetLTEFrame()->ReconfToHorizontal();
487 fRevePopup->UnCheckEntry(kVerticalBrowser);
489 gReve->GetLTEFrame()->ReconfToVertical();
490 fRevePopup->CheckEntry(kVerticalBrowser);
499 /**************************************************************************/
501 void RGBrowser::InitPlugins()
503 // File browser plugin...
505 //gROOT->ProcessLine(Form("new TGFileBrowser((const TGWindow *)0x%lx, 200, 500)",
506 // gClient->GetRoot()));
508 TGFileBrowser *fb = MakeFileBrowser();
509 fb->BrowseObj(gROOT);
510 fb->AddFSDirectory("/");
516 SetTabTitle("Files", 0);
518 // Class browser plugin
521 gROOT->ProcessLine(Form("new TGClassBrowser((const TGWindow *)0x%lx, 200, 500)",
522 gClient->GetRoot()));
524 SetTabTitle("Classes", 0, 1);
532 gROOT->ProcessLineFast("new TCanvas");
534 SetTabTitle("Canvas", 1);
540 gROOT->ProcessLineFast(Form("new TGTextEditor((const char *)0, (const TGWindow *)0x%lx)",
541 gClient->GetRoot()));
543 SetTabTitle("Editor", 1);
550 gROOT->ProcessLineFast(Form("new TGCommandPlugin((const TGWindow *)0x%lx, 700, 300)",
551 gClient->GetRoot()));
553 SetTabTitle("Command", 2);
555 // --- Select first tab everywhere