source: trunk/source/intercoms/src/G4UIcommandTree.cc @ 842

Last change on this file since 842 was 842, checked in by garnier, 16 years ago

updates from the head of geant4 in order to compile

File size: 12.2 KB
Line 
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: G4UIcommandTree.cc,v 1.14 2008/01/30 11:20:03 lgarnier Exp $
28// GEANT4 tag $Name: HEAD $
29//
30
31#include "G4UIcommandTree.hh"
32#include "G4StateManager.hh"
33#include <fstream>
34#include "G4ios.hh"
35
36G4UIcommandTree::G4UIcommandTree()
37:guidance(NULL)
38{ }
39
40G4UIcommandTree::G4UIcommandTree(const char * thePathName)
41:guidance(NULL)
42{
43  pathName = thePathName;
44}
45
46G4UIcommandTree::~G4UIcommandTree()
47{
48  G4int i;
49  G4int n_treeEntry = tree.size();
50  for( i=0; i < n_treeEntry; i++ )
51  { delete tree[i]; }
52}
53
54G4int G4UIcommandTree::operator==(const G4UIcommandTree &right) const
55{
56  return ( pathName == right.GetPathName() );
57}
58
59G4int G4UIcommandTree::operator!=(const G4UIcommandTree &right) const
60{
61  return ( pathName != right.GetPathName() );
62}
63
64void G4UIcommandTree::AddNewCommand(G4UIcommand *newCommand)
65{
66  G4String commandPath = newCommand->GetCommandPath();
67  G4String remainingPath = commandPath;
68  remainingPath.remove(0,pathName.length());
69  if( remainingPath.isNull() )
70  {
71    guidance = newCommand;
72    return;
73  }
74  G4int i = remainingPath.first('/');
75  if( i == G4int(std::string::npos) )
76  {
77    // Find command
78    G4int n_commandEntry = command.size();
79    for( G4int i_thCommand = 0; i_thCommand < n_commandEntry; i_thCommand++ )
80    {
81      if( remainingPath == command[i_thCommand]->GetCommandName() )
82      { return; }
83    }
84    command.push_back( newCommand );
85    return;
86  }
87  else
88  {
89    // Find path
90    G4String nextPath = pathName;
91    nextPath.append(remainingPath(0,i+1));
92    G4int n_treeEntry = tree.size();
93    for( G4int i_thTree = 0; i_thTree < n_treeEntry; i_thTree++ )
94    {
95      if( nextPath == tree[i_thTree]->GetPathName() )
96      { 
97        tree[i_thTree]->AddNewCommand( newCommand );
98        return; 
99      }
100    }
101    G4UIcommandTree * newTree = new G4UIcommandTree( nextPath );
102    tree.push_back( newTree );
103    newTree->AddNewCommand( newCommand );
104    return;
105  }
106}
107
108void G4UIcommandTree::RemoveCommand(G4UIcommand *aCommand)
109{
110  G4String commandPath = aCommand->GetCommandPath();
111  G4String remainingPath = commandPath;
112  remainingPath.remove(0,pathName.length());
113  if( remainingPath.isNull() )
114  {
115    guidance = NULL;
116  }
117  else
118  {
119    G4int i = remainingPath.first('/');
120    if( i == G4int(std::string::npos) )
121    {
122      // Find command
123      G4int n_commandEntry = command.size();
124      for( G4int i_thCommand = 0; i_thCommand < n_commandEntry; i_thCommand++ )
125      {
126        if( remainingPath == command[i_thCommand]->GetCommandName() )
127        { 
128          command.erase(command.begin()+i_thCommand);
129          break;
130        }
131      }
132    }
133    else
134    {
135      // Find path
136      G4String nextPath = pathName;
137      nextPath.append(remainingPath(0,i+1));
138      G4int n_treeEntry = tree.size();
139      for( G4int i_thTree = 0; i_thTree < n_treeEntry; i_thTree++ )
140      {
141        if( nextPath == tree[i_thTree]->GetPathName() )
142        { 
143          tree[i_thTree]->RemoveCommand( aCommand );
144          G4int n_commandRemain = tree[i_thTree]->GetCommandEntry();
145          if(n_commandRemain==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
161G4UIcommand * G4UIcommandTree::FindPath(const char* commandPath)
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
194/**
195 * Try to match a command or a path with the one given.
196 * @commandPath : command or path to match
197 * @return the commandTree found or NULL if not
198 */
199G4UIcommandTree * G4UIcommandTree::FindCommandTree(const char* commandPath)
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  }
222  return NULL;
223}
224
225void G4UIcommandTree::ListCurrent()
226{
227  G4cout << "Command directory path : " << pathName << G4endl;
228  if( guidance != NULL ) guidance->List();
229  G4cout << " Sub-directories : " << G4endl;
230  G4int n_treeEntry = tree.size();
231  for( G4int i_thTree = 0; i_thTree < n_treeEntry; i_thTree++ )
232  {
233    G4cout << "   " << tree[i_thTree]->GetPathName() 
234         << "   " << tree[i_thTree]->GetTitle() << G4endl;
235  }
236  G4cout << " Commands : " << G4endl;
237  G4int n_commandEntry = command.size();
238  for( G4int i_thCommand = 0; i_thCommand < n_commandEntry; i_thCommand++ )
239  {
240    G4cout << "   " << command[i_thCommand]->GetCommandName() 
241         << " * " << command[i_thCommand]->GetTitle() << G4endl;
242  }
243}
244
245void G4UIcommandTree::ListCurrentWithNum()
246{
247  G4cout << "Command directory path : " << pathName << G4endl;
248  if( guidance != NULL ) guidance->List();
249  G4int i = 0;
250  G4cout << " Sub-directories : " << G4endl;
251  G4int n_treeEntry = tree.size();
252  for( G4int i_thTree = 0; i_thTree < n_treeEntry; i_thTree++ )
253  {
254    i++;
255    G4cout << " " << i << ") " << tree[i_thTree]->GetPathName() 
256         << "   " << tree[i_thTree]->GetTitle() << G4endl;
257  }
258  G4cout << " Commands : " << G4endl;
259  G4int n_commandEntry = command.size();
260  for( G4int i_thCommand = 0; i_thCommand < n_commandEntry; i_thCommand++ )
261  {
262    i++;
263    G4cout << " " << i << ") " << command[i_thCommand]->GetCommandName() 
264         << " * " << command[i_thCommand]->GetTitle() << G4endl;
265  }
266}
267
268void G4UIcommandTree::List()
269{
270  ListCurrent();
271  G4int n_commandEntry = command.size();
272  for( G4int i_thCommand = 0; i_thCommand < n_commandEntry; i_thCommand++ )
273  {
274    command[i_thCommand]->List();
275  }
276  G4int n_treeEntry = tree.size();
277  for( G4int i_thTree = 0; i_thTree < n_treeEntry; i_thTree++ )
278  {
279    tree[i_thTree]->List();
280  }
281}
282
283G4String G4UIcommandTree::CreateFileName(const char* pName)
284{
285  G4String fn = pName;
286  G4int idxs;
287  while((idxs=fn.index("/"))!=G4int(std::string::npos))
288  { fn(idxs) = '_'; }
289  fn += ".html";
290  return fn;
291}
292
293G4String G4UIcommandTree::ModStr(const char* strS)
294{
295  G4String sx;
296  G4String str = strS;
297  for(G4int i=0;i<G4int(str.length());i++)
298  {
299    char c = str(i);
300    switch(c)
301    {
302    case '<':
303      sx += "&lt;"; break;
304    case '>':
305      sx += "&gt;"; break;
306    case '&':
307      sx += "&amp;"; break;
308    default:
309      sx += c;
310    }
311  }
312  return sx;
313}
314
315void G4UIcommandTree::CreateHTML()
316{
317  G4String ofileName = CreateFileName(pathName);
318  std::ofstream oF(ofileName, std::ios::out);
319
320  oF << "<html><head><title>Commands in " << ModStr(pathName) << "</title></head>" << G4endl;
321  oF << "<body bgcolor=\"#ffffff\"><h2>" << ModStr(pathName) << "</h2><p>" << G4endl;
322
323  if( guidance != NULL ) 
324  {
325    for(G4int i=0;i<guidance->GetGuidanceEntries();i++)
326    { oF << ModStr(guidance->GetGuidanceLine(i)) << "<br>" << G4endl; }
327  }
328
329  oF << "<p><hr><p>" << G4endl;
330 
331  oF << "<h2>Sub-directories : </h2><dl>" << G4endl;
332  for( G4int i_thTree = 0; i_thTree < G4int(tree.size()); i_thTree++ )
333  {
334    oF << "<p><br><p><dt><a href=\"" << CreateFileName(tree[i_thTree]->GetPathName())
335       << "\">" << ModStr(tree[i_thTree]->GetPathName()) << "</a>" << G4endl;
336    oF << "<p><dd>" << ModStr(tree[i_thTree]->GetTitle()) << G4endl;
337    tree[i_thTree]->CreateHTML();
338  }
339
340  oF << "</dl><p><hr><p>" << G4endl;
341 
342  oF << "<h2>Commands : </h2><dl>" << G4endl;
343  for( G4int i_thCommand = 0; i_thCommand < G4int(command.size()); i_thCommand++ )
344  {
345    G4UIcommand* cmd = command[i_thCommand];
346    oF << "<p><br><p><dt><b>" << ModStr(cmd->GetCommandName());
347    if(cmd->GetParameterEntries()>0)
348    {
349      for(G4int i_thParam=0;i_thParam<cmd->GetParameterEntries();i_thParam++)
350      { oF << " [<i>" << ModStr(cmd->GetParameter(i_thParam)->GetParameterName()) << "</i>]"; }
351    }
352    oF << "</b>" << G4endl;
353    oF << "<p><dd>" << G4endl;
354    for(G4int i=0;i<cmd->GetGuidanceEntries();i++)
355    { oF << ModStr(cmd->GetGuidanceLine(i)) << "<br>" << G4endl; }
356    if(!(cmd->GetRange()).isNull())
357    { oF << "<p><dd>Range : " << ModStr(cmd->GetRange()) << G4endl; }
358    std::vector<G4ApplicationState>* availabelStateList = cmd->GetStateList();
359    if(availabelStateList->size()==6)
360    { oF << "<p><dd>Available at all Geant4 states." << G4endl; }
361    else
362    {
363      oF << "<p><dd>Available Geant4 state(s) : ";
364      for(G4int ias=0;ias<G4int(availabelStateList->size());ias++)
365      { oF << G4StateManager::GetStateManager()->GetStateString((*availabelStateList)[ias]) << " " << G4endl; }
366    }
367    if(cmd->GetParameterEntries()>0)
368    {
369      oF << "<p><dd>Parameters<table border=1>" << G4endl;
370      for(G4int i_thParam=0;i_thParam<cmd->GetParameterEntries();i_thParam++)
371      {
372        G4UIparameter* prm = cmd->GetParameter(i_thParam);
373        oF << "<tr><td>" << ModStr(prm->GetParameterName()) << G4endl;
374        oF << "<td>type " << prm->GetParameterType() << G4endl;
375        oF << "<td>";
376        if(prm->IsOmittable())
377        { 
378          oF << "Omittable : ";
379          if(prm->GetCurrentAsDefault())
380          { oF << "current value is used as the default value." << G4endl; }
381          else
382          { oF << "default value = " << prm->GetDefaultValue() << G4endl; }
383        }
384        oF << "<td>";
385        if(!(prm->GetParameterRange()).isNull())
386        { oF << "Parameter range : " << ModStr(prm->GetParameterRange()) << G4endl; }
387        else if(!(prm->GetParameterCandidates()).isNull())
388        { oF << "Parameter candidates : " << ModStr(prm->GetParameterCandidates()) << G4endl; }
389      }
390      oF << "</table>" << G4endl;
391    }
392
393  }
394 
395  oF << "</dl></body></html>" << G4endl;
396  oF.close();
397}
398
Note: See TracBrowser for help on using the repository browser.