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

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

r579@mac-90108: laurentgarnier | 2007-06-06 16:24:44 +0200
on avance...

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