31 #ifdef G4UI_BUILD_WT_SESSION
44 #include <Wt/WLineedit>
45 #include <Wt/WTextarea>
46 #include <Wt/Wmessagebox>
48 #include <Wt/Wradiobutton>
49 #include <Wt/Wbuttongroup>
50 #include <Wt/Wcombobox>
51 #include <Wt/WVBoxLayout>
52 #include <Wt/WHBoxLayout>
53 #include <Wt/WGridLayout>
55 #include <Wt/WSelectionBox>
58 #define G4DEBUG_INTERFACES_BASIC 1
61 static G4bool exitSession =
true;
62 static G4bool exitPause =
true;
91 ,fCoutTBTextArea(NULL)
96 ,fHistoryTBTableList(NULL)
97 ,fHelpTreeWidget(NULL)
99 ,fHistoryTBWidget(NULL)
101 ,fSceneTreeComponentsTBWidget(NULL)
103 ,fViewerTabWidget(NULL)
105 ,fEmptyViewerTabLabel(NULL)
106 ,fMainSplitterWidget(NULL)
107 ,fRightSplitterWidget(NULL)
108 ,fHelpVSplitter(NULL)
111 ,fStringSeparator(
"__$$$@%%###__")
113 ,fMoveSelected(false)
114 ,fRotateSelected(true)
115 ,fPickSelected(false)
116 ,fZoomInSelected(false)
117 ,fZoomOutSelected(false)
123 G4Wt* interactorManager = G4Wt::getInstance (argc,argv,(
char*)
"Wt");
124 if (!(Wt::WApplication*)interactorManager->GetMainInteractor()) {
129 G4cout <<
"G4UIWt : Unable to init Wt. Aborted" <<
G4endl;
137 fMainWindow =
new Wt::WContainerWidget(wApp->root());
140 Wt::WVBoxLayout* mainWindowVLayout =
new Wt::WVBoxLayout();
141 fMainWindow->setLayout(mainWindowVLayout);
144 #ifdef G4DEBUG_INTERFACES_BASIC
145 printf(
"G4UIWt::Initialise after main window creation +++++++++++\n");
150 fMainSplitterWidget =
new Wt::WContainerWidget();
151 Wt::WGridLayout* fMainSplitterWidgetLayout =
new Wt::WGridLayout();
154 fMainSplitterWidgetLayout->addWidget(CreateLeftSplitterWidget(),1,1);
155 fMainSplitterWidgetLayout->addWidget(CreateRightSplitterWidget(),1,2);
156 fMainSplitterWidgetLayout->setColumnResizable (1,
true,Wt::WLength(30,Wt::WLength::Percentage));
162 fMainSplitterWidget->setLayout(fMainSplitterWidgetLayout);
163 mainWindowVLayout->addWidget(fMainSplitterWidget);
167 #ifdef G4DEBUG_INTERFACES_BASIC
168 printf(
"G4UIWt::G4UIWt :: 5\n");
174 wApp->setTitle(
"Wt application");
185 #ifdef G4DEBUG_INTERFACES_BASIC
186 printf(
"G4UIWt::~G4UIWt Delete\n");
195 if (fMainWindow!=NULL) {
196 #ifdef G4DEBUG_INTERFACES_BASIC
197 printf(
"G4UIWt::~G4UIWt DELETE fMainWindow\n");
205 Wt::WWidget* G4UIWt::CreateHistoryTBWidget(
208 fHistoryTBWidget =
new Wt::WPanel();
209 fHistoryTBWidget->setCollapsed(
true);
210 fHistoryTBWidget->setCollapsible(
true);
212 fHistoryTBTableList =
new Wt::WSelectionBox();
213 fHistoryTBTableList->setSelectionMode(Wt::SingleSelection);
214 fHistoryTBTableList->changed().connect(
this,&G4UIWt::CommandHistoryCallback);
216 fHistoryTBWidget->setCentralWidget(fHistoryTBTableList);
217 return fHistoryTBWidget;
223 Wt::WWidget* G4UIWt::CreateHelpTBWidget(
226 fHelpTBWidget =
new Wt::WPanel();
227 fHelpTBWidget->setCollapsible(
true);
229 Wt::WContainerWidget *helpWidget =
new Wt::WContainerWidget();
230 Wt::WHBoxLayout *helpLayout =
new Wt::WHBoxLayout();
231 Wt::WVBoxLayout *vLayout =
new Wt::WVBoxLayout();
233 fHelpVSplitter =
new Wt::WContainerWidget();
234 fHelpVSplitter->setLayout(
new Wt::WHBoxLayout());
236 Wt::WVBoxLayout* VHelpSplitterVLayout =
new Wt::WVBoxLayout();
237 fHelpVSplitter->setLayout(VHelpSplitterVLayout);
240 fHelpLine =
new Wt::WLineEdit();
241 fHelpTBWidget->setCentralWidget(helpWidget);
242 helpWidget->setLayout(helpLayout);
243 helpWidget->layout()->addWidget(
new Wt::WLabel(Wt::WString(
"Search :")));
244 helpWidget->layout()->addWidget(fHelpLine);
245 printf(
"*** G4UIWt::CreateHelpTBWidget, missing EnterPress connection\n");
251 fHelpArea =
new Wt::WTextArea(fHelpVSplitter);
252 fHelpArea->setReadOnly(
true);
256 if (fHelpTreeWidget) {
257 fHelpVSplitter->addWidget(fHelpTreeWidget);
259 fHelpVSplitter->addWidget(fHelpArea);
261 vLayout->addWidget(helpWidget);
262 vLayout->addWidget(fHelpVSplitter,1);
272 return fHelpTBWidget;
278 Wt::WWidget* G4UIWt::CreateCoutTBWidget(
281 fCoutTBWidget =
new Wt::WPanel();
282 fCoutTBWidget->setCollapsible(
true);
283 fCoutTBWidget->setTitle(
"Output");
284 fCoutTBWidget->setCollapsed(
false);
286 Wt::WContainerWidget* myContainer =
new Wt::WContainerWidget();
287 Wt::WVBoxLayout *myContainerVLayout =
new Wt::WVBoxLayout();
288 myContainer->setLayout(myContainerVLayout);
291 if (!fCoutTBTextArea) {
292 fCoutTBTextArea =
new Wt::WTextArea(myContainer);
294 fCoutFilter =
new Wt::WLineEdit();
295 Wt::WLabel* coutFilterLabel =
new Wt::WLabel(
"Filter : ");
296 myContainerVLayout->addWidget(fCoutTBTextArea);
297 myContainerVLayout->addWidget(fCoutFilter);
298 myContainerVLayout->addWidget(coutFilterLabel);
300 Wt::WPushButton *coutTBClearButton =
new Wt::WPushButton (
"clear",myContainer);
307 fCoutTBTextArea->setReadOnly(
true);
309 Wt::WContainerWidget* coutButtonWidget =
new Wt::WContainerWidget(myContainer);
310 Wt::WHBoxLayout* layoutCoutTBButtons =
new Wt::WHBoxLayout(coutButtonWidget);
311 layoutCoutTBButtons->addWidget(coutTBClearButton);
312 layoutCoutTBButtons->addWidget(coutFilterLabel);
313 layoutCoutTBButtons->addWidget(fCoutFilter);
315 myContainerVLayout->addWidget(coutButtonWidget);
317 fCoutTBWidget->setCentralWidget(myContainer);
319 return fCoutTBWidget;
325 Wt::WContainerWidget* G4UIWt::CreateVisParametersTBWidget(
334 Wt::WWidget* G4UIWt::CreateUITabWidget(
337 fUITabWidget =
new Wt::WTabWidget();
340 fUITabWidget->addTab(CreateSceneTreeComponentsTBWidget(),
"Scene tree");
341 fUITabWidget->addTab(CreateHelpTBWidget(),
"Help");
342 fUITabWidget->addTab(CreateHistoryTBWidget(),
"History");
353 Wt::WWidget* G4UIWt::CreateSceneTreeComponentsTBWidget(){
355 fSceneTreeComponentsTBWidget =
new Wt::WTabWidget();
357 fSceneTreeComponentsTBWidget->hide();
359 return fSceneTreeComponentsTBWidget;
363 Wt::WContainerWidget* G4UIWt::CreateLeftSplitterWidget(){
365 fLeftSplitterWidget =
new Wt::WContainerWidget();
366 Wt::WVBoxLayout * layoutLeftSplitterWidget =
new Wt::WVBoxLayout();
367 fLeftSplitterWidget->setLayout(layoutLeftSplitterWidget);
369 layoutLeftSplitterWidget->addWidget(CreateUITabWidget());
371 return fLeftSplitterWidget;
375 Wt::WContainerWidget* G4UIWt::CreateRightSplitterWidget(){
377 fRightSplitterWidget =
new Wt::WContainerWidget();
380 Wt::WVBoxLayout* VSplitterVLayout =
new Wt::WVBoxLayout();
381 fRightSplitterWidget->setLayout(VSplitterVLayout);
382 Wt::WContainerWidget* commandLineWidget =
new Wt::WContainerWidget();
384 Wt::WHBoxLayout *layoutCommandLine =
new Wt::WHBoxLayout();
385 commandLineWidget->setLayout(layoutCommandLine);
389 fCommandLabel =
new Wt::WLabel(
"",commandLineWidget);
390 fCommandArea =
new Wt::WLineEdit(commandLineWidget);
391 fCommandArea->setToolTip(
"Apply command");
394 layoutCommandLine->addWidget(fCommandLabel);
395 layoutCommandLine->addWidget(fCommandArea);
398 fViewerTabWidget =
new G4WTabWidget(fRightSplitterWidget);
400 fViewerTabWidget->tabClosed().connect(
this, &G4UIWt::TabCloseCallback);
402 fViewerTabWidget->currentChanged().connect(
this,&G4UIWt::CurrentChangedTabWidgetCallback);
405 fEmptyViewerTabLabel =
new Wt::WLabel(
" If you want to have a Viewer, please use /vis/open commands. ");
408 fRightSplitterWidget->layout()->addWidget(fViewerTabWidget);
409 fRightSplitterWidget->layout()->addWidget(fEmptyViewerTabLabel);
410 fRightSplitterWidget->layout()->addWidget(CreateCoutTBWidget());
411 fRightSplitterWidget->layout()->addWidget(commandLineWidget);
413 commandLineWidget->setMinimumSize(50,50);
416 fCommandArea->enterPressed().connect(
this,&G4UIWt::CommandEnteredCallback);
418 return fRightSplitterWidget;
424 Wt::WTabWidget* G4UIWt::GetSceneTreeComponentsTBWidget(
427 return fSceneTreeComponentsTBWidget;
434 bool G4UIWt::AddTabWidget(
457 if (!fViewerTabWidget->isVisible() ) {
458 if ( fRightSplitterWidget->isVisible()) {
459 fRightSplitterWidget->setHidden(
true);
460 fEmptyViewerTabLabel->setHidden(
true);
462 #ifdef G4DEBUG_INTERFACES_BASIC
463 printf(
"G4UIWt::AddTabWidget +++++\n");
465 fViewerTabWidget->show();
466 fViewerTabWidget =
new G4WTabWidget(fRightSplitterWidget);
468 fViewerTabWidget->tabClosed().connect(
this, &G4UIWt::TabCloseCallback);
470 fViewerTabWidget->currentChanged().connect(
this,&G4UIWt::CurrentChangedTabWidgetCallback);
471 fRightSplitterWidget->layout()->addWidget(fViewerTabWidget);
489 fViewerTabWidget->addTab(aWidget,name);
492 aWidget->decorationStyle().setBackgroundColor (Wt::WColor(245,245,245));
494 fViewerTabWidget->setCurrentIndex(fViewerTabWidget->count()-1);
497 fViewerTabWidget->setLastTabCreated(fViewerTabWidget->currentIndex());
504 void G4UIWt::CurrentChangedTabWidgetCallback(
int tabNumber) {
505 #ifdef G4DEBUG_INTERFACES_BASIC
506 printf(
"G4UIWt::CurrentChangedTabWidget %d\n",tabNumber);
508 if ( fViewerTabWidget == NULL) {
509 fViewerTabWidget =
new G4WTabWidget;
512 #ifdef G4DEBUG_INTERFACES_BASIC
513 printf(
"G4UIWt::CurrentChangedTabWidget CALL REPAINT tabGL\n");
516 fViewerTabWidget->setCurrentIndex(tabNumber);
519 fViewerTabWidget->setTabSelected(
false);
521 fViewerTabWidget->show();
524 fViewerTabWidget->setTabSelected(
true);
527 Wt::WString text = fViewerTabWidget->tabText (tabNumber);
529 Wt::WString paramSelect = Wt::WString(
"/vis/viewer/select ")+text;
542 #ifdef G4DEBUG_INTERFACES_BASIC
543 printf(
"G4UIWt::G4UIWt SessionStart 1\n");
546 G4Wt* interactorManager = G4Wt::getInstance ();
553 #ifdef G4DEBUG_INTERFACES_BASIC
554 printf(
"G4UIWt::G4UIWt SessionStart2\n");
556 interactorManager->DisableSecondaryLoop ();
569 interactorManager->EnableSecondaryLoop ();
580 void G4UIWt::Prompt (
584 if (!aPrompt)
return;
585 if (!fCommandLabel)
return;
587 fCommandLabel->setText((
char*)aPrompt.
data());
592 void G4UIWt::SessionTerminate (
595 G4Wt* interactorManager = G4Wt::getInstance ();
597 if ((Wt::WApplication*)interactorManager->GetMainInteractor()) {
608 void G4UIWt::SecondaryLoop (
612 if (!aPrompt)
return;
614 G4Wt* interactorManager = G4Wt::getInstance ();
618 while((eventTmp = interactorManager->GetEvent())!=NULL) {
619 interactorManager->DispatchEvent(eventTmp);
620 if(fExitPause==
true)
break;
629 void G4UIWt::CommandEnteredCallback (
632 #ifdef G4DEBUG_INTERFACES_BASIC
633 printf(
"G4UIWt::CommandEnteredCallback\n");
635 #ifdef G4DEBUG_INTERFACES_BASIC
636 printf(
"G4UIWt::CommandEnteredCallback 1\n");
638 G4String command (fCommandArea->text().toUTF8());
639 if (fCommandArea->text() !=
"") {
641 printf(
"*** G4UIWt::CommandEnteredCallback, missing update on history \n");
647 fCommandArea->setText(
"");
648 #ifdef G4DEBUG_INTERFACES_BASIC
649 printf(
"G4UIWt::CommandEnteredCallback 2\n");
652 G4Wt* interactorManager = G4Wt::getInstance ();
653 #ifdef G4DEBUG_INTERFACES_BASIC
654 printf(
"G4UIWt::CommandEnteredCallback 3\n");
656 if (interactorManager) {
657 interactorManager->FlushAndWaitExecution();
659 #ifdef G4DEBUG_INTERFACES_BASIC
660 printf(
"G4UIWt::CommandEnteredCallback 4\n");
662 if (command(0,4) !=
"help") {
663 ApplyShellCommand (command,exitSession,exitPause);
665 ActivateCommand(command);
667 #ifdef G4DEBUG_INTERFACES_BASIC
668 printf(
"G4UIWt::CommandEnteredCallback 5\n");
673 #ifdef G4DEBUG_INTERFACES_BASIC
674 printf(
"G4UIWt::CommandEnteredCallback 6\n");
676 if(exitSession==
true)
679 #ifdef G4DEBUG_INTERFACES_BASIC
680 printf(
"G4UIWt::CommandEnteredCallback END\n");
692 void G4UIWt::AddButton (
695 ,
const char* aCommand
698 if(aMenu==NULL)
return;
699 if(aLabel==NULL)
return;
700 if(aCommand==NULL)
return;
702 Wt::WMenu *parentTmp = (Wt::WMenu*)GetInteractor(aMenu);
704 if(parentTmp==NULL) {
709 G4cout <<
"Menu name " << aMenu<<
" does not exist, please define it before using it."<<
G4endl;
720 G4int cmdEndPos = cmd.find_first_of(
" \t");
721 if(cmdEndPos!=
G4int(std::string::npos)) {
722 cmd.erase(cmdEndPos);
725 if(treeTop->
FindPath(aCommand) == NULL) {
730 G4cout <<
"Warning: command '"<< aCommand <<
"' does not exist, please define it before using it."<<
G4endl;
734 printf(
"*** G4UIWt::AddButton, missing connection on menu callback \n");
748 void G4UIWt::AddIcon(
const char* aLabel,
const char* aIconFile,
const char* aCommand,
const char* ){
749 if(aLabel==NULL)
return;
751 if (aCommand==NULL) {
752 if (std::string(aIconFile) ==
"user_icon") {
756 printf(
"*** G4UIWt::AddIcon, missing icon creation \n");
1640 bool G4UIWt::CreateCommandWidget(
G4UIcommand* aCommand, Wt::WContainerWidget* aParent,
bool isDialog) {
1642 if (aCommand == NULL) {
1649 if( n_parameterEntry > 0 ) {
1653 Wt::WContainerWidget* paramWidget =
new Wt::WContainerWidget();
1654 Wt::WGridLayout* gridLayout =
new Wt::WGridLayout(paramWidget);
1657 unsigned int nbColorParameter = 0;
1658 bool isStillColorParameter =
false;
1659 bool isColorDialogAdded =
false;
1660 Wt::WLabel* redLabel = NULL;
1661 Wt::WLabel* greenLabel = NULL;
1662 Wt::WString redDefaultStr =
"";
1663 Wt::WString greenDefaultStr =
"";
1664 Wt::WString blueDefaultStr =
"";
1665 Wt::WWidget* redInput = NULL;
1666 Wt::WWidget* greenInput = NULL;
1668 for(
G4int i_thParameter=0; i_thParameter<n_parameterEntry; i_thParameter++ ) {
1673 if ((label->text() ==
"red") || (label->text() ==
"red_or_string")){
1674 nbColorParameter ++;
1675 isStillColorParameter =
true;
1676 }
else if ((label->text() ==
"green") && isStillColorParameter) {
1677 nbColorParameter ++;
1678 }
else if ((label->text() ==
"blue") && isStillColorParameter) {
1679 nbColorParameter ++;
1680 }
else if (!isColorDialogAdded) {
1683 if (nbColorParameter == 1) {
1684 gridLayout->addWidget(redLabel,i_thParameter-1,0);
1685 gridLayout->addWidget(redInput,i_thParameter-1,1);
1686 }
else if (nbColorParameter == 2) {
1687 gridLayout->addWidget(redLabel,i_thParameter-2,0);
1688 gridLayout->addWidget(redInput,i_thParameter-2,1);
1689 gridLayout->addWidget(greenLabel,i_thParameter-1,0);
1690 gridLayout->addWidget(greenInput,i_thParameter-1,1);
1692 nbColorParameter = 0;
1695 Wt::WWidget* input = NULL;
1697 if ((paramType ==
'd') || (paramType ==
'i')) {
1698 input =
new Wt::WLineEdit();
1700 dynamic_cast<Wt::WLineEdit*
>(input)->setText(Wt::WString((
char*)(param->
GetDefaultValue()).
data()));
1702 if (((label->text() ==
"red") || (label->text() ==
"red_or_string")) && isStillColorParameter) {
1704 }
else if ((label->text() ==
"green") && isStillColorParameter) {
1706 }
else if ((label->text() ==
"green") && isStillColorParameter) {
1710 }
else if (paramType ==
'b') {
1711 input =
new Wt::WContainerWidget();
1712 Wt::WHBoxLayout* layout =
new Wt::WHBoxLayout(input);
1714 Wt::WButtonGroup* buttons =
new Wt::WButtonGroup();
1715 Wt::WRadioButton* radioOff =
new Wt::WRadioButton(
"0");
1716 Wt::WRadioButton* radioOn =
new Wt::WRadioButton(
"1");
1717 buttons->addButton(radioOn);
1718 buttons->addButton(radioOff);
1719 layout->addWidget(radioOn);
1720 layout->addWidget(radioOff);
1724 if (defaultValue ==
"0") {
1725 radioOff->setChecked(
true);
1726 }
else if (defaultValue ==
"1") {
1727 radioOn->setChecked(
true);
1730 input =
new Wt::WComboBox();
1732 printf(
"*** G4UIWt::CreateCommandWidget, missing parameter management for 's'\n");
1744 }
else if (paramType ==
's') {
1745 input =
new Wt::WLineEdit();
1747 dynamic_cast<Wt::WLineEdit*
>(input)->setText(Wt::WString((
char*)(param->
GetDefaultValue()).
data()));
1749 }
else if (paramType ==
'c') {
1750 input =
new Wt::WContainerWidget();
1751 Wt::WHBoxLayout* layout =
new Wt::WHBoxLayout(input);
1753 Wt::WButtonGroup* buttons =
new Wt::WButtonGroup();
1754 Wt::WRadioButton* radioOff =
new Wt::WRadioButton(
"off");
1755 Wt::WRadioButton* radioOn =
new Wt::WRadioButton(
"on");
1756 buttons->addButton(radioOn);
1757 buttons->addButton(radioOff);
1758 layout->addWidget(radioOn);
1759 layout->addWidget(radioOff);
1763 if (defaultValue ==
"off") {
1764 radioOff->setChecked(
true);
1765 }
else if (defaultValue ==
"on") {
1766 radioOn->setChecked(
true);
1770 input =
new Wt::WLineEdit();
1771 dynamic_cast<Wt::WLineEdit*
>(input)->setText(Wt::WString((
char*)(param->
GetDefaultValue()).
data()));
1779 txt += Wt::WString(
" Parameter type : ") + std::string(¶mType).c_str() +
"\n";
1781 txt +=
" Omittable : True\n";
1783 txt +=
" Omittable : False\n";
1786 txt +=
" Default value : taken from the current value\n";
1797 if (isStillColorParameter && (nbColorParameter != 0)) {
1798 if ((label->text() ==
"red") || (label->text() ==
"red_or_string")) {
1801 }
else if (label->text() ==
"green") {
1804 }
else if (label->text() ==
"blue") {
1810 if ((redDefaultStr !=
"") && (redDefaultStr !=
"") && (redDefaultStr !=
"")) {
1812 wc.setRgb(atof(redDefaultStr.toUTF8().c_str())*256,
1813 atof(greenDefaultStr.toUTF8().c_str())*256,
1814 atof(blueDefaultStr.toUTF8().c_str())*256);
1816 printf(
"*** G4UIWt::CreateCommandWidget, missing icon on command widget\n");
1842 isColorDialogAdded =
true;
1843 isStillColorParameter =
false;
1846 gridLayout->addWidget(label,i_thParameter-nbColorParameter,0);
1847 input->setToolTip(txt);
1848 gridLayout->addWidget(input,i_thParameter-nbColorParameter,1);
1852 Wt::WLabel* name =
new Wt::WLabel(Wt::WString((
char*)(aCommand->
GetCommandPath().
data())));
1854 gridLayout->addWidget(name,n_parameterEntry-nbColorParameter,0);
1856 Wt::WPushButton* applyButton =
new Wt::WPushButton(
"Apply");
1859 gridLayout->addWidget(applyButton,n_parameterEntry-nbColorParameter,1);
1861 printf(
"*** G4UIWt::CreateCommandWidget, missing connection on ApplyButton\n");
1871 printf(
"*** G4UIWt::CreateCommandWidget, missing connection on Apply/Cancel Button\n");
1903 if (!aParent->layout()) {
1904 aParent->setLayout(
new Wt::WVBoxLayout());
1906 aParent->layout()->addWidget(paramWidget);
1920 bool G4UIWt::eventFilter(
1926 printf(
"*** G4UIWt::eventFilter, missing eventFilter on everything\n");
2001 void G4UIWt::HelpTreeClicCallback (
2004 Wt::WTreeNode* item = NULL;
2005 if (!fHelpTreeWidget)
2011 const Wt::WTree::WTreeNodeSet& list = fHelpTreeWidget->selectedNodes();
2014 item = *list.begin();
2019 if(UI==NULL)
return;
2022 std::string itemText = GetLongCommandPath(item).toUTF8();
2027 fHelpArea->setText(GetCommandList(command));
2040 void G4UIWt::HelpTreeDoubleClicCallback (
2043 HelpTreeClicCallback();
2045 Wt::WTreeNode* item = NULL;
2046 if (!fHelpTreeWidget)
2052 const Wt::WTree::WTreeNodeSet& list = fHelpTreeWidget->selectedNodes();
2055 item = *list.begin();
2059 fCommandArea->setText(
"");
2060 fCommandArea->setText(GetLongCommandPath(item));
2069 G4int G4UIWt::ReceiveG4cout (
2073 if (!aString)
return 0;
2075 Wt::WStringListModel newStr;
2078 std::string whiteSpaces(
" \f\n\r\t\v" );
2079 std::string path = (
char*)aString.
data();
2081 std::string::size_type posR = path.find_last_not_of( whiteSpaces );
2082 path.erase( posR + 1 );
2084 std::string::size_type posL = path.find_first_not_of( whiteSpaces );
2085 path.erase( 0, posL );
2087 printf(
"*** G4UIWt::ReceiveG4cout, missing filtering\n");
2097 if (!fCoutTBTextArea) {
2098 printf(
"*** G4UIWt::ReceiveG4cout, create a new fCoutTBTextArea \n");
2099 fCoutTBTextArea =
new Wt::WTextArea();
2100 fCoutTBTextArea->setText(
"");
2102 fCoutTBTextArea->setText(fCoutTBTextArea->text()+
"\n"+path);
2103 fCoutTBTextArea->refresh();
2114 G4int G4UIWt::ReceiveG4cerr (
2118 if (!aString)
return 0;
2120 Wt::WStringListModel newStr;
2123 std::string whiteSpaces(
" \f\n\r\t\v" );
2124 std::string path = (
char*)aString.
data();
2126 std::string::size_type posR = path.find_last_not_of( whiteSpaces );
2127 path.erase( posR + 1 );
2129 std::string::size_type posL = path.find_first_not_of( whiteSpaces );
2130 path.erase( 0, posL );
2132 printf(
"*** G4UIWt::ReceiveG4cerr, missing filtering\n");
2144 Wt::WMessageBox::show(
"Error", Wt::WString(fLastErrMessage.data())+
"\n"+aString.
data(), Wt::Ok );
2148 printf(
"****ERR****: %s\n",path.c_str());
2149 if (!fCoutTBTextArea) {
2150 fCoutTBTextArea =
new Wt::WTextArea();
2152 fCoutTBTextArea->setText(fCoutTBTextArea->text()+
"\n<font color='red'>"+path+
"</font>");
2153 fCoutTBTextArea->refresh();
2157 fLastErrMessage = aString;
2167 void G4UIWt::CommandEditedCallback(
const Wt::WString &)
2169 printf(
"*** G4UIWt::CommandEditedCallback, missing callback on command line edit\n");
2187 void G4UIWt::CoutFilterCallback(
2188 const Wt::WString & ) {
2189 printf(
"*** G4UIWt::CoutFilterCallbackt, missing filtering\n");
2209 void G4UIWt::AddMenu (
2214 if (aName == NULL)
return;
2215 if (aLabel == NULL)
return;
2217 printf(
"*** G4UIWt::AddMenu, missing \n");
2231 bool G4UIWt::CreateVisCommandGroupAndToolBox(
2238 printf(
"*** G4UIWt::CreateVisCommandGroupAndToolBox, missing \n");
2378 void G4UIWt::VisParameterCallback(Wt::WContainerWidget* widget){
2379 if (widget == NULL) {
2382 printf(
"*** G4UIWt::VisParameterCallback, missing \n");
2442 void G4UIWt::CommandHistoryCallback(
2445 if (!fHistoryTBTableList)
2447 fCommandArea->setText(fHistoryTBTableList->currentText ());
2448 #ifdef G4DEBUG_INTERFACES_BASIC
2449 printf(
"G4UIWt::CommandHistoryCallback change text\n");
2454 void G4UIWt::OpenHelpTreeOnCommand(
2458 printf(
"*** G4UIWt::OpenHelpTreeOnCommand, missing \n");
2591 void G4UIWt::ChangeColorCallback(Wt::WContainerWidget* widget) {
2592 if (widget == NULL) {
2595 printf(
"*** G4UIWt::ChangeColorCallback, missing \n");
2632 void G4UIWt::ChangeCursorStyle(
const Wt::WString& ) {
2636 fMoveSelected =
true;
2637 fPickSelected =
true;
2638 fRotateSelected =
true;
2639 fZoomInSelected =
true;
2640 fZoomOutSelected =
true;
2642 printf(
"*** G4UIWt::ChangeCursorStyle, missing \n");
2677 void G4UIWt::ChangeSurfaceStyle(
const Wt::WString& ) {
2681 printf(
"*** G4UIWt::ChangeSurfaceStyle, missing \n");
2718 void G4UIWt::OpenIconCallback(
const Wt::WString& ) {
2720 printf(
"*** G4UIWt::OpenIconCallback, missing \n");
2735 void G4UIWt::SaveIconCallback(
const Wt::WString& ) {
2737 printf(
"*** G4UIWt::SaveIconCallback, missing \n");
2753 void G4UIWt::ChangePerspectiveOrthoCallback(
const Wt::WString& ) {
2757 printf(
"*** G4UIWt::ChangePerspectiveOrthoCallback, missing \n");
3026 void G4UIWt::FillHelpTree()
3028 if (! fHelpTreeWidget ) {
3029 InitHelpTreeAndVisParametersWidget();
3032 Wt::WString searchText = fHelpLine->text();
3034 if (searchText ==
"") {
3042 fHelpArea->setText(
"");
3046 fHelpLine->setText(
"");
3050 if(UI==NULL)
return;
3054 Wt::WTreeNode * newItem = NULL;
3055 Wt::WString commandText =
"";
3057 for (
int a=0;
a<treeSize;
a++) {
3062 std::string whiteSpaces(
" \f\n\r\t\v" );
3065 std::string::size_type posR = path.find_last_not_of( whiteSpaces );
3066 path.erase( posR + 1 );
3068 std::string::size_type posL = path.find_first_not_of( whiteSpaces );
3069 path.erase( 0, posL );
3071 commandText = Wt::WString(path.c_str());
3074 if (fHelpTreeWidget->treeRoot()) {
3075 for (
int b=0;
b<fHelpTreeWidget->treeRoot()->displayedChildCount();
b++) {
3077 newItem = FindTreeItem(fHelpTreeWidget->treeRoot()->childNodes()[
b],path.c_str());
3080 if (newItem == NULL) {
3081 newItem =
new Wt::WTreeNode(GetShortCommandPath(path), 0);
3082 fHelpTreeWidget->setTreeRoot(newItem);
3086 CreateHelpTree(newItem,treeTop->
GetTree(
a+1));
3101 void G4UIWt::PauseSessionStart (
3105 if (!aState)
return;
3107 if(aState==
"G4_pause> ") {
3108 SecondaryLoop (
"Pause, type continue to exit this state");
3111 if(aState==
"EndOfEvent") {
3113 SecondaryLoop (
"End of event, type continue to exit this state");
3124 void G4UIWt::ActivateCommand(
3128 if (!fHelpTreeWidget) {
3132 size_t i = newCommand.
index(
" ");
3134 if( i != std::string::npos )
3136 G4String newValue = newCommand(i+1,newCommand.length()-(i+1));
3138 targetCom = ModifyToFullPathCommand( newValue );
3140 #ifdef G4DEBUG_INTERFACES_BASIC
3141 printf(
"G4UIWt::ActivateCommand found : %s \n",targetCom.
data());
3143 if (targetCom !=
"") {
3144 OpenHelpTreeOnCommand(targetCom.
data());
3147 fUITabWidget->setCurrentWidget(fHelpTBWidget);
3158 void G4UIWt::InitHelpTreeAndVisParametersWidget()
3161 if (! fHelpTreeWidget ) {
3162 fHelpTreeWidget =
new Wt::WTree();
3166 fHelpTreeWidget->setSelectionMode(Wt::SingleSelection);
3168 fHelpTreeWidget->itemSelectionChanged ().connect(
this,&G4UIWt::HelpTreeClicCallback);
3176 void G4UIWt::CreateHelpTree(
3177 Wt::WTreeNode *aParent
3181 if (aParent == NULL)
return;
3182 if (aCommandTree == NULL)
return;
3186 Wt::WTreeNode * newItem;
3188 Wt::WString commandText =
"";
3193 std::string whiteSpaces(
" \f\n\r\t\v" );
3196 std::string::size_type posR = path.find_last_not_of( whiteSpaces );
3197 path.erase( posR + 1 );
3199 std::string::size_type posL = path.find_first_not_of( whiteSpaces );
3200 path.erase( 0, posL );
3202 commandText = Wt::WString(path.c_str());
3205 newItem = FindTreeItem(aParent,path.c_str());
3206 if (newItem == NULL) {
3207 newItem =
new Wt::WTreeNode(GetShortCommandPath(path), 0,aParent);
3209 CreateHelpTree(newItem,aCommandTree->
GetTree(
a+1));
3217 std::string whiteSpaces(
" \f\n\r\t\v" );
3220 std::string::size_type posR = path.find_last_not_of( whiteSpaces );
3221 path.erase( posR + 1 );
3223 std::string::size_type posL = path.find_first_not_of( whiteSpaces );
3224 path.erase( 0, posL );
3226 commandText = Wt::WString(path.c_str());
3229 newItem = FindTreeItem(aParent,path.c_str());
3230 if (newItem == NULL) {
3232 newItem =
new Wt::WTreeNode(GetShortCommandPath(path), 0,aParent);
3234 newItem->collapse();
3249 Wt::WTreeNode* G4UIWt::FindTreeItem(
3250 Wt::WTreeNode *aParent
3251 ,
const std::string& aCommand
3254 if (aParent == NULL)
return NULL;
3257 std::string myCommand = aCommand;
3260 if (myCommand.rfind(
"/") == (myCommand.size()-1)) {
3261 myCommand = myCommand.substr(0,myCommand.size()-1);
3264 if (GetLongCommandPath(aParent) == Wt::WString(myCommand.c_str()))
3267 Wt::WTreeNode *
tmp = NULL;
3268 for (
unsigned int a=0;
a<aParent->childNodes().size();
a++) {
3270 tmp = FindTreeItem(aParent->childNodes().at(
a),myCommand);
3284 Wt::WString G4UIWt::GetCommandList (
3289 Wt::WString txt =
"";
3290 if (aCommand == NULL)
3298 if ((commandPath ==
"") &&
3299 (rangeString ==
"") &&
3300 (n_guidanceEntry == 0) &&
3301 (n_parameterEntry == 0)) {
3305 if((commandPath.length()-1)!=
'/') {
3306 txt +=
"Command " + Wt::WString((
char*)(commandPath).
data()) +
"\n";
3308 txt +=
"Guidance :\n";
3310 for(
G4int i_thGuidance=0; i_thGuidance < n_guidanceEntry; i_thGuidance++ ) {
3313 if( ! rangeString.
isNull() ) {
3314 txt +=
" Range of parameters : " + Wt::WString((
char*)(rangeString).
data()) +
"\n";
3316 if( n_parameterEntry > 0 ) {
3321 for(
G4int i_thParameter=0; i_thParameter<n_parameterEntry; i_thParameter++ ) {
3327 txt +=
" Parameter type : " + Wt::WString(&myChar) +
"\n";
3329 txt +=
" Omittable : True\n";
3331 txt +=
" Omittable : False\n";
3334 txt +=
" Default value : taken from the current value\n";
3355 G4bool G4UIWt::IsGUICommand(
3359 if (aCommand == NULL)
3364 if( n_parameterEntry > 0 ) {
3369 for(
G4int i_thParameter=0; i_thParameter<n_parameterEntry; i_thParameter++ ) {
3372 if (myChar ==
'd') {
3375 if (myChar ==
'b') {
3378 if (myChar ==
'i') {
3393 G4bool G4UIWt::GetHelpChoice(
3397 #ifdef G4DEBUG_INTERFACES_BASIC
3398 printf(
"G4UIWt::GetHelpChoice SHOULD NEVER GO HERE");
3415 void G4UIWt::ShowHelpCallback (
3424 void G4UIWt::ClearButtonCallback (
3427 fCoutTBTextArea->setText(
"");
3428 fG4cout.removeRows(0,fG4cout.rowCount());
3433 void G4UIWt::ExitSession (
3439 void G4UIWt::ExitHelp(
3452 void G4UIWt::ButtonCallback (
3453 const char* aCommand
3460 if(UI==NULL)
return;
3467 if (IsGUICommand(command)) {
3468 Wt::WDialog* menuParameterDialog =
new Wt::WDialog();
3470 if (CreateVisCommandGroupAndToolBox(command,menuParameterDialog,1,
true)) {
3471 menuParameterDialog->setWindowTitle (aCommand);
3474 menuParameterDialog->exec();
3480 ApplyShellCommand(ss,fExitSession,fExitPause);
3485 if(fExitSession==
true)
3497 void G4UIWt::LookForHelpStringCallback(
3500 Wt::WString searchText = fHelpLine->text();
3502 fHelpArea->setText(
"");
3503 if (searchText ==
"") {
3505 fHelpTreeWidget =
new Wt::WTree();
3511 OpenHelpTreeOnCommand(searchText);
3518 Wt::WString G4UIWt::GetShortCommandPath(
3519 const std::string& aTxt
3522 std::string commandPath;
3523 if (aTxt.find(
"/", 0) != std::string::npos) {
3525 commandPath = aTxt.substr(aTxt.size()-1);
3529 commandPath = commandPath.substr(commandPath.size()-commandPath.rfind(
"/",-2)-1);
3532 if (commandPath.rfind(
"/") == (commandPath.size()-1)) {
3534 commandPath = commandPath.substr(0,commandPath.size()-1);
3537 return commandPath.c_str();
3541 Wt::WString G4UIWt::GetLongCommandPath(
3545 if (item == NULL)
return "";
3548 Wt::WString itemText =
"";
3549 itemText = item->label()->text();
3551 while (item->parentNode() != NULL) {
3552 itemText = item->parentNode()->label()->text()+
"/"+itemText;
3553 item = item->parentNode();
3555 itemText =
"/"+itemText;
3571 G4WTabWidget::G4WTabWidget(
3572 Wt::WContainerWidget*&
3580 G4WTabWidget::G4WTabWidget(
3589 void G4UIWt::TabCloseCallback(
int a){
3590 Wt::WWidget* temp = fViewerTabWidget->widget(a);
3591 fViewerTabWidget->removeTab (temp);
3595 if (fViewerTabWidget->count() == 0) {
3596 fEmptyViewerTabLabel->show();
3602 void G4UIWt::ToolBoxActivated(
int a){
3604 if (fUITabWidget->widget(a) == fHelpTBWidget) {
3607 }
else if (fUITabWidget->widget(a) == fSceneTreeComponentsTBWidget) {
3608 fSceneTreeComponentsTBWidget->hide();
G4UIcommandTree * FindCommandTree(const char *commandPath)
G4String GetParameterCandidates() const
const G4String & GetRange() const
G4UIcommand * FindPath(const char *commandPath) const
G4String strip(G4int strip_Type=trailing, char c=' ')
G4int GetCommandEntry() const
G4String GetParameterName() const
G4UIcommand * GetCommand(G4int i)
G4int GetTreeEntry() const
G4int GetVerboseLevel() const
void SetSession(G4UIsession *const value)
const G4String & GetGuidanceLine(G4int i) const
void SetG4UIWindow(G4UIsession *const value)
static G4UImanager * GetUIpointer()
G4bool IsOmittable() const
static G4StateManager * GetStateManager()
G4GLOB_DLL std::ostream G4cout
str_size index(const char *, G4int pos=0) const
G4UIcommandTree * GetTree(G4int i)
G4UIparameter * GetParameter(G4int i) const
const G4String & GetCommandPath() const
const G4String GetPathName() const
const char * data() const
const G4String GetTitle() const
G4UIcommandTree * GetTree() const
G4String GetDefaultValue() const
void SetCoutDestination(G4UIsession *const value)
char GetParameterType() const
printf("%d Experimental points found\n", nlines)
const G4String GetParameterGuidance() const
G4String GetParameterRange() const
G4int GetGuidanceEntries() const
G4int GetParameterEntries() const
G4bool GetCurrentAsDefault() const
const XML_Char const XML_Char * data
G4int ApplyCommand(const char *aCommand)