2 #include "RGTopFrame.h"
5 #include "VSDSelector.h"
6 #include <Reve/PointSet.h>
7 #include <Reve/Track.h>
15 #include <TVirtualX.h>
18 #include <TApplication.h>
20 #include <TEventList.h>
21 #include <TClassMenuItem.h>
24 #include <TPolyMarker3D.h>
27 #include <TGSplitter.h>
28 #include <TGStatusBar.h>
30 #include <TGPicture.h>
31 #include <TGToolBar.h>
33 #include <TGXYLayout.h>
34 #include <TGNumberEntry.h>
35 #include <KeySymbols.h>
37 #include <TGLSAViewer.h>
38 #include <TGLSAFrame.h>
41 #include <TGeoVolume.h>
47 /**************************************************************************/
49 void RGBrowser::SetupCintExport(TClass* cl)
52 TList* l = cl->GetMenuList();
53 TClassMenuItem* n = new TClassMenuItem(TClassMenuItem::kPopupUserFunction, cl,
54 "Export to CINT", "ExportToCINT", this, "const char*,TObject*", 1);
59 void RGBrowser::CalculateReparentXY(TGObject* parent, Int_t& x, Int_t& y)
63 gVirtualX->GetWindowSize(parent->GetId(), x, y, w, h);
64 gVirtualX->TranslateCoordinates(parent->GetId(),
65 gClient->GetDefaultRoot()->GetId(),
66 0, 0, x, y, childdum);
69 /**************************************************************************/
71 RGBrowser::RGBrowser(const TGWindow *p, UInt_t w, UInt_t h) :
72 TGCompositeFrame(p, w, h),
74 fMainFrame(0), fV1(0), fV2(0),
75 fSelectionFrame(0), fTreeView(0),
76 fCanvasWindow(0), fDisplayFrame(0),
80 fMainFrame = new TGCompositeFrame(this, 100, 10, kHorizontalFrame | kRaisedFrame);
81 fMainFrame->SetCleanup(kDeepCleanup);
82 fV1 = new TGVerticalFrame(fMainFrame, 250, 10, kSunkenFrame | kFixedWidth);
83 fV2 = new TGVerticalFrame(fMainFrame, 50, 10, kSunkenFrame);
86 lo = new TGLayoutHints(kLHintsLeft | kLHintsExpandY,2,0,2,2);
87 fMainFrame->AddFrame(fV1, lo);
89 TGVSplitter *splitter = new TGVSplitter(fMainFrame);
90 splitter->SetFrame(fV1, kTRUE);
91 fMainFrame->AddFrame(splitter,
92 new TGLayoutHints(kLHintsLeft | kLHintsExpandY, 1,1,2,2));
94 lo = new TGLayoutHints(kLHintsRight | kLHintsExpandX | kLHintsExpandY,0,2,2,4);
95 fMainFrame->AddFrame(fV2, lo);
98 fSelectionFrame = new TGCompositeFrame(fV1, 250, 10, kVerticalFrame);
99 fTreeView = new TGCanvas(fSelectionFrame, 250, 10, kSunkenFrame | kDoubleBorder);
100 fListTree = new TGListTree(fTreeView->GetViewPort(), 250, 10, kHorizontalFrame);
101 fListTree->SetCanvas(fTreeView);
102 fListTree->Associate(this);
103 fListTree->SetColorMode(TGListTree::EColorMarkupMode(TGListTree::kColorUnderline | TGListTree::kColorBox));
104 fTreeView->SetContainer(fListTree);
106 lo= new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX | kLHintsExpandY,
108 fSelectionFrame->AddFrame(fTreeView, lo);
110 lo = new TGLayoutHints(kLHintsTop | kLHintsExpandX | kLHintsExpandY);
111 fV1->AddFrame(fSelectionFrame, lo);
113 // Classic look vars:
119 lo = new TGLayoutHints(kLHintsExpandX | kLHintsExpandY);
120 AddFrame(fMainFrame, lo);
123 SetWindowName("Reve List Browser");
125 //Resize(GetDefaultSize()); // this is used here to init layout algoritme
131 fCtxMenu = new TContextMenu("", "");
134 //-- CINT export now declared in RenderElement with *MENU*
135 // SetupCintExport(PointSet::Class());
136 // SetupCintExport(Track::Class());
137 // SetupCintExport(TrackList::Class());
139 fListTree->Connect("Clicked(TGListTreeItem*, Int_t, Int_t, Int_t)", "Reve::RGBrowser",
140 this, "ItemClicked(TGListTreeItem*, Int_t, Int_t, Int_t)");
141 fListTree->Connect("DoubleClicked(TGListTreeItem*, Int_t)", "Reve::RGBrowser",
142 this, "DbClickListItem(TGListTreeItem*,Int_t )");
143 //fListTree->Connect("Clicked(TGListTreeItem*, Int_t)", "Reve::RGBrowser",
144 // this, "DisplayChildren(TGListTreeItem*, Int_t)");
146 //---------------------------------------------
147 // WARNING ... this Connect goes to *gReve*!
148 fListTree->Connect("Checked(TObject*,Bool_t)", "Reve::RGTopFrame",
149 gReve, "RenderElementChecked(TObject*, Bool_t)");
152 /**************************************************************************/
154 void RGBrowser::SetupClassicLook(RGEditor*& editor, TCanvas* glpad)
156 fCanvasWindow = new TGCanvas(fV2, 25, 250);
157 fDisplayFrame = new TGCompositeFrame(fCanvasWindow->GetViewPort(), 0, 0,kVerticalFrame, TGFrame::GetWhitePixel() );
158 fCanvasWindow->SetContainer(fDisplayFrame);
159 fDisplayFrame->SetCleanup(kDeepCleanup);
161 fV2->AddFrame(fCanvasWindow, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 2, 2));
162 fV2->MapSubwindows();
164 editor = new RGEditor(glpad);
165 editor->GetTGCanvas()->ChangeOptions(0);
166 editor->SetWindowName("Reve Editor");
169 void RGBrowser::SetupEditorLook(RGEditor*& editor, TCanvas* glpad)
171 fClient->SetRoot(fV2);
172 editor = new RGEditor(glpad);
173 editor->GetTGCanvas()->ChangeOptions(0);
174 fV2->RemoveFrame(editor);
175 fV2->AddFrame(editor, new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX | kLHintsExpandY, 0, 0, 2, 2));
179 editor->UnmapWindow();
180 fV2->AddFrame(editor, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 0, 0, 2, 2));
182 CalculateReparentXY(fV2, x, y);
183 editor->ReparentWindow(fV2, x, y);
186 fV2->MapSubwindows();
189 void RGBrowser::SetupGLViewerLook(RGEditor*& editor, TCanvas* glpad)
193 TGLSAViewer* v = new TGLSAViewer(fV2, glpad);
194 v->GetFrame()->SetMinWidth(200);
195 lo = new TGLayoutHints(kLHintsLeft | kLHintsExpandX | kLHintsExpandY);
196 fV2->AddFrame(v->GetFrame(), lo);
197 glpad->SetViewer3D(v);
199 fSelectionFrame->Resize(fSelectionFrame->GetWidth(), fSelectionFrame->GetHeight()/2);
201 TGHSplitter *splitter = new TGHSplitter(fV1);
202 lo = new TGLayoutHints(kLHintsTop | kLHintsExpandX, 4, 2, 2, 0);
203 fSelectionFrame->AddFrame(splitter, lo);
205 fClient->SetRoot(fV1);
206 editor = new RGEditor(glpad);
207 editor->GetTGCanvas()->ChangeOptions(0);
208 editor->ChangeOptions(editor->GetOptions() | kFixedHeight);
209 fV1->RemoveFrame(editor);
210 fV1->AddFrame(editor, new TGLayoutHints(kLHintsTop | kLHintsExpandX, 0,2,2,2));
214 editor->UnmapWindow();
215 editor->ChangeOptions(editor->GetOptions() | kFixedHeight);
216 lo = new TGLayoutHints(kLHintsTop | kLHintsExpandX, 0,2,2,2);
217 fV1->AddFrame(editor, lo);
219 CalculateReparentXY(fV1, x, y);
220 editor->ReparentWindow(fV1, x, y);
223 splitter->SetFrame(editor, kFALSE);
225 fV1->MapSubwindows();
226 v->GetFrame()->MapWindow();
230 /**************************************************************************/
231 /**************************************************************************/
233 void RGBrowser::RedrawListTree()
235 gClient->NeedRedraw(fListTree);
238 /**************************************************************************/
240 void RGBrowser::ItemClicked(TGListTreeItem *item, Int_t btn, Int_t x, Int_t y)
242 //printf("ItemClicked item %s List %d btn=%d, x=%d, y=%d\n",
243 // item->GetText(),fDisplayFrame->GetList()->GetEntries(), btn, x, y);
245 RenderElement* re = (RenderElement*)item->GetUserData();
247 TObject* obj = re->GetObject();
250 // If control pressed, show menu for renderelement itself.
251 // event->fState & kKeyControlMask
252 // ??? how do i get current event?
254 fCtxMenu->Popup(x, y, obj);
259 gReve->EditRenderElement(re);
262 void RGBrowser::DbClickListItem(TGListTreeItem* item, Int_t btn)
264 static const Exc_t eH("RGBrowser::DbClickListItem ");
266 // printf("dbclick item %s\n", item->GetText());
267 RenderElement* re = (RenderElement*)item->GetUserData();
269 TObject* obj = re->GetObject();
272 // ListTreeHighlight(item);
274 re->ExpandIntoListTree(fListTree, item);
277 if(obj->IsA()->InheritsFrom("TGeoNode")){
278 TGeoNode* n = (TGeoNode*) obj->IsA()->DynamicCast( TGeoNode::Class(), obj );
280 if(item->GetFirstChild() == 0 && n->GetNdaughters()){
281 UpdateListItems(item, btn);
287 /**************************************************************************/
289 void RGBrowser::ExportToCINT(Text_t* var_name, TObject* obj)
291 const char* cname = obj->IsA()->GetName();
292 gROOT->ProcessLine(Form("%s* %s = (%s*) %p;", cname, var_name, cname, obj));
294 /**************************************************************************/
296 void RGBrowser::UpdateListItems(TGListTreeItem* item, Int_t )
298 if (item->GetUserData()) {
299 // ListTreeHighlight(item);
300 RenderElement* re = (RenderElement*)item->GetUserData();
301 TObject* obj = re->GetObject();
304 if(obj->IsA()->InheritsFrom("TGeoNode")){
306 fListTree->DeleteChildren(item);
307 TGeoNode* n = (TGeoNode*) obj->IsA()->DynamicCast( TGeoNode::Class(), obj );
308 //printf("adding items\n");
309 if (n->GetNdaughters()) {
310 for (Int_t i=0; i< n->GetNdaughters(); i++) {
312 title.Form("%d : %s[%d]", i,
313 n->GetDaughter(i)->GetVolume()->GetName(),
314 n->GetDaughter(i)->GetNdaughters());
316 TGListTreeItem* child = fListTree->AddItem( item, title.Data());
317 child->SetUserData( n->GetDaughter(i));
324 /**************************************************************************/