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,
"Write PS (gl2ps)",PostScriptCbk);
152 AddButton(menu,
"Write PDF (gl2ps)", PDFCbk);
153 AddButton(menu,
"Write PS (pixmap)",PixmapPostScriptCbk);
154 AddButton(menu,
"Write IV",WriteInventorCbk);
155 AddButton(menu,
"Escape",EscapeCbk);}
157 {Widget menu = AddMenu(menuBar,
"Etc",
"Etc");
158 AddButton(menu,
"Erase detector",EraseDetectorCbk);
159 AddButton(menu,
"Erase event",EraseEventCbk);
160 AddButton(menu,
"Set solid",SetSolidCbk);
162 AddButton(menu,
"Set (G4) reduced wire frame",SetReducedWireFrameCbk);
163 AddButton(menu,
"Set (G4) full wire frame",SetFullWireFrameCbk);
164 AddButton(menu,
"Visible mothers + invisible daughters",SetPreviewCbk);
165 AddButton(menu,
"Visible mothers + visible daughters",SetPreviewAndFullCbk);
166 AddButton(menu,
"Update scene",UpdateSceneCbk);
167 AddButton(menu,
"Scene graph stats",SceneGraphStatisticsCbk);
170 {Widget menu = AddMenu(menuBar,
"Help",
"Help");
171 AddButton(menu,
"Controls",HelpCbk);}
175 XtSetArg(args[0],XmNtopAttachment ,XmATTACH_WIDGET);
176 XtSetArg(args[1],XmNtopWidget ,menuBar);
177 XtSetArg(args[2],XmNleftAttachment ,XmATTACH_FORM);
178 XtSetArg(args[3],XmNrightAttachment ,XmATTACH_FORM);
179 XtSetArg(args[4],XmNbottomAttachment,XmATTACH_FORM);
180 XtSetValues(fViewer->getWidget(),args,5);
182 fHelpForm = XmCreateFormDialog(fShell,(
char*)
"help",NULL,0);
183 XtSetArg(args[0],XmNleftAttachment ,XmATTACH_FORM);
184 XtSetArg(args[1],XmNrightAttachment ,XmATTACH_FORM);
185 XtSetArg(args[2],XmNbottomAttachment,XmATTACH_FORM);
186 Widget cancel = XmCreatePushButton(fHelpForm,(
char*)
"helpCancel",args,3);
187 XtAddCallback(cancel,XmNactivateCallback,HelpCancelCbk,(XtPointer)
this);
188 XtManageChild(cancel);
189 XtSetArg(args[0],XmNtopAttachment ,XmATTACH_FORM);
190 XtSetArg(args[1],XmNleftAttachment ,XmATTACH_FORM);
191 XtSetArg(args[2],XmNrightAttachment ,XmATTACH_FORM);
192 XtSetArg(args[3],XmNbottomAttachment,XmATTACH_WIDGET);
193 XtSetArg(args[4],XmNbottomWidget ,cancel);
194 fHelpText = XmCreateScrolledText(fHelpForm,(
char*)
"helpText",args,5);
195 XtManageChild(fHelpText);
197 fInteractorManager->AddShell(fShell);
200 char* str = fInteractorManager->GetCreationString();
201 if(str!=0) wName = str;
202 G4cout <<
"DEBUG CREATING THE VIEWER WITH parent = " << parent <<
G4endl;
208 fSoSelection->removeSelectionCallback(G4OpenInventorViewer::SelectionCB,
212 fViewer->setSize(SbVec2s(width,height));
215 const SbViewportRegion& vpRegion = fViewer->getViewportRegion();
216 fGL2PSAction =
new SoGL2PSAction(vpRegion);
217 fViewer->setGLRenderAction(fGL2PSAction);
220 fViewer->setSceneGraph(fSoSelection);
222 fViewer->saveHomePosition();
223 fViewer->setTitle(
fName);
227 fInteractorManager->FlushAndWaitExecution ();
229 fInteractorManager->SetCreatedInteractor (fViewer -> getWidget());
231 fViewer->setTransparencyType(SoGLRenderAction::SORTED_OBJECT_ADD);
234 G4OpenInventorXtExtendedViewer::~G4OpenInventorXtExtendedViewer () {
235 if(fShell) fInteractorManager->RemoveShell(fShell);
237 fViewer->setSceneGraph(0);
242 if(fShell) XtDestroyWidget(fShell);
245 void G4OpenInventorXtExtendedViewer::FinishView () {
248 fViewer->saveHomePosition();
251 void G4OpenInventorXtExtendedViewer::SetView () {
252 G4OpenInventorViewer::SetView ();
255 G4Colour b = fVP.GetBackgroundColour ();
256 fViewer->setBackgroundColor
261 void G4OpenInventorXtExtendedViewer::ViewerRender () {
266 SoCamera* G4OpenInventorXtExtendedViewer::GetCamera () {
267 if(!fViewer)
return 0;
268 return fViewer->getCamera();
271 Widget G4OpenInventorXtExtendedViewer::AddMenu(
278 Widget menu = XmCreatePulldownMenu(aMenuBar,(
char*)aName.c_str(),NULL,0);
282 XmStringLtoRCreate((
char*)aLabel.c_str(),XmSTRING_DEFAULT_CHARSET);
283 XtSetArg (args[0],XmNlabelString,cps);
284 XtSetArg (args[1],XmNsubMenuId,menu);
285 Widget widget = XmCreateCascadeButton(aMenuBar,(
char*)aName.c_str(),args,2);
287 XtManageChild(widget);
290 void G4OpenInventorXtExtendedViewer::AddButton (
293 ,XtCallbackProc aCallback
296 Widget widget = XmCreatePushButton(aMenu,(
char*)aLabel.c_str(),NULL,0);
297 XtManageChild(widget);
298 XtAddCallback(widget,XmNactivateCallback,aCallback,(XtPointer)
this);
301 void G4OpenInventorXtExtendedViewer::HelpCancelCbk(
302 Widget,XtPointer aData,XtPointer) {
303 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
304 XtUnmanageChild(This->fHelpForm);
312 void G4OpenInventorXtExtendedViewer::EscapeCbk(
313 Widget,XtPointer aData,XtPointer) {
314 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
319 void G4OpenInventorXtExtendedViewer::EscapeFromKeyboardCbk(
void* o) {
320 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)o;
324 void G4OpenInventorXtExtendedViewer::PostScriptCbk(
325 Widget,XtPointer aData,XtPointer) {
326 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
327 This->WritePostScript();
329 void G4OpenInventorXtExtendedViewer::PDFCbk(
330 Widget,XtPointer aData,XtPointer) {
331 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
335 void G4OpenInventorXtExtendedViewer::PixmapPostScriptCbk(
336 Widget,XtPointer aData,XtPointer) {
337 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
338 This->WritePixmapPostScript();
341 void G4OpenInventorXtExtendedViewer::SceneGraphStatisticsCbk(
342 Widget,XtPointer aData,XtPointer) {
343 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
344 This->SceneGraphStatistics();
347 void G4OpenInventorXtExtendedViewer::WriteInventorCbk(
348 Widget,XtPointer aData,XtPointer) {
349 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
350 This->WriteInventor();
353 void G4OpenInventorXtExtendedViewer::EraseDetectorCbk(
354 Widget,XtPointer aData,XtPointer) {
355 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
356 This->EraseDetector();
359 void G4OpenInventorXtExtendedViewer::EraseEventCbk(
360 Widget,XtPointer aData,XtPointer) {
361 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
365 void G4OpenInventorXtExtendedViewer::SetSolidCbk(
366 Widget,XtPointer aData,XtPointer) {
367 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
371 void G4OpenInventorXtExtendedViewer::SetWireFrameCbk(
372 Widget,XtPointer aData,XtPointer) {
373 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
374 This->SetWireFrame();
377 void G4OpenInventorXtExtendedViewer::SetReducedWireFrameCbk(
378 Widget,XtPointer aData,XtPointer) {
379 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
380 This->SetReducedWireFrame(
true);
383 void G4OpenInventorXtExtendedViewer::SetFullWireFrameCbk(
384 Widget,XtPointer aData,XtPointer) {
385 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
386 This->SetReducedWireFrame(
false);
389 void G4OpenInventorXtExtendedViewer::UpdateSceneCbk(
390 Widget,XtPointer aData,XtPointer) {
391 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
395 void G4OpenInventorXtExtendedViewer::SetPreviewCbk(
396 Widget,XtPointer aData,XtPointer) {
397 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
401 void G4OpenInventorXtExtendedViewer::SetPreviewAndFullCbk(
402 Widget,XtPointer aData,XtPointer) {
403 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
404 This->SetPreviewAndFull();
407 void G4OpenInventorXtExtendedViewer::HelpCbk(
408 Widget,XtPointer aData,XtPointer) {
409 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
410 XtManageChild(This->fHelpForm);
411 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 *)