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
G4UIWin32.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_WIN32_SESSION
34
35// this :
36#include "G4UIWin32.hh"
37
38#include <string.h>
39
40#include <windows.h>
41#include <windowsx.h>
42#include <wingdi.h>
43
44#include <strstream>
45
46#include "G4UImanager.hh"
47#include "G4StateManager.hh"
48#include "G4UIcommandTree.hh"
49#include "G4UIcommandStatus.hh"
50#include "G4Win32.hh"
51
52#define TEXT_MAX_LINES 300
53
54class TextBuffer
55{
56public:
57 TextBuffer();
58 ~TextBuffer();
59
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; }
64
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);
71
72private:
73 G4String* lines;
74 int linen;
75 int linei;
76 int endOfPage,heightOfPage;
77 char spaces[256];
78};
79
80TextBuffer::TextBuffer()
81 : linei(0),linen(TEXT_MAX_LINES),endOfPage(0),heightOfPage(12)
82{
83 lines = new G4String[linen];
84 for(int count=0;count<256;count++) spaces[count] = ' ';
85}
86
87TextBuffer::~TextBuffer()
88{
89 delete [] lines;
90}
91
92void TextBuffer::SetEndOfPage (int a_value)
93{
94 if( (a_value<0) || (a_value>=linei)) {
95 endOfPage = linei-1;
96 } else {
97 endOfPage = a_value;
98 }
99}
100
101void TextBuffer::IncrementEndOfPage ()
102{
103 endOfPage++;
104 if(endOfPage>=linei) endOfPage = linei-1;
105}
106
107void TextBuffer::DecrementEndOfPage ()
108{
109 endOfPage--;
110 if(endOfPage<0) endOfPage = 0;
111}
112
113void TextBuffer::JumpDownEndOfPage ()
114{
115 endOfPage += heightOfPage;
116 if(endOfPage>=linei) endOfPage = linei-1;
117}
118
119void TextBuffer::JumpUpEndOfPage ()
120{
121 endOfPage -= heightOfPage;
122 if(endOfPage<0) endOfPage = 0;
123}
124
125G4bool TextBuffer::AppendString (char* a_string)
126{
127 G4bool value = false;
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;
132 lines[linei] = lines[linei].strip(G4String::trailing,'\n');
133 linei++;
134 value = true;
135 } else {
136 lines[linei] += a_string;
137 }
138 if(linei>=linen) {
139 for(int count=0;count<linen;count++) {
140 lines[count] = "";
141 }
142 linei = 0;
143 }
144 if(value==true) endOfPage = linei-1;
145 return value;
146}
147
148void TextBuffer::Draw (HDC a_hdc,RECT* a_rect)
149{
150 TEXTMETRIC tm;
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); //Clear text background first.
159 const char* string = lines[rowi].data();
160 if(string!=NULL) {
161 TextOut (a_hdc,0,y,(char*)string,strlen((char*)string));
162 }
163 }
164 }
165}
166
167/***************************************************************************/
168static char mainClassName[] = "G4UIWin32";
169static char textClassName[] = "G4UIWin32/Text";
170static G4bool exitSession = true;
171static G4bool exitPause = true;
172static G4bool exitHelp = true;
173static G4UIsession* tmpSession = NULL;
174
175static WNDPROC oldEditWindowProc;
176static G4bool ConvertStringToInt(const char*,int&);
177
178static int actionIdentifier = 0;
179
180/***************************************************************************/
181G4UIWin32::G4UIWin32 (
182)
183:mainWindow(NULL)
184,textWindow(NULL)
185,editWindow(NULL)
186,menuBar(NULL)
187,textBuffer(NULL)
188,textCols(80)
189,textRows(12)
190,fHelp(false)
191,fHelpChoice(0)
192,fHistoryPos(-1)
193/***************************************************************************/
194/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
195{
197 if(UI!=NULL) UI->SetSession(this);
198
199 interactorManager = G4Win32::getInstance ();
200 static G4bool Done = FALSE;
201 if(Done==FALSE) {
202 WNDCLASS wc;
203 wc.style = CS_HREDRAW | CS_VREDRAW;
204 wc.lpfnWndProc = (WNDPROC)G4UIWin32::MainWindowProc;
205 wc.cbClsExtra = 0;
206 wc.cbWndExtra = 0;
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);
214
215 wc.style = CS_HREDRAW | CS_VREDRAW;
216 wc.lpfnWndProc = (WNDPROC)G4UIWin32::TextWindowProc;
217 wc.cbClsExtra = 0;
218 wc.cbWndExtra = 0;
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);
226 Done = TRUE;
227 }
228
229 menuBar = CreateMenu();
230 defaultMenu = CreatePopupMenu();
231 AppendMenu(menuBar,MF_POPUP,(UINT)defaultMenu,"Geant4");
232
233 textBuffer = new TextBuffer();
234
235 tmpSession = this;
236 mainWindow = ::CreateWindow(mainClassName,mainClassName,
237 WS_OVERLAPPEDWINDOW,
238 CW_USEDEFAULT,CW_USEDEFAULT,
239 0,0,
240 NULL,menuBar,
241 ::GetModuleHandle(NULL),
242 NULL);
243 tmpSession = NULL;
244 ::SetWindowLongPtr(mainWindow,GWLP_USERDATA,LONG(this));
245
246 ::SetForegroundWindow(mainWindow);
247 ::ShowWindow(mainWindow,SW_SHOWDEFAULT);
248 ::UpdateWindow(mainWindow);
249
250 if(UI!=NULL) UI->SetCoutDestination(this);
251}
252/***************************************************************************/
253G4UIWin32::~G4UIWin32 (
254)
255/***************************************************************************/
256/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
257{
259 if(UI!=NULL) {
260 UI->SetSession(NULL);
261 UI->SetCoutDestination(NULL);
262 }
263 delete textBuffer;
264 if(textWindow!=NULL) ::SetWindowLongPtr(textWindow,GWLP_USERDATA,LONG(NULL));
265 if(mainWindow!=NULL) {
266 ::SetWindowLongPtr(mainWindow,GWLP_USERDATA,LONG(NULL));
267 ::DestroyWindow(mainWindow);
268 }
269}
270/***************************************************************************/
271G4UIsession* G4UIWin32::SessionStart (
272)
273/***************************************************************************/
274/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
275{
276 if(interactorManager==NULL) return this;
277 Prompt ("session");
278 exitSession = false;
279 interactorManager->DisableSecondaryLoop ();
280 void* event;
281 while((event = interactorManager->GetEvent())!=NULL) {
282 interactorManager->DispatchEvent(event);
283 if(exitSession==true) break;
284 }
285 interactorManager->EnableSecondaryLoop ();
286 return this;
287}
288/***************************************************************************/
289void G4UIWin32::Prompt (
290 const G4String& a_prompt
291)
292/***************************************************************************/
293/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
294{
295}
296/***************************************************************************/
297void G4UIWin32::SessionTerminate (
298)
299/***************************************************************************/
300/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
301{
302}
303/***************************************************************************/
304void G4UIWin32::PauseSessionStart (
305 const G4String& a_state
306)
307/***************************************************************************/
308/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
309{
310 if(a_state=="G4_pause> ") {
311 SecondaryLoop ("Pause, type continue to exit this state");
312 }
313
314 if(a_state=="EndOfEvent") {
315 // Picking with feed back in event data Done here !!!
316 SecondaryLoop ("End of event, type continue to exit this state");
317 }
318}
319/***************************************************************************/
320void G4UIWin32::SecondaryLoop (
321 const G4String& a_prompt
322)
323/***************************************************************************/
324/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
325{
326 if(interactorManager==NULL) return;
327 Prompt(a_prompt);
328 exitPause = false;
329 void* event;
330 while((event = interactorManager->GetEvent())!=NULL) {
331 interactorManager->DispatchEvent(event);
332 if(exitPause==true) break;
333 }
334 Prompt("session");
335}
336/***************************************************************************/
337G4int G4UIWin32::ReceiveG4cout (
338 const G4String& a_string
339)
340/***************************************************************************/
341/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
342{
343 TextAppendString((char*)a_string.data());
344 return 0;
345}
346/***************************************************************************/
347G4int G4UIWin32::ReceiveG4cerr (
348 const G4String& a_string
349)
350/***************************************************************************/
351/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
352{
353 TextAppendString((char*)a_string.data());
354 return 0;
355}
356/***************************************************************************/
357G4bool G4UIWin32::GetHelpChoice(
358 G4int& aInt
359)
360/***************************************************************************/
361/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
362{
363 fHelp = true;
364 //
365 if(interactorManager==NULL) return false;
366 Prompt("Help");
367 exitHelp = false;
368 void* event;
369 while((event = interactorManager->GetEvent())!=NULL) {
370 interactorManager->DispatchEvent(event);
371 if(exitHelp==true) break;
372 }
373 Prompt("session");
374 //
375 if(fHelp==false) return false;
376 aInt = fHelpChoice;
377 fHelp = false;
378 return true;
379}
380/***************************************************************************/
381void G4UIWin32::ExitHelp(
382) const
383/***************************************************************************/
384/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
385{
386}
387/***************************************************************************/
388void G4UIWin32::AddMenu (
389 const char* a_name
390,const char* a_label
391)
392/***************************************************************************/
393/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
394{
395 if(a_name==NULL) return;
396 if(defaultMenu!=NULL) {
397 DeleteMenu (menuBar,0,MF_BYPOSITION);
398 defaultMenu = NULL;
399 }
400 HMENU hMenu = CreatePopupMenu();
401 AppendMenu(menuBar,MF_POPUP,(UINT)hMenu,a_label);
402 AddInteractor(a_name,(G4Interactor)hMenu);
403 DrawMenuBar(mainWindow);
404}
405/***************************************************************************/
406void G4UIWin32::AddButton (
407 const char* a_menu
408,const char* a_label
409,const char* a_command
410)
411/***************************************************************************/
412/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
413{
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);
418 actionIdentifier++;
419 commands[actionIdentifier] = a_command;
420 AppendMenu (hMenu,MF_STRING,actionIdentifier,a_label);
421}
422/***************************************************************************/
423G4String G4UIWin32::GetCommand (
424 int a_id
425)
426/***************************************************************************/
427/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
428{
429 return commands[a_id];
430}
431/***************************************************************************/
432/***************************************************************************/
433/***************************************************************************/
434LRESULT CALLBACK G4UIWin32::MainWindowProc (
435 HWND a_window
436,UINT a_message
437,WPARAM a_wParam
438,LPARAM a_lParam
439)
440/***************************************************************************/
441/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
442{
443 static short charWidth,charHeight;
444
445 switch (a_message) {
446 case WM_CREATE:{
447 HDC hdc;
448 TEXTMETRIC tm;
449 RECT rect;
450 GetWindowRect (a_window,&rect);
451
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);
457
458 G4UIWin32* This = (G4UIWin32*)tmpSession;
459 if(This!=NULL) {
460 This->textWindow = CreateWindow (textClassName,NULL,
461 WS_CHILD | WS_VISIBLE | WS_VSCROLL,
462 0,0,
463 This->textCols * charWidth,
464 This->textRows * charHeight,
465 a_window,NULL,
466 GetWindowInstance(a_window),
467 NULL);
468 ::SetWindowLongPtr (This->textWindow,GWLP_USERDATA,LONG(This));
469
470 This->editWindow = CreateWindow ("edit",NULL,
471 WS_CHILD | WS_VISIBLE | WS_BORDER,
472 0,This->textRows * charHeight,
473 This->textCols * charWidth,charHeight,
474 a_window,(HMENU)1,
475 GetWindowInstance(a_window),
476 NULL);
477 oldEditWindowProc = (WNDPROC)GetWindowLongPtr(This->editWindow,GWLP_WNDPROC);
478 SetWindowLongPtr (This->editWindow,GWLP_WNDPROC,(LONG)EditWindowProc);
479
480 MoveWindow (a_window,
481 rect.left,rect.top,
482 2 * GetSystemMetrics(SM_CXFRAME) +
483 This->textCols * charWidth,
484 GetSystemMetrics(SM_CYCAPTION) +
485 2 * GetSystemMetrics(SM_CYFRAME) +
486 This->textRows * charHeight + charHeight,
487 TRUE);
488 }
489 }return 0;
490 case WM_SIZE:{
491 G4UIWin32* This = (G4UIWin32*)::GetWindowLongPtr(a_window,GWLP_USERDATA);
492 if(This!=NULL) {
493 // Client size :
494 int width = LOWORD(a_lParam);
495 int height = HIWORD(a_lParam);
496 int editHeight = /*2 * GetSystemMetrics(SM_CYBORDER) + */ charHeight;
497 MoveWindow (This->textWindow,
498 0,0,
499 width,height - editHeight,
500 FALSE);
501 MoveWindow (This->editWindow,
502 0,height - editHeight,
503 width,charHeight,
504 FALSE);
505 ((TextBuffer*)This->textBuffer)->SetHeightOfPage(height/charHeight);
506 }
507 }return 0;
508 case WM_SETFOCUS:{
509 G4UIWin32* This = (G4UIWin32*)::GetWindowLongPtr(a_window,GWLP_USERDATA);
510 if(This!=NULL) SetFocus (This->editWindow);
511 }return 0;
512 case WM_COMMAND:{
513 G4UIWin32* This = (G4UIWin32*)::GetWindowLongPtr(a_window,GWLP_USERDATA);
514 if(This!=NULL) {
515 if(This->fHelp==false) {
516 G4String command = This->GetCommand(a_wParam);
517 This->ApplyShellCommand (command,exitSession,exitPause);
518 }
519 }
520 }return 0;
521 case WM_DESTROY:
522 PostQuitMessage(0);
523 return 0;
524 }
525 return (DefWindowProc(a_window,a_message,a_wParam,a_lParam));
526}
527/***************************************************************************/
528LRESULT CALLBACK G4UIWin32::TextWindowProc (
529 HWND a_window
530,UINT a_message
531,WPARAM a_wParam
532,LPARAM a_lParam
533)
534/***************************************************************************/
535/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
536{
537 switch (a_message) {
538 case WM_PAINT:{
539 G4UIWin32* This = (G4UIWin32*)::GetWindowLongPtr(a_window,GWLP_USERDATA);
540 if(This!=NULL) {
541 TextBuffer* textBuffer = (TextBuffer*)This->textBuffer;
542 RECT rect;
543 GetClientRect (a_window,&rect);
544 PAINTSTRUCT ps;
545 HDC hdc = BeginPaint(a_window,&ps);
546 textBuffer->Draw(hdc,&rect);
547 EndPaint(a_window,&ps);
548 }
549 }return 0;
550 case WM_VSCROLL:{
551 G4UIWin32* This = (G4UIWin32*)::GetWindowLongPtr(a_window,GWLP_USERDATA);
552 if(This!=NULL) {
553 TextBuffer* textBuffer = (TextBuffer*)This->textBuffer;
554 int what = LOWORD(a_wParam);
555 switch(what) {
556 case SB_LINEUP:
557 textBuffer->DecrementEndOfPage();
558 break;
559 case SB_LINEDOWN:
560 textBuffer->IncrementEndOfPage();
561 break;
562 case SB_PAGEUP:
563 textBuffer->JumpUpEndOfPage();
564 break;
565 case SB_PAGEDOWN:
566 textBuffer->JumpDownEndOfPage();
567 break;
568 case SB_THUMBPOSITION:
569 case SB_THUMBTRACK:
570 textBuffer->SetEndOfPage(HIWORD(a_wParam));
571 break;
572 default:
573 return 0;
574 }
575 int eop = textBuffer->GetEndOfPage();
576 SetScrollPos(a_window,SB_VERT,eop,TRUE);
577 InvalidateRect(a_window,NULL,TRUE);
578 }}return 0;
579 case WM_DESTROY:
580 PostQuitMessage(0);
581 return 0;
582 }
583 return (DefWindowProc(a_window,a_message,a_wParam,a_lParam));
584}
585/***************************************************************************/
586LRESULT CALLBACK G4UIWin32::EditWindowProc (
587 HWND a_window
588,UINT a_message
589,WPARAM a_wParam
590,LPARAM a_lParam
591)
592/***************************************************************************/
593/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
594{
595 switch (a_message) {
596 case WM_KEYDOWN:
597 switch(a_wParam){
598 case VK_RETURN:{
599 G4UIWin32* This = (G4UIWin32*)::GetWindowLongPtr(
600 GetParent(a_window),GWLP_USERDATA);
601 char buffer[128];
602 GetWindowText (a_window,buffer,128);
603 G4String command (buffer);
604 //SetWindowText (a_window,"");
605 Edit_SetText(a_window,"");
606 Edit_SetSel(a_window,0,0);
607
608 if(This!=NULL) {
609 if(This->fHelp==true) {
610 exitHelp = true;
611 This->fHelp = ConvertStringToInt(command.data(),This->fHelpChoice);
612 } else {
613 This->fHistory.push_back(command);
614 This->fHistoryPos = -1;
615 This->ApplyShellCommand (command,exitSession,exitPause);
616 }
617 }
618
619 }break;
620 case VK_TAB:{
621 G4UIWin32* This = (G4UIWin32*)::GetWindowLongPtr(
622 GetParent(a_window),GWLP_USERDATA);
623 if( (This!=NULL) && (This->fHelp==true) ) break;
624 char buffer[128];
625 Edit_GetText(a_window,buffer,128);
626
627 G4String command(buffer);
628
629 if(This!=NULL) {
630 G4String cmd = This->Complete(command);
631 const char* d = cmd.data();
632 int l = strlen(d);
633 Edit_SetText(a_window,d);
634 Edit_SetSel(a_window,l,l);
635 }
636
637 }break;
638 case VK_UP:{
639 G4UIWin32* This = (G4UIWin32*)::GetWindowLongPtr(
640 GetParent(a_window),GWLP_USERDATA);
641 if(This!=NULL) {
642 int pos = This->fHistoryPos== -1 ?
643 This->fHistory.size()-1 : This->fHistoryPos-1;
644 if((pos>=0)&&(pos<(int)This->fHistory.size())) {
645 G4String command = This->fHistory[pos];
646 const char* d = command.data();
647 int l = strlen(d);
648 Edit_SetText(a_window,d);
649 Edit_SetSel(a_window,l,l);
650 //
651 This->fHistoryPos = pos;
652 }
653 }
654 }return 0; //Do not jump into oldEditProc.
655 case VK_DOWN:{
656 G4UIWin32* This = (G4UIWin32*)::GetWindowLongPtr(
657 GetParent(a_window),GWLP_USERDATA);
658 if(This!=NULL) {
659 int pos = This->fHistoryPos + 1;
660 if((pos>=0)&&(pos<(int)This->fHistory.size())) {
661 G4String command = This->fHistory[pos];
662 const char* d = command.data();
663 int l = strlen(d);
664 Edit_SetText(a_window,d);
665 Edit_SetSel(a_window,l,l);
666 //
667 This->fHistoryPos = pos;
668 } else if(pos>=(int)This->fHistory.size()) {
669 Edit_SetText(a_window,"");
670 Edit_SetSel(a_window,0,0);
671 //
672 This->fHistoryPos = -1;
673 }
674 }
675 }return 0; //Do not jump into oldEditProc.
676 }
677 }
678 return CallWindowProc(oldEditWindowProc,
679 a_window,a_message,
680 a_wParam,a_lParam);
681}
682/***************************************************************************/
683void G4UIWin32::TextAppendString (
684 char* a_string
685)
686/***************************************************************************/
687/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
688{
689 if( (a_string==NULL) || (a_string[0]=='\0') ) return;
690 if(textWindow==NULL) return;
691 if(((TextBuffer*)textBuffer)->AppendString(a_string)==true) {
692 // The appending triggers and end of line, and then updates window :
693 RECT rect;
694 GetClientRect(textWindow,&rect);
695 InvalidateRect(textWindow,NULL,TRUE); //To erase background.
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);
702 }
703}
704//////////////////////////////////////////////////////////////////////////////
705G4bool ConvertStringToInt(
706 const char* aString
707,int& aInt
708)
709//////////////////////////////////////////////////////////////////////////////
710//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
711{
712 aInt = 0;
713 if(aString==NULL) return false;
714 char* s;
715 long value = strtol(aString,&s,10);
716 if(s==aString) return false;
717 aInt = value;
718 return true;
719}
720
721
722#endif
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
void * G4Interactor
@ trailing
Definition: G4String.hh:112
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 TRUE
Definition: globals.hh:55
#define FALSE
Definition: globals.hh:52
#define buffer
Definition: xmlparse.cc:611
#define const
Definition: zconf.h:118