Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
G4UIXm.cc
Go to the documentation of this file.
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$
28//
29// G.Barrand
30
31//#define DEBUG
32
33#ifdef G4UI_BUILD_XM_SESSION
34
35#include "G4Types.hh"
36
37#include <string.h>
38
39#include <X11/Intrinsic.h>
40#include <X11/Shell.h>
41#include <X11/keysym.h>
42
43#include <Xm/Xm.h>
44#include <Xm/Command.h>
45#include <Xm/RowColumn.h>
46#include <Xm/Form.h>
47#include <Xm/PushB.h>
48#include <Xm/CascadeB.h>
49#include <Xm/Text.h>
50
51#include "G4UIXm.hh"
52#include "G4UImanager.hh"
53#include "G4StateManager.hh"
54#include "G4UIcommandTree.hh"
55#include "G4UIcommandStatus.hh"
56
57#include "G4Xt.hh"
58
59#include <stdlib.h>
60
61static void XmTextAppendString (Widget,char*);
62
63static void clearButtonCallback (Widget,XtPointer,XtPointer);
64
65static char* XmConvertCompoundStringToString (XmString,int);
66static G4bool ConvertStringToInt(const char*,int&);
67static void ExecuteChangeSizeFunction(Widget);
68
69static G4bool exitSession = true;
70static G4bool exitPause = true;
71static G4bool exitHelp = true;
72/***************************************************************************/
73G4UIXm::G4UIXm (
74 int argc
75,char** argv
76)
77:shell(NULL)
78,command(NULL)
79,menuBar(NULL)
80,text(NULL)
81,fHelp(false)
82,fHelpChoice(0)
83/***************************************************************************/
84/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
85{
87 if(UI!=NULL) UI->SetSession(this);
88
89 G4Xt* interactorManager = G4Xt::getInstance (argc,argv,(char*)"Xm");
90
91 Widget top = (Widget)interactorManager->GetMainInteractor();
92
93 if(getenv("XENVIRONMENT")==NULL) {
94 XrmDatabase database = XrmGetDatabase(XtDisplay(top));
95 if(database!=NULL) {
96 XrmPutLineResource(&database,"*topShadowColor:white");
97 XrmPutLineResource(&database,"*bottomShadowColor:black");
98 XrmPutLineResource(&database,"*foreground:black");
99 XrmPutLineResource(&database,"*background:lightgrey");
100 XrmPutLineResource(&database,"*borderColor:lightgrey");
101 XrmPutLineResource(&database,"*fontList:-*-helvetica-bold-r-*-*-*-120-*-*-*-*-iso8859-1");
102 XrmPutLineResource(&database,"*text.background:white");
103 XrmPutLineResource(&database,"*text.fontList:*courier*-r-*--14-*");
104 XrmPutLineResource(&database,"*text.maxLength:8000");
105 }
106 }
107
108 Arg args[9];
109 XtSetArg(args[0],XmNkeyboardFocusPolicy,XmPOINTER); // For completion.
110 shell = XtAppCreateShell ("G4UIXm","G4UIXm",
111 topLevelShellWidgetClass,XtDisplay(top),
112 args,1);
113 form = XmCreateForm (shell,(char*)"form",NULL,0);
114 XtManageChild (form);
115
116 XtSetArg(args[0],XmNtopAttachment ,XmATTACH_FORM);
117 XtSetArg(args[1],XmNleftAttachment ,XmATTACH_FORM);
118 XtSetArg(args[2],XmNrightAttachment ,XmATTACH_FORM);
119 menuBar = XmCreateMenuBar (form,(char*)"menuBar",args,3);
120
121 XtSetArg(args[0],XmNtopAttachment ,XmATTACH_NONE);
122 XtSetArg(args[1],XmNleftAttachment ,XmATTACH_FORM);
123 XtSetArg(args[2],XmNrightAttachment ,XmATTACH_FORM);
124 XtSetArg(args[3],XmNbottomAttachment ,XmATTACH_FORM);
125 command = XmCreateCommand (form,(char*)"command",args,4);
126 XtManageChild (command);
127
128 XtSetArg(args[0],XmNtopAttachment ,XmATTACH_NONE);
129 XtSetArg(args[1],XmNleftAttachment ,XmATTACH_FORM);
130 XtSetArg(args[2],XmNrightAttachment ,XmATTACH_FORM);
131 XtSetArg(args[3],XmNbottomAttachment,XmATTACH_WIDGET);
132 XtSetArg(args[4],XmNbottomWidget ,command);
133 XmString cps = XmStringLtoRCreate((char*)"Clear",XmSTRING_DEFAULT_CHARSET);
134 XtSetArg (args[5],XmNlabelString,cps);
135 Widget clearButton = XmCreatePushButton(form,(char*)"clearButton",args,6);
136 XmStringFree (cps);
137 XtManageChild (clearButton);
138
139 XtSetArg(args[0],XmNtopAttachment ,XmATTACH_WIDGET);
140 XtSetArg(args[1],XmNtopWidget ,menuBar);
141 XtSetArg(args[2],XmNleftAttachment ,XmATTACH_FORM);
142 XtSetArg(args[3],XmNrightAttachment ,XmATTACH_FORM);
143 XtSetArg(args[4],XmNbottomAttachment,XmATTACH_WIDGET);
144 XtSetArg(args[5],XmNbottomWidget ,clearButton);
145 XtSetArg(args[6],XmNeditMode ,XmMULTI_LINE_EDIT);
146 XtSetArg(args[7],XmNrows ,12);
147 XtSetArg(args[8],XmNcolumns ,80);
148 text = XmCreateScrolledText (form,(char*)"text",args,9);
149 XtManageChild (text);
150
151 XtAddCallback(clearButton,XmNactivateCallback,
152 clearButtonCallback,(XtPointer)text);
153 XtAddCallback(command,XmNcommandEnteredCallback,
154 CommandEnteredCallback,(XtPointer)this);
155
156 Widget commandText = XmCommandGetChild(command,XmDIALOG_COMMAND_TEXT);
157 XtAddEventHandler(commandText,KeyPressMask,False,keyHandler,(XtPointer)this);
158
159 XtRealizeWidget(shell);
160 XtMapWidget(shell);
161
162 if(UI!=NULL) UI->SetCoutDestination(this);
163}
164/***************************************************************************/
165G4UIXm::~G4UIXm(
166)
167/***************************************************************************/
168/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
169{
171 if(UI!=NULL) {
172 UI->SetSession(NULL);
173 UI->SetCoutDestination(NULL);
174 }
175 XtDestroyWidget(shell);
176}
177/***************************************************************************/
178G4UIsession* G4UIXm::SessionStart (
179)
180/***************************************************************************/
181/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
182{
183 G4Xt* interactorManager = G4Xt::getInstance ();
184 Prompt("session");
185 exitSession = false;
186 interactorManager->DisableSecondaryLoop ();
187 void* event;
188 while((event = interactorManager->GetEvent())!=NULL) {
189 interactorManager->DispatchEvent(event);
190 if(exitSession==true) break;
191 }
192 interactorManager->EnableSecondaryLoop ();
193 return this;
194}
195/***************************************************************************/
196void G4UIXm::Prompt (
197 G4String aPrompt
198)
199/***************************************************************************/
200/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
201{
202 Arg args[1];
203 char* str = (char*)XtNewString(aPrompt.data());
204 XmString cps = XmStringLtoRCreate(str,XmSTRING_DEFAULT_CHARSET);
205 XtFree(str);
206 XtSetArg(args[0],XmNpromptString,cps);
207 XtSetValues(command,args,1);
208 XmStringFree(cps);
209}
210/***************************************************************************/
211void G4UIXm::SessionTerminate (
212)
213/***************************************************************************/
214/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
215{
216}
217/***************************************************************************/
218void G4UIXm::PauseSessionStart (
219 const G4String& a_state
220)
221/***************************************************************************/
222/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
223{
224 if(a_state=="G4_pause> ") {
225 SecondaryLoop ("Pause, type continue to exit this state");
226 }
227
228 if(a_state=="EndOfEvent") {
229 // Picking with feed back in event data Done here !!!
230 SecondaryLoop ("End of event, type continue to exit this state");
231 }
232}
233/***************************************************************************/
234void G4UIXm::SecondaryLoop (
235 G4String a_prompt
236)
237/***************************************************************************/
238/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
239{
240 G4Xt* interactorManager = G4Xt::getInstance ();
241 Prompt(a_prompt);
242 exitPause = false;
243 void* event;
244 while((event = interactorManager->GetEvent())!=NULL) {
245 interactorManager->DispatchEvent(event);
246 if(exitPause==true) break;
247 }
248 Prompt("session");
249}
250/***************************************************************************/
251G4int G4UIXm::ReceiveG4cout (
252 const G4String& a_string
253)
254/***************************************************************************/
255/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
256{
257 XmTextAppendString(text,(char*)a_string.data());
258 return 0;
259}
260/***************************************************************************/
261G4int G4UIXm::ReceiveG4cerr (
262 const G4String& a_string
263)
264/***************************************************************************/
265/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
266{
267 XmTextAppendString(text,(char*)a_string.data());
268 return 0;
269}
270/***************************************************************************/
271G4bool G4UIXm::GetHelpChoice(
272 G4int& aInt
273)
274/***************************************************************************/
275/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
276{
277 fHelp = true;
278 // SecondaryLoop :
279 G4Xt* interactorManager = G4Xt::getInstance ();
280 Prompt("Help");
281 exitHelp = false;
282 void* event;
283 while((event = interactorManager->GetEvent())!=NULL) {
284 interactorManager->DispatchEvent(event);
285 if(exitHelp==true) break;
286 }
287 Prompt("session");
288 //
289 if(fHelp==false) return false;
290 aInt = fHelpChoice;
291 fHelp = false;
292 return true;
293}
294/***************************************************************************/
295void G4UIXm::ExitHelp(
296) const
297/***************************************************************************/
298/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
299{
300}
301/***************************************************************************/
302void G4UIXm::AddMenu (
303 const char* a_name
304,const char* a_label
305)
306/***************************************************************************/
307/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
308{
309 if(menuBar==NULL) return;
310 if(a_name==NULL) return;
311 if(a_label==NULL) return;
312 XtManageChild (menuBar);
313 // Pulldown menu :
314 Widget widget;
315 widget = XmCreatePulldownMenu (menuBar,(char*)a_name,NULL,0);
316 AddInteractor (a_name,(G4Interactor)widget);
317 // Cascade button :
318 Arg args[2];
319 XmString cps = XmStringLtoRCreate((char*)a_label,XmSTRING_DEFAULT_CHARSET);
320 XtSetArg (args[0],XmNlabelString,cps);
321 XtSetArg (args[1],XmNsubMenuId,widget);
322 widget = XmCreateCascadeButton (menuBar,(char*)a_name,args,2);
323 XmStringFree (cps);
324 XtManageChild (widget);
325 ExecuteChangeSizeFunction(form);
326}
327/***************************************************************************/
328void G4UIXm::AddButton (
329 const char* a_menu
330,const char* a_label
331,const char* a_command
332)
333/***************************************************************************/
334/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
335{
336 if(a_menu==NULL) return;
337 if(a_label==NULL) return;
338 if(a_command==NULL) return;
339 Widget parent = (Widget)GetInteractor(a_menu);
340 if(parent==NULL) return;
341 Widget widget = XmCreatePushButton(parent,(char*)a_label,NULL,0);
342 XtManageChild (widget);
343 XtAddCallback (widget,XmNactivateCallback,ButtonCallback,(XtPointer)this);
344 commands[widget] = a_command;
345}
346/***************************************************************************/
347G4String G4UIXm::GetCommand (
348 Widget a_widget
349)
350/***************************************************************************/
351/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
352{
353 return commands[a_widget];
354}
355/***************************************************************************/
356/***************************************************************************/
357/***************************************************************************/
358void G4UIXm::CommandEnteredCallback (
359 Widget
360,XtPointer a_tag
361,XtPointer a_data
362)
363/***************************************************************************/
364/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
365{
366 G4UIXm* This = (G4UIXm*)a_tag;
367
368 XmString cps = ((XmCommandCallbackStruct*)a_data)->value;
369 char* ss = XmConvertCompoundStringToString(cps,0);
370 G4String command (ss);
371 XtFree (ss);
372
373 if(This->fHelp==true) {
374 exitHelp = true;
375 This->fHelp = ConvertStringToInt(command.data(),This->fHelpChoice);
376 } else {
377 This->ApplyShellCommand (command,exitSession,exitPause);
378 }
379
380 //a_widget = NULL; Not used (1st argument). Comment out to avoid compiler warnings. (JA)
381 a_tag = NULL;
382}
383/***************************************************************************/
384void G4UIXm::keyHandler (
385 Widget a_widget
386,XtPointer a_tag
387,XEvent* a_event
388,Boolean*
389)
390/***************************************************************************/
391/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
392{
393 KeySym keySym;
394 XLookupString(&(a_event->xkey),NULL,0,&keySym,NULL);
395 if(keySym!=XK_Tab) return;
396 G4UIXm* This = (G4UIXm*)a_tag;
397 char* s = XmTextGetString(a_widget);
398 G4String ss = This->Complete(s);
399 XmTextSetString(a_widget,(char*)ss.data());
400 XtFree(s);
401 XmTextSetInsertionPosition(a_widget,XmTextGetLastPosition(a_widget));
402}
403/***************************************************************************/
404void clearButtonCallback (
405 Widget
406,XtPointer a_tag
407,XtPointer
408)
409/***************************************************************************/
410/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
411{
412 XmTextSetString((Widget)a_tag,(char*)"");
413}
414/***************************************************************************/
415void G4UIXm::ButtonCallback (
416 Widget a_widget
417,XtPointer a_tag
418,XtPointer
419)
420/***************************************************************************/
421/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
422{
423 G4UIXm* This = (G4UIXm*)a_tag;
424 if(This->fHelp==true) return; // Disabled when in help.
425 G4String ss = This->GetCommand (a_widget);
426 //printf ("debug : execute:\n%s\n",ss.data());
427 This->ApplyShellCommand(ss,exitSession,exitPause);
428}
429/***************************************************************************/
430/***************************************************************************/
431/***************************************************************************/
432char* XmConvertCompoundStringToString (
433 XmString a_cps
434,int a_number
435)
436/***************************************************************************/
437/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
438{
439 if(a_cps==NULL) return NULL;
440 char* ss = NULL;
441 XmStringContext context;
442 XmStringInitContext(&context,a_cps);
443 int icount = 0;
444 Boolean Done = False;
445 while(Done==False) {
446 char* text = NULL;
447 XmStringCharSet charset = NULL;
448 XmStringDirection direct;
449 Boolean sep;
450 if(XmStringGetNextSegment(context,&text,&charset,&direct,&sep)==True) {
451 XtFree(charset);
452 if(sep==True) Done = True;
453 if(icount==a_number) {
454 ss = text;
455 break;
456 }
457 icount++;
458 XtFree(text);
459 }
460 else
461 Done = True;
462 }
463 XmStringFreeContext(context);
464 return ss;
465}
466/***************************************************************************/
467void XmTextAppendString (
468 Widget This
469,char* a_string
470)
471/***************************************************************************/
472/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
473{
474 if(This==NULL) return;
475 if(!XtIsSubclass(This,xmTextWidgetClass)) return;
476 if(a_string==NULL) return;
477 XmTextPosition lastpos = XmTextGetLastPosition(This);
478 XmTextReplace(This,lastpos,lastpos,a_string);
479 XmTextSetInsertionPosition(This,XmTextGetLastPosition(This));
480}
481//////////////////////////////////////////////////////////////////////////////
482G4bool ConvertStringToInt(
483 const char* aString
484,int& aInt
485)
486//////////////////////////////////////////////////////////////////////////////
487//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
488{
489 aInt = 0;
490 if(aString==NULL) return false;
491 char* s;
492 long value = strtol(aString,&s,10);
493 if(s==aString) return false;
494 aInt = value;
495 return true;
496}
497#include <X11/IntrinsicP.h>
498//////////////////////////////////////////////////////////////////////////////
499void ExecuteChangeSizeFunction (
500 Widget aWidget
501)
502//////////////////////////////////////////////////////////////////////////////
503//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
504{
505 if(aWidget==NULL) return;
506 if(aWidget->core.widget_class->core_class.resize==NULL) return;
507 (aWidget->core.widget_class->core_class.resize)(aWidget);
508}
509
510
511#endif
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
void * G4Interactor
const char * data() const
void SetCoutDestination(G4UIsession *const value)
Definition: G4UImanager.cc:517
static G4UImanager * GetUIpointer()
Definition: G4UImanager.cc:51
void SetSession(G4UIsession *const value)
Definition: G4UImanager.hh:204
#define const
Definition: zconf.h:118