1 #include "RGTopFrame.h"
6 #include <Reve/EventBase.h>
7 #include "VSDSelector.h"
11 #include <TGToolBar.h>
13 #include <TGTextEntry.h>
14 #include <TGSplitter.h>
15 #include <TRootEmbeddedCanvas.h>
16 #include <TGMimeTypes.h>
18 #include <TGLSAViewer.h>
31 #include <TVirtualX.h>
32 #include <TPolyLine3D.h>
33 #include <TPolyMarker3D.h>
36 #include <KeySymbols.h>
37 #include "TVirtualGL.h"
38 #include "TPluginManager.h"
45 Reve::RGTopFrame* gReve = 0;
55 const char *xpm_names[] = {
62 ToolBarData_t tb_data[] = {
63 { "", "Standard list layout", kFALSE, M_LAYOUT_1, NULL },
64 { "", "TParticle latout", kFALSE, M_LAYOUT_2, NULL },
65 { "", "TGeo layout", kFALSE, M_LAYOUT_3, NULL },
66 { NULL, NULL, 0, 0, NULL }
69 } // unnamed namespace
71 /**************************************************************************/
74 void RGTopFrame::Init()
85 fMacroFolder = new TFolder("EVE", "Visualization macros");
86 gROOT->GetListOfBrowsables()->Add(fMacroFolder);
88 fClient->GetMimeTypeList()->AddType("root/tmacro", "Reve::RMacro",
89 "tmacro_s.xpm", "tmacro_t.xpm", "");
97 fResetCameras = kFALSE;
98 fTimerActive = kFALSE;
99 fRedrawTimer.Connect("Timeout()", "Reve::RGTopFrame", this, "DoRedraw3D()");
103 RGTopFrame::RGTopFrame(const TGWindow *p, UInt_t w, UInt_t h, LookType_e look)
104 : TGMainFrame(p, w, h)
107 TGLayoutHints *fL0 = new TGLayoutHints(kLHintsCenterX |kLHintsCenterY | kLHintsExpandY| kLHintsExpandX);
108 TGLayoutHints *fL1 = new TGLayoutHints(kLHintsCenterX |kLHintsCenterY | kLHintsExpandY| kLHintsExpandX,2,0,2,2);
109 TGLayoutHints* fL2 = new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX | kLHintsExpandY,
111 TGCompositeFrame* fMainFrame = new TGCompositeFrame(this, w, h,kHorizontalFrame | kRaisedFrame);
112 fMainFrame->SetCleanup(kDeepCleanup);
113 TGVerticalFrame* fV2 = new TGVerticalFrame(fMainFrame, GetWidth()-40, GetHeight()-40, kSunkenFrame);
115 fMainFrame->AddFrame(fV2, fL1);
117 // ??? TGCanvas* fCanvasWindow = new TGCanvas(fV2,w,h);
118 TGTab* fDisplayFrame = new TGTab(fV2, GetWidth(), GetHeight());
121 TGCompositeFrame* tFrame1 = fDisplayFrame->AddTab("Object Browser");
122 fBrowser = new RGBrowser(tFrame1, w, h);
123 tFrame1->AddFrame(fBrowser, fL2);
125 // tree selection tab
126 TGCompositeFrame* tFrame2 = fDisplayFrame->AddTab("Tree Selections");
127 fSelector = new VSDSelector(fBrowser->GetListTree(), tFrame2);
131 TGCompositeFrame* tFrame3 = fDisplayFrame->AddTab("Canvas");
132 TRootEmbeddedCanvas* fEmbeddedCanvas3 = new TRootEmbeddedCanvas("fEmbeddedCanvas3", tFrame3, 580, 360);
133 tFrame3->AddFrame(fEmbeddedCanvas3, fL2);
134 fEmbeddedCanvas3->GetCanvas()->SetBorderMode(0);
135 fCC = fEmbeddedCanvas3->GetCanvas();
136 // fCC->SetFillColor(1);
140 TGCompositeFrame* frame4 = fDisplayFrame->AddTab("HistoCanvas");
141 TRootEmbeddedCanvas* ecanvas4 = new TRootEmbeddedCanvas("HistoCanvas", frame4, 580, 360);
142 frame4->AddFrame(ecanvas4, fL2);
143 fHistoCanvas = ecanvas4->GetCanvas();
144 fHistoCanvas->SetBorderMode(0);
146 fV2->AddFrame(fDisplayFrame, fL0);
147 AddFrame(fMainFrame, fL0);
150 Int_t parts[] = {45, 45, 10};
151 fStatusBar = new TGStatusBar(this, 50, 10, kHorizontalFrame);
152 fStatusBar->SetParts(parts, 3);
153 TGLayoutHints* fL6 = new TGLayoutHints(kLHintsBottom| kLHintsExpandX, 0, 0, 0, 0);
154 AddFrame(fStatusBar, fL6);
155 fStatusBar->SetText("GUI created", 0);
159 /**************************************************************************/
160 /**************************************************************************/
165 fBrowser->SetupClassicLook(fEditor, fCC);
166 fCC->GetViewer3D("ogl");
171 fBrowser->SetupEditorLook(fEditor, fCC);
172 fCC->GetViewer3D("ogl");
177 fBrowser->SetupGLViewerLook(fEditor, fCC);
182 printf("RGTopFrame unknown look-type, ignoring.\n");
187 TGLViewer* glv = dynamic_cast<TGLViewer*>(fCC->GetViewer3D());
189 glv->SetSmartRefresh(kTRUE);
190 glv->SetResetCamerasOnUpdate(kFALSE);
191 glv->SetResetCameraOnDoubleClick(kFALSE);
194 /**************************************************************************/
195 /**************************************************************************/
197 fGlobalStore = new RenderElementList("Geometry", "");
198 fGlobalStore->SetDenyDestroy(kTRUE);
199 TGListTreeItem* glti = fGlobalStore->AddIntoListTree(GetListTree(), (TGListTreeItem*)0);
200 GetListTree()->OpenItem(glti);
201 DrawRenderElement(fGlobalStore);
203 Resize(GetDefaultSize()); // this is used here to init layout algorithm
204 SetWindowName("Reve");
207 fEditor->DisplayObject(0);
209 gSystem->ProcessEvents();
212 /**************************************************************************/
214 TGListTree* RGTopFrame::GetListTree() const
216 return fBrowser->GetListTree();
219 /**************************************************************************/
221 /**************************************************************************/
223 TMacro* RGTopFrame::GetMacro(const Text_t* name) const
225 return dynamic_cast<TMacro*>(fMacroFolder->FindObject(name));
228 /**************************************************************************/
230 /**************************************************************************/
232 void RGTopFrame::EditRenderElement(RenderElement* rnr_element)
234 static const Exc_t eH("RGTopFrame::EditRenderElement ");
237 if(rnr_element) tobj = rnr_element->GetObject();
238 fEditor->DisplayObject(tobj);
241 /**************************************************************************/
243 /**************************************************************************/
245 void RGTopFrame::RegisterRedraw3D()
247 fRedrawTimer.Start(0, kTRUE);
251 void RGTopFrame::DoRedraw3D()
253 // printf("RGTopFrame::DoRedraw3D redraw triggered\n");
255 fCC->GetViewer3D()->ResetCamerasAfterNextUpdate();
256 fResetCameras = kFALSE;
260 fTimerActive = kFALSE;
263 /**************************************************************************/
265 int RGTopFrame::SpawnGuiAndRun(int argc, char **argv)
267 LookType_e revemode = LT_Editor;
270 if(argc >= 3 && (strcmp(argv[1], "-revemode")==0 || strcmp(argv[1], "-mode")==0)) {
271 LookType_e m = LookType_e(atoi(argv[2]));
272 if(m >= LT_Classic && m <= LT_GLViewer)
274 printf("revemode = %d\n", revemode);
275 if(revemode == LT_GLViewer) {
280 TRint theApp("App", &argc, argv);
282 /* gReve = */ new RGTopFrame(gClient->GetRoot(), w, h, revemode);
287 catch(std::string exc) {
288 gReve->GetStatusBar()->SetText(exc.c_str());
289 fprintf(stderr, "Exception: %s\n", exc.c_str());
295 /**************************************************************************/
296 /**************************************************************************/
298 TGListTreeItem* RGTopFrame::AddEvent(EventBase* event)
300 fCurrentEvent = event;
301 fCurrentEvent->SetDenyDestroy(kTRUE);
302 TGListTreeItem* elti = event->AddIntoListTree(GetListTree(), (TGListTreeItem*)0);
303 GetListTree()->OpenItem(elti);
304 DrawRenderElement(event);
308 TGListTreeItem* RGTopFrame::AddRenderElement(RenderElement* rnr_element)
310 return AddRenderElement(fCurrentEvent, rnr_element);
313 TGListTreeItem* RGTopFrame::AddRenderElement(RenderElement* parent,
314 RenderElement* rnr_element)
316 static const Exc_t eH("RGTopFrame::AddRenderElement ");
318 // Here could route rnr-element to several browsers/pads.
320 RenderElementListBase* rel = dynamic_cast<RenderElementListBase*>(parent);
322 rel->AddElement(rnr_element);
324 TGListTreeItem* newitem =
325 rnr_element->AddIntoListTree(GetListTree(), parent);
330 TGListTreeItem* RGTopFrame::AddGlobalRenderElement(RenderElement* rnr_element)
332 return AddGlobalRenderElement(fGlobalStore, rnr_element);
335 TGListTreeItem* RGTopFrame::AddGlobalRenderElement(RenderElement* parent,
336 RenderElement* rnr_element)
338 static const Exc_t eH("RGTopFrame::AddGlobalRenderElement ");
340 // Here could route rnr-element to several browsers/pads.
342 RenderElementListBase* rel = dynamic_cast<RenderElementListBase*>(parent);
344 rel->AddElement(rnr_element);
346 TGListTreeItem* newitem =
347 rnr_element->AddIntoListTree(GetListTree(), parent);
352 /**************************************************************************/
354 void RGTopFrame::RemoveRenderElement(RenderElement* parent,
355 RenderElement* rnr_element)
357 rnr_element->RemoveFromListTree(GetListTree());
359 RenderElementListBase* rel = dynamic_cast<RenderElementListBase*>(parent);
361 rel->RemoveElement(rnr_element);
364 /**************************************************************************/
366 void RGTopFrame::DrawRenderElement(RenderElement* rnr_element, TVirtualPad* pad)
368 if(pad == 0) pad = GetCC();
369 { Reve::PadHolder pHolder(false, pad);
370 rnr_element->GetObject()->Draw();
375 void RGTopFrame::UndrawRenderElement(RenderElement* rnr_element, TVirtualPad* pad)
377 if(pad == 0) pad = GetCC();
378 { Reve::PadHolder pHolder(false, pad);
379 pad->GetListOfPrimitives()->Remove(rnr_element->GetObject());
384 /**************************************************************************/
386 void RGTopFrame::RenderElementChecked(TObject* obj, Bool_t state)
388 // Item's user-data is blindly casted into TObject.
389 // We recast it blindly back into the render element.
391 RenderElement* rnrEl = (RenderElement*) obj;
392 rnrEl->SetRnrElement(state);
395 /**************************************************************************/
397 void RGTopFrame::NotifyBrowser(TGListTreeItem* parent_lti)
399 TGListTree* l_tree = GetListTree();
401 l_tree->OpenItem(parent_lti);
402 gClient->NeedRedraw(l_tree);
405 void RGTopFrame::NotifyBrowser(RenderElement* parent)
407 TGListTreeItem* parent_lti = parent ? parent->FindListTreeItem(GetListTree()) : 0;
408 NotifyBrowser(parent_lti);
411 /**************************************************************************/
412 // GeoManager registration
413 /**************************************************************************/
415 TGeoManager* RGTopFrame::GetGeometry(const TString& filename)
417 static const Exc_t eH("RGTopFrame::GetGeometry ");
419 TString exp_filename = filename;
420 gSystem->ExpandPathName(exp_filename);
421 printf("%s loading: '%s' -> '%s'.\n", eH.Data(),
422 filename.Data(), exp_filename.Data());
424 std::map<TString, TGeoManager*>::iterator g = fGeometries.find(filename);
425 if(g != fGeometries.end()) {
428 if(gSystem->AccessPathName(exp_filename, kReadPermission))
429 throw(eH + "file '" + exp_filename + "' not readable.");
431 TGeoManager::Import(filename);
433 throw(eH + "GeoManager import failed.");
434 gGeoManager->GetTopVolume()->VisibleDaughters(1);
436 // Import colors exported by Gled, if they exist.
438 TFile f(exp_filename, "READ");
439 TObjArray* collist = (TObjArray*) f.Get("ColorList");
442 TSeqCollection* glist = gROOT->GetListOfColors();
444 glist->AddAll(collist);
448 fGeometries[filename] = gGeoManager;