00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 #ifdef G4VIS_BUILD_OIX_DRIVER
00041
00042
00043 #include "G4OpenInventorXtExtendedViewer.hh"
00044
00045 #include <Inventor/nodes/SoSelection.h>
00046
00047 #include <Inventor/Xt/SoXt.h>
00048
00049
00050 #include <Inventor/Xt/viewers/SoXtFlyViewer.h>
00051
00052 #include <X11/StringDefs.h>
00053 #include <X11/Shell.h>
00054
00055 #include <Xm/Xm.h>
00056 #include <Xm/PushB.h>
00057 #include <Xm/Form.h>
00058 #include <Xm/CascadeB.h>
00059 #include <Xm/RowColumn.h>
00060 #include <Xm/Text.h>
00061
00062 #include "HEPVis/actions/SoGL2PSAction.h"
00063
00064 #include "G4OpenInventor.hh"
00065 #include "G4OpenInventorSceneHandler.hh"
00066 #include "G4OpenInventorXtExaminerViewer.hh"
00067 #include "G4VInteractorManager.hh"
00068 #include "G4VisManager.hh"
00069 #include "G4AttCheck.hh"
00070
00071 G4OpenInventorXtExtendedViewer::G4OpenInventorXtExtendedViewer(
00072 G4OpenInventorSceneHandler& sceneHandler
00073 ,const G4String& name)
00074 :G4OpenInventorViewer (sceneHandler, name)
00075 ,fShell(0)
00076 ,fViewer(0)
00077 ,fHelpForm(0)
00078 ,fHelpText(0)
00079 {
00080 if (G4VisManager::GetVerbosity() >= G4VisManager::confirmations)
00081 G4cout << "Window name: " << fName << G4endl;
00082 }
00083
00084
00085 void G4OpenInventorXtExtendedViewer::Initialise() {
00086
00087 G4String wName = fName;
00088
00089 Widget parent = (Widget)fInteractorManager->GetParentInteractor ();
00090 int width = 600;
00091 int height = 600;
00092
00093 if(!parent) {
00094
00095 char s[32];
00096
00097 G4String sgeometry = fVP.GetXGeometryString();
00098 if(sgeometry.empty()) {
00099 G4cout << "ERROR: Geometry string \""
00100 << sgeometry
00101 << "\" is empty. Using \"600x600\"."
00102 << G4endl;
00103 width = 600;
00104 height = 600;
00105 sprintf(s,"%dx%d",width,height);
00106 sgeometry = s;
00107 } else {
00108 width = fVP.GetWindowSizeHintX();
00109 height = fVP.GetWindowSizeHintX();
00110 }
00111
00112
00113 G4String shellName = wName;
00114 shellName += "_shell";
00115 Arg args[10];
00116 XtSetArg(args[0],XtNgeometry,XtNewString(sgeometry.c_str()));
00117 XtSetArg(args[1],XtNborderWidth,0);
00118 XtSetArg(args[2],XtNtitle,XtNewString(wName.c_str()));
00119 fShell = XtAppCreateShell(shellName.c_str(),"Inventor",
00120 topLevelShellWidgetClass,
00121 SoXt::getDisplay(),
00122 args,3);
00123
00124 fViewer = new G4OpenInventorXtExaminerViewer(fShell, wName.c_str(), TRUE);
00125 fViewer->addEscapeCallback(EscapeFromKeyboardCbk, (void *)this);
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137 Widget menuBar = fViewer->getMenuBar();
00138
00139
00140
00141
00142
00143
00144
00145 {Widget menu = fViewer->getMenu();
00146
00147 AddButton(menu,"PS (gl2ps)",PostScriptCbk);
00148 AddButton(menu,"PS (pixmap)",PixmapPostScriptCbk);
00149 AddButton(menu,"Write IV",WriteInventorCbk);
00150 AddButton(menu,"Escape",EscapeCbk);}
00151
00152 {Widget menu = AddMenu(menuBar,"Etc","Etc");
00153 AddButton(menu,"Erase detector",EraseDetectorCbk);
00154 AddButton(menu,"Erase event",EraseEventCbk);
00155 AddButton(menu,"Set solid",SetSolidCbk);
00156
00157 AddButton(menu,"Set (G4) reduced wire frame",SetReducedWireFrameCbk);
00158 AddButton(menu,"Set (G4) full wire frame",SetFullWireFrameCbk);
00159 AddButton(menu,"Visible mothers + invisible daughters",SetPreviewCbk);
00160 AddButton(menu,"Visible mothers + visible daughters",SetPreviewAndFullCbk);
00161 AddButton(menu,"Update scene",UpdateSceneCbk);
00162 AddButton(menu,"Scene graph stats",SceneGraphStatisticsCbk);
00163 }
00164
00165 {Widget menu = AddMenu(menuBar,"Help","Help");
00166 AddButton(menu,"Controls",HelpCbk);}
00167
00168
00169
00170 XtSetArg(args[0],XmNtopAttachment ,XmATTACH_WIDGET);
00171 XtSetArg(args[1],XmNtopWidget ,menuBar);
00172 XtSetArg(args[2],XmNleftAttachment ,XmATTACH_FORM);
00173 XtSetArg(args[3],XmNrightAttachment ,XmATTACH_FORM);
00174 XtSetArg(args[4],XmNbottomAttachment,XmATTACH_FORM);
00175 XtSetValues(fViewer->getWidget(),args,5);
00176
00177 fHelpForm = XmCreateFormDialog(fShell,(char*)"help",NULL,0);
00178 XtSetArg(args[0],XmNleftAttachment ,XmATTACH_FORM);
00179 XtSetArg(args[1],XmNrightAttachment ,XmATTACH_FORM);
00180 XtSetArg(args[2],XmNbottomAttachment,XmATTACH_FORM);
00181 Widget cancel = XmCreatePushButton(fHelpForm,(char*)"helpCancel",args,3);
00182 XtAddCallback(cancel,XmNactivateCallback,HelpCancelCbk,(XtPointer)this);
00183 XtManageChild(cancel);
00184 XtSetArg(args[0],XmNtopAttachment ,XmATTACH_FORM);
00185 XtSetArg(args[1],XmNleftAttachment ,XmATTACH_FORM);
00186 XtSetArg(args[2],XmNrightAttachment ,XmATTACH_FORM);
00187 XtSetArg(args[3],XmNbottomAttachment,XmATTACH_WIDGET);
00188 XtSetArg(args[4],XmNbottomWidget ,cancel);
00189 fHelpText = XmCreateScrolledText(fHelpForm,(char*)"helpText",args,5);
00190 XtManageChild(fHelpText);
00191
00192 fInteractorManager->AddShell(fShell);
00193
00194 } else {
00195 char* str = fInteractorManager->GetCreationString();
00196 if(str!=0) wName = str;
00197 fViewer = new G4OpenInventorXtExaminerViewer(parent, wName.c_str(), TRUE);
00198 }
00199
00200
00201
00202 fSoSelection->removeSelectionCallback(G4OpenInventorViewer::SelectionCB,
00203 this);
00204
00205
00206 fViewer->setSize(SbVec2s(width,height));
00207
00208
00209 const SbViewportRegion& vpRegion = fViewer->getViewportRegion();
00210 fGL2PSAction = new SoGL2PSAction(vpRegion);
00211 fViewer->setGLRenderAction(fGL2PSAction);
00212
00213
00214 fViewer->setSceneGraph(fSoSelection);
00215 fViewer->viewAll();
00216 fViewer->saveHomePosition();
00217 fViewer->setTitle(fName);
00218 fViewer->show();
00219 if(fShell) {
00220 SoXt::show(fShell);
00221 fInteractorManager->FlushAndWaitExecution ();
00222 }
00223 fInteractorManager->SetCreatedInteractor (fViewer -> getWidget());
00224
00225 fViewer->setTransparencyType(SoGLRenderAction::SORTED_OBJECT_ADD);
00226 }
00227
00228 G4OpenInventorXtExtendedViewer::~G4OpenInventorXtExtendedViewer () {
00229 if(fShell) fInteractorManager->RemoveShell(fShell);
00230 if(fViewer) {
00231 fViewer->setSceneGraph(0);
00232
00233
00234
00235 }
00236 if(fShell) XtDestroyWidget(fShell);
00237 }
00238
00239 void G4OpenInventorXtExtendedViewer::FinishView () {
00240 if(!fViewer) return;
00241 fViewer->viewAll();
00242 fViewer->saveHomePosition();
00243 }
00244
00245 void G4OpenInventorXtExtendedViewer::SetView () {
00246 G4OpenInventorViewer::SetView ();
00247 if(!fViewer) return;
00248
00249 G4Colour b = fVP.GetBackgroundColour ();
00250 fViewer->setBackgroundColor
00251 (SbColor((float)b.GetRed(),(float)b.GetGreen(),(float)b.GetBlue()));
00252 }
00253
00254
00255 void G4OpenInventorXtExtendedViewer::ViewerRender () {
00256 if(!fViewer) return;
00257 fViewer->render();
00258 }
00259
00260 SoCamera* G4OpenInventorXtExtendedViewer::GetCamera () {
00261 if(!fViewer) return 0;
00262 return fViewer->getCamera();
00263 }
00264
00265 Widget G4OpenInventorXtExtendedViewer::AddMenu(
00266 Widget aMenuBar
00267 ,const G4String& aName
00268 ,const G4String& aLabel
00269 )
00270 {
00271
00272 Widget menu = XmCreatePulldownMenu(aMenuBar,(char*)aName.c_str(),NULL,0);
00273
00274 Arg args[2];
00275 XmString cps =
00276 XmStringLtoRCreate((char*)aLabel.c_str(),XmSTRING_DEFAULT_CHARSET);
00277 XtSetArg (args[0],XmNlabelString,cps);
00278 XtSetArg (args[1],XmNsubMenuId,menu);
00279 Widget widget = XmCreateCascadeButton(aMenuBar,(char*)aName.c_str(),args,2);
00280 XmStringFree (cps);
00281 XtManageChild(widget);
00282 return menu;
00283 }
00284 void G4OpenInventorXtExtendedViewer::AddButton (
00285 Widget aMenu
00286 ,const G4String& aLabel
00287 ,XtCallbackProc aCallback
00288 )
00289 {
00290 Widget widget = XmCreatePushButton(aMenu,(char*)aLabel.c_str(),NULL,0);
00291 XtManageChild(widget);
00292 XtAddCallback(widget,XmNactivateCallback,aCallback,(XtPointer)this);
00293 }
00294
00295 void G4OpenInventorXtExtendedViewer::HelpCancelCbk(
00296 Widget,XtPointer aData,XtPointer) {
00297 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
00298 XtUnmanageChild(This->fHelpForm);
00299 }
00300
00301
00305
00306 void G4OpenInventorXtExtendedViewer::EscapeCbk(
00307 Widget,XtPointer aData,XtPointer) {
00308 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
00309 This->Escape();
00310 }
00311
00312
00313 void G4OpenInventorXtExtendedViewer::EscapeFromKeyboardCbk(void* o) {
00314 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)o;
00315 This->Escape();
00316 }
00317
00318 void G4OpenInventorXtExtendedViewer::PostScriptCbk(
00319 Widget,XtPointer aData,XtPointer) {
00320 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
00321 This->WritePostScript();
00322 }
00323
00324 void G4OpenInventorXtExtendedViewer::PixmapPostScriptCbk(
00325 Widget,XtPointer aData,XtPointer) {
00326 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
00327 This->WritePixmapPostScript();
00328 }
00329
00330 void G4OpenInventorXtExtendedViewer::SceneGraphStatisticsCbk(
00331 Widget,XtPointer aData,XtPointer) {
00332 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
00333 This->SceneGraphStatistics();
00334 }
00335
00336 void G4OpenInventorXtExtendedViewer::WriteInventorCbk(
00337 Widget,XtPointer aData,XtPointer) {
00338 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
00339 This->WriteInventor();
00340 }
00341
00342 void G4OpenInventorXtExtendedViewer::EraseDetectorCbk(
00343 Widget,XtPointer aData,XtPointer) {
00344 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
00345 This->EraseDetector();
00346 }
00347
00348 void G4OpenInventorXtExtendedViewer::EraseEventCbk(
00349 Widget,XtPointer aData,XtPointer) {
00350 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
00351 This->EraseEvent();
00352 }
00353
00354 void G4OpenInventorXtExtendedViewer::SetSolidCbk(
00355 Widget,XtPointer aData,XtPointer) {
00356 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
00357 This->SetSolid();
00358 }
00359
00360 void G4OpenInventorXtExtendedViewer::SetWireFrameCbk(
00361 Widget,XtPointer aData,XtPointer) {
00362 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
00363 This->SetWireFrame();
00364 }
00365
00366 void G4OpenInventorXtExtendedViewer::SetReducedWireFrameCbk(
00367 Widget,XtPointer aData,XtPointer) {
00368 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
00369 This->SetReducedWireFrame(true);
00370 }
00371
00372 void G4OpenInventorXtExtendedViewer::SetFullWireFrameCbk(
00373 Widget,XtPointer aData,XtPointer) {
00374 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
00375 This->SetReducedWireFrame(false);
00376 }
00377
00378 void G4OpenInventorXtExtendedViewer::UpdateSceneCbk(
00379 Widget,XtPointer aData,XtPointer) {
00380 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
00381 This->UpdateScene();
00382 }
00383
00384 void G4OpenInventorXtExtendedViewer::SetPreviewCbk(
00385 Widget,XtPointer aData,XtPointer) {
00386 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
00387 This->SetPreview();
00388 }
00389
00390 void G4OpenInventorXtExtendedViewer::SetPreviewAndFullCbk(
00391 Widget,XtPointer aData,XtPointer) {
00392 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
00393 This->SetPreviewAndFull();
00394 }
00395
00396 void G4OpenInventorXtExtendedViewer::HelpCbk(
00397 Widget,XtPointer aData,XtPointer) {
00398 G4OpenInventorXtExtendedViewer* This = (G4OpenInventorXtExtendedViewer*)aData;
00399 XtManageChild(This->fHelpForm);
00400 XmTextSetString(This->fHelpText,(char*)This->Help().c_str());
00401 }
00402
00403 #endif