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