1 // File: CommandWindow.cxx
2 // Created: Thu Aug 6 09:59:19 1998
3 // Author: Administrateur Atelier MDL
4 // <mdl@efalakox.paris1.matra-dtv.fr>
11 #define COMMANDCLASS "COMMANDWINDOW"
12 #define COMMANDTITLE "Command Window"
14 #include <CommandWindow.h>
15 #include <Draw_Window.hxx>
16 #include <MainWindow.h>
17 #include <Draw_Appli.hxx>
21 /****************************************************\
24 \****************************************************/
28 Standard_Boolean Draw_Interprete(char*); // Implemente dans draw.cxx
32 #define PROMPT "Command >> "
33 #define COMMANDSIZE 1000 // Nb caracteres maximun pour un commande
36 // Definition des varaibles globales
38 WNDPROC OldEditProc; // Sauvegarde la procedure standard de la fenetre d'edition (Sous Classement)
43 /*--------------------------------------------------------*\
44 | CREATE COMMAND WINDOW PROCEDURE
45 \*--------------------------------------------------------*/
46 HWND CreateCommandWindow(HWND hWnd, int nitem)
51 hInstance = (HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE);
53 hInstance = (HINSTANCE)GetWindowLong(hWnd,GWLP_HINSTANCE);
55 HWND hWndCommand = (CreateWindow(COMMANDCLASS, COMMANDTITLE,
56 WS_CLIPCHILDREN | WS_OVERLAPPED |
57 WS_THICKFRAME | WS_CAPTION ,
60 hWnd, NULL, hInstance, NULL));
62 ShowWindow(hWndCommand, SW_SHOW);
67 /*--------------------------------------------------------*\
68 | COMMAND WINDOW PROCEDURE
69 \*--------------------------------------------------------*/
70 LONG APIENTRY CommandProc(HWND hWnd, UINT wMsg, WPARAM wParam, LONG lParam )
73 int index; // Nombre de caractere dans le buffer de hWndEdit
79 CommandCreateProc(hWnd);
80 hWndEdit = (HWND)GetWindowLong(hWnd, CLIENTWND);
81 SendMessage(hWndEdit,EM_REPLACESEL, 0,(LPARAM)PROMPT);
84 case WM_GETMINMAXINFO :
85 lpmmi = (LPMINMAXINFO)lParam;
86 lpmmi->ptMinTrackSize.x = 200;
87 lpmmi->ptMinTrackSize.y = 50;
91 hWndEdit = (HWND)GetWindowLong(hWnd, CLIENTWND);
92 MoveWindow(hWndEdit, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);
93 // Place le curseur a la fin du buffer
94 index = SendMessage(hWnd, WM_GETTEXTLENGTH, 0l, 0l);
95 SendMessage(hWnd, EM_SETSEL, index, index);
99 hWndEdit = (HWND)GetWindowLong(hWnd, CLIENTWND);
104 return(DefWindowProc(hWnd, wMsg, wParam, lParam));
111 LONG APIENTRY EditProc(HWND, UINT, WPARAM, LONG);
112 /*--------------------------------------------------------*\
113 | COMMAND CREATE PROCEDURE
114 \*--------------------------------------------------------*/
115 BOOL CommandCreateProc(HWND hWnd)
119 HINSTANCE hInstance = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE);
121 HINSTANCE hInstance = (HINSTANCE)GetWindowLong(hWnd, GWLP_HINSTANCE);
123 HWND hWndEdit = CreateWindow("EDIT",NULL,
124 WS_CHILD | WS_VISIBLE | WS_VSCROLL |
125 ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL,
130 // Enregistrement hWndEdit deans l'extra memory en 0 de CommandWindow
132 SetWindowLong(hWnd, CLIENTWND, (LONG)hWndEdit);
134 // Sous Classement de la fenetre
136 // Sauvegarde du pointeur sur la procedure existante
139 OldEditProc = (WNDPROC)GetWindowLong(hWndEdit, GWL_WNDPROC);
141 OldEditProc = (WNDPROC)GetWindowLong(hWndEdit, GWLP_WNDPROC);
144 OldEditProc = (FARPROC)GetWindowLong(hWndEdit, GWL_WNDPROC);
146 // Mise en place de la nouvelle fonction
148 SetWindowLong(hWndEdit, GWL_WNDPROC, (LONG) EditProc);
150 SetWindowLong(hWndEdit, GWLP_WNDPROC, (LONG) EditProc);
156 /*--------------------------------------------------------*\
159 \*--------------------------------------------------------*/
160 int GetCommand(HWND hWnd, char* buffer)
163 char temp[COMMANDSIZE]="";
165 int nbLine = SendMessage(hWnd, EM_GETLINECOUNT, 0l, 0l);
169 while ( again && nbLine > -1 && nbChar < COMMANDSIZE-1)
171 strcat(buffer, strrev(temp));
172 // Initialisation du 1er WORD de temp au nombre de caracteres a lire
173 WORD* nbMaxChar = (WORD*)temp;
174 *nbMaxChar = COMMANDSIZE-1;
176 int nbCharRead = SendMessage(hWnd, EM_GETLINE, nbLine-1, (LPARAM)temp);
177 nbChar += nbCharRead ;
178 int cmp = strncmp(temp, PROMPT, 10);
179 temp[nbCharRead]='\0';
182 strcat(buffer, strrev(temp));
191 extern console_semaphore_value volatile console_semaphore;
192 extern char console_command[1000];
194 /*--------------------------------------------------------*\
195 | EDIT WINDOW PROCEDURE
196 \*--------------------------------------------------------*/
197 LONG APIENTRY EditProc(HWND hWnd, UINT wMsg, WPARAM wParam, LONG lParam )
199 char buffer[COMMANDSIZE];
202 static int nbline; // Taille du buffer de la fenetre d`edition
208 if (console_semaphore != WAIT_CONSOLE_COMMAND)
210 switch(LOWORD(wParam))
212 // Surcharge du caractere \n
214 GetCommand(hWnd, buffer);
215 // Traitement standard
216 CallWindowProc(OldEditProc, hWnd, wMsg, wParam, lParam);
217 // Affichage du PROMPT
218 rep = GetCaretPos(&pos);
219 SendMessage(hWnd, EM_REPLACESEL, 0, (LPARAM)PROMPT);
220 // Affiche la commande dans la console
221 cout << buffer << endl;
222 /*if (Draw_Interprete(buffer+strlen(PROMPT))== -2)
223 DestroyProc(hWnd); */
224 strcpy(console_command, buffer+strlen(PROMPT));
225 console_semaphore = HAS_CONSOLE_COMMAND;
227 nbline = SendMessage(hWnd, EM_GETLINECOUNT, 0l, 0l);
231 GetCommand(hWnd, buffer);
232 index = SendMessage(hWnd, EM_LINEINDEX, 100, 0);
233 SendMessage(hWnd, EM_SETSEL, 0, index);
234 SendMessage(hWnd, WM_CUT, 0, 0);
235 // Place le curseur en fin de text
236 index = SendMessage(hWnd, WM_GETTEXTLENGTH, 0l, 0l);
237 SendMessage(hWnd, EM_SETSEL, index, index);
242 if (IsAlphanumeric((Standard_Character)LOWORD(wParam)))
244 // Place le curseur en fin de texte avant affichage
245 index = SendMessage(hWnd, WM_GETTEXTLENGTH, 0l, 0l);
246 SendMessage(hWnd, EM_SETSEL, index, index);
247 CallWindowProc(OldEditProc, hWnd, wMsg, wParam, lParam);
254 if (console_semaphore != WAIT_CONSOLE_COMMAND)
257 return CallWindowProc(OldEditProc, hWnd, wMsg, wParam, lParam);