G4OpenInventorXtExtendedViewer.cc

Go to the documentation of this file.
00001 //
00002 // ********************************************************************
00003 // * License and Disclaimer                                           *
00004 // *                                                                  *
00005 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
00006 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
00007 // * conditions of the Geant4 Software License,  included in the file *
00008 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
00009 // * include a list of copyright holders.                             *
00010 // *                                                                  *
00011 // * Neither the authors of this software system, nor their employing *
00012 // * institutes,nor the agencies providing financial support for this *
00013 // * work  make  any representation or  warranty, express or implied, *
00014 // * regarding  this  software system or assume any liability for its *
00015 // * use.  Please see the license in the file  LICENSE  and URL above *
00016 // * for the full disclaimer and the limitation of liability.         *
00017 // *                                                                  *
00018 // * This  code  implementation is the result of  the  scientific and *
00019 // * technical work of the GEANT4 collaboration.                      *
00020 // * By using,  copying,  modifying or  distributing the software (or *
00021 // * any work based  on the software)  you  agree  to acknowledge its *
00022 // * use  in  resulting  scientific  publications,  and indicate your *
00023 // * acceptance of all terms of the Geant4 Software license.          *
00024 // ********************************************************************
00025 //
00026 //
00027 //
00028 /*
00029  * jck 05 Feb 1997 - Initial Implementation
00030  * jck 21 Apr 1997 
00031  *      Mods for SoXtHepViewer
00032  * gb : on Win32 use an SoXtExaminerViewer.
00033  * gb 05 April 2004 : revisit to separate Windows things.
00034  * gb 09 November 2004 : restore the escape button.
00035  * gb 09 November 2004 : have a menu bar in the viewer shell.
00036  * gb 09 November 2004 : have gl2ps file production.
00037  * gb 14 November 2004 : inherit G4OpenInventorViewer.
00038  */
00039 
00040 #ifdef G4VIS_BUILD_OIX_DRIVER
00041 
00042 // this :
00043 #include "G4OpenInventorXtExtendedViewer.hh"
00044 
00045 #include <Inventor/nodes/SoSelection.h>
00046 
00047 #include <Inventor/Xt/SoXt.h>
00048 
00049 //Replaces inclusion of SoXtExaminerViewer.h
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     // Check if user has specified an X-Windows-type geometry string...
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     //Create a shell window :
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     // FWJ (viewpoints don't work with this!)
00128     //    fViewer->setAutoClipping((SbBool)0);
00129 
00130     //XtSetArg(args[0],XmNtopAttachment   ,XmATTACH_FORM);
00131     //XtSetArg(args[1],XmNleftAttachment  ,XmATTACH_FORM);
00132     //XtSetArg(args[2],XmNrightAttachment ,XmATTACH_FORM);
00133     //XtSetArg(args[3],XmNbottomAttachment,XmATTACH_FORM);
00134     //Widget form = XmCreateForm (fShell,(char*)"form",args,4);
00135     //XtManageChild (form);
00136 
00137     Widget menuBar = fViewer->getMenuBar();
00138     
00139     //XtSetArg(args[0],XmNtopAttachment   ,XmATTACH_FORM);
00140     //XtSetArg(args[1],XmNleftAttachment  ,XmATTACH_FORM);
00141     //XtSetArg(args[2],XmNrightAttachment ,XmATTACH_FORM);
00142     //Widget menuBar = XmCreateMenuBar (form,(char*)"menuBar",args,3);
00143     //XtManageChild(menuBar);
00144 
00145    {Widget menu = fViewer->getMenu();
00146    //{Widget menu = AddMenu(menuBar,"File","File");
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 /*    AddButton(menu,"Set (G4) wire frame",SetWireFrameCbk);*/
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     //fViewer = new SoXtExaminerViewer(form,wName.c_str(),TRUE);
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   // Use our own SelectionCB for the Xt viewer to allow for abbreviated output
00201   // when picking a trajectory
00202   fSoSelection->removeSelectionCallback(G4OpenInventorViewer::SelectionCB,
00203                                         this);
00204 //  fSoSelection->addSelectionCallback(SelectionCB, this);
00205 
00206   fViewer->setSize(SbVec2s(width,height));
00207 
00208   // Have a GL2PS render action :
00209   const SbViewportRegion& vpRegion = fViewer->getViewportRegion();
00210   fGL2PSAction = new SoGL2PSAction(vpRegion);
00211   fViewer->setGLRenderAction(fGL2PSAction);
00212 
00213   // Else :
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   // TJR added:
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     //FIXME : SGI : the below "delete" block things.
00233     //FIXME : CoinXt : the below "delete" crashe in ~SoXtRenderArea.
00234     //FIXME : delete fViewer;
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   // Background.
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   // Pulldown menu :
00272   Widget menu = XmCreatePulldownMenu(aMenuBar,(char*)aName.c_str(),NULL,0);
00273   // Cascade button :
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 // Allow escape from X event loop via key
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

Generated on Mon May 27 17:49:12 2013 for Geant4 by  doxygen 1.4.7