Geant4 Cross Reference |
>> 1 // 1 // ******************************************* 2 // ******************************************************************** 2 // * License and Disclaimer 3 // * License and Disclaimer * 3 // * 4 // * * 4 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 5 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 6 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 7 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 8 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 9 // * 10 // * * 10 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 11 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 12 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 13 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 14 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 15 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 16 // * 17 // * * 17 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 18 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 19 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 20 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 21 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 22 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 23 // ******************************************* 24 // ******************************************************************** 24 // 25 // 25 // G4UIcommandTree << 26 // 26 // 27 // Author: Makoto Asai (SLAC), 1998 << 27 // $Id: G4UIcommandTree.cc,v 1.14 2008/01/30 11:20:03 lgarnier Exp $ 28 // Midified: Makoto Asai (SLAC), 2021 << 28 // GEANT4 tag $Name: geant4-09-02-patch-04 $ 29 // Improve output HTML file layout and add o << 29 // 30 // command/directory names in alphabetic ord << 31 // ------------------------------------------- << 32 30 33 #include "G4UIcommandTree.hh" 31 #include "G4UIcommandTree.hh" 34 << 35 #include "G4StateManager.hh" 32 #include "G4StateManager.hh" 36 #include "G4UIdirectory.hh" << 33 #include <fstream> 37 #include "G4UImanager.hh" << 38 #include "G4ios.hh" 34 #include "G4ios.hh" 39 35 40 #include <fstream> << 36 G4UIcommandTree::G4UIcommandTree() >> 37 :guidance(NULL) >> 38 { } 41 39 42 // ------------------------------------------- << 40 G4UIcommandTree::G4UIcommandTree(const char * thePathName) 43 G4UIcommandTree::G4UIcommandTree(const char* t << 41 :guidance(NULL) 44 { 42 { 45 pathName = thePathName; 43 pathName = thePathName; 46 } 44 } 47 45 48 // ------------------------------------------- << 49 G4UIcommandTree::~G4UIcommandTree() 46 G4UIcommandTree::~G4UIcommandTree() 50 { 47 { 51 for (auto& i : tree) { << 48 G4int i; 52 delete i; << 49 G4int n_treeEntry = tree.size(); 53 } << 50 for( i=0; i < n_treeEntry; i++ ) >> 51 { delete tree[i]; } 54 } 52 } 55 53 56 // ------------------------------------------- << 54 G4int G4UIcommandTree::operator==(const G4UIcommandTree &right) const 57 G4bool G4UIcommandTree::operator==(const G4UIc << 58 { 55 { 59 return (pathName == right.GetPathName()); << 56 return ( pathName == right.GetPathName() ); 60 } 57 } 61 58 62 // ------------------------------------------- << 59 G4int G4UIcommandTree::operator!=(const G4UIcommandTree &right) const 63 G4bool G4UIcommandTree::operator!=(const G4UIc << 64 { 60 { 65 return (pathName != right.GetPathName()); << 61 return ( pathName != right.GetPathName() ); 66 } 62 } 67 63 68 // ------------------------------------------- << 64 void G4UIcommandTree::AddNewCommand(G4UIcommand *newCommand) 69 void G4UIcommandTree::AddNewCommand(G4UIcomman << 70 { 65 { 71 G4String commandPath = newCommand->GetComman 66 G4String commandPath = newCommand->GetCommandPath(); 72 G4String remainingPath = commandPath; 67 G4String remainingPath = commandPath; 73 remainingPath.erase(0, pathName.length()); << 68 remainingPath.remove(0,pathName.length()); 74 if (remainingPath.empty()) { << 69 if( remainingPath.isNull() ) 75 if (guidance == nullptr) { << 70 { 76 guidance = newCommand; << 71 guidance = newCommand; 77 if (!(newCommand->ToBeBroadcasted())) { << 78 broadcastCommands = false; << 79 } << 80 if (workerThreadOnly) { << 81 newCommand->SetWorkerThreadOnly(); << 82 } << 83 } << 84 return; 72 return; 85 } 73 } 86 << 74 G4int i = remainingPath.first('/'); 87 if (guidance != nullptr) { << 75 if( i == G4int(std::string::npos) ) 88 auto* dir = static_cast<G4UIdirectory*>(gu << 76 { 89 ifSort = dir->IfSort(); << 77 // Find command 90 } << 78 G4int n_commandEntry = command.size(); 91 std::size_t i = remainingPath.find('/'); << 79 for( G4int i_thCommand = 0; i_thCommand < n_commandEntry; i_thCommand++ ) 92 if (i == std::string::npos) { << 80 { 93 // Adding a new command to this directory << 81 if( remainingPath == command[i_thCommand]->GetCommandName() ) 94 std::size_t n_commandEntry = command.size( << 82 { return; } 95 for (std::size_t i_thCommand = 0; i_thComm << 96 if (remainingPath == command[i_thCommand << 97 // a command of same name has already << 98 if (G4UImanager::GetUIpointer()->GetVe << 99 G4ExceptionDescription ed; << 100 ed << "Command <" << commandPath << << 101 G4Exception("G4UIcommandTree::AddNew << 102 // FatalException, << 103 JustWarning, ed); << 104 } << 105 return; << 106 } << 107 } << 108 if (!broadcastCommands) { << 109 newCommand->SetToBeBroadcasted(false); << 110 } << 111 if (workerThreadOnly) { << 112 newCommand->SetWorkerThreadOnly(); << 113 } << 114 if (ifSort) { << 115 auto j = command.cbegin(); << 116 for (; j != command.cend(); ++j) { << 117 if (newCommand->GetCommandPath() < (*j << 118 break; << 119 } << 120 } << 121 command.insert(j, newCommand); << 122 } << 123 else { << 124 command.push_back(newCommand); << 125 } 83 } >> 84 command.push_back( newCommand ); 126 return; 85 return; 127 } 86 } 128 << 87 else 129 // Adding a new command to a sub-directory << 88 { 130 G4String nextPath = pathName; << 89 // Find path 131 nextPath.append(remainingPath.substr(0, i + << 90 G4String nextPath = pathName; 132 std::size_t n_treeEntry = tree.size(); << 91 nextPath.append(remainingPath(0,i+1)); 133 for (std::size_t i_thTree = 0; i_thTree < n_ << 92 G4int n_treeEntry = tree.size(); 134 if (nextPath == tree[i_thTree]->GetPathNam << 93 for( G4int i_thTree = 0; i_thTree < n_treeEntry; i_thTree++ ) 135 if (!broadcastCommands) { << 94 { 136 newCommand->SetToBeBroadcasted(false); << 95 if( nextPath == tree[i_thTree]->GetPathName() ) 137 } << 96 { 138 tree[i_thTree]->AddNewCommand(newCommand << 97 tree[i_thTree]->AddNewCommand( newCommand ); 139 return; << 98 return; 140 } << 141 } << 142 // Creating a new sub-directory << 143 auto* newTree = new G4UIcommandTree(nextPath << 144 if (ifSort) { << 145 auto j = tree.cbegin(); << 146 for (; j != tree.cend(); ++j) { << 147 if (newTree->GetPathName() < (*j)->GetPa << 148 break; << 149 } 99 } 150 } 100 } 151 tree.insert(j, newTree); << 101 G4UIcommandTree * newTree = new G4UIcommandTree( nextPath ); 152 } << 102 tree.push_back( newTree ); 153 else { << 103 newTree->AddNewCommand( newCommand ); 154 tree.push_back(newTree); << 104 return; 155 } << 156 if (!broadcastCommands) { << 157 newCommand->SetToBeBroadcasted(false); << 158 } 105 } 159 // In case a new sub-directry is created wit << 160 // (most-likely this is the case), inherit t << 161 newCommand->SetDefaultSortFlag(ifSort); << 162 newTree->AddNewCommand(newCommand, workerThr << 163 return; << 164 } 106 } 165 107 166 // ------------------------------------------- << 108 void G4UIcommandTree::RemoveCommand(G4UIcommand *aCommand) 167 void G4UIcommandTree::RemoveCommand(G4UIcomman << 168 { 109 { 169 if (workerThreadOnly && !(aCommand->IsWorker << 170 return; << 171 } << 172 G4String commandPath = aCommand->GetCommandP 110 G4String commandPath = aCommand->GetCommandPath(); 173 commandPath.erase(0, pathName.length()); << 111 G4String remainingPath = commandPath; 174 if (commandPath.empty()) { << 112 remainingPath.remove(0,pathName.length()); 175 guidance = nullptr; << 113 if( remainingPath.isNull() ) 176 } << 114 { 177 else { << 115 guidance = NULL; 178 std::size_t i = commandPath.find('/'); << 116 } 179 if (i == std::string::npos) { << 117 else >> 118 { >> 119 G4int i = remainingPath.first('/'); >> 120 if( i == G4int(std::string::npos) ) >> 121 { 180 // Find command 122 // Find command 181 std::size_t n_commandEntry = command.siz << 123 G4int n_commandEntry = command.size(); 182 for (std::size_t i_thCommand = 0; i_thCo << 124 for( G4int i_thCommand = 0; i_thCommand < n_commandEntry; i_thCommand++ ) 183 if (commandPath == command[i_thCommand << 125 { 184 command.erase(command.begin() + i_th << 126 if( remainingPath == command[i_thCommand]->GetCommandName() ) >> 127 { >> 128 command.erase(command.begin()+i_thCommand); 185 break; 129 break; 186 } 130 } 187 } 131 } 188 } 132 } 189 else { << 133 else >> 134 { 190 // Find path 135 // Find path 191 G4String nextPath = pathName; 136 G4String nextPath = pathName; 192 nextPath.append(commandPath.substr(0, i << 137 nextPath.append(remainingPath(0,i+1)); 193 std::size_t n_treeEntry = tree.size(); << 138 G4int n_treeEntry = tree.size(); 194 for (std::size_t i_thTree = 0; i_thTree << 139 for( G4int i_thTree = 0; i_thTree < n_treeEntry; i_thTree++ ) 195 if (nextPath == tree[i_thTree]->GetPat << 140 { 196 tree[i_thTree]->RemoveCommand(aComma << 141 if( nextPath == tree[i_thTree]->GetPathName() ) 197 G4int n_commandRemain = tree[i_thTre << 142 { 198 G4int n_treeRemain = tree[i_thTree]- << 143 tree[i_thTree]->RemoveCommand( aCommand ); 199 if (n_commandRemain == 0 && n_treeRe << 144 G4int n_commandRemain = tree[i_thTree]->GetCommandEntry(); 200 G4UIcommandTree* emptyTree = tree[ << 145 if(n_commandRemain==0) 201 tree.erase(tree.begin() + i_thTree << 146 { 202 delete emptyTree; << 147 G4UIcommandTree * emptyTree = tree[i_thTree]; 203 } << 148 tree.erase(tree.begin()+i_thTree); 204 break; << 149 delete emptyTree; >> 150 } >> 151 break; 205 } 152 } 206 } 153 } 207 } 154 } 208 } 155 } 209 } 156 } 210 157 211 // ------------------------------------------- << 158 // L. Garnier 01.28.08 This function has not a good name. In fact, it try 212 G4UIcommand* G4UIcommandTree::FindPath(const c << 159 // to match a command name, not a path. It should be rename as FindCommandName 213 { << 214 // This function tries to match a command na << 215 160 >> 161 G4UIcommand * G4UIcommandTree::FindPath(const char* commandPath) >> 162 { 216 G4String remainingPath = commandPath; 163 G4String remainingPath = commandPath; 217 if (remainingPath.find(pathName) == std::str << 164 if( remainingPath.index( pathName ) == std::string::npos ) 218 return nullptr; << 165 { return NULL; } 219 } << 166 remainingPath.remove(0,pathName.length()); 220 remainingPath.erase(0, pathName.length()); << 167 G4int i = remainingPath.first('/'); 221 std::size_t i = remainingPath.find('/'); << 168 if( i == G4int(std::string::npos) ) 222 if (i == std::string::npos) { << 169 { 223 // Find command 170 // Find command 224 std::size_t n_commandEntry = command.size( << 171 G4int n_commandEntry = command.size(); 225 for (std::size_t i_thCommand = 0; i_thComm << 172 for( G4int i_thCommand = 0; i_thCommand < n_commandEntry; i_thCommand++ ) 226 if (remainingPath == command[i_thCommand << 173 { 227 return command[i_thCommand]; << 174 if( remainingPath == command[i_thCommand]->GetCommandName() ) 228 } << 175 { return command[i_thCommand]; } 229 } 176 } 230 } 177 } 231 else { << 178 else >> 179 { 232 // Find path 180 // Find path 233 G4String nextPath = pathName; 181 G4String nextPath = pathName; 234 nextPath.append(remainingPath.substr(0, i << 182 nextPath.append(remainingPath(0,i+1)); 235 std::size_t n_treeEntry = tree.size(); << 183 G4int n_treeEntry = tree.size(); 236 for (std::size_t i_thTree = 0; i_thTree < << 184 for( G4int i_thTree = 0; i_thTree < n_treeEntry; i_thTree++ ) 237 if (nextPath == tree[i_thTree]->GetPathN << 185 { 238 return tree[i_thTree]->FindPath(comman << 186 if( nextPath == tree[i_thTree]->GetPathName() ) 239 } << 187 { return tree[i_thTree]->FindPath( commandPath ); } 240 } 188 } 241 } 189 } 242 return nullptr; << 190 return NULL; 243 } 191 } 244 192 245 // ------------------------------------------- << 246 G4UIcommandTree* G4UIcommandTree::FindCommandT << 247 { << 248 // Try to match a command or a path with the << 249 // @commandPath : command or path to match << 250 // @return the commandTree found or nullptr << 251 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 */ >> 199 G4UIcommandTree * G4UIcommandTree::FindCommandTree(const char* commandPath) >> 200 { 252 G4String remainingPath = commandPath; 201 G4String remainingPath = commandPath; 253 if (remainingPath.find(pathName) == std::str << 202 if( remainingPath.index( pathName ) == std::string::npos ) 254 return nullptr; << 203 { return NULL; } 255 } << 204 remainingPath.remove(0,pathName.length()); 256 remainingPath.erase(0, pathName.length()); << 205 G4int i = remainingPath.first('/'); 257 std::size_t i = remainingPath.find('/'); << 206 if( i != G4int(std::string::npos) ) 258 if (i != std::string::npos) { << 207 { 259 // Find path 208 // Find path 260 G4String nextPath = pathName; 209 G4String nextPath = pathName; 261 nextPath.append(remainingPath.substr(0, i << 210 nextPath.append(remainingPath(0,i+1)); 262 std::size_t n_treeEntry = tree.size(); << 211 G4int n_treeEntry = tree.size(); 263 for (std::size_t i_thTree = 0; i_thTree < << 212 for( G4int i_thTree = 0; i_thTree < n_treeEntry; i_thTree++ ) >> 213 { 264 if (tree[i_thTree]->GetPathName() == com 214 if (tree[i_thTree]->GetPathName() == commandPath) { 265 return tree[i_thTree]; 215 return tree[i_thTree]; 266 } 216 } 267 if (nextPath == tree[i_thTree]->GetPathN << 217 else if( nextPath == tree[i_thTree]->GetPathName() ) { 268 return tree[i_thTree]->FindCommandTree << 218 return tree[i_thTree]->FindCommandTree( commandPath ); 269 } 219 } 270 } 220 } 271 } 221 } 272 else { << 222 return NULL; 273 return this; << 274 } << 275 return nullptr; << 276 } 223 } 277 224 278 // ------------------------------------------- << 225 void G4UIcommandTree::ListCurrent() 279 G4String G4UIcommandTree::CompleteCommandPath( << 280 { << 281 G4String pName = aCommandPath; << 282 G4String remainingPath = aCommandPath; << 283 G4String empty = ""; << 284 G4String matchingPath = empty; << 285 << 286 // find the tree << 287 auto jpre = pName.rfind('/'); << 288 if (jpre != G4String::npos) { << 289 pName.erase(jpre + 1); << 290 } << 291 G4UIcommandTree* aTree = FindCommandTree(pNa << 292 << 293 if (aTree == nullptr) { << 294 return empty; << 295 } << 296 << 297 if (pName.find(pName) == std::string::npos) << 298 return empty; << 299 } << 300 << 301 std::vector<G4String> paths; << 302 << 303 // list matched directories/commands << 304 G4String strtmp; << 305 G4int nMatch = 0; << 306 << 307 G4int Ndir = aTree->GetTreeEntry(); << 308 G4int Ncmd = aTree->GetCommandEntry(); << 309 << 310 // directory ... << 311 for (G4int idir = 1; idir <= Ndir; ++idir) { << 312 const G4String& fpdir = aTree->GetTree(idi << 313 // matching test << 314 if (fpdir.find(remainingPath, 0) == 0) { << 315 if (nMatch == 0) { << 316 matchingPath = fpdir; << 317 } << 318 else { << 319 matchingPath = GetFirstMatchedString(f << 320 } << 321 ++nMatch; << 322 paths.push_back(fpdir); << 323 } << 324 } << 325 << 326 if (paths.size() >= 2) { << 327 G4cout << "Matching directories :" << G4en << 328 for (const auto& path : paths) { << 329 G4cout << path << G4endl; << 330 } << 331 } << 332 << 333 // command ... << 334 std::vector<G4String> commands; << 335 << 336 for (G4int icmd = 1; icmd <= Ncmd; ++icmd) { << 337 G4String fpcmd = aTree->GetPathName() + aT << 338 // matching test << 339 if (fpcmd.find(remainingPath, 0) == 0) { << 340 if (nMatch == 0) { << 341 matchingPath = fpcmd + " "; << 342 } << 343 else { << 344 strtmp = fpcmd + " "; << 345 matchingPath = GetFirstMatchedString(m << 346 } << 347 nMatch++; << 348 commands.emplace_back(fpcmd + " "); << 349 } << 350 } << 351 << 352 if (commands.size() >= 2) { << 353 G4cout << "Matching commands :" << G4endl; << 354 for (const auto& matched : commands) { << 355 G4cout << matched << G4endl; << 356 } << 357 } << 358 << 359 return matchingPath; << 360 } << 361 << 362 // ------------------------------------------- << 363 G4String G4UIcommandTree::GetFirstMatchedStrin << 364 { << 365 std::size_t nlen1 = str1.length(); << 366 std::size_t nlen2 = str2.length(); << 367 << 368 std::size_t nmin = nlen1 < nlen2 ? nlen1 : n << 369 << 370 G4String strMatched; << 371 for (G4int i = 0; i < (G4int)nmin; ++i) { << 372 if (str1[i] == str2[i]) { << 373 strMatched += str1[i]; << 374 } << 375 else { << 376 break; << 377 } << 378 } << 379 << 380 return strMatched; << 381 } << 382 << 383 // ------------------------------------------- << 384 void G4UIcommandTree::ListCurrent() const << 385 { 226 { 386 G4cout << "Command directory path : " << pat 227 G4cout << "Command directory path : " << pathName << G4endl; 387 if (guidance != nullptr) { << 228 if( guidance != NULL ) guidance->List(); 388 guidance->List(); << 389 } << 390 G4cout << " Sub-directories : " << G4endl; 229 G4cout << " Sub-directories : " << G4endl; 391 std::size_t n_treeEntry = tree.size(); << 230 G4int n_treeEntry = tree.size(); 392 for (std::size_t i_thTree = 0; i_thTree < n_ << 231 for( G4int i_thTree = 0; i_thTree < n_treeEntry; i_thTree++ ) 393 G4cout << " " << tree[i_thTree]->GetPath << 232 { 394 if ((tree[i_thTree]->GetGuidance() != null << 233 G4cout << " " << tree[i_thTree]->GetPathName() 395 && tree[i_thTree]->GetGuidance()->IsWo << 234 << " " << tree[i_thTree]->GetTitle() << G4endl; 396 { << 397 G4cout << " @ "; << 398 } << 399 else { << 400 G4cout << " "; << 401 } << 402 G4cout << tree[i_thTree]->GetTitle() << G4 << 403 } 235 } 404 G4cout << " Commands : " << G4endl; 236 G4cout << " Commands : " << G4endl; 405 std::size_t n_commandEntry = command.size(); << 237 G4int n_commandEntry = command.size(); 406 for (std::size_t i_thCommand = 0; i_thComman << 238 for( G4int i_thCommand = 0; i_thCommand < n_commandEntry; i_thCommand++ ) 407 G4cout << " " << command[i_thCommand]->G << 239 { 408 if (command[i_thCommand]->IsWorkerThreadOn << 240 G4cout << " " << command[i_thCommand]->GetCommandName() 409 G4cout << " @ "; << 241 << " * " << command[i_thCommand]->GetTitle() << G4endl; 410 } << 411 else { << 412 G4cout << " * "; << 413 } << 414 G4cout << command[i_thCommand]->GetTitle() << 415 } 242 } 416 } 243 } 417 244 418 // ------------------------------------------- << 245 void G4UIcommandTree::ListCurrentWithNum() 419 void G4UIcommandTree::ListCurrentWithNum() con << 420 { 246 { 421 G4cout << "Command directory path : " << pat 247 G4cout << "Command directory path : " << pathName << G4endl; 422 if (guidance != nullptr) { << 248 if( guidance != NULL ) guidance->List(); 423 guidance->List(); << 424 } << 425 G4int i = 0; 249 G4int i = 0; 426 G4cout << " Sub-directories : " << G4endl; 250 G4cout << " Sub-directories : " << G4endl; 427 std::size_t n_treeEntry = tree.size(); << 251 G4int n_treeEntry = tree.size(); 428 for (std::size_t i_thTree = 0; i_thTree < n_ << 252 for( G4int i_thTree = 0; i_thTree < n_treeEntry; i_thTree++ ) 429 ++i; << 253 { 430 G4cout << " " << i << ") " << tree[i_thTre << 254 i++; 431 << tree[i_thTree]->GetTitle() << G4 << 255 G4cout << " " << i << ") " << tree[i_thTree]->GetPathName() >> 256 << " " << tree[i_thTree]->GetTitle() << G4endl; 432 } 257 } 433 G4cout << " Commands : " << G4endl; 258 G4cout << " Commands : " << G4endl; 434 std::size_t n_commandEntry = command.size(); << 259 G4int n_commandEntry = command.size(); 435 for (std::size_t i_thCommand = 0; i_thComman << 260 for( G4int i_thCommand = 0; i_thCommand < n_commandEntry; i_thCommand++ ) 436 ++i; << 261 { 437 G4cout << " " << i << ") " << command[i_th << 262 i++; 438 << command[i_thCommand]->GetTitle() << 263 G4cout << " " << i << ") " << command[i_thCommand]->GetCommandName() >> 264 << " * " << command[i_thCommand]->GetTitle() << G4endl; 439 } 265 } 440 } 266 } 441 267 442 // ------------------------------------------- << 268 void G4UIcommandTree::List() 443 void G4UIcommandTree::List() const << 444 { 269 { 445 ListCurrent(); 270 ListCurrent(); 446 std::size_t n_commandEntry = command.size(); << 271 G4int n_commandEntry = command.size(); 447 for (std::size_t i_thCommand = 0; i_thComman << 272 for( G4int i_thCommand = 0; i_thCommand < n_commandEntry; i_thCommand++ ) >> 273 { 448 command[i_thCommand]->List(); 274 command[i_thCommand]->List(); 449 } 275 } 450 std::size_t n_treeEntry = tree.size(); << 276 G4int n_treeEntry = tree.size(); 451 for (std::size_t i_thTree = 0; i_thTree < n_ << 277 for( G4int i_thTree = 0; i_thTree < n_treeEntry; i_thTree++ ) >> 278 { 452 tree[i_thTree]->List(); 279 tree[i_thTree]->List(); 453 } 280 } 454 } 281 } 455 282 456 // ------------------------------------------- << 457 G4String G4UIcommandTree::CreateFileName(const 283 G4String G4UIcommandTree::CreateFileName(const char* pName) 458 { 284 { 459 G4String fn = pName; 285 G4String fn = pName; 460 std::size_t idxs; << 286 G4int idxs; 461 while ((idxs = fn.find('/')) != std::string: << 287 while((idxs=fn.index("/"))!=G4int(std::string::npos)) 462 fn[(G4int)idxs] = '_'; << 288 { fn(idxs) = '_'; } 463 } << 464 fn += ".html"; 289 fn += ".html"; 465 return fn; 290 return fn; 466 } 291 } 467 292 468 // ------------------------------------------- << 469 G4String G4UIcommandTree::ModStr(const char* s 293 G4String G4UIcommandTree::ModStr(const char* strS) 470 { 294 { 471 G4String sx; 295 G4String sx; 472 G4String str = strS; 296 G4String str = strS; 473 for (G4int i = 0; i < G4int(str.length()); + << 297 for(G4int i=0;i<G4int(str.length());i++) 474 char c = str[i]; << 298 { 475 switch (c) { << 299 char c = str(i); 476 case '<': << 300 switch(c) 477 sx += "<"; << 301 { 478 break; << 302 case '<': 479 case '>': << 303 sx += "<"; break; 480 sx += ">"; << 304 case '>': 481 break; << 305 sx += ">"; break; 482 case '&': << 306 case '&': 483 sx += "&"; << 307 sx += "&"; break; 484 break; << 308 default: 485 default: << 309 sx += c; 486 sx += c; << 487 } 310 } 488 } 311 } 489 return sx; 312 return sx; 490 } 313 } 491 314 492 // ------------------------------------------- << 315 void G4UIcommandTree::CreateHTML() 493 void G4UIcommandTree::CreateHTML(const G4Strin << 494 { 316 { 495 G4String ofileName = CreateFileName(pathName 317 G4String ofileName = CreateFileName(pathName); 496 std::ofstream oF(ofileName, std::ios::out); 318 std::ofstream oF(ofileName, std::ios::out); 497 319 498 oF << "<html><head><title>Commands in " << M 320 oF << "<html><head><title>Commands in " << ModStr(pathName) << "</title></head>" << G4endl; 499 oF << "<style> \ << 321 oF << "<body bgcolor=\"#ffffff\"><h2>" << ModStr(pathName) << "</h2><p>" << G4endl; 500 table,table td,table th { \ << 322 501 border:1px solid #eee \ << 323 if( guidance != NULL ) 502 } \ << 324 { 503 table td,table th { \ << 325 for(G4int i=0;i<guidance->GetGuidanceEntries();i++) 504 padding:5px 20px; \ << 326 { oF << ModStr(guidance->GetGuidanceLine(i)) << "<br>" << G4endl; } 505 line-height:1.3; \ << 327 } 506 text-align:inherit \ << 328 507 } \ << 329 oF << "<p><hr><p>" << G4endl; 508 a { \ << 330 509 color:#17a81a; \ << 331 oF << "<h2>Sub-directories : </h2><dl>" << G4endl; 510 text-decoration:none; \ << 332 for( G4int i_thTree = 0; i_thTree < G4int(tree.size()); i_thTree++ ) 511 transition-duration:0.3s \ << 333 { 512 } \ << 334 oF << "<p><br><p><dt><a href=\"" << CreateFileName(tree[i_thTree]->GetPathName()) 513 a:hover { \ << 335 << "\">" << ModStr(tree[i_thTree]->GetPathName()) << "</a>" << G4endl; 514 color:#17a81a \ << 336 oF << "<p><dd>" << ModStr(tree[i_thTree]->GetTitle()) << G4endl; 515 } \ << 337 tree[i_thTree]->CreateHTML(); 516 table { \ << 338 } 517 border-collapse:collapse; \ << 339 518 border-spacing:0; \ << 340 oF << "</dl><p><hr><p>" << G4endl; 519 margin-bottom:5px; \ << 341 520 } \ << 342 oF << "<h2>Commands : </h2><dl>" << G4endl; 521 h1 { \ << 343 for( G4int i_thCommand = 0; i_thCommand < G4int(command.size()); i_thCommand++ ) 522 font-size:2.25em; \ << 344 { 523 font-weight:300; \ << 345 G4UIcommand* cmd = command[i_thCommand]; 524 letter-spacing:-1px; \ << 346 oF << "<p><br><p><dt><b>" << ModStr(cmd->GetCommandName()); 525 line-height:1.15em; \ << 347 if(cmd->GetParameterEntries()>0) 526 margin-bottom:0.5em; \ << 348 { 527 word-wrap:break-word \ << 349 for(G4int i_thParam=0;i_thParam<cmd->GetParameterEntries();i_thParam++) 528 } \ << 350 { oF << " [<i>" << ModStr(cmd->GetParameter(i_thParam)->GetParameterName()) << "</i>]"; } 529 h2 { \ << 351 } 530 font-size:1.5em; \ << 352 oF << "</b>" << G4endl; 531 font-weight:300; \ << 353 oF << "<p><dd>" << G4endl; 532 letter-spacing:-1px; \ << 354 for(G4int i=0;i<cmd->GetGuidanceEntries();i++) 533 line-height:1.15em; \ << 355 { oF << ModStr(cmd->GetGuidanceLine(i)) << "<br>" << G4endl; } 534 margin-bottom:0.5em; \ << 356 if(!(cmd->GetRange()).isNull()) 535 word-wrap:break-word \ << 357 { oF << "<p><dd>Range : " << ModStr(cmd->GetRange()) << G4endl; } 536 } \ << 358 std::vector<G4ApplicationState>* availabelStateList = cmd->GetStateList(); 537 h3 { \ << 359 if(availabelStateList->size()==6) 538 color:#26282a; \ << 360 { oF << "<p><dd>Available at all Geant4 states." << G4endl; } 539 font-weight:300; \ << 361 else 540 font-size:1.3em; \ << 362 { 541 padding:15px 0 15px 0; \ << 363 oF << "<p><dd>Available Geant4 state(s) : "; 542 border-bottom:2px #eee solid; \ << 364 for(G4int ias=0;ias<G4int(availabelStateList->size());ias++) 543 word-wrap:break-word \ << 365 { oF << G4StateManager::GetStateManager()->GetStateString((*availabelStateList)[ias]) << " " << G4endl; } 544 } \ << 366 } 545 .sidebar { \ << 367 if(cmd->GetParameterEntries()>0) 546 display:block; \ << 368 { 547 position:relative; \ << 369 oF << "<p><dd>Parameters<table border=1>" << G4endl; 548 position:sticky; \ << 370 for(G4int i_thParam=0;i_thParam<cmd->GetParameterEntries();i_thParam++) 549 float:left; \ << 371 { 550 -webkit-box-sizing:border-box; \ << 372 G4UIparameter* prm = cmd->GetParameter(i_thParam); 551 -moz-box-sizing:border-box; \ << 373 oF << "<tr><td>" << ModStr(prm->GetParameterName()) << G4endl; 552 -ms-box-sizing:border-box; \ << 374 oF << "<td>type " << prm->GetParameterType() << G4endl; 553 box-sizing:border-box; \ << 375 oF << "<td>"; 554 width:20%; \ << 376 if(prm->IsOmittable()) 555 padding-right:20px \ << 377 { 556 } \ << 378 oF << "Omittable : "; 557 .context { \ << 379 if(prm->GetCurrentAsDefault()) 558 width:80%; \ << 380 { oF << "current value is used as the default value." << G4endl; } 559 display:inline-block; \ << 381 else 560 background-color:#fff; \ << 382 { oF << "default value = " << prm->GetDefaultValue() << G4endl; } 561 padding: 25px 35px 20px 30px; \ << 562 -webkit-box-sizing:border-box; \ << 563 -moz-box-sizing:border-box; \ << 564 -ms-box-sizing:border-box; \ << 565 box-sizing:border-box \ << 566 } \ << 567 </style>" << 568 << G4endl; << 569 oF << "<body bgcolor=\"#ffffff\">" << G4endl << 570 << 571 // Left Panel << 572 if (createHTMLTreeLevel == 0) { << 573 oF << "<div class=\"sidebar\">" << sideBar << 574 } << 575 // Right Panel << 576 oF << "<div class=\"context\">"; << 577 oF << "<h1>" << ModStr(pathName) << "</h1>" << 578 << 579 if (guidance != nullptr) { << 580 for (G4int i = 0; i < (G4int)guidance->Get << 581 oF << ModStr(guidance->GetGuidanceLine(i << 582 } << 583 } << 584 if (!tree.empty()) { << 585 G4String menu = ""; << 586 G4String newSideBar = ""; << 587 menu += "<h2>Sub-directories </h2><table>" << 588 newSideBar += "<h2><a href=\"" + ofileName << 589 // Build menu short version << 590 for (auto& i_thTree : tree) { << 591 newSideBar += "<tr><td><a href=\"" + Cre << 592 + ModStr(i_thTree->GetPath << 593 } << 594 // Build menu << 595 for (auto& i_thTree : tree) { << 596 menu += "<tr><td><a href=\"" + CreateFil << 597 + ModStr(i_thTree->GetPathName() << 598 menu += "</td><td>" + ModStr(i_thTree->G << 599 } << 600 menu += "</table>"; << 601 newSideBar += "</table>"; << 602 for (auto& i_thTree : tree) { << 603 createHTMLTreeLevel++; << 604 i_thTree->CreateHTML(newSideBar); << 605 createHTMLTreeLevel--; << 606 } << 607 oF << menu << G4endl; << 608 } << 609 << 610 if (!command.empty()) { << 611 oF << "<h2>Commands </h2>" << G4endl; << 612 << 613 // resume << 614 oF << "<table>" << G4endl; << 615 for (std::size_t i_thCommand = 0; i_thComm << 616 G4UIcommand* cmd = command[i_thCommand]; << 617 oF << "<tr><td><a href=\"#c" << i_thComm << 618 oF << "</a></td></tr>" << G4endl; << 619 } << 620 oF << "</table>" << G4endl; << 621 for (std::size_t i_thCommand = 0; i_thComm << 622 G4UIcommand* cmd = command[i_thCommand]; << 623 oF << "<h3 id=\"c" << i_thCommand << "\" << 624 if (cmd->GetParameterEntries() > 0) { << 625 for (G4int i_thParam = 0; i_thParam < << 626 oF << " [<i>" << ModStr(cmd->GetPara << 627 } << 628 } << 629 oF << "</h3>" << G4endl; << 630 oF << "<p>" << G4endl; << 631 for (G4int i = 0; i < (G4int)cmd->GetGui << 632 oF << ModStr(cmd->GetGuidanceLine(i)) << 633 } << 634 if (!(cmd->GetRange()).empty()) { << 635 oF << "<p>Range : " << ModStr(cmd->Get << 636 } << 637 std::vector<G4ApplicationState>* availab << 638 if (availabelStateList->size() == 6) { << 639 oF << "<p>Available at all Geant4 stat << 640 } << 641 else { << 642 oF << "<p>Available Geant4 state(s) : << 643 for (auto& ias : *availabelStateList) << 644 oF << G4StateManager::GetStateManage << 645 } << 646 } << 647 if (cmd->GetParameterEntries() > 0) { << 648 oF << "<p>Parameters<table border=1>" << 649 for (G4int i_thParam = 0; i_thParam < << 650 G4UIparameter* prm = cmd->GetParamet << 651 oF << "<tr><td>" << ModStr(prm->GetP << 652 oF << "<td>type " << prm->GetParamet << 653 oF << "<td>"; << 654 if (prm->IsOmittable()) { << 655 oF << "Omittable : "; << 656 if (prm->GetCurrentAsDefault()) { << 657 oF << "current value is used as << 658 } << 659 else { << 660 oF << "default value = " << prm- << 661 } << 662 } << 663 oF << "<td>"; << 664 if (!(prm->GetParameterRange()).empt << 665 oF << "Parameter range : " << ModS << 666 } << 667 else if (!(prm->GetParameterCandidat << 668 oF << "Parameter candidates : " << << 669 } << 670 } 383 } 671 oF << "</table>" << G4endl; << 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; } 672 } 389 } >> 390 oF << "</table>" << G4endl; 673 } 391 } >> 392 674 } 393 } 675 oF << "</div></body></html>" << G4endl; << 394 >> 395 oF << "</dl></body></html>" << G4endl; 676 oF.close(); 396 oF.close(); 677 } 397 } 678 398 679 // ------------------------------------------- << 680 G4UIcommandTree* G4UIcommandTree::GetTree(cons << 681 { << 682 G4String comName = comNameC; << 683 for (auto& i : tree) { << 684 if (comName == i->GetPathName()) { << 685 return i; << 686 } << 687 } << 688 return nullptr; << 689 } << 690 399