33 #ifdef G4UI_BUILD_WIN32_SESSION
52 #define TEXT_MAX_LINES 300
60 int GetNumberOfLines () {
return linei;}
61 void SetHeightOfPage (
int a_height) { heightOfPage = a_height; }
62 void SetEndOfPage (
int a_value);
63 int GetEndOfPage () {
return endOfPage; }
65 void IncrementEndOfPage ();
66 void DecrementEndOfPage ();
67 void JumpDownEndOfPage ();
68 void JumpUpEndOfPage ();
69 G4bool AppendString (
char* a_string);
70 void Draw (HDC a_hdc,RECT* a_rect);
76 int endOfPage,heightOfPage;
80 TextBuffer::TextBuffer()
81 : linei(0),linen(TEXT_MAX_LINES),endOfPage(0),heightOfPage(12)
84 for(
int count=0;count<256;count++) spaces[count] =
' ';
87 TextBuffer::~TextBuffer()
92 void TextBuffer::SetEndOfPage (
int a_value)
94 if( (a_value<0) || (a_value>=linei)) {
101 void TextBuffer::IncrementEndOfPage ()
104 if(endOfPage>=linei) endOfPage = linei-1;
107 void TextBuffer::DecrementEndOfPage ()
110 if(endOfPage<0) endOfPage = 0;
113 void TextBuffer::JumpDownEndOfPage ()
115 endOfPage += heightOfPage;
116 if(endOfPage>=linei) endOfPage = linei-1;
119 void TextBuffer::JumpUpEndOfPage ()
121 endOfPage -= heightOfPage;
122 if(endOfPage<0) endOfPage = 0;
125 G4bool TextBuffer::AppendString (
char* a_string)
128 if( (a_string==NULL) || (a_string[0]==
'\0') )
return value;
129 int length = strlen(a_string);
130 if(a_string[length-1]==
'\n') {
131 lines[linei] += a_string;
136 lines[linei] += a_string;
139 for(
int count=0;count<linen;count++) {
144 if(value==
true) endOfPage = linei-1;
148 void TextBuffer::Draw (HDC a_hdc,RECT* a_rect)
151 GetTextMetrics (a_hdc,&tm);
152 short charWidth = (short)tm.tmAveCharWidth;
153 short charHeight = (
short)(tm.tmHeight + tm.tmExternalLeading);
154 for(
int row=0;row<heightOfPage;row++) {
155 int rowi = endOfPage - row;
156 short y = (short)(a_rect->bottom - charHeight * (row + 1));
157 if((rowi>=0)&&(rowi<linei)) {
158 TextOut (a_hdc,0,y,(
char*)spaces,256);
159 const char*
string = lines[rowi].data();
161 TextOut (a_hdc,0,y,(
char*)
string,strlen((
char*)
string));
168 static char mainClassName[] =
"G4UIWin32";
169 static char textClassName[] =
"G4UIWin32/Text";
170 static G4bool exitSession =
true;
171 static G4bool exitPause =
true;
172 static G4bool exitHelp =
true;
175 static WNDPROC oldEditWindowProc;
176 static G4bool ConvertStringToInt(
const char*,
int&);
178 static int actionIdentifier = 0;
181 G4UIWin32::G4UIWin32 (
199 interactorManager = G4Win32::getInstance ();
203 wc.style = CS_HREDRAW | CS_VREDRAW;
204 wc.lpfnWndProc = (WNDPROC)G4UIWin32::MainWindowProc;
207 wc.hInstance = ::GetModuleHandle(NULL);
208 wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
209 wc.hCursor = LoadCursor(NULL,IDC_ARROW);
210 wc.hbrBackground = GetStockBrush(WHITE_BRUSH);
211 wc.lpszMenuName = mainClassName;
212 wc.lpszClassName = mainClassName;
213 ::RegisterClass (&wc);
215 wc.style = CS_HREDRAW | CS_VREDRAW;
216 wc.lpfnWndProc = (WNDPROC)G4UIWin32::TextWindowProc;
219 wc.hInstance = ::GetModuleHandle(NULL);
220 wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
221 wc.hCursor = LoadCursor(NULL,IDC_ARROW);
222 wc.hbrBackground = GetStockBrush(WHITE_BRUSH);
223 wc.lpszMenuName = textClassName;
224 wc.lpszClassName = textClassName;
225 ::RegisterClass (&wc);
229 menuBar = CreateMenu();
230 defaultMenu = CreatePopupMenu();
231 AppendMenu(menuBar,MF_POPUP,(UINT_PTR)defaultMenu,
"Geant4");
233 textBuffer =
new TextBuffer();
236 mainWindow = ::CreateWindow(mainClassName,mainClassName,
238 CW_USEDEFAULT,CW_USEDEFAULT,
241 ::GetModuleHandle(NULL),
244 ::SetWindowLongPtr(mainWindow,GWLP_USERDATA,(LONG_PTR)
this);
246 ::SetForegroundWindow(mainWindow);
247 ::ShowWindow(mainWindow,SW_SHOWDEFAULT);
248 ::UpdateWindow(mainWindow);
253 G4UIWin32::~G4UIWin32 (
264 if(textWindow!=NULL) ::SetWindowLongPtr(textWindow,GWLP_USERDATA,LONG(NULL));
265 if(mainWindow!=NULL) {
266 ::SetWindowLongPtr(mainWindow,GWLP_USERDATA,LONG(NULL));
267 ::DestroyWindow(mainWindow);
276 if(interactorManager==NULL)
return this;
279 interactorManager->DisableSecondaryLoop ();
281 while((event = interactorManager->GetEvent())!=NULL) {
282 interactorManager->DispatchEvent(event);
283 if(exitSession==
true)
break;
285 interactorManager->EnableSecondaryLoop ();
289 void G4UIWin32::Prompt (
297 void G4UIWin32::SessionTerminate (
304 void G4UIWin32::PauseSessionStart (
310 if(a_state==
"G4_pause> ") {
311 SecondaryLoop (
"Pause, type continue to exit this state");
314 if(a_state==
"EndOfEvent") {
316 SecondaryLoop (
"End of event, type continue to exit this state");
320 void G4UIWin32::SecondaryLoop (
326 if(interactorManager==NULL)
return;
330 while((event = interactorManager->GetEvent())!=NULL) {
331 interactorManager->DispatchEvent(event);
332 if(exitPause==
true)
break;
337 G4int G4UIWin32::ReceiveG4cout (
343 TextAppendString((
char*)a_string.
data());
347 G4int G4UIWin32::ReceiveG4cerr (
353 TextAppendString((
char*)a_string.
data());
357 G4bool G4UIWin32::GetHelpChoice(
365 if(interactorManager==NULL)
return false;
369 while((event = interactorManager->GetEvent())!=NULL) {
370 interactorManager->DispatchEvent(event);
371 if(exitHelp==
true)
break;
375 if(fHelp==
false)
return false;
381 void G4UIWin32::ExitHelp(
388 void G4UIWin32::AddMenu (
395 if(a_name==NULL)
return;
396 if(defaultMenu!=NULL) {
397 DeleteMenu (menuBar,0,MF_BYPOSITION);
400 HMENU hMenu = CreatePopupMenu();
401 AppendMenu(menuBar,MF_POPUP,(UINT_PTR)hMenu,a_label);
403 DrawMenuBar(mainWindow);
406 void G4UIWin32::AddButton (
409 ,
const char* a_command
414 if(a_menu==NULL)
return;
415 if(a_label==NULL)
return;
416 if(a_command==NULL)
return;
417 HMENU hMenu = (HMENU)GetInteractor(a_menu);
419 commands[actionIdentifier] = a_command;
420 AppendMenu (hMenu,MF_STRING,actionIdentifier,a_label);
429 return commands[a_id];
434 LRESULT CALLBACK G4UIWin32::MainWindowProc (
443 static short charWidth,charHeight;
450 GetWindowRect (a_window,&rect);
452 hdc = GetDC (a_window);
453 GetTextMetrics (hdc,&tm);
454 charWidth = (short)tm.tmAveCharWidth;
455 charHeight = (
short)(tm.tmHeight + tm.tmExternalLeading);
456 ReleaseDC (a_window,hdc);
458 G4UIWin32* This = (G4UIWin32*)tmpSession;
460 This->textWindow = CreateWindow (textClassName,NULL,
461 WS_CHILD | WS_VISIBLE | WS_VSCROLL,
463 This->textCols * charWidth,
464 This->textRows * charHeight,
466 GetWindowInstance(a_window),
468 ::SetWindowLongPtr (This->textWindow,GWLP_USERDATA,(LONG_PTR)This);
470 This->editWindow = CreateWindow (
"edit",NULL,
471 WS_CHILD | WS_VISIBLE | WS_BORDER,
472 0,This->textRows * charHeight,
473 This->textCols * charWidth,charHeight,
475 GetWindowInstance(a_window),
477 oldEditWindowProc = (WNDPROC)GetWindowLongPtr(This->editWindow,GWLP_WNDPROC);
478 SetWindowLongPtr (This->editWindow,GWLP_WNDPROC,(LONG_PTR)EditWindowProc);
480 MoveWindow (a_window,
482 2 * GetSystemMetrics(SM_CXFRAME) +
483 This->textCols * charWidth,
484 GetSystemMetrics(SM_CYCAPTION) +
485 2 * GetSystemMetrics(SM_CYFRAME) +
486 This->textRows * charHeight + charHeight,
491 G4UIWin32* This = (G4UIWin32*)::GetWindowLongPtr(a_window,GWLP_USERDATA);
494 int width = LOWORD(a_lParam);
495 int height = HIWORD(a_lParam);
496 int editHeight = charHeight;
497 MoveWindow (This->textWindow,
499 width,height - editHeight,
501 MoveWindow (This->editWindow,
502 0,height - editHeight,
505 ((TextBuffer*)This->textBuffer)->SetHeightOfPage(height/charHeight);
509 G4UIWin32* This = (G4UIWin32*)::GetWindowLongPtr(a_window,GWLP_USERDATA);
510 if(This!=NULL) SetFocus (This->editWindow);
513 G4UIWin32* This = (G4UIWin32*)::GetWindowLongPtr(a_window,GWLP_USERDATA);
515 if(This->fHelp==
false) {
516 G4String command = This->GetCommand(a_wParam);
517 This->ApplyShellCommand (command,exitSession,exitPause);
525 return (DefWindowProc(a_window,a_message,a_wParam,a_lParam));
528 LRESULT CALLBACK G4UIWin32::TextWindowProc (
539 G4UIWin32* This = (G4UIWin32*)::GetWindowLongPtr(a_window,GWLP_USERDATA);
541 TextBuffer* textBuffer = (TextBuffer*)This->textBuffer;
543 GetClientRect (a_window,&rect);
545 HDC hdc = BeginPaint(a_window,&ps);
546 textBuffer->Draw(hdc,&rect);
547 EndPaint(a_window,&ps);
551 G4UIWin32* This = (G4UIWin32*)::GetWindowLongPtr(a_window,GWLP_USERDATA);
553 TextBuffer* textBuffer = (TextBuffer*)This->textBuffer;
554 int what = LOWORD(a_wParam);
557 textBuffer->DecrementEndOfPage();
560 textBuffer->IncrementEndOfPage();
563 textBuffer->JumpUpEndOfPage();
566 textBuffer->JumpDownEndOfPage();
568 case SB_THUMBPOSITION:
570 textBuffer->SetEndOfPage(HIWORD(a_wParam));
575 int eop = textBuffer->GetEndOfPage();
576 SetScrollPos(a_window,SB_VERT,eop,
TRUE);
577 InvalidateRect(a_window,NULL,
TRUE);
583 return (DefWindowProc(a_window,a_message,a_wParam,a_lParam));
586 LRESULT CALLBACK G4UIWin32::EditWindowProc (
599 G4UIWin32* This = (G4UIWin32*)::GetWindowLongPtr(
600 GetParent(a_window),GWLP_USERDATA);
602 GetWindowText (a_window,buffer,128);
605 Edit_SetText(a_window,
"");
606 Edit_SetSel(a_window,0,0);
609 if(This->fHelp==
true) {
611 This->fHelp = ConvertStringToInt(command.data(),This->fHelpChoice);
613 This->fHistory.push_back(command);
614 This->fHistoryPos = -1;
615 This->ApplyShellCommand (command,exitSession,exitPause);
621 G4UIWin32* This = (G4UIWin32*)::GetWindowLongPtr(
622 GetParent(a_window),GWLP_USERDATA);
623 if( (This!=NULL) && (This->fHelp==
true) )
break;
625 Edit_GetText(a_window,buffer,128);
630 G4String cmd = This->Complete(command);
631 const char* d = cmd.
data();
633 Edit_SetText(a_window,d);
634 Edit_SetSel(a_window,l,l);
639 G4UIWin32* This = (G4UIWin32*)::GetWindowLongPtr(
640 GetParent(a_window),GWLP_USERDATA);
642 int pos = This->fHistoryPos== -1 ?
643 This->fHistory.size()-1 : This->fHistoryPos-1;
644 if((pos>=0)&&(pos<(
int)This->fHistory.size())) {
646 const char* d = command.
data();
648 Edit_SetText(a_window,d);
649 Edit_SetSel(a_window,l,l);
651 This->fHistoryPos =
pos;
656 G4UIWin32* This = (G4UIWin32*)::GetWindowLongPtr(
657 GetParent(a_window),GWLP_USERDATA);
659 int pos = This->fHistoryPos + 1;
660 if((pos>=0)&&(pos<(
int)This->fHistory.size())) {
662 const char* d = command.
data();
664 Edit_SetText(a_window,d);
665 Edit_SetSel(a_window,l,l);
667 This->fHistoryPos =
pos;
668 }
else if(pos>=(
int)This->fHistory.size()) {
669 Edit_SetText(a_window,
"");
670 Edit_SetSel(a_window,0,0);
672 This->fHistoryPos = -1;
678 return CallWindowProc(oldEditWindowProc,
683 void G4UIWin32::TextAppendString (
689 if( (a_string==NULL) || (a_string[0]==
'\0') )
return;
690 if(textWindow==NULL)
return;
691 if(((TextBuffer*)textBuffer)->AppendString(a_string)==
true) {
694 GetClientRect(textWindow,&rect);
695 InvalidateRect(textWindow,NULL,
TRUE);
696 HDC hdc = GetDC(textWindow);
697 ((TextBuffer*)textBuffer)->Draw(hdc,&rect);
698 ReleaseDC (textWindow,hdc);
699 int linen = ((TextBuffer*)textBuffer)->GetNumberOfLines();
700 SetScrollRange(textWindow,SB_VERT,0,linen-1,
TRUE);
701 SetScrollPos(textWindow,SB_VERT,linen-1,
TRUE);
705 G4bool ConvertStringToInt(
713 if(aString==NULL)
return false;
715 long value = strtol(aString,&s,10);
716 if(s==aString)
return false;
void SetSession(G4UIsession *const value)
static G4UImanager * GetUIpointer()
const XML_Char int const XML_Char * value
typedef int(XMLCALL *XML_NotStandaloneHandler)(void *userData)
const char * data() const
void SetCoutDestination(G4UIsession *const value)
static constexpr double ps
static const G4double pos