201d3ba3d10618ac1b5f49c4a417a799b782a8b7
[u/mrichter/AliRoot.git] / EVE / Reve / RGTopFrame.cxx
1 #include "RGTopFrame.h"
2
3 #include "RGBrowser.h"
4 #include "RGEditor.h"
5 #include "VSDSelector.h"
6
7 #include <Reve/RenderElement.h>
8
9 #include <TGMenu.h>
10 #include <TGTab.h>
11 #include <TGToolBar.h>
12 #include <TGLabel.h>
13 #include <TGTextEntry.h>
14 #include <TGSplitter.h>
15 #include <TRootEmbeddedCanvas.h>
16
17 #include <TGLSAViewer.h>
18 #include <TH1F.h>
19 #include <TView.h>
20
21 #include <TROOT.h>
22 #include <TFile.h>
23 #include <TStyle.h>
24 #include <TPad.h>
25 #include <TCanvas.h>
26 #include <TSystem.h>
27 #include <TRint.h>
28 #include <TVirtualX.h>
29 #include <TPolyLine3D.h>
30 #include <TPolyMarker3D.h>
31 #include <TEnv.h>
32 #include <TStyle.h>
33 #include <KeySymbols.h>
34 #include "TVirtualGL.h"
35 #include "TPluginManager.h"
36
37 #include <iostream>
38
39 using namespace Reve;
40 using namespace Reve;
41
42 Reve::RGTopFrame* gReve = 0;
43
44 namespace {
45
46 enum RGBrowserMT {
47   M_LAYOUT_1,
48   M_LAYOUT_2,
49   M_LAYOUT_3
50 };
51
52 const char *xpm_names[] = {
53     "lay1.xpm",
54     "lay2.xpm",
55     "lay3.xpm",
56     0
57 };
58
59 ToolBarData_t tb_data[] = {
60   { "", "Standard list layout",     kFALSE, M_LAYOUT_1,        NULL },
61   { "", "TParticle latout",         kFALSE, M_LAYOUT_2,        NULL },
62   { "", "TGeo layout",              kFALSE, M_LAYOUT_3,        NULL },
63   { NULL,            NULL,          0,      0,                 NULL }
64 };
65
66 } // unnamed namespace
67
68 /**************************************************************************/
69
70
71 void RGTopFrame::Init(){
72   fCC          = 0;
73   fHistoCanvas = 0;
74   fSelector    = 0;
75   fBrowser     = 0;
76   fStatusBar   = 0;
77   fVSDFile     = "";
78
79   fEditor = 0;
80
81   fCurrentEvent    = 0;
82   fCurrentEventLTI = 0;
83   fGeometryLTI     = 0;
84
85   fRedrawDisabled = false;
86   fTimerActive    = false;
87   fRedrawTimer.Connect("Timeout()", "Reve::RGTopFrame", this, "DoRedraw3D()");
88 }
89
90
91 RGTopFrame::RGTopFrame(const TGWindow *p, UInt_t w, UInt_t h, LookType_e look)
92   : TGMainFrame(p, w, h)
93 {
94   Init();
95   TGLayoutHints *fL0 = new TGLayoutHints(kLHintsCenterX |kLHintsCenterY | kLHintsExpandY|  kLHintsExpandX);
96   TGLayoutHints *fL1 = new TGLayoutHints(kLHintsCenterX |kLHintsCenterY | kLHintsExpandY|  kLHintsExpandX,2,0,2,2);
97   TGLayoutHints* fL2 = new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX | kLHintsExpandY,
98                                          2, 2, 2, 2);
99   TGCompositeFrame*  fMainFrame = new TGCompositeFrame(this, w, h,kHorizontalFrame | kRaisedFrame);
100   fMainFrame->SetCleanup(kDeepCleanup);
101   TGVerticalFrame* fV2 = new TGVerticalFrame(fMainFrame, GetWidth()-40, GetHeight()-40, kSunkenFrame);
102
103   fMainFrame->AddFrame(fV2, fL1);
104
105   // ??? TGCanvas* fCanvasWindow = new TGCanvas(fV2,w,h);
106   TGTab*    fDisplayFrame = new TGTab(fV2, GetWidth(), GetHeight());  
107
108   // browser tab
109   TGCompositeFrame* tFrame1 = fDisplayFrame->AddTab("Object Browser");
110   fBrowser = new RGBrowser(tFrame1, w, h);
111   tFrame1->AddFrame(fBrowser, fL2);
112
113   // tree selection tab
114   TGCompositeFrame* tFrame2 = fDisplayFrame->AddTab("Tree Selections");  
115   fSelector = new VSDSelector(fBrowser->GetListTree(), tFrame2);
116
117   // canvas
118   Reve::PushPad();
119   TGCompositeFrame* tFrame3 = fDisplayFrame->AddTab("Canvas");
120   TRootEmbeddedCanvas* fEmbeddedCanvas3 = new TRootEmbeddedCanvas("fEmbeddedCanvas3", tFrame3, 580, 360);
121   tFrame3->AddFrame(fEmbeddedCanvas3, fL2);
122   fEmbeddedCanvas3->GetCanvas()->SetBorderMode(0);
123   fCC = fEmbeddedCanvas3->GetCanvas();
124   // fCC->SetFillColor(1);
125
126   { // Workaround for empty scene.
127     TPolyMarker3D* bugmark = new TPolyMarker3D(8);
128     // bugmark->SetMarkerStyle(2);
129     // bugmark->SetMarkerColor(1);
130     const Float_t a = 10.0;
131     bugmark->SetPoint(0, a, a,a);
132     bugmark->SetPoint(1, a, -a,a);
133     bugmark->SetPoint(2, -a, -a,a);
134     bugmark->SetPoint(3, -a, a,a);
135
136     bugmark->SetPoint(4, a, a,-a);
137     bugmark->SetPoint(5, a, -a,-a);
138     bugmark->SetPoint(6, -a, a,-a);
139     bugmark->SetPoint(7, -a, -a,-a);
140     bugmark->Draw();
141   }
142
143   Reve::PopPad();
144
145
146   // histo canvas
147   TGCompositeFrame* frame4 = fDisplayFrame->AddTab("HistoCanvas");
148   TRootEmbeddedCanvas* ecanvas4 = new TRootEmbeddedCanvas("HistoCanvas", frame4, 580, 360);
149   frame4->AddFrame(ecanvas4, fL2);
150   fHistoCanvas =  ecanvas4->GetCanvas();
151   fHistoCanvas->SetBorderMode(0);
152
153
154   fV2->AddFrame(fDisplayFrame, fL0);
155   AddFrame(fMainFrame, fL0);
156    
157   // Create status bar
158   Int_t parts[] = {45, 45, 10};
159   fStatusBar = new TGStatusBar(this, 50, 10, kHorizontalFrame);
160   fStatusBar->SetParts(parts, 3);
161   TGLayoutHints* fL6 = new TGLayoutHints(kLHintsBottom| kLHintsExpandX, 0, 0, 0, 0);
162   AddFrame(fStatusBar, fL6);
163   fStatusBar->SetText("GUI created", 0);
164
165   MapSubwindows();
166
167   /**************************************************************************/
168   /**************************************************************************/
169   
170   fEditor = new RGEditor(fCC);
171   fEditor->GetCan()->ChangeOptions(0);
172
173   switch(look) {
174   case LT_Classic: {
175     fBrowser->SetupClassicLook();
176     // Need push/pop pad around here? Not.
177     fCC->GetViewer3D("ogl");
178     break;
179   }
180
181   case LT_Editor: {
182     fBrowser->SetupEditorLook(fEditor);
183     fCC->GetViewer3D("ogl");
184     break;
185   }
186
187   case LT_GLViewer: {
188     printf("LT_GLViewer this option currently somewhat broken!\n");
189     fBrowser->SetupGLViewerLook(fEditor, fCC);
190     printf("Crap1 %d %d\n", GetWidth(), GetHeight());
191     break;
192   }
193
194   default: {
195     printf("RGTopFrame unknown look-type, ignoring.\n");
196     break;
197   }
198   }
199
200   TGLViewer* glv = dynamic_cast<TGLViewer*>(fCC->GetViewer3D());
201   if(glv) {
202     glv->SetSmartRefresh(true);
203   }
204
205   /**************************************************************************/
206   /**************************************************************************/
207
208   fGeometryLTI = GetListTree()->AddItem(0, "Geometry");
209   GetListTree()->OpenItem(fGeometryLTI);
210
211   Resize(GetDefaultSize()); // this is used here to init layout algorithm
212   SetWindowName("Reve");
213   MapWindow();
214
215   fEditor->DisplayObject(0);
216
217   gSystem->ProcessEvents();
218 }
219
220 /**************************************************************************/
221
222 TGListTree* RGTopFrame::GetListTree()
223 {
224   return fBrowser->GetListTree();
225 }
226
227 TGListTreeItem* RGTopFrame::GetEventTreeItem()
228 {
229   // return fBrowser->GetListTree()->FindItemByPathname("Event");
230   return fCurrentEventLTI;
231 }
232
233 TGListTreeItem* RGTopFrame::GetGlobalTreeItem()
234 {
235   return fGeometryLTI;
236 }
237
238 /**************************************************************************/
239 // Editor
240 /**************************************************************************/
241
242 void RGTopFrame::EditRenderElement(RenderElement* rnr_element)
243 {
244   static const Exc_t eH("RGTopFrame::EditRenderElement ");
245
246   TObject* tobj = 0;
247   if(rnr_element) tobj = dynamic_cast<TObject*>(rnr_element);
248   fEditor->DisplayObject(tobj);
249 }
250
251 /**************************************************************************/
252 // 3D Pad management
253 /**************************************************************************/
254
255 void RGTopFrame::RegisterRedraw3D()
256 {
257   fRedrawTimer.Start(0, kTRUE);
258   fTimerActive = true;
259 }
260
261 void RGTopFrame::DoRedraw3D()
262 {
263   // printf("RGTopFrame::DoRedraw3D redraw triggered\n");
264   fCC->Modified();
265   fCC->Update();
266   fTimerActive = false;
267 }
268
269 /**************************************************************************/
270
271 int RGTopFrame::SpawnGuiAndRun(int argc, char **argv)
272 {
273   LookType_e revemode = LT_Editor;
274   if(argc >= 3 && strcmp(argv[1], "-revemode")==0) {
275     LookType_e m = LookType_e(atoi(argv[2]));
276     if(m >= LT_Classic && m <= LT_GLViewer)
277       revemode = m;
278     printf("revemode = %d\n", revemode);
279   }
280
281   TRint theApp("App", &argc, argv);
282   Int_t w = 800;
283   Int_t h = 600;
284
285   gReve = new RGTopFrame(gClient->GetRoot(), w, h, revemode);
286  run_loop:
287   try {
288     theApp.Run();
289   }
290   catch(std::string exc) {
291     gReve->GetStatusBar()->SetText(exc.c_str());
292     goto run_loop;
293   }
294   return 0;
295 }
296
297 /**************************************************************************/
298 /**************************************************************************/
299
300 TGListTreeItem* RGTopFrame::AddEvent(TObject* event)
301 {
302   fCurrentEvent    = event;
303   fCurrentEventLTI = GetListTree()->AddItem(0, event->GetName());
304   fCurrentEventLTI->SetUserData(event);
305   fCurrentEventLTI->SetTipText(event->GetTitle());
306   GetListTree()->OpenItem(fCurrentEventLTI);
307   return fCurrentEventLTI;
308 }
309
310 TGListTreeItem* RGTopFrame::AddRenderElement(RenderElement* rnr_element)
311 {
312   static const Exc_t eH("RGTopFrame::AddGlobalRenderElement ");
313
314   // Here could route rnr-element to several browsers/pads.
315
316   TGListTreeItem* newitem =
317     rnr_element->AddIntoListTree(GetListTree(), GetEventTreeItem());
318   NotifyBrowser();
319
320   return newitem;
321 }
322
323 TGListTreeItem* RGTopFrame::AddRenderElement(TGListTreeItem* parent,
324                                              RenderElement* rnr_element)
325 {
326   static const Exc_t eH("RGTopFrame::AddRenderElement ");
327
328   // Here could route rnr-element to several browsers/pads.
329
330   TGListTreeItem* newitem =
331     rnr_element->AddIntoListTree(GetListTree(), parent);
332   NotifyBrowser();
333
334   return newitem;
335 }
336
337 TGListTreeItem* RGTopFrame::AddGlobalRenderElement(RenderElement* rnr_element)
338 {
339   return AddGlobalRenderElement(GetEventTreeItem(), rnr_element);
340 }
341
342 TGListTreeItem* RGTopFrame::AddGlobalRenderElement(TGListTreeItem* ,
343                                                    RenderElement* rnr_element)
344 {
345   static const Exc_t eH("RGTopFrame::AddGlobalRenderElement ");
346
347   // Here could route rnr-element to several browsers/pads.
348
349   TGListTreeItem* newitem =
350     rnr_element->AddIntoListTree(GetListTree(), GetGlobalTreeItem());
351   NotifyBrowser();
352
353   return newitem;
354 }
355
356 /**************************************************************************/
357
358 void RGTopFrame::DrawRenderElement(RenderElement* rnr_element, TVirtualPad* pad)
359 {
360   if(pad == 0) pad = GetCC();
361   { Reve::PadHolder pHolder(false, pad);
362     rnr_element->GetObject()->Draw();
363   }
364   Redraw3D();
365 }
366
367 /**************************************************************************/
368
369 void RGTopFrame::RenderElementChecked(TObject* obj, Bool_t state)
370 {
371   RenderElement* rnr_element = dynamic_cast<RenderElement*>(obj);
372   // printf("Checked %p %p %d\n", obj, rnr_element, state);
373   if(rnr_element)
374     rnr_element->SetRnrElement(state);
375 }
376
377 /**************************************************************************/
378
379 void RGTopFrame::NotifyBrowser(TGListTreeItem* parent)
380 {
381   TGListTree* l_tree = GetListTree();
382   if(parent)
383     l_tree->OpenItem(parent);
384   l_tree->GetClient()->NeedRedraw(l_tree);
385 }
386
387 /**************************************************************************/
388 // GeoManager registration
389 /**************************************************************************/
390
391 TGeoManager* RGTopFrame::GetGeometry(const TString& filename)
392 {
393   static const Exc_t eH("RGTopFrame::GetGeometry ");
394
395   TString exp_filename = filename;
396   gSystem->ExpandPathName(exp_filename);
397   printf("%s loading: '%s' -> '%s'.\n", eH.Data(),
398          filename.Data(), exp_filename.Data());
399
400   std::map<TString, TGeoManager*>::iterator g = fGeometries.find(filename);
401   if(g != fGeometries.end()) {
402     return g->second;
403   } else {
404     if(gSystem->AccessPathName(exp_filename, kReadPermission))
405       throw(eH + "file '" + exp_filename + "' not readable.");
406     gGeoManager = 0;
407     TGeoManager::Import(filename); 
408     if(gGeoManager == 0)
409       throw(eH + "GeoManager import failed.");
410     gGeoManager->GetTopVolume()->VisibleDaughters(1);
411
412     // Import colors exported by Gled, if they exist.
413     {
414       TFile f(exp_filename, "READ");
415       TObjArray* collist = (TObjArray*) f.Get("ColorList");
416       f.Close();
417       if(collist != 0) {
418         TSeqCollection* glist = gROOT->GetListOfColors();
419         glist->Clear();
420         glist->AddAll(collist);
421       }
422     }
423
424     fGeometries[filename] = gGeoManager;
425     return gGeoManager;
426   }
427 }