summaryrefslogtreecommitdiff
path: root/src/Draw/CommandWindow.cxx
blob: ac1798369e277b9cbaf4a0ae26f651159ded79fb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
// File:	CommandWindow.cxx
// Created:	Thu Aug  6 09:59:19 1998
// Author:	Administrateur Atelier MDL
//		<mdl@efalakox.paris1.matra-dtv.fr>



#ifdef WNT
#include <windows.h>

#define COMMANDCLASS "COMMANDWINDOW"
#define COMMANDTITLE "Command Window"

#include <CommandWindow.h>
#include <Draw_Window.hxx>
#include <MainWindow.h>
#include <Draw_Appli.hxx>


/****************************************************\
*  CommandWindow.cxx :
*
\****************************************************/



Standard_Boolean Draw_Interprete(char*); // Implemente dans draw.cxx

#define CLIENTWND 0

#define PROMPT "Command >> "
#define COMMANDSIZE 1000 // Nb caracteres maximun pour un commande


// Definition des varaibles globales
#ifdef STRICT
  WNDPROC OldEditProc;  // Sauvegarde la procedure standard de la fenetre d'edition (Sous Classement)
#else
  FARPROC OldEditProc;
#endif

/*--------------------------------------------------------*\
|  CREATE COMMAND WINDOW PROCEDURE
\*--------------------------------------------------------*/
HWND CreateCommandWindow(HWND hWnd, int nitem)
{
  HINSTANCE       hInstance;
  
#ifndef _WIN64
  hInstance = (HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE);
#else
  hInstance = (HINSTANCE)GetWindowLong(hWnd,GWLP_HINSTANCE);
#endif
	HWND hWndCommand = (CreateWindow(COMMANDCLASS, COMMANDTITLE,
			    												WS_CLIPCHILDREN | WS_OVERLAPPED |
			    												WS_THICKFRAME | WS_CAPTION	,
			    												0, 0,
			    												400, 100,
			    												hWnd, NULL, hInstance, NULL));

	ShowWindow(hWndCommand, SW_SHOW);	
	return hWndCommand;
}


/*--------------------------------------------------------*\
|  COMMAND WINDOW PROCEDURE
\*--------------------------------------------------------*/
LONG APIENTRY CommandProc(HWND hWnd, UINT wMsg, WPARAM wParam, LONG lParam )
{
  HWND hWndEdit;
  int index; // Nombre de caractere dans le buffer de hWndEdit
  MINMAXINFO* lpmmi;

  switch(wMsg)
  {
    case WM_CREATE :
					CommandCreateProc(hWnd);
					hWndEdit = (HWND)GetWindowLong(hWnd, CLIENTWND);
					SendMessage(hWndEdit,EM_REPLACESEL, 0,(LPARAM)PROMPT);
					break;

    case WM_GETMINMAXINFO :
          lpmmi = (LPMINMAXINFO)lParam;
          lpmmi->ptMinTrackSize.x = 200;
          lpmmi->ptMinTrackSize.y = 50;           
          break;

    case WM_SIZE :
    			hWndEdit = (HWND)GetWindowLong(hWnd, CLIENTWND);          
    			MoveWindow(hWndEdit, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);
            // Place le curseur a la fin du buffer
          index = (int) SendMessage(hWnd, WM_GETTEXTLENGTH, 0l, 0l);
          SendMessage(hWnd, EM_SETSEL, index, index); 
    			break;

    case WM_SETFOCUS :
    			hWndEdit = (HWND)GetWindowLong(hWnd, CLIENTWND);
          SetFocus(hWndEdit);
          break;

    default :
					return LONG(DefWindowProc(hWnd, wMsg, wParam, lParam));
  }
  return(0l);
}



LONG APIENTRY EditProc(HWND, UINT, WPARAM, LONG);
/*--------------------------------------------------------*\
|  COMMAND CREATE PROCEDURE
\*--------------------------------------------------------*/
BOOL CommandCreateProc(HWND hWnd)
{

#ifndef _WIN64
  HINSTANCE hInstance = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE);
#else
  HINSTANCE hInstance = (HINSTANCE)GetWindowLong(hWnd, GWLP_HINSTANCE);
#endif
  HWND hWndEdit = CreateWindow("EDIT",NULL,
  			  WS_CHILD | WS_VISIBLE | WS_VSCROLL |
  			  ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL,
  			  0, 0, 0, 0,
  			  hWnd, 0,
  			  hInstance, NULL);

    // Enregistrement hWndEdit deans l'extra memory en 0 de CommandWindow
  if (hWndEdit)
    SetWindowLong(hWnd, CLIENTWND, (LONG)hWndEdit);

    // Sous Classement de la fenetre
    //-------
    // Sauvegarde du pointeur sur la procedure existante
  #ifdef STRICT
   #ifndef _WIN64
    OldEditProc = (WNDPROC)GetWindowLong(hWndEdit, GWL_WNDPROC);
   #else
    OldEditProc = (WNDPROC)GetWindowLong(hWndEdit, GWLP_WNDPROC);
   #endif // _WIN64
  #else
    OldEditProc = (FARPROC)GetWindowLong(hWndEdit, GWL_WNDPROC);
  #endif
    // Mise en place de la nouvelle fonction
#ifndef _WIN64
  SetWindowLong(hWndEdit, GWL_WNDPROC, (LONG) EditProc);
#else
  SetWindowLong(hWndEdit, GWLP_WNDPROC, (LONG) EditProc);
#endif
  return(TRUE);
}


/*--------------------------------------------------------*\
|  GET COMMAND
|    
\*--------------------------------------------------------*/
int GetCommand(HWND hWnd, char* buffer)
{
  int again = 1;
  char temp[COMMANDSIZE]="";

  int nbLine = (int)SendMessage(hWnd, EM_GETLINECOUNT, 0l, 0l);
  
  int nbChar = 0;
  buffer[0]='\0';
  while ( again && nbLine > -1 && nbChar < COMMANDSIZE-1)
    {
      strcat(buffer, strrev(temp));
      // Initialisation du 1er WORD de temp au nombre de caracteres a lire 
      WORD* nbMaxChar = (WORD*)temp;
      *nbMaxChar = COMMANDSIZE-1;
      
      int nbCharRead = (int)SendMessage(hWnd, EM_GETLINE, nbLine-1, (LPARAM)temp);
      nbChar += nbCharRead ;
      int cmp = strncmp(temp, PROMPT, 10);
      temp[nbCharRead]='\0';
      if( cmp == 0 )
	{
	  strcat(buffer, strrev(temp));
	  again = 0;
	}
      nbLine -= 1;
    }	
  strrev(buffer);
  return nbChar;
}

extern console_semaphore_value volatile console_semaphore;
extern char console_command[1000];

/*--------------------------------------------------------*\
|  EDIT WINDOW PROCEDURE
\*--------------------------------------------------------*/
LONG APIENTRY EditProc(HWND hWnd, UINT wMsg, WPARAM wParam, LONG lParam )
{
  char buffer[COMMANDSIZE];	
	POINT pos;
	BOOL rep;
	static int nbline; // Taille du buffer de la fenetre d`edition 
  int index;
    
  switch(wMsg)
  {
  case WM_CHAR :
    if (console_semaphore != WAIT_CONSOLE_COMMAND)
      return 0l;
    			switch(LOWORD(wParam))
    			{
              // Surcharge du caractere \n
    	  		case 0x0d :    	      
									GetCommand(hWnd, buffer);									
    	      			  // Traitement standard
			    	      CallWindowProc(OldEditProc, hWnd, wMsg, wParam, lParam);
    				        // Affichage du PROMPT
									rep = GetCaretPos(&pos);
    	      			SendMessage(hWnd, EM_REPLACESEL, 0, (LPARAM)PROMPT);							
                    // Affiche la commande dans la console
                  cout << buffer << endl; 
									/*if (Draw_Interprete(buffer+strlen(PROMPT))== -2)
									    DestroyProc(hWnd); */ 
									strcpy(console_command, buffer+strlen(PROMPT));
									console_semaphore = HAS_CONSOLE_COMMAND;
									  // Purge du buffer
                  nbline = (int)SendMessage(hWnd, EM_GETLINECOUNT, 0l, 0l);
									if(nbline > 200)
									{
                      nbline = 0;
											GetCommand(hWnd, buffer);
                      index = (int)SendMessage(hWnd, EM_LINEINDEX, 100, 0);
											SendMessage(hWnd, EM_SETSEL, 0, index);			
											SendMessage(hWnd, WM_CUT, 0, 0);
                        // Place le curseur en fin de text
                      index =  (int)SendMessage(hWnd, WM_GETTEXTLENGTH, 0l, 0l);
                      SendMessage(hWnd, EM_SETSEL, index, index);                      
									}
    				      return(0l);
    	      			break;
                default :
                  if (IsAlphanumeric((Standard_Character)LOWORD(wParam)))
                  {
                      // Place le curseur en fin de texte avant affichage
                    index =  (int)SendMessage(hWnd, WM_GETTEXTLENGTH, 0l, 0l);
                    SendMessage(hWnd, EM_SETSEL, index, index);
                    CallWindowProc(OldEditProc, hWnd, wMsg, wParam, lParam);                    
                    return 0l;
                  }                  
                  break;
    			}       
    			break;
  case WM_KEYDOWN:
    if (console_semaphore != WAIT_CONSOLE_COMMAND) 
      return 0l;									
  }
  return (LONG)CallWindowProc(OldEditProc, hWnd, wMsg, wParam, lParam);
}
#endif