Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/visualization/OpenInventor/src/G4OpenInventorXtExaminerViewer.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /visualization/OpenInventor/src/G4OpenInventorXtExaminerViewer.cc (Version 11.3.0) and /visualization/OpenInventor/src/G4OpenInventorXtExaminerViewer.cc (Version 9.0)


  1 //                                                  1 
  2 // *******************************************    
  3 // * License and Disclaimer                       
  4 // *                                              
  5 // * The  Geant4 software  is  copyright of th    
  6 // * the Geant4 Collaboration.  It is provided    
  7 // * conditions of the Geant4 Software License    
  8 // * LICENSE and available at  http://cern.ch/    
  9 // * include a list of copyright holders.         
 10 // *                                              
 11 // * Neither the authors of this software syst    
 12 // * institutes,nor the agencies providing fin    
 13 // * work  make  any representation or  warran    
 14 // * regarding  this  software system or assum    
 15 // * use.  Please see the license in the file     
 16 // * for the full disclaimer and the limitatio    
 17 // *                                              
 18 // * This  code  implementation is the result     
 19 // * technical work of the GEANT4 collaboratio    
 20 // * By using,  copying,  modifying or  distri    
 21 // * any work based  on the software)  you  ag    
 22 // * use  in  resulting  scientific  publicati    
 23 // * acceptance of all terms of the Geant4 Sof    
 24 // *******************************************    
 25 //                                                
 26 //                                                
 27 // Open Inventor Xt Extended Viewer - 30 Oct 2    
 28 // Rastislav Ondrasek, Pierre-Luc Gagnon, Fred    
 29                                                   
 30 #include <stdio.h>                                
 31 #include <string.h>                               
 32 #include <string>                                 
 33 #include <sstream>                                
 34 #include <cmath>                                  
 35 #include <iostream>                               
 36 #include <iomanip>                                
 37 #include <cstdio>                                 
 38 #include <algorithm> // For using sort on a ve    
 39 #include <X11/keysym.h>                           
 40                                                   
 41 #include <Xm/Xm.h>                                
 42 #include <Xm/Text.h>                              
 43 #include <Xm/List.h>                              
 44 #include <Xm/MessageB.h>                          
 45 #include <Xm/PushB.h>                             
 46 #include <Xm/ToggleB.h>                           
 47 #include <Xm/CascadeB.h>                          
 48 #include <Xm/ArrowBG.h>                           
 49 #include <Xm/Form.h>                              
 50 #include <Xm/RowColumn.h>                         
 51 #include <Xm/FileSB.h>                            
 52 #include <Xm/SelectioB.h>                         
 53 #include <Xm/Protocols.h>                         
 54 #include <Xm/SeparatoG.h>                         
 55 #include <Xm/DialogS.h>                           
 56 #include <Xm/PanedW.h>                            
 57 #include <Xm/LabelG.h>                            
 58 #include <Xm/Scale.h>                             
 59 #include <Xm/DrawingA.h>                          
 60                                                   
 61 #include <Inventor/Xt/SoXt.h>                     
 62 //#include <Inventor/Xt/SoXtInternal.h>           
 63 #include <Inventor/Xt/SoXtCursor.h>               
 64 #include <Inventor/events/SoKeyboardEvent.h>      
 65 #include <Inventor/events/SoMouseButtonEvent.h    
 66 #include <Inventor/events/SoLocation2Event.h>     
 67 #include <Inventor/nodes/SoSeparator.h>           
 68 #include <Inventor/nodes/SoOrthographicCamera.    
 69 #include <Inventor/nodes/SoPerspectiveCamera.h    
 70 // FWJ moved to header file                       
 71 //#include <Inventor/nodes/SoEventCallback.h>     
 72 #include <Inventor/nodes/SoLineSet.h>             
 73 #include <Inventor/nodes/SoMaterial.h>            
 74 #include <Inventor/errors/SoDebugError.h>         
 75 #include <Inventor/SoPickedPoint.h>               
 76 #include <Inventor/actions/SoWriteAction.h>       
 77                                                   
 78 #include "G4OpenInventorXtExaminerViewer.hh"      
 79 #include "wheelmouse.h"  // To use mouse scrol    
 80 #include "SoXtInternal.h"                         
 81 #include <Inventor/sensors/SoTimerSensor.h>       
 82 #include <Inventor/sensors/SoNodeSensor.h>        
 83 #include "saveViewPt.h"                           
 84 #include "pickext.h"                              
 85 #include "pickref.h"                              
 86 #include "wireframe.h"                            
 87 //#include "console.h"                            
 88 //#include "favorites.h"                          
 89                                                   
 90 #include "Geant4_SoPolyhedron.h"                  
 91 //#include "G4RunManager.hh"                      
 92 //#include "G4Run.hh"                             
 93 #include "G4TrajectoryPoint.hh"                   
 94 #include "G4AttHolder.hh"                         
 95 #include "G4AttCheck.hh"                          
 96                                                   
 97 #include <Inventor/nodes/SoCallback.h>            
 98 #include <Inventor/nodes/SoSwitch.h>              
 99 #include <Inventor/nodes/SoScale.h>               
100 #include <Inventor/nodes/SoTranslation.h>         
101 #include <Inventor/actions/SoSearchAction.h>      
102 #include <Inventor/actions/SoGetBoundingBoxAct    
103                                                   
104 #include <Inventor/nodes/SoCoordinate3.h>         
105 // For rendering distance during animation:       
106 #include <Inventor/nodes/SoText2.h>               
107 #include <Inventor/nodes/SoFont.h>                
108 #include <Inventor/nodes/SoPointSet.h>            
109 #include <Inventor/nodes/SoDrawStyle.h>           
110 #include <Inventor/nodes/SoBaseColor.h>           
111                                                   
112 // For searching for nodes within kits:           
113 #include <Inventor/nodekits/SoBaseKit.h>          
114                                                   
115 // FWJ                                            
116 #include <Inventor/SbVec3f.h>                     
117                                                   
118 G4OpenInventorXtExaminerViewer* G4OpenInventor    
119                                                   
120 static const char* thisClassName = "G4OpenInve    
121                                                   
122 #define MIN_SPEED  2.1        // Lower number     
123 #define START_STEP 0.3                            
124 #define SPEED_INDICATOR_STEP 0.045                
125 #define MAX_SPEED_INDICATOR  0.81                 
126 // Number of steps 90 degree rotation around a    
127 #define ROT_CNT 6                                 
128                                                   
129 // Public constructor                             
130 G4OpenInventorXtExaminerViewer::G4OpenInventor    
131                 const char *name, SbBool embed    
132     SoXtFullViewer::BuildFlag flag, SoXtViewer    
133    SoXtExaminerViewer(parent, name, embed, fla    
134 {                                                 
135 // Tell GLWidget not to build just yet            
136    this->constructor(TRUE);                       
137 }                                                 
138                                                   
139 // Protected constructor for classes deriving     
140 G4OpenInventorXtExaminerViewer::G4OpenInventor    
141                 const char *name, SbBool embed    
142                 SoXtFullViewer::BuildFlag flag    
143                 SbBool build) :                   
144    SoXtExaminerViewer(parent, name, embed, fla    
145 {                                                 
146    this->constructor(build);                      
147 }                                                 
148                                                   
149 // Called by all constructors to set up widget    
150 void G4OpenInventorXtExaminerViewer::construct    
151 {                                                 
152    setClassName(thisClassName);                   
153                                                   
154    hookBeamOn = new HookEventProcState(this);     
155    this->newEvents = false;                       
156                                                   
157    fileName = ".bookmarkFile"; // Default view    
158    viewPtIdx = -1; // index of the most recent    
159    animateSensor = new SoTimerSensor(             
160                        G4OpenInventorXtExamine    
161    animateSensorRotation = new SoTimerSensor(     
162                G4OpenInventorXtExaminerViewer:    
163    animateBtwPtsPeriod = MIN_SPEED;               
164    currentState = GENERAL;                        
165    myCam = new SoPerspectiveCamera;               
166    MAX_VP_IDX = 3;                                
167    MAX_VP_NAME = 35; // Max length of a viewpo    
168    rotCnt = ROT_CNT; // For 90 degree rotation    
169    curViewPtName = new char[MAX_VP_NAME + 1];     
170    left_right = up_down = 0; // For movements     
171    speedStep = START_STEP; // For smoother ani    
172    rotUpVec = false; // Used during scene elem    
173    step = 1;  //By default                        
174    // Used for moving along the beam with the     
175    // mouse instead of rotating the view          
176    lshiftdown = rshiftdown = false;               
177    // Used for rotating the view with the came    
178    // staying in place                            
179    lctrldown = rctrldown = false;                 
180    // Used to send abbreviated output to the c    
181    abbrOutputFlag = false;                        
182    pickRefPathFlag = false;                       
183    prevColorField = NULL;                         
184    warningFlag = false; // We come from the wa    
185    viewer = this;                                 
186    openFileDialog = newFileDialog = listsDialo    
187    loadRefCoordsDialog = saveRefCoordsDialog =    
188    loadSceneGraphDialog = saveSceneGraphDialog    
189    myElementList = NULL;                          
190    // FWJ default path look-ahead                 
191    pathLookahead = 5;                             
192                                                   
193    newSceneGraph = NULL;                          
194    zcoordSetFlag = false;                         
195                                                   
196    //////////////////////////SUPERIMPOSED SCEN    
197    searcher = NULL;                               
198    // Used in animation; progressively scaled     
199    maxSpeed = 0.0f;                               
200                                                   
201    static const char * superimposed[] = {         
202       "#Inventor V2.1 ascii", "",                 
203       "Separator ",                               
204       "{",                                        
205       " MaterialBinding ",                        
206       " {",                                       
207       "     value OVERALL",                       
208       " }",                                       
209       "   OrthographicCamera ",                   
210       " {",                                       
211       "     height 1",                            
212       "   nearDistance 0",                        
213       "     farDistance 1",                       
214       " }",                                       
215       "   DEF soxt->callback Callback { }",       
216       "   Separator ",                            
217       " {",                                       
218       "     DEF soxt->translation Translation     
219       "   {",                                     
220       "         translation 0 0 0",               
221       "     }",                                   
222       "     DEF soxt->scale Scale ",              
223       "   {",                                     
224       "         scaleFactor 1 1 1",               
225       "     }",                                   
226       "   DEF soxt->geometry Coordinate3 ",       
227       "   {",                                     
228       "       point ",                            
229       "     [",                                   
230       "         -0.81 -0.04 0,  -0.81 0   0,",    
231       "           -0.81 0.04  0,  0     -0.04     
232       "           0       0     0,  0       0.    
233       "           0.81  -0.04   0,  0.81    0     
234       "           0.81    0.04  0,",              
235       "           0       0.02  0,", // idx 9     
236       "           0.81    0.02  0,  0.81  -0.0    
237       "           0     -0.02   0,",              
238       "           0       0.01  0,", // idx 13    
239       "           0.4     0.01  0,  0.4   -0.0    
240       "           0     -0.01   0",               
241       "     ]",                                   
242       "   }",                                     
243       // current speed indicator (outline)        
244       "     DEF soxt->animSpeedOutlineSwitch S    
245       "   {",                                     
246       "         whichChild -3",                   
247       "         Material ",                       
248       "     {",                                   
249       "            emissiveColor 0 0 0",          
250       "       }",                                 
251       "         IndexedFaceSet ",                 
252       "     {",                                   
253       "           coordIndex ",                   
254       "       [",                                 
255       "               12, 11, 10, 9, -1",         
256       "             ]",                           
257       "         }",                               
258       "      }",                                  
259       // the coordinate system                    
260       "     DEF soxt->axisSwitch Switch ",        
261       "   {",                                     
262       "         whichChild -3",                   
263       "         BaseColor ",                      
264       "     {",                                   
265       "             rgb 1 1 1",                   
266       "         }",                               
267       "         IndexedLineSet ",                 
268       "     {",                                   
269       "           coordIndex ",                   
270       "       [",                                 
271       "               0, 2, -1,",                 
272       "               3, 5, -1,",                 
273       "               6, 8, -1,",                 
274       "               1, 7, -1",                  
275       "             ]",                           
276       "         }",                               
277       "     }",                                   
278       // current speed indicator                  
279       "     DEF soxt->animSpeedSwitch Switch "    
280       "   {",                                     
281       "         whichChild -3",                   
282       "         Material ",                       
283       "     {",                                   
284       "           emissiveColor 0 1 0",           
285       "         }",                               
286       "     IndexedFaceSet ",                     
287       "     {",                                   
288       "         coordIndex ",                     
289       "       [",                                 
290       "               16, 15, 14, 13, -1",        
291       "           ]",                             
292       "         }",                               
293       "     }",                                   
294       "   }",                                     
295       // For displaying either z position (dur    
296       " DEF soxt->curInfoSwitch Switch ",         
297       " {",                                       
298       "   whichChild -3",                         
299       "     DEF soxt->curInfoTrans Translation    
300       "   {",                                     
301       "         translation 10 20 30    ",        
302       "   }",                                     
303       "     DEF soxt->curInfoFont Font ",         
304       "   {",                                     
305       "         name defaultFont:Bold",           
306       "         size 16",                         
307       "     }",                                   
308       "   DEF soxt->curInfoText Text2 ",          
309       "   {",                                     
310       "         string Hello",                    
311       "     }",                                   
312       " }",                                       
313       // Need to use different fields for mous    
314       // because newlines are ignored when the    
315       " Separator ",                              
316       " {",                                       
317       "     DEF soxt->mouseOverTransLogName Tr    
318       "   {",                                     
319       "         translation 0 0 0    ",           
320       "   }",                                     
321       "     DEF soxt->mouseOverFontLogName Fon    
322       "   {",                                     
323       "         name defaultFont:Bold",           
324       "         size 16",                         
325       "     }",                                   
326       "   DEF soxt->mouseOverTextLogName Text2    
327       " }",                                       
328       " Separator ",                              
329       " {",                                       
330       "     DEF soxt->mouseOverTransSolid Tran    
331       "   {",                                     
332       "         translation 0 0 0    ",           
333       "   }",                                     
334       "     DEF soxt->mouseOverFontSolid Font     
335       "   {",                                     
336       "         name defaultFont:Bold",           
337       "         size 16",                         
338       "     }",                                   
339       "   DEF soxt->mouseOverTextSolid Text2 {    
340       " }",                                       
341       " Separator ",                              
342       " {",                                       
343       "     DEF soxt->mouseOverTransMaterial T    
344       "   {",                                     
345       "         translation 0 0 0    ",           
346       "   }",                                     
347       "     DEF soxt->mouseOverFontMaterial Fo    
348       "   {",                                     
349       "         name defaultFont:Bold",           
350       "         size 16",                         
351       "     }",                                   
352       "   DEF soxt->mouseOverTextMaterial Text    
353       " }",                                       
354       " Separator ",                              
355       " {",                                       
356       "     DEF soxt->mouseOverTransZPos Trans    
357       "   {",                                     
358       "         translation 0 0 0    ",           
359       "   }",                                     
360       "     DEF soxt->mouseOverFontZPos Font "    
361       "   {",                                     
362       "         name defaultFont:Bold",           
363       "         size 16",                         
364       "     }",                                   
365       "   DEF soxt->mouseOverTextZPos Text2 {     
366       " }",                                       
367       "}", NULL                                   
368    };                                             
369                                                   
370    int i, bufsize;                                
371    for (i = bufsize = 0; superimposed[i]; i++)    
372       bufsize += strlen(superimposed[i]) + 1;     
373    char * buf = new char[bufsize + 1];            
374    for (i = bufsize = 0; superimposed[i]; i++)    
375       strcpy(buf + bufsize, superimposed[i]);     
376       bufsize += strlen(superimposed[i]);         
377       buf[bufsize] = '\n';                        
378       bufsize++;                                  
379    }                                              
380    SoInput * input = new SoInput;                 
381    input->setBuffer(buf, bufsize);                
382    SbBool ok = SoDB::read(input, this->superim    
383    (void)ok;   // FWJ added to avoid compiler     
384    assert(ok);                                    
385    delete input;                                  
386    delete[] buf;                                  
387    this->superimposition->ref();                  
388                                                   
389    this->sscale = (SoScale *) this->getSuperim    
390                                  this->superim    
391    this->stranslation = (SoTranslation *) this    
392                                  this->superim    
393    this->sgeometry = (SoCoordinate3 *) this->g    
394                                  this->superim    
395    this->axisSwitch = (SoSwitch *) this->getSu    
396                                  this->superim    
397    this->animSpeedOutlineSwitch = (SoSwitch *)    
398                        this->superimposition,     
399    this->animSpeedSwitch = (SoSwitch *) this->    
400                        this->superimposition,     
401    this->curInfoSwitch = (SoSwitch *) this->ge    
402                              this->superimposi    
403    this->curInfoTrans = (SoTranslation *) this    
404                              this->superimposi    
405    this->curInfoFont = (SoFont *) this->getSup    
406                              this->superimposi    
407    this->curInfoText = (SoText2 *) this->getSu    
408                              this->superimposi    
409    this->mouseOverTransLogName = (SoTranslatio    
410                    this->superimposition, "sox    
411    this->mouseOverFontLogName = (SoFont *) thi    
412                    this->superimposition, "sox    
413    this->mouseOverTextLogName = (SoText2 *) th    
414                    this->superimposition, "sox    
415    this->mouseOverTransSolid = (SoTranslation     
416                    this->superimposition, "sox    
417    this->mouseOverFontSolid = (SoFont *) this-    
418                    this->superimposition, "sox    
419    this->mouseOverTextSolid = (SoText2 *) this    
420                    this->superimposition, "sox    
421    this->mouseOverTransMaterial = (SoTranslati    
422                    this->superimposition, "sox    
423    this->mouseOverFontMaterial = (SoFont *) th    
424                    this->superimposition, "sox    
425    this->mouseOverTextMaterial = (SoText2 *) t    
426                    this->superimposition, "sox    
427    this->mouseOverTransZPos = (SoTranslation *    
428                    this->superimposition, "sox    
429    this->mouseOverFontZPos = (SoFont *) this->    
430                    this->superimposition, "sox    
431    this->mouseOverTextZPos = (SoText2 *) this-    
432                    this->superimposition, "sox    
433                                                   
434    SoCallback * cb = (SoCallback *) this->getS    
435                    this->superimposition, "sox    
436    cb->setCallback(superimpositionCB, this);      
437                                                   
438    this->addSuperimposition(this->superimposit    
439    this->setSuperimpositionEnabled(this->super    
440    axisSwitch->whichChild.setValue(SO_SWITCH_N    
441    animSpeedOutlineSwitch->whichChild.setValue    
442    animSpeedSwitch->whichChild.setValue(SO_SWI    
443                                                   
444    /////////////////////\SUPERIMPOSED SCENE///    
445                                                   
446    // Build everything else like the parent vi    
447    if (build) {                                   
448       Widget w = buildWidget(getParentWidget()    
449       setBaseWidget(w);                           
450                                                   
451       // Make this window a little bigger beca    
452       // FWJ but it is already set to 600x600     
453       //      setSize(SbVec2s(500, 550));         
454    }                                              
455                                                   
456 }                                                 
457                                                   
458                                                   
459 // Static function that returns the pointer to    
460 // FWJ DISABLED                                   
461 //G4OpenInventorXtExaminerViewer *G4OpenInvent    
462 //{                                               
463 //   if (!viewer)                                 
464 //      new G4OpenInventorXtExaminerViewer();     
465 //   return viewer;                               
466 //}                                               
467                                                   
468                                                   
469 // This method locates a named node in the sup    
470 SoNode *                                          
471 G4OpenInventorXtExaminerViewer::getSuperimposi    
472                                                   
473 {                                                 
474    if (!this->searcher)                           
475       this->searcher = new SoSearchAction;        
476    searcher->reset();                             
477    searcher->setName(SbName(name));               
478    searcher->setInterest(SoSearchAction::FIRST    
479    searcher->setSearchingAll(TRUE);               
480    searcher->apply(root);                         
481    assert(searcher->getPath());                   
482    return searcher->getPath()->getTail();         
483 }                                                 
484                                                   
485                                                   
486 void G4OpenInventorXtExaminerViewer::superimpo    
487                                                   
488 {                                                 
489    if (closure)                                   
490       ((G4OpenInventorXtExaminerViewer*)closur    
491 }                                                 
492                                                   
493                                                   
494 // Renders and positions speed indicator and l    
495 // distance/viewpoint name on the drawing canv    
496 void G4OpenInventorXtExaminerViewer::superimpo    
497 {                                                 
498                                                   
499    if (!action->isOfType(SoGLRenderAction::get    
500       return;                                     
501    SbViewportRegion vpRegion =                    
502       ((SoGLRenderAction *) action)->getViewpo    
503    SbVec2s viewportSize = vpRegion.getViewport    
504                                                   
505    float aspect = float(viewportSize[0]) / flo    
506    float factorx = 1.0f / float(viewportSize[1    
507    float factory = factorx;                       
508                                                   
509    if (aspect > 1.0f) {                           
510       this->stranslation->translation.setValue    
511    } else {                                       
512       this->stranslation->translation.setValue    
513                        SbVec3f(0.0f, -0.4f / a    
514       factorx /= aspect;                          
515       factory /= aspect;                          
516    }                                              
517    if (viewportSize[0] > 500)                     
518       factorx *= 500.0f / 400.0f;                 
519    else                                           
520       factorx *= float(viewportSize[0]) / 400.    
521    this->sscale->scaleFactor.setValue(SbVec3f(    
522                                                   
523    float xInfo, yInfo, xMouseLogName, yMouseLo    
524       xMouseMaterial, yMouseMaterial, xMouseZP    
525    xInfo = -.45;                                  
526    yInfo = .45;                                   
527    xMouseLogName = 0.0;                           
528    yMouseLogName = -.75;                          
529    xMouseSolid = 0.0;                             
530    yMouseSolid = -.78;                            
531    xMouseMaterial = 0.0;                          
532    yMouseMaterial = -.81;                         
533    xMouseZPos = 0.0;                              
534    yMouseZPos = -.84;                             
535                                                   
536    if (aspect > 1.0f) {                           
537       xInfo *= aspect;                            
538       xMouseSolid *= aspect;                      
539       xMouseMaterial *= aspect;                   
540       this->curInfoTrans->translation.setValue    
541       this->mouseOverTransLogName->translation    
542                         SbVec3f(xMouseLogName,    
543       this->mouseOverTransSolid->translation.s    
544                         SbVec3f(xMouseSolid, y    
545       this->mouseOverTransMaterial->translatio    
546                         SbVec3f(xMouseMaterial    
547       this->mouseOverTransZPos->translation.se    
548                         SbVec3f(xMouseZPos, yM    
549    } else {                                       
550       yInfo /= aspect;                            
551       yMouseSolid /= aspect;                      
552       yMouseMaterial /= aspect;                   
553       this->curInfoTrans->translation.setValue    
554       this->mouseOverTransLogName->translation    
555                         SbVec3f(xMouseLogName,    
556       this->mouseOverTransSolid->translation.s    
557                         SbVec3f(xMouseSolid, y    
558       this->mouseOverTransMaterial->translatio    
559                         SbVec3f(xMouseMaterial    
560       this->mouseOverTransZPos->translation.se    
561                         SbVec3f(xMouseZPos, yM    
562    }                                              
563                                                   
564    if (currentState == VIEWPOINT) { // Display    
565       this->curInfoFont->size.setValue(15);       
566       this->curInfoFont->name.setValue("defaul    
567       this->curInfoText->string.setValue(SbStr    
568    }                                              
569    else if(currentState == GENERAL) { // Displ    
570       this->curInfoFont->size.setValue(16);       
571       this->curInfoFont->name.setValue("defaul    
572       this->curInfoText->string.setValue(SbStr    
573    }                                              
574    else {                                         
575       if (refParticleIdx < (int) refParticleTr    
576          this->curInfoFont->size.setValue(16);    
577          this->curInfoFont->name.setValue("def    
578          char zPos[20];                           
579          snprintf(zPos, sizeof zPos, "%7.2f [m    
580          this->curInfoText->string.setValue(Sb    
581       }                                           
582    }                                              
583 }                                                 
584                                                   
585                                                   
586 G4OpenInventorXtExaminerViewer::~G4OpenInvento    
587 {                                                 
588    if (superimposition != NULL) {                 
589       removeSuperimposition(superimposition);     
590       superimposition->unref();                   
591       superimposition = NULL;                     
592    }                                              
593    if (animateSensor->isScheduled())              
594       animateSensor->unschedule();                
595    delete animateSensor;                          
596    delete sceneChangeSensor;                      
597                                                   
598    delete[] curViewPtName;                        
599    delete searcher;                               
600                                                   
601    viewer = 0;                                    
602 }                                                 
603                                                   
604                                                   
605 // Adds a menu bar and a few menu items to the    
606 Widget G4OpenInventorXtExaminerViewer::buildWi    
607 {                                                 
608    Widget shell;                                  
609    Atom WM_DELETE_WINDOW;                         
610                                                   
611    if (!parent)                                   
612       SoDebugError::post("G4OpenInventorXtExam    
613                                                   
614    Arg args[10];                                  
615    XtSetArg(args[0], XmNtopAttachment, XmATTAC    
616    XtSetArg(args[1], XmNleftAttachment, XmATTA    
617    XtSetArg(args[2], XmNrightAttachment, XmATT    
618    XtSetArg(args[3], XmNbottomAttachment, XmAT    
619    Widget form = XmCreateForm(parent, (char *)    
620    XtManageChild(form);                           
621                                                   
622    shell = XtParent(form);                        
623    WM_DELETE_WINDOW = XInternAtom(XtDisplay(pa    
624                                   False);         
625    XmAddWMProtocolCallback(shell, WM_DELETE_WI    
626                            (XtCallbackProc)clo    
627                                                   
628    XtSetArg(args[0], XmNtopAttachment, XmATTAC    
629    XtSetArg(args[1], XmNleftAttachment, XmATTA    
630    XtSetArg(args[2], XmNrightAttachment, XmATT    
631    menuBar = XmCreateMenuBar(form, (char *) "M    
632    XtManageChild(menuBar);                        
633                                                   
634    fileMenu = addMenu("File");                    
635    this->addButton(fileMenu, "Open Viewpoint F    
636    addButton(fileMenu, "New Viewpoint File", n    
637    addButton(fileMenu, "Load Ref. Coords", loa    
638    addButton(fileMenu, "Save Ref. Coords", sav    
639    addButton(fileMenu, "Load Scene Graph", loa    
640    addButton(fileMenu, "Save Scene Graph", sav    
641    XtManageChild(                                 
642           XmCreateSeparatorGadget(fileMenu, (c    
643                                                   
644    Widget menu = addMenu("Tools");                
645    addButton(menu, "Animate Ref. Particle", an    
646    addButton(menu, "Go to start of Ref path",     
647    addButton(menu, "Invert Ref path", invertRe    
648                                                   
649    Widget viewerBase = SoXtFullViewer::buildWi    
650                                                   
651    XtSetArg(args[0], XmNtopAttachment, XmATTAC    
652    XtSetArg(args[1], XmNtopWidget, menuBar);      
653    XtSetArg(args[2], XmNleftAttachment, XmATTA    
654    XtSetArg(args[3], XmNrightAttachment, XmATT    
655    XtSetArg(args[4], XmNbottomAttachment, XmAT    
656    XtSetValues(viewerBase, args, 5);              
657                                                   
658    return viewerBase;                             
659 }                                                 
660                                                   
661                                                   
662 // Adds a new menu to menuBar                     
663 Widget G4OpenInventorXtExaminerViewer::addMenu    
664 {                                                 
665    Arg args[1];                                   
666    Widget menu = XmCreatePulldownMenu(menuBar,    
667                                                   
668    XtSetArg(args[0], XmNsubMenuId, menu);         
669    Widget w = XmCreateCascadeButton(menuBar, (    
670    XtManageChild(w);                              
671                                                   
672    return menu;                                   
673 }                                                 
674                                                   
675                                                   
676 // Adds a new button to menu                      
677 void G4OpenInventorXtExaminerViewer::addButton    
678                                              X    
679 {                                                 
680    Widget button = XmCreatePushButton(menu, (c    
681    XtManageChild(button);                         
682    XtAddCallback(button, XmNactivateCallback,     
683 }                                                 
684                                                   
685                                                   
686 // Overloaded for saving of and browsing throu    
687 void G4OpenInventorXtExaminerViewer::createVie    
688                                                   
689 {                                                 
690    int n;                                         
691    Arg args[6];                                   
692    Widget saveViewPtButton, abbrOutputButton,     
693    Widget switchWireFrameButton;                  
694                                                   
695    // Create original buttons                     
696    SoXtExaminerViewer::createViewerButtons(par    
697                                                   
698    // Handle disappearing button caused by SoX    
699    Widget emptyButton = XtVaCreateManagedWidge    
700                                                   
701    buttonlist->append(emptyButton);               
702                                                   
703    // Left arrow that goes back one view point    
704    n = 0;                                         
705    XtSetArg(args[n], XmNtopPosition, 1);  n++;    
706    XtSetArg(args[n], XmNbottomPosition, 2); n+    
707    XtSetArg(args[n], XmNleftPosition, 0); n++;    
708    XtSetArg(args[n], XmNrightPosition, 1);  n+    
709    XtSetArg(args[n], XmNarrowDirection, XmARRO    
710    XtSetArg(args[n], XmNsensitive, False);  n+    
711    prevViewPtButton = XmCreateArrowButtonGadge    
712                                                   
713    XtManageChild(prevViewPtButton);               
714    XtAddCallback(prevViewPtButton, XmNactivate    
715                  G4OpenInventorXtExaminerViewe    
716    buttonlist->append(prevViewPtButton);          
717                                                   
718    // Right arrow that goes forward one view p    
719    n = 0;                                         
720    XtSetArg(args[n], XmNtopPosition, 1);  n++;    
721    XtSetArg(args[n], XmNbottomPosition, 2); n+    
722    XtSetArg(args[n], XmNleftPosition, 0); n++;    
723    XtSetArg(args[n], XmNrightPosition, 1);  n+    
724    XtSetArg(args[n], XmNarrowDirection, XmARRO    
725    XtSetArg(args[n], XmNsensitive, False);  n+    
726    nextViewPtButton = XmCreateArrowButtonGadge    
727                                                   
728    XtManageChild(nextViewPtButton);               
729    XtAddCallback(nextViewPtButton, XmNactivate    
730                  G4OpenInventorXtExaminerViewe    
731    buttonlist->append(nextViewPtButton);          
732                                                   
733    // Save button for storing current camera p    
734    saveViewPtButton = XtVaCreateManagedWidget(    
735                                                   
736    XtAddCallback(saveViewPtButton, XmNactivate    
737                  G4OpenInventorXtExaminerViewe    
738    Pixmap saveVP, saveVP_ins;                     
739    saveVP = SoXtInternal::createPixmapFromXpm(    
740                                                   
741    saveVP_ins = SoXtInternal::createPixmapFrom    
742                                                   
743    XtVaSetValues(saveViewPtButton, XmNlabelTyp    
744                  saveVP, XmNselectPixmap, save    
745                  saveVP_ins, XmNselectInsensit    
746    buttonlist->append(saveViewPtButton);          
747                                                   
748    // Toggle button to get abbreviated output     
749    abbrOutputButton = XtVaCreateManagedWidget(    
750                                                   
751    XtAddCallback(abbrOutputButton, XmNdisarmCa    
752                  this);                           
753    Pixmap pickextxpm, pickextxpm_ins;             
754    pickextxpm = SoXtInternal::createPixmapFrom    
755                                                   
756    pickextxpm_ins = SoXtInternal::createPixmap    
757                                                   
758    XtVaSetValues(abbrOutputButton, XmNlabelTyp    
759                  pickextxpm, XmNselectPixmap,     
760                  pickextxpm_ins, XmNselectInse    
761    //   Pixmap consolexpm, consolexpm_ins;        
762    // consolexpm = SoXtInternal::createPixmapF    
763    //                                             
764    // consolexpm_ins = SoXtInternal::createPix    
765    //                                             
766    // XtVaSetValues(abbrOutputButton, XmNlabel    
767    //               consolexpm, XmNselectPixma    
768    //               consolexpm_ins, XmNselectI    
769    buttonlist->append(abbrOutputButton);          
770                                                   
771    // Button for selecting the beam that will     
772    pickRefPathButton = XtVaCreateManagedWidget    
773                                                   
774    XtAddCallback(pickRefPathButton, XmNactivat    
775                  G4OpenInventorXtExaminerViewe    
776    Pixmap pickrefxpm, pickrefxpm_ins;             
777    pickrefxpm = SoXtInternal::createPixmapFrom    
778                                                   
779    pickrefxpm_ins = SoXtInternal::createPixmap    
780                                                   
781    XtVaSetValues(pickRefPathButton, XmNlabelTy    
782        pickrefxpm, XmNselectPixmap, pickrefxpm    
783        pickrefxpm_ins, XmNselectInsensitivePix    
784                                                   
785    buttonlist->append(pickRefPathButton);         
786                                                   
787    // Toggle button for switching in and out o    
788    switchWireFrameButton = XtVaCreateManagedWi    
789          xmToggleButtonWidgetClass, parent,  X    
790    XtAddCallback(switchWireFrameButton, XmNval    
791                  G4OpenInventorXtExaminerViewe    
792    Pixmap wireframe, wireframe_ins;               
793    wireframe = SoXtInternal::createPixmapFromX    
794                                                   
795    wireframe_ins = SoXtInternal::createPixmapF    
796                                                   
797    XtVaSetValues(switchWireFrameButton, XmNlab    
798               wireframe, XmNselectPixmap, wire    
799               wireframe_ins, XmNselectInsensit    
800    buttonlist->append(switchWireFrameButton);     
801 }                                                 
802                                                   
803                                                   
804 // Called right after buttons and widgets get     
805 // It sets the viewpoint last accessed.           
806 void G4OpenInventorXtExaminerViewer::afterReal    
807 {                                                 
808    SoXtExaminerViewer::afterRealizeHook();        
809                                                   
810    // Default height is used when selecting an    
811    // FWJ Added defaultHeight for Ortho camera    
812    SoCamera *cam = getCamera();                   
813    if (cam) {                                     
814       if (cam->isOfType(SoPerspectiveCamera::g    
815          defaultHeightAngle =                     
816             ((SoPerspectiveCamera *) cam)->hei    
817          toggleCameraType();                      
818          defaultHeight =                          
819             ((SoOrthographicCamera *) cam)->he    
820          toggleCameraType();                      
821       } else {                                    
822          defaultHeight =                          
823             ((SoOrthographicCamera *) cam)->he    
824          toggleCameraType();                      
825          cam = getCamera();                       
826          if (cam->isOfType(SoPerspectiveCamera    
827             defaultHeightAngle =                  
828                ((SoPerspectiveCamera *) cam)->    
829          toggleCameraType();                      
830       }                                           
831    }                                              
832                                                   
833    // Open the default bookmark file              
834    fileIn.open(fileName.c_str());                 
835    if (!fileIn.fail()) {                          
836       if (!loadViewPts()) {                       
837          String dialogName = (char *) "Error L    
838          std::string msg = "Wrong or corrupted    
839          warningMsgDialog(msg, dialogName, NUL    
840       } else {                                    
841          // Opens a file without erasing it       
842          fileOut.open(fileName.c_str(), std::i    
843          fileOut.seekp(0, std::ios::end); // F    
844          constructListsDialog(getParentWidget(    
845          if (viewPtList.size()) {                 
846             // FWJ disabled auto-selection of     
847             // Initial view should be user-con    
848             //    setViewPt();                    
849             XtSetSensitive(nextViewPtButton, T    
850             XtSetSensitive(prevViewPtButton, T    
851          }                                        
852       }                                           
853       fileIn.close();                             
854    } else {                                       
855       // Creates a new default bookmark file      
856       fileOut.open(fileName.c_str());             
857       constructListsDialog(getParentWidget(),     
858    }                                              
859                                                   
860    fileIn.clear();                                
861                                                   
862    SoSeparator *root = (SoSeparator *) (getSce    
863    if (root == NULL)                              
864       SoDebugError::post("G4OpenInventorXtExam    
865    else {                                         
866       root->addChild(myCam); // For position/o    
867    }                                              
868                                                   
869    sceneChangeSensor = new SoNodeSensor;          
870    sceneChangeSensor->setFunction(sceneChangeC    
871    sceneChangeSensor->attach(root);               
872    sceneChangeSensor->setData(this);              
873                                                   
874    // Monitor mouseover events for displaying     
875    // An SoEventCallback is needed instead of     
876    // because that last one does not provide u    
877    // that was picked                             
878    SoEventCallback *moCB = new SoEventCallback    
879    moCB->addEventCallback(                        
880                           SoLocation2Event::ge    
881                           mouseoverCB, static_    
882    root->addChild(moCB);                          
883                                                   
884    // Override the default picking mechanism p    
885    // because we want abbreviated output when     
886    SoEventCallback *pickCB = new SoEventCallba    
887    pickCB->addEventCallback(                      
888                             SoMouseButtonEvent    
889                             pickingCB, static_    
890    root->addChild(pickCB);                        
891                                                   
892 }                                                 
893                                                   
894                                                   
895 // Rotates camera 90 degrees around a scene el    
896 // Rotation is animated for smoothness.           
897 void G4OpenInventorXtExaminerViewer::rotateCam    
898 {                                                 
899    SoCamera *cam = getCamera();                   
900                                                   
901    SbRotation rot(rotAxis, M_PI / (2 * ROT_CNT    
902    rot.multVec(camDir, camDir);                   
903    rot.multVec(camUpVec, camUpVec);               
904                                                   
905    SbVec3f camPosNew = prevPt - (camDir*distan    
906    cam->position = camPosNew;                     
907    cam->pointAt(prevPt, camUpVec);                
908    cam->focalDistance = (prevPt - camPosNew).l    
909                                                   
910    rotCnt--;                                      
911                                                   
912    if (animateSensorRotation->isScheduled()) {    
913       animateSensorRotation->unschedule();        
914    }                                              
915                                                   
916    animateSensorRotation->setBaseTime(SbTime::    
917    animateSensorRotation->setInterval(SbTime(0    
918    animateSensorRotation->schedule();             
919                                                   
920 }                                                 
921                                                   
922                                                   
923 // Slides camera along the beamline.              
924 void G4OpenInventorXtExaminerViewer::moveCamer    
925 {                                                 
926                                                   
927    SoCamera *cam = getCamera();                   
928    SbVec3f p1(0), p2(0); // The particle moves    
929    SbVec3f particleDir;  // Direction vector f    
930    SbVec3f camPosNew(0); // New position of th    
931                                                   
932    if(refParticleTrajectory.size() == 0) {        
933       //refParticleTrajectory hasn't been set     
934       if(dist)                                    
935          distance = dist;                         
936       else                                        
937          distance = (cam->position.getValue()     
938                                                   
939       cam->position.setValue(center + offsetFr    
940       cam->focalDistance = (cam->position.getV    
941       cam->pointAt(center, upVector);             
942    }                                              
943    else{                                          
944                                                   
945       // If we move forward past the last traj    
946       // go back to the beginning                 
947       if (refParticleIdx >= (int) refParticleT    
948          prevPt = refParticleTrajectory[refPar    
949          dist = (prevPt - cam->position.getVal    
950          refParticleIdx = 0;                      
951       }                                           
952       // If we move backward past the beginnin    
953       // go to the last trajectory point          
954       if (refParticleIdx < 0) {                   
955          prevPt = refParticleTrajectory[refPar    
956          dist = (prevPt - cam->position.getVal    
957          refParticleIdx = refParticleTrajector    
958       }                                           
959                                                   
960       // Set start and end points                 
961       p1 = refParticleTrajectory[refParticleId    
962       p2 = refParticleTrajectory[refParticleId    
963                                                   
964       // Get the direction from p1 to p2          
965       particleDir = p2 - p1;                      
966       particleDir.normalize();                    
967                                                   
968       if(prevParticleDir == SbVec3f(0,0,0)){      
969          // First time entering BEAMLINE mode,    
970          // the element from the front, with c    
971          if(lookdown)                             
972             camDir = SbVec3f(0,0,1);              
973          else                                     
974             camDir = SbVec3f(1,0,0);              
975          camUpVec = SbVec3f(0,1,0);               
976                                                   
977          // In case the start of the goes in a    
978          // direction other than +z, rotate th    
979          SbRotation rot(SbVec3f(0,0,1), partic    
980          rot.multVec(camDir, camDir);             
981          rot.multVec(camUpVec, camUpVec);         
982                                                   
983       }                                           
984       else if(particleDir != prevParticleDir)     
985          // The beamline has changed direction    
986                                                   
987          SbRotation rot(prevParticleDir, parti    
988          rot.multVec(camDir, camDir);             
989          rot.multVec(camUpVec, camUpVec);         
990                                                   
991       }                                           
992                                                   
993       if (cam->isOfType(SoPerspectiveCamera::g    
994          if (!dist)                               
995             distance = (prevPt - cam->position    
996          else                                     
997             distance = dist;                      
998       }                                           
999                                                   
1000       // FWJ distance not relevant -- use foc    
1001       // if (cam->isOfType(SoOrthographicCame    
1002       //    if (!dist)                           
1003       //       distance = (prevPt - cam->posi    
1004       //    else                                 
1005       //       distance = dist;                  
1006       // }                                       
1007                                                  
1008                                                  
1009       float x(0.),y(0.),z(0.);                   
1010       prevPt.getValue(x,y,z);                    
1011                                                  
1012                                                  
1013       if (cam->isOfType(SoPerspectiveCamera::    
1014          camPosNew = p2 - (camDir*distance);     
1015       }                                          
1016       if (cam->isOfType(SoOrthographicCamera:    
1017          // FWJ maintain focal distance          
1018          camPosNew = p2 - (camDir*cam->focalD    
1019          //         camPosNew = p2 - (camDir)    
1020       }                                          
1021                                                  
1022       cam->position = camPosNew;                 
1023       cam->pointAt(p2, camUpVec);                
1024       cam->focalDistance = (p2 - camPosNew).l    
1025                                                  
1026       p2.getValue(x,y,z);                        
1027       camPosNew.getValue(x,y,z);                 
1028                                                  
1029       prevParticleDir = particleDir;             
1030       prevPt = p1; // For accurate distance c    
1031                                                  
1032    }                                             
1033                                                  
1034 }                                                
1035                                                  
1036                                                  
1037 void G4OpenInventorXtExaminerViewer::pickingC    
1038                                                  
1039 {                                                
1040    SoHandleEventAction* action = eventCB->get    
1041    const SoPickedPoint *pp = action->getPicke    
1042    G4OpenInventorXtExaminerViewer* This = (G4    
1043                                                  
1044    if(pp != NULL) {                              
1045                                                  
1046       SoPath* path = pp->getPath();              
1047       SoNode* node = ((SoFullPath*)path)->get    
1048                                                  
1049       if(node->getTypeId() == SoLineSet::getC    
1050                                                  
1051          if(This->pickRefPathFlag){              
1052             This->pickRefPathFlag = false;       
1053             if(This->viewingBeforePickRef !=     
1054                This->setViewing(This->viewing    
1055             else                                 
1056                This->setComponentCursor(SoXtC    
1057                                                  
1058             // The trajectory is a set of lin    
1059             SoLineSet * trajectory = (SoLineS    
1060                                                  
1061        // The set of all trajectories is stor    
1062        // one level above the LineSet that wa    
1063        // seperator are as follows (in this o    
1064        // ResetTransform, MatrixTransform, Co    
1065             SoSeparator * grpNode =              
1066                (SoSeparator*)(((SoFullPath*)p    
1067                                                  
1068    // The node that contains the coordinates     
1069    // Coordinate3 node which occurs before th    
1070    // back through the nodes in the group unt    
1071             int nodeIndex = grpNode->findChil    
1072             SoNode * tmpNode;                    
1073             // FWJ needs initialization          
1074             SoCoordinate3 * coords = 0;          
1075             //            SoCoordinate3 * coo    
1076             // We allow only 100 iterations,     
1077             // (should take only a few iterat    
1078             for(int i = 0; i < 100; ++i) {       
1079                --nodeIndex;                      
1080                                                  
1081                tmpNode = grpNode->getChild(no    
1082                if(tmpNode->getTypeId() == SoC    
1083                   //node found                   
1084                   coords = (SoCoordinate3 *)t    
1085                   break;                         
1086                }                                 
1087             }                                    
1088                                                  
1089             if(coords == NULL){                  
1090                String dialogName = (char *) "    
1091                std::string msg = "Could not f    
1092                   " for the picked trajectory    
1093                   " Reference trajectory not     
1094                This->warningMsgDialog(msg, di    
1095                return;                           
1096             }                                    
1097                                                  
1098                                                  
1099             if ((This->lshiftdown)  || (This-    
1100                This->setReferencePath(traject    
1101             else                                 
1102                This->setReferencePath(traject    
1103                                                  
1104             return;                              
1105                                                  
1106          }                                       
1107          else if(This->abbrOutputFlag) {         
1108                                                  
1109             G4AttHolder* attHolder = dynamic_    
1110             if(attHolder && attHolder->GetAtt    
1111                                                  
1112                std::string strTrajPoint = "G4    
1113                std::ostringstream oss;           
1114                for (size_t i = 0; i < attHold    
1115                   G4cout << G4AttCheck(attHol    
1116                                        attHol    
1117                   oss << G4AttCheck(attHolder    
1118                                     attHolder    
1119                   if(oss.str().find(strTrajPo    
1120                                                  
1121            // Last attribute displayed was a     
1122            // want abbreviated output, displa    
1123            // (unless we're already at the la    
1124                      if(i != attHolder->GetAt    
1125                         G4cout << G4AttCheck(    
1126               attHolder->GetAttValues()[attHo    
1127               attHolder->GetAttDefs()[attHold    
1128                      }                           
1129                      break;                      
1130                   }                              
1131                }                                 
1132             } else {                             
1133                G4String name((char*)node->get    
1134                G4String cls((char*)node->getT    
1135                G4cout << "SoNode : " << node     
1136                       << " SoType : " << cls     
1137                       << " name : " << name      
1138                       << G4endl;                 
1139                G4cout << "No attributes attac    
1140             }                                    
1141                                                  
1142             return;                              
1143          }                                       
1144          else{                                   
1145             //Go to default behavior             
1146          }                                       
1147       }                                          
1148       else {                                     
1149          //Go to default behavior                
1150       }                                          
1151                                                  
1152       // Default behavior in G4OpenInventorVi    
1153       G4AttHolder* attHolder = dynamic_cast<G    
1154       if(attHolder && attHolder->GetAttDefs()    
1155          for (size_t i = 0; i < attHolder->Ge    
1156             G4cout << G4AttCheck(attHolder->G    
1157                                  attHolder->G    
1158          }                                       
1159       } else {                                   
1160          G4String name((char*)node->getName()    
1161          G4String cls((char*)node->getTypeId(    
1162          G4cout << "SoNode : " << node           
1163                 << " SoType : " << cls           
1164                 << " name : " << name            
1165                 << G4endl;                       
1166          G4cout << "No attributes attached."     
1167       }                                          
1168                                                  
1169       //Suppress other event handlers            
1170       eventCB->setHandled();                     
1171    }                                             
1172 }                                                
1173                                                  
1174                                                  
1175 void G4OpenInventorXtExaminerViewer::mouseove    
1176 {                                                
1177    SoHandleEventAction* action = eventCB->get    
1178    const SoPickedPoint* pp = action->getPicke    
1179    G4OpenInventorXtExaminerViewer* This = (G4    
1180                                                  
1181    if(!This->abbrOutputFlag)                     
1182       return;                                    
1183                                                  
1184    if(pp != NULL) {                              
1185                                                  
1186       const SbViewportRegion & viewportRegion    
1187                                                  
1188       std::string sLogName;                      
1189       float x,y,z;                               
1190       std::stringstream ssZPos;                  
1191       std::stringstream ssSolids;                
1192       std::stringstream ssMaterials;             
1193       SoPath * path = pp->getPath();             
1194       SoNode* node = ((SoFullPath*)path)->get    
1195                                                  
1196       if(node->getTypeId() == Geant4_SoPolyhe    
1197                                                  
1198          sLogName = "Logical Volume:  ";         
1199          sLogName += ((Geant4_SoPolyhedron *)    
1200                                                  
1201          SoGetBoundingBoxAction bAction(viewp    
1202          bAction.apply((SoFullPath*)path);       
1203          SbBox3f bBox = bAction.getBoundingBo    
1204          SbVec3f center = bBox.getCenter();      
1205          center.getValue(x,y,z);                 
1206          ssZPos << "Pos:  " << x << "  " << y    
1207                                                  
1208          G4AttHolder* attHolder = dynamic_cas    
1209          if(attHolder && attHolder->GetAttDef    
1210                                                  
1211             std::vector<const std::map<G4Stri    
1212                attHolder->GetAttDefs();          
1213             std::vector<const std::vector<G4A    
1214                attHolder->GetAttValues();        
1215             for (size_t i = 0; i < vecDefs.si    
1216                const std::vector<G4AttValue>     
1217                                                  
1218                std::vector<G4AttValue>::const    
1219                                                  
1220                for (iValue = vals->begin(); i    
1221                   const G4String& valueName =    
1222                   const G4String& value = iVa    
1223                                                  
1224                   if(valueName == "Solid") {     
1225                      if(ssSolids.str() == "")    
1226                         ssSolids << "Solid Na    
1227                      else                        
1228                         ssSolids << ", " << v    
1229                   }                              
1230                                                  
1231                   if(valueName == "Material")    
1232                      if(ssMaterials.str() ==     
1233                         ssMaterials << "Mater    
1234                      else                        
1235                         ssMaterials << ", " <    
1236                   }                              
1237                }                                 
1238             }                                    
1239          }                                       
1240       }                                          
1241       // FWJ Mouseover for trajectories          
1242       else if(node->getTypeId() == SoLineSet:    
1243          //         G4cout << "Trajectory!!!!    
1244          G4AttHolder* attHolder = dynamic_cas    
1245          if(attHolder && attHolder->GetAttDef    
1246             std::string strTrajPoint = "G4Tra    
1247             std::ostringstream oss;              
1248             G4String t1, t1Ch, t2, t3, t4;       
1249             for (size_t i = 0; i < attHolder-    
1250                //               G4cout << "Ge    
1251                // No, returns a vector!   G4A    
1252                const std::vector<G4AttValue>*    
1253                std::vector<G4AttValue>::const    
1254                for (iValue = vals->begin(); i    
1255                   const G4String& valueName =    
1256                   const G4String& value = iVa    
1257                   // G4cout << "  valueName =    
1258                   // G4cout << "  value = " <    
1259                   // LINE 1                      
1260                   if (valueName == "PN") t1 =    
1261                   if (valueName == "Ch") {       
1262                      if (atof(value.c_str())     
1263                         t1Ch = "    +";          
1264                      else                        
1265                         t1Ch = "    ";           
1266                      t1Ch += value;              
1267                   }                              
1268                   if (valueName == "PDG") {      
1269                      t1 += "    ";               
1270                      t1 += value;                
1271                      t1 += t1Ch;                 
1272                      This->mouseOverTextLogNa    
1273                   }                              
1274                   //                  G4cout     
1275                   // LINE 2                      
1276                   if (valueName == "EventID")    
1277                   if (valueName == "ID") t2 +    
1278                   if (valueName == "PID") {      
1279                      t2 += "    Prt " + value    
1280                      This->mouseOverTextSolid    
1281                   }                              
1282                   // LINE 3                      
1283                   if (valueName == "IKE") t3     
1284                   if (valueName == "IMom") {     
1285                      // Remove units             
1286                      unsigned ipos = value.rf    
1287                      G4String value1 = value;    
1288                      value1.erase(ipos);         
1289                      t3 += "    P (" + value1    
1290                   }                              
1291                   if (valueName == "IMag") {     
1292                      t3 += " " + value + "/c"    
1293                      //                     t    
1294                      This->mouseOverTextMater    
1295                   }                              
1296                   // LINE 4                      
1297                   if (valueName == "NTP") {      
1298                      std::ostringstream t4oss    
1299                      t4oss << "TrjPts " <<  v    
1300                      t4oss << "    Pos " << p    
1301                         " " << pp->getPoint()    
1302                      This->mouseOverTextZPos-    
1303                   }                              
1304                }                                 
1305 //               G4cout << "  NOW CALLING G4A    
1306 //                G4cout << G4AttCheck(attHol    
1307 //                                     attHol    
1308 //                oss << G4AttCheck(attHolder    
1309 //                                  attHolder    
1310 //                if(oss.str().find(strTrajPo    
1311 //                   // Last attribute displa    
1312 //                   // want abbreviated outp    
1313 //                   // (unless we're already    
1314 //                   if(i != attHolder->GetAt    
1315 //                      G4cout << G4AttCheck(    
1316 //                                               
1317 //                                               
1318 //                   }                           
1319 //                   break;                      
1320 //                }                              
1321             }                                    
1322          }                                       
1323          This->setSuperimpositionEnabled(This    
1324          This->scheduleRedraw();                 
1325          eventCB->setHandled();                  
1326          return;                                 
1327       }                                          
1328                                                  
1329       bool redraw = false;                       
1330       if(std::string(This->mouseOverTextLogNa    
1331          This->mouseOverTextLogName->string.s    
1332          redraw = true;                          
1333       }                                          
1334       if(std::string(This->mouseOverTextSolid    
1335          This->mouseOverTextSolid->string.set    
1336          redraw = true;                          
1337       }                                          
1338       if(std::string(This->mouseOverTextMater    
1339          This->mouseOverTextMaterial->string.    
1340          redraw = true;                          
1341       }                                          
1342       if(std::string(This->mouseOverTextZPos-    
1343          This->mouseOverTextZPos->string.setV    
1344          redraw = true;                          
1345       }                                          
1346                                                  
1347       if(redraw) {                               
1348          This->setSuperimpositionEnabled(This    
1349          This->scheduleRedraw();                 
1350       }                                          
1351                                                  
1352       eventCB->setHandled();                     
1353    }                                             
1354    else {                                        
1355       if(std::string(This->mouseOverTextLogNa    
1356          This->mouseOverTextLogName->string.s    
1357          This->scheduleRedraw();                 
1358       }                                          
1359       if(std::string(This->mouseOverTextSolid    
1360          This->mouseOverTextSolid->string.set    
1361          This->scheduleRedraw();                 
1362       }                                          
1363       if(std::string(This->mouseOverTextMater    
1364          This->mouseOverTextMaterial->string.    
1365          This->scheduleRedraw();                 
1366       }                                          
1367       if(std::string(This->mouseOverTextZPos-    
1368          This->mouseOverTextZPos->string.setV    
1369          This->scheduleRedraw();                 
1370       }                                          
1371    }                                             
1372 }                                                
1373                                                  
1374                                                  
1375 SbBool G4OpenInventorXtExaminerViewer::proces    
1376    SoCamera *cam = getCamera();                  
1377    const SoType type(ev->getTypeId());           
1378                                                  
1379    if (type.isDerivedFrom(SoMouseButtonEvent:    
1380       SoMouseButtonEvent * me = (SoMouseButto    
1381                                                  
1382       if (currentState == ANIMATION || curren    
1383           || currentState == PAUSED_ANIMATION    
1384          switch (me->getButton()) {              
1385          case SoMouseButtonEvent::BUTTON4: //    
1386             if (me->getState() == SoButtonEve    
1387                if (cam->isOfType(SoPerspectiv    
1388                   float hAngle =                 
1389                      ((SoPerspectiveCamera *)    
1390                   ((SoPerspectiveCamera *) ca    
1391                      + 0.01f;                    
1392                   return TRUE;                   
1393                } else if (cam->isOfType(         
1394                                         SoOrt    
1395                   float height =                 
1396                      ((SoOrthographicCamera *    
1397                   ((SoOrthographicCamera *) c    
1398                   return TRUE;                   
1399                }                                 
1400             }                                    
1401             break;                               
1402          case SoMouseButtonEvent::BUTTON5: //    
1403             if (me->getState() == SoButtonEve    
1404                if (cam->isOfType(SoPerspectiv    
1405                   float hAngle =                 
1406                      ((SoPerspectiveCamera *)    
1407                   if (hAngle > 0.01)             
1408                      ((SoPerspectiveCamera *)    
1409                         - 0.01f;                 
1410                   return TRUE;                   
1411                } else if (cam->isOfType(         
1412                                         SoOrt    
1413                   float height =                 
1414                      ((SoOrthographicCamera *    
1415                   if (height > 5)                
1416                      ((SoOrthographicCamera *    
1417                   return TRUE;                   
1418                }                                 
1419             }                                    
1420             break;                               
1421          default:                                
1422             break;                               
1423          }                                       
1424       }                                          
1425       if (currentState == GENERAL) {             
1426                                                  
1427       }                                          
1428    }                                             
1429                                                  
1430    if (type.isDerivedFrom(SoKeyboardEvent::ge    
1431       SoKeyboardEvent * ke = (SoKeyboardEvent    
1432                                                  
1433       if (SoKeyboardEvent::isKeyPressEvent(ev    
1434          switch (ke->getKey()) {                 
1435          case SoKeyboardEvent::LEFT_SHIFT:       
1436             this->lshiftdown = true;             
1437             return TRUE;                         
1438          case SoKeyboardEvent::RIGHT_SHIFT:      
1439             this->rshiftdown = true;             
1440             return TRUE;                         
1441          case SoKeyboardEvent::LEFT_CONTROL:     
1442             this->lctrldown = true;              
1443             return TRUE;                         
1444          case SoKeyboardEvent::RIGHT_CONTROL:    
1445             this->rctrldown = true;              
1446             return TRUE;                         
1447          case SoKeyboardEvent::SPACE:            
1448             if (currentState == ANIMATION        
1449                 || currentState == REVERSED_A    
1450                beforePausing = currentState;     
1451                currentState = PAUSED_ANIMATIO    
1452                if (animateSensor->isScheduled    
1453                   animateSensor->unschedule()    
1454                return TRUE;                      
1455             } else if (currentState == PAUSED    
1456                if (maxSpeed) {                   
1457                   if ((beforePausing == ANIMA    
1458                        && refParticleIdx         
1459                        < (int) refParticleTra    
1460                       || (beforePausing == RE    
1461                           && refParticleIdx >    
1462                      currentState = beforePau    
1463                      animateRefParticle();       
1464                   }                              
1465                }                                 
1466                return TRUE;                      
1467             }                                    
1468             break;                               
1469          case SoKeyboardEvent::ESCAPE:           
1470             if (currentState == ANIMATION        
1471                 || currentState == REVERSED_A    
1472                 || currentState == PAUSED_ANI    
1473                                                  
1474                if (animateSensor->isScheduled    
1475                   animateSensor->unschedule()    
1476                currentState = prevState;         
1477                refParticleIdx = prevRefIdx;      
1478                setSuperimpositionEnabled(supe    
1479                maxSpeed = 0.0f;                  
1480                step = 1;                         
1481                                                  
1482                scheduleRedraw();                 
1483                if (currentState == VIEWPOINT)    
1484                   setSuperimpositionEnabled(s    
1485                   axisSwitch->whichChild.setV    
1486                   animSpeedOutlineSwitch->whi    
1487                                                  
1488                   animSpeedSwitch->whichChild    
1489                                                  
1490                   scheduleRedraw();              
1491                }                                 
1492                restoreCamera();                  
1493                return TRUE;                      
1494             }                                    
1495             break;                               
1496          case SoKeyboardEvent::DELETE:           
1497             if (viewPtList.size()                
1498                 && (currentState != ANIMATION    
1499                     && currentState != REVERS    
1500                     && currentState != PAUSED    
1501                String dialogName = (char *) "    
1502                std::string msg = "Are you sur    
1503                warningMsgDialog(msg, dialogNa    
1504                return TRUE;                      
1505             }                                    
1506             break;                               
1507          case SoKeyboardEvent::LEFT_ARROW:       
1508             switch (currentState) {              
1509             case BEAMLINE:                       
1510                if ((this->lshiftdown) || (thi    
1511                   refParticleIdx -= step;        
1512                   moveCamera();                  
1513                }                                 
1514                else if ((this->lctrldown) ||     
1515                   if (SoXtExaminerViewer::isA    
1516                      stopAnimating();            
1517                   prevState = currentState;      
1518                   currentState = ROTATING;       
1519                   animateBtwPtsPeriod = 0.08f    
1520                                                  
1521                   SbVec3f tmp = camDir;          
1522                   tmp.negate();                  
1523                   rotAxis = tmp;                 
1524                                                  
1525                   rotCnt = ROT_CNT;              
1526                   moveCamera(); // To make su    
1527                                                  
1528                   rotateCamera();                
1529                }                                 
1530                else{                             
1531                   if (SoXtExaminerViewer::isA    
1532                      stopAnimating();            
1533                   prevState = currentState;      
1534                   currentState = ROTATING;       
1535                   animateBtwPtsPeriod = 0.08f    
1536                                                  
1537                   SbVec3f tmp = camUpVec;        
1538                   tmp.negate();                  
1539                   rotAxis = tmp;                 
1540                                                  
1541                   rotCnt = ROT_CNT;              
1542                   moveCamera(); // To make su    
1543                                                  
1544                   rotateCamera();                
1545                                                  
1546                }                                 
1547                return TRUE;                      
1548                                                  
1549             case ANIMATION:                      
1550             case REVERSED_ANIMATION:             
1551                left_right -= 1.5f;               
1552                return TRUE;                      
1553             case PAUSED_ANIMATION:               
1554                left_right -= 1.5f;               
1555                setStartingPtForAnimation();      
1556                cam->position = myCam->positio    
1557                return TRUE;                      
1558             case GENERAL:                        
1559             case VIEWPOINT:                      
1560                if ((!this->lshiftdown) && (!t    
1561                   // Using this allows us to     
1562                   // changing the camera para    
1563                   this->bottomWheelMotion(       
1564                                           thi    
1565                                                  
1566                   return TRUE;                   
1567                }                                 
1568                break;                            
1569             case ROTATING:                       
1570                // For this state, let the key    
1571                // be handled by superclass       
1572                break;                            
1573             default:                             
1574                SoDebugError::post("G4OpenInve    
1575                                   "Unhandled     
1576                break;                            
1577             }                                    
1578             break;                               
1579                                                  
1580          case SoKeyboardEvent::RIGHT_ARROW:      
1581             switch(currentState){                
1582             case BEAMLINE:                       
1583                if ((this->lshiftdown) || (thi    
1584                   refParticleIdx += step;        
1585                   moveCamera();                  
1586                }                                 
1587                else if ((this->lctrldown) ||     
1588                   if (SoXtExaminerViewer::isA    
1589                      stopAnimating();            
1590                   prevState = currentState;      
1591                   currentState = ROTATING;       
1592                   animateBtwPtsPeriod = 0.08f    
1593                                                  
1594                   rotAxis = camDir;              
1595                                                  
1596                   rotCnt = ROT_CNT;              
1597                   moveCamera(); // To make su    
1598                                                  
1599                   rotateCamera();                
1600                }                                 
1601                else{                             
1602                   if (SoXtExaminerViewer::isA    
1603                      stopAnimating();            
1604                   prevState = currentState;      
1605                   currentState = ROTATING;       
1606                   animateBtwPtsPeriod = 0.08f    
1607                                                  
1608                   rotAxis = camUpVec;            
1609                                                  
1610                   rotCnt = ROT_CNT;              
1611                   moveCamera(); // To make su    
1612                                                  
1613                   rotateCamera();                
1614                }                                 
1615                return TRUE;                      
1616                                                  
1617             case ANIMATION:                      
1618             case REVERSED_ANIMATION:             
1619                left_right += 1.5f;               
1620                return TRUE;                      
1621             case PAUSED_ANIMATION:               
1622                left_right += 1.5f;               
1623                setStartingPtForAnimation();      
1624                cam->position = myCam->positio    
1625                return TRUE;                      
1626             case GENERAL:                        
1627             case VIEWPOINT:                      
1628                if ((!this->lshiftdown) && (!t    
1629                   // Using this allows us to     
1630                   // changing the camera para    
1631                   this->bottomWheelMotion(       
1632                                           thi    
1633                   return TRUE;                   
1634                }                                 
1635                break;                            
1636             case ROTATING:                       
1637                // For this state, let the key    
1638                // be handled by superclass       
1639                break;                            
1640             default:                             
1641                SoDebugError::post("G4OpenInve    
1642                                   "Unhandled     
1643                break;                            
1644             }                                    
1645             break;                               
1646                                                  
1647          case SoKeyboardEvent::DOWN_ARROW:       
1648             switch(currentState){                
1649             case BEAMLINE:                       
1650                                                  
1651                if ((this->lshiftdown) || (thi    
1652                   refParticleIdx -= step;        
1653                   moveCamera();                  
1654                }                                 
1655                else{                             
1656                   if (SoXtExaminerViewer::isA    
1657                      stopAnimating();            
1658                   prevState = currentState;      
1659                   currentState = ROTATING;       
1660                   animateBtwPtsPeriod = 0.08f    
1661                                                  
1662                   rotAxis = camDir.cross(camU    
1663                                                  
1664                   rotCnt = ROT_CNT;              
1665                   moveCamera(); // To make su    
1666                                                  
1667                   rotateCamera();                
1668                                                  
1669                }                                 
1670                return TRUE;                      
1671                                                  
1672             case ANIMATION:                      
1673             case REVERSED_ANIMATION:             
1674                up_down -= 1.5f;                  
1675                return TRUE;                      
1676             case PAUSED_ANIMATION:               
1677                up_down -= 1.5f;                  
1678                setStartingPtForAnimation();      
1679                cam->position = myCam->positio    
1680                return TRUE;                      
1681             case GENERAL:                        
1682             case VIEWPOINT:                      
1683                // Using this allows us to loo    
1684                // changing the camera paramet    
1685                if ((!this->lshiftdown) && (!t    
1686                   this->leftWheelMotion(this-    
1687                   return TRUE;                   
1688                }                                 
1689                break;                            
1690             case ROTATING:                       
1691                // For this state, let the key    
1692                // be handled by superclass       
1693                break;                            
1694             default:                             
1695                SoDebugError::post("G4OpenInve    
1696                                   "Unhandled     
1697                break;                            
1698             }                                    
1699             break;                               
1700                                                  
1701          case SoKeyboardEvent::UP_ARROW:         
1702             switch(currentState){                
1703             case BEAMLINE:                       
1704                if ((this->lshiftdown) || (thi    
1705                   refParticleIdx -= step;        
1706                   moveCamera();                  
1707                }                                 
1708                else{                             
1709                   if (SoXtExaminerViewer::isA    
1710                      stopAnimating();            
1711                   prevState = currentState;      
1712                   currentState = ROTATING;       
1713                   animateBtwPtsPeriod = 0.08f    
1714                                                  
1715                   rotAxis = camUpVec.cross(ca    
1716                                                  
1717                   rotCnt = ROT_CNT;              
1718                   moveCamera();                  
1719                                                  
1720                   rotateCamera();                
1721                                                  
1722                                                  
1723                }                                 
1724                return TRUE;                      
1725             case ANIMATION:                      
1726             case REVERSED_ANIMATION:             
1727                up_down += 1.5f;                  
1728                return TRUE;                      
1729             case PAUSED_ANIMATION:               
1730                up_down += 1.5f;                  
1731                setStartingPtForAnimation();      
1732                cam->position = myCam->positio    
1733                return TRUE;                      
1734             case GENERAL:                        
1735             case VIEWPOINT:                      
1736                // Using this allows us to loo    
1737                // changing the camera paramet    
1738                if ((!this->lshiftdown) && (!t    
1739                   this->leftWheelMotion(this-    
1740                   return TRUE;                   
1741                }                                 
1742                break;                            
1743             case ROTATING:                       
1744                // For this state, let the key    
1745                // be handled by superclass       
1746                break;                            
1747             default:                             
1748                SoDebugError::post("G4OpenInve    
1749                                   "Unhandled     
1750                break;                            
1751             }                                    
1752             break;                               
1753                                                  
1754          case SoKeyboardEvent::PAGE_UP:          
1755             switch(currentState){                
1756             case BEAMLINE:                       
1757                if (step < (int) refParticleTr    
1758                   step++;                        
1759                return TRUE;                      
1760             case ANIMATION:                      
1761                incSpeed();                       
1762                maxSpeed += SPEED_INDICATOR_ST    
1763                if (maxSpeed > 0.8)               
1764                   maxSpeed = MAX_SPEED_INDICA    
1765                scheduleRedraw();                 
1766                                                  
1767                return TRUE;                      
1768             case REVERSED_ANIMATION:             
1769                if(!animateSensor->isScheduled    
1770                   currentState = ANIMATION;      
1771                   if (refParticleIdx             
1772                       < (int) refParticleTraj    
1773                      refParticleIdx++;           
1774                      maxSpeed = SPEED_INDICAT    
1775                      scheduleRedraw();           
1776                      animateRefParticle();       
1777                   }                              
1778                }                                 
1779                else{                             
1780                   maxSpeed += SPEED_INDICATOR    
1781                   decSpeed();                    
1782                   scheduleRedraw();              
1783                }                                 
1784                return TRUE;                      
1785             case PAUSED_ANIMATION:               
1786                maxSpeed += SPEED_INDICATOR_ST    
1787                if (maxSpeed > 0.8)               
1788                   maxSpeed = MAX_SPEED_INDICA    
1789                                                  
1790                if (beforePausing == ANIMATION    
1791                   incSpeed();                    
1792                } else {                          
1793                   decSpeed();                    
1794                   if (animateBtwPtsPeriod >=     
1795                      beforePausing = ANIMATIO    
1796                }                                 
1797                                                  
1798                scheduleRedraw();                 
1799                return TRUE;                      
1800             default:  //fall through             
1801                break;                            
1802             }                                    
1803             break;                               
1804                                                  
1805          case SoKeyboardEvent::PAGE_DOWN:        
1806             switch(currentState){                
1807             case BEAMLINE:                       
1808                if (step > 1)                     
1809                   step--;                        
1810                return TRUE;                      
1811             case ANIMATION:                      
1812                if(!animateSensor->isScheduled    
1813                   currentState = REVERSED_ANI    
1814                   if (refParticleIdx > 1) {      
1815                      refParticleIdx--;           
1816                      maxSpeed = -SPEED_INDICA    
1817                      scheduleRedraw();           
1818                      animateRefParticle();       
1819                   }                              
1820                }                                 
1821                else{                             
1822                   maxSpeed -= SPEED_INDICATOR    
1823                   decSpeed();                    
1824                   scheduleRedraw();              
1825                }                                 
1826                return TRUE;                      
1827             case REVERSED_ANIMATION:             
1828                incSpeed();                       
1829                maxSpeed -= SPEED_INDICATOR_ST    
1830                if (maxSpeed < -0.8)              
1831                   maxSpeed = -MAX_SPEED_INDIC    
1832                scheduleRedraw();                 
1833                return TRUE;                      
1834             case PAUSED_ANIMATION:               
1835                maxSpeed -= SPEED_INDICATOR_ST    
1836                if (maxSpeed < -0.8)              
1837                   maxSpeed = -MAX_SPEED_INDIC    
1838                if (beforePausing == REVERSED_    
1839                   incSpeed();                    
1840                } else {                          
1841                   decSpeed();                    
1842                   if (animateBtwPtsPeriod >=     
1843                      beforePausing = REVERSED    
1844                }                                 
1845                scheduleRedraw();                 
1846                return TRUE;                      
1847             default:                             
1848                //fall through                    
1849                break;                            
1850             }                                    
1851             break;                               
1852                                                  
1853          case SoKeyboardEvent::E:                
1854             this->escapeCallback(this->examin    
1855             break;                               
1856                                                  
1857          default:                                
1858             break; // To get rid of compiler     
1859          }                                       
1860       }                                          
1861       if (SoKeyboardEvent::isKeyReleaseEvent(    
1862          switch (ke->getKey()) {                 
1863          case SoKeyboardEvent::LEFT_SHIFT:       
1864             this->lshiftdown = false;            
1865             return TRUE;                         
1866          case SoKeyboardEvent::RIGHT_SHIFT:      
1867             this->rshiftdown = false;            
1868             return TRUE;                         
1869          case SoKeyboardEvent::LEFT_CONTROL:     
1870             this->lctrldown = false;             
1871             return TRUE;                         
1872          case SoKeyboardEvent::RIGHT_CONTROL:    
1873             this->rctrldown = false;             
1874             return TRUE;                         
1875          default:                                
1876             break;                               
1877          }                                       
1878       }                                          
1879    }                                             
1880                                                  
1881    if (currentState == ANIMATION || currentSt    
1882        || currentState == ROTATING)              
1883       return FALSE;                              
1884    else                                          
1885       return SoXtExaminerViewer::processSoEve    
1886 }                                                
1887                                                  
1888 // Called by hitting PageUp during animation.    
1889 void G4OpenInventorXtExaminerViewer::incSpeed    
1890   if (std::ceil(animateBtwPtsPeriod * 100) >=    
1891     if (speedStep > 0.08)                        
1892       speedStep -= 0.02;                         
1893     else                                         
1894       speedStep = 0.02;                          
1895     animateBtwPtsPeriod -= speedStep;            
1896   } else                                         
1897     animateBtwPtsPeriod = 0.0;                   
1898                                                  
1899   if (currentState != PAUSED_ANIMATION) {        
1900     int lastIdx = refParticleTrajectory.size(    
1901     if (refParticleIdx < lastIdx && !animateS    
1902       animateRefParticle();                      
1903   }                                              
1904 }                                                
1905                                                  
1906 // Called by hitting PageDown during animatio    
1907 void G4OpenInventorXtExaminerViewer::decSpeed    
1908   animateBtwPtsPeriod += speedStep;              
1909   if (animateBtwPtsPeriod < MIN_SPEED) {         
1910     if (std::floor(animateBtwPtsPeriod * 100)    
1911       speedStep = 0.08;                          
1912     } else if (animateBtwPtsPeriod > 0.12)       
1913       speedStep += 0.02;                         
1914   } else {                                       
1915     animateBtwPtsPeriod = MIN_SPEED;             
1916     speedStep = START_STEP;                      
1917     maxSpeed = 0.0f;                             
1918     if (animateSensor->isScheduled())            
1919       animateSensor->unschedule();               
1920   }                                              
1921 }                                                
1922                                                  
1923 // Based on the user's interaction the speed     
1924 void G4OpenInventorXtExaminerViewer::updateSp    
1925   assert(this->sgeometry != NULL);               
1926                                                  
1927   SbVec3f * points = this->sgeometry->point.s    
1928                                                  
1929   if (points[10][0] == 0.0f)                     
1930     this->animSpeedOutlineSwitch->whichChild.    
1931   if (points[14][0] == 0.0f)                     
1932     this->animSpeedSwitch->whichChild.setValu    
1933   points[10][0] = this->maxSpeed;                
1934   points[11][0] = this->maxSpeed;                
1935   points[14][0] = this->maxSpeed;                
1936   points[15][0] = this->maxSpeed;                
1937   this->sgeometry->point.finishEditing();        
1938                                                  
1939   if (this->maxSpeed == 0.0f) {                  
1940     this->animSpeedOutlineSwitch->whichChild.    
1941     this->animSpeedSwitch->whichChild.setValu    
1942   }                                              
1943 }                                                
1944                                                  
1945 void G4OpenInventorXtExaminerViewer::actualRe    
1946   switch (currentState) {                        
1947   case ANIMATION:                                
1948   case REVERSED_ANIMATION:                       
1949   case PAUSED_ANIMATION:                         
1950     updateSpeedIndicator();                      
1951     SoXtExaminerViewer::actualRedraw();          
1952     break;                                       
1953   default:                                       
1954     SoXtExaminerViewer::actualRedraw();          
1955     break;                                       
1956   }                                              
1957 }                                                
1958                                                  
1959 void G4OpenInventorXtExaminerViewer::setRefer    
1960 {                                                
1961    // TODO:  Color the reference path            
1962    // Disable the color stuff for now: change    
1963                                                  
1964 // // We change the color of the trajectory t    
1965 //  nodeIndex = grpNode->findChild(trajectory    
1966 //  SoMaterial * mat;                            
1967 //  for(int i = 0; i < 100; ++i){                
1968 //    --nodeIndex;                               
1969 //                                               
1970 //    tmpNode = grpNode->getChild(nodeIndex);    
1971 //    if(tmpNode->getTypeId() == SoMaterial::    
1972 //      //node found                             
1973 //      mat = (SoMaterial *)tmpNode;             
1974 //                                               
1975 //      break;                                   
1976 //    }                                          
1977 //  }                                            
1978 //                                               
1979 //                                               
1980 // // Restore default color for previously pi    
1981 // // and set different color for current pic    
1982 //  if(This->prevColorField)                     
1983 //    ((SoMFColor *)This->prevColorField)->se    
1984 //  This->prevColorField = (void *)&mat->diff    
1985 //                                               
1986 //                                               
1987 //  if(mat->diffuseColor.isConnected())          
1988 //    std::cout << "connected" << std::endl;     
1989 //                                               
1990 //  mat->diffuseColor.setValue(41.0/255.0, 23    
1991 //                                               
1992 //  std::cout << "R: " << mat->diffuseColor[0    
1993 //  std::cout << "G: " << mat->diffuseColor[0    
1994 //  std::cout << "B: " << mat->diffuseColor[0    
1995                                                  
1996    // The trajectory is composed of all the p    
1997    // multiple value field (SoMFInt32) numVer    
1998    // For each of the numVertices.getNum()* p    
1999    // retrieve the points from the SoCoordina    
2000    SbVec3f refParticlePt;                        
2001                                                  
2002    if(!append)                                   
2003       this->refParticleTrajectory.clear();       
2004                                                  
2005    for(int i = 0; i < lineset->numVertices.ge    
2006       for(int j = 0; j < lineset->numVertices    
2007          refParticlePt = coords->point[j];       
2008          this->refParticleTrajectory.push_bac    
2009       }                                          
2010    }                                             
2011    // Remove points that are too close to eac    
2012    this->evenOutRefParticlePts();                
2013    this->setReferencePathZPos();                 
2014    this->sortElements();                         
2015 }                                                
2016                                                  
2017                                                  
2018 void G4OpenInventorXtExaminerViewer::setRefer    
2019 {                                                
2020    refZPositions.clear();                        
2021    refZPositions.push_back(0);                   
2022    float dist;                                   
2023    for(unsigned int i=0; i < this->refParticl    
2024       dist = (refParticleTrajectory[i] -         
2025               refParticleTrajectory[i + 1]).l    
2026       refZPositions.push_back(refZPositions[i    
2027    }                                             
2028 }                                                
2029                                                  
2030                                                  
2031 void G4OpenInventorXtExaminerViewer::findAndS    
2032 {                                                
2033    SoSearchAction action;                        
2034    action.setType(SoLineSet::getClassTypeId()    
2035    action.setInterest(SoSearchAction::ALL);      
2036    action.apply(this->getSceneGraph());          
2037                                                  
2038    SoPathList &pathList = action.getPaths();     
2039                                                  
2040    if(pathList.getLength() != 0){                
2041                                                  
2042       SoCoordinate3 * coords = NULL;             
2043       std::vector<SoCoordinate3 *> coordvec;     
2044       std::vector<SoLineSet *> linevec;          
2045                                                  
2046       bool refPathFound = false;                 
2047       for(int i = 0; i < pathList.getLength()    
2048          SoFullPath *path = (SoFullPath *)pat    
2049                                                  
2050          G4AttHolder* attHolder = dynamic_cas    
2051          for (size_t j = 0; j < attHolder->Ge    
2052             std::ostringstream oss;              
2053             oss << G4AttCheck(attHolder->GetA    
2054                                                  
2055             std::string findStr = "Type of tr    
2056             std::string compareValue = "REFER    
2057             size_t idx = oss.str().find(findS    
2058                                                  
2059             if(idx != std::string::npos) {       
2060                if(oss.str().substr(idx + find    
2061                   coords = this->getCoordsNod    
2062                   if(coords != NULL){            
2063                      refPathFound = true;        
2064                      coordvec.push_back(coord    
2065                      linevec.push_back((SoLin    
2066                   }                              
2067                   break;                         
2068                }                                 
2069             }                                    
2070                                                  
2071             findStr = "Track ID (ID): ";         
2072             idx = oss.str().find(findStr);       
2073             if(idx != std::string::npos) {       
2074                //index all primary tracks        
2075                std::string tmpstr = oss.str()    
2076                std::istringstream buffer(tmps    
2077                int num;                          
2078                buffer >> num;                    
2079                if(num == 1) {                    
2080                                                  
2081                   // Check if next character     
2082                   // in which case we don't h    
2083                   // FWJ attempt to fix Cover    
2084                   char nextChar = oss.str().a    
2085                   // const char * nextChar =     
2086                   // oss.str().substr(idx + f    
2087                   if(std::isdigit(nextChar))     
2088                   // if(std::isdigit(nextChar    
2089                      break; //Not a primary t    
2090                                                  
2091                   coords = this->getCoordsNod    
2092                   if(coords != NULL){            
2093                      coordvec.push_back(coord    
2094                      linevec.push_back((SoLin    
2095                      break; //Found coords no    
2096                   }                              
2097                }                                 
2098                else                              
2099                   break;  //Not a primary tra    
2100             }                                    
2101             else{                                
2102                //Not a Track ID attribute, fa    
2103             }                                    
2104          }                                       
2105                                                  
2106          if(refPathFound)                        
2107             break;                               
2108       }                                          
2109                                                  
2110       if(coordvec.empty())                       
2111          return;    //No track with a Coordin    
2112                                                  
2113       if(refPathFound){                          
2114          //set ref path to last traj, coord i    
2115          this->setReferencePath(linevec.back(    
2116          return;                                 
2117       }                                          
2118       //else                                     
2119                                                  
2120       int longestIdx = 0;                        
2121       float longestLength = 0.0;                 
2122       // For all paths                           
2123       for(unsigned int i=0;i < linevec.size()    
2124                                                  
2125          //First generate a vector with all t    
2126          std::vector<SbVec3f> trajectory;        
2127          // For all lines in the i path          
2128          for(int j=0; j < linevec[i]->numVert    
2129             // For all points in line j          
2130             for(int k=0; k < linevec[i]->numV    
2131                trajectory.push_back(coordvec[    
2132             }                                    
2133          }                                       
2134                                                  
2135          // Then calculate the total length      
2136          float tmpLength=0.0;                    
2137          for(unsigned int j=0; j < trajectory    
2138             tmpLength += (trajectory[j] - tra    
2139          }                                       
2140                                                  
2141          if(tmpLength > longestLength){          
2142             longestIdx = i;                      
2143             longestLength = tmpLength;           
2144          }                                       
2145       }                                          
2146                                                  
2147       // Set the longest path as the referenc    
2148       this->setReferencePath(linevec[longestI    
2149    }                                             
2150 }                                                
2151                                                  
2152                                                  
2153 SoCoordinate3 * G4OpenInventorXtExaminerViewe    
2154 {                                                
2155    SoLineSet *trajectory = (SoLineSet *)path-    
2156    SoSeparator * grpNode = (SoSeparator*)(((S    
2157    int nodeIndex = grpNode->findChild(traject    
2158    SoNode * tmpNode;                             
2159                                                  
2160    // We allow only 100 iterations, in case t    
2161    // (should take only a few iterations)        
2162    for(int i = 0; i < 100; ++i){                 
2163       --nodeIndex;                               
2164                                                  
2165       tmpNode = grpNode->getChild(nodeIndex);    
2166       if(tmpNode->getTypeId() == SoCoordinate    
2167          //node found                            
2168          return (SoCoordinate3 *)tmpNode;        
2169       }                                          
2170    }                                             
2171    return NULL; //coords node not found          
2172 }                                                
2173                                                  
2174                                                  
2175 // Displays scene elements on the right side     
2176 // else: scene graph is searched for Geant4_S    
2177 void G4OpenInventorXtExaminerViewer::getScene    
2178 {                                                
2179    std::string field, eltName;                   
2180                                                  
2181    std::map<std::string, int> duplicates;        
2182    std::map<std::string, int> sceneElts;         
2183    SoSearchAction search;                        
2184    Geant4_SoPolyhedron *node;                    
2185    SoGroup *root = (SoGroup *)getSceneManager    
2186                                                  
2187    SoBaseKit::setSearchingChildren(TRUE);        
2188                                                  
2189    search.reset();                               
2190    search.setSearchingAll(TRUE);                 
2191    search.setInterest(SoSearchAction::ALL);      
2192    search.setType(Geant4_SoPolyhedron::getCla    
2193    search.apply(root);                           
2194                                                  
2195    SoPathList &pl = search.getPaths();           
2196                                                  
2197                                                  
2198    // First find which names occur more than     
2199    for(int i = 0; i < pl.getLength(); i++) {     
2200       SoFullPath *path = (SoFullPath *)pl[i];    
2201       node = (Geant4_SoPolyhedron *)path->get    
2202       eltName = node->getName();                 
2203       if(duplicates.count(eltName))              
2204          duplicates[eltName]++;                  
2205       else                                       
2206          duplicates[eltName] = 1;                
2207    }                                             
2208                                                  
2209    for(int i = 0; i < pl.getLength(); i++) {     
2210       float x,y,z;                               
2211       std::stringstream ssCount;                 
2212       SoFullPath *path = (SoFullPath *)pl[i];    
2213       node = (Geant4_SoPolyhedron *)path->get    
2214       eltName = node->getName();                 
2215       field = eltName;                           
2216       if(duplicates[eltName] == 1)               
2217          ssCount << "";//duplicates[field]       
2218       else {                                     
2219          if(sceneElts.count(eltName))            
2220             sceneElts[eltName]++;                
2221          else                                    
2222             sceneElts[eltName] = 1;              
2223                                                  
2224          ssCount << sceneElts[eltName];          
2225          field += "_";                           
2226       }                                          
2227                                                  
2228       field += ssCount.str();                    
2229                                                  
2230       SoGetBoundingBoxAction bAction(getViewp    
2231       bAction.apply(path);                       
2232       SbBox3f bBox = bAction.getBoundingBox()    
2233                                                  
2234       SbVec3f centr = bBox.getCenter();          
2235       centr.getValue(x,y,z);                     
2236                                                  
2237       path->ref();                               
2238       sceneElement el = { field, path, centr,    
2239       this->sceneElements.push_back(el);         
2240    }                                             
2241 }                                                
2242                                                  
2243                                                  
2244 float G4OpenInventorXtExaminerViewer::sqrlen(    
2245 {                                                
2246    float x,y,z;                                  
2247    a.getValue(x,y,z);                            
2248    return x*x + y*y + z*z;                       
2249 }                                                
2250                                                  
2251                                                  
2252 void G4OpenInventorXtExaminerViewer::distance    
2253                                                  
2254                                                  
2255                                                  
2256 {                                                
2257    // a : Previous point on trajectory           
2258    // b : Next point on trajectory               
2259    // q : the point in space                     
2260    // dab, daq, dbq: distance between a & b,     
2261    //                                            
2262    // Theory:  A point p on a line ab is defi    
2263    //                                            
2264    //         p(t) = a+t⋅(b–a)               
2265    //                                            
2266    //       note: All are vectors except the     
2267    //                                            
2268    // When t is between 0 and 1 the point p i    
2269    // The point p is defined in terms of the     
2270    // the distance from the query point q to     
2271    // of that distance we differentiate it an    
2272    //                                            
2273    //       diff(Norm(p(t)- q)) = 0              
2274    //                                            
2275    //     note: diff means taking the derivat    
2276    //                                            
2277    // The resulting t is given in the code be    
2278    // between p and q is given by:               
2279    //                                            
2280    //       d^2 = (Norm(p(t)-q))^2               
2281    //                                            
2282    // The expression found is given in the co    
2283    //                                            
2284    // Ref: http://programmizm.sourceforge.net    
2285    //           distance-from-a-point-to-a-po    
2286    //                                            
2287    //    --PLG                                   
2288                                                  
2289    const size_t count = this->refParticleTraj    
2290    assert(count>0);                              
2291                                                  
2292    SbVec3f b = this->refParticleTrajectory[0]    
2293    SbVec3f dbq = b - q;                          
2294    float sqrDist = sqrlen(dbq);                  
2295    closestPoint = b;                             
2296    index = 0;                                    
2297    for (size_t i = 1; i < count; ++i) {          
2298       const SbVec3f a = b;                       
2299       const SbVec3f daq = dbq;                   
2300       b = this->refParticleTrajectory[i];        
2301       dbq = b - q;                               
2302       const SbVec3f dab = a - b;                 
2303                                                  
2304       float dab_x, dab_y, dab_z;                 
2305       dab.getValue(dab_x,dab_y,dab_z);           
2306       float daq_x, daq_y, daq_z;                 
2307       daq.getValue(daq_x, daq_y, daq_z);         
2308       float dbq_x, dbq_y, dbq_z;                 
2309       dbq.getValue(dbq_x, dbq_y, dbq_z);         
2310                                                  
2311       const float inv_sqrlen = 1./sqrlen(dab)    
2312       const float t = (dab_x*daq_x + dab_y*da    
2313                                                  
2314       if (t<0.){                                 
2315          // The trajectory point occurs befor    
2316          // Go to the next point                 
2317          continue;                               
2318       }                                          
2319       float current_dist;                        
2320       if (t<=1.){                                
2321          // The trajectory point occurs betwe    
2322          // Compute the distance to that poin    
2323          current_dist = daq_x*daq_x + daq_y*d    
2324             - t*(daq_x*dab_x + daq_y*dab_y +     
2325             + t*t*(dab_x*dab_x + dab_y*dab_y     
2326       }                                          
2327       else { //t>1.                              
2328          // The trajectory point occurs after    
2329          // Get the distance to point b          
2330          current_dist = sqrlen(dbq);             
2331       }                                          
2332                                                  
2333       if (current_dist < sqrDist){               
2334          sqrDist = current_dist;                 
2335          closestPoint = a + t*(b-a);             
2336          index = i;                              
2337       }                                          
2338    }                                             
2339                                                  
2340    dist = std::sqrt(sqrDist);                    
2341 }                                                
2342                                                  
2343                                                  
2344 void G4OpenInventorXtExaminerViewer::sortElem    
2345 {                                                
2346    if(this->refParticleTrajectory.empty())       
2347       return;                                    
2348                                                  
2349    float * trajLength = new float[this->refPa    
2350    typedef std::map<elementForSorting, sceneE    
2351    sortedMap sorted;                             
2352                                                  
2353    // For every point on the reference trajec    
2354    // the total length from the start            
2355    SbVec3f prevPoint;                            
2356    std::vector<SbVec3f>::iterator itRef = thi    
2357    int trajIndex = 0;                            
2358    prevPoint = *itRef;                           
2359    trajLength[trajIndex] = 0.0;                  
2360    ++itRef;                                      
2361    ++trajIndex;                                  
2362    for(; itRef != this->refParticleTrajectory    
2363       trajLength[trajIndex] = trajLength[traj    
2364       prevPoint = *itRef;                        
2365    }                                             
2366                                                  
2367    // Compute the smallest distance between t    
2368    // and the reference trajectory (find the     
2369    // then map the element to the trajectory     
2370    // point (calculated above)                   
2371    SoGetBoundingBoxAction bAction(this->getVi    
2372    SbVec3f elementCoord;                         
2373    std::vector<sceneElement>::iterator itEl;     
2374    int elementIndex;                             
2375    elementForSorting el;                         
2376    for(itEl = this->sceneElements.begin(), el    
2377        itEl != this->sceneElements.end(); ++i    
2378       bAction.apply(itEl->path);                 
2379                                                  
2380       // FWJ sceneElement already has a cente    
2381       elementCoord = itEl->center;               
2382       // ... and this sometimes returns an em    
2383       //      elementCoord = bAction.getBound    
2384       //      if (bAction.getBoundingBox().is    
2385       //         G4cout << "sortElements: Box    
2386       //         G4cout << "   element name="    
2387       //      }                                  
2388                                                  
2389       int index;                                 
2390       distanceToTrajectory(elementCoord, el.s    
2391       itEl->closestPointZCoord = el.closestPo    
2392       el.distanceToBeamlineStart = (itEl->cen    
2393                                                  
2394       // This map of the scene elements (or t    
2395       // is automatically sorted by trajector    
2396       // by the distance between the element     
2397       // is the same as another element.  Thi    
2398       // an element structure which implement    
2399       sorted.insert(std::make_pair(el,*itEl))    
2400    }                                             
2401                                                  
2402    // store the sorted elements into the vect    
2403    this->sceneElements.clear();                  
2404                                                  
2405    sortedMap::iterator itSorted = sorted.begi    
2406    for(; itSorted != sorted.end(); itSorted++    
2407       this->sceneElements.push_back(itSorted-    
2408                                                  
2409    this->zcoordSetFlag = true;                   
2410                                                  
2411                                                  
2412    Widget formTop = XtNameToWidget(this->list    
2413    Widget formTopRight = XtNameToWidget(formT    
2414                                                  
2415    this->createElementsList(formTopRight);       
2416                                                  
2417    delete[] trajLength;                          
2418 }                                                
2419                                                  
2420                                                  
2421 void G4OpenInventorXtExaminerViewer::createEl    
2422 {                                                
2423    if(this->myElementList != NULL)               
2424       XtUnmanageChild(this->myElementList);      
2425                                                  
2426    int size = this->sceneElements.size();        
2427    XmString *elements = (XmString *) XtMalloc    
2428                                                  
2429    std::vector<sceneElement>::const_iterator     
2430    int count = 0;                                
2431    std::stringstream ss;                         
2432    for(it=this->sceneElements.begin(); it!=th    
2433       ss << it->name;                            
2434       if(zcoordSetFlag)                          
2435          ss << " [" << it->closestPointZCoord    
2436       elements[count] = XmStringCreateLocaliz    
2437       ++count;                                   
2438       ss.str("");                                
2439    }                                             
2440                                                  
2441    Arg args[10];                                 
2442    int n;                                        
2443                                                  
2444    // Label Right                                
2445    n = 0;                                        
2446    Widget labelRight;                            
2447    XtSetArg(args[n], XmNtopAttachment, XmATTA    
2448                                                  
2449    labelRight = XmCreateLabelGadget(formTopRi    
2450                                     args, n);    
2451    XtManageChild(labelRight);                    
2452                                                  
2453    // List Right                                 
2454    n = 0;                                        
2455    XtSetArg(args[n], XmNvisibleItemCount, 7);    
2456    XtSetArg(args[n], XmNitemCount, size); n++    
2457    XtSetArg(args[n], XmNitems, elements); n++    
2458    XtSetArg(args[n], XmNtopAttachment, XmATTA    
2459    XtSetArg(args[n], XmNtopWidget, labelRight    
2460    XtSetArg(args[n], XmNrightAttachment, XmAT    
2461    XtSetArg(args[n], XmNbottomAttachment, XmA    
2462    // FWJ                                        
2463    XtSetArg(args[n], XmNwidth, 240);  n++;       
2464    //   XtSetArg(args[n], XmNwidth, 280); n++    
2465    // XtSetArg(args[n], XmNwidth, 300); n++;     
2466                                                  
2467    this->myElementList = XmCreateScrolledList    
2468                                                  
2469    XtAddCallback(this->myElementList, XmNbrow    
2470                  (XtCallbackProc) lookAtScene    
2471    xmAddMouseEventHandler(this->myElementList    
2472    XtManageChild(this->myElementList);           
2473                                                  
2474    if (elements != NULL) {                       
2475       for (int i = 0; i < size; i++)             
2476          XmStringFree(elements[i]);              
2477       XtFree((char *) elements);                 
2478    }                                             
2479 }                                                
2480                                                  
2481                                                  
2482 // Pops up a custom dialog listsDialog contai    
2483 // scene elements and viewpoints.                
2484                                                  
2485 void G4OpenInventorXtExaminerViewer::construc    
2486                                                  
2487                                                  
2488 {                                                
2489    // G4cout << "DEBUG constructListsDialog w    
2490    G4OpenInventorXtExaminerViewer * This = (G    
2491    if (This->listsDialog) {                      
2492       return;                                    
2493    }                                             
2494                                                  
2495    if (This->currentState == ANIMATION || Thi    
2496       if (This->animateSensor->isScheduled())    
2497          This->animateSensor->unschedule();      
2498       This->refParticleIdx = This->prevRefIdx    
2499       This->restoreCamera();                     
2500       This->currentState = This->prevState;      
2501    }                                             
2502                                                  
2503    This->step = 1; // Default values             
2504    This->refParticleIdx = 0;                     
2505    if (This->refParticleTrajectory.size()){      
2506       This->prevPt = This->refParticleTraject    
2507    }                                             
2508                                                  
2509    This->getSceneElements();                     
2510                                                  
2511    int n = 0;                                    
2512    Arg args[10];                                 
2513    Atom WM_DELETE_WINDOW;                        
2514                                                  
2515    ///////////////////////CUSTOM listsDialog/    
2516                                                  
2517    Widget topShell;                              
2518    // FWJ gets the topmost window containing     
2519    // This is unnecessary because the parent     
2520    //   topShell = SoXt::getShellWidget(This-    
2521    topShell = w;                                 
2522    // G4cout << "DEBUG PARENT (topShell) FOR     
2523                                                  
2524    // Shell Dialog                               
2525    std::string dialogNameStr = This->fileName    
2526    const int nDialog = dialogNameStr.size() +    
2527    char *dialogName = new char[nDialog];         
2528    strncpy(dialogName, dialogNameStr.c_str(),    
2529                                                  
2530    n = 0;                                        
2531    XtSetArg(args[n], XmNx, 610);  n++;           
2532    This->myShellDialog = XmCreateDialogShell(    
2533                                                  
2534    delete[] dialogName;                          
2535    WM_DELETE_WINDOW = XInternAtom(XtDisplay(w    
2536    XmAddWMProtocolCallback(This->myShellDialo    
2537                            (XtCallbackProc)cl    
2538                                                  
2539    // Main Pane(listsDialog)                     
2540    n = 0;                                        
2541    XtSetArg(args[n], XmNsashWidth, 1);  n++;     
2542    XtSetArg(args[n], XmNsashHeight, 1); n++;     
2543    XtSetArg(args[n], XmNseparatorOn, False);     
2544    // FWJ                                        
2545    This->listsDialog = XmCreatePanedWindow(Th    
2546                                            ar    
2547                                                  
2548                                                  
2549    ////////////////////////TOP FORM//////////    
2550    n = 0;                                        
2551    // FWJ fails compile                          
2552    //   Widget formTop = XmCreateForm(This, (    
2553    Widget formTop = XmCreateForm(This->listsD    
2554                                                  
2555    n = 0;                                        
2556    XtSetArg(args[n], XmNmarginWidth, 8);  n++    
2557    XtSetArg(args[n], XmNmarginHeight, 8); n++    
2558    XtSetArg(args[n], XmNtopAttachment, XmATTA    
2559    XtSetArg(args[n], XmNrightAttachment, XmAT    
2560    XtSetArg(args[n], XmNbottomAttachment, XmA    
2561    Widget formTopRight = XmCreateForm(formTop    
2562                                       n);        
2563                                                  
2564    n = 0;                                        
2565    XtSetArg(args[n], XmNmarginWidth, 8);  n++    
2566    XtSetArg(args[n], XmNmarginHeight, 8); n++    
2567    XtSetArg(args[n], XmNtopAttachment, XmATTA    
2568    XtSetArg(args[n], XmNleftAttachment, XmATT    
2569    XtSetArg(args[n], XmNrightAttachment, XmAT    
2570    XtSetArg(args[n], XmNrightWidget, formTopR    
2571    XtSetArg(args[n], XmNrightOffset, 10); n++    
2572    XtSetArg(args[n], XmNbottomAttachment, XmA    
2573    Widget formTopLeft = XmCreateForm(formTop,    
2574                                                  
2575    /////TOP RIGHT/////                           
2576                                                  
2577    This->createElementsList(formTopRight);       
2578    XtManageChild(formTopRight);                  
2579                                                  
2580    /////TOP LEFT/////                            
2581                                                  
2582    // Label Left                                 
2583    n = 0;                                        
2584    XtSetArg(args[n], XmNtopAttachment, XmATTA    
2585    XtSetArg(args[n], XmNleftAttachment, XmATT    
2586    Widget labelLeft = XmCreateLabelGadget(for    
2587                                           arg    
2588    XtManageChild(labelLeft);                     
2589                                                  
2590    // List Left                                  
2591    n = 0;                                        
2592    XtSetArg(args[n], XmNlistSizePolicy, XmRES    
2593    XtSetArg(args[n], XmNvisibleItemCount, 7);    
2594    // XtSetArg(args[n], XmNwidth, 140); n++;     
2595    XtSetArg(args[n], XmNtopAttachment, XmATTA    
2596    XtSetArg(args[n], XmNtopWidget, labelLeft)    
2597    XtSetArg(args[n], XmNrightAttachment, XmAT    
2598    XtSetArg(args[n], XmNrightWidget, This->my    
2599    XtSetArg(args[n], XmNleftAttachment, XmATT    
2600    XtSetArg(args[n], XmNbottomAttachment, XmA    
2601    // FWJ                                        
2602    XtSetArg(args[n], XmNwidth, 160);  n++;       
2603    // XtSetArg(args[n], XmNwidth, 200); n++;     
2604                                                  
2605    This->myViewPtList = XmCreateScrolledList(    
2606                                                  
2607    if (This->viewPtList.size())                  
2608       This->addViewPoints();                     
2609    XtAddCallback(This->myViewPtList, XmNbrows    
2610                  (XtCallbackProc) loadBookmar    
2611    xmAddMouseEventHandler(This->myViewPtList)    
2612                                                  
2613    XtManageChild(This->myViewPtList);            
2614                                                  
2615    XtManageChild(formTopLeft);                   
2616                                                  
2617    XtManageChild(formTop);                       
2618                                                  
2619    ////////////////////MIDDLE FORM///////////    
2620    n = 0;                                        
2621    XtSetArg(args[n], XmNmarginWidth, 6);  n++    
2622    // FWJ fails compile                          
2623    //   Widget formMiddle = XmCreateForm(This    
2624    Widget formMiddle = XmCreateForm(This->lis    
2625                                                  
2626    // Label                                      
2627    n = 0;                                        
2628    XtSetArg(args[n], XmNleftAttachment, XmATT    
2629    XtSetArg(args[n], XmNtopAttachment, XmATTA    
2630    XtSetArg(args[n], XmNtopWidget, This->myVi    
2631    Widget label = XmCreateLabelGadget(formMid    
2632                                       n);        
2633    XtManageChild(label);                         
2634                                                  
2635    // Text                                       
2636    n = 0;                                        
2637    XtSetArg(args[n], XmNleftAttachment, XmATT    
2638    XtSetArg(args[n], XmNrightAttachment, XmAT    
2639    XtSetArg(args[n], XmNtopAttachment, XmATTA    
2640    XtSetArg(args[n], XmNtopWidget, label);  n    
2641    XtSetArg(args[n], XmNtopOffset, 3);  n++;     
2642    XtSetArg(args[n], XmNmaxLength, This->MAX_    
2643    This->viewPtSelection = XmCreateText(formM    
2644    XtManageChild(This->viewPtSelection);         
2645                                                  
2646    Dimension h1, h2, h;                          
2647    XtVaGetValues(label, XmNheight, &h1, NULL)    
2648    XtVaGetValues(This->viewPtSelection, XmNhe    
2649                                                  
2650    h = (Dimension) (1.1 * (h1 + h2));            
2651                                                  
2652    XtVaSetValues(formMiddle, XmNpaneMaximum,     
2653    XtManageChild(formMiddle);                    
2654                                                  
2655    /////////////////////BOTTOM FORM//////////    
2656    // Action Area Form                           
2657    n = 0;                                        
2658    XtSetArg(args[n], XmNfractionBase, 4); n++    
2659    XtSetArg(args[n], XmNtopAttachment, XmATTA    
2660    XtSetArg(args[n], XmNtopWidget, This->view    
2661    // FWJ fails compile                          
2662    //   Widget formAction = XmCreateForm(This    
2663    Widget formAction = XmCreateForm(This->lis    
2664                                                  
2665    n = 0;                                        
2666    XtSetArg(args[n], XmNleftAttachment, XmATT    
2667    XtSetArg(args[n], XmNrightAttachment, XmAT    
2668    XtSetArg(args[n], XmNtopOffset, 3);  n++;     
2669    XtSetArg(args[n], XmNbottomOffset, 5); n++    
2670    Widget separator = XmCreateSeparatorGadget    
2671                                                  
2672    XtManageChild(separator);                     
2673                                                  
2674    Widget button = XmCreatePushButton(formAct    
2675    XtVaSetValues(button, XmNtopAttachment, Xm    
2676                  separator, XmNbottomAttachme    
2677                  XmATTACH_POSITION, XmNleftPo    
2678                  XmATTACH_POSITION, XmNrightP    
2679                  XmNdefaultButtonShadowThickn    
2680                  NULL);                          
2681                                                  
2682    XtAddCallback(button, XmNactivateCallback,    
2683                  (XtCallbackProc) deleteBookm    
2684    XtManageChild(button);                        
2685                                                  
2686    button = XmCreatePushButton(formAction, (c    
2687    XtVaSetValues(button, XmNtopAttachment, Xm    
2688                  separator, XmNbottomAttachme    
2689                  XmATTACH_POSITION, XmNleftPo    
2690                  XmATTACH_POSITION, XmNrightP    
2691                  XmNdefaultButtonShadowThickn    
2692                  NULL);                          
2693                                                  
2694    XtAddCallback(button, XmNactivateCallback,    
2695                  (XtCallbackProc) renameBookm    
2696    XtManageChild(button);                        
2697                                                  
2698    button = XmCreatePushButton(formAction, (c    
2699    XtVaSetValues(button, XmNtopAttachment, Xm    
2700                  separator, XmNbottomAttachme    
2701                  XmATTACH_POSITION, XmNleftPo    
2702                  XmATTACH_POSITION, XmNrightP    
2703                  XmNdefaultButtonShadowThickn    
2704                  NULL);                          
2705                                                  
2706    XtAddCallback(button, XmNactivateCallback,    
2707    XtManageChild(button);                        
2708                                                  
2709    button = XmCreatePushButton(formAction, (c    
2710    XtVaSetValues(button, XmNtopAttachment, Xm    
2711                  separator, XmNbottomAttachme    
2712                  XmATTACH_POSITION, XmNleftPo    
2713                  XmATTACH_POSITION, XmNrightP    
2714                  XmNdefaultButtonShadowThickn    
2715                  NULL);                          
2716                                                  
2717    XtAddCallback(button, XmNactivateCallback,    
2718    XtManageChild(button);                        
2719                                                  
2720    XtManageChild(formAction);                    
2721    XtVaGetValues(button, XmNheight, &h1, NULL    
2722    XtVaSetValues(formAction, XmNpaneMaximum,     
2723                                                  
2724    XtManageChild(This->listsDialog);             
2725                                                  
2726    ////////////////////////CUSTOM listsDialog    
2727 }                                                
2728                                                  
2729                                                  
2730 // Called when user clicks a scene element in    
2731 // Zooms onto that element.                      
2732 void G4OpenInventorXtExaminerViewer::lookAtSc    
2733                                            Xt    
2734                                            Xt    
2735 {                                                
2736    char *value;                                  
2737    std::string elementField;                     
2738    G4OpenInventorXtExaminerViewer * This = (G    
2739    SoCamera * cam = This->getCamera();           
2740                                                  
2741    if (This->SoXtExaminerViewer::isAnimating(    
2742       This->stopAnimating();                     
2743                                                  
2744    XmListCallbackStruct *cbs = (XmListCallbac    
2745                                                  
2746    value = (char *) XmStringUnparse(cbs->item    
2747                                     XmCHARSET    
2748    if (This->currentState == ANIMATION || Thi    
2749        || This->currentState == PAUSED_ANIMAT    
2750       if (This->animateSensor->isScheduled())    
2751          This->animateSensor->unschedule();      
2752       This->setSuperimpositionEnabled(This->s    
2753       This->maxSpeed = 0.0f;                     
2754       This->scheduleRedraw();                    
2755       This->restoreCamera();                     
2756       This->currentState = This->prevState;      
2757    } else if (This->currentState == VIEWPOINT    
2758       This->setSuperimpositionEnabled(This->s    
2759                                                  
2760    elementField = value;                         
2761                                                  
2762    int idx = elementField.find_last_of("[");     
2763    if(idx == -1)                                 
2764       idx = elementField.size(); //if "[" not    
2765    else                                          
2766       idx--; // To get rid of the space that     
2767                                                  
2768    bool error = false;                           
2769    SoFullPath *path;                             
2770    SoSearchAction search;                        
2771    SoNode *root = This->getSceneManager()->ge    
2772    int counter(1), idxUnderscore = elementFie    
2773                                                  
2774    This->parseString<int>(counter, elementFie    
2775                                                  
2776    SoBaseKit::setSearchingChildren(TRUE);        
2777    search.reset();                               
2778    search.setSearchingAll(TRUE);                 
2779                                                  
2780    if(error) { // No counter is present => el    
2781       This->curEltName = elementField.substr(    
2782       search.setName(This->curEltName.c_str()    
2783       search.apply(root);                        
2784                                                  
2785       path = (SoFullPath *)search.getPath();     
2786    }                                             
2787    else {                                        
2788       This->curEltName = elementField.substr(    
2789       search.setInterest(SoSearchAction::ALL)    
2790       search.setName(This->curEltName.c_str()    
2791       search.apply(root);                        
2792                                                  
2793       SoPathList &pl = search.getPaths();        
2794       path = (SoFullPath *)pl[counter - 1]; /    
2795    }                                             
2796                                                  
2797    G4ThreeVector global;                         
2798                                                  
2799    if ((idx > 0) && (path)) {                    
2800                                                  
2801       if(!This->refParticleTrajectory.empty()    
2802                                                  
2803          SoGetBoundingBoxAction bAction(This-    
2804          bAction.apply(path);                    
2805          SbBox3f bBox = bAction.getBoundingBo    
2806          SbVec3f elementCoord = bBox.getCente    
2807                                                  
2808          This->refParticleIdx = 0;               
2809          SbVec3f p;                              
2810                                                  
2811          float absLengthNow, absLengthMin;       
2812          int maxIdx = This->refParticleTrajec    
2813          int targetIdx = 0;                      
2814          SbVec3f dir;                            
2815                                                  
2816          p = This->refParticleTrajectory[This    
2817          absLengthMin = (p - elementCoord).le    
2818          This->refParticleIdx++;                 
2819                                                  
2820          // Find a ref. particle's point clos    
2821          while (This->refParticleIdx < maxIdx    
2822             p = This->refParticleTrajectory[T    
2823             absLengthNow = (p - elementCoord)    
2824                                                  
2825             if (absLengthNow < absLengthMin)     
2826                absLengthMin = absLengthNow;      
2827                targetIdx = This->refParticleI    
2828             }                                    
2829             This->refParticleIdx++;              
2830          }                                       
2831                                                  
2832          if (This->currentState != BEAMLINE)     
2833             SbVec3f p1, pN;                      
2834             This->currentState = BEAMLINE;       
2835             This->prevParticleDir = SbVec3f(0    
2836                                                  
2837             p1 = This->prevPt = This->refPart    
2838             pN = This->refParticleTrajectory[    
2839             This->distance = (pN - p1).length    
2840                                                  
2841             // FWJ Rather than switching to a    
2842             // to keep the same height(magnif    
2843             // if (cam->isOfType(SoOrthograph    
2844             //    ((SoOrthographicCamera *) c    
2845             // // FWJ Restore the default hei    
2846             // // ((SoOrthographicCamera *) c    
2847             // }                                 
2848             // else if (cam->isOfType(SoPersp    
2849                                                  
2850             // FWJ required to avoid extreme     
2851             if (cam->isOfType(SoPerspectiveCa    
2852                ((SoPerspectiveCamera*)cam)->h    
2853                                                  
2854          } else {                                
2855             if (cam->isOfType(SoPerspectiveCa    
2856                This->distance = (This->prevPt    
2857          }                                       
2858          This->refParticleIdx = targetIdx;       
2859                                                  
2860          ////////////////////////////////////    
2861          This->setSuperimpositionEnabled(This    
2862          This->axisSwitch->whichChild.setValu    
2863          This->animSpeedOutlineSwitch->whichC    
2864          This->animSpeedSwitch->whichChild.se    
2865          This->scheduleRedraw();                 
2866          ////////////////////////////////////    
2867                                                  
2868          This->moveCamera(This->distance);       
2869          XtFree(value);                          
2870                                                  
2871       }                                          
2872                                                  
2873       else{                                      
2874          This->offsetFromCenter.setValue(0, 0    
2875          This->distance = 50;// small number     
2876          This->upVector.setValue(0, 1, 0);       
2877          This->moveCamera(This->distance);       
2878          cam->viewAll(path, This->getViewport    
2879       }                                          
2880    }                                             
2881                                                  
2882    XmTextSetString(This->viewPtSelection, NUL    
2883 }                                                
2884                                                  
2885                                                  
2886 // Destroyes listsDialog and resets necessary    
2887                                                  
2888 void G4OpenInventorXtExaminerViewer::closeLis    
2889                                          XtPo    
2890                                          XtPo    
2891 {                                                
2892    G4OpenInventorXtExaminerViewer * This = (G    
2893                                                  
2894    This->sceneElements.clear();                  
2895    This->refParticleTrajectory.clear();          
2896                                                  
2897    This->currentState = GENERAL;                 
2898    XtDestroyWidget(This->myShellDialog);         
2899    This->listsDialog = NULL;                     
2900 }                                                
2901                                                  
2902 // Called when user clicks left arrow button.    
2903 void G4OpenInventorXtExaminerViewer::prevView    
2904                                                  
2905    G4OpenInventorXtExaminerViewer * This = (G    
2906                                                  
2907    if (This->viewPtIdx == 0)                     
2908       This->viewPtIdx = This->viewPtList.size    
2909    else                                          
2910       This->viewPtIdx--;                         
2911                                                  
2912    This->writeViewPtIdx();                       
2913    This->setViewPt();                            
2914 }                                                
2915                                                  
2916 // Called when user clicks right arrow button    
2917 void G4OpenInventorXtExaminerViewer::nextView    
2918                                                  
2919    G4OpenInventorXtExaminerViewer * This = (G    
2920                                                  
2921    if (This->viewPtIdx >= (int) This->viewPtL    
2922       This->viewPtIdx = 0;                       
2923    else                                          
2924       This->viewPtIdx++;                         
2925                                                  
2926    This->writeViewPtIdx();                       
2927    This->setViewPt();                            
2928 }                                                
2929                                                  
2930                                                  
2931 // Updates the viewPtIdx in a viewpoint file.    
2932                                                  
2933 void G4OpenInventorXtExaminerViewer::writeVie    
2934 {                                                
2935    std::string idxStr;                           
2936    std::stringstream out;                        
2937    out << viewPtIdx;                             
2938    idxStr = out.str();                           
2939    fileOut.seekp(0, std::ios::beg);              
2940                                                  
2941    while ((int) idxStr.length() < MAX_VP_IDX)    
2942       idxStr += " ";                             
2943    }                                             
2944                                                  
2945    fileOut << idxStr << "\n";                    
2946    fileOut.flush();                              
2947    fileOut.seekp(0, std::ios::end);              
2948 }                                                
2949                                                  
2950                                                  
2951 // Sets the viewpoint based on camera data th    
2952                                                  
2953 void G4OpenInventorXtExaminerViewer::setViewP    
2954 {                                                
2955    if (currentState == ANIMATION || currentSt    
2956        || currentState == ROTATING) {            
2957                                                  
2958       if (animateSensor->isScheduled())          
2959          animateSensor->unschedule();            
2960       setSuperimpositionEnabled(superimpositi    
2961       maxSpeed = 0.0f;                           
2962       scheduleRedraw();                          
2963    }                                             
2964                                                  
2965    SoCamera * camera = getCamera();              
2966    if (camera == NULL) {                         
2967       String dialogName = (char *) "Missing C    
2968       std::string msg = "Camera is null. Unab    
2969       warningMsgDialog(msg, dialogName, NULL)    
2970       return;                                    
2971    }                                             
2972                                                  
2973    if (!viewPtList.size()) {                     
2974       String dialogName = (char *) "Missing V    
2975       std::string msg = "There are no viewpoi    
2976       warningMsgDialog(msg, dialogName, NULL)    
2977       return;                                    
2978    }                                             
2979                                                  
2980    if (SoXtExaminerViewer::isAnimating())        
2981       stopAnimating();                           
2982                                                  
2983    if (currentState != VIEWPOINT) {              
2984       currentState = VIEWPOINT;                  
2985       ///////////////////////////////////////    
2986       setSuperimpositionEnabled(superimpositi    
2987       axisSwitch->whichChild.setValue(SO_SWIT    
2988       animSpeedOutlineSwitch->whichChild.setV    
2989       animSpeedSwitch->whichChild.setValue(SO    
2990                                                  
2991       scheduleRedraw();                          
2992       ///////////////////////////////////////    
2993    }                                             
2994                                                  
2995    curViewPtName = viewPtList[viewPtIdx].view    
2996    camera->viewportMapping = viewPtList[viewP    
2997    camera->position = viewPtList[viewPtIdx].p    
2998    camera->orientation = viewPtList[viewPtIdx    
2999    camera->aspectRatio = viewPtList[viewPtIdx    
3000    camera->nearDistance = viewPtList[viewPtId    
3001    camera->farDistance = viewPtList[viewPtIdx    
3002    camera->focalDistance = viewPtList[viewPtI    
3003                                                  
3004    // Restore camera height (changed by zoomi    
3005    if (camera->isOfType(SoPerspectiveCamera::    
3006       if (viewPtList[viewPtIdx].camType == OR    
3007          toggleCameraType();                     
3008          camera = getCamera();                   
3009          ((SoOrthographicCamera *) camera)->h    
3010                                                  
3011       } else                                     
3012          ((SoPerspectiveCamera *) camera)->he    
3013                                                  
3014    } else if (camera->isOfType(SoOrthographic    
3015       if (viewPtList[viewPtIdx].camType == PE    
3016          toggleCameraType();                     
3017          camera = getCamera();                   
3018          ((SoPerspectiveCamera *) camera)->he    
3019                                                  
3020       } else                                     
3021          ((SoOrthographicCamera *) camera)->h    
3022                                                  
3023    } else {                                      
3024       SoDebugError::post("G4OpenInventorXtExa    
3025                          "Only Perspective an    
3026       return;                                    
3027    }                                             
3028                                                  
3029 }                                                
3030                                                  
3031                                                  
3032 // Pops up a prompt asking for a new viewpoin    
3033                                                  
3034 void G4OpenInventorXtExaminerViewer::saveView    
3035                                      XtPointe    
3036                                      XtPointe    
3037 {                                                
3038    G4OpenInventorXtExaminerViewer * This = (G    
3039                                                  
3040    if (This->fileName.empty()) {                 
3041       newViewPtFileCB(w, This, NULL);            
3042       This->returnToSaveVP = true;               
3043       return; // Need to return and call this    
3044    }                                             
3045                                                  
3046    int n = 0;                                    
3047    Arg args[4];                                  
3048    Widget nameViewPtDialog;                      
3049    Widget parent = This->getParentWidget(); /    
3050    XmString label = XmStringCreateLocalized((    
3051                                                  
3052    XtSetArg(args[n], XmNselectionLabelString,    
3053 // Prevent the dialog from closing automatica    
3054    XtSetArg(args[n], XmNautoUnmanage, False);    
3055 // FWJ                                           
3056    XtSetArg(args[n], XmNtitle, "Save Bookmark    
3057    nameViewPtDialog = XmCreatePromptDialog(pa    
3058                                            ar    
3059                                                  
3060    XmStringFree(label);                          
3061    XtAddCallback(nameViewPtDialog, XmNokCallb    
3062    XtAddCallback(nameViewPtDialog, XmNcancelC    
3063                  getViewPtNameCancelCB, This)    
3064    // Coverity gcc8 bad cast warning             
3065    //            (XtCallbackProc) XtDestroyWi    
3066                                                  
3067    Widget text = XtNameToWidget(nameViewPtDia    
3068    XtVaSetValues(text, XmNmaxLength, This->MA    
3069    std::string autoName = "";                    
3070    if (!This->warningFlag) { //leave the Text    
3071       autoName = This->viewPtAutoName();         
3072    }                                             
3073    This->warningFlag = false;                    
3074    XmTextSetString(text, (char *) autoName.c_    
3075    XmTextSetInsertionPosition(text, autoName.    
3076                                                  
3077    XtUnmanageChild(XtNameToWidget(nameViewPtD    
3078    XtManageChild(nameViewPtDialog);              
3079 }                                                
3080                                                  
3081                                                  
3082 std::string G4OpenInventorXtExaminerViewer::v    
3083 {                                                
3084    std::string viewPt;                           
3085    std::stringstream sstream;                    
3086    std::vector<int> existingViewPts;             
3087    int tmp;                                      
3088                                                  
3089    //Build the list of names of the form view    
3090    for (unsigned int i = 0; i < this->viewPtL    
3091       viewPt = this->viewPtList[i].viewPtName    
3092       if (viewPt.find("viewpoint_") != std::s    
3093          tmp = atoi(viewPt.substr(10).c_str()    
3094          if (tmp == 0) {                         
3095             //0 means couldn't convert to int    
3096             if (!viewPt.compare("viewpoint_0"    
3097                existingViewPts.push_back(0);     
3098          } else                                  
3099             existingViewPts.push_back(tmp);      
3100       }                                          
3101    }                                             
3102                                                  
3103    sstream.str("");                              
3104    sstream.clear();                              
3105                                                  
3106    //Return the view viewpoint_* name availab    
3107    if (existingViewPts.size() > 0) {             
3108       int vpNum = 0;                             
3109       while (true) {                             
3110          if (std::find(existingViewPts.begin(    
3111              == existingViewPts.end()) {         
3112             sstream << "viewpoint_" << vpNum;    
3113             return sstream.str();                
3114          }                                       
3115          ++vpNum;                                
3116       }                                          
3117    } else {                                      
3118       return "viewpoint_0";                      
3119    }                                             
3120    return "";                                    
3121 }                                                
3122                                                  
3123                                                  
3124 void G4OpenInventorXtExaminerViewer::abbrOutp    
3125                                    XtPointer     
3126                                    XtPointer)    
3127 {                                                
3128    G4OpenInventorXtExaminerViewer * This =       
3129       (G4OpenInventorXtExaminerViewer *) clie    
3130 // G4cout << "DISARMCALLBACK abbrOutputFlag="    
3131    This->abbrOutputFlag = !(This->abbrOutputF    
3132 }                                                
3133                                                  
3134                                                  
3135 void G4OpenInventorXtExaminerViewer::pickRefP    
3136                                     XtPointer    
3137                                     XtPointer    
3138 {                                                
3139    G4OpenInventorXtExaminerViewer * This = (G    
3140                                                  
3141    // Save viewing state and go to picking mo    
3142    This->viewingBeforePickRef = This->isViewi    
3143    if(This->isViewing())                         
3144       This->setViewing(false);                   
3145    This->setComponentCursor(SoXtCursor(SoXtCu    
3146    This->pickRefPathFlag = true;                 
3147 }                                                
3148                                                  
3149                                                  
3150 void G4OpenInventorXtExaminerViewer::switchWi    
3151                                     XtPointer    
3152                                     XtPointer    
3153 {                                                
3154    G4OpenInventorXtExaminerViewer* This =        
3155       (G4OpenInventorXtExaminerViewer*)client    
3156    //   xmToggleButton theToggleButton = (xmT    
3157    if (XmToggleButtonGetState(w)) {              
3158          This->setDrawStyle(SoXtViewer::STILL    
3159          This->setDrawStyle(SoXtViewer::INTER    
3160       } else {                                   
3161          This->setDrawStyle(SoXtViewer::STILL    
3162          This->setDrawStyle(SoXtViewer::INTER    
3163                             SoXtViewer::VIEW_    
3164       }                                          
3165 }                                                
3166                                                  
3167                                                  
3168 // Examines new viewpoint name and if OK call    
3169                                                  
3170 void G4OpenInventorXtExaminerViewer::getViewP    
3171                                         XtPoi    
3172                                         XtPoi    
3173 {                                                
3174    char *name = NULL;                            
3175    std::string strName;                          
3176    G4OpenInventorXtExaminerViewer * This = (G    
3177    XmSelectionBoxCallbackStruct *cbs =           
3178       (XmSelectionBoxCallbackStruct *) call_d    
3179    XmStringGetLtoR(cbs->value, XmFONTLIST_DEF    
3180                                                  
3181    if (!name) {                                  
3182       return;                                    
3183    }                                             
3184    if (!*name) {                                 
3185       XtFree(name);                              
3186       return;                                    
3187    }                                             
3188                                                  
3189    strName = name;                               
3190    XtFree(name);                                 
3191                                                  
3192    int beg = strName.find_first_not_of(' ');     
3193    int end = strName.find_last_not_of(' ');      
3194    strName = strName.substr(beg, end - beg +     
3195                                                  
3196    bool nameExists = false;                      
3197    int size = This->viewPtList.size();           
3198    for (int i = 0; i < size; i++) {              
3199       if (!strcmp(This->viewPtList[i].viewPtN    
3200          nameExists = true;                      
3201          break;                                  
3202       }                                          
3203    }                                             
3204                                                  
3205    if (!nameExists) {                            
3206       const int nVPName = This->MAX_VP_NAME +    
3207       name = new char[nVPName];                  
3208       strncpy(name, strName.c_str(), nVPName)    
3209       if (This->viewPtIdx == -1)                 
3210          This->viewPtIdx = 0;                    
3211       This->saveViewPt(name);                    
3212       if (This->listsDialog) {                   
3213          XmListAddItemUnselected(This->myView    
3214       }                                          
3215       //Dismiss the nameViewPtDialog dialog      
3216       XtUnmanageChild(w);                        
3217    } else {                                      
3218       String dialogName = (char *) "Existing     
3219       std::string msg = "The viewpoint alread    
3220       This->warningMsgDialog(msg, dialogName,    
3221                                                  
3222    }                                             
3223 }                                                
3224                                                  
3225 void G4OpenInventorXtExaminerViewer::getViewP    
3226                                         XtPoi    
3227                                         XtPoi    
3228 {                                                
3229    XtUnmanageChild(w);                           
3230 }                                                
3231                                                  
3232                                                  
3233 // Saves current camera parameters to a viewp    
3234                                                  
3235 void G4OpenInventorXtExaminerViewer::saveView    
3236 {                                                
3237    SbVec3f axis;                                 
3238    viewPtData tmp;                               
3239    float x, y, z, angle;                         
3240    SoCamera * camera = getCamera();              
3241                                                  
3242    if (viewPtList.size() == 0) {                 
3243       writeViewPtIdx();                          
3244       XtSetSensitive(nextViewPtButton, True);    
3245       XtSetSensitive(prevViewPtButton, True);    
3246    }                                             
3247                                                  
3248    tmp.viewPtName = name;                        
3249    tmp.viewportMapping = camera->viewportMapp    
3250    tmp.position = camera->position.getValue()    
3251    tmp.orientation = camera->orientation.getV    
3252    tmp.aspectRatio = camera->aspectRatio.getV    
3253    tmp.nearDistance = camera->nearDistance.ge    
3254    tmp.farDistance = camera->farDistance.getV    
3255    tmp.focalDistance = camera->focalDistance.    
3256                                                  
3257    // Save camera height (changed by zooming)    
3258    if (camera->isOfType(SoPerspectiveCamera::    
3259       tmp.height = ((SoPerspectiveCamera *) c    
3260       tmp.camType = PERSPECTIVE;                 
3261    } else if (camera->isOfType(SoOrthographic    
3262       tmp.height = ((SoOrthographicCamera *)     
3263       tmp.camType = ORTHOGRAPHIC;                
3264    } else {                                      
3265       SoDebugError::post("G4OpenInventorXtExa    
3266                          "Only Perspective an    
3267       return;                                    
3268    }                                             
3269                                                  
3270    viewPtList.push_back(tmp);                    
3271                                                  
3272    // Now save the view point to a .txt file     
3273    std::string vpName = name;                    
3274                                                  
3275    while ((int) vpName.size() <= MAX_VP_NAME)    
3276       vpName += " ";                             
3277                                                  
3278    fileOut << vpName << std::endl;               
3279    tmp.position.getValue(x, y, z);               
3280    fileOut << x << " " << y << " " << z << st    
3281                                                  
3282    // Reusing x, y and z for storing the axis    
3283    tmp.orientation.getValue(axis, angle);        
3284    axis.getValue(x, y, z);                       
3285    fileOut << x << " " << y << " " << z << "     
3286                                                  
3287    fileOut << tmp.camType << " " << tmp.heigh    
3288    fileOut << tmp.focalDistance << " ";          
3289    fileOut << tmp.nearDistance << " ";           
3290    fileOut << tmp.farDistance << std::endl;      
3291    fileOut << tmp.viewportMapping << " ";        
3292    fileOut << tmp.aspectRatio << "\n" << std:    
3293    fileOut.flush();                              
3294    viewPtIdx++;                                  
3295 }                                                
3296                                                  
3297                                                  
3298 void G4OpenInventorXtExaminerViewer::deleteVi    
3299                                      XtPointe    
3300                                      XtPointe    
3301 {                                                
3302    G4OpenInventorXtExaminerViewer * This =       
3303       (G4OpenInventorXtExaminerViewer *) clie    
3304    This->deleteViewPt();                         
3305 }                                                
3306                                                  
3307                                                  
3308 // Deletes current viewpoint the user is look    
3309 // Updates the input file and bookmarks as we    
3310                                                  
3311 void G4OpenInventorXtExaminerViewer::deleteVi    
3312 {                                                
3313    std::string line;                             
3314    int end;                                      
3315    fileIn.open(fileName.c_str());                
3316    std::ofstream out("temporaryFile.txt");       
3317                                                  
3318    if (!vpName)                                  
3319       vpName = viewPtList[viewPtIdx].viewPtNa    
3320                                                  
3321    if (listsDialog) {                            
3322       XmString vpNameStr = XmStringCreateLoca    
3323                                                  
3324       XmListDeleteItem(myViewPtList, vpNameSt    
3325       XmStringFree(vpNameStr);                   
3326    }                                             
3327                                                  
3328    getline(fileIn, line); // Printing the vie    
3329    out << line << "\n";                          
3330                                                  
3331    while (getline(fileIn, line)) {               
3332       end = line.find_last_not_of(' ');          
3333       line = line.substr(0, end + 1);            
3334       if (!strcmp(line.c_str(), vpName)) { //    
3335          while (line.size()) {                   
3336             getline(fileIn, line);               
3337          }                                       
3338                                                  
3339          while (getline(fileIn, line))           
3340             out << line << "\n";                 
3341       } else {                                   
3342          while (line.size()) {                   
3343             out << line << "\n";                 
3344             getline(fileIn, line);               
3345          }                                       
3346          out << "\n";                            
3347       }                                          
3348    }                                             
3349                                                  
3350    int idx = 0; // Remove viewpoint from the     
3351    int size = viewPtList.size();                 
3352    while (idx < size) {                          
3353       if (!strcmp(viewPtList[idx].viewPtName,    
3354          viewPtList.erase(viewPtList.begin()     
3355          break;                                  
3356       }                                          
3357       idx++;                                     
3358    }                                             
3359                                                  
3360    out.close();                                  
3361    fileOut.close();                              
3362    fileIn.clear();                               
3363    fileIn.close();                               
3364                                                  
3365    // FWJ check return status                    
3366    int istat = remove(fileName.c_str());         
3367    if (istat == -1) {                            
3368       char dialogName[] = "Warning";             
3369       warningMsgDialog("Error removing bookma    
3370                        NULL);                    
3371    }                                             
3372    istat = rename("temporaryFile.txt", fileNa    
3373    if (istat == -1) {                            
3374       char dialogName[] = "Warning";             
3375       warningMsgDialog("Error renaming bookma    
3376                        NULL);                    
3377    }                                             
3378    fileOut.open(fileName.c_str(), std::ios::i    
3379    fileOut.seekp(0, std::ios::end);              
3380                                                  
3381    if (!viewPtList.size()) { // viewPtList is    
3382       curViewPtName = (char *) "";               
3383       scheduleRedraw();                          
3384       XtSetSensitive(nextViewPtButton, False)    
3385       XtSetSensitive(prevViewPtButton, False)    
3386    } else {                                      
3387       if (viewPtIdx >= (int) viewPtList.size(    
3388          viewPtIdx--;                            
3389       writeViewPtIdx();                          
3390       setViewPt();                               
3391    }                                             
3392 }                                                
3393                                                  
3394                                                  
3395 // Renames currently selected viewpoint.         
3396                                                  
3397 void G4OpenInventorXtExaminerViewer::renameVi    
3398 {                                                
3399    int idx = 0, end, pos;                        
3400    int size = viewPtList.size();                 
3401    std::string line, newName;                    
3402    fileIn.open(fileName.c_str());                
3403                                                  
3404    newName = vpName;                             
3405    while ((int) newName.size() < MAX_VP_NAME)    
3406       newName += " ";                            
3407                                                  
3408    getline(fileIn, line);                        
3409    pos = fileIn.tellg();                         
3410    while (getline(fileIn, line)) {               
3411       end = line.find_last_not_of(' ');          
3412       line = line.substr(0, end + 1);            
3413       if (!strcmp(line.c_str(), curViewPtName    
3414          fileOut.seekp(pos);                     
3415          fileOut << newName;                     
3416          fileOut.seekp(0, std::ios::end); //     
3417          break;                                  
3418       }                                          
3419       while (line.size())                        
3420          getline(fileIn, line);                  
3421       pos = fileIn.tellg();                      
3422    }                                             
3423                                                  
3424    fileIn.close();                               
3425    fileIn.clear();                               
3426                                                  
3427    while (idx < size) {                          
3428       if (!strcmp(viewPtList[idx].viewPtName,    
3429          strcpy(viewPtList[idx].viewPtName, v    
3430          break;                                  
3431       }                                          
3432       idx++;                                     
3433    }                                             
3434 }                                                
3435                                                  
3436                                                  
3437 // Rewrites entire viewpoint file with sorted    
3438                                                  
3439 void G4OpenInventorXtExaminerViewer::sortView    
3440 {                                                
3441    SbVec3f axis;                                 
3442    float x, y, z, angle;                         
3443    int sortIdx = 0, unsortIdx = 0;               
3444                                                  
3445    if (fileOut.is_open())                        
3446       fileOut.close();                           
3447                                                  
3448    fileOut.open(fileName.c_str()); // Erase c    
3449                                                  
3450    writeViewPtIdx();                             
3451                                                  
3452    int size = sortedViewPts.size();              
3453    while (sortIdx < size) {                      
3454       while (strcmp(sortedViewPts[sortIdx].c_    
3455                     viewPtList[unsortIdx].vie    
3456          unsortIdx++;                            
3457                                                  
3458       std::string vpName = viewPtList[unsortI    
3459                                                  
3460       while ((int) vpName.size() < MAX_VP_NAM    
3461          vpName += " ";                          
3462       fileOut << vpName << std::endl;            
3463       viewPtList[unsortIdx].position.getValue    
3464       fileOut << x << " " << y << " " << z <<    
3465                                                  
3466       // Reusing x, y and z for storing the a    
3467       viewPtList[unsortIdx].orientation.getVa    
3468       axis.getValue(x, y, z);                    
3469       fileOut << x << " " << y << " " << z <<    
3470                                                  
3471       fileOut << viewPtList[unsortIdx].camTyp    
3472               << viewPtList[unsortIdx].height    
3473       fileOut << viewPtList[unsortIdx].focalD    
3474                                                  
3475       fileOut << viewPtList[unsortIdx].nearDi    
3476                                                  
3477       fileOut << viewPtList[unsortIdx].farDis    
3478                                                  
3479       fileOut << viewPtList[unsortIdx].viewpo    
3480       fileOut << viewPtList[unsortIdx].aspect    
3481       fileOut.flush();                           
3482                                                  
3483       unsortIdx = 0;                             
3484       sortIdx++;                                 
3485    }                                             
3486 }                                                
3487                                                  
3488                                                  
3489 //  Loads view point data from a file into a     
3490                                                  
3491 bool G4OpenInventorXtExaminerViewer::loadView    
3492 {                                                
3493    bool error = false;                           
3494    viewPtData tmp;                               
3495    std::string token;                            
3496    SbVec3f axis;                                 
3497    SbRotation orient;                            
3498    float x(0.), y(0.), z(0.), angle(0.);         
3499                                                  
3500    // Gets the last view point accessed, stor    
3501    fileIn >> token;                              
3502    parseString<int>(viewPtIdx, token, error);    
3503    getline(fileIn, token); // Remove "\n"        
3504    // Converts data from string type into nec    
3505    while (getline(fileIn, token)) {              
3506                                                  
3507       int end = token.find_last_not_of(' ');     
3508       token = token.substr(0, end + 1);          
3509                                                  
3510       char *vpName = new char[token.size() +     
3511       strcpy(vpName, token.c_str());             
3512       tmp.viewPtName = vpName;                   
3513       fileIn >> token;                           
3514                                                  
3515       parseString<float>(x, token, error);       
3516       fileIn >> token;                           
3517       parseString<float>(y, token, error);       
3518       fileIn >> token;                           
3519       parseString<float>(z, token, error);       
3520       fileIn >> token;                           
3521       tmp.position = axis.setValue(x, y, z);     
3522                                                  
3523       parseString<float>(x, token, error);       
3524       fileIn >> token;                           
3525       parseString<float>(y, token, error);       
3526       fileIn >> token;                           
3527       parseString<float>(z, token, error);       
3528       fileIn >> token;                           
3529       parseString<float>(angle, token, error)    
3530       fileIn >> token;                           
3531       orient.setValue(axis.setValue(x, y, z),    
3532       tmp.orientation = orient.getValue();       
3533                                                  
3534       int camType(0);                            
3535       parseString<int>(camType, token, error)    
3536       fileIn >> token;                           
3537       tmp.camType = (CameraType) camType;        
3538                                                  
3539       parseString<float>(tmp.height, token, e    
3540       fileIn >> token;                           
3541       parseString<float>(tmp.focalDistance, t    
3542       fileIn >> token;                           
3543       parseString<float>(tmp.nearDistance, to    
3544       fileIn >> token;                           
3545       parseString<float>(tmp.farDistance, tok    
3546       fileIn >> token;                           
3547       parseString<int>(tmp.viewportMapping, t    
3548       fileIn >> token;                           
3549       parseString<float>(tmp.aspectRatio, tok    
3550                                                  
3551       getline(fileIn, token); // To remove "\    
3552       getline(fileIn, token);                    
3553                                                  
3554       if (error) {                               
3555          viewPtIdx = 0;                          
3556          viewPtList.clear();                     
3557          return false;                           
3558       }                                          
3559       viewPtList.push_back(tmp);                 
3560    }                                             
3561                                                  
3562    return true;                                  
3563 }                                                
3564                                                  
3565                                                  
3566 // Converts a string type word into a float t    
3567                                                  
3568 template<class T>                                
3569 void G4OpenInventorXtExaminerViewer::parseStr    
3570                                                  
3571 {                                                
3572    std::istringstream str(s);                    
3573    if ((str >> t).fail())                        
3574       error = true;                              
3575 }                                                
3576                                                  
3577                                                  
3578 // Generic fileSelectionDialog creation.         
3579                                                  
3580 void G4OpenInventorXtExaminerViewer::popUpFil    
3581                                                  
3582                                                  
3583                                                  
3584 {                                                
3585    int n;                                        
3586    Arg args[3];                                  
3587    Widget parent, scrollWidget;                  
3588    parent = SoXt::getShellWidget(getParentWid    
3589                                                  
3590    if (dialog == NULL) {                         
3591                                                  
3592       // Change the 'OK' button to whatever b    
3593       XmString str = XmStringCreateLocalized(    
3594                                                  
3595       n = 0;                                     
3596       XtSetArg(args[n], XmNokLabelString, str    
3597       XtSetArg(args[n], XmNresizePolicy, XmRE    
3598                                                  
3599       dialog = XmCreateFileSelectionDialog(pa    
3600                                            (c    
3601                                                  
3602       XtAddCallback(dialog, XmNokCallback, cb    
3603       XtAddCallback(dialog, XmNcancelCallback    
3604                                                  
3605       // Adding scrolling functionality to th    
3606       scrollWidget = XmFileSelectionBoxGetChi    
3607       if (scrollWidget)                          
3608          xmAddMouseEventHandler(scrollWidget)    
3609       scrollWidget = XmFileSelectionBoxGetChi    
3610       if (scrollWidget)                          
3611          xmAddMouseEventHandler(scrollWidget)    
3612                                                  
3613       XtUnmanageChild(XmSelectionBoxGetChild(    
3614       XmStringFree(str);                         
3615    }                                             
3616    XtManageChild(dialog);                        
3617 }                                                
3618                                                  
3619                                                  
3620 // Generic fileSelectionDialog cancelation.      
3621                                                  
3622 void G4OpenInventorXtExaminerViewer::cancelFi    
3623                                                  
3624                                                  
3625 {                                                
3626    XtUnmanageChild(w);                           
3627 }                                                
3628                                                  
3629                                                  
3630 // Displays a file selection dialog that allo    
3631                                                  
3632 void G4OpenInventorXtExaminerViewer::openView    
3633                                        XtPoin    
3634                                        XtPoin    
3635 {                                                
3636    G4OpenInventorXtExaminerViewer * This =       
3637       (G4OpenInventorXtExaminerViewer *) clie    
3638    This->popUpFileSelDialog(This->openFileDia    
3639                             viewPtFileSelecte    
3640 }                                                
3641                                                  
3642                                                  
3643 void G4OpenInventorXtExaminerViewer::viewPtFi    
3644                                                  
3645                                                  
3646 {                                                
3647    char *file = NULL;                            
3648    G4OpenInventorXtExaminerViewer * This = (G    
3649    XmFileSelectionBoxCallbackStruct *cbs =       
3650       (XmFileSelectionBoxCallbackStruct *) ca    
3651                                                  
3652    // Get the file                               
3653    if (cbs) {                                    
3654       if (!(file = (char *) XmStringUnparse(c    
3655                                             X    
3656                                             X    
3657          SoDebugError::post("G4OpenInventorXt    
3658                             "Internal error d    
3659          return;                                 
3660       }                                          
3661                                                  
3662       This->fileIn.open(file);                   
3663       if (!This->fileIn.fail()) {                
3664          // Opens a file without erasing it      
3665          This->cleanUpAfterPrevFile();           
3666          if (!This->loadViewPts()) {             
3667             String dialogName = (char *) "Err    
3668             std::string msg = "Wrong or corru    
3669             This->warningMsgDialog(msg, dialo    
3670          } else {                                
3671             This->fileName = file;               
3672             This->fileOut.open(This->fileName    
3673             This->fileOut.seekp(0, std::ios::    
3674                                                  
3675             if (!This->listsDialog)              
3676                constructListsDialog(w, This,     
3677             else                                 
3678                This->addViewPoints();            
3679                                                  
3680             std::string newDialogName = This-    
3681                                                  
3682             XtVaSetValues(This->myShellDialog    
3683                           (char *) newDialogN    
3684                                                  
3685             if (This->viewPtList.size()) {       
3686                This->setViewPt();                
3687                XmTextSetString(This->viewPtSe    
3688                XtSetSensitive(This->nextViewP    
3689                XtSetSensitive(This->prevViewP    
3690             } else {                             
3691                XtSetSensitive(This->nextViewP    
3692                XtSetSensitive(This->prevViewP    
3693             }                                    
3694                                                  
3695             XtUnmanageChild(w);                  
3696          }                                       
3697                                                  
3698          This->fileIn.close();                   
3699       } else {                                   
3700          String dialogName = (char *) "Nonexi    
3701          std::string msg = "Unable to open fi    
3702          This->warningMsgDialog(msg, dialogNa    
3703       }                                          
3704    }                                             
3705                                                  
3706    This->fileIn.clear();                         
3707    XtFree(file);                                 
3708 }                                                
3709                                                  
3710                                                  
3711 // Adds bookmarks to listsDialog.                
3712                                                  
3713 void G4OpenInventorXtExaminerViewer::addViewP    
3714 {                                                
3715    int size = viewPtList.size();                 
3716    if (!size)                                    
3717       return;                                    
3718                                                  
3719    XmString *viewPts;                            
3720                                                  
3721    viewPts = (XmString *) XtMalloc(size * siz    
3722    for (int i = 0; i < size; i++)                
3723       viewPts[i] = XmStringCreateLocalized(vi    
3724                                                  
3725    XmListAddItemsUnselected(myViewPtList, vie    
3726                                                  
3727    if (viewPts != NULL) {                        
3728       for (int i = 0; i < size; i++)             
3729          XmStringFree(viewPts[i]);               
3730       XtFree((char *) viewPts);                  
3731    }                                             
3732 }                                                
3733                                                  
3734                                                  
3735 // Called before loading a new viewpoint file    
3736 // Resets member fields to default values.       
3737                                                  
3738 void G4OpenInventorXtExaminerViewer::cleanUpA    
3739 {                                                
3740    viewPtIdx = -1;                               
3741    viewPtList.clear();                           
3742    setSuperimpositionEnabled(superimposition,    
3743    scheduleRedraw();                             
3744    currentState = GENERAL;                       
3745    if (fileOut.is_open())                        
3746       fileOut.close();                           
3747    if (listsDialog) // Clear viewpoints          
3748       XmListDeleteAllItems(myViewPtList);        
3749 }                                                
3750                                                  
3751                                                  
3752 // Generic function for displaying a warning     
3753                                                  
3754 void G4OpenInventorXtExaminerViewer::warningM    
3755                                                  
3756                                                  
3757 {                                                
3758    Arg args[5];                                  
3759    unsigned int n;                               
3760    XmString warningMsg;                          
3761                                                  
3762    warningMsg = XmStringCreateLocalized((char    
3763                                                  
3764    n = 0;                                        
3765    XtSetArg(args[n], XmNmessageString, warnin    
3766    Widget warningDialog = XmCreateWarningDial    
3767    if (cb)                                       
3768       XtAddCallback(warningDialog, XmNokCallb    
3769                                                  
3770    XmStringFree(warningMsg);                     
3771                                                  
3772    XtVaSetValues (warningDialog, XmNdialogSty    
3773    XtUnmanageChild(XtNameToWidget(warningDial    
3774    XtUnmanageChild(XtNameToWidget(warningDial    
3775                                                  
3776    XtManageChild(warningDialog);                 
3777 }                                                
3778                                                  
3779                                                  
3780 void G4OpenInventorXtExaminerViewer::newViewP    
3781                                                  
3782                                                  
3783 {                                                
3784    G4OpenInventorXtExaminerViewer * This =       
3785       (G4OpenInventorXtExaminerViewer *) clie    
3786    This->popUpFileSelDialog(This->newFileDial    
3787                             createNewVPFileCB    
3788 }                                                
3789                                                  
3790                                                  
3791 void G4OpenInventorXtExaminerViewer::createNe    
3792                                                  
3793                                                  
3794 {                                                
3795    char *file;                                   
3796    std::string fName;                            
3797    G4OpenInventorXtExaminerViewer * This = (G    
3798    XmFileSelectionBoxCallbackStruct *cbs =       
3799       (XmFileSelectionBoxCallbackStruct *) ca    
3800                                                  
3801    // Get the file                               
3802    if (cbs) {                                    
3803       if (!(file = (char *) XmStringUnparse(c    
3804                                             X    
3805                                             X    
3806          SoDebugError::post("G4OpenInventorXt    
3807                             "Internal error d    
3808          return;                                 
3809       }                                          
3810                                                  
3811       This->fileName = file;                     
3812       fName = This->fileName.substr(This->fil    
3813       This->fileIn.open(file);                   
3814       if (This->fileIn.fail()) { // Filename     
3815          This->cleanUpAfterPrevFile();           
3816          This->fileOut.open(file); // Creates    
3817          XtSetSensitive(This->nextViewPtButto    
3818          XtSetSensitive(This->prevViewPtButto    
3819          if (This->listsDialog)                  
3820             closeListsDialogCB(w, This, NULL)    
3821          constructListsDialog(w, This, NULL);    
3822          XtUnmanageChild(w);                     
3823          if (This->returnToSaveVP) {             
3824             This->returnToSaveVP = false;        
3825             saveViewPtCB(NULL, This, NULL);      
3826          }                                       
3827       } else { // Filename already exists        
3828          String dialogName = (char *) "Existi    
3829          std::string msg = "'" + fName + "' a    
3830          This->warningMsgDialog(msg, dialogNa    
3831          This->fileIn.close();                   
3832       }                                          
3833       This->fileIn.clear();                      
3834       XtFree(file);                              
3835    }                                             
3836 }                                                
3837                                                  
3838                                                  
3839 void G4OpenInventorXtExaminerViewer::overwrit    
3840                                                  
3841                                                  
3842 {                                                
3843    G4OpenInventorXtExaminerViewer * This = (G    
3844    This->cleanUpAfterPrevFile();                 
3845    XtSetSensitive(This->nextViewPtButton, Fal    
3846    XtSetSensitive(This->prevViewPtButton, Fal    
3847                                                  
3848    XtUnmanageChild(This->newFileDialog);         
3849                                                  
3850    This->fileOut.open(This->fileName.c_str())    
3851                                                  
3852    if (This->returnToSaveVP) {                   
3853       This->returnToSaveVP = false;              
3854       saveViewPtCB(NULL, This, NULL);            
3855    }                                             
3856 }                                                
3857                                                  
3858                                                  
3859 void G4OpenInventorXtExaminerViewer::loadRefC    
3860                                             X    
3861                                             X    
3862 {                                                
3863    G4OpenInventorXtExaminerViewer * This =       
3864       (G4OpenInventorXtExaminerViewer *)clien    
3865    This->popUpFileSelDialog(This->loadRefCoor    
3866                             "Load", loadRefCo    
3867 }                                                
3868                                                  
3869                                                  
3870 void G4OpenInventorXtExaminerViewer::loadRefC    
3871                                                  
3872                                                  
3873 {                                                
3874    char *file = NULL;                            
3875    G4OpenInventorXtExaminerViewer * This = (G    
3876    XmFileSelectionBoxCallbackStruct *cbs = (X    
3877                                                  
3878    // Get the file                               
3879    if(cbs) {                                     
3880                                                  
3881       file = (char *)XmStringUnparse(cbs->val    
3882                                      XmCHARSE    
3883                                      NULL, 0,    
3884                                                  
3885       std::ifstream ifs(file);                   
3886       if(ifs.is_open()){                         
3887          This->refParticleTrajectory.clear();    
3888          float x,y,z;                            
3889          while(ifs >> x >> y >> z){              
3890             This->refParticleTrajectory.push_    
3891          }                                       
3892          ifs.close();                            
3893          XtUnmanageChild(w);                     
3894       }                                          
3895       else{                                      
3896          String dialogName = (char *) "Proble    
3897          std::string msg = "Problem reading f    
3898          This->warningMsgDialog(msg, dialogNa    
3899          return;                                 
3900                                                  
3901       }                                          
3902    }                                             
3903                                                  
3904    return;                                       
3905 }                                                
3906                                                  
3907                                                  
3908 void G4OpenInventorXtExaminerViewer::saveRefC    
3909                                             X    
3910                                             X    
3911 {                                                
3912    G4OpenInventorXtExaminerViewer * This = (G    
3913                                                  
3914    if (!This->refParticleTrajectory.size()) {    
3915       String dialogName = (char *) "No Refere    
3916       std::string msg = "You need to start a     
3917       This->warningMsgDialog(msg, dialogName,    
3918       return;                                    
3919    }                                             
3920                                                  
3921    int n;                                        
3922    Arg args[3];                                  
3923    Widget parent, scrollWidget;                  
3924    parent = SoXt::getShellWidget(This->getPar    
3925                                                  
3926    if (This->saveRefCoordsDialog == NULL) {      
3927                                                  
3928       // Change the 'OK' button to whatever b    
3929       XmString str = XmStringCreateLocalized(    
3930                                                  
3931       n = 0;                                     
3932       XtSetArg(args[n], XmNokLabelString, str    
3933       XtSetArg(args[n], XmNresizePolicy, XmRE    
3934                                                  
3935       This->saveRefCoordsDialog = XmCreateFil    
3936                                                  
3937       XtAddCallback(This->saveRefCoordsDialog    
3938       XtAddCallback(This->saveRefCoordsDialog    
3939                                                  
3940       // Adding scrolling functionality to th    
3941       scrollWidget = XmFileSelectionBoxGetChi    
3942       if (scrollWidget)                          
3943          xmAddMouseEventHandler(scrollWidget)    
3944       scrollWidget = XmFileSelectionBoxGetChi    
3945       if (scrollWidget)                          
3946          xmAddMouseEventHandler(scrollWidget)    
3947                                                  
3948       XtUnmanageChild(XmSelectionBoxGetChild(    
3949       XmStringFree(str);                         
3950    }                                             
3951                                                  
3952    //TODO: Auto name?                            
3953                                                  
3954    XtManageChild(This->saveRefCoordsDialog);     
3955                                                  
3956 }                                                
3957                                                  
3958                                                  
3959 void G4OpenInventorXtExaminerViewer::saveRefC    
3960                                                  
3961                                                  
3962 {                                                
3963    char *file;                                   
3964    G4OpenInventorXtExaminerViewer * This = (G    
3965    XmFileSelectionBoxCallbackStruct *cbs =       
3966       (XmFileSelectionBoxCallbackStruct *) ca    
3967                                                  
3968    // Get the file                               
3969    if (cbs) {                                    
3970                                                  
3971       file = (char *)XmStringUnparse(cbs->val    
3972                                      XmCHARSE    
3973                                      NULL, 0,    
3974                                                  
3975       std::ifstream ifile(file);                 
3976       if (ifile) {                               
3977          //File already exists                   
3978                                                  
3979          Arg args[4];                            
3980          Widget parent = This->getParentWidge    
3981          Widget confirmOverwriteDialog;          
3982          XmString msg;                           
3983                                                  
3984          confirmOverwriteDialog = XmCreateQue    
3985          msg = XmStringCreateLocalized ((char    
3986          XtVaSetValues (confirmOverwriteDialo    
3987                                                  
3988          // If users presses OK, we want to r    
3989          // save the file.  For that to work,    
3990          // to be able to grab the filename.     
3991          XtVaSetValues (confirmOverwriteDialo    
3992          XtAddCallback (confirmOverwriteDialo    
3993          XtAddCallback (confirmOverwriteDialo    
3994                                                  
3995          XmStringFree (msg);                     
3996                                                  
3997          //The confirmOverwriteDialog will ne    
3998          This->saveRefCoordsFileName = file;     
3999          This->saveRefCoordsWidget = w;          
4000                                                  
4001          XtUnmanageChild(XtNameToWidget(confi    
4002          XtManageChild(confirmOverwriteDialog    
4003                                                  
4004          return;                                 
4005       }                                          
4006       else{                                      
4007                                                  
4008          std::ofstream ofs(file);                
4009          if(ofs.is_open()){                      
4010             float x,y,z;                         
4011             for(unsigned int i=0; i < This->r    
4012                This->refParticleTrajectory[i]    
4013                ofs << x << " " << y << " " <<    
4014             }                                    
4015             ofs.close();                         
4016             XtUnmanageChild(w);                  
4017          }                                       
4018          else{                                   
4019             String dialogName = (char *) "Err    
4020             std::string msg = "There was a pr    
4021             msg += This->saveRefCoordsFileNam    
4022             msg += "'";                          
4023                                                  
4024             This->warningMsgDialog(msg, dialo    
4025          }                                       
4026       }                                          
4027    }                                             
4028                                                  
4029    return;                                       
4030 }                                                
4031                                                  
4032                                                  
4033 void G4OpenInventorXtExaminerViewer::saveRefC    
4034                                                  
4035                                                  
4036 {                                                
4037    XmAnyCallbackStruct *cbs = (XmAnyCallbackS    
4038    G4OpenInventorXtExaminerViewer * This = (G    
4039                                                  
4040    switch (cbs->reason) {                        
4041    case XmCR_OK:                                 
4042       {                                          
4043          // Overwrite confirmed, save file an    
4044          // dialogs (file dialog and overwrit    
4045          std::ofstream ofs(This->saveRefCoord    
4046          if(ofs.is_open()){                      
4047             float x,y,z;                         
4048             for(unsigned int i=0; i < This->r    
4049                This->refParticleTrajectory[i]    
4050                ofs << x << " " << y << " " <<    
4051             }                                    
4052             ofs.close();                         
4053             XtUnmanageChild(w);                  
4054             XtUnmanageChild(This->saveRefCoor    
4055          }                                       
4056          else{                                   
4057             String dialogName = (char *) "Err    
4058             std::string msg = "There was a pr    
4059             msg += This->saveRefCoordsFileNam    
4060             msg += "'";                          
4061                                                  
4062             This->warningMsgDialog(msg, dialo    
4063          }                                       
4064          break;                                  
4065       }                                          
4066    case XmCR_CANCEL:                             
4067       {                                          
4068          // Overwrite refused, dismiss overwr    
4069          // dialog and return to file dialog     
4070                                                  
4071          // Give focus to the text field inst    
4072          XmProcessTraversal(XtNameToWidget(Th    
4073                                                  
4074          XtUnmanageChild(w);                     
4075          This->saveRefCoordsFileName.clear();    
4076          This->saveRefCoordsWidget = NULL;       
4077          break;                                  
4078       }                                          
4079    default:                                      
4080       return;                                    
4081    }                                             
4082 }                                                
4083                                                  
4084                                                  
4085 void G4OpenInventorXtExaminerViewer::loadScen    
4086                                                  
4087                                                  
4088 {                                                
4089    G4OpenInventorXtExaminerViewer * This =       
4090       (G4OpenInventorXtExaminerViewer *)clien    
4091    This->popUpFileSelDialog(This->loadSceneGr    
4092                             "Load", loadScene    
4093    return;                                       
4094 }                                                
4095                                                  
4096                                                  
4097 void G4OpenInventorXtExaminerViewer::loadScen    
4098                                                  
4099                                                  
4100 {                                                
4101    char *file = NULL;                            
4102    G4OpenInventorXtExaminerViewer * This = (G    
4103    XmFileSelectionBoxCallbackStruct *cbs = (X    
4104                                                  
4105    if(cbs) {                                     
4106                                                  
4107       file = (char *)XmStringUnparse(cbs->val    
4108                                      XmCHARSE    
4109                                      NULL, 0,    
4110                                                  
4111       SoInput sceneInput;                        
4112       if (!sceneInput.openFile(file)) {          
4113          String dialogName = (char *) "Proble    
4114          std::string msg = "Cannot open file     
4115          msg += file;                            
4116          This->warningMsgDialog(msg, dialogNa    
4117                                                  
4118          sceneInput.closeFile();                 
4119          XtUnmanageChild(w);                     
4120       }                                          
4121       // Read the whole file into the databas    
4122       This->newSceneGraph = SoDB::readAll(&sc    
4123       if (This->newSceneGraph == NULL) {         
4124          String dialogName = (char *) "Proble    
4125          std::string msg = "Problem reading f    
4126          This->warningMsgDialog(msg, dialogNa    
4127          return;                                 
4128       }                                          
4129                                                  
4130       //This->newSceneGraph->ref();              
4131       This->setSceneGraph(This->newSceneGraph    
4132    }                                             
4133                                                  
4134    return;                                       
4135 }                                                
4136                                                  
4137                                                  
4138 void G4OpenInventorXtExaminerViewer::saveScen    
4139                                                  
4140                                                  
4141 {                                                
4142    G4OpenInventorXtExaminerViewer * This = (G    
4143                                                  
4144    int n;                                        
4145    Arg args[3];                                  
4146    Widget parent, scrollWidget;                  
4147    parent = SoXt::getShellWidget(This->getPar    
4148                                                  
4149    if (This->saveSceneGraphDialog == NULL) {     
4150                                                  
4151       // Change the 'OK' button to whatever b    
4152       XmString str = XmStringCreateLocalized(    
4153                                                  
4154       n = 0;                                     
4155       XtSetArg(args[n], XmNokLabelString, str    
4156       XtSetArg(args[n], XmNresizePolicy, XmRE    
4157                                                  
4158       This->saveSceneGraphDialog = XmCreateFi    
4159                                                  
4160       XtAddCallback(This->saveSceneGraphDialo    
4161       XtAddCallback(This->saveSceneGraphDialo    
4162                                                  
4163       // Adding scrolling functionality to th    
4164       scrollWidget = XmFileSelectionBoxGetChi    
4165       if (scrollWidget)                          
4166          xmAddMouseEventHandler(scrollWidget)    
4167       scrollWidget = XmFileSelectionBoxGetChi    
4168       if (scrollWidget)                          
4169          xmAddMouseEventHandler(scrollWidget)    
4170                                                  
4171       XtUnmanageChild(XmSelectionBoxGetChild(    
4172       XmStringFree(str);                         
4173    }                                             
4174                                                  
4175    //TODO: Auto name?                            
4176                                                  
4177    XtManageChild(This->saveSceneGraphDialog);    
4178                                                  
4179 }                                                
4180                                                  
4181                                                  
4182                                                  
4183 void G4OpenInventorXtExaminerViewer::saveScen    
4184                                                  
4185                                                  
4186 {                                                
4187    char *file;                                   
4188    G4OpenInventorXtExaminerViewer * This = (G    
4189    XmFileSelectionBoxCallbackStruct *cbs =       
4190       (XmFileSelectionBoxCallbackStruct *) ca    
4191                                                  
4192    if (cbs) {                                    
4193                                                  
4194       file = (char *)XmStringUnparse(cbs->val    
4195                                      XmCHARSE    
4196                                      NULL, 0,    
4197                                                  
4198       std::ifstream ifile(file);                 
4199       if (ifile) {                               
4200          //File already exists                   
4201                                                  
4202          Arg args[4];                            
4203          Widget parent = This->getParentWidge    
4204          Widget confirmOverwriteDialog;          
4205          XmString msg;                           
4206                                                  
4207          confirmOverwriteDialog = XmCreateQue    
4208          msg = XmStringCreateLocalized ((char    
4209          XtVaSetValues (confirmOverwriteDialo    
4210                                                  
4211          // If users presses OK, we want to r    
4212          // save the file.  For that to work,    
4213          // to be able to grab the filename.     
4214          XtVaSetValues (confirmOverwriteDialo    
4215          XtAddCallback (confirmOverwriteDialo    
4216          XtAddCallback (confirmOverwriteDialo    
4217                                                  
4218          XmStringFree (msg);                     
4219                                                  
4220          //The confirmOverwriteDialog will ne    
4221          This->saveScenegraphFileName = file;    
4222          This->saveScenegraphWidget = w;         
4223                                                  
4224          XtUnmanageChild(XtNameToWidget(confi    
4225          XtManageChild(confirmOverwriteDialog    
4226                                                  
4227          return;                                 
4228       }                                          
4229       else{                                      
4230                                                  
4231          SoWriteAction writeAction;              
4232          SoSeparator *root = (SoSeparator *)     
4233                                                  
4234          SoOutput * out = writeAction.getOutp    
4235                                                  
4236          if(out->openFile(file)){                
4237             out->setBinary(FALSE);               
4238             writeAction.apply(root);             
4239             out->closeFile();                    
4240                                                  
4241             XtUnmanageChild(w);                  
4242          }                                       
4243          else{                                   
4244             String dialogName = (char *) "Err    
4245             std::string msg = "There was a pr    
4246             msg += This->saveScenegraphFileNa    
4247             msg += "'";                          
4248                                                  
4249             This->warningMsgDialog(msg, dialo    
4250          }                                       
4251                                                  
4252       }                                          
4253    }                                             
4254                                                  
4255    return;                                       
4256 }                                                
4257                                                  
4258                                                  
4259                                                  
4260 void G4OpenInventorXtExaminerViewer::saveScen    
4261                                                  
4262                                                  
4263 {                                                
4264    XmAnyCallbackStruct *cbs = (XmAnyCallbackS    
4265    G4OpenInventorXtExaminerViewer * This = (G    
4266                                                  
4267    switch (cbs->reason) {                        
4268    case XmCR_OK:                                 
4269       {                                          
4270          // Overwrite confirmed, save file an    
4271          // dialogs (file dialog and overwrit    
4272          SoWriteAction writeAction;              
4273          SoSeparator *root = (SoSeparator *)     
4274                                                  
4275          SoOutput * out = writeAction.getOutp    
4276          if(out->openFile(This->saveScenegrap    
4277             out->setBinary(FALSE);               
4278             writeAction.apply(root);             
4279             out->closeFile();                    
4280                                                  
4281             XtUnmanageChild(w);                  
4282             XtUnmanageChild(This->saveScenegr    
4283             This->saveScenegraphFileName.clea    
4284             This->saveScenegraphWidget = NULL    
4285          }                                       
4286          else{                                   
4287             String dialogName = (char *) "Err    
4288             std::string msg = "There was a pr    
4289             msg += This->saveScenegraphFileNa    
4290             msg += "'";                          
4291                                                  
4292             This->warningMsgDialog(msg, dialo    
4293             This->saveScenegraphFileName.clea    
4294             This->saveScenegraphWidget = NULL    
4295          }                                       
4296          break;                                  
4297       }                                          
4298    case XmCR_CANCEL:                             
4299       {                                          
4300          // Overwrite refused, dismiss overwr    
4301          // dialog and return to file dialog     
4302                                                  
4303          // Give focus to the text field inst    
4304          XmProcessTraversal(XtNameToWidget(Th    
4305                                                  
4306          XtUnmanageChild(w);                     
4307          This->saveScenegraphFileName.clear()    
4308          This->saveScenegraphWidget = NULL;      
4309          break;                                  
4310       }                                          
4311    default:                                      
4312       return;                                    
4313    }                                             
4314 }                                                
4315                                                  
4316                                                  
4317 // Receives the name of the bookmark clicked     
4318                                                  
4319 void G4OpenInventorXtExaminerViewer::loadBook    
4320                                                  
4321                                                  
4322 {                                                
4323    char *vpName;                                 
4324    G4OpenInventorXtExaminerViewer * This = (G    
4325    XmListCallbackStruct *cbs = (XmListCallbac    
4326                                                  
4327    vpName = (char *) XmStringUnparse(cbs->ite    
4328                                      XmCHARSE    
4329                                                  
4330    for (int i = 0; i < (int) This->viewPtList    
4331       if (!strcmp(This->viewPtList[i].viewPtN    
4332          This->viewPtIdx = i;                    
4333          break;                                  
4334       }                                          
4335    }                                             
4336    XmTextSetString(This->viewPtSelection, vpN    
4337                                                  
4338    This->writeViewPtIdx();                       
4339    This->setViewPt();                            
4340    XtFree(vpName);                               
4341 }                                                
4342                                                  
4343                                                  
4344                                                  
4345 void G4OpenInventorXtExaminerViewer::deleteBo    
4346                                                  
4347                                                  
4348 {                                                
4349    char *vpName;                                 
4350    G4OpenInventorXtExaminerViewer * This = (G    
4351                                                  
4352    vpName = XmTextGetString(This->viewPtSelec    
4353                                                  
4354    XmString vpNameStr = XmStringCreateLocaliz    
4355                                                  
4356    if (XmListItemExists(This->myViewPtList, v    
4357       XmListDeleteItem(This->myViewPtList, vp    
4358       This->deleteViewPt(vpName);                
4359    }                                             
4360                                                  
4361    XmStringFree(vpNameStr);                      
4362    XmTextSetString(This->viewPtSelection, NUL    
4363    XtFree(vpName);                               
4364 }                                                
4365                                                  
4366                                                  
4367 void G4OpenInventorXtExaminerViewer::renameBo    
4368                                                  
4369                                                  
4370 {                                                
4371    std::string vpNameStr;                        
4372    char *vpName;                                 
4373    int *pos_list, pos_cnt;                       
4374    G4OpenInventorXtExaminerViewer * This = (G    
4375                                                  
4376    vpName = XmTextGetString(This->viewPtSelec    
4377                                                  
4378    if (!strlen(vpName) || !strcmp(This->curVi    
4379       XtFree(vpName);                            
4380       return;                                    
4381    }                                             
4382                                                  
4383    vpNameStr = vpName;                           
4384    XtFree(vpName);                               
4385    int beg = vpNameStr.find_first_not_of(' ')    
4386    int end = vpNameStr.find_last_not_of(' ');    
4387    vpNameStr = vpNameStr.substr(beg, end - be    
4388    const int nVPName = vpNameStr.size() + 1;     
4389    char* vpName1 = new char[nVPName];            
4390    strncpy(vpName1, vpNameStr.c_str(), nVPNam    
4391                                                  
4392    int size = This->viewPtList.size();           
4393    for (int i = 0; i < size; i++) {              
4394       if (!strcmp(vpName1, This->viewPtList[i    
4395                                                  
4396          String dialogName = (char *) "Existi    
4397          std::string msg = "'";                  
4398          msg += vpName1;                         
4399          msg += "' already exists. Choose a d    
4400                                                  
4401          This->warningMsgDialog(msg, dialogNa    
4402          delete[] vpName1;                       
4403          return;                                 
4404       }                                          
4405    }                                             
4406                                                  
4407    XmString vpNameXmStr = XmStringCreateLocal    
4408                                                  
4409    if (XmListGetSelectedPos(This->myViewPtLis    
4410       XmListReplaceItemsPos(This->myViewPtLis    
4411       This->renameViewPt(vpName1);               
4412       XtFree((char *) pos_list);                 
4413    }                                             
4414                                                  
4415    if (This->currentState == VIEWPOINT)          
4416       This->scheduleRedraw();                    
4417                                                  
4418    XmStringFree(vpNameXmStr);                    
4419    delete[] vpName1;                             
4420 }                                                
4421                                                  
4422                                                  
4423 void G4OpenInventorXtExaminerViewer::sortBook    
4424                                                  
4425                                                  
4426 {                                                
4427    int size;                                     
4428    char *vpName;                                 
4429    XmString *strList, *newStrList;               
4430    std::vector<std::string> charList;            
4431    G4OpenInventorXtExaminerViewer * This = (G    
4432                                                  
4433    if (This->viewPtList.size() < 2)              
4434       return;                                    
4435                                                  
4436    // Get current entries from the list          
4437    XtVaGetValues(This->myViewPtList, XmNitemC    
4438                  NULL);                          
4439                                                  
4440    for (int i = 0; i < size; i++) {              
4441       vpName = (char *) XmStringUnparse(strLi    
4442                                         XmCHA    
4443       charList.push_back(vpName);                
4444       XtFree(vpName);                            
4445    }                                             
4446                                                  
4447    std::sort(charList.begin(), charList.end()    
4448                                                  
4449    newStrList = (XmString *) XtMalloc(size *     
4450    for (int i = 0; i < size; i++) {              
4451       // viewPtIdx has to be changed to accou    
4452       if (!strcmp(charList[i].c_str(), This->    
4453          This->viewPtIdx = i;                    
4454       const int nVPName = charList[i].size()     
4455       char *vpName2 = new char[nVPName];         
4456       strncpy(vpName2, charList[i].c_str(), n    
4457       newStrList[i] = XmStringCreateLocalized    
4458       delete [] vpName2;                         
4459    }                                             
4460                                                  
4461    XmListDeleteAllItems(This->myViewPtList);     
4462    XmListAddItemsUnselected(This->myViewPtLis    
4463                                                  
4464    This->sortViewPts(charList);                  
4465                                                  
4466    if (newStrList != NULL) {                     
4467       for (int i = 0; i < size; i++)             
4468          XmStringFree(newStrList[i]);            
4469       XtFree((char *) newStrList);               
4470    }                                             
4471 }                                                
4472                                                  
4473                                                  
4474 void G4OpenInventorXtExaminerViewer::evenOutR    
4475 {                                                
4476    if(this->refParticleTrajectory.empty())       
4477       return;                                    
4478                                                  
4479    SbVec3f p1, p2, p3, dirNow, dirNxt, dir, p    
4480    float avgDistBtwPts = 0;                      
4481    float totalDistBtwPts = 0;                    
4482    std::vector<SbVec3f> newRefParticleTraject    
4483    SbVec3f refPoint;                             
4484    int size = refParticleTrajectory.size() -     
4485    int numOfPts = 0;                             
4486    for (int i = 0; i < size; i++) {              
4487       p1 = refParticleTrajectory[i];             
4488       p2 = refParticleTrajectory[i + 1];         
4489       if (p1 == p2)                              
4490          continue;                               
4491       numOfPts++;                                
4492       totalDistBtwPts += (p2 - p1).length();     
4493    }                                             
4494    // Nothing useful to do (and fix Coverity)    
4495    if (numOfPts <= 2) return;                    
4496                                                  
4497    avgDistBtwPts = totalDistBtwPts / numOfPts    
4498    float minDistAllowed = 0.75 * avgDistBtwPt    
4499    // float maxDistAllowed = 1.25 * avgDistBt    
4500                                                  
4501    float x, y, z;                                
4502    int i = 0, j = 0;                             
4503    while (i < size) {                            
4504       p1 = refParticleTrajectory[i];             
4505       p2 = refParticleTrajectory[i + 1];         
4506                                                  
4507       refPoint = p1;                             
4508       p1.getValue(x, y, z);                      
4509                                                  
4510       newRefParticleTrajectory.push_back(refP    
4511                                                  
4512       j = i;                                     
4513       while ((p2 - p1).length() < minDistAllo    
4514          j++;                                    
4515                                                  
4516          p1 = refParticleTrajectory[j];          
4517          p2 = refParticleTrajectory[j + 1];      
4518       }                                          
4519       if (j != i)                                
4520          i = j + 1;                              
4521       else                                       
4522          i++;                                    
4523    }                                             
4524                                                  
4525    refParticleTrajectory.clear();                
4526    refParticleTrajectory = newRefParticleTraj    
4527 }                                                
4528                                                  
4529                                                  
4530 // Called when the viewer is closed; closes a    
4531                                                  
4532 void G4OpenInventorXtExaminerViewer::closeMai    
4533                                                  
4534                                                  
4535 {                                                
4536    G4OpenInventorXtExaminerViewer * This =       
4537       (G4OpenInventorXtExaminerViewer *) clie    
4538                                                  
4539    if (This->openFileDialog)                     
4540       XtUnmanageChild(This->openFileDialog);     
4541                                                  
4542    if (This->newFileDialog)                      
4543       XtUnmanageChild(This->newFileDialog);      
4544                                                  
4545    if (This->listsDialog)                        
4546       closeListsDialogCB(NULL, This, NULL);      
4547 }                                                
4548                                                  
4549                                                  
4550 void G4OpenInventorXtExaminerViewer::saveCurC    
4551 {                                                
4552    SoCamera *cam = getCamera();                  
4553    camB4Animation.viewportMapping = cam->view    
4554    camB4Animation.position = cam->position.ge    
4555    camB4Animation.orientation = cam->orientat    
4556    camB4Animation.aspectRatio = cam->aspectRa    
4557    camB4Animation.nearDistance = cam->nearDis    
4558    camB4Animation.farDistance = cam->farDista    
4559    camB4Animation.focalDistance = cam->focalD    
4560                                                  
4561    if (cam->isOfType(SoPerspectiveCamera::get    
4562       camB4Animation.height =                    
4563          ((SoPerspectiveCamera *) cam)->heigh    
4564       camB4Animation.camType = PERSPECTIVE;      
4565    } else if (cam->isOfType(SoOrthographicCam    
4566       camB4Animation.height =                    
4567          ((SoOrthographicCamera *) cam)->heig    
4568       camB4Animation.camType = ORTHOGRAPHIC;     
4569    }                                             
4570 }                                                
4571                                                  
4572                                                  
4573 void G4OpenInventorXtExaminerViewer::restoreC    
4574 {                                                
4575    SoCamera *cam = getCamera();                  
4576                                                  
4577    cam->viewportMapping = camB4Animation.view    
4578    cam->position = camB4Animation.position;      
4579    cam->orientation = camB4Animation.orientat    
4580    cam->aspectRatio = camB4Animation.aspectRa    
4581    cam->nearDistance = camB4Animation.nearDis    
4582    cam->farDistance = camB4Animation.farDista    
4583    cam->focalDistance = camB4Animation.focalD    
4584                                                  
4585    if (cam->isOfType(SoPerspectiveCamera::get    
4586       if (camB4Animation.camType == ORTHOGRAP    
4587          toggleCameraType();                     
4588          cam = getCamera();                      
4589          ((SoOrthographicCamera *) cam)->heig    
4590                                                  
4591       } else                                     
4592          ((SoPerspectiveCamera *) cam)->heigh    
4593                                                  
4594    } else if (cam->isOfType(SoOrthographicCam    
4595       if (camB4Animation.camType == PERSPECTI    
4596          toggleCameraType();                     
4597          cam = getCamera();                      
4598          ((SoPerspectiveCamera *) cam)->heigh    
4599                                                  
4600       } else                                     
4601          ((SoOrthographicCamera *) cam)->heig    
4602                                                  
4603    }                                             
4604 }                                                
4605                                                  
4606                                                  
4607 void G4OpenInventorXtExaminerViewer::animateS    
4608                                                  
4609 {                                                
4610    SbTime curTime = SbTime::getTimeOfDay();      
4611    G4OpenInventorXtExaminerViewer * This = (G    
4612    SoTimerSensor *s = (SoTimerSensor *) senso    
4613                                                  
4614    float t = float((curTime - s->getBaseTime(    
4615       / This->animateBtwPtsPeriod;               
4616                                                  
4617    if ((t > 1.0f) || (t + s->getInterval().ge    
4618       t = 1.0f;                                  
4619    SbBool end = (t == 1.0f);                     
4620                                                  
4621    if (end) {                                    
4622       This->animateSensorRotation->unschedule    
4623       if(This->rotCnt){                          
4624          // rotations left                       
4625          This->rotateCamera();                   
4626       }                                          
4627       else {                                     
4628          // rotation over                        
4629          This->currentState = This->prevState    
4630          return;                                 
4631       }                                          
4632    }                                             
4633                                                  
4634 }                                                
4635                                                  
4636                                                  
4637 // Called repeatedly during reference particl    
4638                                                  
4639 void G4OpenInventorXtExaminerViewer::animateS    
4640                                                  
4641 {                                                
4642    SbTime curTime = SbTime::getTimeOfDay();      
4643    G4OpenInventorXtExaminerViewer * This = (G    
4644    SoCamera *cam = This->getCamera();            
4645    SoTimerSensor *s = (SoTimerSensor *) senso    
4646                                                  
4647    float t = float((curTime - s->getBaseTime(    
4648       / This->animateBtwPtsPeriod;               
4649                                                  
4650    if ((t > 1.0f) || (t + s->getInterval().ge    
4651       t = 1.0f;                                  
4652    SbBool end = (t == 1.0f);                     
4653                                                  
4654    cam->orientation = SbRotation::slerp(This-    
4655    cam->position = This->camStartPos + (This-    
4656                                                  
4657    if (end) {                                    
4658       This->animateSensor->unschedule();         
4659                                                  
4660       if (This->currentState == ANIMATION) {     
4661          if (This->refParticleIdx < (int) (Th    
4662             This->animateRefParticle();          
4663          else {                                  
4664             This->animateBtwPtsPeriod = MIN_S    
4665             This->speedStep = START_STEP;        
4666          }                                       
4667       }                                          
4668       if (This->currentState == REVERSED_ANIM    
4669          if (This->refParticleIdx >= 1)          
4670             This->animateRefParticle();          
4671          else {                                  
4672             This->animateBtwPtsPeriod = MIN_S    
4673             This->speedStep = START_STEP;        
4674          }                                       
4675       }                                          
4676    }                                             
4677 }                                                
4678                                                  
4679                                                  
4680 void G4OpenInventorXtExaminerViewer::setStart    
4681 {                                                
4682    if (SoXtExaminerViewer::isAnimating())        
4683       stopAnimating();                           
4684                                                  
4685    SbRotation rot;                               
4686    SbVec3f p1(0), p2(0), p2_tmp(0), camUpV(0)    
4687    float x1(0.), y1(0.), z1(0.), x2(0.), y2(0    
4688                                                  
4689    if (currentState == ANIMATION) {              
4690       p1 = refParticleTrajectory[refParticleI    
4691       p2 = refParticleTrajectory[++(refPartic    
4692    } else if (currentState == REVERSED_ANIMAT    
4693       p2 = refParticleTrajectory[refParticleI    
4694       p1 = refParticleTrajectory[--(refPartic    
4695    } else if (currentState == PAUSED_ANIMATIO    
4696       if (refParticleIdx < (int) refParticleT    
4697          p1 = refParticleTrajectory[refPartic    
4698          p2 = refParticleTrajectory[refPartic    
4699       } else {                                   
4700          p1 = refParticleTrajectory[refPartic    
4701          p2 = refParticleTrajectory[refPartic    
4702       }                                          
4703    }                                             
4704    p1.getValue(x1, y1, z1);                      
4705    p2.getValue(x2, y2, z2);                      
4706                                                  
4707    camD = p2 - p1;                               
4708    camD.normalize();                             
4709                                                  
4710    p2_tmp.setValue(x2, y1, z2);                  
4711    camD_tmp = p2_tmp - p1;                       
4712    camD_tmp.normalize();                         
4713                                                  
4714    camUpV.setValue(0, 1, 0);                     
4715    rot.setValue(camD_tmp, camD);                 
4716    rot.multVec(camUpV, camUpV);                  
4717                                                  
4718    leftRightAxis = camD.cross(camUpV);           
4719                                                  
4720    myCam->position = p1;                         
4721    myCam->pointAt(p2, camUpV);                   
4722                                                  
4723    // Update camera position                     
4724    p1 = p1 + (up_down * camUpV) + (left_right    
4725    myCam->position = p1;                         
4726    // FWJ Try look-ahead here                    
4727    int idx = refParticleIdx + pathLookahead;     
4728    idx = std::min(idx, (int)refParticleTrajec    
4729    myCam->pointAt(refParticleTrajectory[idx],    
4730    //   myCam->pointAt(refParticleTrajectory[    
4731    myCam->focalDistance = 0.1f;                  
4732 }                                                
4733                                                  
4734                                                  
4735 void G4OpenInventorXtExaminerViewer::gotoRefP    
4736 {                                                
4737    G4OpenInventorXtExaminerViewer::gotoRefPat    
4738                                                  
4739 }                                                
4740                                                  
4741                                                  
4742 void G4OpenInventorXtExaminerViewer::gotoRefP    
4743                                                  
4744                                                  
4745 {                                                
4746    G4OpenInventorXtExaminerViewer * This = (G    
4747                                                  
4748    if (!This->refParticleTrajectory.size()) {    
4749       String dialogName = (char *) "No Refere    
4750       std::string msg = "You need to start a     
4751       This->warningMsgDialog(msg, dialogName,    
4752       return;                                    
4753    }                                             
4754                                                  
4755    if (This->currentState == ROTATING)           
4756       return;                                    
4757    if (This->currentState == ANIMATION || Thi    
4758        || This->currentState == PAUSED_ANIMAT    
4759       if (This->animateSensor->isScheduled())    
4760          This->animateSensor->unschedule();      
4761       This->setSuperimpositionEnabled(This->s    
4762       This->maxSpeed = 0.0f;                     
4763       This->scheduleRedraw();                    
4764    } else {                                      
4765       This->saveCurCamera();                     
4766       This->prevState = This->currentState;      
4767       This->prevRefIdx = This->refParticleIdx    
4768    }                                             
4769                                                  
4770    if (This->SoXtExaminerViewer::isAnimating(    
4771       This->stopAnimating();                     
4772                                                  
4773    This->up_down = 0;                            
4774    This->left_right = 0;                         
4775    This->step = 1;                               
4776                                                  
4777    This->refParticleIdx = 0;                     
4778    This->currentState = BEAMLINE;                
4779    This->setSuperimpositionEnabled(This->supe    
4780    This->axisSwitch->whichChild.setValue(SO_S    
4781    This->animSpeedOutlineSwitch->whichChild.s    
4782    This->animSpeedSwitch->whichChild.setValue    
4783    This->scheduleRedraw();                       
4784                                                  
4785    // FWJ Disabled: this is set in moveCamera    
4786    // Zoom in                                    
4787    //   SoCamera *cam = This->getCamera();       
4788    //   cam->focalDistance = 0.1f;               
4789                                                  
4790    This->prevParticleDir = SbVec3f(0,0,0);       
4791                                                  
4792    //Default zoom                                
4793    SbVec3f p1 = This->refParticleTrajectory[0    
4794    SbVec3f pN = This->refParticleTrajectory[T    
4795    This->distance = (pN - p1).length() / 10;     
4796                                                  
4797    This->moveCamera(This->distance, true);       
4798 }                                                
4799                                                  
4800                                                  
4801 void G4OpenInventorXtExaminerViewer::invertRe    
4802                                                  
4803                                                  
4804 {                                                
4805    G4OpenInventorXtExaminerViewer * This =       
4806       (G4OpenInventorXtExaminerViewer *) clie    
4807    This->invertRefPath();                        
4808 }                                                
4809                                                  
4810                                                  
4811 void G4OpenInventorXtExaminerViewer::invertRe    
4812 {                                                
4813    std::reverse(this->refParticleTrajectory.b    
4814                 this->refParticleTrajectory.e    
4815    this->setReferencePathZPos();                 
4816    this->sortElements();                         
4817 }                                                
4818                                                  
4819                                                  
4820 void G4OpenInventorXtExaminerViewer::animateR    
4821                                            Xt    
4822                                            Xt    
4823 {                                                
4824    G4OpenInventorXtExaminerViewer * This = (G    
4825                                                  
4826    if (!This->refParticleTrajectory.size()) {    
4827       This->returnToAnim = true;                 
4828       String dialogName = (char *) "No Refere    
4829       std::string msg = "You need to start a     
4830       This->warningMsgDialog(msg, dialogName,    
4831       return;                                    
4832    }                                             
4833                                                  
4834    if (!This->refParticleTrajectory.size())      
4835       return;                                    
4836                                                  
4837    //////////////////////////////////////////    
4838    This->setSuperimpositionEnabled(This->supe    
4839    This->maxSpeed = SPEED_INDICATOR_STEP;        
4840    This->axisSwitch->whichChild.setValue(SO_S    
4841    This->animSpeedOutlineSwitch->whichChild.s    
4842    This->animSpeedSwitch->whichChild.setValue    
4843    This->scheduleRedraw();                       
4844    //////////////////////////////////////////    
4845                                                  
4846    SoCamera *cam = This->getCamera();            
4847    //   SbVec3f camDirOld, camDirNew, camDirN    
4848                                                  
4849    if (This->currentState == ANIMATION || Thi    
4850        || This->currentState == ROTATING)        
4851       return;                                    
4852                                                  
4853    if (This->currentState != PAUSED_ANIMATION    
4854                                                  
4855       This->saveCurCamera();                     
4856       This->prevState = This->currentState;      
4857       This->prevRefIdx = This->refParticleIdx    
4858                                                  
4859       if (cam->isOfType(SoOrthographicCamera:    
4860          This->toggleCameraType();               
4861          cam = This->getCamera();                
4862       }                                          
4863                                                  
4864       This->refParticleIdx = 0; // Set the ca    
4865       This->animateBtwPtsPeriod = MIN_SPEED;     
4866       This->speedStep = START_STEP;              
4867       This->left_right = This->up_down = 0;      
4868                                                  
4869       cam->focalDistance = 0.1f;                 
4870       ((SoPerspectiveCamera *) cam)->heightAn    
4871    }                                             
4872                                                  
4873    This->currentState = ANIMATION;               
4874    This->setStartingPtForAnimation();            
4875                                                  
4876    cam->position = (This->myCam)->position.ge    
4877    cam->orientation = (This->myCam)->orientat    
4878    This->animateRefParticle(); // Animate the    
4879 }                                                
4880                                                  
4881                                                  
4882 void G4OpenInventorXtExaminerViewer::animateR    
4883 {                                                
4884    SoCamera *cam = getCamera();                  
4885                                                  
4886    camStartPos = cam->position.getValue();       
4887    camStartOrient = cam->orientation.getValue    
4888                                                  
4889    if (currentState != BEAMLINE)                 
4890       setStartingPtForAnimation();               
4891                                                  
4892    camEndPos = myCam->position.getValue();       
4893    camEndOrient = myCam->orientation.getValue    
4894                                                  
4895    if (animateSensor->isScheduled())             
4896       animateSensor->unschedule();               
4897                                                  
4898    animateSensor->setBaseTime(SbTime::getTime    
4899    animateSensor->setInterval(SbTime(0.02));     
4900                                                  
4901    animateSensor->schedule();                    
4902 }                                                
4903                                                  
4904                                                  
4905 void G4OpenInventorXtExaminerViewer::addEscap    
4906                          void (*callback)(voi    
4907 {                                                
4908    this->escapeCallback = callback;              
4909    this->examinerObject = object;                
4910 }                                                
4911                                                  
4912                                                  
4913 void G4OpenInventorXtExaminerViewer::sceneCha    
4914 {                                                
4915    G4OpenInventorXtExaminerViewer* This =        
4916       (G4OpenInventorXtExaminerViewer*)userDa    
4917    if(This->newEvents){                          
4918       This->findAndSetRefPath();                 
4919       This->newEvents = false;                   
4920    }                                             
4921 }                                                
4922                                                  
4923                                                  
4924 HookEventProcState::HookEventProcState(G4Open    
4925 {                                                
4926    this->viewer = vwr;                           
4927 }                                                
4928                                                  
4929                                                  
4930 HookEventProcState::~HookEventProcState()        
4931 {;}                                              
4932                                                  
4933                                                  
4934 G4bool HookEventProcState::Notify(G4Applicati    
4935 {                                                
4936    if(requiredState == G4State_EventProc){       
4937       this->viewer->newEvents = true;            
4938    }                                             
4939    return true;                                  
4940 }                                                
4941