]> git.uio.no Git - u/mrichter/AliRoot.git/blame - EVE/Reve/ReveManager.cxx
Dummy methods DefineParticle required by the interface added.
[u/mrichter/AliRoot.git] / EVE / Reve / ReveManager.cxx
CommitLineData
32e219c2 1#include "ReveManager.h"
2
3#include <Reve/Viewer.h>
4#include <Reve/Scene.h>
5#include <Reve/Pad.h>
6#include <Reve/EventBase.h>
7
8#include <Reve/RGBrowser.h>
9#include <Reve/RGEditor.h>
10
11#include <TGMenu.h>
12#include <TGTab.h>
13#include <TGToolBar.h>
14#include <TGLabel.h>
15#include <TGTextEntry.h>
16#include <TGSplitter.h>
17#include <TRootEmbeddedCanvas.h>
18
19#include <TGStatusBar.h>
20
21#include <TGLSAViewer.h>
22
23#include <TROOT.h>
24#include <TFile.h>
25#include <TMacro.h>
26#include <TFolder.h>
27#include <TStyle.h>
28#include <TBrowser.h>
29#include <TPad.h>
30#include <TCanvas.h>
31#include <TSystem.h>
32#include <TRint.h>
33#include <TVirtualX.h>
34#include <TEnv.h>
35#include <TStyle.h>
36#include <TColor.h>
37#include <TGeoShape.h>
38#include <KeySymbols.h>
39#include "TVirtualGL.h"
40#include "TPluginManager.h"
41
42#include <iostream>
43
44using namespace Reve;
45using namespace Reve;
46
47Reve::ReveManager* gReve = 0;
48
49/**************************************************************************/
50
51ReveManager::ReveManager(UInt_t w, UInt_t h) :
52 fBrowser (0),
53 fEditor (0),
54 fStatusBar (0),
55
56 fMacroFolder (0),
57
58 fViewers (0),
59 fScenes (0),
60 fViewer (0),
61 fGlobalScene (0),
62 fEventScene (0),
63 fCurrentEvent (0),
64
65 fRedrawDisabled (0),
66 fResetCameras (kFALSE),
67 fDropLogicals (kFALSE),
68 fKeepEmptyCont (kFALSE),
69 fTimerActive (kFALSE),
70 fRedrawTimer (),
71
72 fGeometries ()
73{
e9ef1a49 74 // Constructor.
75
32e219c2 76 static const Exc_t eH("ReveManager::ReveManager ");
77
78 if (gReve != 0)
79 throw(eH + "There can be only one!");
80
81 gReve = this;
82
83 fRedrawTimer.Connect("Timeout()", "Reve::ReveManager", this, "DoRedraw3D()");
84 fMacroFolder = new TFolder("EVE", "Visualization macros");
85 gROOT->GetListOfBrowsables()->Add(fMacroFolder);
86
87
88 // Build GUI
89 fBrowser = new RGBrowser(w, h);
90 fStatusBar = fBrowser->GetStatusBar();
91
92 // ListTreeEditor
93 fBrowser->StartEmbedding(0);
94 fLTEFrame = new RGLTEFrame("REVE");
95 fBrowser->StopEmbedding();
96 fBrowser->SetTabTitle("Reve", 0);
97 fEditor = fLTEFrame->fEditor;
98
99 // GL viewer
100 fBrowser->StartEmbedding(1);
101 TGLSAViewer* glv = new TGLSAViewer(gClient->GetRoot(), 0, fEditor);
102 //glv->GetFrame()->SetCleanup(kNoCleanup);
103 glv->ToggleEditObject();
104 fBrowser->StopEmbedding();
105 fBrowser->SetTabTitle("GLViewer", 1);
106
107 // Finalize it
108 fBrowser->InitPlugins();
109 fBrowser->MapWindow();
110
111 // --------------------------------
112
113 fViewers = new ViewerList("Viewers");
114 fViewers->IncDenyDestroy();
115 AddToListTree(fViewers, kTRUE);
116
117 fViewer = new Viewer("GL-One");
118 fViewer->SetGLViewer(glv);
119 fViewer->IncDenyDestroy();
120 AddRenderElement(fViewer, fViewers);
121
122 fScenes = new SceneList ("Scenes");
123 fScenes->IncDenyDestroy();
124 AddToListTree(fScenes, kTRUE);
125
126 fGlobalScene = new Scene("Geometry scene");
127 fGlobalScene->IncDenyDestroy();
128 AddRenderElement(fGlobalScene, fScenes);
129
130 fEventScene = new Scene("Event scene");
131 fEventScene->IncDenyDestroy();
132 AddRenderElement(fEventScene, fScenes);
133
134 fViewer->AddScene(fGlobalScene);
135 fViewer->AddScene(fEventScene);
136
137 /**************************************************************************/
138 /**************************************************************************/
139
140 fEditor->DisplayObject(GetGLViewer());
141
142 gSystem->ProcessEvents();
143}
144
145ReveManager::~ReveManager()
e9ef1a49 146{
147 // Destructor.
148}
32e219c2 149
150/**************************************************************************/
151
152TCanvas* ReveManager::AddCanvasTab(const char* name)
153{
e9ef1a49 154 // Add a new canvas tab.
155
32e219c2 156 fBrowser->StartEmbedding(1, -1);
157 TCanvas* c = new TCanvas;
158 fBrowser->StopEmbedding();
159 fBrowser->SetTabTitle(name, 1, -1);
160
161 return c;
162}
163
164TGWindow* ReveManager::GetMainWindow() const
165{
e9ef1a49 166 // Get the main window, i.e. the first created reve-browser.
167
32e219c2 168 return fBrowser;
169}
170
171TGLViewer* ReveManager::GetGLViewer() const
172{
e9ef1a49 173 // Get default TGLViewer.
174
32e219c2 175 return fViewer->GetGLViewer();
176}
177
e9ef1a49 178Viewer* ReveManager::SpawnNewViewer(const Text_t* name, const Text_t* title,
179 Bool_t embed)
32e219c2 180{
e9ef1a49 181 // Create a new GL viewer.
182
32e219c2 183 Viewer* v = new Viewer(name, title);
184
185 if (embed) fBrowser->StartEmbedding(1);
186 v->SpawnGLViewer(gClient->GetRoot(), embed ? fEditor : 0);
187 v->IncDenyDestroy();
188 if (embed) fBrowser->StopEmbedding(), fBrowser->SetTabTitle(name, 1);
189 AddRenderElement(v, fViewers);
190 return v;
191}
192
193Scene* ReveManager::SpawnNewScene(const Text_t* name, const Text_t* title)
194{
e9ef1a49 195 // Create a new scene.
196
32e219c2 197 Scene* s = new Scene(name, title);
198 AddRenderElement(s, fScenes);
199 return s;
200}
201
202/**************************************************************************/
203// Macro management
204/**************************************************************************/
205
206TMacro* ReveManager::GetMacro(const Text_t* name) const
207{
208 return dynamic_cast<TMacro*>(fMacroFolder->FindObject(name));
209}
210
211/**************************************************************************/
212// Editor
213/**************************************************************************/
214
215void ReveManager::EditRenderElement(RenderElement* rnr_element)
216{
217 static const Exc_t eH("ReveManager::EditRenderElement ");
218
219 fEditor->DisplayRenderElement(rnr_element);
220}
221
222/**************************************************************************/
223// 3D Pad management
224/**************************************************************************/
225
226void ReveManager::RegisterRedraw3D()
227{
e9ef1a49 228 // Register a request for 3D redraw.
229
32e219c2 230 fRedrawTimer.Start(0, kTRUE);
231 fTimerActive = true;
232}
233
234void ReveManager::DoRedraw3D()
235{
e9ef1a49 236 // Perform 3D redraw of scenes and viewers whose contents has
237 // changed.
238
32e219c2 239 // printf("ReveManager::DoRedraw3D redraw triggered\n");
240
241 fScenes ->RepaintChangedScenes();
242 fViewers->RepaintChangedViewers(fResetCameras, fDropLogicals);
243
244 fResetCameras = kFALSE;
245 fDropLogicals = kFALSE;
246
247 fTimerActive = kFALSE;
248}
249
250void ReveManager::FullRedraw3D(Bool_t resetCameras, Bool_t dropLogicals)
251{
e9ef1a49 252 // Perform 3D redraw of all scenes and viewers.
253
32e219c2 254 fScenes ->RepaintAllScenes();
255 fViewers->RepaintAllViewers(resetCameras, dropLogicals);
256}
257
258/**************************************************************************/
259
260void ReveManager::RenderElementChanged(RenderElement* rnr_element)
261{
262 std::list<RenderElement*> scenes;
263 rnr_element->CollectSceneParents(scenes);
264 ScenesChanged(scenes);
265}
266
267void ReveManager::ScenesChanged(std::list<RenderElement*>& scenes)
268{
269 for (RenderElement::List_i s=scenes.begin(); s!=scenes.end(); ++s)
270 ((Scene*)*s)->Changed();
271}
272
273/**************************************************************************/
274
275int ReveManager::SpawnGuiAndRun(int argc, char **argv)
276{
277 Int_t w = 1024;
278 Int_t h = 768;
279
280 TRint theApp("App", &argc, argv);
281
282 Reve::SetupGUI();
283 /* gReve = */ new ReveManager(w, h);
284
285 run_loop:
286 try {
287 theApp.Run();
288 }
289 catch(Exc_t& exc) {
290 gReve->SetStatusLine(exc.Data());
291 fprintf(stderr, "Exception: %s\n", exc.Data());
292 goto run_loop;
293 }
294 return 0;
295}
296
297void ReveManager::SpawnGui()
298{
299 Int_t w = 1024;
300 Int_t h = 768;
301
302 Reve::SetupGUI();
303 /* gReve = */ new ReveManager(w, h);
304}
305
306/**************************************************************************/
307/**************************************************************************/
308
309TGListTree* ReveManager::GetListTree() const
310{
311 return fLTEFrame->fListTree;
312}
313
314TGListTreeItem*
315ReveManager::AddToListTree(RenderElement* re, Bool_t open, TGListTree* lt)
316{
317 // Add rnr-el as a top-level to a list-tree.
318 // Please add a single copy of a render-element as a top level
319 // or we will have to check for that, too.
320
321 if (lt == 0) lt = GetListTree();
322 TGListTreeItem* lti = re->AddIntoListTree(lt, (TGListTreeItem*)0);
323 if (open) lt->OpenItem(lti);
324 return lti;
325}
326
327void ReveManager::RemoveFromListTree(RenderElement* re, TGListTree* lt, TGListTreeItem* lti)
328{
329 // Remove top-level rnr-el from list-tree with specified tree-item.
330
331 static const Exc_t eH("ReveManager::RemoveFromListTree ");
332
333 if (lti->GetParent())
334 throw(eH + "not a top-level item.");
335
336 re->RemoveFromListTree(lt, 0);
337}
338
339/**************************************************************************/
340
341TGListTreeItem* ReveManager::AddEvent(EventBase* event)
342{
343 fCurrentEvent = event;
344 fCurrentEvent->IncDenyDestroy();
345 AddRenderElement(fCurrentEvent, fEventScene);
346 return AddToListTree(event, kTRUE);
347}
348
349TGListTreeItem* ReveManager::AddRenderElement(RenderElement* rnr_element,
350 RenderElement* parent)
351{
32e219c2 352 if (parent == 0) {
353 if (fCurrentEvent == 0)
354 AddEvent(new EventBase("Event", "Auto-created event directory"));
355 parent = fCurrentEvent;
356 }
357
e9ef1a49 358 return parent->AddElement(rnr_element);
32e219c2 359}
360
361TGListTreeItem* ReveManager::AddGlobalRenderElement(RenderElement* rnr_element,
e9ef1a49 362 RenderElement* parent)
32e219c2 363{
32e219c2 364 if (parent == 0)
365 parent = fGlobalScene;
366
e9ef1a49 367 return parent->AddElement(rnr_element);
32e219c2 368}
369
370/**************************************************************************/
371
372void ReveManager::RemoveRenderElement(RenderElement* rnr_element,
373 RenderElement* parent)
374{
375 parent->RemoveElement(rnr_element);
376}
377
378void ReveManager::PreDeleteRenderElement(RenderElement* rnr_element)
379{
380 if (fEditor->GetRnrElement() == rnr_element)
381 fEditor->DisplayObject(0);
382}
383
384/**************************************************************************/
385
386void ReveManager::RenderElementSelect(RenderElement* rnr_element)
387{
388 EditRenderElement(rnr_element);
389}
390
391Bool_t ReveManager::RenderElementPaste(RenderElement* rnr_element)
392{
393 RenderElement* src = fEditor->GetRnrElement();
394 if (src)
395 return rnr_element->HandleElementPaste(src);
396 return kFALSE;
397}
398
399void ReveManager::RenderElementChecked(RenderElement* rnrEl, Bool_t state)
400{
401 rnrEl->SetRnrState(state);
402
e9ef1a49 403 if (fEditor->GetModel() == rnrEl->GetEditorObject())
32e219c2 404 fEditor->DisplayRenderElement(rnrEl);
32e219c2 405
406 rnrEl->ElementChanged();
407}
408
409/**************************************************************************/
410
411void ReveManager::NotifyBrowser(TGListTreeItem* parent_lti)
412{
413 TGListTree* lt = GetListTree();
e9ef1a49 414 if (parent_lti)
32e219c2 415 lt->OpenItem(parent_lti);
416 lt->ClearViewPort();
417}
418
419void ReveManager::NotifyBrowser(RenderElement* parent)
420{
421 TGListTreeItem* parent_lti = parent ? parent->FindListTreeItem(GetListTree()) : 0;
422 NotifyBrowser(parent_lti);
423}
424
425/**************************************************************************/
426// GeoManager registration
427/**************************************************************************/
428
429TGeoManager* ReveManager::GetGeometry(const TString& filename)
430{
431 static const Exc_t eH("ReveManager::GetGeometry ");
432
433 TString exp_filename = filename;
434 gSystem->ExpandPathName(exp_filename);
435 printf("%s loading: '%s' -> '%s'.\n", eH.Data(),
436 filename.Data(), exp_filename.Data());
437
438 std::map<TString, TGeoManager*>::iterator g = fGeometries.find(filename);
e9ef1a49 439 if (g != fGeometries.end()) {
32e219c2 440 return g->second;
441 } else {
e9ef1a49 442 if (gSystem->AccessPathName(exp_filename, kReadPermission))
32e219c2 443 throw(eH + "file '" + exp_filename + "' not readable.");
444 gGeoManager = 0;
445 TGeoManager::Import(filename);
e9ef1a49 446 if (gGeoManager == 0)
32e219c2 447 throw(eH + "GeoManager import failed.");
448 gGeoManager->GetTopVolume()->VisibleDaughters(1);
449
450 // Import colors exported by Gled, if they exist.
451 {
452 TFile f(exp_filename, "READ");
453 TObjArray* collist = (TObjArray*) f.Get("ColorList");
454 f.Close();
e9ef1a49 455 if (collist != 0) {
32e219c2 456 TIter next(gGeoManager->GetListOfVolumes());
457 TGeoVolume* vol;
458 while ((vol = (TGeoVolume*) next()) != 0)
459 {
460 Int_t oldID = vol->GetLineColor();
461 TColor* col = (TColor*)collist->At(oldID);
462 Float_t r, g, b;
463 col->GetRGB(r, g, b);
464 Int_t newID = TColor::GetColor(r,g,b);
465 vol->SetLineColor(newID);
466 }
467 }
468 }
469
470 fGeometries[filename] = gGeoManager;
471 return gGeoManager;
472 }
473}
474
475/**************************************************************************/
476// Testing exceptions
477/**************************************************************************/
478
479void ReveManager::SetStatusLine(const char* text)
480{
481 fStatusBar->SetText(text);
482}
483
484void ReveManager::ThrowException(const char* text)
485{
486 static const Exc_t eH("ReveManager::ThrowException ");
487
488 throw(eH + text);
489}