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;
47 /**************************************************************************/
49 RGTopFrame::RGTopFrame(const TGWindow *p, UInt_t w, UInt_t h, LookType_e look) :
65 fResetCameras (kFALSE),
66 fTimerActive (kFALSE),
73 fRedrawTimer.Connect("Timeout()", "Reve::RGTopFrame", this, "DoRedraw3D()");
74 fMacroFolder = new TFolder("EVE", "Visualization macros");
75 gROOT->GetListOfBrowsables()->Add(fMacroFolder);
77 fClient->GetMimeTypeList()->AddType("root/tmacro", "Reve::RMacro",
78 "tmacro_s.xpm", "tmacro_t.xpm", "");
82 TGLayoutHints *lay0 = new TGLayoutHints(kLHintsCenterX | kLHintsCenterY | kLHintsExpandY | kLHintsExpandX);
83 TGLayoutHints *lay1 = new TGLayoutHints(kLHintsCenterX | kLHintsCenterY | kLHintsExpandY | kLHintsExpandX, 2, 0, 2, 2);
84 TGLayoutHints *lay2 = new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX | kLHintsExpandY, 2, 2, 2, 2);
86 TGCompositeFrame* mainFrame = new TGCompositeFrame(this, w, h, kHorizontalFrame | kRaisedFrame);
87 TGVerticalFrame* fV2 = new TGVerticalFrame(mainFrame, GetWidth()-40, GetHeight()-40, kSunkenFrame);
89 mainFrame->AddFrame(fV2, lay1);
91 TGTab* mainTab = new TGTab(fV2, GetWidth(), GetHeight());
94 TGCompositeFrame* tframe1 = mainTab->AddTab("Object Browser");
95 fBrowser = new RGBrowser(tframe1, w, h);
96 tframe1->AddFrame(fBrowser, lay2);
99 TGCompositeFrame* tframe2 = mainTab->AddTab("Tree Selections");
100 fSelector = new VSDSelector(fBrowser->GetListTree(), tframe2);
104 TGCompositeFrame* tframe3 = mainTab->AddTab("GLCanvas");
105 TRootEmbeddedCanvas* ecanvas3 = new TRootEmbeddedCanvas("GLCanvas", tframe3, 580, 360);
106 tframe3->AddFrame(ecanvas3, lay2);
107 fGLCanvas = ecanvas3->GetCanvas();
108 fGLCanvas->SetEditable(kFALSE);
111 fV2->AddFrame(mainTab, lay0);
112 AddFrame(mainFrame, lay0);
115 Int_t parts[] = {45, 45, 10};
116 fStatusBar = new TGStatusBar(this, 50, 10, kHorizontalFrame);
117 fStatusBar->SetParts(parts, 3);
118 TGLayoutHints* lay6 = new TGLayoutHints(kLHintsBottom| kLHintsExpandX, 0, 0, 0, 0);
119 AddFrame(fStatusBar, lay6);
120 fStatusBar->SetText("GUI created", 0);
124 /**************************************************************************/
125 /**************************************************************************/
129 fBrowser->SetupClassicLook(fEditor, fGLCanvas);
130 fGLCanvas->GetViewer3D("ogl");
135 fBrowser->SetupEditorLook(fEditor, fGLCanvas);
136 fGLCanvas->GetViewer3D("ogl");
141 fBrowser->SetupGLViewerLook(fEditor, fGLCanvas);
146 printf("RGTopFrame unknown look-type, ignoring.\n");
151 TGLViewer* glv = dynamic_cast<TGLViewer*>(fGLCanvas->GetViewer3D());
153 glv->SetSmartRefresh(kTRUE);
154 glv->SetResetCamerasOnUpdate(kFALSE);
155 glv->SetResetCameraOnDoubleClick(kFALSE);
158 /**************************************************************************/
159 /**************************************************************************/
161 fGlobalStore = new RenderElementList("Geometry", "");
162 fGlobalStore->SetDenyDestroy(kTRUE);
163 TGListTreeItem* glti = fGlobalStore->AddIntoListTree(GetListTree(), (TGListTreeItem*)0);
164 GetListTree()->OpenItem(glti);
165 DrawRenderElement(fGlobalStore);
167 Resize(GetDefaultSize()); // this is used here to init layout algorithm
168 SetWindowName("Reve");
171 fEditor->DisplayObject(0);
173 gSystem->ProcessEvents();
176 /**************************************************************************/
178 TGListTree* RGTopFrame::GetListTree() const
180 return fBrowser->GetListTree();
183 /**************************************************************************/
185 /**************************************************************************/
187 TMacro* RGTopFrame::GetMacro(const Text_t* name) const
189 return dynamic_cast<TMacro*>(fMacroFolder->FindObject(name));
192 /**************************************************************************/
194 /**************************************************************************/
196 void RGTopFrame::EditRenderElement(RenderElement* rnr_element)
198 static const Exc_t eH("RGTopFrame::EditRenderElement ");
200 fEditor->DisplayRenderElement(rnr_element);
203 /**************************************************************************/
205 /**************************************************************************/
207 void RGTopFrame::RegisterRedraw3D()
209 fRedrawTimer.Start(0, kTRUE);
213 void RGTopFrame::DoRedraw3D()
215 // printf("RGTopFrame::DoRedraw3D redraw triggered\n");
217 fGLCanvas->GetViewer3D()->ResetCamerasAfterNextUpdate();
218 fResetCameras = kFALSE;
221 fGLCanvas->Modified();
223 fTimerActive = kFALSE;
226 /**************************************************************************/
228 int RGTopFrame::SpawnGuiAndRun(int argc, char **argv)
230 LookType_e revemode = LT_Editor;
233 if(argc >= 3 && (strcmp(argv[1], "-revemode")==0 || strcmp(argv[1], "-mode")==0)) {
234 LookType_e m = LookType_e(atoi(argv[2]));
235 if(m >= LT_Classic && m <= LT_GLViewer)
237 printf("revemode = %d\n", revemode);
238 if(revemode == LT_GLViewer) {
243 TRint theApp("App", &argc, argv);
245 /* gReve = */ new RGTopFrame(gClient->GetRoot(), w, h, revemode);
251 catch(std::string exc) {
252 gReve->GetStatusBar()->SetText(exc.c_str());
253 fprintf(stderr, "Exception: %s\n", exc.c_str());
259 /**************************************************************************/
260 /**************************************************************************/
262 TGListTreeItem* RGTopFrame::AddEvent(EventBase* event)
264 fCurrentEvent = event;
265 fCurrentEvent->SetDenyDestroy(kTRUE);
266 TGListTreeItem* elti = event->AddIntoListTree(GetListTree(), (TGListTreeItem*)0);
267 GetListTree()->OpenItem(elti);
268 DrawRenderElement(event);
272 TGListTreeItem* RGTopFrame::AddRenderElement(RenderElement* rnr_element)
274 return AddRenderElement(fCurrentEvent, rnr_element);
277 TGListTreeItem* RGTopFrame::AddRenderElement(RenderElement* parent,
278 RenderElement* rnr_element)
280 static const Exc_t eH("RGTopFrame::AddRenderElement ");
282 // Here could route rnr-element to several browsers/pads.
284 RenderElementListBase* rel = dynamic_cast<RenderElementListBase*>(parent);
286 rel->AddElement(rnr_element);
288 TGListTreeItem* newitem =
289 rnr_element->AddIntoListTree(GetListTree(), parent);
294 TGListTreeItem* RGTopFrame::AddGlobalRenderElement(RenderElement* rnr_element)
296 return AddGlobalRenderElement(fGlobalStore, rnr_element);
299 TGListTreeItem* RGTopFrame::AddGlobalRenderElement(RenderElement* parent,
300 RenderElement* rnr_element)
302 static const Exc_t eH("RGTopFrame::AddGlobalRenderElement ");
304 // Here could route rnr-element to several browsers/pads.
306 RenderElementListBase* rel = dynamic_cast<RenderElementListBase*>(parent);
308 rel->AddElement(rnr_element);
310 TGListTreeItem* newitem =
311 rnr_element->AddIntoListTree(GetListTree(), parent);
316 /**************************************************************************/
318 void RGTopFrame::RemoveRenderElement(RenderElement* parent,
319 RenderElement* rnr_element)
321 rnr_element->RemoveFromListTree(GetListTree());
323 RenderElementListBase* rel = dynamic_cast<RenderElementListBase*>(parent);
325 rel->RemoveElement(rnr_element);
328 /**************************************************************************/
330 void RGTopFrame::DrawRenderElement(RenderElement* rnr_element, TVirtualPad* pad)
332 if(pad == 0) pad = fGLCanvas;
334 { Reve::PadHolder pHolder(false, pad);
335 if (pad == fGLCanvas) fGLCanvas->SetEditable(kTRUE);
336 rnr_element->GetObject()->Draw();
337 if (pad == fGLCanvas) fGLCanvas->SetEditable(kFALSE);
342 void RGTopFrame::UndrawRenderElement(RenderElement* rnr_element, TVirtualPad* pad)
344 if(pad == 0) pad = fGLCanvas;
345 { Reve::PadHolder pHolder(false, pad);
346 pad->GetListOfPrimitives()->Remove(rnr_element->GetObject());
351 /**************************************************************************/
353 void RGTopFrame::RenderElementChecked(TObject* obj, Bool_t state)
355 // Item's user-data is blindly casted into TObject.
356 // We recast it blindly back into the render element.
358 RenderElement* rnrEl = (RenderElement*) obj;
359 rnrEl->SetRnrElement(state);
363 /**************************************************************************/
365 void RGTopFrame::NotifyBrowser(TGListTreeItem* parent_lti)
367 TGListTree* l_tree = GetListTree();
369 l_tree->OpenItem(parent_lti);
370 gClient->NeedRedraw(l_tree);
373 void RGTopFrame::NotifyBrowser(RenderElement* parent)
375 TGListTreeItem* parent_lti = parent ? parent->FindListTreeItem(GetListTree()) : 0;
376 NotifyBrowser(parent_lti);
379 /**************************************************************************/
380 // GeoManager registration
381 /**************************************************************************/
383 TGeoManager* RGTopFrame::GetGeometry(const TString& filename)
385 static const Exc_t eH("RGTopFrame::GetGeometry ");
387 TString exp_filename = filename;
388 gSystem->ExpandPathName(exp_filename);
389 printf("%s loading: '%s' -> '%s'.\n", eH.Data(),
390 filename.Data(), exp_filename.Data());
392 std::map<TString, TGeoManager*>::iterator g = fGeometries.find(filename);
393 if(g != fGeometries.end()) {
396 if(gSystem->AccessPathName(exp_filename, kReadPermission))
397 throw(eH + "file '" + exp_filename + "' not readable.");
399 TGeoManager::Import(filename);
401 throw(eH + "GeoManager import failed.");
402 gGeoManager->GetTopVolume()->VisibleDaughters(1);
404 // Import colors exported by Gled, if they exist.
406 TFile f(exp_filename, "READ");
407 TObjArray* collist = (TObjArray*) f.Get("ColorList");
410 TSeqCollection* glist = gROOT->GetListOfColors();
412 glist->AddAll(collist);
416 fGeometries[filename] = gGeoManager;