1 #include "RGTopFrame.h"
5 #include "VSDSelector.h"
7 #include <Reve/RenderElement.h>
11 #include <TGToolBar.h>
13 #include <TGTextEntry.h>
14 #include <TGSplitter.h>
15 #include <TRootEmbeddedCanvas.h>
17 #include <TGLSAViewer.h>
28 #include <TVirtualX.h>
29 #include <TPolyLine3D.h>
30 #include <TPolyMarker3D.h>
33 #include <KeySymbols.h>
34 #include "TVirtualGL.h"
35 #include "TPluginManager.h"
42 Reve::RGTopFrame* gReve = 0;
52 const char *xpm_names[] = {
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 }
66 } // unnamed namespace
68 /**************************************************************************/
71 void RGTopFrame::Init(){
85 fRedrawDisabled = false;
87 fRedrawTimer.Connect("Timeout()", "Reve::RGTopFrame", this, "DoRedraw3D()");
91 RGTopFrame::RGTopFrame(const TGWindow *p, UInt_t w, UInt_t h, LookType_e look)
92 : TGMainFrame(p, w, h)
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,
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);
103 fMainFrame->AddFrame(fV2, fL1);
105 // ??? TGCanvas* fCanvasWindow = new TGCanvas(fV2,w,h);
106 TGTab* fDisplayFrame = new TGTab(fV2, GetWidth(), GetHeight());
109 TGCompositeFrame* tFrame1 = fDisplayFrame->AddTab("Object Browser");
110 fBrowser = new RGBrowser(tFrame1, w, h);
111 tFrame1->AddFrame(fBrowser, fL2);
113 // tree selection tab
114 TGCompositeFrame* tFrame2 = fDisplayFrame->AddTab("Tree Selections");
115 fSelector = new VSDSelector(fBrowser->GetListTree(), tFrame2);
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);
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);
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);
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);
154 fV2->AddFrame(fDisplayFrame, fL0);
155 AddFrame(fMainFrame, fL0);
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);
167 /**************************************************************************/
168 /**************************************************************************/
170 fEditor = new RGEditor(fCC);
171 fEditor->GetCan()->ChangeOptions(0);
175 fBrowser->SetupClassicLook();
176 // Need push/pop pad around here? Not.
177 fCC->GetViewer3D("ogl");
182 fBrowser->SetupEditorLook(fEditor);
183 fCC->GetViewer3D("ogl");
188 printf("LT_GLViewer this option currently somewhat broken!\n");
189 fBrowser->SetupGLViewerLook(fEditor, fCC);
190 printf("Crap1 %d %d\n", GetWidth(), GetHeight());
195 printf("RGTopFrame unknown look-type, ignoring.\n");
200 TGLViewer* glv = dynamic_cast<TGLViewer*>(fCC->GetViewer3D());
202 glv->SetSmartRefresh(true);
205 /**************************************************************************/
206 /**************************************************************************/
208 fGeometryLTI = GetListTree()->AddItem(0, "Geometry");
209 GetListTree()->OpenItem(fGeometryLTI);
211 Resize(GetDefaultSize()); // this is used here to init layout algorithm
212 SetWindowName("Reve");
215 fEditor->DisplayObject(0);
217 gSystem->ProcessEvents();
220 /**************************************************************************/
222 TGListTree* RGTopFrame::GetListTree()
224 return fBrowser->GetListTree();
227 TGListTreeItem* RGTopFrame::GetEventTreeItem()
229 // return fBrowser->GetListTree()->FindItemByPathname("Event");
230 return fCurrentEventLTI;
233 TGListTreeItem* RGTopFrame::GetGlobalTreeItem()
238 /**************************************************************************/
240 /**************************************************************************/
242 void RGTopFrame::EditRenderElement(RenderElement* rnr_element)
244 static const Exc_t eH("RGTopFrame::EditRenderElement ");
247 if(rnr_element) tobj = dynamic_cast<TObject*>(rnr_element);
248 fEditor->DisplayObject(tobj);
251 /**************************************************************************/
253 /**************************************************************************/
255 void RGTopFrame::RegisterRedraw3D()
257 fRedrawTimer.Start(0, kTRUE);
261 void RGTopFrame::DoRedraw3D()
263 // printf("RGTopFrame::DoRedraw3D redraw triggered\n");
266 fTimerActive = false;
269 /**************************************************************************/
271 int RGTopFrame::SpawnGuiAndRun(int argc, char **argv)
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)
278 printf("revemode = %d\n", revemode);
281 TRint theApp("App", &argc, argv);
285 gReve = new RGTopFrame(gClient->GetRoot(), w, h, revemode);
290 catch(std::string exc) {
291 gReve->GetStatusBar()->SetText(exc.c_str());
297 /**************************************************************************/
298 /**************************************************************************/
300 TGListTreeItem* RGTopFrame::AddEvent(TObject* event)
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;
310 TGListTreeItem* RGTopFrame::AddRenderElement(RenderElement* rnr_element)
312 static const Exc_t eH("RGTopFrame::AddGlobalRenderElement ");
314 // Here could route rnr-element to several browsers/pads.
316 TGListTreeItem* newitem =
317 rnr_element->AddIntoListTree(GetListTree(), GetEventTreeItem());
323 TGListTreeItem* RGTopFrame::AddRenderElement(TGListTreeItem* parent,
324 RenderElement* rnr_element)
326 static const Exc_t eH("RGTopFrame::AddRenderElement ");
328 // Here could route rnr-element to several browsers/pads.
330 TGListTreeItem* newitem =
331 rnr_element->AddIntoListTree(GetListTree(), parent);
337 TGListTreeItem* RGTopFrame::AddGlobalRenderElement(RenderElement* rnr_element)
339 return AddGlobalRenderElement(GetEventTreeItem(), rnr_element);
342 TGListTreeItem* RGTopFrame::AddGlobalRenderElement(TGListTreeItem* ,
343 RenderElement* rnr_element)
345 static const Exc_t eH("RGTopFrame::AddGlobalRenderElement ");
347 // Here could route rnr-element to several browsers/pads.
349 TGListTreeItem* newitem =
350 rnr_element->AddIntoListTree(GetListTree(), GetGlobalTreeItem());
356 /**************************************************************************/
358 void RGTopFrame::DrawRenderElement(RenderElement* rnr_element, TVirtualPad* pad)
360 if(pad == 0) pad = GetCC();
361 { Reve::PadHolder pHolder(false, pad);
362 rnr_element->GetObject()->Draw();
367 /**************************************************************************/
369 void RGTopFrame::RenderElementChecked(TObject* obj, Bool_t state)
371 RenderElement* rnr_element = dynamic_cast<RenderElement*>(obj);
372 // printf("Checked %p %p %d\n", obj, rnr_element, state);
374 rnr_element->SetRnrElement(state);
377 /**************************************************************************/
379 void RGTopFrame::NotifyBrowser(TGListTreeItem* parent)
381 TGListTree* l_tree = GetListTree();
383 l_tree->OpenItem(parent);
384 l_tree->GetClient()->NeedRedraw(l_tree);
387 /**************************************************************************/
388 // GeoManager registration
389 /**************************************************************************/
391 TGeoManager* RGTopFrame::GetGeometry(const TString& filename)
393 static const Exc_t eH("RGTopFrame::GetGeometry ");
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());
400 std::map<TString, TGeoManager*>::iterator g = fGeometries.find(filename);
401 if(g != fGeometries.end()) {
404 if(gSystem->AccessPathName(exp_filename, kReadPermission))
405 throw(eH + "file '" + exp_filename + "' not readable.");
407 TGeoManager::Import(filename);
409 throw(eH + "GeoManager import failed.");
410 gGeoManager->GetTopVolume()->VisibleDaughters(1);
412 // Import colors exported by Gled, if they exist.
414 TFile f(exp_filename, "READ");
415 TObjArray* collist = (TObjArray*) f.Get("ColorList");
418 TSeqCollection* glist = gROOT->GetListOfColors();
420 glist->AddAll(collist);
424 fGeometries[filename] = gGeoManager;