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