Geant4  9.6.p02
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4UIcommandTree.cc
Go to the documentation of this file.
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 // $Id$
28 //
29 
30 #include "G4UIcommandTree.hh"
31 #include "G4StateManager.hh"
32 #include <fstream>
33 #include "G4ios.hh"
34 
36 :guidance(NULL)
37 { }
38 
39 G4UIcommandTree::G4UIcommandTree(const char * thePathName)
40 :guidance(NULL)
41 {
42  pathName = thePathName;
43 }
44 
46 {
47  G4int i;
48  G4int n_treeEntry = tree.size();
49  for( i=0; i < n_treeEntry; i++ )
50  { delete tree[i]; }
51 }
52 
54 {
55  return ( pathName == right.GetPathName() );
56 }
57 
59 {
60  return ( pathName != right.GetPathName() );
61 }
62 
64 {
65  G4String commandPath = newCommand->GetCommandPath();
66  G4String remainingPath = commandPath;
67  remainingPath.remove(0,pathName.length());
68  if( remainingPath.isNull() )
69  {
70  guidance = newCommand;
71  return;
72  }
73  G4int i = remainingPath.first('/');
74  if( i == G4int(std::string::npos) )
75  {
76  // Find command
77  G4int n_commandEntry = command.size();
78  for( G4int i_thCommand = 0; i_thCommand < n_commandEntry; i_thCommand++ )
79  {
80  if( remainingPath == command[i_thCommand]->GetCommandName() )
81  { return; }
82  }
83  command.push_back( newCommand );
84  return;
85  }
86  else
87  {
88  // Find path
89  G4String nextPath = pathName;
90  nextPath.append(remainingPath(0,i+1));
91  G4int n_treeEntry = tree.size();
92  for( G4int i_thTree = 0; i_thTree < n_treeEntry; i_thTree++ )
93  {
94  if( nextPath == tree[i_thTree]->GetPathName() )
95  {
96  tree[i_thTree]->AddNewCommand( newCommand );
97  return;
98  }
99  }
100  G4UIcommandTree * newTree = new G4UIcommandTree( nextPath );
101  tree.push_back( newTree );
102  newTree->AddNewCommand( newCommand );
103  return;
104  }
105 }
106 
108 {
109  G4String commandPath = aCommand->GetCommandPath();
110  G4String remainingPath = commandPath;
111  remainingPath.remove(0,pathName.length());
112  if( remainingPath.isNull() )
113  {
114  guidance = NULL;
115  }
116  else
117  {
118  G4int i = remainingPath.first('/');
119  if( i == G4int(std::string::npos) )
120  {
121  // Find command
122  G4int n_commandEntry = command.size();
123  for( G4int i_thCommand = 0; i_thCommand < n_commandEntry; i_thCommand++ )
124  {
125  if( remainingPath == command[i_thCommand]->GetCommandName() )
126  {
127  command.erase(command.begin()+i_thCommand);
128  break;
129  }
130  }
131  }
132  else
133  {
134  // Find path
135  G4String nextPath = pathName;
136  nextPath.append(remainingPath(0,i+1));
137  G4int n_treeEntry = tree.size();
138  for( G4int i_thTree = 0; i_thTree < n_treeEntry; i_thTree++ )
139  {
140  if( nextPath == tree[i_thTree]->GetPathName() )
141  {
142  tree[i_thTree]->RemoveCommand( aCommand );
143  G4int n_commandRemain = tree[i_thTree]->GetCommandEntry();
144  G4int n_treeRemain = tree[i_thTree]-> GetTreeEntry();
145  if(n_commandRemain == 0 && n_treeRemain == 0)
146  {
147  G4UIcommandTree * emptyTree = tree[i_thTree];
148  tree.erase(tree.begin()+i_thTree);
149  delete emptyTree;
150  }
151  break;
152  }
153  }
154  }
155  }
156 }
157 
158 // L. Garnier 01.28.08 This function has not a good name. In fact, it try
159 // to match a command name, not a path. It should be rename as FindCommandName
160 
161 G4UIcommand * G4UIcommandTree::FindPath(const char* commandPath) const
162 {
163  G4String remainingPath = commandPath;
164  if( remainingPath.index( pathName ) == std::string::npos )
165  { return NULL; }
166  remainingPath.remove(0,pathName.length());
167  G4int i = remainingPath.first('/');
168  if( i == G4int(std::string::npos) )
169  {
170  // Find command
171  G4int n_commandEntry = command.size();
172  for( G4int i_thCommand = 0; i_thCommand < n_commandEntry; i_thCommand++ )
173  {
174  if( remainingPath == command[i_thCommand]->GetCommandName() )
175  { return command[i_thCommand]; }
176  }
177  }
178  else
179  {
180  // Find path
181  G4String nextPath = pathName;
182  nextPath.append(remainingPath(0,i+1));
183  G4int n_treeEntry = tree.size();
184  for( G4int i_thTree = 0; i_thTree < n_treeEntry; i_thTree++ )
185  {
186  if( nextPath == tree[i_thTree]->GetPathName() )
187  { return tree[i_thTree]->FindPath( commandPath ); }
188  }
189  }
190  return NULL;
191 }
192 
193 
200 {
201  G4String remainingPath = commandPath;
202  if( remainingPath.index( pathName ) == std::string::npos )
203  { return NULL; }
204  remainingPath.remove(0,pathName.length());
205  G4int i = remainingPath.first('/');
206  if( i != G4int(std::string::npos) )
207  {
208  // Find path
209  G4String nextPath = pathName;
210  nextPath.append(remainingPath(0,i+1));
211  G4int n_treeEntry = tree.size();
212  for( G4int i_thTree = 0; i_thTree < n_treeEntry; i_thTree++ )
213  {
214  if (tree[i_thTree]->GetPathName() == commandPath) {
215  return tree[i_thTree];
216  }
217  else if( nextPath == tree[i_thTree]->GetPathName() ) {
218  return tree[i_thTree]->FindCommandTree( commandPath );
219  }
220  }
221  } else {
222  return this;
223  }
224  return NULL;
225 }
226 
228 {
229  G4String pName = aCommandPath;
230  G4String remainingPath = aCommandPath;
231  G4String empty = "";
232  G4String matchingPath = empty;
233 
234  // find the tree
235  G4int jpre= pName.last('/');
236  if(jpre != G4int(G4String::npos)) pName.remove(jpre+1);
237  G4UIcommandTree* aTree = FindCommandTree(pName);
238 
239  if (!aTree) {
240  return empty;
241  }
242 
243  if( pName.index( pName ) == std::string::npos ) return empty;
244 
245  std::vector<G4String> paths;
246 
247  // list matched directories/commands
248  G4String strtmp;
249  G4int nMatch= 0;
250 
251  int Ndir= aTree-> GetTreeEntry();
252  int Ncmd= aTree-> GetCommandEntry();
253 
254  // directory ...
255  for(G4int idir=1; idir<=Ndir; idir++) {
256  G4String fpdir= aTree-> GetTree(idir)-> GetPathName();
257  // matching test
258  if( fpdir.index(remainingPath, 0) == 0) {
259  if(nMatch==0) {
260  matchingPath = fpdir;
261  } else {
262  matchingPath = GetFirstMatchedString(fpdir,matchingPath);
263  }
264  nMatch++;
265  paths.push_back(fpdir);
266  }
267  }
268 
269  if (paths.size()>=2) {
270  G4cout << "Matching directories :" << G4endl;
271  for( unsigned int i_thCommand = 0; i_thCommand < paths.size(); i_thCommand++ ) {
272  G4cout << paths[i_thCommand] << G4endl;
273  }
274  }
275 
276  // command ...
277  std::vector<G4String> commands;
278 
279  for(G4int icmd=1; icmd<=Ncmd; icmd++){
280  G4String fpcmd= aTree-> GetPathName() +
281  aTree-> GetCommand(icmd) -> GetCommandName();
282  // matching test
283  if( fpcmd.index(remainingPath, 0) ==0) {
284  if(nMatch==0) {
285  matchingPath= fpcmd + " ";
286  } else {
287  strtmp= fpcmd + " ";
288  matchingPath= GetFirstMatchedString(matchingPath, strtmp);
289  }
290  nMatch++;
291  commands.push_back(fpcmd+" ");
292  }
293  }
294 
295  if (commands.size()>=2) {
296  G4cout << "Matching commands :" << G4endl;
297  for( unsigned int i_thCommand = 0; i_thCommand < commands.size(); i_thCommand++ ) {
298  G4cout << commands[i_thCommand] << G4endl;
299  }
300  }
301 
302  return matchingPath;
303 }
304 
305 
307 G4String G4UIcommandTree::GetFirstMatchedString(const G4String& str1,
308  const G4String& str2) const
310 {
311  int nlen1= str1.length();
312  int nlen2= str2.length();
313 
314  int nmin = nlen1<nlen2 ? nlen1 : nlen2;
315 
316  G4String strMatched;
317  for(size_t i=0; G4int(i)<nmin; i++){
318  if(str1[i]==str2[i]) {
319  strMatched+= str1[i];
320  } else {
321  break;
322  }
323  }
324 
325  return strMatched;
326 }
327 
329 {
330  G4cout << "Command directory path : " << pathName << G4endl;
331  if( guidance != NULL ) guidance->List();
332  G4cout << " Sub-directories : " << G4endl;
333  G4int n_treeEntry = tree.size();
334  for( G4int i_thTree = 0; i_thTree < n_treeEntry; i_thTree++ )
335  {
336  G4cout << " " << tree[i_thTree]->GetPathName()
337  << " " << tree[i_thTree]->GetTitle() << G4endl;
338  }
339  G4cout << " Commands : " << G4endl;
340  G4int n_commandEntry = command.size();
341  for( G4int i_thCommand = 0; i_thCommand < n_commandEntry; i_thCommand++ )
342  {
343  G4cout << " " << command[i_thCommand]->GetCommandName()
344  << " * " << command[i_thCommand]->GetTitle() << G4endl;
345  }
346 }
347 
349 {
350  G4cout << "Command directory path : " << pathName << G4endl;
351  if( guidance != NULL ) guidance->List();
352  G4int i = 0;
353  G4cout << " Sub-directories : " << G4endl;
354  G4int n_treeEntry = tree.size();
355  for( G4int i_thTree = 0; i_thTree < n_treeEntry; i_thTree++ )
356  {
357  i++;
358  G4cout << " " << i << ") " << tree[i_thTree]->GetPathName()
359  << " " << tree[i_thTree]->GetTitle() << G4endl;
360  }
361  G4cout << " Commands : " << G4endl;
362  G4int n_commandEntry = command.size();
363  for( G4int i_thCommand = 0; i_thCommand < n_commandEntry; i_thCommand++ )
364  {
365  i++;
366  G4cout << " " << i << ") " << command[i_thCommand]->GetCommandName()
367  << " * " << command[i_thCommand]->GetTitle() << G4endl;
368  }
369 }
370 
372 {
373  ListCurrent();
374  G4int n_commandEntry = command.size();
375  for( G4int i_thCommand = 0; i_thCommand < n_commandEntry; i_thCommand++ )
376  {
377  command[i_thCommand]->List();
378  }
379  G4int n_treeEntry = tree.size();
380  for( G4int i_thTree = 0; i_thTree < n_treeEntry; i_thTree++ )
381  {
382  tree[i_thTree]->List();
383  }
384 }
385 
386 G4String G4UIcommandTree::CreateFileName(const char* pName)
387 {
388  G4String fn = pName;
389  G4int idxs;
390  while((idxs=fn.index("/"))!=G4int(std::string::npos))
391  { fn(idxs) = '_'; }
392  fn += ".html";
393  return fn;
394 }
395 
396 G4String G4UIcommandTree::ModStr(const char* strS)
397 {
398  G4String sx;
399  G4String str = strS;
400  for(G4int i=0;i<G4int(str.length());i++)
401  {
402  char c = str(i);
403  switch(c)
404  {
405  case '<':
406  sx += "&lt;"; break;
407  case '>':
408  sx += "&gt;"; break;
409  case '&':
410  sx += "&amp;"; break;
411  default:
412  sx += c;
413  }
414  }
415  return sx;
416 }
417 
419 {
420  G4String ofileName = CreateFileName(pathName);
421  std::ofstream oF(ofileName, std::ios::out);
422 
423  oF << "<html><head><title>Commands in " << ModStr(pathName) << "</title></head>" << G4endl;
424  oF << "<body bgcolor=\"#ffffff\"><h2>" << ModStr(pathName) << "</h2><p>" << G4endl;
425 
426  if( guidance != NULL )
427  {
428  for(G4int i=0;i<guidance->GetGuidanceEntries();i++)
429  { oF << ModStr(guidance->GetGuidanceLine(i)) << "<br>" << G4endl; }
430  }
431 
432  oF << "<p><hr><p>" << G4endl;
433 
434  oF << "<h2>Sub-directories : </h2><dl>" << G4endl;
435  for( G4int i_thTree = 0; i_thTree < G4int(tree.size()); i_thTree++ )
436  {
437  oF << "<p><br><p><dt><a href=\"" << CreateFileName(tree[i_thTree]->GetPathName())
438  << "\">" << ModStr(tree[i_thTree]->GetPathName()) << "</a>" << G4endl;
439  oF << "<p><dd>" << ModStr(tree[i_thTree]->GetTitle()) << G4endl;
440  tree[i_thTree]->CreateHTML();
441  }
442 
443  oF << "</dl><p><hr><p>" << G4endl;
444 
445  oF << "<h2>Commands : </h2><dl>" << G4endl;
446  for( G4int i_thCommand = 0; i_thCommand < G4int(command.size()); i_thCommand++ )
447  {
448  G4UIcommand* cmd = command[i_thCommand];
449  oF << "<p><br><p><dt><b>" << ModStr(cmd->GetCommandName());
450  if(cmd->GetParameterEntries()>0)
451  {
452  for(G4int i_thParam=0;i_thParam<cmd->GetParameterEntries();i_thParam++)
453  { oF << " [<i>" << ModStr(cmd->GetParameter(i_thParam)->GetParameterName()) << "</i>]"; }
454  }
455  oF << "</b>" << G4endl;
456  oF << "<p><dd>" << G4endl;
457  for(G4int i=0;i<cmd->GetGuidanceEntries();i++)
458  { oF << ModStr(cmd->GetGuidanceLine(i)) << "<br>" << G4endl; }
459  if(!(cmd->GetRange()).isNull())
460  { oF << "<p><dd>Range : " << ModStr(cmd->GetRange()) << G4endl; }
461  std::vector<G4ApplicationState>* availabelStateList = cmd->GetStateList();
462  if(availabelStateList->size()==6)
463  { oF << "<p><dd>Available at all Geant4 states." << G4endl; }
464  else
465  {
466  oF << "<p><dd>Available Geant4 state(s) : ";
467  for(G4int ias=0;ias<G4int(availabelStateList->size());ias++)
468  { oF << G4StateManager::GetStateManager()->GetStateString((*availabelStateList)[ias]) << " " << G4endl; }
469  }
470  if(cmd->GetParameterEntries()>0)
471  {
472  oF << "<p><dd>Parameters<table border=1>" << G4endl;
473  for(G4int i_thParam=0;i_thParam<cmd->GetParameterEntries();i_thParam++)
474  {
475  G4UIparameter* prm = cmd->GetParameter(i_thParam);
476  oF << "<tr><td>" << ModStr(prm->GetParameterName()) << G4endl;
477  oF << "<td>type " << prm->GetParameterType() << G4endl;
478  oF << "<td>";
479  if(prm->IsOmittable())
480  {
481  oF << "Omittable : ";
482  if(prm->GetCurrentAsDefault())
483  { oF << "current value is used as the default value." << G4endl; }
484  else
485  { oF << "default value = " << prm->GetDefaultValue() << G4endl; }
486  }
487  oF << "<td>";
488  if(!(prm->GetParameterRange()).isNull())
489  { oF << "Parameter range : " << ModStr(prm->GetParameterRange()) << G4endl; }
490  else if(!(prm->GetParameterCandidates()).isNull())
491  { oF << "Parameter candidates : " << ModStr(prm->GetParameterCandidates()) << G4endl; }
492  }
493  oF << "</table>" << G4endl;
494  }
495 
496  }
497 
498  oF << "</dl></body></html>" << G4endl;
499  oF.close();
500 }
501