235 lines
6.0 KiB
C++
235 lines
6.0 KiB
C++
// This code implementation is the intellectual property of
|
|
// the GEANT4 collaboration.
|
|
//
|
|
// By copying, distributing or modifying the Program (or any work
|
|
// based on the Program) you indicate your acceptance of this statement,
|
|
// and all its terms.
|
|
//
|
|
// $Id: G4UIcommandTree.cc,v 1.2.2.1 1999/12/07 20:49:03 gunter Exp $
|
|
// GEANT4 tag $Name: geant4-01-00 $
|
|
//
|
|
|
|
#include "G4UIcommandTree.hh"
|
|
#include "G4ios.hh"
|
|
|
|
G4UIcommandTree::G4UIcommandTree()
|
|
:guidance(NULL)
|
|
{ }
|
|
|
|
G4UIcommandTree::G4UIcommandTree(G4String thePathName)
|
|
:guidance(NULL)
|
|
{
|
|
pathName = thePathName;
|
|
}
|
|
|
|
G4UIcommandTree::G4UIcommandTree(char * thePathName)
|
|
:guidance(NULL)
|
|
{
|
|
pathName = thePathName;
|
|
}
|
|
|
|
G4UIcommandTree::~G4UIcommandTree()
|
|
{
|
|
int i;
|
|
int n_treeEntry = tree.entries();
|
|
for( i=0; i < n_treeEntry; i++ )
|
|
{ delete tree[i]; }
|
|
}
|
|
|
|
int G4UIcommandTree::operator==(const G4UIcommandTree &right) const
|
|
{
|
|
return ( pathName == right.GetPathName() );
|
|
}
|
|
|
|
int G4UIcommandTree::operator!=(const G4UIcommandTree &right) const
|
|
{
|
|
return ( pathName != right.GetPathName() );
|
|
}
|
|
|
|
void G4UIcommandTree::AddNewCommand(G4UIcommand *newCommand)
|
|
{
|
|
G4String commandPath = newCommand->GetCommandPath();
|
|
G4String remainingPath = commandPath;
|
|
remainingPath.remove(0,pathName.length());
|
|
if( remainingPath.isNull() )
|
|
{
|
|
guidance = newCommand;
|
|
return;
|
|
}
|
|
int i = remainingPath.first('/');
|
|
if( i == G4std::string::npos )
|
|
{
|
|
// Find command
|
|
int n_commandEntry = command.entries();
|
|
for( int i_thCommand = 0; i_thCommand < n_commandEntry; i_thCommand++ )
|
|
{
|
|
if( remainingPath == command[i_thCommand]->GetCommandName() )
|
|
{ return; }
|
|
}
|
|
command.insert( newCommand );
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
// Find path
|
|
G4String nextPath = pathName;
|
|
nextPath.append(remainingPath(0,i+1));
|
|
int n_treeEntry = tree.entries();
|
|
for( int i_thTree = 0; i_thTree < n_treeEntry; i_thTree++ )
|
|
{
|
|
if( nextPath == tree[i_thTree]->GetPathName() )
|
|
{
|
|
tree[i_thTree]->AddNewCommand( newCommand );
|
|
return;
|
|
}
|
|
}
|
|
G4UIcommandTree * newTree = new G4UIcommandTree( nextPath );
|
|
tree.insert( newTree );
|
|
newTree->AddNewCommand( newCommand );
|
|
return;
|
|
}
|
|
}
|
|
|
|
void G4UIcommandTree::RemoveCommand(G4UIcommand *aCommand)
|
|
{
|
|
G4String commandPath = aCommand->GetCommandPath();
|
|
G4String remainingPath = commandPath;
|
|
remainingPath.remove(0,pathName.length());
|
|
if( remainingPath.isNull() )
|
|
{
|
|
guidance = NULL;
|
|
}
|
|
else
|
|
{
|
|
int i = remainingPath.first('/');
|
|
if( i == G4std::string::npos )
|
|
{
|
|
// Find command
|
|
int n_commandEntry = command.entries();
|
|
for( int i_thCommand = 0; i_thCommand < n_commandEntry; i_thCommand++ )
|
|
{
|
|
if( remainingPath == command[i_thCommand]->GetCommandName() )
|
|
{
|
|
command.remove(command[i_thCommand]);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Find path
|
|
G4String nextPath = pathName;
|
|
nextPath.append(remainingPath(0,i+1));
|
|
int n_treeEntry = tree.entries();
|
|
for( int i_thTree = 0; i_thTree < n_treeEntry; i_thTree++ )
|
|
{
|
|
if( nextPath == tree[i_thTree]->GetPathName() )
|
|
{
|
|
tree[i_thTree]->RemoveCommand( aCommand );
|
|
int n_commandRemain = tree[i_thTree]->GetCommandEntry();
|
|
if(n_commandRemain==0)
|
|
{
|
|
G4UIcommandTree * emptyTree = tree[i_thTree];
|
|
tree.remove(tree[i_thTree]);
|
|
delete emptyTree;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
G4UIcommand * G4UIcommandTree::FindPath(G4String commandPath)
|
|
{
|
|
if( commandPath.index( pathName ) == G4std::string::npos )
|
|
{ return NULL; }
|
|
G4String remainingPath = commandPath;
|
|
remainingPath.remove(0,pathName.length());
|
|
int i = remainingPath.first('/');
|
|
if( i == G4std::string::npos )
|
|
{
|
|
// Find command
|
|
int n_commandEntry = command.entries();
|
|
for( int i_thCommand = 0; i_thCommand < n_commandEntry; i_thCommand++ )
|
|
{
|
|
if( remainingPath == command[i_thCommand]->GetCommandName() )
|
|
{ return command[i_thCommand]; }
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Find path
|
|
G4String nextPath = pathName;
|
|
nextPath.append(remainingPath(0,i+1));
|
|
int n_treeEntry = tree.entries();
|
|
for( int i_thTree = 0; i_thTree < n_treeEntry; i_thTree++ )
|
|
{
|
|
if( nextPath == tree[i_thTree]->GetPathName() )
|
|
{ return tree[i_thTree]->FindPath( commandPath ); }
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
void G4UIcommandTree::ListCurrent()
|
|
{
|
|
G4cout << "Command directory path : " << pathName << endl;
|
|
if( guidance != NULL ) guidance->List();
|
|
int i = 0;
|
|
G4cout << " Sub-directories : " << endl;
|
|
int n_treeEntry = tree.entries();
|
|
for( int i_thTree = 0; i_thTree < n_treeEntry; i_thTree++ )
|
|
{
|
|
G4cout << " " << tree[i_thTree]->GetPathName()
|
|
<< " " << tree[i_thTree]->GetTitle() << endl;
|
|
}
|
|
G4cout << " Commands : " << endl;
|
|
int n_commandEntry = command.entries();
|
|
for( int i_thCommand = 0; i_thCommand < n_commandEntry; i_thCommand++ )
|
|
{
|
|
G4cout << " " << command[i_thCommand]->GetCommandName()
|
|
<< " * " << command[i_thCommand]->GetTitle() << endl;
|
|
}
|
|
}
|
|
|
|
void G4UIcommandTree::ListCurrentWithNum()
|
|
{
|
|
G4cout << "Command directory path : " << pathName << endl;
|
|
if( guidance != NULL ) guidance->List();
|
|
int i = 0;
|
|
G4cout << " Sub-directories : " << endl;
|
|
int n_treeEntry = tree.entries();
|
|
for( int i_thTree = 0; i_thTree < n_treeEntry; i_thTree++ )
|
|
{
|
|
i++;
|
|
G4cout << " " << i << ") " << tree[i_thTree]->GetPathName()
|
|
<< " " << tree[i_thTree]->GetTitle() << endl;
|
|
}
|
|
G4cout << " Commands : " << endl;
|
|
int n_commandEntry = command.entries();
|
|
for( int i_thCommand = 0; i_thCommand < n_commandEntry; i_thCommand++ )
|
|
{
|
|
i++;
|
|
G4cout << " " << i << ") " << command[i_thCommand]->GetCommandName()
|
|
<< " * " << command[i_thCommand]->GetTitle() << endl;
|
|
}
|
|
}
|
|
|
|
void G4UIcommandTree::List()
|
|
{
|
|
ListCurrent();
|
|
int n_commandEntry = command.entries();
|
|
for( int i_thCommand = 0; i_thCommand < n_commandEntry; i_thCommand++ )
|
|
{
|
|
command[i_thCommand]->List();
|
|
}
|
|
int n_treeEntry = tree.entries();
|
|
for( int i_thTree = 0; i_thTree < n_treeEntry; i_thTree++ )
|
|
{
|
|
tree[i_thTree]->List();
|
|
}
|
|
}
|
|
|
|
|