source: trunk/source/interfaces/basic/src/G4UIWt.cc@ 1263

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

ras

File size: 47.3 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: G4UIWt.cc,v 1.18 2008/10/02 08:50:39 lgarnier Exp $
28// GEANT4 tag $Name: $
29//
30// L. Garnier
31
32//#define GEANT4_WT_DEBUG
33
34//#define G4UI_BUILD_WT_SESSION
35
36#ifdef G4UI_BUILD_WT_SESSION
37
38#include "G4Types.hh"
39
40#include <string.h>
41
42#include "G4Wt.hh"
43#include "G4UImanager.hh"
44#include "G4StateManager.hh"
45#include "G4UIcommandTree.hh"
46#include "G4UIcommandStatus.hh"
47
48
49
50// Undef the qt SLOT if already define
51// #ifdef SLOT
52// # undef SLOT
53// # undef signals
54// # undef slots
55// #endif
56
57
58//#include <Wt/WApplication>
59// #include <Wt/WCssStyleSheet>
60// #include <Wt/WCssDecorationStyle>
61// #include <Wt/WWidget>
62
63#include <Wt/WApplication>
64#include "Wt/Wwidget"
65#include "Wt/wlayout"
66#include <Wt/WPushButton>
67#include <Wt/WVBoxLayout>
68#include <Wt/WHBoxLayout>
69#include "Wt/WLabel"
70#include "Wt/WBoxLayout"
71#include "Wt/Ext/Splitter"
72#include "Wt/wscrollbar"
73#include "Wt/WComboBox"
74#include "Wt/wdialog"
75#include "Wt/wevent"
76#include "Wt/Ext/Container"
77#include "Wt/Ext/Panel"
78#include "Wt/Ext/Toolbar"
79#include "Wt/Ext/LineEdit"
80#include "Wt/WTextEdit"
81#include "Wt/WTreeTable"
82#include "Wt/WTreeNode"
83
84//#include "Wt/WSignalMapper"
85
86//#include <Wt/wmainwindow.h>
87//#if WT_VERSION >= 0x040000
88#include <Wt/Ext/Menu>
89//#include <Wt/wlistwidget>
90#include "Wt/wtree"
91// #else
92// #include <Wt/waction>
93// #include <Wt/wheader>
94// #include <Wt/wlistview>
95// #include <Wt/wpopupmenu>
96// #endif
97
98#include "G4UIWt.hh" // SOULD BE **AFTER** all Wt include because it will redefine SIGNAL/SLOT
99
100
101// redefine signal/slots Qt mechanisme if necessary
102#include <qobject.h>
103
104
105#include <stdlib.h>
106
107// Pourwuoi Static et non variables de classe ?
108static G4bool exitSession = true;
109static G4bool exitPause = true;
110
111/** Build a Wt window with a menubar, output area and promt area<br>
112<pre>
113 +-----------------------+
114 |exit menu| |
115 | |
116 | +-------------------+ |
117 | | | |
118 | | Output area | |
119 | | | |
120 | +-------------------+ |
121 | | clear | |
122 | +-------------------+ |
123 | | promt history | |
124 | +-------------------+ |
125 | +-------------------+ |
126 | |> promt area | |
127 | +-------------------+ |
128 +-----------------------+
129</pre>
130*/
131G4UIWt::G4UIWt (
132 const Wt::WEnvironment& env
133)
134 :fHelpDialog(NULL)
135{
136 G4Wt* interactorManager = G4Wt::getInstance (env);
137 G4UImanager* UI = G4UImanager::GetUIpointer();
138 if(UI!=NULL) UI->SetSession(this);
139
140 // Check if already define in external app WMainWindow
141 bool found = false;
142// #if WT_VERSION < 0x040000
143// // theses lines does nothing exept this one "GLWindow = new WDialog(0..."
144// // but if I comment them, it doesn't work...
145// WWidgetList *list = WApplication::allWidgets();
146// WWidgetListIt it( *list ); // iterate over the widgets
147// WWidget * widget;
148// while ( (widget=it.current()) != 0 ) { // for each widget...
149// ++it;
150// if ((found== false) && (widget->inherits("WMainWindow"))) {
151// found = true;
152// }
153// }
154// delete list; // delete the list, not the widgets
155// #else
156// foreach (WWidget *widget, WApplication::allWidgets()) {
157// if ((found== false) && (widget->inherits("WMainWindow"))) {
158// found = true;
159// }
160// }
161// #endif
162
163// if (found) {
164// G4cout << "G4UIWt : Found an external App with a WMainWindow already defined. Aborted" << G4endl;
165// return ;
166// }
167 fMainWindow = new Wt::Ext::Panel(wApp->root());
168 Wt::WContainerWidget *inside = new Wt::WContainerWidget();
169
170#ifdef G4DEBUG_INTERFACES_BASIC
171 printf("G4UIWt::Initialise after main window creation\n");
172#endif
173// #if WT_VERSION < 0x040000
174// fMainWindow->setCaption( tr( "G4UI Session" ));
175// fMainWindow->resize(900,600);
176// fMainWindow->move(50,100);
177// #else
178 fMainWindow->setTitle("G4UI Session" );
179 fMainWindow->resize(900,600);
180 // fMainWindow->move(WPoint(50,100));
181// #endif
182
183 Wt::Ext::Splitter *splitter = new Wt::Ext::Splitter(Wt::Vertical,inside);
184
185 // Set layouts
186
187 Wt::WContainerWidget* topWidget = new Wt::WContainerWidget(splitter);
188 Wt::WContainerWidget* bottomWidget = new Wt::WContainerWidget(splitter);
189
190 Wt::WBoxLayout *layoutTop = new Wt::WBoxLayout(Wt::WBoxLayout::TopToBottom,topWidget);
191 Wt::WBoxLayout *layoutBottom = new Wt::WBoxLayout(Wt::WBoxLayout::TopToBottom,bottomWidget);
192
193 // fill them
194
195 fTextArea = new Wt::WTextEdit(topWidget);
196 Wt::WPushButton *clearButton = new Wt::WPushButton(Wt::WString("clear"),topWidget);
197 connect(clearButton, SIGNAL(clicked()), SLOT(ClearButtonCallback()));
198
199// #if WT_VERSION < 0x040000
200
201// fCommandHistoryArea = new WListView(bottomWidget);
202// fCommandHistoryArea->setSorting (-1, FALSE);
203// fCommandHistoryArea->setSelectionMode(WListView::Single);
204// fCommandHistoryArea->addColumn("");
205// fCommandHistoryArea->header()->hide();
206// connect(fCommandHistoryArea, SIGNAL(selectionChanged()), SLOT(CommandHistoryCallback()));
207// #else
208 fCommandHistoryArea = new Wt::WComboBox();
209
210 //FIXME : could be more simple
211 connect(fCommandHistoryArea, SIGNAL(sactivated(Wt::WString)), SLOT(CommandHistoryCallback()));
212// #endif
213 fCommandLabel = new Wt::WLabel(Wt::WString(""),bottomWidget);
214
215 fCommandArea = new Wt::Ext::LineEdit(bottomWidget);
216// #if WT_VERSION < 0x040000
217// fCommandArea->setActiveWindow();
218// #else
219 fCommandArea->activateWindow();
220// #endif
221 connect(fCommandArea, SIGNAL(returnPressed()), SLOT(CommandEnteredCallback()));
222// #if WT_VERSION < 0x040000
223// fCommandArea->setFocusPolicy ( WWidget::StrongFocus );
224// fCommandArea->setFocus();
225// #else
226// fCommandArea->setFocusPolicy ( Wt::StrongFocus );
227// fCommandArea->setFocus(Wt::TabFocusReason);
228// #endif
229// fTextArea->setReadOnly(true);
230
231
232#ifdef G4DEBUG_INTERFACES_BASIC
233 printf("G4UIWt:: 2\n");
234#endif
235
236
237
238 layoutTop->addWidget(fTextArea);
239 layoutTop->addWidget(clearButton);
240
241// #if WT_VERSION >= 0x040000
242 topWidget->setLayout(layoutTop);
243// #endif
244
245 layoutBottom->addWidget(fCommandHistoryArea);
246 layoutBottom->addWidget(fCommandLabel);
247 layoutBottom->addWidget(fCommandArea);
248// #if WT_VERSION >= 0x040000
249
250 bottomWidget->setLayout(layoutBottom);
251 splitter->addWidget(topWidget);
252 splitter->addWidget(bottomWidget);
253// #endif
254
255
256 fMainWindow->layout()->addWidget(inside);
257
258// #if WT_VERSION < 0x040000
259
260// // Add a wuit subMenu
261// WPopupMenu *fileMenu = new WPopupMenu( fMainWindow);
262// fileMenu->insertItem( "&Wuitter", this, SLOT(ExitSession()), CTRL+Key_W );
263// fMainWindow->menuBar()->insertItem( WString("&File"), fileMenu );
264
265// // Add a Help menu
266// WPopupMenu *helpMenu = new WPopupMenu( fMainWindow );
267// helpMenu->insertItem( "&Show Help", this, SLOT(ShowHelpCallback()), CTRL+Key_H );
268// fMainWindow->menuBar()->insertItem( WString("&Help"), helpMenu );
269
270
271// #else
272
273// Create a menu with some items
274
275 Wt::Ext::Menu *menuQ = new Wt::Ext::Menu();
276 menuQ->addItem("",Wt::WString("Quit"), this, SLOT(ExitSession()));
277
278 Wt::Ext::Menu *menuS = new Wt::Ext::Menu();
279 menuS->addItem("",Wt::WString("ShowHelp"),SLOT(ShowHelpCallback()));
280
281 // Create a tool bar
282
283 fToolBar = new Wt::Ext::ToolBar(inside);
284
285 // Associate the menu with a button
286
287 Wt::Ext::Button *Q = fToolBar->addButton("File", menuQ);
288 Wt::Ext::Button *S = fToolBar->addButton("Quit", menuQ);
289
290 // Set the splitter size. The fTextArea sould be 2/3 on the fMainWindow
291// #if WT_VERSION < 0x040000
292// WValueList<int> vals = splitter->sizes();
293// #else
294// Wt::WList<int> vals = splitter->sizes();
295// // #endif
296// if(vals.size()==2) {
297// vals[0] = (splitter->orientation()==Wt::Vertical ? splitter->height() : splitter->width())*3/4;
298// vals[1] = (splitter->orientation()==Wt::Vertical ? splitter->height() : splitter->width())*1/4;
299// splitter->setSizes(vals);
300// }
301
302 if(UI!=NULL) UI->SetCoutDestination(this); // TO KEEP
303}
304
305
306
307G4UIWt::~G4UIWt(
308)
309{
310 G4UImanager* UI = G4UImanager::GetUIpointer(); // TO KEEP
311 if(UI!=NULL) { // TO KEEP
312 UI->SetSession(NULL); // TO KEEP
313 UI->SetCoutDestination(NULL); // TO KEEP
314 }
315
316 if (fMainWindow!=NULL)
317 delete fMainWindow;
318}
319
320
321
322/** Start the Wt main loop
323*/
324G4UIsession* G4UIWt::SessionStart (
325)
326{
327
328 G4Wt* interactorManager = G4Wt::getInstance ();
329
330// #if WT_VERSION >= 0x040000
331// #if WT_VERSION >= 0x040200
332 fMainWindow->show();
333// #else
334// fMainWindow->show();
335// #endif
336// #else
337// fMainWindow->show();
338// #endif
339 Prompt("session");
340 exitSession = false;
341
342
343#ifdef G4DEBUG_INTERFACES_BASIC
344 printf("G4UIWt::SessionStart Start session.. ????\n");
345#endif
346 interactorManager->DisableSecondaryLoop (); // TO KEEP
347 //FIXME : QUE FAIRE ICI ??????????????????????????
348
349// if ((Wt::WApplication*)interactorManager->GetMainInteractor())
350// ((Wt::WApplication*)interactorManager->GetMainInteractor())->exec();
351
352 // on ne passe pas le dessous ? FIXME ????
353 // je ne pense pas 13/06
354
355 // void* event; // TO KEEP
356 // while((event = interactorManager->GetEvent())!=NULL) { // TO KEEP
357 // interactorManager->DispatchEvent(event); // TO KEEP
358 // if(exitSession==true) break; // TO KEEP
359 // } // TO KEEP
360
361 interactorManager->EnableSecondaryLoop ();
362#ifdef G4DEBUG_INTERFACES_BASIC
363 printf("enable secondary loop\n");
364#endif
365 return this;
366}
367
368
369/** Display the prompt in the prompt area
370 @param aPrompt : string to display as the promt label
371 //FIXME : probablement inutile puiswue le seul a afficher ww chose d'autre
372 wue "session" est SecondaryLoop()
373*/
374void G4UIWt::Prompt (
375 G4String aPrompt
376)
377{
378 if (!aPrompt) return;
379
380 fCommandLabel->setText((char*)aPrompt.data());
381}
382
383
384void G4UIWt::SessionTerminate (
385)
386{
387 G4Wt* interactorManager = G4Wt::getInstance ();
388 delete fMainWindow;
389 ((Wt::WApplication*)interactorManager->GetMainInteractor())->quit();
390}
391
392
393
394/**
395 Called by intercoms/src/G4UImanager.cc<br>
396 Called by visualization/management/src/G4VisCommands.cc with "EndOfEvent" argument<br>
397 It have to pause the session command terminal.<br>
398 Call SecondaryLoop to wait for exit event<br>
399 @param aState
400 @see : G4VisCommandReviewKeptEvents::SetNewValue
401*/
402void G4UIWt::PauseSessionStart (
403 G4String aState
404)
405{
406 if (!aState) return;
407
408#ifdef G4DEBUG_INTERFACES_BASIC
409 printf("G4UIWt::PauseSessionStart\n");
410#endif
411 if(aState=="G4_pause> ") { // TO KEEP
412 SecondaryLoop ("Pause, type continue to exit this state"); // TO KEEP
413 } // TO KEEP
414
415 if(aState=="EndOfEvent") { // TO KEEP
416 // Picking with feed back in event data Done here !!!
417 SecondaryLoop ("End of event, type continue to exit this state"); // TO KEEP
418 } // TO KEEP
419}
420
421
422
423/**
424 Begin the secondary loop
425 @param a_prompt : label to display as the prompt label
426 */
427void G4UIWt::SecondaryLoop (
428 G4String aPrompt
429)
430{
431 if (!aPrompt) return;
432
433#ifdef G4DEBUG_INTERFACES_BASIC
434 printf("G4UIWt::SecondaryLoop\n");
435#endif
436 G4Wt* interactorManager = G4Wt::getInstance (); // TO KEEP ?
437 Prompt(aPrompt); // TO KEEP
438 exitPause = false; // TO KEEP
439 void* event; // TO KEEP
440 while((event = interactorManager->GetEvent())!=NULL) { // TO KEEP
441 interactorManager->DispatchEvent(event); // TO KEEP
442 if(exitPause==true) break; // TO KEEP
443 } // TO KEEP
444 Prompt("session"); // TO KEEP
445}
446
447
448
449/**
450 Receive a cout from Geant4. We have to display it in the cout zone
451 @param aString : label to add in the display area
452 @return 0
453*/
454G4int G4UIWt::ReceiveG4cout (
455 G4String aString
456)
457{
458 if (!aString) return 0;
459 G4Wt* interactorManager = G4Wt::getInstance ();
460 if (!interactorManager) return 0;
461
462// #if WT_VERSION < 0x040000
463// fTextArea->append(WString((char*)aString.data()).simplifyWhiteSpace());
464// fTextArea->verticalScrollBar()->setValue(fTextArea->verticalScrollBar()->maxValue());
465// #else
466
467// FIXME : SHOULD BE IMPROVE
468
469#ifdef G4DEBUG_INTERFACES_BASIC
470 printf("G4UIWt::ReceiveG4cout : append text is not optimized \n");
471#endif
472 fTextArea->setText(fTextArea->text()+Wt::WString((char*)aString.data()));
473 // fTextArea->verticalScrollBar()->setSliderPosition(fTextArea->verticalScrollBar()->maximum());
474// #endif
475// fTextArea->repaint();
476 // interactorManager->FlushAndWaitExecution();
477 return 0;
478}
479
480
481/**
482 Receive a cerr from Geant4. We have to display it in the cout zone
483 @param aString : label to add in the display area
484 @return 0
485*/
486G4int G4UIWt::ReceiveG4cerr (
487 G4String aString
488)
489{
490 if (!aString) return 0;
491 G4Wt* interactorManager = G4Wt::getInstance ();
492 if (!interactorManager) return 0;
493
494// #if WT_VERSION < 0x040000
495// WColor previousColor = fTextArea->color();
496// fTextArea->setColor(Wt::red);
497// fTextArea->append(WString((char*)aString.data()).simplifyWhiteSpace());
498// fTextArea->setColor(previousColor);
499// fTextArea->verticalScrollBar()->setValue(fTextArea->verticalScrollBar()->maxValue());
500// #else
501//FIXME no color change for the moment
502#ifdef G4DEBUG_INTERFACES_BASIC
503 printf("G4UIWt::ReceiveG4cerr : no color change for the moment \n");
504 printf("G4UIWt::ReceiveG4cerr : append text is not optimized \n");
505#endif
506// Wt::WColor previousColor = fTextArea->textColor();
507// fTextArea->setTextColor(Wt::red);
508 fTextArea->setText(fTextArea->text()+Wt::WString((char*)aString.data()));
509 // fTextArea->setTextColor(previousColor);
510 // fTextArea->verticalScrollBar()->setSliderPosition(fTextArea->verticalScrollBar()->maximum());
511// #endif
512// fTextArea->repaint();
513 // interactorManager->FlushAndWaitExecution();
514 return 0;
515}
516
517
518
519/**
520 Add a new menu to the menu bar
521 @param aName name of menu
522 @param aLabel label to display
523 */
524void G4UIWt::AddMenu (
525 const char* aName
526,const char* aLabel
527)
528{
529 if (aName == NULL) return;
530 if (aLabel == NULL) return;
531
532// #if WT_VERSION < 0x040000
533// WPopupMenu *fileMenu = new WPopupMenu( fMainWindow);
534// fMainWindow->menuBar()->insertItem( aLabel, fileMenu );
535// #else
536
537 Wt::Ext::Button *item = fToolBar->addButton(aLabel);
538
539// #endif
540
541 AddInteractor (aName,(G4Interactor)item);
542}
543
544
545/**
546 Add a new button to a menu
547 @param aMenu : parent menu
548 @param aLabel : label to display
549 @param aCommand : command to execute as a callback
550 */
551void G4UIWt::AddButton (
552 const char* aMenu
553,const char* aLabel
554,const char* aCommand
555)
556{
557 if(aMenu==NULL) return; // TO KEEP
558 if(aLabel==NULL) return; // TO KEEP
559 if(aCommand==NULL) return; // TO KEEP
560
561#ifdef G4DEBUG_INTERFACES_BASIC
562 printf("G4UIWt::AddButton NOT YET IMPLEMENTED FIXME\n");
563#endif
564// #if WT_VERSION < 0x040000
565// WPopupMenu *parent = (WPopupMenu*)GetInteractor(aMenu);
566// #else
567// Wt::Ext::ButtonWMenu *parent = (WMenu*)GetInteractor(aMenu);
568// // #endif
569
570// if(parent==NULL) return;
571
572// Wt::WSignalMapper *signalMapper = new Wt::WSignalMapper(this);
573// // #if WT_VERSION < 0x030200
574// // WAction *action = new WAction(WString(aLabel),WString(aLabel),WKeySewuence::WKeySewuence (),signalMapper, SLOT(map()));
575// // action->addTo(parent);
576// // connect(action,SIGNAL(activated()),signalMapper,SLOT(map()));
577
578// // #elif WT_VERSION < 0x040000
579// // WAction *action = new WAction(WString(aLabel),WKeySewuence::WKeySequence (),signalMapper, SLOT(map()));
580// // action->addTo(parent);
581// // connect(action,SIGNAL(activated()),signalMapper,SLOT(map()));
582
583// // #else
584// Wt::WAction *action = parent->addAction(aLabel, signalMapper, SLOT(map()));
585
586// // #endif
587// connect(signalMapper, SIGNAL(mapped(const Wt::WString &)),this, SLOT(ButtonCallback(const Wt::WString&)));
588// signalMapper->setMapping(action, Wt::WString(aCommand));
589}
590
591
592
593
594/**
595 Open the help dialog in a separate window.<br>
596 This will be display as a tree widget.<br>
597 Implementation of <b>void G4VBasicShell::TerminalHelp(G4String newCommand)</b>
598
599 @param newCommand : open the tree widget item on this command if is set
600*/
601void G4UIWt::TerminalHelp(
602 G4String newCommand
603)
604{
605 // Create the help dialog
606 if (!fHelpDialog) {
607// #if WT_VERSION < 0x040000
608// fHelpDialog = new WDialog(0,0,FALSE,Wt::WStyle_Title | Wt::WStyle_SysMenu | Wt::WStyle_MinMax );
609// #else
610 fHelpDialog = new Wt::Ext::Panel();
611 fHelpDialog->setCollapsible(true);
612 fHelpDialog->setAnimate(true);
613 fHelpDialog->setAutoScrollBars(true);
614
615// #endif
616 Wt::WVBoxLayout *vLayout = new Wt::WVBoxLayout(fHelpDialog);
617 Wt::Ext::Container *helpWidget = new Wt::Ext::Container();
618 Wt::Ext::Splitter *splitter = new Wt::Ext::Splitter(Wt::Horizontal);
619 Wt::Ext::Button *exitButton = new Wt::Ext::Button(Wt::WString("Exit"));
620 // exitButton->setAutoDefault(false);
621 connect(exitButton, SIGNAL(clicked()), fHelpDialog,SLOT(close()));
622
623 Wt::WHBoxLayout *helpLayout = new Wt::WHBoxLayout(helpWidget);
624// #if WT_VERSION < 0x040000
625// helpLayout->add(new WLabel("Search :",helpWidget));
626// #else
627
628 helpLayout->addWidget(new Wt::WLabel("Search :"));
629// #endif
630 fHelpLine = new Wt::Ext::LineEdit();
631// #if WT_VERSION < 0x040000
632// helpLayout->add(fHelpLine);
633// connect( fHelpLine, SIGNAL( returnPressed () ), this, SLOT( lookForHelpStringCallback() ) );
634// #else
635 helpLayout->addWidget(fHelpLine);
636 connect( fHelpLine, SIGNAL( editingFinished () ), this, SLOT( lookForHelpStringCallback() ) );
637// #endif
638
639 // the help tree
640// #if WT_VERSION < 0x040000
641// fHelpTreeWidget = new WListView(splitter);
642// #else
643 fHelpTreeWidget = new Wt::WTreeTable();
644// #endif
645 fHelpTreeWidget = CreateHelpTree();
646
647 fHelpArea = new Wt::WTextEdit(splitter);
648 // fHelpArea->setReadOnly(true);
649
650 // Set layouts
651
652// #if WT_VERSION >= 0x040000
653 if (fHelpTreeWidget)
654 splitter->addWidget(fHelpTreeWidget);
655 splitter->addWidget(fHelpArea);
656// #endif
657
658
659// #if WT_VERSION >= 0x040000
660 vLayout->addWidget(helpWidget);
661 vLayout->addWidget(splitter,1);
662 vLayout->addWidget(exitButton);
663// #else
664// vLayout->addWidget(helpWidget);
665// vLayout->addWidget(splitter,1);
666// vLayout->addWidget(exitButton);
667// #endif
668
669 // set the splitter size
670// #if WT_VERSION >= 0x040000
671// Wt::WList<int> list;
672// #else
673// WValueList<int> list;
674// #endif
675// list.append( 400 );
676// list.append( 400 );
677// splitter->setSizes(list);
678
679// #if WT_VERSION >= 0x040000
680 fHelpDialog->setLayout(vLayout);
681// #endif
682
683 }
684
685 ActivateCommand(newCommand);
686
687// #if WT_VERSION < 0x040000
688// fHelpDialog->setCaption( tr( "Help on commands" ));
689// #else
690 fHelpDialog->setTitle("Help on commands");
691// #endif
692 fHelpDialog->resize(800,600);
693 // fHelpDialog->move(WPoint(400,150));
694 fHelpDialog->show();
695 // fHelpDialog->raise();
696// #if WT_VERSION < 0x040000
697// fHelpDialog->setActiveWindow();
698// #else
699// fHelpDialog->activateWindow();
700// #endif
701}
702
703
704void G4UIWt::ActivateCommand(
705 G4String newCommand
706)
707{
708 if (!fHelpTreeWidget) {
709 return;
710 }
711 // Look for the choosen command "newCommand"
712 size_t i = newCommand.index(" ");
713 G4String targetCom="";
714 if( i != std::string::npos )
715 {
716 G4String newValue = newCommand(i+1,newCommand.length()-(i+1));
717 newValue.strip(G4String::both);
718 targetCom = ModifyToFullPathCommand( newValue );
719 }
720 if (targetCom != "") {
721// #if WT_VERSION < 0x040000
722// WListViewItem* findItem = NULL;
723// WListViewItem* tmpItem = fHelpTreeWidget->firstChild();
724// while (tmpItem != 0) {
725// if (!findItem) {
726// findItem = FindTreeItem(tmpItem,WString((char*)targetCom.data()));
727// }
728// tmpItem = tmpItem->nextSibling();
729// }
730// #else
731 Wt::WTreeNode* findItem = NULL;
732 for (int a=0;a<fHelpTreeWidget->topLevelItemCount();a++) {
733 if (!findItem) {
734 findItem = FindTreeItem(fHelpTreeWidget->topLevelItem(a),Wt::WString((char*)targetCom.data()));
735 }
736 }
737// #endif
738
739 if (findItem) {
740
741 //collapsed open item
742// #if WT_VERSION < 0x040000
743
744// // FIXME : Has to be checked
745// WListViewItem* tmpItem = fHelpTreeWidget->firstChild();
746// WList<WListViewItem> openItems;
747// while ((tmpItem != 0) || (!openItems.isEmpty())) {
748// if (tmpItem->isOpen() ) {
749// tmpItem->setOpen(false);
750// openItems.append(tmpItem);
751// tmpItem = tmpItem->firstChild();
752// } else {
753// tmpItem = tmpItem->nextSibling();
754// }
755// if (tmpItem == 0) {
756// tmpItem = openItems.take(openItems.count()-1);
757// }
758// }
759// #else
760 Wt::WList<Wt::WTreeNode *> selected;
761
762 selected = fHelpTreeWidget->selectedItems();
763 if ( selected.count() != 0 ) {
764 Wt::WTreeNode * tmp =selected.at( 0 );
765 while ( tmp) {
766// #if WT_VERSION < 0x040202
767// fHelpTreeWidget->setItemExpanded(tmp,false);
768// #else
769 tmp->setExpanded(false);
770// #endif
771 tmp = tmp->parent();
772 }
773 }
774// #endif
775
776 // clear old selection
777 fHelpTreeWidget->clearSelection();
778
779 // set new selection
780// #if WT_VERSION >= 0x040000
781// #if WT_VERSION < 0x040202
782// fHelpTreeWidget->setItemSelected(findItem,true);
783// #else
784 findItem->setSelected(true);
785// #endif
786// #else
787// findItem->setSelected(true);
788// #endif
789
790 // expand parent item
791 while ( findItem) {
792// #if WT_VERSION < 0x040000
793// findItem->setOpen(true);
794// #else
795// #if WT_VERSION < 0x040202
796 fHelpTreeWidget->setItemExpanded(findItem,true);
797// #else
798// findItem->setExpanded(true);
799// #endif
800// #endif
801 findItem = findItem->parent();
802 }
803
804 // Call the update of the right textArea
805 HelpTreeClicCallback();
806 }
807 }
808}
809
810
811
812/**
813 Create the help tree widget
814 @param parent : parent of tree widget
815 @return the widget containing the tree or NULL if it could not have beeen created
816 */
817
818// #if WT_VERSION < 0x040000
819// WListView * G4UIWt::CreateHelpTree()
820// #else
821Wt::WTreeTable * G4UIWt::CreateHelpTree()
822// #endif
823{
824 G4UImanager* UI = G4UImanager::GetUIpointer();
825 if(UI==NULL) return NULL;
826 G4UIcommandTree * treeTop = UI->GetTree();
827
828
829 // build widget
830// #if WT_VERSION < 0x040000
831// fHelpTreeWidget->setSelectionMode(WListView::Single);
832// fHelpTreeWidget->setRootIsDecorated(true);
833// fHelpTreeWidget->addColumn("Command");
834// fHelpTreeWidget->header()->setResizeEnabled(FALSE,1);
835// #else
836 fHelpTreeWidget->setSelectionMode(Wt::WAbstractItemView::SingleSelection);
837 Wt::WStringList labels;
838 labels << Wt::WString("Command");
839 fHelpTreeWidget->setHeaderLabels(labels);
840// #endif
841
842 G4int treeSize = treeTop->GetTreeEntry();
843// #if WT_VERSION < 0x040000
844// WListViewItem * newItem;
845// #else
846 Wt::WTreeNode * newItem;
847// #endif
848 for (int a=0;a<treeSize;a++) {
849 // Creating new item
850
851// #if WT_VERSION < 0x040000
852// newItem = new WListViewItem(fHelpTreeWidget);
853// newItem->setText(0,WString((char*)(treeTop->GetTree(a+1)->GetPathName()).data()).simplifyWhiteSpace());
854// #else
855 newItem = new Wt::WTreeNode(fHelpTreeWidget);
856 newItem->setText(0,Wt::WString((char*)(treeTop->GetTree(a+1)->GetPathName()).data()).trimmed());
857// #endif
858
859
860 // look for childs
861 CreateChildTree(newItem,treeTop->GetTree(a+1));
862 // items.append(newItem);
863 }
864
865
866// #if WT_VERSION < 0x040000
867// connect(fHelpTreeWidget, SIGNAL(selectionChanged ()),this, SLOT(HelpTreeClicCallback()));
868// connect(fHelpTreeWidget, SIGNAL(doubleClicked (WListViewItem*)),this, SLOT(HelpTreeDoubleClicCallback()));
869// #else
870 connect(fHelpTreeWidget, SIGNAL(itemSelectionChanged ()),this, SLOT(HelpTreeClicCallback()));
871 connect(fHelpTreeWidget, SIGNAL(itemDoubleClicked (Wt::WTreeNode*,int)),this, SLOT(HelpTreeDoubleClicCallback()));
872// #endif
873
874 return fHelpTreeWidget;
875}
876
877
878
879/** Fill the Help Tree Widget
880 @param aParent : parent item to fill
881 @param aCommandTree : commandTree node associate with this part of the Tree
882*/
883// #if WT_VERSION < 0x040000
884// void G4UIWt::CreateChildTree(
885// WListViewItem *aParent
886// ,G4UIcommandTree *aCommandTree
887// #else
888void G4UIWt::CreateChildTree(
889 Wt::WTreeNode *aParent
890,G4UIcommandTree *aCommandTree
891// #endif
892)
893{
894 if (aParent == NULL) return;
895 if (aCommandTree == NULL) return;
896
897
898 // Creating new item
899// #if WT_VERSION < 0x040000
900// WListViewItem * newItem;
901// #else
902 Wt::WTreeNode * newItem;
903// #endif
904
905 // Get the Sub directories
906 for (int a=0;a<aCommandTree->GetTreeEntry();a++) {
907
908// #if WT_VERSION < 0x040000
909// newItem = new WListViewItem(aParent);
910// newItem->setText(0,WString((char*)(aCommandTree->GetTree(a+1)->GetPathName()).data()).simplifyWhiteSpace());
911
912// #else
913 newItem = new Wt::WTreeNode(aParent);
914 newItem->setText(0,WString((char*)(aCommandTree->GetTree(a+1)->GetPathName()).data()).trimmed());
915// #endif
916
917 CreateChildTree(newItem,aCommandTree->GetTree(a+1));
918 }
919
920
921
922 // Get the Commands
923
924 for (int a=0;a<aCommandTree->GetCommandEntry();a++) {
925
926 Wt::WStringList stringList;
927// #if WT_VERSION < 0x040000
928// newItem = new WListViewItem(aParent);
929// newItem->setText(0,WString((char*)(aCommandTree->GetCommand(a+1)->GetCommandPath()).data()).simplifyWhiteSpace());
930// newItem->setOpen(false);
931
932// #else
933 newItem = new Wt::WTreeNode(aParent);
934 newItem->setText(0,WString((char*)(aCommandTree->GetCommand(a+1)->GetCommandPath()).data()).trimmed());
935// #if WT_VERSION < 0x040202
936// fHelpTreeWidget->setItemExpanded(newItem,false);
937// #else
938 newItem->setExpanded(false);
939// #endif
940// #endif
941
942 }
943}
944
945
946/** Find a treeItemWidget in the help tree
947 @param aCommand item's String to look for
948 @return item if found, NULL if not
949*/
950// #if WT_VERSION < 0x040000
951// WListViewItem* G4UIWt::FindTreeItem(
952// WListViewItem *aParent
953// #else
954Wt::WTreeNode* G4UIWt::FindTreeItem(
955 Wt::WTreeNode *aParent
956// #endif
957,const Wt::WString& aCommand
958)
959{
960 if (aParent == NULL) return NULL;
961
962 if (aParent->text(0) == aCommand)
963 return aParent;
964
965// #if WT_VERSION < 0x040000
966// WListViewItem * tmp = NULL;
967// WListViewItem* tmpItem = aParent->firstChild();
968// while (tmpItem != 0) {
969// if (!tmp)
970// tmp = FindTreeItem(tmpItem,aCommand);
971// tmpItem = tmpItem->nextSibling();
972// }
973
974// #else
975 Wt::WTreeNode * tmp = NULL;
976 for (int a=0;a<aParent->childCount();a++) {
977 if (!tmp)
978 tmp = FindTreeItem(aParent->child(a),aCommand);
979 }
980// #endif
981 return tmp;
982}
983
984
985/** Build the command list parameters in a WString<br>
986 Reimplement partialy the G4UIparameter.cc
987 @param aCommand : command to list parameters
988 @see G4UIparameter::List()
989 @see G4UIcommand::List()
990 @return the command list parameters, or "" if nothing
991*/
992Wt::WString G4UIWt::GetCommandList (
993 const G4UIcommand *aCommand
994)
995{
996
997 Wt::WString txt ="";
998 if (aCommand == NULL)
999 return txt;
1000
1001 G4String commandPath = aCommand->GetCommandPath();
1002 G4String rangeString = aCommand->GetRange();
1003 G4int n_guidanceEntry = aCommand->GetGuidanceEntries();
1004 G4int n_parameterEntry = aCommand->GetParameterEntries();
1005
1006 if ((commandPath == "") &&
1007 (rangeString == "") &&
1008 (n_guidanceEntry == 0) &&
1009 (n_parameterEntry == 0)) {
1010 return txt;
1011 }
1012
1013 if((commandPath.length()-1)!='/') {
1014 txt += "Command " + Wt::WString((char*)(commandPath).data()) + "\n";
1015 }
1016 txt += "Guidance :\n";
1017
1018 for( G4int i_thGuidance=0; i_thGuidance < n_guidanceEntry; i_thGuidance++ ) {
1019 txt += Wt::WString((char*)(aCommand->GetGuidanceLine(i_thGuidance)).data()) + "\n";
1020 }
1021 if( ! rangeString.isNull() ) {
1022 txt += " Range of parameters : " + Wt::WString((char*)(rangeString).data()) + "\n";
1023 }
1024 if( n_parameterEntry > 0 ) {
1025 G4UIparameter *param;
1026
1027 // Re-implementation of G4UIparameter.cc
1028
1029 for( G4int i_thParameter=0; i_thParameter<n_parameterEntry; i_thParameter++ ) {
1030 param = aCommand->GetParameter(i_thParameter);
1031 txt += "\nParameter : " + Wt::WString((char*)(param->GetParameterName()).data()) + "\n";
1032 if( ! param->GetParameterGuidance().isNull() )
1033 txt += Wt::WString((char*)(param->GetParameterGuidance()).data())+ "\n" ;
1034 txt += " Parameter type : " + Wt::WString(WChar(param->GetParameterType())) + "\n";
1035 if(param->IsOmittable()){
1036 txt += " Omittable : True\n";
1037 } else {
1038 txt += " Omittable : False\n";
1039 }
1040 if( param->GetCurrentAsDefault() ) {
1041 txt += " Default value : taken from the current value\n";
1042 } else if( ! param->GetDefaultValue().isNull() ) {
1043 txt += " Default value : " + Wt::WString((char*)(param->GetDefaultValue()).data())+ "\n";
1044 }
1045 if( ! param->GetParameterRange().isNull() ) {
1046 txt += " Parameter range : " + Wt::WString((char*)(param->GetParameterRange()).data())+ "\n";
1047 }
1048 if( ! param->GetParameterCandidates().isNull() ) {
1049 txt += " Candidates : " + Wt::WString((char*)(param->GetParameterCandidates()).data())+ "\n";
1050 }
1051 }
1052 }
1053 return txt;
1054}
1055
1056
1057
1058/** Implement G4VBasicShell vurtual function
1059 */
1060G4bool G4UIWt::GetHelpChoice(
1061 G4int& aInt
1062)
1063{
1064#ifdef G4DEBUG_INTERFACES_BASIC
1065 printf("G4UIWt::GetHelpChoice SHOULD NEVER GO HERE");
1066#endif
1067 return true;
1068}
1069
1070
1071/** Implement G4VBasicShell vurtual function
1072*/
1073void G4UIWt::ExitHelp(
1074)
1075{
1076#ifdef G4DEBUG_INTERFACES_BASIC
1077 printf("G4UIWt::ExitHelp SHOULD NEVER GO HERE");
1078#endif
1079}
1080
1081
1082/** Event filter method. Every event from WtApplication goes here.<br/>
1083 We apply a filter only for the Up and Down Arrow press when the WLineEdit<br/>
1084 is active. If this filter match, Up arrow we give the previous command<br/>
1085 and Down arrow will give the next if exist.<br/>
1086 @param obj Emitter of the event
1087 @param event Kind of event
1088*/
1089bool G4UIWt::eventFilter( // Should stay with a minuscule eventFilter because of Wt
1090 WObject *aObj
1091,Wt::WEvent *aEvent
1092)
1093{
1094 if (aObj == NULL) return false;
1095 if (aEvent == NULL) return false;
1096
1097 if (aObj == fCommandHistoryArea) {
1098 if (aEvent->type() == Wt::WEvent::KeyPress) {
1099 fCommandArea->setFocus();
1100 }
1101 }
1102 if (aObj == fCommandArea) {
1103 if (aEvent->type() == Wt::WEvent::KeyPress) {
1104 Wt::WKeyEvent *e = static_cast<Wt::WKeyEvent*>(aEvent);
1105 if ((e->key() == (Wt::Key_Down)) ||
1106 (e->key() == (Wt::Key_PageDown)) ||
1107 (e->key() == (Wt::Key_Up)) ||
1108 (e->key() == (Wt::Key_PageUp))) {
1109// #if WT_VERSION < 0x040000
1110// // count rows...
1111// WListViewItem* tmpItem = fCommandHistoryArea->firstChild();
1112// int selection = -1;
1113// int index = 0;
1114// while (tmpItem != 0) {
1115// if (tmpItem == fCommandHistoryArea->selectedItem()) {
1116// selection = index;
1117// }
1118// index ++;
1119// tmpItem = tmpItem->nextSibling();
1120// }
1121// if (fCommandHistoryArea->childCount()) {
1122// if (selection == -1) {
1123// selection = fCommandHistoryArea->childCount()-1;
1124// } else {
1125// if (e->key() == (Wt::Key_Down)) {
1126// if (selection <(fCommandHistoryArea->childCount()-1))
1127// selection++;
1128// } else if (e->key() == (Wt::Key_PageDown)) {
1129// selection = fCommandHistoryArea->childCount()-1;
1130// #else
1131 int selection = fCommandHistoryArea->currentRow();
1132 if (fCommandHistoryArea->count()) {
1133 if (selection == -1) {
1134 selection = fCommandHistoryArea->count()-1;
1135 } else {
1136 if (e->key() == (Wt::Key_Down)) {
1137 if (selection <(fCommandHistoryArea->count()-1))
1138 selection++;
1139 } else if (e->key() == (Wt::Key_PageDown)) {
1140 selection = fCommandHistoryArea->count()-1;
1141// #endif
1142 } else if (e->key() == (Wt::Key_Up)) {
1143 if (selection >0)
1144 selection --;
1145 } else if (e->key() == (Wt::Key_PageUp)) {
1146 selection = 0;
1147 }
1148 }
1149 fCommandHistoryArea->clearSelection();
1150// #if WT_VERSION < 0x040000
1151// WListViewItem* tmpItem = fCommandHistoryArea->firstChild();
1152// int index = 0;
1153// while (tmpItem != 0) {
1154// if (index == selection) {
1155// tmpItem->setSelected(true);
1156// fCommandHistoryArea->setCurrentItem(tmpItem);
1157// }
1158// index ++;
1159// tmpItem = tmpItem->nextSibling();
1160// }
1161// #else
1162// #if WT_VERSION < 0x040202
1163 fCommandHistoryArea->setItemSelected(fCommandHistoryArea->item(selection),true);
1164// #else
1165// fCommandHistoryArea->item(selection)->setSelected(true);
1166// #endif
1167// fCommandHistoryArea->setCurrentItem(fCommandHistoryArea->item(selection));
1168// #endif
1169 }
1170 } else if (e->key() == (Wt::Key_Tab)) {
1171// #if WT_VERSION < 0x040000
1172// G4String ss = Complete(fCommandArea->text().ascii());
1173// #else
1174 G4String ss = Complete(fCommandArea->text().toStdString().c_str());
1175// #endif
1176 fCommandArea->setText((char*)(ss.data()));
1177
1178 // do not pass by parent, it will disable widget tab focus !
1179 return true;
1180 }
1181 }
1182 }
1183 // pass the event on to the parent class
1184 return Wt::WObject::eventFilter(aObj, aEvent);
1185}
1186
1187
1188
1189
1190/***************************************************************************/
1191//
1192// SLOTS DEFINITIONS
1193//
1194/***************************************************************************/
1195
1196/** Called when user give "help" command.
1197*/
1198void G4UIWt::ShowHelpCallback (
1199)
1200{
1201 TerminalHelp("");
1202}
1203
1204
1205/** Called when user click on clear button. Clear the text Output area
1206*/
1207void G4UIWt::ClearButtonCallback (
1208)
1209{
1210 fTextArea->clear();
1211}
1212
1213/** Called when user exit session
1214*/
1215void G4UIWt::ExitSession (
1216)
1217{
1218 SessionTerminate();
1219}
1220
1221
1222/** Callback call when "click on a menu entry.<br>
1223 Send the associated command to geant4
1224*/
1225void G4UIWt::CommandEnteredCallback (
1226)
1227{
1228// #if WT_VERSION < 0x040000
1229// G4String command (fCommandArea->text().ascii());
1230// if (fCommandArea->text().simplifyWhiteSpace() != "") {
1231
1232// WListViewItem *newItem = new WListViewItem(fCommandHistoryArea);
1233// newItem->setText(0,fCommandArea->text());
1234// fCommandHistoryArea->insertItem(newItem);
1235// // now we have to arrange
1236// WListViewItem *temp= fCommandHistoryArea->lastItem();
1237// for (int i=0; i<fCommandHistoryArea->childCount()-1;i++) {
1238// fCommandHistoryArea->takeItem(temp);
1239// fCommandHistoryArea->insertItem(temp);
1240// temp= fCommandHistoryArea->lastItem();
1241// }
1242// #else
1243 G4String command (fCommandArea->text().toStdString().c_str());
1244 if (fCommandArea->text().trimmed() != "") {
1245 fCommandHistoryArea->addItem(fCommandArea->text());
1246// #endif
1247 fCommandHistoryArea->clearSelection();
1248 fCommandHistoryArea->setCurrentItem(NULL);
1249 fCommandArea->setText("");
1250
1251 G4Wt* interactorManager = G4Wt::getInstance ();
1252 if (interactorManager) {
1253 interactorManager->FlushAndWaitExecution();
1254 }
1255 if (command(0,4) != "help") {
1256 ApplyShellCommand (command,exitSession,exitPause);
1257 } else {
1258 TerminalHelp(command);
1259 }
1260 if(exitSession==true)
1261 SessionTerminate();
1262 }
1263}
1264
1265
1266/** Callback call when "enter" clicked on the command zone.<br>
1267 Send the command to geant4
1268 @param aCommand
1269*/
1270void G4UIWt::ButtonCallback (
1271 const WString& aCommand
1272)
1273{
1274// #if WT_VERSION < 0x040000
1275// G4String ss = G4String(aCommand.ascii());
1276// #else
1277 G4String ss = G4String(aCommand.toStdString().c_str());
1278// #endif
1279 ApplyShellCommand(ss,exitSession,exitPause);
1280 if(exitSession==true)
1281 SessionTerminate();
1282}
1283
1284
1285
1286/** This callback is activated when user selected a item in the help tree
1287*/
1288void G4UIWt::HelpTreeClicCallback (
1289)
1290{
1291// #if WT_VERSION < 0x040000
1292// WListViewItem* item = NULL;
1293// #else
1294 WTreeNode* item = NULL;
1295// #endif
1296 if (!fHelpTreeWidget)
1297 return ;
1298
1299 if (!fHelpArea)
1300 return;
1301
1302// #if WT_VERSION < 0x040000
1303// item =fHelpTreeWidget->selectedItem();
1304// #else
1305 Wt::WList<WTreeNode *> list =fHelpTreeWidget->selectedItems();
1306 if (list.isEmpty())
1307 return;
1308 item = list.first();
1309// #endif
1310 if (!item)
1311 return;
1312
1313 G4UImanager* UI = G4UImanager::GetUIpointer();
1314 if(UI==NULL) return;
1315 G4UIcommandTree * treeTop = UI->GetTree();
1316
1317
1318
1319 std::string itemText;
1320// #if WT_VERSION < 0x040000
1321// itemText = std::string(item->text(0).ascii());
1322// #else
1323 itemText = std::string(item->text(0).toStdString());
1324// #endif
1325
1326 G4UIcommand* command = treeTop->FindPath(itemText.c_str());
1327
1328 if (command) {
1329// #if WT_VERSION >= 0x040000
1330// #if WT_VERSION < 0x040200
1331// fHelpArea->clear();
1332// fHelpArea->append(GetCommandList(command));
1333// #else
1334 fHelpArea->setText(GetCommandList(command));
1335// #endif
1336// #else
1337// fHelpArea->setText(GetCommandList(command));
1338// #endif
1339 } else { // this is a command
1340 G4UIcommandTree* path = treeTop->FindCommandTree(itemText.c_str());
1341 if ( path) {
1342 // this is not a command, this is a sub directory
1343 // We display the Title
1344// #if WT_VERSION >= 0x040000
1345// #if WT_VERSION < 0x040200
1346// fHelpArea->clear();
1347// fHelpArea->append(path->GetTitle().data());
1348// #else
1349 fHelpArea->setText(path->GetTitle().data());
1350// #endif
1351// #else
1352// fHelpArea->setText(path->GetTitle().data());
1353// #endif
1354 }
1355 }
1356}
1357
1358/** This callback is activated when user double clic on a item in the help tree
1359*/
1360void G4UIWt::HelpTreeDoubleClicCallback (
1361)
1362{
1363 HelpTreeClicCallback();
1364
1365// #if WT_VERSION < 0x040000
1366// WListViewItem* item = NULL;
1367// #else
1368 Wt::WTreeNode* item = NULL;
1369// #endif
1370 if (!fHelpTreeWidget)
1371 return ;
1372
1373 if (!fHelpArea)
1374 return;
1375
1376// #if WT_VERSION < 0x040000
1377// item =fHelpTreeWidget->selectedItem();
1378// #else
1379 Wt::WList<Wt::WTreeNode *> list =fHelpTreeWidget->selectedItems();
1380 if (list.isEmpty())
1381 return;
1382 item = list.first();
1383// #endif
1384 if (!item)
1385 return;
1386
1387 fCommandArea->clear();
1388 fCommandArea->setText(item->text(0));
1389}
1390
1391
1392/** Callback called when user select an old command in the command history<br>
1393 Give it to the command area.
1394*/
1395void G4UIWt::CommandHistoryCallback(
1396)
1397{
1398// #if WT_VERSION < 0x040000
1399// WListViewItem* item = NULL;
1400// #else
1401// #endif
1402 if (!fCommandHistoryArea)
1403 return ;
1404
1405
1406// #if WT_VERSION < 0x040000
1407// item =fCommandHistoryArea->selectedItem();
1408// #else
1409// #endif
1410// #if WT_VERSION < 0x040000
1411// fCommandArea->setText(item->text(0));
1412// #else
1413 fCommandArea->setText(fCommandHistoryArea->curentText());
1414// #endif
1415
1416}
1417
1418
1419/** Callback called when user give a new string to look for<br>
1420 Display a list of matching commands descriptions. If no string is set,
1421 will display the complete help tree
1422*/
1423void G4UIWt::lookForHelpStringCallback(
1424)
1425{
1426// #if WT_VERSION < 0x040200
1427// fHelpArea->clear();
1428// #else
1429 fHelpArea->setText("");
1430// #endif
1431 if (fHelpLine->text() =="") {
1432 // clear old help tree
1433 fHelpTreeWidget->clearSelection();
1434// #if WT_VERSION < 0x040000
1435// fHelpTreeWidget->removeColumn(1);
1436// fHelpTreeWidget->removeColumn(0);
1437// #endif
1438 CreateHelpTree();
1439 return;
1440 }
1441
1442 // the help tree
1443 G4UImanager* UI = G4UImanager::GetUIpointer();
1444 if(UI==NULL) return;
1445 G4UIcommandTree * treeTop = UI->GetTree();
1446
1447 G4int treeSize = treeTop->GetTreeEntry();
1448
1449 // clear old help tree
1450 fHelpTreeWidget->clearSelection();
1451// #if WT_VERSION < 0x040000
1452// fHelpTreeWidget->removeColumn(1);
1453// fHelpTreeWidget->removeColumn(0);
1454// #endif
1455
1456 // look for new items
1457
1458 int tmp = 0;
1459// #if WT_VERSION < 0x040000
1460// int multFactor = 1000; // factor special for having double keys in Wt3
1461// int doubleKeyAdd = 0; // decay for doubleKeys in Wt3
1462// #endif
1463
1464 Wt::WMap<int,Wt::WString> commandResultyMap;
1465 Wt::WMap<int,Wt::WString> commandChildResultMap;
1466
1467 for (int a=0;a<treeSize;a++) {
1468 G4UIcommand* command = treeTop->FindPath(treeTop->GetTree(a+1)->GetPathName().data());
1469// #if WT_VERSION > 0x040000
1470 tmp = GetCommandList (command).count(fHelpLine->text(),Wt::CaseInsensitive);
1471// #else
1472// tmp = GetCommandList (command).contains(fHelpLine->text(),false);
1473// #endif
1474 if (tmp >0) {
1475// #if WT_VERSION > 0x040000
1476 commandResultMap.insertMulti(tmp,Wt::WString((char*)(treeTop->GetTree(a+1)->GetPathName()).data()));
1477// #else // tricky thing for Wt3...
1478// doubleKeyAdd = 0;
1479// while (commandResultMap.find( tmp*multFactor+doubleKeyAdd) != commandResultMap.end()) {
1480// doubleKeyAdd ++;
1481// }
1482// commandResultMap.insert( tmp*multFactor+doubleKeyAdd,WString((char*)(treeTop->GetTree(a+1)->GetPathName()).data()) );
1483// #endif
1484 }
1485 // look for childs
1486 commandChildResultMap = LookForHelpStringInChildTree(treeTop->GetTree(a+1),fHelpLine->text());
1487 // insert new childs
1488 if (!commandChildResultMap.empty()) {
1489// #if WT_VERSION > 0x040000
1490 Wt::WMap<int,WString>::const_iterator i = commandChildResultMap.constBegin();
1491 while (i != commandChildResultMap.constEnd()) {
1492 commandResultMap.insertMulti(i.key(),i.value());
1493// #else // tricky thing for Wt3...
1494// WMap<int,WString>::const_iterator i = commandChildResultMap.begin();
1495// while (i != commandChildResultMap.end()) {
1496// doubleKeyAdd = 0;
1497// while (commandResultMap.find( i.key()*multFactor+doubleKeyAdd) != commandResultMap.end()) {
1498// doubleKeyAdd ++;
1499// }
1500// commandResultMap.insert(i.key()*multFactor+doubleKeyAdd,i.data());
1501// #endif
1502 i++;
1503 }
1504 commandChildResultMap.clear();
1505 }
1506 }
1507
1508 // build new help tree
1509// #if WT_VERSION < 0x040000
1510// fHelpTreeWidget->setSelectionMode(WListView::Single);
1511// fHelpTreeWidget->setRootIsDecorated(true);
1512// fHelpTreeWidget->addColumn("Command");
1513// fHelpTreeWidget->addColumn("Match");
1514// // fHelpTreeWidget->header()->setResizeEnabled(FALSE,1);
1515// #else
1516 fHelpTreeWidget->setSelectionMode(Wt::WAbstractItemView::SingleSelection);
1517 fHelpTreeWidget->setColumnCount(2);
1518 Wt::WStringList labels;
1519 labels << Wt::WString("Command") << Wt::WString("Match");
1520 fHelpTreeWidget->setHeaderLabels(labels);
1521// #endif
1522
1523 if (commandResultMap.empty()) {
1524// #if WT_VERSION < 0x040200
1525// fHelpArea->clear();
1526// fHelpArea->append("No match found");
1527// #else
1528 fHelpArea->setText("No match found");
1529// #endif
1530 return;
1531 }
1532
1533// #if WT_VERSION > 0x040000
1534// WMap<int,WString>::const_iterator i = commandResultMap.constEnd();
1535// #else
1536 Wt::WMap<int,Wt::WString>::const_iterator i = commandResultMap.end();
1537// #endif
1538 i--;
1539 // 10 maximum progress values
1540 float multValue = 10.0/(float)(i.key());
1541 Wt::WString progressChar = "|";
1542 Wt::WString progressStr = "|";
1543
1544// #if WT_VERSION < 0x040000
1545// WListViewItem * newItem;
1546// #else
1547 Wt::WTreeNode * newItem;
1548// #endif
1549 bool end = false;
1550 while (!end) {
1551// #if WT_VERSION > 0x040000
1552 if (i == commandResultMap.constBegin()) {
1553// #else
1554// if (i == commandResultMap.begin()) {
1555// #endif
1556 end = true;
1557 }
1558 for(int a=0;a<int(i.key()*multValue);a++) {
1559 progressStr += progressChar;
1560 }
1561// #if WT_VERSION < 0x040000
1562// newItem = new WListViewItem(fHelpTreeWidget);
1563// newItem->setText(0,i.data().simplifyWhiteSpace());
1564// #else
1565 newItem = new Wt::WTreeNode(fHelpTreeWidget);
1566 newItem->setText(0,i.value().trimmed());
1567// #endif
1568 newItem->setText(1,progressStr);
1569
1570// #if WT_VERSION >= 0x040200
1571 newItem->setForeground ( 1, Wt::WBrush(Wt::blue) );
1572// #endif
1573 progressStr = "|";
1574 i--;
1575 }
1576 // FIXME : to be checked on Wt3
1577// #if WT_VERSION < 0x040000
1578// fHelpTreeWidget->setColumnWidthMode (1,WListView::Maximum);
1579// fHelpTreeWidget->setSorting(1,false);
1580// #else
1581 fHelpTreeWidget->resizeColumnToContents (0);
1582 fHelpTreeWidget->sortItems(1,Wt::DescendingOrder);
1583 // fHelpTreeWidget->setColumnWidth(1,10);//resizeColumnToContents (1);
1584// #endif
1585}
1586
1587
1588
1589
1590Wt::WMap<int,Wt::WString> G4UIWt::LookForHelpStringInChildTree(
1591 G4UIcommandTree *aCommandTree
1592,const Wt::WString & text
1593 )
1594{
1595 Wt::WMap<int,Wt::WString> commandResultMap;
1596 if (aCommandTree == NULL) return commandResultMap;
1597
1598// #if WT_VERSION < 0x040000
1599// int multFactor = 1000; // factor special for having double keys in Wt3
1600// int doubleKeyAdd = 0; // decay for doubleKeys in Wt3
1601// #endif
1602
1603 // Get the Sub directories
1604 int tmp = 0;
1605 Wt::WMap<int,Wt::WString> commandChildResultMap;
1606
1607 for (int a=0;a<aCommandTree->GetTreeEntry();a++) {
1608 const G4UIcommand* command = aCommandTree->GetGuidance();
1609// #if WT_VERSION > 0x040000
1610 tmp = GetCommandList (command).count(text,Wt::CaseInsensitive);
1611// #else
1612// tmp = GetCommandList (command).contains(text,false);
1613// #endif
1614 if (tmp >0) {
1615// #if WT_VERSION > 0x040000
1616 commandResultMap.insertMulti(tmp,Wt::WString((char*)(aCommandTree->GetTree(a+1)->GetPathName()).data()));
1617// #else // tricky thing for Wt3...
1618// doubleKeyAdd = 0;
1619// while (commandResultMap.find( tmp*multFactor+doubleKeyAdd) != commandResultMap.end()) {
1620// doubleKeyAdd ++;
1621// }
1622// commandResultMap.insert(tmp*multFactor+doubleKeyAdd,WString((char*)(aCommandTree->GetTree(a+1)->GetPathName()).data()));
1623// #endif
1624 }
1625 // look for childs
1626 commandChildResultMap = LookForHelpStringInChildTree(aCommandTree->GetTree(a+1),text);
1627
1628 if (!commandChildResultMap.empty()) {
1629 // insert new childs
1630// #if WT_VERSION > 0x040000
1631 Wt::WMap<int,Wt::WString>::const_iterator i = commandChildResultMap.constBegin();
1632 while (i != commandChildResultMap.constEnd()) {
1633 commandResultMap.insertMulti(i.key(),i.value());
1634// #else // tricky thing for Wt3...
1635// WMap<int,WString>::const_iterator i = commandChildResultMap.begin();
1636// while (i != commandChildResultMap.end()) {
1637// doubleKeyAdd = 0;
1638// while (commandResultMap.find( i.key()*multFactor+doubleKeyAdd) != commandResultMap.end()) {
1639// doubleKeyAdd ++;
1640// }
1641// commandResultMap.insert(i.key()*multFactor+doubleKeyAdd,i.data());
1642// #endif
1643 i++;
1644 }
1645 commandChildResultMap.clear();
1646 }
1647 }
1648 // Get the Commands
1649
1650 for (int a=0;a<aCommandTree->GetCommandEntry();a++) {
1651 const G4UIcommand* command = aCommandTree->GetCommand(a+1);
1652// #if WT_VERSION > 0x040000
1653 tmp = GetCommandList (command).count(text,Wt::CaseInsensitive);
1654// #else
1655// tmp = GetCommandList (command).contains(text,false);
1656// #endif
1657 if (tmp >0) {
1658// #if WT_VERSION > 0x040000
1659 commandResultMap.insertMulti(tmp,Wt::WString((char*)(aCommandTree->GetCommand(a+1)->GetCommandPath()).data()));
1660// #else // tricky thing for Wt3...
1661// doubleKeyAdd = 0;
1662// while (commandResultMap.find( tmp*multFactor+doubleKeyAdd) != commandResultMap.end()) {
1663// doubleKeyAdd ++;
1664// }
1665// commandResultMap.insert(tmp*multFactor+doubleKeyAdd,WString((char*)(aCommandTree->GetCommand(a+1)->GetCommandPath()).data()));
1666// #endif
1667#ifdef G4DEBUG_INTERFACES_BASIC
1668#endif
1669 }
1670
1671 }
1672 return commandResultMap;
1673}
1674#endif
Note: See TracBrowser for help on using the repository browser.