00001
00002
00003
00004
00005 #include "WndConsoleTextProc.h"
00006
00007
00008 #define VK_V 86
00009 #define VK_C 67
00010 #ifndef WM_MOUSEWHEEL
00011 #define WM_MOUSEWHEEL 0x020A
00012 #endif
00013
00014 extern BOOL HasAZoneTextSelected(LPTW lptw);
00015 extern void TextCopyClip(LPTW lptw);
00016 extern int StoreCommand1 (char *command,int flag);
00017 extern void ClearCommandWindow(LPTW lptw,BOOL Clearfirstline);
00018 extern void ToolBarOnOff(LPTW lptw);
00019 extern void ResetMenu(void);
00020 extern void SwitchConsole(void);
00021 extern BOOL IsEmptyClipboard(LPTW lptw);
00022 extern void PasteFunction(LPTW lptw,BOOL special);
00023 extern void ClearMark (LPTW lptw, POINT pt);
00024 extern void UpdateMark (LPTW lptw, POINT pt);
00025 extern void LimitMark (LPTW lptw, POINT FAR * lppt);
00026 extern void CreateThreadPaste(char *Text);
00027 extern void SendMacro (LPTW lptw, UINT m);
00028 extern void TextSelectFont (LPTW lptw);
00029 extern void WriteRegistryTxt (LPTW lptw);
00030 extern void SaveCurrentLine(BOOL RewriteLineAtPrompt);
00031 extern void HelpOn(LPTW lptw);
00032 extern void PrintSelectionGUI(LPTW lptw,char *Entete);
00033 extern void OpenSelection(LPTW lptw);
00034 extern void CutSelection(LPTW lptw);
00035 extern void EvaluateSelection(LPTW lptw);
00036 extern void SelectAll(LPTW lptw,BOOL DoAMark);
00037 extern void InitIhmDefaultColor(void);
00038 extern BOOL SetIhmSystemDefaultTextBackgroundColor(void);
00039 extern HDC TryToGetDC(HWND hWnd);
00040 extern void TextMakeFont (LPTW lptw);
00041 extern void DoLine(LPTW lptw, HDC hdc, int xpos, int ypos, int offset, int count);
00042 extern void ResizeScreenBuffer(LPTW lptw);
00043 extern BOOL SetIhmSystemDefaultTextColor(void);
00044 extern LPTW GetTextWinScilab(void);
00045 extern BOOL ActivateTransparencyMode(HWND hWnd);
00046 extern void IncreaseAlphaLevel(void);
00047 extern void DecreaseAlphaLevel(void);
00048 extern int C2F (scilines) (int *nl, int *nc);
00049 extern void ExitWindow(void);
00050 extern BOOL IsEnableTransparencyMode(void);
00051
00052 BOOL ON_WND_TEXT_WM_CLOSE(HWND hwnd);
00053 BOOL ON_WND_TEXT_WM_DESTROY(HWND hwnd);
00054 BOOL ON_WND_TEXT_WM_CREATE(HWND hwnd,LPCREATESTRUCT lpCreateStruct);
00055 BOOL ON_WND_TEXT_WM_PAINT(HWND hwnd);
00056 BOOL ON_WND_TEXT_WM_SYSCOLORCHANGE(HWND hwnd);
00057 BOOL ON_WND_TEXT_WM_COMMAND(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify);
00058 void ON_WND_TEXT_WM_CHAR(HWND hwnd, TCHAR ch, int cRepeat);
00059 void ON_WND_TEXT_WM_SETTEXT(HWND hwnd, LPCTSTR lpszText);
00060 void ON_WND_TEXT_WM_MOUSEMOVE(HWND hwnd, int x, int y, UINT keyFlags);
00061 void ON_WND_TEXT_WM_LBUTTONUP(HWND hwnd, int x, int y, UINT keyFlags);
00062 void ON_WND_TEXT_WM_LBUTTONDOWN(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags);
00063 void ON_WND_TEXT_WM_MBUTTONUP(HWND hwnd, int x, int y, UINT keyFlags);
00064 void ON_WND_TEXT_WM_RBUTTONDOWN(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags);
00065 void ON_WND_TEXT_WM_KEY(HWND hwnd, UINT vk, BOOL fDown, int cRepeat, UINT flags);
00066 void ON_WND_TEXT_WM_VSCROLL(HWND hwnd, HWND hwndCtl, UINT code, int pos);
00067 void ON_WND_TEXT_WM_HSCROLL(HWND hwnd, HWND hwndCtl, UINT code, int pos);
00068 void ON_WND_TEXT_WM_MOUSEWHEEL(HWND hwnd, int xPos, int yPos, int zDelta, UINT fwKeys);
00069 void ON_WND_TEXT_WM_SIZE(HWND hwnd, UINT state, int cx, int cy);
00070 void ON_WND_TEXT_WM_KILLFOCUS(HWND hwnd, HWND hwndNewFocus);
00071 void ON_WND_TEXT_WM_SETFOCUS(HWND hwnd, HWND hwndOldFocus);
00072 BOOL ON_WND_TEXT_WM_SETCURSOR(HWND hwnd, HWND hwndCursor, UINT codeHitTest, UINT msg);
00073
00074 #if (_MSC_VER >= 1200) && (_MSC_VER < 1300)
00075
00076 #ifndef HANDLE_WM_MOUSEWHEEL
00077 #define HANDLE_WM_MOUSEWHEEL(hwnd, wParam, lParam, fn) \
00078 ((fn)((hwnd), (int)(short)LOWORD(lParam), (int)(short)HIWORD(lParam), (int)(short)HIWORD(wParam), (UINT)(short)LOWORD(wParam)), 0L)
00079 #endif
00080
00081 #endif
00082
00083
00084 EXPORT LRESULT CALLBACK WndTextProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
00085 {
00086 switch (message)
00087 {
00088 HANDLE_MSG(hwnd,WM_SETCURSOR,ON_WND_TEXT_WM_SETCURSOR);
00089 HANDLE_MSG(hwnd,WM_SETFOCUS,ON_WND_TEXT_WM_SETFOCUS);
00090 HANDLE_MSG(hwnd,WM_KILLFOCUS,ON_WND_TEXT_WM_KILLFOCUS);
00091 HANDLE_MSG(hwnd,WM_SIZE,ON_WND_TEXT_WM_SIZE);
00092 HANDLE_MSG(hwnd,WM_MOUSEWHEEL,ON_WND_TEXT_WM_MOUSEWHEEL);
00093 HANDLE_MSG(hwnd,WM_HSCROLL,ON_WND_TEXT_WM_HSCROLL);
00094 HANDLE_MSG(hwnd,WM_VSCROLL,ON_WND_TEXT_WM_VSCROLL);
00095 HANDLE_MSG(hwnd,WM_KEYDOWN,ON_WND_TEXT_WM_KEY);
00096 HANDLE_MSG(hwnd,WM_RBUTTONDOWN,ON_WND_TEXT_WM_RBUTTONDOWN);
00097 HANDLE_MSG(hwnd,WM_MBUTTONUP,ON_WND_TEXT_WM_MBUTTONUP);
00098 HANDLE_MSG(hwnd,WM_LBUTTONDOWN,ON_WND_TEXT_WM_LBUTTONDOWN);
00099 HANDLE_MSG(hwnd,WM_LBUTTONUP,ON_WND_TEXT_WM_LBUTTONUP);
00100 HANDLE_MSG(hwnd,WM_MOUSEMOVE,ON_WND_TEXT_WM_MOUSEMOVE);
00101 HANDLE_MSG(hwnd,WM_SETTEXT,ON_WND_TEXT_WM_SETTEXT);
00102 HANDLE_MSG(hwnd,WM_COMMAND,ON_WND_TEXT_WM_COMMAND);
00103 HANDLE_MSG(hwnd,WM_SYSCOLORCHANGE,ON_WND_TEXT_WM_SYSCOLORCHANGE);
00104 HANDLE_MSG(hwnd,WM_PAINT,ON_WND_TEXT_WM_PAINT);
00105 HANDLE_MSG(hwnd,WM_CREATE,ON_WND_TEXT_WM_CREATE);
00106 HANDLE_MSG(hwnd,WM_DESTROY,ON_WND_TEXT_WM_DESTROY);
00107 HANDLE_MSG(hwnd,WM_CLOSE,ON_WND_TEXT_WM_CLOSE);
00108 HANDLE_MSG(hwnd,WM_CHAR,ON_WND_TEXT_WM_CHAR);
00109 }
00110
00111 return DefWindowProc (hwnd, message, wParam, lParam);
00112 }
00113
00114 BOOL ON_WND_TEXT_WM_CLOSE(HWND hwnd)
00115 {
00116 ExitWindow();
00117 return TRUE;
00118 }
00119
00120 BOOL ON_WND_TEXT_WM_DESTROY(HWND hwnd)
00121 {
00122 LPTW lptw=GetTextWinScilab();
00123 DeleteObject(lptw->hbrBackground);
00124 return TRUE;
00125 }
00126
00127 BOOL ON_WND_TEXT_WM_CREATE(HWND hwnd,LPCREATESTRUCT lpCreateStruct)
00128 {
00129 TEXTMETRIC tm;
00130 HDC hdc;
00131 LPTW lptw = lpCreateStruct->lpCreateParams;
00132
00133 SetWindowLong (hwnd, 0, (LONG) lptw);
00134 lptw->hWndText = hwnd;
00135 TextMakeFont (lptw);
00136 hdc = (HDC)TryToGetDC (hwnd);
00137 SelectFont (hdc, lptw->hfont);
00138 GetTextMetrics (hdc, (LPTEXTMETRIC) & tm);
00139 lptw->CharSize.y = tm.tmHeight;
00140 lptw->CharSize.x = tm.tmAveCharWidth;
00141 lptw->CharAscent = tm.tmAscent;
00142 ReleaseDC (hwnd, hdc);
00143
00144 return TRUE;
00145 }
00146
00147 BOOL ON_WND_TEXT_WM_PAINT(HWND hwnd)
00148 {
00149 HDC hdc;
00150 PAINTSTRUCT ps;
00151 RECT rect;
00152 LPTW lptw=GetTextWinScilab();
00153
00154 POINT source, width, dest;
00155 POINT MarkBegin, MarkEnd;
00156
00157 if (TextWhereY(lptw)+50 > lptw->ScreenSize.y) ResizeScreenBuffer(lptw);
00158
00159 hdc = BeginPaint (hwnd, &ps);
00160 GetClientRect (hwnd, &rect);
00161 FillRect (hdc, &rect, lptw->hbrBackground);
00162 if (ps.fErase) FillRect (hdc, &ps.rcPaint, lptw->hbrBackground);
00163
00164 SelectFont (hdc, lptw->hfont);
00165 SetMapMode (hdc, MM_TEXT);
00166 SetBkMode (hdc, OPAQUE);
00167 GetClientRect (hwnd, &rect);
00168 source.x = (rect.left + lptw->ScrollPos.x) / lptw->CharSize.x;
00169 source.y = (rect.top + lptw->ScrollPos.y) / lptw->CharSize.y;
00170 dest.x = source.x * lptw->CharSize.x - lptw->ScrollPos.x;
00171 dest.y = source.y * lptw->CharSize.y - lptw->ScrollPos.y;
00172 width.x = ((rect.right + lptw->ScrollPos.x + lptw->CharSize.x - 1) / lptw->CharSize.x) - source.x;
00173 width.y = ((rect.bottom + lptw->ScrollPos.y + lptw->CharSize.y - 1) / lptw->CharSize.y) - source.y;
00174
00175 if (source.x < 0) source.x = 0;
00176 if (source.y < 0) source.y = 0;
00177 if (source.x + width.x > lptw->ScreenSize.x) width.x = lptw->ScreenSize.x - source.x;
00178 if (source.y + width.y > lptw->ScreenSize.y) width.y = lptw->ScreenSize.y - source.y;
00179
00180 if ((lptw->ScreenSize.x * lptw->MarkBegin.y + lptw->MarkBegin.x) >
00181 (lptw->ScreenSize.x * lptw->MarkEnd.y + lptw->MarkEnd.x))
00182 {
00183 MarkBegin.x = lptw->MarkEnd.x;
00184 MarkBegin.y = lptw->MarkEnd.y;
00185 MarkEnd.x = lptw->MarkBegin.x;
00186 MarkEnd.y = lptw->MarkBegin.y;
00187 }
00188 else
00189 {
00190 MarkBegin.x = lptw->MarkBegin.x;
00191 MarkBegin.y = lptw->MarkBegin.y;
00192 MarkEnd.x = lptw->MarkEnd.x;
00193 MarkEnd.y = lptw->MarkEnd.y;
00194 }
00195
00196 while (width.y > 0)
00197 {
00198 if ((source.y >= MarkBegin.y) && (source.y <= MarkEnd.y))
00199 {
00200 int start, end;
00201 int count, offset;
00202
00203 if (source.y == MarkBegin.y) start = MarkBegin.x;
00204 else start = 0;
00205
00206 if (source.y == MarkEnd.y) end = MarkEnd.x;
00207 else end = lptw->ScreenSize.x;
00208
00209
00210 offset = 0;
00211 count = start - source.x;
00212 if (count > 0) DoLine (lptw, hdc, dest.x, dest.y,source.y * lptw->ScreenSize.x + source.x, count);
00213
00214
00215 offset += count;
00216 count = end - start;
00217 if ((count > 0) && (offset < width.x))
00218 {
00219 SetTextColor (hdc, GetSysColor (COLOR_HIGHLIGHTTEXT));
00220 SetBkColor (hdc, GetSysColor (COLOR_HIGHLIGHT));
00221
00222 TextOut (hdc, dest.x + lptw->CharSize.x * offset, dest.y,
00223 (LPSTR) (lptw->ScreenBuffer + source.y * lptw->ScreenSize.x
00224 + source.x + offset), count);
00225 }
00226
00227
00228 offset += count;
00229 count = width.x + source.x - end;
00230 if ((count > 0) && (offset < width.x)) DoLine (lptw, hdc, dest.x + lptw->CharSize.x * offset, dest.y,
00231 source.y * lptw->ScreenSize.x + source.x + offset, count);
00232 }
00233 else
00234 {
00235 DoLine (lptw, hdc, dest.x, dest.y,source.y * lptw->ScreenSize.x + source.x, width.x);
00236 }
00237 dest.y += lptw->CharSize.y;
00238 source.y++;
00239 width.y--;
00240 }
00241 EndPaint (hwnd, &ps);
00242
00243 return TRUE;
00244 }
00245
00246 BOOL ON_WND_TEXT_WM_SYSCOLORCHANGE(HWND hwnd)
00247 {
00248 LPTW lptw=GetTextWinScilab();
00249
00250 if (lptw->bSysColors)
00251 {
00252 InitIhmDefaultColor();
00253 SetIhmSystemDefaultTextBackgroundColor();
00254 SetIhmSystemDefaultTextColor();
00255 }
00256 return TRUE;
00257 }
00258
00259 BOOL ON_WND_TEXT_WM_COMMAND(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
00260 {
00261 LPTW lptw=GetTextWinScilab();
00262
00263 if (id < NUMMENU) SendMacro (lptw, id);
00264 else
00265 switch (id)
00266 {
00267 case M_COPY_CLIP:
00268 {
00269 TextCopyClip (lptw);
00270 }
00271 break;
00272
00273 case M_PASTE:
00274 {
00275 PasteFunction(lptw,FALSE);
00276 }
00277 break;
00278
00279 case M_SPECIALPASTE:
00280 {
00281 PasteFunction(lptw,TRUE);
00282 }
00283 break;
00284
00285 case M_CHOOSE_FONT:
00286 {
00287 TextSelectFont (lptw);
00288 }
00289 break;
00290
00291 case M_WRITEINI:
00292 {
00293 WriteRegistryTxt (lptw);
00294 }
00295 break;
00296
00297 case M_ABOUT:
00298 {
00299 AboutBox (hwnd);
00300 }
00301 break;
00302
00303 case M_HELPON:
00304 {
00305 SaveCurrentLine(TRUE);
00306 HelpOn(lptw);
00307 }
00308 break;
00309
00310 case M_PRINTSELECTION:
00311 {
00312 TextCopyClip (lptw);
00313 if (lptw->lpmw->CodeLanguage == 0)
00314 {
00315 PrintSelectionGUI(lptw,MSG_SCIMSG44);
00316 }
00317 else
00318 {
00319 PrintSelectionGUI(lptw,MSG_SCIMSG45);
00320 }
00321 }
00322 break;
00323
00324 case M_OPENSELECTION:
00325 {
00326 SaveCurrentLine(TRUE);
00327 OpenSelection(lptw);
00328 }
00329 break;
00330
00331 case M_CUT:
00332 {
00333 CutSelection(lptw);
00334 }
00335 break;
00336
00337 case M_EVALSELECTION:
00338 {
00339 EvaluateSelection(lptw);
00340 }
00341 break;
00342
00343 case M_SELECT_ALL:
00344 {
00345 SelectAll(lptw,TRUE);
00346 }
00347 break;
00348
00349 }
00350 return TRUE;
00351 }
00352
00353 void ON_WND_TEXT_WM_CHAR(HWND hwnd, TCHAR ch, int cRepeat)
00354 {
00355 LPTW lptw=GetTextWinScilab();
00356 long count=0;
00357
00358 count = lptw->KeyBufIn - lptw->KeyBufOut;
00359
00360 if (count < 0) count = count+ lptw->KeyBufSize;
00361
00362 if (count < (long)lptw->KeyBufSize-2)
00363 {
00364 if (ch==10) ch=13;
00365 *lptw->KeyBufIn++ = ch;
00366
00367 if (lptw->KeyBufIn - lptw->KeyBuf >= (signed)lptw->KeyBufSize) lptw->KeyBufIn = lptw->KeyBuf;
00368 }
00369 }
00370
00371 void ON_WND_TEXT_WM_SETTEXT(HWND hwnd, LPCTSTR lpszText)
00372 {
00373 CreateThreadPaste((char*)lpszText);
00374 }
00375
00376 void ON_WND_TEXT_WM_MOUSEMOVE(HWND hwnd, int x, int y, UINT keyFlags)
00377 {
00378 LPTW lptw=GetTextWinScilab();
00379
00380 if ((keyFlags & MK_LBUTTON) && lptw->Marking)
00381 {
00382 RECT rect;
00383 POINT pt;
00384 pt.x = x;
00385 pt.y = y;
00386
00387 GetClientRect (hwnd, &rect);
00388 if (PtInRect (&rect, pt))
00389 {
00390 pt.x = (pt.x + lptw->ScrollPos.x) / lptw->CharSize.x;
00391 pt.y = (pt.y + lptw->ScrollPos.y) / lptw->CharSize.y;
00392 UpdateMark (lptw, pt);
00393 }
00394 else
00395 {
00396 int nXinc;
00397 int nYinc;
00398 do
00399 {
00400 nXinc = 0;
00401 nYinc = 0;
00402 if (pt.x > rect.right)
00403 {
00404 nXinc = lptw->CharSize.x * 4;
00405 pt.x = (rect.right + lptw->ScrollPos.x) / lptw->CharSize.x + 2;
00406 }
00407 else if (pt.x < rect.left)
00408 {
00409 nXinc = -lptw->CharSize.x * 4;
00410 pt.x = (rect.left + lptw->ScrollPos.x) / lptw->CharSize.x - 2;
00411 }
00412 else
00413 pt.x = (pt.x + lptw->ScrollPos.x) / lptw->CharSize.x;
00414 if (pt.y > rect.bottom)
00415 {
00416 nYinc = lptw->CharSize.y;
00417 pt.y = (rect.bottom + lptw->ScrollPos.y) / lptw->CharSize.y + 1;
00418 }
00419 else if (pt.y < rect.top)
00420 {
00421 nYinc = -lptw->CharSize.y;
00422 pt.y = (rect.top + lptw->ScrollPos.y) / lptw->CharSize.y - 1;
00423 }
00424 else pt.y = (pt.y + lptw->ScrollPos.y) / lptw->CharSize.y;
00425
00426 LimitMark (lptw, &pt);
00427 nXinc = max (nXinc, -lptw->ScrollPos.x);
00428 nYinc = max (nYinc, -lptw->ScrollPos.y);
00429 nYinc = min (nYinc, lptw->ScrollMax.y - lptw->ScrollPos.y);
00430 nXinc = min (nXinc, lptw->ScrollMax.x - lptw->ScrollPos.x);
00431 if (nYinc || nXinc)
00432 {
00433 lptw->ScrollPos.y += nYinc;
00434 lptw->ScrollPos.x += nXinc;
00435 ScrollWindow (lptw->hWndText, -nXinc, -nYinc, NULL, NULL);
00436 SetScrollPos (lptw->hWndText, SB_VERT, lptw->ScrollPos.y, TRUE);
00437 SetScrollPos (lptw->hWndText, SB_HORZ, lptw->ScrollPos.x, TRUE);
00438 UpdateWindow (lptw->hWndText);
00439 }
00440 UpdateMark (lptw, pt);
00441 GetCursorPos (&pt);
00442 ScreenToClient (hwnd, &pt);
00443 }
00444 while ((nYinc || nXinc) && !PtInRect (&rect, pt) && (GetAsyncKeyState (VK_LBUTTON) < 0));
00445 }
00446 }
00447 }
00448
00449 void ON_WND_TEXT_WM_LBUTTONUP(HWND hwnd, int x, int y, UINT keyFlags)
00450 {
00451 LPTW lptw=GetTextWinScilab();
00452
00453
00454
00455 ReleaseCapture ();
00456 lptw->Marking = FALSE;
00457
00458
00459
00460
00461 if ((lptw->ScreenSize.x * lptw->MarkBegin.y + lptw->MarkBegin.x) >
00462 (lptw->ScreenSize.x * lptw->MarkEnd.y + lptw->MarkEnd.x))
00463 {
00464 POINT tmp;
00465 tmp.x = lptw->MarkBegin.x;
00466 tmp.y = lptw->MarkBegin.y;
00467 lptw->MarkBegin.x = lptw->MarkEnd.x;
00468 lptw->MarkBegin.y = lptw->MarkEnd.y;
00469 lptw->MarkEnd.x = tmp.x;
00470 lptw->MarkEnd.y = tmp.y;
00471 }
00472
00473 if ( HasAZoneTextSelected(lptw) )
00474 {
00475
00476 EnableMenuItem(lptw->hPopMenu,M_COPY_CLIP,MF_ENABLED);
00477 EnableMenuItem(lptw->hPopMenu,M_HELPON,MF_ENABLED);
00478 EnableMenuItem(lptw->hPopMenu,M_PRINTSELECTION,MF_ENABLED);
00479 EnableMenuItem(lptw->hPopMenu,M_OPENSELECTION,MF_ENABLED);
00480 EnableMenuItem(lptw->hPopMenu,M_EVALSELECTION,MF_ENABLED);
00481
00482 }
00483 else
00484 {
00485
00486
00487 EnableMenuItem(lptw->hPopMenu,M_COPY_CLIP,MF_GRAYED);
00488 EnableMenuItem(lptw->hPopMenu,M_HELPON,MF_GRAYED);
00489 EnableMenuItem(lptw->hPopMenu,M_PRINTSELECTION,MF_GRAYED);
00490 EnableMenuItem(lptw->hPopMenu,M_OPENSELECTION,MF_GRAYED);
00491 EnableMenuItem(lptw->hPopMenu,M_EVALSELECTION,MF_GRAYED);
00492 }
00493 }
00494
00495 void ON_WND_TEXT_WM_LBUTTONDOWN(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags)
00496 {
00497 LPTW lptw=GetTextWinScilab();
00498 POINT pt;
00499
00500 pt.x = x;
00501 pt.y = y;
00502 pt.x = (pt.x + lptw->ScrollPos.x)/lptw->CharSize.x;
00503 pt.y = (pt.y + lptw->ScrollPos.y)/lptw->CharSize.y;
00504 ClearMark(lptw, pt);
00505 SetCapture(hwnd);
00506 lptw->Marking = TRUE;
00507 }
00508
00509 void ON_WND_TEXT_WM_MBUTTONUP(HWND hwnd, int x, int y, UINT keyFlags)
00510 {
00511 LPTW lptw=GetTextWinScilab();
00512 PasteFunction(lptw,FALSE);
00513 }
00514
00515 void ON_WND_TEXT_WM_RBUTTONDOWN(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags)
00516 {
00517 LPTW lptw=GetTextWinScilab();
00518 POINT pt;
00519 pt.x = x;
00520 pt.y = y;
00521
00522 ClientToScreen (hwnd, &pt);
00523
00524 if ( IsEmptyClipboard(lptw) )
00525 {
00526 EnableMenuItem(lptw->hPopMenu,M_PASTE,MF_GRAYED);
00527 EnableMenuItem(lptw->hPopMenu,M_SPECIALPASTE,MF_GRAYED);
00528 }
00529 else
00530 {
00531 EnableMenuItem(lptw->hPopMenu,M_PASTE,MF_ENABLED);
00532 EnableMenuItem(lptw->hPopMenu,M_SPECIALPASTE,MF_ENABLED);
00533 }
00534
00535 TrackPopupMenu (lptw->hPopMenu, TPM_LEFTALIGN, pt.x, pt.y, 0, hwnd, NULL);
00536 }
00537
00538 void ON_WND_TEXT_WM_KEY(HWND hwnd, UINT vk, BOOL fDown, int cRepeat, UINT flags)
00539 {
00540 if (GetKeyState (VK_SHIFT) < 0)
00541 {
00542 switch (vk)
00543 {
00544 case VK_UP:
00545 {
00546 }
00547 break;
00548
00549 case VK_DOWN:
00550 {
00551 }
00552 break;
00553
00554 case VK_LEFT:
00555 {
00556 }
00557 break;
00558
00559 case VK_RIGHT:
00560 {
00561 }
00562 break;
00563
00564 case VK_INSERT:
00565
00566
00567 {
00568 SendMessage (hwnd, WM_COMMAND,M_PASTE, (LPARAM) 0);
00569 }
00570 break;
00571 }
00572 }
00573 else
00574 {
00575 if (GetKeyState (VK_CONTROL) < 0)
00576 {
00577 switch (vk)
00578 {
00579 case VK_HOME:
00580 SendMessage (hwnd, WM_VSCROLL, SB_TOP, (LPARAM) 0);
00581 break;
00582 case VK_END:
00583 SendMessage (hwnd, WM_VSCROLL, SB_BOTTOM, (LPARAM) 0);
00584 break;
00585 case VK_PRIOR:
00586 SendMessage (hwnd, WM_VSCROLL, SB_PAGEUP, (LPARAM) 0);
00587 break;
00588 case VK_NEXT:
00589 SendMessage (hwnd, WM_VSCROLL, SB_PAGEDOWN, (LPARAM) 0);
00590 break;
00591 case VK_UP:
00592 SendMessage (hwnd, WM_VSCROLL, SB_LINEUP, (LPARAM) 0);
00593 break;
00594 case VK_DOWN:
00595 SendMessage (hwnd, WM_VSCROLL, SB_LINEDOWN, (LPARAM) 0);
00596 break;
00597 case VK_LEFT:
00598 SendMessage (hwnd, WM_HSCROLL, SB_LINELEFT, (LPARAM) 0);
00599 break;
00600 case VK_RIGHT:
00601 SendMessage (hwnd, WM_HSCROLL, SB_LINERIGHT, (LPARAM) 0);
00602 break;
00603
00604
00605 case VK_V :
00606 {
00607 SendMessage (hwnd, WM_COMMAND,M_PASTE, (LPARAM) 0);
00608 }
00609 break;
00610
00611 case VK_INSERT :
00612 {
00613 LPTW lptw=GetTextWinScilab();
00614 if ( HasAZoneTextSelected(lptw) == TRUE ) TextCopyClip (lptw);
00615 }
00616 break;
00617
00618 case VK_ADD :
00619 if (!IsEnableTransparencyMode())
00620 {
00621 LPTW lptw=GetTextWinScilab();
00622 ActivateTransparencyMode(lptw->hWndParent);
00623 ActivateTransparencyMode(lptw->hWndText);
00624 }
00625 IncreaseAlphaLevel();
00626 break;
00627 case VK_SUBTRACT:
00628 if (!IsEnableTransparencyMode())
00629 {
00630 LPTW lptw=GetTextWinScilab();
00631 ActivateTransparencyMode(lptw->hWndParent);
00632 ActivateTransparencyMode(lptw->hWndText);
00633 }
00634 DecreaseAlphaLevel();
00635 break;
00636
00637 default:
00638 break;
00639 }
00640 }
00641 else
00642 {
00643 switch (vk)
00644 {
00645 case VK_UP: case VK_DOWN: case VK_LEFT: case VK_RIGHT:
00646 case VK_HOME: case VK_END: case VK_PRIOR:
00647 case VK_NEXT: case VK_DELETE:
00648 {
00649 LPTW lptw=GetTextWinScilab();
00650 long count;
00651
00652 count = lptw->KeyBufIn - lptw->KeyBufOut;
00653
00654 if (count < 0) count += lptw->KeyBufSize;
00655
00656 if (count < (int) lptw->KeyBufSize - 2)
00657 {
00658 *lptw->KeyBufIn++ = 0;
00659 if (lptw->KeyBufIn - lptw->KeyBuf >= (int) lptw->KeyBufSize) lptw->KeyBufIn = lptw->KeyBuf;
00660
00661 *lptw->KeyBufIn++ = flags;
00662 if (lptw->KeyBufIn - lptw->KeyBuf >= (int) lptw->KeyBufSize) lptw->KeyBufIn = lptw->KeyBuf;
00663 }
00664 }
00665 break;
00666
00667
00668 case VK_F1:
00669 {
00670 StoreCommand1 ("help()", 0);
00671 }
00672 break;
00673
00674
00675 case VK_F2:
00676 {
00677 LPTW lptw=GetTextWinScilab();
00678 ClearCommandWindow(lptw,TRUE);
00679 }
00680 break;
00681
00682 case VK_F3:
00683 {
00684 LPTW lptw=GetTextWinScilab();
00685 if (lptw->lpmw->LockToolBar == FALSE)
00686 {
00687 lptw->lpmw->ShowToolBar=!lptw->lpmw->ShowToolBar;
00688
00689 ToolBarOnOff(lptw);
00690 }
00691 }
00692 break;
00693
00694
00695 case VK_F11:
00696 {
00697 ResetMenu();
00698 }
00699 break;
00700
00701
00702 case VK_F12:
00703 {
00704 SwitchConsole();
00705 SetActiveWindow(hwnd);
00706 }
00707 break;
00708 }
00709 }
00710 }
00711 }
00712
00713 void ON_WND_TEXT_WM_VSCROLL(HWND hwnd, HWND hwndCtl, UINT code, int pos)
00714 {
00715 int nYinc=0;
00716
00717 LPTW lptw=GetTextWinScilab();
00718 switch (code)
00719 {
00720 case SB_ENDSCROLL:
00721 nYinc = 0;
00722 break;
00723 case SB_TOP:
00724 nYinc = -lptw->ScrollPos.y;
00725 break;
00726 case SB_BOTTOM:
00727 nYinc = lptw->ScrollMax.y - lptw->ScrollPos.y;
00728 break;
00729 case SB_LINEUP:
00730 nYinc = -lptw->CharSize.y;
00731 break;
00732 case SB_LINEDOWN:
00733 nYinc = lptw->CharSize.y;
00734 break;
00735 case SB_PAGEUP:
00736 nYinc = min(-1,-lptw->ClientSize.y);
00737 break;
00738 case SB_PAGEDOWN:
00739 nYinc = max(1,lptw->ClientSize.y);
00740 break;
00741 case SB_THUMBPOSITION:
00742 nYinc = pos - lptw->ScrollPos.y;
00743 break;
00744 case SB_THUMBTRACK:
00745 nYinc = pos - lptw->ScrollPos.y;
00746 break;
00747 default:
00748 nYinc = 0;
00749 break;
00750
00751 }
00752
00753 if ((nYinc = max (-lptw->ScrollPos.y,min (nYinc, lptw->ScrollMax.y - lptw->ScrollPos.y))) != 0)
00754 {
00755 lptw->ScrollPos.y += nYinc;
00756 ScrollWindow (hwnd, 0, -nYinc, NULL, NULL);
00757 SetScrollPos (hwnd, SB_VERT, lptw->ScrollPos.y, TRUE);
00758 UpdateWindow (hwnd);
00759 }
00760
00761 }
00762
00763 void ON_WND_TEXT_WM_HSCROLL(HWND hwnd, HWND hwndCtl, UINT code, int pos)
00764 {
00765 int nXinc=0;
00766 LPTW lptw=GetTextWinScilab();
00767
00768 switch (code)
00769 {
00770 case SB_ENDSCROLL:
00771 nXinc = 0;
00772 break;
00773
00774 case SB_LEFT:
00775 nXinc = 0;
00776 break;
00777
00778 case SB_RIGHT:
00779 nXinc =lptw->ClientSize.x;
00780 break;
00781
00782 case SB_LINELEFT:
00783 nXinc = -lptw->CharSize.x;
00784 break;
00785
00786 case SB_LINERIGHT:
00787 nXinc = lptw->CharSize.x;
00788 break;
00789
00790 case SB_PAGELEFT:
00791 nXinc = min(-1,-lptw->ClientSize.x);
00792 break;
00793
00794 case SB_PAGERIGHT:
00795 nXinc = max(1,lptw->ClientSize.x);
00796 break;
00797
00798 case SB_THUMBPOSITION:
00799 nXinc = pos - lptw->ScrollPos.x;
00800 break;
00801
00802 case SB_THUMBTRACK:
00803 nXinc = pos - lptw->ScrollPos.x;
00804 break;
00805
00806 default:
00807 nXinc = 0;
00808 break;
00809 }
00810
00811 if ((nXinc = max (-lptw->ScrollPos.x, min (nXinc, lptw->ScrollMax.x - lptw->ScrollPos.x))) != 0)
00812 {
00813 lptw->ScrollPos.x += nXinc;
00814 ScrollWindow (hwnd, -nXinc, 0, NULL, NULL);
00815 SetScrollPos (hwnd, SB_HORZ, lptw->ScrollPos.x, TRUE);
00816 UpdateWindow (hwnd);
00817 }
00818
00819 }
00820
00821 void ON_WND_TEXT_WM_MOUSEWHEEL(HWND hwnd, int xPos, int yPos, int zDelta, UINT fwKeys)
00822 {
00823 if (zDelta!=0)
00824 {
00825 int steps=yPos/zDelta;
00826
00827 if( steps > 0 )
00828 {
00829 SendMessage (hwnd, WM_VSCROLL, SB_LINEUP, (LPARAM) 0);
00830 }
00831
00832 if( steps < 0 )
00833 {
00834 SendMessage (hwnd, WM_VSCROLL, SB_LINEDOWN, (LPARAM) 0);
00835 }
00836 }
00837 }
00838
00839 void ON_WND_TEXT_WM_SIZE(HWND hwnd, UINT state, int cx, int cy)
00840 {
00841 int nl=0, nc=0;
00842 LPTW lptw=GetTextWinScilab();
00843
00844 lptw->ClientSize.y = cy;
00845 lptw->ClientSize.x = cx;
00846 nc = lptw->ClientSize.x / lptw->CharSize.x;
00847 nl = lptw->ClientSize.y / lptw->CharSize.y;
00849 if ((cx>0) && (cy>0)) C2F (scilines) (&nl, &nc);
00850
00851 lptw->ScrollMax.y = max (0, lptw->CharSize.y * lptw->ScreenSize.y - lptw->ClientSize.y);
00852 lptw->ScrollPos.y = min (lptw->ScrollPos.y, lptw->ScrollMax.y);
00853
00854 SetScrollRange (hwnd, SB_VERT, 0, lptw->ScrollMax.y, FALSE);
00855 SetScrollPos (hwnd, SB_VERT, lptw->ScrollPos.y, TRUE);
00856
00857 lptw->ScrollMax.x = max (0, lptw->CharSize.x * lptw->ScreenSize.x - lptw->ClientSize.x);
00858 lptw->ScrollPos.x = min (lptw->ScrollPos.x, lptw->ScrollMax.x);
00859
00860 SetScrollRange (hwnd, SB_HORZ, 0, lptw->ScrollMax.x, FALSE);
00861 SetScrollPos (hwnd, SB_HORZ, lptw->ScrollPos.x, TRUE);
00862
00863
00864 if (lptw->bFocus && lptw->bGetCh)
00865 {
00866 SetCaretPos (lptw->CursorPos.x * lptw->CharSize.x - lptw->ScrollPos.x,
00867 lptw->CursorPos.y * lptw->CharSize.y + lptw->CharAscent
00868 - lptw->CaretHeight - lptw->ScrollPos.y);
00869 ShowCaret (hwnd);
00870 }
00871 }
00872
00873 void ON_WND_TEXT_WM_KILLFOCUS(HWND hwnd, HWND hwndNewFocus)
00874 {
00875 LPTW lptw=GetTextWinScilab();
00876 DestroyCaret ();
00877 lptw->bFocus = FALSE;
00878 }
00879
00880 void ON_WND_TEXT_WM_SETFOCUS(HWND hwnd, HWND hwndOldFocus)
00881 {
00882 LPTW lptw=GetTextWinScilab();
00883 lptw->bFocus = TRUE;
00884 CreateCaret (hwnd, 0, lptw->CharSize.x, 2 + lptw->CaretHeight);
00885 SetCaretPos (lptw->CursorPos.x * lptw->CharSize.x - lptw->ScrollPos.x,
00886 lptw->CursorPos.y * lptw->CharSize.y + lptw->CharAscent
00887 - lptw->CaretHeight - lptw->ScrollPos.y);
00888 if (lptw->bGetCh) ShowCaret (hwnd);
00889 }
00890
00891 BOOL ON_WND_TEXT_WM_SETCURSOR(HWND hwnd, HWND hwndCursor, UINT codeHitTest, UINT msg)
00892 {
00893 SetCursor( LoadCursor( NULL, IDC_ARROW ) );
00894 return TRUE;
00895 }
00896