WndConsoleTextProc.c

Go to the documentation of this file.
00001 /*-----------------------------------------------------------------------------------*/
00002 /* INRIA 2005 */
00003 /* Allan CORNET */
00004 /*-----------------------------------------------------------------------------------*/
00005 #include "WndConsoleTextProc.h"
00006 /*-----------------------------------------------------------------------------------*/
00007 /* Definition des codes touche */
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) /* Visual Studio 6 */
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 /* child text window */
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;  /* source */
00169         source.y = (rect.top + lptw->ScrollPos.y) / lptw->CharSize.y;
00170         dest.x = source.x * lptw->CharSize.x - lptw->ScrollPos.x;       /* destination */
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;      /* width */
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         /* ensure begin mark is before end mark */
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         /* for each line */
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                         /* do stuff before marked text */
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                         /* then the marked text */
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                         /* then stuff after marked text */
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;  /* wrap around */
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         /* finish marking text */
00454 
00455         ReleaseCapture ();
00456         lptw->Marking = FALSE;
00457 
00458 
00459         /* ensure begin mark is before end mark */
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                 /* Zone Selectionnée --> Activation Menus */
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                 /* EnableMenuItem(lptw->hPopMenu,M_CUT,MF_ENABLED); */
00482         }
00483         else
00484         {
00485                 /*Pas de Zone Selectionnée -> Menus non activés */
00486                 /* EnableMenuItem(lptw->hPopMenu,M_CUT,MF_GRAYED); */
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);       /* track the mouse */
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                         /* Modification Allan CORNET 09/07/03 */
00566                         /* Touches Shift-Insert effectue un "coller" du presse papier */
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                                 /* Touches Control-V effectue un "coller" du presse papier */
00605                                 case VK_V :
00606                                 {
00607                                         SendMessage (hwnd, WM_COMMAND,M_PASTE, (LPARAM) 0);
00608                                 }
00609                                 break;
00610                                 /* Touches Control-Insert Control-C effectue un "copier" dans presse papier */
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                                 {                       /* store key in circular buffer */
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;     /* wrap around */
00660 
00661                                                 *lptw->KeyBufIn++ = flags;
00662                                                 if (lptw->KeyBufIn - lptw->KeyBuf >= (int) lptw->KeyBufSize) lptw->KeyBufIn = lptw->KeyBuf;     /* wrap around */
00663                                         }
00664                                 }
00665                                 break;
00666 
00667                                 /* Appel l'aide */            
00668                                 case VK_F1:
00669                                 {
00670                                         StoreCommand1 ("help()", 0);
00671                                 }
00672                 break;
00673 
00674                                 /* Efface la fenetre de commandes */
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                                 /* Reset des Menus & Boutons*/
00695                                 case VK_F11:
00696                                 {
00697                                         ResetMenu();
00698                                 }
00699                                 break;        
00700 
00701                                 /* Affiche ou cache la fenetre Scilex */
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 /*-----------------------------------------------------------------------------------*/

Generated on Sun Mar 4 15:03:55 2007 for Scilab [trunk] by  doxygen 1.5.1