ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4InteractorMessenger.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4InteractorMessenger.cc
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
26 //
27 
28 #include <string.h>
29 #include <stdlib.h>
30 
31 #include "G4UIdirectory.hh"
32 #include "G4UIcommand.hh"
33 #include "G4VInteractiveSession.hh"
34 
35 #include "G4InteractorMessenger.hh"
36 
37 #define STRDUP(str) ((str) != NULL ? (strcpy((char*)malloc((unsigned)strlen(str) + 1), str)) : (char*)NULL)
38 #define STRDEL(str) {if((str)!=NULL) {free(str);str=NULL;}}
39 
40 static G4bool GetValues (G4String,int,G4String*);
41 
43  G4VInteractiveSession* a_session
44 )
45 {
46  session = a_session;
47 
48  G4UIparameter* parameter;
49 
50  interactorDirectory = new G4UIdirectory("/gui/");
51  interactorDirectory->SetGuidance("UI interactors commands.");
52 
53  // /gui/addMenu :
54  addMenu = new G4UIcommand("/gui/addMenu",this);
55  addMenu->SetGuidance("Add a menu to menu bar.");
56  parameter = new G4UIparameter("Name",'s',false);
57  parameter->SetDefaultValue("dummy");
58  addMenu->SetParameter (parameter);
59  parameter = new G4UIparameter("Label",'s',false);
60  parameter->SetDefaultValue("dummy");
61  addMenu->SetParameter (parameter);
62 
63  // /gui/addButton :
64  addButton = new G4UIcommand("/gui/addButton",this);
65  addButton->SetGuidance("Add a button to menu.");
66  parameter = new G4UIparameter("Menu",'s',false);
67  parameter->SetDefaultValue("dummy");
68  addButton->SetParameter (parameter);
69  parameter = new G4UIparameter("Label",'s',false);
70  parameter->SetDefaultValue("dummy");
71  addButton->SetParameter (parameter);
72  parameter = new G4UIparameter("Command",'s',false);
73  parameter->SetDefaultValue("");
74  addButton->SetParameter (parameter);
75 
76  // /gui/defaultIcons :
77  defaultIcons = new G4UIcommand("/gui/defaultIcons",this);
78  defaultIcons->SetGuidance("Set the Geant4 defaults icons in Qt driver.");
79  defaultIcons->SetGuidance("By default, Geant4 icons are enable.");
80 
81  parameter = new G4UIparameter("bool",'b',true);
82  parameter->SetDefaultValue("true");
83  defaultIcons->SetParameter (parameter);
84 
85  // /gui/addIcon :
86  addIcon = new G4UIcommand("/gui/addIcon",this);
88  ("Add a non-checkable icon to the Icon toolbar.");
90  ("If the Icon parameter is set to \"user_icon\", you should provide the icon file in xpm format, otherwise you have to choose one of the candidate icons");
92  ("A command given without parameters will display a window that will allow one to choose the parameters (if needed) for this command.");
94  ("E.g: /gui/addIcon \"Change background color\" user_icon /vis/viewer/set/background ../Images/background.xpm");
96  ("Special cases for the Icon parameter:");
98  (" - open: Open an open-file-selector that can run the Command with File as argument.");
100  (" - save: Open a save-file-selector that can run the Command with File as argument.");
102  (" - move/rotate/pick/zoom_in/zoom_out: Theses icons are radio-button icons that can change cursor action.");
104  (" - wireframe/solid/hidden_line_removal/hidden_line_and_surface_removal: These icons are radio-button icons that can change drawing style.");
106  (" - perspective/ortho: These icons are radio-button icons that can change projection style.");
107 
108  parameter = new G4UIparameter("Label",'s',false);
109  parameter->SetDefaultValue("");
110  addIcon->SetParameter (parameter);
111 
112  parameter = new G4UIparameter("Icon",'s',false);
113  parameter->SetDefaultValue("");
114  parameter->SetParameterCandidates
115  ("open save move rotate pick zoom_in zoom_out wireframe solid hidden_line_removal hidden_line_and_surface_removal perspective ortho user_icon");
116  addIcon->SetParameter (parameter);
117 
118  parameter = new G4UIparameter("Command",'s',true);
119  parameter->SetDefaultValue("no_command");
120  addIcon->SetParameter (parameter);
121 
122  parameter = new G4UIparameter("File",'s',true);
123  parameter->SetDefaultValue("no_file");
124  addIcon->SetParameter (parameter);
125 
126  // /gui/system :
127  sys = new G4UIcommand("/gui/system",this);
128  sys->SetGuidance("Send a command to the system.");
129  parameter = new G4UIparameter("Command",'s',false);
130  parameter->SetDefaultValue("");
131  sys->SetParameter (parameter);
132 
133 }
134 
136 {
137  delete addButton;
138  delete addIcon;
139  delete addMenu;
140  delete interactorDirectory;
141 }
142 
144  G4UIcommand* command
145 ,G4String newValue
146 )
147 {
148  int paramn = command->GetParameterEntries();
149  G4String* params = new G4String [paramn];
150  if(GetValues(newValue,paramn,params)==true) {
151  if(command==addMenu) {
152  session->AddMenu((const char*)params[0],(const char*)params[1]);
153  } else if(command==addButton) {
154  session->AddButton((const char*)params[0],(const char*)params[1],(const char*)params[2]);
155  } else if(command==addIcon) {
156  session->AddIcon((const char*)params[0],(const char*)params[1],(const char*)params[2],(const char*)params[3]);
157  } else if(command==defaultIcons) {
158  session->DefaultIcons(command->ConvertToBool(newValue));
159  } else if(command==sys) {
160  int rc = system((const char*)params[0]);
161  if ( rc < 0 ){ }
162  }
163  }
164  delete [] params;
165 }
167  G4String newValue
168 ,int paramn
169 ,G4String* params
170 )
171 {
172  char* value = STRDUP(newValue.data());
173  if(value==NULL) return false;
174  char* tok = strtok(value," ");
175  for( int i=0; i<paramn;i++ ) {
176  if(tok==NULL) {
177  STRDEL(value);
178  return false;
179  }
180  G4String token = tok;
181  if( token(0)=='"' ) {
182  while( token(token.length()-1) != '"' ) {
183  tok = strtok(NULL," ");
184  if( (tok==NULL) || (*tok=='\0')) {
185  STRDEL(value);
186  return false;
187  }
188  token += " ";
189  token += tok;
190  }
191  token = (G4String)token.strip(G4String::both,'"');
192  }
193  if( token.isNull() ) {
194  STRDEL(value);
195  return false;
196  } else {
197  params[i] = token;
198  }
199  tok = strtok(NULL," ");
200  }
201  STRDEL(value);
202  return true;
203 }
204 
205