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);
128 TGCompositeFrame* frame4 = fDisplayFrame->AddTab("HistoCanvas");
129 TRootEmbeddedCanvas* ecanvas4 = new TRootEmbeddedCanvas("HistoCanvas", frame4, 580, 360);
130 frame4->AddFrame(ecanvas4, fL2);
131 fHistoCanvas = ecanvas4->GetCanvas();
132 fHistoCanvas->SetBorderMode(0);
134 fV2->AddFrame(fDisplayFrame, fL0);
135 AddFrame(fMainFrame, fL0);
138 Int_t parts[] = {45, 45, 10};
139 fStatusBar = new TGStatusBar(this, 50, 10, kHorizontalFrame);
140 fStatusBar->SetParts(parts, 3);
141 TGLayoutHints* fL6 = new TGLayoutHints(kLHintsBottom| kLHintsExpandX, 0, 0, 0, 0);
142 AddFrame(fStatusBar, fL6);
143 fStatusBar->SetText("GUI created", 0);
147 /**************************************************************************/
148 /**************************************************************************/
150 fEditor = new RGEditor(fCC);
151 fEditor->GetCan()->ChangeOptions(0);
155 fBrowser->SetupClassicLook();
156 // Need push/pop pad around here? Not.
157 fCC->GetViewer3D("ogl");
162 fBrowser->SetupEditorLook(fEditor);
163 fCC->GetViewer3D("ogl");
168 printf("LT_GLViewer this option currently somewhat broken!\n");
169 fBrowser->SetupGLViewerLook(fEditor, fCC);
170 printf("Crap1 %d %d\n", GetWidth(), GetHeight());
175 printf("RGTopFrame unknown look-type, ignoring.\n");
180 TGLViewer* glv = dynamic_cast<TGLViewer*>(fCC->GetViewer3D());
182 glv->SetSmartRefresh(true);
185 /**************************************************************************/
186 /**************************************************************************/
188 fGeometryLTI = GetListTree()->AddItem(0, "Geometry");
189 GetListTree()->OpenItem(fGeometryLTI);
191 Resize(GetDefaultSize()); // this is used here to init layout algorithm
192 SetWindowName("Reve");
195 fEditor->DisplayObject(0);
197 gSystem->ProcessEvents();
200 /**************************************************************************/
202 TGListTree* RGTopFrame::GetListTree()
204 return fBrowser->GetListTree();
207 TGListTreeItem* RGTopFrame::GetEventTreeItem()
209 // return fBrowser->GetListTree()->FindItemByPathname("Event");
210 return fCurrentEventLTI;
213 TGListTreeItem* RGTopFrame::GetGlobalTreeItem()
218 /**************************************************************************/
220 /**************************************************************************/
222 void RGTopFrame::EditRenderElement(RenderElement* rnr_element)
224 static const Exc_t eH("RGTopFrame::EditRenderElement ");
227 if(rnr_element) tobj = rnr_element->GetObject();
228 fEditor->DisplayObject(tobj);
231 /**************************************************************************/
233 /**************************************************************************/
235 void RGTopFrame::RegisterRedraw3D()
237 fRedrawTimer.Start(0, kTRUE);
241 void RGTopFrame::DoRedraw3D()
243 // printf("RGTopFrame::DoRedraw3D redraw triggered\n");
246 fTimerActive = false;
249 /**************************************************************************/
251 int RGTopFrame::SpawnGuiAndRun(int argc, char **argv)
253 LookType_e revemode = LT_Editor;
254 if(argc >= 3 && strcmp(argv[1], "-revemode")==0) {
255 LookType_e m = LookType_e(atoi(argv[2]));
256 if(m >= LT_Classic && m <= LT_GLViewer)
258 printf("revemode = %d\n", revemode);
261 TRint theApp("App", &argc, argv);
265 gReve = new RGTopFrame(gClient->GetRoot(), w, h, revemode);
270 catch(std::string exc) {
271 gReve->GetStatusBar()->SetText(exc.c_str());
277 /**************************************************************************/
278 /**************************************************************************/
280 TGListTreeItem* RGTopFrame::AddEvent(TObject* event)
282 fCurrentEvent = event;
283 RenderElementObjPtr* rnrEv = new RenderElementObjPtr(event);
284 fCurrentEventLTI = rnrEv->AddIntoListTree(GetListTree(), 0);
285 GetListTree()->OpenItem(fCurrentEventLTI);
286 return fCurrentEventLTI;
289 TGListTreeItem* RGTopFrame::AddRenderElement(RenderElement* rnr_element)
291 return AddRenderElement(GetEventTreeItem(), rnr_element);
294 TGListTreeItem* RGTopFrame::AddRenderElement(TGListTreeItem* parent,
295 RenderElement* rnr_element)
297 static const Exc_t eH("RGTopFrame::AddRenderElement ");
299 // Here could route rnr-element to several browsers/pads.
301 TGListTreeItem* newitem =
302 rnr_element->AddIntoListTree(GetListTree(), parent);
308 TGListTreeItem* RGTopFrame::AddGlobalRenderElement(RenderElement* rnr_element)
310 return AddGlobalRenderElement(GetGlobalTreeItem(), rnr_element);
313 TGListTreeItem* RGTopFrame::AddGlobalRenderElement(TGListTreeItem* parent,
314 RenderElement* rnr_element)
316 static const Exc_t eH("RGTopFrame::AddGlobalRenderElement ");
318 // Here could route rnr-element to several browsers/pads.
320 TGListTreeItem* newitem =
321 rnr_element->AddIntoListTree(GetListTree(), parent);
327 /**************************************************************************/
329 void RGTopFrame::DrawRenderElement(RenderElement* rnr_element, TVirtualPad* pad)
331 if(pad == 0) pad = GetCC();
332 { Reve::PadHolder pHolder(false, pad);
333 rnr_element->GetObject()->Draw();
338 /**************************************************************************/
340 void RGTopFrame::RenderElementChecked(TObject* obj, Bool_t state)
342 // Item's user-data is blindly casted into TObject.
343 // We recast it blindly back into the render element.
345 RenderElement* rnrEl = (RenderElement*) obj;
346 rnrEl->SetRnrElement(state);
349 /**************************************************************************/
351 void RGTopFrame::NotifyBrowser(TGListTreeItem* parent)
353 TGListTree* l_tree = GetListTree();
355 l_tree->OpenItem(parent);
356 l_tree->GetClient()->NeedRedraw(l_tree);
359 /**************************************************************************/
360 // GeoManager registration
361 /**************************************************************************/
363 TGeoManager* RGTopFrame::GetGeometry(const TString& filename)
365 static const Exc_t eH("RGTopFrame::GetGeometry ");
367 TString exp_filename = filename;
368 gSystem->ExpandPathName(exp_filename);
369 printf("%s loading: '%s' -> '%s'.\n", eH.Data(),
370 filename.Data(), exp_filename.Data());
372 std::map<TString, TGeoManager*>::iterator g = fGeometries.find(filename);
373 if(g != fGeometries.end()) {
376 if(gSystem->AccessPathName(exp_filename, kReadPermission))
377 throw(eH + "file '" + exp_filename + "' not readable.");
379 TGeoManager::Import(filename);
381 throw(eH + "GeoManager import failed.");
382 gGeoManager->GetTopVolume()->VisibleDaughters(1);
384 // Import colors exported by Gled, if they exist.
386 TFile f(exp_filename, "READ");
387 TObjArray* collist = (TObjArray*) f.Get("ColorList");
390 TSeqCollection* glist = gROOT->GetListOfColors();
392 glist->AddAll(collist);
396 fGeometries[filename] = gGeoManager;