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

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

r573@mac-90108: laurentgarnier | 2007-06-05 16:12:24 +0200
remise a jour

  • Property svn:mime-type set to text/cpp
File size: 19.3 KB
Line 
1// TODO !
2
3//
4// ********************************************************************
5// * License and Disclaimer                                           *
6// *                                                                  *
7// * The  Geant4 software  is  copyright of the Copyright Holders  of *
8// * the Geant4 Collaboration.  It is provided  under  the terms  and *
9// * conditions of the Geant4 Software License,  included in the file *
10// * LICENSE and available at  http://cern.ch/geant4/license .  These *
11// * include a list of copyright holders.                             *
12// *                                                                  *
13// * Neither the authors of this software system, nor their employing *
14// * institutes,nor the agencies providing financial support for this *
15// * work  make  any representation or  warranty, express or implied, *
16// * regarding  this  software system or assume any liability for its *
17// * use.  Please see the license in the file  LICENSE  and URL above *
18// * for the full disclaimer and the limitation of liability.         *
19// *                                                                  *
20// * This  code  implementation is the result of  the  scientific and *
21// * technical work of the GEANT4 collaboration.                      *
22// * By using,  copying,  modifying or  distributing the software (or *
23// * any work based  on the software)  you  agree  to acknowledge its *
24// * use  in  resulting  scientific  publications,  and indicate your *
25// * acceptance of all terms of the Geant4 Software license.          *
26// ********************************************************************
27//
28//
29// $Id: G4UIQt.cc,v 1.14 2007/05/29 11:09:49 $
30// GEANT4 tag $Name: geant4-08-01 $
31//
32// L. Garnier
33
34//#define DEBUG
35
36#ifdef G4UI_BUILD_QT_SESSION
37
38#include "G4Types.hh"
39
40#include <string.h>
41
42#include "G4UIQt.hh"
43#include "G4UImanager.hh"
44#include "G4StateManager.hh"
45#include "G4UIcommandTree.hh"
46#include "G4UIcommandStatus.hh"
47
48#include "G4Qt.hh"
49
50#include <QtGui/qapplication.h>
51#include <QtGui/qwidget.h>
52
53#include <stdlib.h>
54
55static G4bool ConvertStringToInt(const char*,int&);
56//static void ExecuteChangeSizeFunction(Widget);
57
58static G4bool exitSession = true;
59static G4bool exitPause = true;
60static G4bool exitHelp = true;
61/***************************************************************************/
62/**
63 Build a Qt window with a menubar, output area and promt area
64      +-----------------------+
65      |exit menu|             |
66      |                       |
67      | +-------------------+ |
68      | |                   | |
69      | |  Output area      | |
70      | |                   | |
71      | +-------------------+ |
72      |                       |
73      | +-------------------+ |
74      | |> promt area       | |
75      | +-------------------+ |
76      +-----------------------+
77*/
78
79G4UIQt::G4UIQt (
80 int argc,
81 char** argv
82)
83/***************************************************************************/
84/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
85{
86  G4UImanager* UI = G4UImanager::GetUIpointer(); // TO KEEP
87  if(UI!=NULL) UI->SetSession(this); // TO KEEP
88
89  G4Qt* interactorManager = G4Qt::getInstance (argc,argv,(char*)"Qt");  // TO KEEP ?
90
91  mainWindow = new QMainWindow();
92
93
94//  QMainWindow top = (QMainWindow)interactorManager->GetMainInteractor();
95
96//   if(getenv("XENVIRONMENT")==NULL) {
97//     XrmDatabase database = XrmGetDatabase(XtDisplay(top));
98//     if(database!=NULL) {
99//       XrmPutLineResource(&database,"*topShadowColor:white");
100//       XrmPutLineResource(&database,"*bottomShadowColor:black");
101//       XrmPutLineResource(&database,"*foreground:black");
102//       XrmPutLineResource(&database,"*background:lightgrey");
103//       XrmPutLineResource(&database,"*borderColor:lightgrey");
104//       XrmPutLineResource(&database,"*fontList:-*-helvetica-bold-r-*-*-*-120-*-*-*-*-iso8859-1");
105//       XrmPutLineResource(&database,"*text.background:white");
106//       XrmPutLineResource(&database,"*text.fontList:*courier*-r-*--14-*");
107//       XrmPutLineResource(&database,"*text.maxLength:8000");
108//     }
109//   }
110
111//   Arg args[9];
112//   XtSetArg(args[0],XmNkeyboardFocusPolicy,XmPOINTER); // For completion.
113//   shell = XtAppCreateShell ("G4UIXm","G4UIXm",
114//                          topLevelShellWidgetClass,XtDisplay(top),
115//                          args,1);
116//   form = XmCreateForm (shell,(char*)"form",NULL,0);
117//   XtManageChild (form);
118
119//   XtSetArg(args[0],XmNtopAttachment   ,XmATTACH_FORM);
120//   XtSetArg(args[1],XmNleftAttachment  ,XmATTACH_FORM);
121//   XtSetArg(args[2],XmNrightAttachment ,XmATTACH_FORM);
122//   menuBar = XmCreateMenuBar (form,(char*)"menuBar",args,3);
123
124//   XtSetArg(args[0],XmNtopAttachment      ,XmATTACH_NONE);
125//   XtSetArg(args[1],XmNleftAttachment     ,XmATTACH_FORM);
126//   XtSetArg(args[2],XmNrightAttachment    ,XmATTACH_FORM);
127//   XtSetArg(args[3],XmNbottomAttachment   ,XmATTACH_FORM);
128//   command = XmCreateCommand (form,(char*)"command",args,4);
129//   XtManageChild (command);
130
131//   XtSetArg(args[0],XmNtopAttachment   ,XmATTACH_NONE);
132//   XtSetArg(args[1],XmNleftAttachment  ,XmATTACH_FORM);
133//   XtSetArg(args[2],XmNrightAttachment ,XmATTACH_FORM);
134//   XtSetArg(args[3],XmNbottomAttachment,XmATTACH_WIDGET);
135//   XtSetArg(args[4],XmNbottomWidget    ,command);
136//   XmString cps = XmStringLtoRCreate((char*)"Clear",XmSTRING_DEFAULT_CHARSET);
137//   XtSetArg (args[5],XmNlabelString,cps);
138//   Widget clearButton = XmCreatePushButton(form,(char*)"clearButton",args,6);
139//   XmStringFree (cps);
140//   XtManageChild (clearButton);
141
142//   XtSetArg(args[0],XmNtopAttachment   ,XmATTACH_WIDGET);
143//   XtSetArg(args[1],XmNtopWidget       ,menuBar);
144//   XtSetArg(args[2],XmNleftAttachment  ,XmATTACH_FORM);
145//   XtSetArg(args[3],XmNrightAttachment ,XmATTACH_FORM);
146//   XtSetArg(args[4],XmNbottomAttachment,XmATTACH_WIDGET);
147//   XtSetArg(args[5],XmNbottomWidget    ,clearButton);
148//   XtSetArg(args[6],XmNeditMode        ,XmMULTI_LINE_EDIT);
149//   XtSetArg(args[7],XmNrows            ,12);
150//   XtSetArg(args[8],XmNcolumns         ,80);
151//   text = XmCreateSGcrolledText (form,(char*)"text",args,9);
152//   XtManageChild (text);
153
154//   XtAddCallback(clearButton,XmNactivateCallback,
155//              clearButtonCallback,(XtPointer)text);
156//   XtAddCallback(command,XmNcommandEnteredCallback,
157//              commandEnteredCallback,(XtPointer)this);
158
159//   Widget commandText = XmCommandGetChild(command,XmDIALOG_COMMAND_TEXT);
160//   XtAddEventHandler(commandText,KeyPressMask,False,keyHandler,(XtPointer)this);
161
162//   XtRealizeWidget(shell);
163//   XtMapWidget(shell);
164
165  if(UI!=NULL) UI->SetCoutDestination(this);  // TO KEEP
166}
167/***************************************************************************/
168G4UIQt::~G4UIQt(
169)
170/***************************************************************************/
171/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
172{
173  G4UImanager* UI = G4UImanager::GetUIpointer();  // TO KEEP
174  if(UI!=NULL) {  // TO KEEP
175    UI->SetSession(NULL);  // TO KEEP
176    UI->SetCoutDestination(NULL);  // TO KEEP
177  }
178
179 
180  if (mainWindow!=NULL)
181    delete mainWindow;
182}
183/***************************************************************************/
184/*
185    Start the Qt main loop
186 */
187G4UIsession* G4UIQt::SessionStart (
188)
189/***************************************************************************/
190/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
191{
192
193  mainWindow->show();
194  qApp->exec();
195
196//   Prompt("session"); // TO KEEP
197//   exitSession = false; // TO KEEP
198//   interactorManager->DisableSecondaryLoop (); // TO KEEP
199//   void* event; // TO KEEP
200//   while((event = interactorManager->GetEvent())!=NULL) {  // TO KEEP
201//     interactorManager->DispatchEvent(event); // TO KEEP
202//     if(exitSession==true) break; // TO KEEP
203//   } // TO KEEP
204//   interactorManager->EnableSecondaryLoop (); // TO KEEP
205  return this; // TO KEEP
206}
207/***************************************************************************/
208/**
209  Display the prompt in the prompt area
210 */
211void G4UIQt::Prompt (
212 G4String aPrompt
213)
214/***************************************************************************/
215/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
216{
217// TODO !
218//  Arg args[1];
219//  char* str = (char*)XtNewString(aPrompt.data());
220//  XmString cps = XmStringLtoRCreate(str,XmSTRING_DEFAULT_CHARSET);
221//  XtFree(str);
222//  XtSetArg(args[0],XmNpromptString,cps);
223//  XtSetValues(command,args,1);
224//  XmStringFree(cps);
225}
226/***************************************************************************/
227void G4UIQt::SessionTerminate (
228)
229/***************************************************************************/
230/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
231{
232}
233/***************************************************************************/
234void G4UIQt::PauseSessionStart (
235 G4String a_state
236)
237/***************************************************************************/
238/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
239{
240  if(a_state=="G4_pause> ") {  // TO KEEP
241    SecondaryLoop ("Pause, type continue to exit this state"); // TO KEEP
242  } // TO KEEP
243
244  if(a_state=="EndOfEvent") { // TO KEEP
245    // Picking with feed back in event data Done here !!!
246    SecondaryLoop ("End of event, type continue to exit this state"); // TO KEEP
247  } // TO KEEP
248}
249/***************************************************************************/
250void G4UIQt::SecondaryLoop (
251 G4String a_prompt
252)
253/***************************************************************************/
254/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
255{
256  G4Qt* interactorManager = G4Qt::getInstance (); // TO KEEP ?
257  Prompt(a_prompt); // TO KEEP
258  exitPause = false; // TO KEEP
259  void* event; // TO KEEP
260  while((event = interactorManager->GetEvent())!=NULL) {  // TO KEEP
261    interactorManager->DispatchEvent(event); // TO KEEP
262    if(exitPause==true) break; // TO KEEP
263  } // TO KEEP
264  Prompt("session"); // TO KEEP
265}
266/***************************************************************************/
267/**
268  Receive a cout from Geant4. We have to display it in the cout zone
269 */
270G4int G4UIQt::ReceiveG4cout (
271 G4String a_string
272)
273/***************************************************************************/
274/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
275{
276// TODO !
277//  XmTextAppendString(text,(char*)a_string.data());
278//  return 0;
279}
280/***************************************************************************/
281/**
282  Receive a cerr from Geant4. We have to display it in the cout zone
283 */
284G4int G4UIQt::ReceiveG4cerr (
285 G4String a_string
286)
287/***************************************************************************/
288/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
289{
290// TODO !
291//  XmTextAppendString(text,(char*)a_string.data());
292//  return 0;
293}
294/***************************************************************************/
295G4bool G4UIQt::GetHelpChoice(
296 G4int& aInt
297)
298/***************************************************************************/
299/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
300{
301//   fHelp = true; // TO KEEP
302//   // SecondaryLoop : // TO KEEP
303//   G4Qt* interactorManager = G4Qt::getInstance (); // TO KEEP ?
304//   Prompt("Help"); // TO KEEP
305//   exitHelp = false; // TO KEEP
306//   void* event; // TO KEEP
307//   while((event = interactorManager->GetEvent())!=NULL) {  // TO KEEP
308//     interactorManager->DispatchEvent(event); // TO KEEP
309//     if(exitHelp==true) break; // TO KEEP
310//   } // TO KEEP
311//   Prompt("session"); // TO KEEP
312//   // // TO KEEP
313//   if(fHelp==false) return false; // TO KEEP
314//   aInt = fHelpChoice; // TO KEEP
315//   fHelp = false; // TO KEEP
316//   return true; // TO KEEP
317}
318/***************************************************************************/
319void G4UIQt::ExitHelp(
320)
321/***************************************************************************/
322/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
323{
324}
325/***************************************************************************/
326void G4UIQt::AddMenu (
327 const char* a_name
328,const char* a_label
329)
330/***************************************************************************/
331/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
332{
333//   if(menuBar==NULL) return;
334//   if(a_name==NULL) return;
335//   if(a_label==NULL) return;
336//   XtManageChild (menuBar);
337//   // Pulldown menu :
338//   Widget widget;
339//   widget = XmCreatePulldownMenu (menuBar,(char*)a_name,NULL,0);
340//   AddInteractor (a_name,(G4Interactor)widget);
341//   // Cascade button :
342//   Arg args[2];
343//   XmString cps = XmStringLtoRCreate((char*)a_label,XmSTRING_DEFAULT_CHARSET);
344//   XtSetArg (args[0],XmNlabelString,cps);
345//   XtSetArg (args[1],XmNsubMenuId,widget);
346//   widget = XmCreateCascadeButton (menuBar,(char*)a_name,args,2);
347//   XmStringFree (cps);
348//   XtManageChild (widget);
349//   ExecuteChangeSizeFunction(form);
350}
351/***************************************************************************/
352void G4UIQt::AddButton (
353 const char* a_menu
354,const char* a_label
355,const char* a_command
356)
357/***************************************************************************/
358/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
359{
360//   if(a_menu==NULL) return; // TO KEEP
361//   if(a_label==NULL) return; // TO KEEP
362//   if(a_command==NULL) return; // TO KEEP
363//   Widget parent = (Widget)GetInteractor(a_menu);
364//   if(parent==NULL) return;
365//   Widget widget = XmCreatePushButton(parent,(char*)a_label,NULL,0);
366//   XtManageChild (widget);
367//   XtAddCallback (widget,XmNactivateCallback,ButtonCallback,(XtPointer)this);
368//   commands[widget] = a_command;
369//}
370// /***************************************************************************/
371// G4String G4UIXm::GetCommand (
372//  Widget a_widget
373// )
374// /***************************************************************************/
375// /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
376// {
377//   return commands[a_widget];
378// }
379/***************************************************************************/
380/***************************************************************************/
381/***************************************************************************/
382/**
383  Callback call when "enter" clicked on the prompt zone.
384  Send the command to geant4
385 */
386// TODO !
387//void G4UIQt::commandEnteredCallback (
388// Widget    a_widget
389//,XtPointer a_tag
390//,XtPointer a_data
391//)
392/***************************************************************************/
393/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
394//{
395//  G4UIQt*  This = (G4UIQt*)a_tag;
396
397//   XmString cps  = ((XmCommandCallbackStruct*)a_data)->value;
398//   char*    ss = XmConvertCompoundStringToString(cps,0);
399//   G4String command (ss);
400//   XtFree   (ss);
401
402//   if(This->fHelp==true) {
403//     exitHelp = true;
404//     This->fHelp = ConvertStringToInt(command.data(),This->fHelpChoice);
405//   } else {
406//     This->ApplyShellCommand (command,exitSession,exitPause);
407//   }
408
409//   a_widget = NULL;
410//   a_tag    = NULL;
411//}
412// /***************************************************************************/
413// void G4UIXm::keyHandler (
414//  Widget a_widget
415// ,XtPointer a_tag
416// ,XEvent* a_event
417// ,Boolean*
418// )
419// /***************************************************************************/
420// /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
421// {
422//   KeySym keySym;
423//   XLookupString(&(a_event->xkey),NULL,0,&keySym,NULL);
424//   if(keySym!=XK_Tab) return;
425//   G4UIXm* This = (G4UIXm*)a_tag;
426//   char* s = XmTextGetString(a_widget);
427//   G4String ss = This->Complete(s);
428//   XmTextSetString(a_widget,(char*)ss.data());
429//   XtFree(s);
430//   XmTextSetInsertionPosition(a_widget,XmTextGetLastPosition(a_widget));
431//}
432// /***************************************************************************/
433// void clearButtonCallback (
434//  Widget
435// ,XtPointer a_tag
436// ,XtPointer
437// )
438/***************************************************************************/
439/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
440//{
441//   XmTextSetString((Widget)a_tag,(char*)"");
442//}
443/***************************************************************************/
444// TODO !
445//void G4UIQt::ButtonCallback (
446// Widget a_widget
447//,XtPointer a_tag
448//,XtPointer
449//)
450/***************************************************************************/
451/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
452//{
453//   G4UIXm* This = (G4UIXm*)a_tag;
454//   if(This->fHelp==true) return; // Disabled when in help.
455//   G4String ss = This->GetCommand (a_widget);
456//   //printf ("debug : execute:\n%s\n",ss.data());
457//   This->ApplyShellCommand(ss,exitSession,exitPause);
458//}
459/***************************************************************************/
460/***************************************************************************/
461/***************************************************************************/
462// char* XmConvertCompoundStringToString (
463//  XmString a_cps
464// ,int a_number
465// )
466// /***************************************************************************/
467// /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
468// {
469//   if(a_cps==NULL) return NULL;
470//   char* ss = NULL;
471//   XmStringContext context;
472//   XmStringInitContext(&context,a_cps);
473//   int icount = 0;
474//   Boolean Done = False;
475//   while(Done==False) { 
476//     char* text = NULL;
477//     XmStringCharSet charset = NULL;
478//     XmStringDirection direct;
479//     Boolean sep;
480//     if(XmStringGetNextSegment(context,&text,&charset,&direct,&sep)==True) {
481//       XtFree(charset);
482//       if(sep==True) Done = True;
483//       if(icount==a_number) {
484//      ss = text;
485//      break;
486//       }
487//       icount++;
488//       XtFree(text);
489//     }
490//     else
491//       Done = True;
492//   }
493//   XmStringFreeContext(context);
494//   return ss;
495}
496// /***************************************************************************/
497// void XmTextAppendString (
498//  Widget This
499// ,char* a_string
500// )
501// /***************************************************************************/
502// /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
503// {
504//   if(This==NULL) return;
505//   if(!XtIsSubclass(This,xmTextWidgetClass)) return;
506//   if(a_string==NULL) return;
507//   XmTextPosition  lastpos = XmTextGetLastPosition(This);
508//   XmTextReplace(This,lastpos,lastpos,a_string);
509//   XmTextSetInsertionPosition(This,XmTextGetLastPosition(This));
510// }
511//////////////////////////////////////////////////////////////////////////////
512G4bool ConvertStringToInt(
513 const char* aString
514,int& aInt
515)
516//////////////////////////////////////////////////////////////////////////////
517//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
518{
519  aInt = 0; // TO KEEP
520  if(aString==NULL) return false; // TO KEEP
521  char* s; // TO KEEP
522  long value = strtol(aString,&s,10); // TO KEEP
523  if(s==aString) return false; // TO KEEP
524  aInt = value; // TO KEEP
525  return true; // TO KEEP
526}
527#include <X11/IntrinsicP.h>
528//////////////////////////////////////////////////////////////////////////////
529// void ExecuteChangeSizeFunction (
530//  Widget aWidget
531// )
532// //////////////////////////////////////////////////////////////////////////////
533// //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
534// {
535//   if(aWidget==NULL) return;
536//   if(aWidget->core.widget_class->core_class.resize==NULL) return;
537//   (aWidget->core.widget_class->core_class.resize)(aWidget);
538// }
539
540
541#endif
Note: See TracBrowser for help on using the repository browser.