source: trunk/geant4/interfaces/basic/src/G4UIQt.cc @ 610

Last change on this file since 610 was 610, checked in by garnier, 17 years ago

r661@mac-90108: laurentgarnier | 2007-11-22 18:10:43 +0100
en debug

  • Property svn:mime-type set to text/cpp
File size: 35.4 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: G4UIQt.cc,v 1.12 2007/11/15 18:24:27 lgarnier Exp $
28// GEANT4 tag $Name:  $
29//
30// L. Garnier
31
32#define GEANT4_QT_DEBUG
33
34#ifdef G4UI_BUILD_QT_SESSION
35
36#include "G4Types.hh"
37
38#include <string.h>
39
40#include "G4UIQt.hh"
41#include "G4UImanager.hh"
42#include "G4StateManager.hh"
43#include "G4UIcommandTree.hh"
44#include "G4UIcommandStatus.hh"
45
46#include "G4Qt.hh"
47
48#include <qapplication.h>
49#include <qlineedit.h>
50#include <qwidget.h>
51#include <qmenubar.h>
52#include <qlayout.h>
53#include <qpushbutton.h>
54#include <qlabel.h>
55#include <qsplitter.h>
56#include <qscrollbar.h>
57#include <qdialog.h>
58#include <qevent.h>
59#include <qtextedit.h>
60#include <qsignalmapper.h>
61
62#include <qmainwindow.h>
63#if QT_VERSION >= 0x040000
64#include <qmenu.h>
65#include <qlistwidget.h>
66#include <qtreewidget.h>
67#else
68#include <qaction.h>
69#include <qheader.h>
70#include <qlistview.h>
71#include <qpopupmenu.h>
72#endif
73
74
75
76#include <stdlib.h>
77
78// Pourquoi Static et non  variables de classe ?
79static G4bool exitSession = true;
80static G4bool exitPause = true;
81
82/**   Build a Qt window with a menubar, output area and promt area<br>
83<pre>
84   +-----------------------+
85   |exit menu|             |
86   |                       |
87   | +-------------------+ |
88   | |                   | |
89   | |  Output area      | |
90   | |                   | |
91   | +-------------------+ |
92   |      | clear |        |
93   | +-------------------+ |
94   | |  promt history    | |
95   | +-------------------+ |
96   | +-------------------+ |
97   | |> promt area       | |
98   | +-------------------+ |
99   +-----------------------+
100</pre>
101*/
102G4UIQt::G4UIQt (
103 int argc
104,char** argv
105)
106  :fHelpDialog(NULL)
107{
108#ifdef GEANT4_QT_DEBUG
109  printf("G4UIQt::Initialise %d %s\n",argc,argv[0]);
110#endif
111  G4Qt* interactorManager = G4Qt::getInstance (argc,argv,(char*)"Qt");
112  G4UImanager* UI = G4UImanager::GetUIpointer();
113  if(UI!=NULL) UI->SetSession(this);
114
115  fMainWindow = new QMainWindow();
116
117#ifdef GEANT4_QT_DEBUG
118  printf("G4UIQt::Initialise after main window creation\n");
119#endif
120#if QT_VERSION < 0x040000
121  fMainWindow->setCaption( tr( "G4UI Session" ));
122  fMainWindow->resize(800,600);
123  fMainWindow->move(50,100);
124#else
125  fMainWindow->setWindowTitle( tr("G4UI Session") );
126  fMainWindow->resize(800,600);
127  fMainWindow->move(QPoint(50,100));
128#endif
129
130  // Set layouts
131
132#if QT_VERSION < 0x040000
133  QSplitter *splitter = new QSplitter(Qt::Vertical);
134
135  QWidget* topWidget = new QWidget(splitter);
136  QWidget* bottomWidget = new QWidget(splitter);
137
138  QVBoxLayout *layoutTop = new QVBoxLayout(topWidget);
139  QVBoxLayout *layoutBottom = new QVBoxLayout(bottomWidget);
140#else
141  QWidget* topWidget = new QWidget();
142  QWidget* bottomWidget = new QWidget();
143
144  QVBoxLayout *layoutTop = new QVBoxLayout;
145  QVBoxLayout *layoutBottom = new QVBoxLayout;
146#endif
147
148  // fill them
149
150  fTextArea = new QTextEdit(topWidget);
151#ifdef GEANT4_QT_DEBUG
152  printf("G4UIQt:: end\n");
153#endif
154#ifdef GEANT4_QT_DEBUG
155  printf("G4UIQt::PushButton 1\n");
156#endif
157  QPushButton *clearButton = new QPushButton("clear",topWidget);
158#ifdef GEANT4_QT_DEBUG
159  printf("G4UIQt::end1\n");
160#endif
161  connect(clearButton, SIGNAL(clicked()), SLOT(ClearButtonCallback()));
162
163#if QT_VERSION < 0x040000
164  fCommandHistoryArea = new QListView(bottomWidget);
165  fCommandHistoryArea->setSelectionMode(QListView::Single);
166  connect(fCommandHistoryArea, SIGNAL(selectionChanged()), SLOT(CommandHistoryCallback()));
167#else
168  fCommandHistoryArea = new QListWidget();
169  fCommandHistoryArea->setSelectionMode(QAbstractItemView::SingleSelection);
170  connect(fCommandHistoryArea, SIGNAL(itemSelectionChanged()), SLOT(CommandHistoryCallback()));
171#endif
172  fCommandHistoryArea->installEventFilter(this);
173  fCommandLabel = new QLabel("",bottomWidget);
174
175  fCommandArea = new QLineEdit(bottomWidget);
176  fCommandArea->installEventFilter(this);
177#ifdef GEANT4_QT_DEBUG
178  printf("G4UIQt::   1\n");
179#endif
180#if QT_VERSION < 0x040000
181  fCommandArea->setActiveWindow();
182#else
183  fCommandArea->activateWindow();
184#endif
185  connect(fCommandArea, SIGNAL(returnPressed()), SLOT(CommandEnteredCallback()));
186#if QT_VERSION < 0x040000
187  fCommandArea->setFocusPolicy ( QWidget::StrongFocus );
188  fCommandArea->setFocus();
189#else
190  fCommandArea->setFocusPolicy ( Qt::StrongFocus );
191  fCommandArea->setFocus(Qt::TabFocusReason);
192#endif
193  fTextArea->setReadOnly(true);
194
195
196#ifdef GEANT4_QT_DEBUG
197  printf("G4UIQt::   2\n");
198#endif
199
200#ifdef GEANT4_QT_DEBUG
201  printf("G4UIQt::   3\n");
202#endif
203
204
205  layoutTop->addWidget(fTextArea);
206  layoutTop->addWidget(clearButton);
207
208#if QT_VERSION >= 0x040000
209  topWidget->setLayout(layoutTop);
210#endif
211
212#ifdef GEANT4_QT_DEBUG
213  printf("G4UIQt::   4\n");
214#endif
215  layoutBottom->addWidget(fCommandHistoryArea);
216  layoutBottom->addWidget(fCommandLabel);
217  layoutBottom->addWidget(fCommandArea);
218#if QT_VERSION >= 0x040000
219
220  bottomWidget->setLayout(layoutBottom);
221  splitter->addWidget(topWidget);
222  splitter->addWidget(bottomWidget);
223#endif
224
225
226#ifdef GEANT4_QT_DEBUG
227  printf("G4UIQt::   5\n");
228#endif
229  fMainWindow->setCentralWidget(splitter);
230
231#if QT_VERSION < 0x040000
232
233  // Add a quit subMenu
234  QPopupMenu *fileMenu = new QPopupMenu( fMainWindow);
235  fileMenu->insertItem( "&Quitter",  this, SLOT(ExitSession()), CTRL+Key_Q );
236  fMainWindow->menuBar()->insertItem( QString("&File"), fileMenu );
237
238  // Add a Help menu
239  QPopupMenu *helpMenu = new QPopupMenu( fMainWindow );
240  helpMenu->insertItem( "&Show Help",  this, SLOT(ShowHelpCallback()), CTRL+Key_H );
241  fMainWindow->menuBar()->insertItem( QString("&Help"), helpMenu );
242
243#ifdef GEANT4_QT_DEBUG
244  printf("G4UIQt::   6\n");
245#endif
246
247#else
248
249  // Add a quit subMenu
250  QMenu *fileMenu = fMainWindow->menuBar()->addMenu("File");
251  fileMenu->addAction("Quitter", this, SLOT(ExitSession()));
252
253  // Add a Help menu
254  QMenu *helpMenu = fMainWindow->menuBar()->addMenu("Help");
255  helpMenu->addAction("Show Help", this, SLOT(ShowHelpCallback()));
256#endif
257#ifdef GEANT4_QT_DEBUG
258  printf("G4UIQt::   7\n");
259#endif
260
261  // Set the splitter size. The fTextArea sould be 2/3 on the fMainWindow
262#if QT_VERSION < 0x040000
263  QValueList<int> vals = splitter->sizes();
264#else
265  QList<int> vals = splitter->sizes();
266#endif
267  if(vals.size()==2) {
268    vals[0] = (splitter->orientation()==Qt::Vertical ? splitter->height() : splitter->width())*3/4;
269    vals[1] = (splitter->orientation()==Qt::Vertical ? splitter->height() : splitter->width())*1/4;
270    splitter->setSizes(vals);
271  }
272#ifdef GEANT4_QT_DEBUG
273  printf("G4UIQt::   8\n");
274#endif
275
276  if(UI!=NULL) UI->SetCoutDestination(this);  // TO KEEP
277}
278
279
280
281G4UIQt::~G4UIQt(
282)
283{
284  G4UImanager* UI = G4UImanager::GetUIpointer();  // TO KEEP
285  if(UI!=NULL) {  // TO KEEP
286    UI->SetSession(NULL);  // TO KEEP
287    UI->SetCoutDestination(NULL);  // TO KEEP
288  }
289 
290  if (fMainWindow!=NULL)
291    delete fMainWindow;
292}
293
294
295
296/**   Start the Qt main loop
297*/
298G4UIsession* G4UIQt::SessionStart (
299)
300{
301
302  G4Qt* interactorManager = G4Qt::getInstance ();
303
304#if QT_VERSION >= 0x040000
305#if QT_VERSION >= 0x040200
306  fMainWindow->setVisible(true);
307#else
308  fMainWindow->show();
309#endif
310#else
311  fMainWindow->show();
312#endif
313  Prompt("session");
314  exitSession = false;
315
316
317#ifdef GEANT4_QT_DEBUG
318  printf("disable secondary loop\n");
319#endif
320  interactorManager->DisableSecondaryLoop (); // TO KEEP
321  if ((QApplication*)interactorManager->GetMainInteractor())
322    ((QApplication*)interactorManager->GetMainInteractor())->exec();
323
324  // on ne passe pas le dessous ? FIXME ????
325  // je ne pense pas 13/06
326
327  //   void* event; // TO KEEP
328  //   while((event = interactorManager->GetEvent())!=NULL) {  // TO KEEP
329  //     interactorManager->DispatchEvent(event); // TO KEEP
330  //     if(exitSession==true) break; // TO KEEP
331  //   } // TO KEEP
332
333  interactorManager->EnableSecondaryLoop ();
334#ifdef GEANT4_QT_DEBUG
335  printf("enable secondary loop\n");
336#endif
337  return this;
338}
339
340
341/**   Display the prompt in the prompt area
342   @param aPrompt : string to display as the promt label
343   //FIXME : probablement inutile puisque le seul a afficher qq chose d'autre
344   que "session" est SecondaryLoop()
345*/
346void G4UIQt::Prompt (
347 G4String aPrompt
348)
349{
350  if (!aPrompt) return;
351
352  fCommandLabel->setText((char*)aPrompt.data());
353}
354
355
356void G4UIQt::SessionTerminate (
357)
358{
359  G4Qt* interactorManager = G4Qt::getInstance ();
360  fMainWindow->close();
361  ((QApplication*)interactorManager->GetMainInteractor())->exit();
362}
363
364
365
366/**
367   Called by intercoms/src/G4UImanager.cc<br>
368   Called by visualization/management/src/G4VisCommands.cc with "EndOfEvent" argument<br>
369   It have to pause the session command terminal.<br>
370   Call SecondaryLoop to wait for exit event<br>
371   @param aState
372   @see : G4VisCommandReviewKeptEvents::SetNewValue
373*/
374void G4UIQt::PauseSessionStart (
375 G4String aState
376)
377{
378  if (!aState) return;
379
380#ifdef GEANT4_QT_DEBUG
381  printf("G4UIQt::PauseSessionStart\n");
382#endif
383  if(aState=="G4_pause> ") {  // TO KEEP
384    SecondaryLoop ("Pause, type continue to exit this state"); // TO KEEP
385  } // TO KEEP
386
387  if(aState=="EndOfEvent") { // TO KEEP
388    // Picking with feed back in event data Done here !!!
389    SecondaryLoop ("End of event, type continue to exit this state"); // TO KEEP
390  } // TO KEEP
391}
392
393
394
395/**
396   Begin the secondary loop
397   @param a_prompt : label to display as the prompt label
398 */
399void G4UIQt::SecondaryLoop (
400 G4String aPrompt
401)
402{
403  if (!aPrompt) return;
404
405#ifdef GEANT4_QT_DEBUG
406  printf("G4UIQt::SecondaryLoop\n");
407#endif
408  G4Qt* interactorManager = G4Qt::getInstance (); // TO KEEP ?
409  Prompt(aPrompt); // TO KEEP
410  exitPause = false; // TO KEEP
411  void* event; // TO KEEP
412  while((event = interactorManager->GetEvent())!=NULL) {  // TO KEEP
413    interactorManager->DispatchEvent(event); // TO KEEP
414    if(exitPause==true) break; // TO KEEP
415  } // TO KEEP
416  Prompt("session"); // TO KEEP
417}
418
419
420
421/**
422   Receive a cout from Geant4. We have to display it in the cout zone
423   @param aString : label to add in the display area
424   @return 0
425*/
426G4int G4UIQt::ReceiveG4cout (
427 G4String aString
428)
429{
430  if (!aString) return 0;
431  G4Qt* interactorManager = G4Qt::getInstance ();
432  if (!interactorManager) return 0;
433 
434#if QT_VERSION < 0x040000
435  fTextArea->append(QString((char*)aString.data()).simplifyWhiteSpace());
436  fTextArea->verticalScrollBar()->setValue(fTextArea->verticalScrollBar()->maxValue());
437#else
438  fTextArea->append(QString((char*)aString.data()).trimmed());
439  fTextArea->verticalScrollBar()->setSliderPosition(fTextArea->verticalScrollBar()->maximum());
440#endif
441  interactorManager->FlushAndWaitExecution();
442  return 0;
443}
444
445
446/**
447   Receive a cerr from Geant4. We have to display it in the cout zone
448   @param aString : label to add in the display area
449   @return 0
450*/
451G4int G4UIQt::ReceiveG4cerr (
452 G4String aString
453)
454{
455  if (!aString) return 0;
456  G4Qt* interactorManager = G4Qt::getInstance ();
457  if (!interactorManager) return 0;
458
459#if QT_VERSION < 0x040000
460  QColor previousColor = fTextArea->color();
461  fTextArea->setColor(Qt::red);
462  fTextArea->append(QString((char*)aString.data()).simplifyWhiteSpace());
463  fTextArea->setColor(previousColor);
464  fTextArea->verticalScrollBar()->setValue(fTextArea->verticalScrollBar()->maxValue());
465#else
466  QColor previousColor = fTextArea->textColor();
467  fTextArea->setTextColor(Qt::red);
468  fTextArea->append(QString((char*)aString.data()).trimmed());
469  fTextArea->setTextColor(previousColor);
470  fTextArea->verticalScrollBar()->setSliderPosition(fTextArea->verticalScrollBar()->maximum());
471#endif
472  interactorManager->FlushAndWaitExecution();
473  return 0;
474}
475
476
477
478/**
479   Add a new menu to the menu bar
480   @param aName name of menu
481   @param aLabel label to display
482 */
483void G4UIQt::AddMenu (
484 const char* aName
485,const char* aLabel
486)
487{
488  if (aName == NULL) return;
489  if (aLabel == NULL) return;
490
491#if QT_VERSION < 0x040000
492  QPopupMenu *fileMenu = new QPopupMenu( fMainWindow);
493  fMainWindow->menuBar()->insertItem( aLabel, fileMenu );
494#else
495  QMenu *fileMenu = new QMenu(aLabel);
496  fMainWindow->menuBar()->insertMenu(fMainWindow->menuBar()->actions().last(),fileMenu);
497#endif
498
499  AddInteractor (aName,(G4Interactor)fileMenu);
500}
501
502
503/**
504   Add a new button to a menu
505   @param aMenu : parent menu
506   @param aLabel : label to display
507   @param aCommand : command to execute as a callback
508 */
509void G4UIQt::AddButton (
510 const char* aMenu
511,const char* aLabel
512,const char* aCommand
513)
514{
515  if(aMenu==NULL) return; // TO KEEP
516  if(aLabel==NULL) return; // TO KEEP
517  if(aCommand==NULL) return; // TO KEEP
518
519#if QT_VERSION < 0x040000
520  QPopupMenu *parent = (QPopupMenu*)GetInteractor(aMenu);
521#else
522  QMenu *parent = (QMenu*)GetInteractor(aMenu);
523#endif
524
525  if(parent==NULL) return;
526 
527  QSignalMapper *signalMapper = new QSignalMapper(this);
528#if QT_VERSION < 0x040000
529  QAction *action = new QAction(QString(aLabel),QKeySequence::QKeySequence (),signalMapper, SLOT(map()));
530  action->addTo(parent);
531#else
532  QAction *action = parent->addAction(aLabel, signalMapper, SLOT(map()));
533#endif
534  signalMapper->setMapping(action, QString(aCommand));
535  connect(signalMapper, SIGNAL(mapped(const QString &)),this, SLOT(ButtonCallback(const QString&)));
536}
537
538
539
540
541/**
542   Open the help dialog in a separate window.<br>
543   This will be display as a tree widget.<br>
544   Implementation of <b>void G4VBasicShell::TerminalHelp(G4String newCommand)</b>
545
546   @param newCommand : open the tree widget item on this command if is set
547*/
548void G4UIQt::TerminalHelp(
549 G4String newCommand
550)
551{
552  // Create the help dialog
553  if (!fHelpDialog) {
554#if QT_VERSION < 0x040000
555    fHelpDialog = new QDialog(fMainWindow,0,FALSE,Qt::WStyle_Title | Qt::WStyle_SysMenu | Qt::WStyle_MinMax );
556#else
557    fHelpDialog = new QDialog(fMainWindow,Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint);
558#endif
559    QSplitter *splitter = new QSplitter(Qt::Horizontal);
560    QPushButton *exitButton = new QPushButton("Exit",fMainWindow);
561    connect(exitButton, SIGNAL(clicked()), fHelpDialog,SLOT(close()));
562
563    // the help tree
564    G4UImanager* UI = G4UImanager::GetUIpointer();
565    if(UI==NULL) return;
566    G4UIcommandTree * treeTop = UI->GetTree();
567
568    // build widget
569#if QT_VERSION < 0x040000
570    fHelpTreeWidget = new QListView(splitter);
571    fHelpTreeWidget->setSelectionMode(QListView::Single);
572    fHelpTreeWidget->addColumn("Command");
573    fHelpTreeWidget->addColumn("Description");
574    fHelpTreeWidget->hideColumn(1);
575    fHelpTreeWidget->header()->setResizeEnabled(FALSE,1);
576    //    QList<QListViewItem *> items;
577#else
578    fHelpTreeWidget = new QTreeWidget();
579    fHelpTreeWidget->setSelectionMode(QAbstractItemView::SingleSelection);
580    fHelpTreeWidget->setColumnCount(2);
581    fHelpTreeWidget->setColumnHidden(1,true);
582    QStringList labels;
583    labels << QString("Command") << QString("Description");
584    fHelpTreeWidget->setHeaderLabels(labels);
585    //    QList<QTreeWidgetItem *> items;
586#endif
587
588#if QT_VERSION < 0x040000
589#ifdef GEANT4_QT_DEBUG
590  printf("G4UIQt::QTextEdit 1\n");
591#endif
592    fHelpArea = new QTextEdit(splitter);
593#ifdef GEANT4_QT_DEBUG
594  printf("G4UIQt::end 1\n");
595#endif
596#else
597#ifdef GEANT4_QT_DEBUG
598  printf("G4UIQt::QTextEdit 2\n");
599#endif
600    fHelpArea = new QTextEdit();
601#ifdef GEANT4_QT_DEBUG
602  printf("G4UIQt::end 2\n");
603#endif
604#endif
605    fHelpArea->setReadOnly(true);
606
607    G4int treeSize = treeTop->GetTreeEntry();
608#if QT_VERSION < 0x040000
609    QListViewItem * newItem;
610#else
611    QTreeWidgetItem * newItem;
612#endif
613    for (int a=0;a<treeSize;a++) {
614      // Creating new item
615
616#if QT_VERSION < 0x040000
617      newItem = new QListViewItem(fHelpTreeWidget);
618      newItem->setText(0,QString((char*)(treeTop->GetTree(a+1)->GetPathName()).data()).simplifyWhiteSpace());
619      newItem->setText(1,QString((char*)(treeTop->GetTree(a+1)->GetTitle()).data()).simplifyWhiteSpace());
620#else
621                                                                                                   //FIXME : Qt 4.2
622                                                                                                   //      QStringList stringList;
623                                                                                                   //      stringList << QString((char*)(treeTop->GetTree(a+1)->GetPathName()).data()).trimmed()  ;
624                                                                                                   //      stringList << QString((char*)(treeTop->GetTree(a+1)->GetTitle()).data()).trimmed()  ;
625                                                                                                   //      newItem = new QTreeWidgetItem(stringList);
626                                                                                                   // FIXME : Qt 4.0
627      newItem = new QTreeWidgetItem(fHelpTreeWidget);
628      newItem->setText(0,QString((char*)(treeTop->GetTree(a+1)->GetPathName()).data()).trimmed());
629      newItem->setText(1,QString((char*)(treeTop->GetTree(a+1)->GetTitle()).data()).trimmed());
630#endif
631
632
633      // look for childs
634      CreateChildTree(newItem,treeTop->GetTree(a+1));
635      //      items.append(newItem);
636    }
637
638    connect(fHelpTreeWidget, SIGNAL(itemSelectionChanged ()),this, SLOT(HelpTreeClicCallback())); 
639    connect(fHelpTreeWidget, SIGNAL(itemDoubleClicked (QTreeWidgetItem*,int)),this, SLOT(HelpTreeDoubleClicCallback(QTreeWidgetItem*,int))); 
640
641    // Set layouts
642
643#if QT_VERSION < 0x040000
644    QVBoxLayout *vLayout = new QVBoxLayout(fHelpDialog);
645#else
646    QVBoxLayout *vLayout = new QVBoxLayout;
647    splitter->addWidget(fHelpTreeWidget);
648    splitter->addWidget(fHelpArea);
649#endif
650
651
652    vLayout->addWidget(splitter);
653    vLayout->addWidget(exitButton);
654#if QT_VERSION >= 0x040000
655    fHelpDialog->setLayout(vLayout);
656#endif
657
658  }
659
660  // Look for the choosen command "newCommand"
661  size_t i = newCommand.index(" ");
662  G4String targetCom="";
663  if( i != std::string::npos )
664    {
665      G4String newValue = newCommand(i+1,newCommand.length()-(i+1));
666      newValue.strip(G4String::both);
667      targetCom = ModifyToFullPathCommand( newValue );
668    }
669  if (targetCom != "") {
670#if QT_VERSION < 0x040000
671    QListViewItem* findItem = NULL;
672    QListViewItem* tmpItem = fHelpTreeWidget->firstChild();
673    while (tmpItem != 0) {
674      if (!findItem) {
675        findItem = FindTreeItem(tmpItem,QString((char*)targetCom.data()));
676      }
677      tmpItem = tmpItem->nextSibling();
678    }
679#else
680    QTreeWidgetItem* findItem = NULL;
681    for (int a=0;a<fHelpTreeWidget->topLevelItemCount();a++) {
682      if (!findItem) {
683        findItem = FindTreeItem(fHelpTreeWidget->topLevelItem(a),QString((char*)targetCom.data()));
684      }
685    }
686#endif
687   
688    if (findItem) {     
689     
690      //collapsed open item
691#if QT_VERSION < 0x040000
692
693      // FIXME : Has to be checked
694      QListViewItem* tmpItem = fHelpTreeWidget->firstChild();
695      QList<QListViewItem> openItems;
696      while ((tmpItem != 0) || (!openItems.isEmpty())) {
697        if (tmpItem->isOpen() ) {
698          tmpItem->setOpen(false);
699          openItems.append(tmpItem);
700          tmpItem = tmpItem->firstChild();
701        } else {
702          tmpItem = tmpItem->nextSibling();
703        }
704        if (tmpItem == 0) {
705          tmpItem = openItems.take(openItems.count()-1);
706        }
707      }
708#else
709      QList<QTreeWidgetItem *> selected;
710
711      selected = fHelpTreeWidget->selectedItems();
712      if ( selected.count() != 0 ) {
713        QTreeWidgetItem * tmp =selected.at( 0 );
714        while ( tmp) {
715#if QT_VERSION < 0x040202
716              fHelpTreeWidget->setItemExpanded(tmp,false);
717#else
718          tmp->setExpanded(false);
719#endif
720          tmp = tmp->parent();
721        }
722      }
723#endif
724     
725      // clear old selection
726      fHelpTreeWidget->clearSelection();
727
728      // set new selection
729#if QT_VERSION >= 0x040000
730#if QT_VERSION < 0x040202
731      fHelpTreeWidget->setItemSelected(findItem,true);
732#else
733      findItem->setSelected(true);
734#endif     
735#else
736      findItem->setSelected(true);
737#endif
738     
739      // expand parent item
740      while ( findItem) {
741#if QT_VERSION < 0x040000
742        findItem->setOpen(true);
743#else
744#if QT_VERSION < 0x040202
745            fHelpTreeWidget->setItemExpanded(findItem,true);
746#else
747        findItem->setExpanded(true);
748#endif
749#endif
750        findItem = findItem->parent();
751      }
752
753      // Call the update of the right textArea
754      HelpTreeClicCallback();
755    }
756  }
757#if QT_VERSION < 0x040000
758  fHelpDialog->setCaption( tr( "Help on commands" ));
759#else
760  fHelpDialog->setWindowTitle(tr("Help on commands"));
761#endif
762  fHelpDialog->resize(800,600);
763  fHelpDialog->move(QPoint(400,150));
764  fHelpDialog->show();
765  fHelpDialog->raise();
766#if QT_VERSION < 0x040000
767  fHelpDialog->setActiveWindow();
768#else
769  fHelpDialog->activateWindow();
770#endif
771}
772
773
774
775/**   Fill the Help Tree Widget
776   @param aParent : parent item to fill
777   @param aCommandTree : commandTree node associate with this part of the Tree
778*/
779#if QT_VERSION < 0x040000
780void G4UIQt::CreateChildTree(
781 QListViewItem *aParent
782,G4UIcommandTree *aCommandTree
783#else
784void G4UIQt::CreateChildTree(
785 QTreeWidgetItem *aParent
786,G4UIcommandTree *aCommandTree
787#endif
788)
789{
790  if (aParent == NULL) return;
791  if (aCommandTree == NULL) return;
792
793
794  // Creating new item
795#if QT_VERSION < 0x040000
796  QListViewItem * newItem;
797#else
798  QTreeWidgetItem * newItem;
799#endif
800
801  // Get the Sub directories
802  for (int a=0;a<aCommandTree->GetTreeEntry();a++) {
803
804#if QT_VERSION < 0x040000
805      newItem = new QListViewItem(aParent);
806      newItem->setText(0,QString((char*)(aCommandTree->GetTree(a+1)->GetPathName()).data()).simplifyWhiteSpace());
807      newItem->setText(1,QString((char*)(aCommandTree->GetTree(a+1)->GetTitle()).data()).simplifyWhiteSpace());
808
809#else
810    newItem = new QTreeWidgetItem(aParent);
811    newItem->setText(0,QString((char*)(aCommandTree->GetTree(a+1)->GetPathName()).data()).trimmed());
812    newItem->setText(1,QString((char*)(aCommandTree->GetTree(a+1)->GetTitle()).data()).trimmed());
813#endif
814
815    CreateChildTree(newItem,aCommandTree->GetTree(a+1));
816  }
817
818
819
820  // Get the Commands
821
822  for (int a=0;a<aCommandTree->GetCommandEntry();a++) {
823   
824    QStringList stringList;
825#if QT_VERSION < 0x040000
826    newItem = new QListViewItem(aParent);
827    newItem->setText(0,QString((char*)(aCommandTree->GetCommand(a+1)->GetCommandPath()).data()).simplifyWhiteSpace());
828    newItem->setText(1,QString((char*)(aCommandTree->GetCommand(a+1)->GetCommandPath()).data()).simplifyWhiteSpace());
829    newItem->setOpen(false);
830
831#else
832    newItem = new QTreeWidgetItem(aParent);
833    newItem->setText(0,QString((char*)(aCommandTree->GetCommand(a+1)->GetCommandPath()).data()).trimmed());
834    newItem->setText(1,QString((char*)(aCommandTree->GetCommand(a+1)->GetCommandPath()).data()).trimmed());
835#if QT_VERSION < 0x040202
836        fHelpTreeWidget->setItemExpanded(newItem,false);
837#else
838    newItem->setExpanded(false);
839#endif
840#endif
841     
842  }
843}
844
845
846/** Find a treeItemWidget in the help tree
847    @param aCommand item's String to look for
848    @return item if found, NULL if not
849*/
850#if QT_VERSION < 0x040000
851QListViewItem* G4UIQt::FindTreeItem(
852 QListViewItem *aParent
853#else
854QTreeWidgetItem* G4UIQt::FindTreeItem(
855 QTreeWidgetItem *aParent
856#endif
857,const QString& aCommand
858)
859{
860  if (aParent == NULL) return NULL;
861
862  if (aParent->text(0) == aCommand)
863    return aParent;
864 
865#if QT_VERSION < 0x040000
866  QListViewItem * tmp = NULL;
867  QListViewItem* tmpItem = aParent->firstChild();
868    while (tmpItem != 0) {
869      if (!tmp)
870        tmp = FindTreeItem(tmpItem,aCommand);
871      tmpItem = tmpItem->nextSibling();
872    }
873
874#else
875  QTreeWidgetItem * tmp = NULL;
876  for (int a=0;a<aParent->childCount();a++) {
877    if (!tmp)
878      tmp = FindTreeItem(aParent->child(a),aCommand);
879  }
880#endif
881  return tmp;
882}
883
884
885/**   Build the command list parameters in a QString<br>
886   Reimplement partialy the G4UIparameter.cc
887   @param aCommand : command to list parameters
888   @see G4UIparameter::List()
889   @see G4UIcommand::List()
890   @return the command list parameters, or "" if nothing
891*/
892QString G4UIQt::GetCommandList (
893 const G4UIcommand *aCommand
894)
895{
896
897  QString txt ="";
898  if (aCommand == NULL)
899    return txt;
900
901  G4String commandPath = aCommand->GetCommandPath();
902  G4String rangeString = aCommand->GetRange();
903  G4int n_guidanceEntry = aCommand->GetGuidanceEntries();
904  G4int n_parameterEntry = aCommand->GetParameterEntries();
905 
906  if ((commandPath == "") &&
907      (rangeString == "") &&
908      (n_guidanceEntry == 0) &&
909      (n_parameterEntry == 0)) {
910    return txt;
911  }
912
913  if((commandPath.length()-1)!='/') {
914    txt += "Command " + QString((char*)(commandPath).data()) + "\n";
915  }
916  txt += "Guidance :\n";
917 
918  for( G4int i_thGuidance=0; i_thGuidance < n_guidanceEntry; i_thGuidance++ ) {
919    txt += QString((char*)(aCommand->GetGuidanceLine(i_thGuidance)).data()) + "\n";
920  }
921  if( ! rangeString.isNull() ) {
922    txt += " Range of parameters : " + QString((char*)(rangeString).data()) + "\n";
923  }
924  if( n_parameterEntry > 0 ) {
925    G4UIparameter *param;
926   
927    // Re-implementation of G4UIparameter.cc
928   
929    for( G4int i_thParameter=0; i_thParameter<n_parameterEntry; i_thParameter++ ) {
930      param = aCommand->GetParameter(i_thParameter);
931      txt += "\nParameter : " + QString((char*)(param->GetParameterName()).data()) + "\n";
932      if( ! param->GetParameterGuidance().isNull() )
933        txt += QString((char*)(param->GetParameterGuidance()).data())+ "\n" ;
934      txt += " Parameter type  : " + QString(QChar(param->GetParameterType())) + "\n";
935      if(param->IsOmittable()){
936        txt += " Omittable       : True\n";
937      } else {
938        txt += " Omittable       : False\n";
939      }
940      if( param->GetCurrentAsDefault() ) {
941        txt += " Default value   : taken from the current value\n";
942      } else if( ! param->GetDefaultValue().isNull() ) {
943        txt += " Default value   : " + QString((char*)(param->GetDefaultValue()).data())+ "\n";
944      }
945      if( ! param->GetParameterRange().isNull() ) {
946        txt += " Parameter range : " + QString((char*)(param->GetParameterRange()).data())+ "\n";
947      }
948      if( ! param->GetParameterCandidates().isNull() ) {
949        txt += " Candidates      : " + QString((char*)(param->GetParameterCandidates()).data())+ "\n";
950      }
951    }
952  }
953  return txt;
954}
955
956
957
958/**  Implement G4VBasicShell vurtual function
959 */
960G4bool G4UIQt::GetHelpChoice(
961 G4int& aInt
962)
963{
964#ifdef GEANT4_QT_DEBUG
965  printf("G4UIQt::GetHelpChoice SHOULD NEVER GO HERE");
966#endif
967  return true;
968}
969
970
971/**   Implement G4VBasicShell vurtual function
972*/
973void G4UIQt::ExitHelp(
974)
975{
976#ifdef GEANT4_QT_DEBUG
977  printf("G4UIQt::ExitHelp SHOULD NEVER GO HERE");
978#endif
979}
980
981
982/**   Event filter method. Every event from QtApplication goes here.<br/>
983   We apply a filter only for the Up and Down Arrow press when the QLineEdit<br/>
984   is active. If this filter match, Up arrow we give the previous command<br/>
985   and Down arrow will give the next if exist.<br/>
986   @param obj Emitter of the event
987   @param event Kind of event
988*/
989bool G4UIQt::eventFilter( // Should stay with a minuscule eventFilter because of Qt
990 QObject *aObj
991,QEvent *aEvent
992)
993{
994  if (aObj == NULL) return false;
995  if (aEvent == NULL) return false;
996
997  if (aObj == fCommandHistoryArea) {
998    if (aEvent->type() == QEvent::KeyPress) {
999      fCommandArea->setFocus();
1000    }
1001  }
1002  if (aObj == fCommandArea) {
1003    if (aEvent->type() == QEvent::KeyPress) {
1004      QKeyEvent *e = static_cast<QKeyEvent*>(aEvent);
1005      if ((e->key() == (Qt::Key_Down)) ||
1006          (e->key() == (Qt::Key_PageDown)) ||
1007          (e->key() == (Qt::Key_Up)) ||
1008          (e->key() == (Qt::Key_PageUp))) {
1009#if QT_VERSION < 0x040000
1010        // count rows...
1011        QListViewItem* tmpItem = fCommandHistoryArea->firstChild();
1012        int selection = -1;
1013        int index = 0;
1014        while (tmpItem != 0) {
1015          if (tmpItem == fCommandHistoryArea->selectedItem()) {
1016            selection = index;
1017          }
1018          index ++;
1019          tmpItem = tmpItem->nextSibling();
1020        }
1021        if (fCommandHistoryArea->childCount()) {
1022          if (selection == -1) {
1023            selection = fCommandHistoryArea->childCount()-1;
1024          } else {
1025            if (e->key() == (Qt::Key_Down)) {
1026              if (selection <(fCommandHistoryArea->childCount()-1))
1027                selection++;
1028            } else if (e->key() == (Qt::Key_PageDown)) {
1029              selection = fCommandHistoryArea->childCount()-1;
1030#else
1031        int selection = fCommandHistoryArea->currentRow();
1032        if (fCommandHistoryArea->count()) {
1033          if (selection == -1) {
1034            selection = fCommandHistoryArea->count()-1;
1035          } else {
1036            if (e->key() == (Qt::Key_Down)) {
1037              if (selection <(fCommandHistoryArea->count()-1))
1038                selection++;
1039            } else if (e->key() == (Qt::Key_PageDown)) {
1040              selection = fCommandHistoryArea->count()-1;
1041#endif
1042            } else if (e->key() == (Qt::Key_Up)) {
1043              if (selection >0)
1044                selection --;
1045            } else if (e->key() == (Qt::Key_PageUp)) {
1046              selection = 0;
1047            }
1048          }
1049          fCommandHistoryArea->clearSelection();
1050#if QT_VERSION < 0x040000
1051          QListViewItem* tmpItem = fCommandHistoryArea->firstChild();
1052          int index = 0;
1053          while (tmpItem != 0) {
1054            if (index == selection) {
1055              tmpItem->setSelected(true);
1056              fCommandHistoryArea->setCurrentItem(tmpItem);
1057          }
1058          index ++;
1059          tmpItem = tmpItem->nextSibling();
1060        }
1061#else
1062#if QT_VERSION < 0x040202
1063          fCommandHistoryArea->setItemSelected(fCommandHistoryArea->item(selection),true);
1064#else
1065          fCommandHistoryArea->item(selection)->setSelected(true);
1066#endif     
1067          fCommandHistoryArea->setCurrentItem(fCommandHistoryArea->item(selection));
1068#endif
1069        }
1070      } else if (e->key() == (Qt::Key_Tab)) {
1071#if QT_VERSION < 0x040000
1072        G4String ss = Complete(fCommandArea->text().ascii());
1073#else
1074        G4String ss = Complete(fCommandArea->text().toStdString().c_str());
1075#endif
1076        fCommandArea->setText((char*)(ss.data()));
1077
1078        // do not pass by parent, it will disable widget tab focus !
1079        return true;
1080      }
1081    }
1082  }
1083  // pass the event on to the parent class
1084  return QObject::eventFilter(aObj, aEvent);
1085}
1086
1087
1088
1089
1090/***************************************************************************/
1091//
1092//             SLOTS DEFINITIONS
1093//
1094/***************************************************************************/
1095
1096/**   Called when user give "help" command.
1097*/
1098void G4UIQt::ShowHelpCallback (
1099)
1100{
1101  TerminalHelp("");
1102}
1103
1104
1105/**   Called when user click on clear button. Clear the text Output area
1106*/
1107void G4UIQt::ClearButtonCallback (
1108)
1109{
1110  fTextArea->clear();
1111}
1112
1113/**   Called when user exit session
1114*/
1115void G4UIQt::ExitSession (
1116)
1117{
1118  SessionTerminate();
1119}
1120
1121
1122/**   Callback call when "click on a menu entry.<br>
1123   Send the associated command to geant4
1124*/
1125void G4UIQt::CommandEnteredCallback (
1126)
1127{
1128#if QT_VERSION < 0x040000
1129  G4String command (fCommandArea->text().ascii());
1130  if (fCommandArea->text().simplifyWhiteSpace() != "") {
1131
1132    QListViewItem *newItem = new QListViewItem(fCommandHistoryArea);
1133    newItem->setText(0,fCommandArea->text());
1134#else
1135  G4String command (fCommandArea->text().toStdString().c_str());
1136  if (fCommandArea->text().trimmed() != "") {
1137    fCommandHistoryArea->addItem(fCommandArea->text());
1138#endif
1139    fCommandHistoryArea->clearSelection();
1140    fCommandHistoryArea->setCurrentItem(NULL);
1141    fCommandArea->setText("");
1142
1143    G4Qt* interactorManager = G4Qt::getInstance ();
1144    if (interactorManager) {
1145      interactorManager->FlushAndWaitExecution();
1146    }
1147    if (command(0,4) != "help") {
1148      ApplyShellCommand (command,exitSession,exitPause);
1149    } else {
1150      TerminalHelp(command);
1151    }
1152#ifdef GEANT4_QT_DEBUG
1153    printf("after \n");
1154#endif
1155    if(exitSession==true)
1156      SessionTerminate();
1157  }
1158}
1159
1160
1161/**   Callback call when "enter" clicked on the command zone.<br>
1162   Send the command to geant4
1163   @param aCommand
1164*/
1165void G4UIQt::ButtonCallback (
1166 const QString& aCommand
1167)
1168{
1169#if QT_VERSION < 0x040000
1170  G4String ss = G4String(aCommand.ascii());
1171#else
1172  G4String ss = G4String(aCommand.toStdString().c_str());
1173#endif
1174  ApplyShellCommand(ss,exitSession,exitPause);
1175  if(exitSession==true)
1176    SessionTerminate();
1177}
1178
1179
1180
1181/**   This callback is activated when user selected a item in the help tree
1182*/
1183void G4UIQt::HelpTreeClicCallback (
1184)
1185{
1186  //  printf("G4UIQt::HelpTreeClicCallback");
1187#if QT_VERSION < 0x040000
1188  QListViewItem* item =  NULL;
1189#else
1190  QTreeWidgetItem* item =  NULL;
1191#endif
1192  if (!fHelpTreeWidget)
1193    return ;
1194
1195  if (!fHelpArea)
1196    return;
1197 
1198#if QT_VERSION < 0x040000
1199  item =fHelpTreeWidget->selectedItem();
1200#else
1201  QList<QTreeWidgetItem *> list =fHelpTreeWidget->selectedItems();
1202  if (list.isEmpty())
1203    return;
1204  item = list.first();
1205#endif
1206  if (!item)
1207    return;
1208 
1209  G4UImanager* UI = G4UImanager::GetUIpointer();
1210  if(UI==NULL) return;
1211  G4UIcommandTree * treeTop = UI->GetTree();
1212#if QT_VERSION < 0x040000
1213  G4UIcommand* command = treeTop->FindPath(item->text (1).ascii());
1214#else
1215  G4UIcommand* command = treeTop->FindPath(item->text (1).toStdString().c_str());
1216#endif
1217  if (command) {
1218#if QT_VERSION >= 0x040000
1219#if QT_VERSION < 0x040200
1220    fHelpArea->clear();
1221    fHelpArea->append(GetCommandList(command));
1222#else
1223    fHelpArea->setText(GetCommandList(command));
1224#endif
1225#else
1226    fHelpArea->setText(GetCommandList(command));
1227#endif
1228  } else {
1229    // this is not a command, this is a sub directory
1230    // We display the Title
1231#if QT_VERSION >= 0x040000
1232#if QT_VERSION < 0x040200
1233    fHelpArea->clear();
1234    fHelpArea->append(item->text (1));
1235#else
1236    fHelpArea->setText(item->text (1));
1237#endif
1238#else
1239    fHelpArea->setText(item->text (1));
1240#endif
1241  }
1242}
1243
1244/**   This callback is activated when user double clic on a item in the help tree
1245*/
1246void G4UIQt::HelpTreeDoubleClicCallback (
1247#if QT_VERSION < 0x040000
1248QListViewItem* item
1249#else
1250QTreeWidgetItem* item
1251#endif
1252 ,int nb
1253)
1254{
1255#ifdef GEANT4_QT_DEBUG
1256  printf("G4UIQt::HelpTreeDoubleClicCallback");
1257#endif
1258  HelpTreeClicCallback();
1259  fCommandArea->setText(item->text (1));
1260}
1261
1262
1263/**   Callback called when user select an old command in the command history<br>
1264   Give it to the command area.
1265*/
1266void G4UIQt::CommandHistoryCallback(
1267)
1268{
1269#if QT_VERSION < 0x040000
1270  QListViewItem* item =  NULL;
1271#else
1272  QListWidgetItem* item =  NULL;
1273#endif
1274  if (!fCommandHistoryArea)
1275    return ;
1276
1277 
1278#if QT_VERSION < 0x040000
1279  item =fHelpTreeWidget->selectedItem();
1280#else
1281  QList<QListWidgetItem *> list =fCommandHistoryArea->selectedItems();
1282  if (list.isEmpty())
1283    return;
1284  item = list.first();
1285#endif
1286  if (!item)
1287    return;
1288#if QT_VERSION < 0x040000
1289  fCommandArea->setText(item->text(0));
1290#else
1291  fCommandArea->setText(item->text());
1292#endif
1293
1294}
1295
1296#endif
Note: See TracBrowser for help on using the repository browser.