40 #ifdef G4VIS_BUILD_OIX_DRIVER
45 #include <Inventor/nodes/SoSelection.h>
47 #include <Inventor/Xt/SoXt.h>
50 #include <Inventor/Xt/viewers/SoXtFlyViewer.h>
52 #include <X11/StringDefs.h>
53 #include <X11/Shell.h>
58 #include <Xm/CascadeB.h>
59 #include <Xm/RowColumn.h>
64 #include "HEPVis/actions/SoGL2PSAction.h"
73 G4OpenInventorXtExtendedViewer::G4OpenInventorXtExtendedViewer(
74 G4OpenInventorSceneHandler& sceneHandler
76 :G4OpenInventorViewer (sceneHandler, name)
87 void G4OpenInventorXtExtendedViewer::Initialise() {
91 Widget parent = (Widget)fInteractorManager->GetParentInteractor ();
92 G4cout <<
"DEBUG G4OpenInventorXtExtendedViewer: parent = " << parent <<
G4endl;
100 G4String sgeometry = fVP.GetXGeometryString();
101 if(sgeometry.empty()) {
102 G4cout <<
"ERROR: Geometry string \""
104 <<
"\" is empty. Using \"600x600\"."
108 sprintf(s,
"%dx%d",width,height);
111 width = fVP.GetWindowSizeHintX();
112 height = fVP.GetWindowSizeHintX();
117 shellName +=
"_shell";
119 XtSetArg(args[0],XtNgeometry,XtNewString(sgeometry.c_str()));
120 XtSetArg(args[1],XtNborderWidth,0);
121 XtSetArg(args[2],XtNtitle,XtNewString(wName.c_str()));
122 fShell = XtAppCreateShell(shellName.c_str(),
"Inventor",
123 topLevelShellWidgetClass,
127 G4cout <<
"DEBUG CREATING THE VIEWER WITH CREATED SHELL = " << fShell <<
G4endl;
141 Widget menuBar = fViewer->getMenuBar();
149 {Widget menu = fViewer->getMenu();
151 AddButton(menu,
"PS (gl2ps)",PostScriptCbk);
152 AddButton(menu,
"PS (pixmap)",PixmapPostScriptCbk);
153 AddButton(menu,
"Write IV",WriteInventorCbk);
154 AddButton(menu,
"Escape",EscapeCbk);}
156 {Widget menu = AddMenu(menuBar,
"Etc",
"Etc");
157 AddButton(menu,
"Erase detector",EraseDetectorCbk);
158 AddButton(menu,
"Erase event",EraseEventCbk);
159 AddButton(menu,
"Set solid",SetSolidCbk);
161 AddButton(menu,
"Set (G4) reduced wire frame",SetReducedWireFrameCbk);
162 AddButton(menu,
"Set (G4) full wire frame",SetFullWireFrameCbk);
163 AddButton(menu,
"Visible mothers + invisible daughters",SetPreviewCbk);
164 AddButton(menu,
"Visible mothers + visible daughters",SetPreviewAndFullCbk);
165 AddButton(menu,
"Update scene",UpdateSceneCbk);
166 AddButton(menu,
"Scene graph stats",SceneGraphStatisticsCbk);
169 {Widget menu = AddMenu(menuBar,
"Help",
"Help");
170 AddButton(menu,
"Controls",HelpCbk);}
174 XtSetArg(args[0],XmNtopAttachment ,XmATTACH_WIDGET);
175 XtSetArg(args[1],XmNtopWidget ,menuBar);
176 XtSetArg(args[2],XmNleftAttachment ,XmATTACH_FORM);
177 XtSetArg(args[3],XmNrightAttachment ,XmATTACH_FORM);
178 XtSetArg(args[4],XmNbottomAttachment,XmATTACH_FORM);
179 XtSetValues(fViewer->getWidget(),args,5);
181 fHelpForm = XmCreateFormDialog(fShell,(
char*)
"help",NULL,0);
182 XtSetArg(args[0],XmNleftAttachment ,XmATTACH_FORM);
183 XtSetArg(args[1],XmNrightAttachment ,XmATTACH_FORM);
184 XtSetArg(args[2],XmNbottomAttachment,XmATTACH_FORM);
185 Widget cancel = XmCreatePushButton(fHelpForm,(
char*)
"helpCancel",args,3);
186 XtAddCallback(cancel,XmNactivateCallback,HelpCancelCbk,(XtPointer)
this);
187 XtManageChild(cancel);
188 XtSetArg(args[0],XmNtopAttachment ,XmATTACH_FORM);
189 XtSetArg(args[1],XmNleftAttachment ,XmATTACH_FORM);
190 XtSetArg(args[2],XmNrightAttachment ,XmATTACH_FORM);
191 XtSetArg(args[3],XmNbottomAttachment,XmATTACH_WIDGET);
192 XtSetArg(args[4],XmNbottomWidget ,cancel);
193 fHelpText = XmCreateScrolledText(fHelpForm,(
char*)
"helpText",args,5);
194 XtManageChild(fHelpText);
196 fInteractorManager->AddShell(fShell);
199 char* str = fInteractorManager->GetCreationString();
200 if(str!=0) wName = str;
201 G4cout <<
"DEBUG CREATING THE VIEWER WITH parent = " << parent <<
G4endl;
207 fSoSelection->removeSelectionCallback(G4OpenInventorViewer::SelectionCB,
211 fViewer->setSize(SbVec2s(width,height));
214 const SbViewportRegion& vpRegion = fViewer->getViewportRegion();
215 fGL2PSAction =
new SoGL2PSAction(vpRegion);
216 fViewer->setGLRenderAction(fGL2PSAction);
219 fViewer->setSceneGraph(fSoSelection);
221 fViewer->saveHomePosition();
222 fViewer->setTitle(
fName);
226 fInteractorManager->FlushAndWaitExecution ();
228 fInteractorManager->SetCreatedInteractor (fViewer -> getWidget());
230 fViewer->setTransparencyType(SoGLRenderAction::SORTED_OBJECT_ADD);
233 G4OpenInventorXtExtendedViewer::~G4OpenInventorXtExtendedViewer () {
234 if(fShell) fInteractorManager->RemoveShell(fShell);
236 fViewer->setSceneGraph(0);
241 if(fShell) XtDestroyWidget(fShell);
244 void G4OpenInventorXtExtendedViewer::FinishView () {
247 fViewer->saveHomePosition();
250 void G4OpenInventorXtExtendedViewer::SetView () {
251 G4OpenInventorViewer::SetView ();
254 G4Colour b = fVP.GetBackgroundColour ();
255 fViewer->setBackgroundColor
260 void G4OpenInventorXtExtendedViewer::ViewerRender () {
265 SoCamera* G4OpenInventorXtExtendedViewer::GetCamera () {
266 if(!fViewer)
return 0;
267 return fViewer->getCamera();
270 Widget G4OpenInventorXtExtendedViewer::AddMenu(
277 Widget menu = XmCreatePulldownMenu(aMenuBar,(
char*)aName.c_str(),NULL,0);
281 XmStringLtoRCreate((
char*)aLabel.c_str(),XmSTRING_DEFAULT_CHARSET);
282 XtSetArg (args[0],XmNlabelString,cps);
283 XtSetArg (args[1],XmNsubMenuId,menu);
284 Widget widget = XmCreateCascadeButton(aMenuBar,(
char*)aName.c_str(),args,2);
286 XtManageChild(widget);
289 void G4OpenInventorXtExtendedViewer::AddButton (
292 ,XtCallbackProc aCallback
295 Widget widget = XmCreatePushButton(aMenu,(
char*)aLabel.c_str(),NULL,0);
296 XtManageChild(widget);
297 XtAddCallback(widget,XmNactivateCallback,aCallback,(XtPointer)
this);
300 void G4OpenInventorXtExtendedViewer::HelpCancelCbk(
301 Widget,XtPointer aData,XtPointer) {
302 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
303 XtUnmanageChild(This->fHelpForm);
311 void G4OpenInventorXtExtendedViewer::EscapeCbk(
312 Widget,XtPointer aData,XtPointer) {
313 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
318 void G4OpenInventorXtExtendedViewer::EscapeFromKeyboardCbk(
void* o) {
319 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)o;
323 void G4OpenInventorXtExtendedViewer::PostScriptCbk(
324 Widget,XtPointer aData,XtPointer) {
325 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
326 This->WritePostScript();
329 void G4OpenInventorXtExtendedViewer::PixmapPostScriptCbk(
330 Widget,XtPointer aData,XtPointer) {
331 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
332 This->WritePixmapPostScript();
335 void G4OpenInventorXtExtendedViewer::SceneGraphStatisticsCbk(
336 Widget,XtPointer aData,XtPointer) {
337 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
338 This->SceneGraphStatistics();
341 void G4OpenInventorXtExtendedViewer::WriteInventorCbk(
342 Widget,XtPointer aData,XtPointer) {
343 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
344 This->WriteInventor();
347 void G4OpenInventorXtExtendedViewer::EraseDetectorCbk(
348 Widget,XtPointer aData,XtPointer) {
349 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
350 This->EraseDetector();
353 void G4OpenInventorXtExtendedViewer::EraseEventCbk(
354 Widget,XtPointer aData,XtPointer) {
355 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
359 void G4OpenInventorXtExtendedViewer::SetSolidCbk(
360 Widget,XtPointer aData,XtPointer) {
361 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
365 void G4OpenInventorXtExtendedViewer::SetWireFrameCbk(
366 Widget,XtPointer aData,XtPointer) {
367 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
368 This->SetWireFrame();
371 void G4OpenInventorXtExtendedViewer::SetReducedWireFrameCbk(
372 Widget,XtPointer aData,XtPointer) {
373 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
374 This->SetReducedWireFrame(
true);
377 void G4OpenInventorXtExtendedViewer::SetFullWireFrameCbk(
378 Widget,XtPointer aData,XtPointer) {
379 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
380 This->SetReducedWireFrame(
false);
383 void G4OpenInventorXtExtendedViewer::UpdateSceneCbk(
384 Widget,XtPointer aData,XtPointer) {
385 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
389 void G4OpenInventorXtExtendedViewer::SetPreviewCbk(
390 Widget,XtPointer aData,XtPointer) {
391 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
395 void G4OpenInventorXtExtendedViewer::SetPreviewAndFullCbk(
396 Widget,XtPointer aData,XtPointer) {
397 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
398 This->SetPreviewAndFull();
401 void G4OpenInventorXtExtendedViewer::HelpCbk(
402 Widget,XtPointer aData,XtPointer) {
403 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
404 XtManageChild(This->fHelpForm);
405 XmTextSetString(This->fHelpText,(
char*)This->Help().c_str());
G4GLOB_DLL std::ostream G4cout
G4double GetGreen() const
static Verbosity GetVerbosity()
void addEscapeCallback(void(*cb)(void *), void *)