source: trunk/dll/viewer.c@ 1544

Last change on this file since 1544 was 1544, checked in by Gregg Young, 15 years ago

Changes to fopen and _fsopen to allow FM2 to be loaded in high memory

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 33.7 KB
RevLine 
[2]1
[130]2/***********************************************************************
3
4 $Id: viewer.c 1544 2010-09-30 13:00:59Z gyoung $
5
6 MLE text editor/viewer
7
8 Copyright (c) 1993-97 M. Kimes
[1498]9 Copyright (c) 2005, 2010 Steven H. Levine
[130]10
11 23 May 05 SHL Use QWL_USER
[328]12 17 Jul 06 SHL Use Runtime_Error
[470]13 31 Aug 06 SHL Sync with disable_menuitem changes
[593]14 30 Mar 07 GKY Remove GetPString for window class names
[793]15 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
[878]16 26 Nov 07 GKY Allow open of readonly files in the editor with warning
17 26 Nov 07 GKY Add "Save as" menu option to editor
[985]18 29 Feb 08 GKY Refactor global command line variables to notebook.h
[1395]19 07 Feb 09 GKY Allow user to turn off alert and/or error beeps in settings notebook.
20 07 Feb 09 GKY Eliminate Win_Error2 by moving function names to PCSZs used in Win_Error
[1402]21 08 Mar 09 GKY Additional strings move to String Table
[1498]22 17 JAN 10 GKY Changes to get working with Watcom 1.9 Beta (1/16/10). Mostly cast CHAR CONSTANT * as CHAR *.
[130]23
24***********************************************************************/
25
[907]26#include <stdlib.h>
27#include <string.h>
28#include <io.h>
29
[2]30#define INCL_DOS
31#define INCL_WIN
[841]32#define INCL_LONGLONG
[2]33
[1187]34#include "fm3dll.h"
[1228]35#include "fm3dll2.h" // #define's for UM_*, control id's, etc.
36#include "viewer.h"
[1214]37#include "mainwnd2.h" // Data declaration(s)
38#include "collect.h" // Data declaration(s)
39#include "grep.h" // Data declaration(s)
40#include "dircnrs.h" // Data declaration(s)
41#include "init.h" // Data declaration(s)
[2]42#include "fm3dlg.h"
43#include "fm3str.h"
44#include "mle.h"
[907]45#include "errutil.h" // Dos_Error...
46#include "strutil.h" // GetPString
[985]47#include "notebook.h" // External viewers
[1162]48#include "colors.h" // ColorDlgProc
49#include "mainwnd.h" // FillClient
50#include "codepage.h" // PickCodepage
51#include "dirs.h" // switch_to
[1187]52#include "input.h" // InputDlgProc
53#include "valid.h" // ParentIsDesktop
54#include "chklist.h" // PopupMenu
55#include "newview.h" // StartViewer
56#include "getnames.h" // export_filename
[1162]57#include "misc.h" // SetMenuCheck, disable_menuitem
[1187]58#include "fonts.h" // SetMLEFont
59#include "wrappers.h" // xfopen
[1029]60#include "fortify.h"
[2]61
62#pragma data_seg(DATA1)
[328]63
64static PSZ pszSrcFile = __FILE__;
65
[2]66#define hwndMLE WinWindowFromID(hwnd,MLE_MLE)
67
68#define COLORS_MAX 2
69
70#define COLORS_FOREGROUND 0
71#define COLORS_BACKGROUND 1
72
[551]73static LONG Colors[COLORS_MAX] = { COLR_BLACK, COLR_PALEGRAY };
74static BOOL Firsttime = TRUE;
[2]75
[551]76HWND StartMLEEditor(HWND hwndClient, INT flags, CHAR * filename,
77 HWND hwndRestore)
78{
[2]79
80 /*
81 * create an editor window
82 * bitmapped flags:
83 * 1 = readonly
84 * 2 = don't position window for non-desktop client
85 * 4 = don't "kill app" when closed
86 * 8 = as text
87 * 16 = as binary
88 */
89
[551]90 HWND hwndFrame, hwnd;
[2]91 XMLEWNDPTR *vw;
[551]92 ULONG flFrameFlags = FCF_SYSMENU | FCF_SIZEBORDER | FCF_ICON |
[878]93 FCF_TITLEBAR | FCF_MINMAX | FCF_MENU | FCF_ACCELTABLE | FCF_NOBYTEALIGN;
94 ULONG ulResult;
95 BOOL OpenInViewer = FALSE, readonly = FALSE;
96 FILESTATUS3 fs3;
[2]97
[551]98 if (fExternalViewer || strcmp(realappname, FM3Str))
[2]99 hwndClient = HWND_DESKTOP;
[878]100 DosQueryPathInfo(filename, FIL_STANDARD, &fs3, sizeof(fs3));
101 if (fs3.attrFile & FILE_READONLY) {
102 ulResult = saymsg(MB_YESNOCANCEL | MB_ICONQUESTION | MB_DEFBUTTON1, HWND_DESKTOP,
[1394]103 GetPString(IDS_WARNINGTEXT),
104 GetPString(IDS_EDITREADONLYFILETEXT),
105 filename);
[878]106 switch (ulResult){
107 case MBID_YES:{
108 readonly = TRUE;
109 break;
110 }
[2]111
[878]112 case MBID_NO:
113 if (fUseNewViewer)
[1394]114 return StartViewer(hwndClient, (USHORT) flags, filename, hwndRestore);
[878]115 else{
[1394]116 OpenInViewer = TRUE;
117 break;
[878]118 }
119
120 case MBID_CANCEL:
[1394]121 return (HWND) 0;
[878]122 }
123 }
[1029]124# ifdef FORTIFY
125 Fortify_EnterScope();
[1063]126# endif
[551]127 vw = xmallocz(sizeof(XMLEWNDPTR), pszSrcFile, __LINE__);
128 if (!vw)
129 return (HWND) 0;
[2]130 vw->size = sizeof(XMLEWNDPTR);
[878]131 if (readonly)
132 vw->fileattrreadonly = TRUE;
133 else
134 vw->fileattrreadonly = FALSE;
[551]135 if (flags & 1) {
136 if (flags & 8)
[2]137 vw->hex = 2;
[551]138 else if (flags & 16)
[2]139 vw->hex = 1;
[551]140 else if (!fGuessType)
[2]141 vw->hex = 2;
142 }
143 else
144 vw->hex = 2;
145 vw->hwndParent = (hwndClient) ? hwndClient : HWND_DESKTOP;
146 vw->srch.size = sizeof(SRCHPTR);
[551]147 if (flags & 4)
[2]148 vw->dontclose = TRUE;
[551]149 if (filename)
150 strcpy(vw->exportfilename, filename);
[2]151 vw->hwndRestore = hwndRestore;
[551]152 if (ParentIsDesktop(hwndClient, hwndClient))
[2]153 flFrameFlags |= FCF_TASKLIST;
154 hwndFrame = WinCreateStdWindow(hwndClient,
[878]155 0,
[551]156 &flFrameFlags,
[1498]157 (CHAR *) WC_MLEEDITOR,
[551]158 NullStr,
[878]159 fwsAnimate,
[551]160 FM3ModHandle, MLE_FRAME, &hwnd);
161 if (hwndFrame) {
[2]162 vw->hwndFrame = hwndFrame;
[551]163 if (!ParentIsDesktop(hwndFrame, hwndClient) && !(flags & 2)) {
[2]164
165 SWP swp;
166
[551]167 FillClient(hwndClient, &swp, NULL, FALSE);
[2]168 WinSetWindowPos(hwndFrame,
[551]169 HWND_TOP,
170 swp.x,
171 swp.y,
172 swp.cx,
173 swp.cy,
174 SWP_SIZE | SWP_MOVE | SWP_SHOW | SWP_ACTIVATE |
175 SWP_ZORDER);
[2]176 }
[551]177 else if (flFrameFlags & FCF_TASKLIST) {
[2]178
[551]179 SWP swp, swpD;
[2]180 ULONG size = sizeof(swp);
[551]181 LONG cxScreen, cyScreen;
[2]182
[551]183 WinQueryTaskSizePos(WinQueryAnchorBlock(hwndFrame), 0, &swp);
184 if (PrfQueryProfileData(fmprof, appname, "ViewSizePos", &swpD, &size)) {
185 cxScreen = WinQuerySysValue(HWND_DESKTOP, SV_CXSCREEN);
186 cyScreen = WinQuerySysValue(HWND_DESKTOP, SV_CYSCREEN);
187 if (swp.x + swpD.cx > cxScreen)
188 swp.x = cxScreen - swpD.cx;
189 if (swp.y + swpD.cy > cyScreen)
190 swp.y = cyScreen - swpD.cy;
191 swp.cx = swpD.cx;
192 swp.cy = swpD.cy;
[2]193 }
194 WinSetWindowPos(hwndFrame,
[551]195 HWND_TOP,
196 swp.x,
197 swp.y,
198 swp.cx,
199 swp.cy,
200 SWP_SIZE | SWP_MOVE | SWP_SHOW | SWP_ZORDER |
201 SWP_ACTIVATE);
[2]202 }
[878]203 if (OpenInViewer | (flags & 1))
204 MLEsetreadonly(hwndMLE, ((flags & 1) != 0));
[551]205 WinSetWindowPtr(hwnd, QWL_USER, (PVOID) vw);
206 if (!PostMsg(hwnd, UM_SETUP, MPVOID, MPFROMLONG(hwndClient)))
207 WinSendMsg(hwnd, UM_SETUP, MPVOID, MPFROMLONG(hwndClient));
[2]208 }
209 return hwndFrame;
210}
211
[551]212MRESULT EXPENTRY MLESubProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
213{
[2]214
[551]215 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
[2]216 XMLEWNDPTR *vw;
217
[551]218 switch (msg) {
219 case WM_SETFOCUS:
220 if (mp2)
221 PostMsg(WinQueryWindow(hwnd, QW_PARENT), UM_SELECT, mp1, mp2);
222 break;
[2]223
[551]224 case WM_CHAR:
225 vw = WinQueryWindowPtr(WinQueryWindow(hwnd, QW_PARENT), QWL_USER);
226 if (vw && vw->size == sizeof(XMLEWNDPTR) && vw->hex == 1) {
227 if (!MLEgetreadonly(hwnd)) {
228 WinSetSysValue(HWND_DESKTOP, SV_INSERTMODE, FALSE);
229 if (vw->fWrap) {
230 vw->fWrap = FALSE;
231 MLEsetwrap(hwnd, FALSE);
232 }
233 MLEanctocur(hwnd);
234 {
235 static ULONG badoff[] =
236 { 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 44,
237 47, 0
238 };
239 ULONG line, pos, offset, len, x;
240 MRESULT mr;
[2]241
[551]242 mr = oldproc(hwnd, msg, mp1, mp2);
[2]243
[551]244 len = MLEcurlinelen(hwnd);
245 line = MLEcurline(hwnd);
246 pos = MLEcurpos(hwnd);
247 offset = len - MLElinelenleft(hwnd, pos);
248 if (offset < 9) {
249 if (!line || offset == 8 || line == MLEnumlines(hwnd) - 1)
250 MLEsetcurpos(hwnd, pos + (9 - offset));
251 else
252 MLEsetcurpos(hwnd, MLEstartofline(hwnd, line + 1) + 9);
253 }
254 else if (offset >= 71) {
255 if (vw->lastpos == offset - 1) {
256 if (line < MLEnumlines(hwnd) - 1)
257 MLEsetcurpos(hwnd, MLEstartofline(hwnd, line + 2) + 55);
258 else
259 MLEsetcurpos(hwnd, MLEstartofline(hwnd, line + 1) + 55);
260 }
261 else
262 MLEsetcurpos(hwnd, MLEstartofline(hwnd, line) + 70);
263 }
264 else if (offset == 53) {
265 if (line < MLEnumlines(hwnd) - 1)
266 MLEsetcurpos(hwnd, MLEstartofline(hwnd, line + 1) + 9);
267 else
268 MLEsetcurpos(hwnd, MLEstartofline(hwnd, line) + 9);
269 }
270 else if (offset == 54) {
271 if (line < MLEnumlines(hwnd) - 1)
272 MLEsetcurpos(hwnd, MLEstartofline(hwnd, line + 1) + 70);
273 else
274 MLEsetcurpos(hwnd, MLEstartofline(hwnd, line) + 70);
275 }
276 else {
277 for (x = 0; badoff[x]; x++) {
278 if (offset == badoff[x]) {
279 if (vw->lastpos < pos)
280 MLEsetcurpos(hwnd, pos + 1);
281 else
282 MLEsetcurpos(hwnd, pos - 1);
283 }
284 }
285 }
286 {
287 CHAR s[80];
[2]288
[551]289 sprintf(s,
290 GetPString(IDS_VIEWPOSSTUFFTEXT), len, line, pos, offset);
291 if (hwndStatus)
292 WinSetWindowText(hwndStatus, s);
293 }
294 vw->lastpos = MLEcurpos(hwnd);
295 return mr;
296 }
[2]297 }
[551]298 }
299 break;
[2]300
[551]301 case WM_MENUEND:
302 vw = WinQueryWindowPtr(WinQueryWindow(hwnd, QW_PARENT), QWL_USER);
303 if (vw && vw->size == sizeof(XMLEWNDPTR)) {
304 if (vw->hwndPopupMenu == (HWND) mp2) {
305 WinDestroyWindow(vw->hwndPopupMenu);
306 vw->hwndPopupMenu = (HWND) 0;
[2]307 }
[551]308 }
309 break;
[2]310
[551]311 case WM_CONTEXTMENU:
312 vw = WinQueryWindowPtr(WinQueryWindow(hwnd, QW_PARENT), QWL_USER);
313 if (vw && vw->size == sizeof(XMLEWNDPTR)) {
314 if (!vw->hwndPopupMenu)
315 vw->hwndPopupMenu =
316 WinLoadMenu(HWND_DESKTOP, FM3ModHandle, MLE_POPUP);
317 if (vw->hwndPopupMenu) {
318 if (MLEgetreadonly(hwnd)) {
319 WinEnableMenuItem(vw->hwndPopupMenu, MLE_UNDO, FALSE);
320 WinEnableMenuItem(vw->hwndPopupMenu, MLE_CUTCLIP, FALSE);
321 WinEnableMenuItem(vw->hwndPopupMenu, MLE_PASTECLIP, FALSE);
322 WinEnableMenuItem(vw->hwndPopupMenu, MLE_CLEAR, FALSE);
323 WinEnableMenuItem(vw->hwndPopupMenu, MLE_BLOCKMENU, FALSE);
324 }
325 else {
326 WinEnableMenuItem(vw->hwndPopupMenu, MLE_UNDO, TRUE);
327 WinEnableMenuItem(vw->hwndPopupMenu, MLE_CUTCLIP, TRUE);
328 WinEnableMenuItem(vw->hwndPopupMenu, MLE_PASTECLIP, TRUE);
329 WinEnableMenuItem(vw->hwndPopupMenu, MLE_CLEAR, TRUE);
330 WinEnableMenuItem(vw->hwndPopupMenu, MLE_BLOCKMENU, TRUE);
331 }
[892]332 if (!*ftprun && !fFtpRunWPSDefault)
[551]333 WinSendMsg(vw->hwndPopupMenu, MM_DELETEITEM,
334 MPFROM2SHORT(MLE_VIEWFTP, FALSE), MPVOID);
[892]335 if (!*httprun && !fHttpRunWPSDefault)
[551]336 WinSendMsg(vw->hwndPopupMenu, MM_DELETEITEM,
337 MPFROM2SHORT(MLE_VIEWHTTP, FALSE), MPVOID);
338 PopupMenu(WinQueryWindow(hwnd, QW_PARENT),
339 WinQueryWindow(hwnd, QW_PARENT), vw->hwndPopupMenu);
[2]340 }
[551]341 }
342 break;
[2]343 }
[551]344 return oldproc(hwnd, msg, mp1, mp2);
[2]345}
346
[551]347MRESULT EXPENTRY MLEEditorProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
348{
[2]349
350 XMLEWNDPTR *vw;
351
[551]352 if (msg != WM_CREATE && msg != UM_SETUP)
353 vw = (XMLEWNDPTR *) WinQueryWindowPtr(hwnd, QWL_USER);
[2]354 else
355 vw = NULL;
356
[551]357 switch (msg) {
358 case WM_CREATE:
359 /* create MLE window */
360 if (!WinCreateWindow(hwnd,
361 WC_MLE,
362 (PSZ) NULL,
[1358]363 MLS_VSCROLL | MLS_BORDER |
364 WS_VISIBLE | MLS_HSCROLL,
[766]365 0,
366 0,
367 0, 0, hwnd, HWND_TOP, MLE_MLE, MPVOID, MPVOID)) {
[1395]368 Win_Error(hwnd, hwnd, pszSrcFile, __LINE__,
369 PCSZ_WINCREATEWINDOW);
[551]370 }
371 else {
372 PFNWP oldproc;
373
374 oldproc = WinSubclassWindow(WinWindowFromID(hwnd, MLE_MLE), MLESubProc);
375 WinSetWindowPtr(WinWindowFromID(hwnd, MLE_MLE),
376 QWL_USER, (PVOID) oldproc);
377 }
378 break;
379
380 case WM_INITMENU:
381 switch (SHORT1FROMMP(mp1)) {
382 case MLE_EDITMENU:
[2]383 {
[551]384 ULONG ret;
385 CHAR lbl[162];
[2]386
[551]387 strcpy(lbl, GetPString(IDS_UNDOTEXT));
388 ret = (ULONG) WinSendMsg(hwndMLE, MLM_QUERYUNDO, MPVOID, MPVOID);
389 switch (HIUSHORT(ret)) {
390 case WM_CHAR:
391 case MLM_CUT:
392 case MLM_CLEAR:
393 case MLM_PASTE:
394 WinEnableMenuItem((HWND) mp2, MLE_UNDO, TRUE);
395 if (!LOUSHORT(ret))
396 strcpy(lbl, GetPString(IDS_REDOTEXT));
397 switch (HIUSHORT(ret)) {
398 case WM_CHAR:
399 strcat(lbl, GetPString(IDS_KEYSTROKEMENUTEXT));
400 break;
401 case MLM_CUT:
402 strcat(lbl, GetPString(IDS_CUTTOCLIPMENUTEXT));
403 break;
404 case MLM_CLEAR:
405 strcat(lbl, GetPString(IDS_CLEARSELMENUTEXT));
406 break;
407 case MLM_PASTE:
408 strcat(lbl, GetPString(IDS_PASTEFROMCLIPMENUTEXT));
409 break;
410 }
411 WinSetMenuItemText((HWND) mp2, MLE_UNDO, lbl);
412 break;
413 default:
414 WinEnableMenuItem((HWND) mp2, MLE_UNDO, FALSE);
415 break;
416 }
[2]417 }
418 break;
[551]419 }
420 break;
[2]421
[551]422 case UM_SETUP2:
423 vw = WinQueryWindowPtr(hwnd, QWL_USER);
424 if (vw) {
[2]425
[551]426 CHAR s[CCHMAXPATH + 8];
[2]427
[551]428 sprintf(s,
429 "%s: %s",
430 FM2Str,
431 (*vw->exportfilename) ?
432 vw->exportfilename : GetPString(IDS_UNTITLEDTEXT));
433 WinSetWindowText(WinQueryWindow(hwnd, QW_PARENT), s);
434 if (WinQueryWindow(hwnd, QW_PARENT) ==
435 WinQueryActiveWindow(WinQueryWindow(WinQueryWindow(hwnd,
436 QW_PARENT),
437 QW_PARENT)) &&
438 !ParentIsDesktop(WinQueryWindow(hwnd, QW_PARENT), (HWND) 0)) {
439 if (hwndStatus2)
440 WinSetWindowText(hwndStatus2,
441 (*vw->exportfilename) ?
[1498]442 vw->exportfilename : (CHAR *) GetPString(IDS_UNTITLEDTEXT));
[551]443 if (fMoreButtons) {
444 WinSetWindowText(hwndName,
445 (*vw->exportfilename) ?
[1498]446 vw->exportfilename : (CHAR *) GetPString(IDS_UNTITLEDTEXT));
[551]447 WinSetWindowText(hwndDate, NullStr);
448 WinSetWindowText(hwndAttr, NullStr);
449 }
450 if (hwndStatus)
451 WinSetWindowText(hwndStatus,
[1498]452 (CHAR *) GetPString(IDS_INTERNALVIEWEREDITORTITLETEXT));
[2]453 }
[551]454 }
455 return 0;
[2]456
[551]457 case UM_SETUP:
458 vw = WinQueryWindowPtr(hwnd, QWL_USER);
459 if (vw) {
460 vw->hab = WinQueryAnchorBlock(hwnd);
461 WinSendMsg(hwnd, UM_SETUP2, MPVOID, MPVOID);
462 /* set up initial MLE conditions */
463 vw->srch.hwndmle = hwndMLE;
[766]464 MLEsetcurpos(hwndMLE, 0);
[551]465 MLEclearall(hwndMLE);
[766]466 MLEsetlimit(hwndMLE, -1);
[551]467 MLEsetformat(hwndMLE, MLFIE_NOTRANS);
468 WinSetSysValue(HWND_DESKTOP, SV_INSERTMODE, TRUE);
[1358]469 vw->fWrap = FALSE;
[551]470 vw->fStripTrail = TRUE;
471 vw->fStripTrailLines = TRUE;
472 vw->srch.fInsensitive = TRUE;
473 vw->ExpandTabs = 4;
474 vw->TabStops = 32;
475 {
476 ULONG size;
[2]477
[551]478 size = sizeof(BOOL);
479 PrfQueryProfileData(fmprof,
[1505]480 (CHAR *) FM3Str, "MLEWrap", (PVOID) & vw->fWrap, &size);
[551]481 size = sizeof(BOOL);
482 PrfQueryProfileData(fmprof,
[1505]483 FM3Str,
[551]484 "MLEstriptrail",
485 (PVOID) & vw->fStripTrail, &size);
486 size = sizeof(BOOL);
487 PrfQueryProfileData(fmprof,
[1505]488 FM3Str,
[551]489 "MLEstriptraillines",
490 (PVOID) & vw->fStripTrailLines, &size);
491 size = sizeof(BOOL);
492 PrfQueryProfileData(fmprof,
[1505]493 FM3Str,
[551]494 "MLEInsensitve",
495 (PVOID) & vw->srch.fInsensitive, &size);
496 size = sizeof(INT);
497 PrfQueryProfileData(fmprof,
[1505]498 FM3Str,
[551]499 "MLEExpandTabs", (PVOID) & vw->ExpandTabs, &size);
500 size = sizeof(INT);
501 PrfQueryProfileData(fmprof,
[1505]502 FM3Str,
[551]503 "MLETabStops", (PVOID) & vw->TabStops, &size);
504 }
505 vw->accel = WinQueryAccelTable(vw->hab,
506 WinQueryWindow(hwnd, QW_PARENT));
507 vw->hwndMenu = WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
508 FID_MENU);
509 vw->ch = FALSE;
510 MLEsetchanged(hwndMLE, FALSE);
511 {
512 MRESULT ret = 0;
[2]513
[551]514 if (vw->hwndMenu) {
515 SetMenuCheck(vw->hwndMenu, MLE_TOGWRAP, &vw->fWrap, FALSE, NULL);
516 SetMenuCheck(vw->hwndMenu,
517 MLE_STRIPTRAILBLANKS, &vw->fStripTrail, FALSE, NULL);
518 SetMenuCheck(vw->hwndMenu,
519 MLE_STRIPTRAILLINES,
520 &vw->fStripTrailLines, FALSE, NULL);
521 {
522 BOOL tempbool = (vw->ExpandTabs != 0);
[2]523
[551]524 SetMenuCheck(vw->hwndMenu,
525 MLE_EXPANDTABS, &tempbool, FALSE, NULL);
526 }
527 SetMenuCheck(vw->hwndMenu,
528 MLE_SENSITIVE, &vw->srch.fInsensitive, FALSE, NULL);
529 }
530 MLEsetwrap(hwndMLE, vw->fWrap);
531 {
532 ULONG CpList[2];
533 ULONG CpSize;
[2]534
[551]535 if (!DosQueryCp(sizeof(CpList), CpList, &CpSize) && CpSize)
536 vw->cp = CpList[0];
537 }
538 {
539 ULONG size = sizeof(FATTRS), cps[50], len, x;
540 HMQ hmq;
[2]541
[551]542 if (!PrfQueryProfileData(fmprof,
[1505]543 FM3Str,
[551]544 "MLEFont",
545 &vw->fattrs,
546 &size) || size != sizeof(FATTRS)) {
547 vw->fattrs.usRecordLength = sizeof(FATTRS);
548 vw->fattrs.lMaxBaselineExt = 16;
549 vw->fattrs.lAveCharWidth = 8;
550 strcpy(vw->fattrs.szFacename, GetPString(IDS_SYSMONOTEXT));
551 vw->fattrs.usCodePage = (USHORT) vw->cp;
552 }
553 else
554 vw->cp = vw->fattrs.usCodePage;
555 if (!DosQueryCp(sizeof(cps), cps, &len)) {
556 for (x = 0; x < len / sizeof(ULONG); x++) {
557 if (cps[x] == (ULONG) vw->cp) {
558 hmq = WinQueryWindowULong(hwnd, QWL_HMQ);
559 WinSetCp(hmq, vw->cp);
560 break;
561 }
562 }
563 }
564 DosSetProcessCp(vw->cp);
565 WinSendMsg(hwndMLE, MLM_SETFONT, MPFROMP(&vw->fattrs), MPVOID);
566 }
567 if (Firsttime) {
[2]568
[551]569 ULONG size;
[2]570
[551]571 Firsttime = FALSE;
572 size = sizeof(ULONG);
573 PrfQueryProfileData(fmprof,
[1505]574 FM3Str,
[551]575 "MLEBackgroundcolor",
576 &Colors[COLORS_BACKGROUND], &size);
577 size = sizeof(ULONG);
578 PrfQueryProfileData(fmprof,
[1505]579 FM3Str,
[551]580 "MLEForegroundcolor",
581 &Colors[COLORS_FOREGROUND], &size);
582 }
583 WinSendMsg(hwndMLE,
584 MLM_SETBACKCOLOR,
585 MPFROMLONG(standardcolors[Colors[COLORS_BACKGROUND]]),
586 MPVOID);
587 WinSendMsg(hwndMLE,
588 MLM_SETTEXTCOLOR,
589 MPFROMLONG(standardcolors[Colors[COLORS_FOREGROUND]]),
590 MPVOID);
591 if (*vw->exportfilename)
592 if (MLEbackgroundload(hwnd,
593 UM_CONTAINER_FILLED,
594 hwndMLE, vw->exportfilename, vw->hex) != -1) {
595 vw->busy = TRUE;
596 WinEnableWindow(vw->hwndMenu, FALSE);
597 }
598 if (vw->busy || MLEgetreadonly(hwndMLE)) {
599 disable_menuitem(vw->hwndMenu, MLE_FILEMENU, TRUE);
600 disable_menuitem(vw->hwndMenu, MLE_CUTCLIP, TRUE);
601 disable_menuitem(vw->hwndMenu, MLE_PASTECLIP, TRUE);
602 disable_menuitem(vw->hwndMenu, MLE_CLEAR, TRUE);
603 disable_menuitem(vw->hwndMenu, MLE_CUTLINE, TRUE);
604 disable_menuitem(vw->hwndMenu, MLE_BLOCKMENU, TRUE);
605 }
606 return ret;
[2]607 }
[551]608 }
609 return 0;
610
611 case UM_CONTAINER_FILLED: /* file was loaded */
612 WinEnableWindow(vw->hwndMenu, TRUE);
613 vw->busy = FALSE;
614 if (vw->killme) {
615 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
[2]616 return 0;
[551]617 }
618 if (!MLEgetreadonly(hwndMLE)) {
619 disable_menuitem(vw->hwndMenu, MLE_FILEMENU, FALSE);
620 disable_menuitem(vw->hwndMenu, MLE_CUTCLIP, FALSE);
621 disable_menuitem(vw->hwndMenu, MLE_PASTECLIP, FALSE);
622 disable_menuitem(vw->hwndMenu, MLE_CLEAR, FALSE);
623 disable_menuitem(vw->hwndMenu, MLE_CUTLINE, FALSE);
624 disable_menuitem(vw->hwndMenu, MLE_BLOCKMENU, FALSE);
625 }
626 if (mp1) {
627 if (mp2) {
628 vw->ch = FALSE;
[1009]629 strcpy(vw->exportfilename, (CHAR *)mp2);
[2]630 }
[551]631 }
632 else {
633 vw->ch = FALSE;
634 *vw->exportfilename = 0;
635 }
636 WinSendMsg(hwnd, UM_SETUP2, MPVOID, MPVOID);
637 return 0;
[2]638
[551]639 case WM_SIZE:
640 WinSetWindowPos(hwndMLE,
641 HWND_TOP,
642 0,
643 0,
644 SHORT1FROMMP(mp2),
645 SHORT2FROMMP(mp2), SWP_MOVE | SWP_SIZE);
646 break;
647
648 case UM_SELECT:
649 case WM_SETFOCUS: /* sling focus to MLE */
650 if (mp2) {
651 if (hwndMain && fAutoView)
652 PostMsg(hwndMain, UM_LOADFILE, MPVOID, MPVOID);
653 WinSendMsg(hwnd, UM_SETUP2, MPVOID, MPVOID);
654 if (msg != UM_SELECT)
655 PostMsg(hwnd, UM_FOCUSME, MPVOID, MPVOID);
656 }
657 if (msg == WM_SETFOCUS)
[2]658 break;
[551]659 return 0;
[2]660
[551]661 case UM_FOCUSME:
662 WinSetFocus(HWND_DESKTOP, hwndMLE);
663 return 0;
[2]664
[551]665 case WM_ERASEBACKGROUND:
666 WinFillRect((HPS) mp1, (PRECTL) mp2, 0x00d0d0d0);
667 return 0;
[2]668
[551]669 case WM_PAINT:
670 {
671 RECTL rcl;
672 HPS hps;
[2]673
[551]674 hps = WinBeginPaint(hwnd, (HPS) 0, NULL);
675 WinQueryWindowRect(hwnd, &rcl);
676 WinFillRect(hps, &rcl, CLR_PALEGRAY);
677 WinEndPaint(hps);
678 }
679 break;
[2]680
[551]681 case UM_LOADFILE:
[1009]682 if ((CHAR *)mp1) {
683 // switch_to(mp1);
[551]684 if (MLEbackgroundload(hwnd,
685 UM_CONTAINER_FILLED,
[1009]686 hwndMLE, (CHAR *)mp1, vw->hex) != -1) {
[551]687 vw->busy = TRUE;
688 WinEnableWindow(vw->hwndMenu, FALSE);
[2]689 }
[551]690 }
691 return 0;
[2]692
[551]693 case WM_CONTROL:
694 switch (SHORT1FROMMP(mp1)) {
695 case MLE_MLE:
696 switch (SHORT2FROMMP(mp1)) {
697 case MLN_CHANGE:
698 if (!vw->ch)
699 vw->ch = TRUE;
700 break;
[2]701 }
[551]702 break;
703 }
704 return 0;
[2]705
[551]706 case WM_COMMAND:
707 if (vw->busy && SHORT1FROMMP(mp1) != MLE_QUIT) {
[1395]708 if (!fAlertBeepOff)
709 DosBeep(50, 100);
[2]710 return 0;
[551]711 }
712 switch (SHORT1FROMMP(mp1)) {
713 /*
[1394]714 case MLE_PREVIEW:
715 preview_text(hwndMLE);
716 break;
[551]717 */
718 case MLE_VIEWFTP:
719 MLEinternet(hwndMLE, TRUE);
720 break;
[2]721
[551]722 case MLE_VIEWHTTP:
723 MLEinternet(hwndMLE, FALSE);
724 break;
[2]725
[551]726 case IDM_NEXTWINDOW:
727 WinSendMsg(hwndMLE,
728 WM_CHAR,
729 MPFROM2SHORT((KC_CHAR | KC_VIRTUALKEY),
730 MAKEUSHORT(1, 9)), MPFROM2SHORT(9, VK_TAB));
731 break;
[2]732
[551]733 case IDM_COLORPALETTE:
734 {
735 COLORS co;
736 LONG temp[COLORS_MAX];
[2]737
[551]738 memset(&co, 0, sizeof(co));
739 co.size = sizeof(co);
740 co.numcolors = COLORS_MAX;
741 co.colors = Colors;
742 co.descriptions = IDS_EDCOLORS1TEXT;
743 co.origs = temp;
744 co.prompt = IDS_EDCOLORSPROMPTTEXT;
745 memcpy(temp, Colors, sizeof(LONG) * COLORS_MAX);
746 if (WinDlgBox(HWND_DESKTOP,
747 hwnd,
748 ColorDlgProc,
749 FM3ModHandle, COLOR_FRAME, (PVOID) & co)) {
750 WinSendMsg(hwndMLE,
751 MLM_SETTEXTCOLOR,
752 MPFROMLONG(standardcolors[Colors[COLORS_FOREGROUND]]),
753 MPVOID);
754 PrfWriteProfileData(fmprof,
[1505]755 FM3Str,
[551]756 "MLEForegroundcolor",
757 &Colors[COLORS_FOREGROUND], sizeof(LONG));
758 WinSendMsg(hwndMLE,
759 MLM_SETBACKCOLOR,
760 MPFROMLONG(standardcolors[Colors[COLORS_BACKGROUND]]),
761 MPVOID);
762 PrfWriteProfileData(fmprof,
[1505]763 FM3Str,
[551]764 "MLEBackgroundcolor",
765 &Colors[COLORS_BACKGROUND], sizeof(LONG));
766 }
767 }
768 break;
[2]769
[551]770 case IDM_HELP:
771 if (hwndHelp)
772 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
773 MPFROM2SHORT(HELP_EDITOR, 0), MPFROMSHORT(HM_RESOURCEID));
774 break;
[2]775
[551]776 case MLE_CODEPAGE:
777 vw->cp = PickCodepage(hwnd);
778 vw->fattrs.usCodePage = (USHORT) vw->cp;
779 WinSendMsg(hwndMLE, MLM_SETFONT, MPFROMP(&vw->fattrs), MPVOID);
780 PrfWriteProfileData(fmprof,
[1505]781 FM3Str, "MLEFont", &vw->fattrs, sizeof(FATTRS));
[551]782 break;
[2]783
[551]784 case MLE_NEWFILE:
785 if (!MLEgetreadonly(hwndMLE)) {
786 if (vw->ch) {
[2]787
[551]788 APIRET temp;
[2]789
[551]790 temp = saymsg(MB_YESNOCANCEL | MB_ICONEXCLAMATION,
791 hwnd, NullStr, GetPString(IDS_SAVECHANGESTEXT));
792 if (temp == MBID_CANCEL)
793 break;
[1394]794 if (temp == MBID_YES){
[551]795 WinSendMsg(hwnd,
[1394]796 WM_COMMAND, MPFROM2SHORT(MLE_EXPORTFILE, 0), MPVOID);
797 if (vw->fileattrreadonly) {
798 temp = saymsg(MB_OKCANCEL | MB_ICONEXCLAMATION,
[1402]799 hwnd, NullStr, GetPString(IDS_EDITREADONLYFILETEXT3));
[1394]800 if (temp == MBID_CANCEL)
801 return 0;
802 }
803 }
[551]804 }
805 MLEclearall(hwndMLE);
806 *vw->exportfilename = 0;
807 vw->ch = FALSE;
808 MLEsetchanged(hwndMLE, FALSE);
809 WinSendMsg(hwnd, UM_SETUP2, MPVOID, MPVOID);
810 }
811 break;
[2]812
[551]813 case MLE_TOGGLEREADONLY:
814 if (vw->busy || vw->hex == 1) {
[1395]815 if (!fAlertBeepOff)
816 DosBeep(50, 100);
[551]817 }
818 else {
819 /* I dunno why I gotta reset the colors... */
820 BOOL ro;
821 LONG fColor, bColor;
[2]822
[551]823 fColor = (LONG) WinSendMsg(hwndMLE,
824 MLM_QUERYTEXTCOLOR, MPVOID, MPVOID);
825 bColor = (LONG) WinSendMsg(hwndMLE,
826 MLM_QUERYBACKCOLOR, MPVOID, MPVOID);
827 ro = MLEgetreadonly(hwndMLE);
828 ro = (ro) ? FALSE : TRUE;
829 MLEsetreadonly(hwndMLE, ro);
830 disable_menuitem(vw->hwndMenu, MLE_FILEMENU, ro);
831 disable_menuitem(vw->hwndMenu, MLE_CUTCLIP, ro);
832 disable_menuitem(vw->hwndMenu, MLE_PASTECLIP, ro);
833 disable_menuitem(vw->hwndMenu, MLE_CLEAR, ro);
834 disable_menuitem(vw->hwndMenu, MLE_CUTLINE, ro);
835 disable_menuitem(vw->hwndMenu, MLE_BLOCKMENU, ro);
836 WinSendMsg(hwndMLE, MLM_SETTEXTCOLOR, MPFROMLONG(fColor), MPVOID);
837 WinSendMsg(hwndMLE, MLM_SETBACKCOLOR, MPFROMLONG(bColor), MPVOID);
838 }
839 break;
[2]840
[878]841 case MLE_EXPORTAS:
842 vw->saveas = TRUE;
843 WinSendMsg(hwnd,
[1394]844 WM_COMMAND, MPFROM2SHORT(MLE_SETEXPORTFILE, 0), MPVOID);
[878]845 break;
846
[551]847 case IDM_RENAME:
848 case MLE_SETEXPORTFILE:
849 if (vw && !MLEgetreadonly(hwndMLE)) {
[2]850
[1394]851 CHAR filename[1027];
852 ULONG ulResult;
[2]853
[551]854 strcpy(filename, vw->exportfilename);
[878]855 if (export_filename(hwnd, filename, !vw->fileattrreadonly)) {
[551]856 if (stricmp(filename, vw->exportfilename)) {
[1394]857 vw->ch = TRUE;
858 vw->fileattrreadonly = FALSE;
859 MLEsetchanged(hwndMLE, TRUE);
[551]860 strcpy(vw->exportfilename, filename);
[1394]861 WinSendMsg(hwnd, UM_SETUP2, MPVOID, MPVOID);
862 if (vw->saveas) {
863 vw->saveas = FALSE;
864 WinSendMsg(hwnd,
865 WM_COMMAND, MPFROM2SHORT(MLE_EXPORTFILE, 0), MPVOID);
866 }
867 }
868 else if (vw->fileattrreadonly){
869 ulResult = saymsg(MB_OKCANCEL | MB_ICONQUESTION | MB_DEFBUTTON1, HWND_DESKTOP,
870 GetPString(IDS_WARNINGTEXT),
871 GetPString(IDS_EDITREADONLYFILETEXT2),
872 filename);
873 if (ulResult == MBID_OK){
874 WinSendMsg(hwnd,
875 WM_COMMAND, MPFROM2SHORT(MLE_SETEXPORTFILE, 0), MPVOID);
876 break;
877 }
878 else
879 vw->saveas = FALSE;
880 }
881 else if (vw->saveas) {
882 vw->saveas = FALSE;
883 WinSendMsg(hwnd,
884 WM_COMMAND, MPFROM2SHORT(MLE_EXPORTFILE, 0), MPVOID);
885 }
[551]886 }
887 }
888 break;
[2]889
[551]890 case MLE_EXPORTFILE:
[878]891 if (vw->fileattrreadonly){
[1394]892 WinSendMsg(hwnd,
893 WM_COMMAND, MPFROM2SHORT(MLE_SETEXPORTFILE, 0), MPVOID);
894 break;
[878]895 }
[551]896 if (!MLEgetreadonly(hwndMLE)) {
[2]897
[847]898 ULONG oldsize;
[2]899
[551]900 if (!*vw->exportfilename ||
901 strchr(vw->exportfilename, '?') ||
902 strchr(vw->exportfilename, '*')) {
903 WinSendMsg(hwnd,
904 WM_COMMAND, MPFROM2SHORT(MLE_SETEXPORTFILE, 0), MPVOID);
905 if (!*vw->exportfilename ||
906 strchr(vw->exportfilename, '?') ||
907 strchr(vw->exportfilename, '*'))
908 break;
909 }
910 {
911 /* zero file length instead of unlink (protects EAs from loss) */
[1544]912 FILE *fp;
913 CHAR *moder = "r+";
[2]914
[1544]915 fp = xfopen(vw->exportfilename, moder, pszSrcFile, __LINE__, TRUE);
[551]916 if (fp) {
[847]917 oldsize = filelength(fileno(fp));
918 DosSetFileSize(fileno(fp), 0);
[551]919 fclose(fp);
920 }
921 }
922 if (!MLEexportfile(hwndMLE,
923 vw->exportfilename,
924 vw->ExpandTabs,
925 vw->fStripTrailLines, vw->fStripTrail)) {
[1544]926 FILE *fp;
927 CHAR *moder = "r+";
[2]928
[551]929 Runtime_Error(pszSrcFile, __LINE__, "MLEexportfile");
[1544]930 fp = xfopen(vw->exportfilename, moder, pszSrcFile, __LINE__, FALSE);
[551]931 if (fp) {
[847]932 DosSetFileSize(fileno(fp), oldsize);
[551]933 fclose(fp);
934 }
935 }
936 else {
937 vw->ch = FALSE;
938 MLEsetchanged(hwndMLE, FALSE);
939 }
940 }
941 break;
[2]942
[551]943 case IDM_EDIT:
944 case IDM_VIEW:
945 case MLE_LOADFILE:
946 if (vw->ch && !MLEgetreadonly(hwndMLE)) {
[2]947
[551]948 APIRET temp;
[2]949
[551]950 temp = saymsg(MB_YESNO, hwnd, NullStr, GetPString(IDS_LOADOVERTEXT));
951 if (temp != MBID_YES)
952 break;
953 }
954 /* intentional fallthru */
955 case MLE_INSERTFILE:
956 if (!MLEgetreadonly(hwndMLE)) {
[2]957
[551]958 CHAR filename[1027];
[2]959
[551]960 strcpy(filename, vw->importfilename);
961 if (insert_filename(hwnd,
962 filename,
963 (SHORT1FROMMP(mp1) == MLE_INSERTFILE) ?
964 FALSE : TRUE, FALSE)) {
965 strcpy(vw->importfilename, filename);
966 if (SHORT1FROMMP(mp1) == MLE_INSERTFILE)
967 MLEinsertfile(hwndMLE, filename);
968 else {
[2]969// switch_to(filename);
[551]970 if (MLEbackgroundload(hwnd,
971 UM_CONTAINER_FILLED,
972 hwndMLE, filename, vw->hex) != -1) {
973 vw->busy = TRUE;
974 WinEnableWindow(vw->hwndMenu, FALSE);
975 }
976 }
977 }
978 }
979 break;
[2]980
[551]981 case MLE_STRIPTRAILBLANKS:
982 SetMenuCheck(vw->hwndMenu,
983 MLE_STRIPTRAILBLANKS,
984 &vw->fStripTrail, TRUE, "MLEstriptrail");
985 break;
[2]986
[551]987 case MLE_STRIPTRAILLINES:
988 SetMenuCheck(vw->hwndMenu,
989 MLE_STRIPTRAILLINES,
990 &vw->fStripTrailLines, TRUE, "MLEstriptraillines");
991 break;
[2]992
[551]993 case MLE_TAB:
994 {
995 STRINGINPARMS sip;
996 CHAR s[35];
[2]997
[551]998 sip.help = GetPString(IDS_TABSTOPHELPTEXT);
999 sip.ret = s;
1000 sprintf(s, "%u", vw->TabStops);
1001 sip.prompt = GetPString(IDS_TABSTOPPROMPTTEXT);
1002 sip.inputlen = 34;
1003 sip.title = GetPString(IDS_TABSTOPTITLETEXT);
1004 WinDlgBox(HWND_DESKTOP,
1005 hwnd, InputDlgProc, FM3ModHandle, STR_FRAME, &sip);
1006 if (*s && atoi(s) > -1 && atoi(s) < 512) {
1007 vw->TabStops = atoi(s);
1008 WinSendMsg(hwndMLE,
1009 MLM_SETTABSTOP, MPFROMLONG(vw->TabStops), MPVOID);
1010 PrfWriteProfileData(fmprof,
[1505]1011 FM3Str,
[551]1012 "MLETabStops", &vw->TabStops, sizeof(INT));
1013 }
1014 }
1015 break;
[2]1016
[551]1017 case MLE_EXPANDTABS:
1018 {
1019 BOOL tempbool;
1020 STRINGINPARMS sip;
1021 CHAR s[35];
[2]1022
[551]1023 sip.help = GetPString(IDS_EXTABHELPTEXT);
1024 sip.ret = s;
1025 sprintf(s, "%u", vw->ExpandTabs);
1026 sip.prompt = GetPString(IDS_EXTABPROMPTTEXT);
1027 sip.inputlen = 34;
1028 sip.title = GetPString(IDS_EXTABTITLETEXT);
1029 WinDlgBox(HWND_DESKTOP,
1030 hwnd, InputDlgProc, FM3ModHandle, STR_FRAME, &sip);
1031 if (*s && atoi(s) > -1 && atoi(s) < 33) {
1032 vw->ExpandTabs = atoi(s);
1033 tempbool = (vw->ExpandTabs != 0);
1034 SetMenuCheck(vw->hwndMenu, MLE_EXPANDTABS, &tempbool, FALSE, NULL);
1035 PrfWriteProfileData(fmprof,
[1505]1036 FM3Str,
[551]1037 "MLEExpandTabs", &vw->ExpandTabs, sizeof(INT));
1038 }
1039 }
1040 break;
[2]1041
[551]1042 case MLE_APPENDCLIP:
1043 MLEdoblock(hwndMLE, APPENDCLIP, NULL);
1044 break;
[2]1045
[551]1046 case MLE_WRITEBLOCK:
1047 {
1048 CHAR filename[1027];
[2]1049
[551]1050 strcpy(filename, vw->exportfilename);
[878]1051 if (export_filename(hwnd, filename, !vw->fileattrreadonly))
[551]1052 MLEdoblock(hwndMLE, WRITE, filename);
1053 }
1054 break;
[2]1055
[551]1056 case MLE_FORMAT:
1057 if (!MLEgetreadonly(hwndMLE))
1058 MLEdoblock(hwndMLE, FORMAT, NULL);
1059 break;
[2]1060
[551]1061 case MLE_XOR:
1062 if (!MLEgetreadonly(hwndMLE))
1063 MLEdoblock(hwndMLE, XOR, NULL);
1064 break;
[2]1065
[551]1066 case MLE_ROT13:
1067 if (!MLEgetreadonly(hwndMLE))
1068 MLEdoblock(hwndMLE, ROT13, NULL);
1069 break;
[2]1070
[551]1071 case MLE_UPPERCASE:
1072 if (!MLEgetreadonly(hwndMLE))
1073 MLEdoblock(hwndMLE, UPPERCASE, NULL);
1074 break;
[2]1075
[551]1076 case MLE_LOWERCASE:
1077 if (!MLEgetreadonly(hwndMLE))
1078 MLEdoblock(hwndMLE, LOWERCASE, NULL);
1079 break;
[2]1080
[551]1081 case MLE_TOGGLECASE:
1082 if (!MLEgetreadonly(hwndMLE))
1083 MLEdoblock(hwndMLE, TOGGLECASE, NULL);
1084 break;
[2]1085
[551]1086 case MLE_JUMP:
1087 {
1088 ULONG numlines, linenum;
1089 CHAR s[35], ss[133];
1090 STRINGINPARMS sip;
[2]1091
[551]1092 sip.help = GetPString(IDS_NVLINEJUMPTEXT);
1093 sip.ret = s;
1094 *s = 0;
1095 sip.inputlen = 34;
1096 sip.title = GetPString(IDS_NVLINEJUMPTITLETEXT);
1097 numlines = MLEnumlines(hwndMLE);
[1395]1098 if (!numlines)
1099 if (!fAlertBeepOff)
1100 DosBeep(50, 100);
[551]1101 else {
[1394]1102 sprintf(ss,
[551]1103 GetPString(IDS_NVJUMPTEXT),
1104 GetPString(IDS_LINETEXT), 1, numlines);
[1394]1105 sip.prompt = ss;
[551]1106 WinDlgBox(HWND_DESKTOP,
1107 hwnd, InputDlgProc, FM3ModHandle, STR_FRAME, &sip);
1108 if (*s) {
1109 linenum = atol(s);
1110 if (linenum > 0 && linenum <= numlines) {
1111 MLEsettopline(hwndMLE, MLEstartofline(hwndMLE, linenum));
1112 MLEsetcurpos(hwndMLE, MLEstartofline(hwndMLE, linenum));
1113 }
1114 }
1115 }
1116 }
1117 break;
[2]1118
[551]1119 case MLE_CUTLINE: /* delete current line */
1120 if (!MLEgetreadonly(hwndMLE))
1121 MLEdeletecurline(hwndMLE);
1122 break;
[2]1123
[551]1124 case IDM_DELETE:
1125 case MLE_CLEAR:
1126 if (!MLEgetreadonly(hwndMLE))
1127 MLEclear(hwndMLE);
1128 break;
[2]1129
[551]1130 case DID_CANCEL: /* escape */
1131 if (MLEgetreadonly(hwndMLE))
1132 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
1133 else
1134 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(MLE_DESELECTALL, 0), MPVOID);
1135 break;
[2]1136
[551]1137 case MLE_QUIT: /* outtahere */
1138 MLEsetchanged(hwndMLE, FALSE);
1139 vw->ch = FALSE;
1140 /* intentional fallthru */
1141 case MLE_END:
1142 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
1143 break;
[2]1144
[551]1145 case MLE_SETFONT: /* select a new font */
1146 SetMLEFont(hwndMLE, &vw->fattrs, 0);
1147 PrfWriteProfileData(fmprof,
[1505]1148 FM3Str, "MLEFont", &vw->fattrs, sizeof(FATTRS));
[551]1149 break;
[2]1150
[551]1151 case MLE_SELECTALL:
1152 MLEselectall(hwndMLE);
1153 break;
[2]1154
[551]1155 case MLE_DESELECTALL:
1156 MLEsetcurpos(hwndMLE, MLEcurpos(hwndMLE));
1157 break;
[2]1158
[551]1159 case MLE_UNDO:
1160 if (!MLEgetreadonly(hwndMLE))
1161 MLEundo(hwndMLE);
1162 break;
[2]1163
[551]1164 case IDM_SAVETOCLIP:
1165 case MLE_COPYCLIP:
1166 MLEcopy(hwndMLE);
1167 break;
[2]1168
[551]1169 case MLE_CUTCLIP:
1170 if (!MLEgetreadonly(hwndMLE))
1171 MLEcut(hwndMLE);
1172 break;
[2]1173
[551]1174 case IDM_COLLECTFROMCLIP:
1175 case MLE_PASTECLIP:
1176 if (!MLEgetreadonly(hwndMLE))
1177 MLEpaste(hwndMLE);
1178 break;
[2]1179
[551]1180 case MLE_SENSITIVE:
1181 SetMenuCheck(vw->hwndMenu,
1182 MLE_SENSITIVE,
1183 &vw->srch.fInsensitive, TRUE, "MLEInsensitive");
1184 break;
[2]1185
[551]1186 case MLE_FINDFIRST: /* search */
1187 if (MLEfindfirst(hwnd, &vw->srch))
1188 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(MLE_FINDNEXT, 0), MPVOID);
1189 break;
[2]1190
[551]1191 case IDM_GREP:
1192 case MLE_FINDNEXT:
1193 {
1194 INT temp;
[2]1195
[551]1196 temp = MLEfindnext(hwnd, &vw->srch);
1197 if (temp < 0)
1198 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(MLE_FINDFIRST, 0), MPVOID);
1199 else if (temp > 0)
1200 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(MLE_FINDNEXT, 0), MPVOID);
1201 }
1202 break;
[2]1203
[551]1204 case MLE_TOGWRAP: /* toggle wrap mode */
1205 if (vw->hex != 1) {
1206 SetMenuCheck(vw->hwndMenu, MLE_TOGWRAP, &vw->fWrap, TRUE, "MLEWrap");
1207 MLEsetwrap(hwndMLE, vw->fWrap);
[2]1208 }
[551]1209 break;
[2]1210
[551]1211 case IDM_ABOUT:
1212 case MLE_ABOUT:
1213 saymsg(MB_ENTER | MB_ICONASTERISK,
1214 hwnd,
1215 GetPString(IDS_VIEWABOUTTITLETEXT),
1216 GetPString(IDS_VIEWABOUTTEXT));
1217 break;
1218 }
1219 return 0;
[2]1220
[551]1221 case WM_SAVEAPPLICATION:
1222 if (vw && ParentIsDesktop(hwnd, vw->hwndParent)) {
[2]1223
[551]1224 SWP swp;
1225
1226 WinQueryWindowPos(vw->hwndFrame, &swp);
1227 if (!(swp.fl & (SWP_HIDE | SWP_MINIMIZE | SWP_MAXIMIZE)))
1228 PrfWriteProfileData(fmprof,
1229 appname, "ViewSizePos", &swp, sizeof(swp));
1230 }
1231 break;
1232
1233 case WM_CLOSE: /* outtahere */
1234 WinSendMsg(hwnd, WM_SAVEAPPLICATION, MPVOID, MPVOID);
1235 if (vw) {
1236 if (vw->busy) {
1237 vw->killme = TRUE;
1238 return 0;
[2]1239 }
[551]1240 if (vw->ch && !MLEgetreadonly(hwndMLE)) {
[2]1241
[551]1242 APIRET temp;
[2]1243
[551]1244 temp = saymsg(MB_YESNOCANCEL | MB_ICONEXCLAMATION,
1245 hwnd, NullStr, GetPString(IDS_SAVECHANGESTEXT));
1246 if (temp == MBID_CANCEL)
1247 return 0;
[1394]1248 if (temp == MBID_YES){
[551]1249 WinSendMsg(hwnd,
[1394]1250 WM_COMMAND, MPFROM2SHORT(MLE_EXPORTFILE, 0), MPVOID);
1251 if (vw->fileattrreadonly) {
1252 temp = saymsg(MB_OKCANCEL | MB_ICONEXCLAMATION,
[1402]1253 hwnd, NullStr, GetPString(IDS_EDITREADONLYFILETEXT3));
[1394]1254 if (temp == MBID_CANCEL)
1255 return 0;
1256 }
1257 }
[2]1258 }
[551]1259 }
1260 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
1261 return 0;
[2]1262
[551]1263 case WM_DESTROY:
1264 DosPostEventSem(CompactSem);
1265 {
1266 BOOL dontclose = FALSE;
[2]1267
[551]1268 if (vw) {
1269 if (vw->hwndPopupMenu)
1270 WinDestroyWindow(vw->hwndPopupMenu);
1271 if (vw->accel)
1272 WinDestroyAccelTable(vw->accel);
1273 dontclose = vw->dontclose;
1274 WinSetWindowPtr(hwnd, QWL_USER, NULL);
1275 if (vw->hwndRestore) {
[2]1276
[551]1277 ULONG fl = SWP_SHOW | SWP_ACTIVATE | SWP_ZORDER;
1278 SWP swp;
[2]1279
[551]1280 if (WinQueryWindowPos(vw->hwndRestore, &swp)) {
1281 if (!(swp.fl & SWP_MAXIMIZE))
1282 fl |= SWP_RESTORE;
1283 WinSetWindowPos(vw->hwndRestore, HWND_TOP, 0, 0, 0, 0, fl);
1284 }
1285 }
[1039]1286 free(vw);
[2]1287 }
[551]1288 if (!dontclose &&
1289 ParentIsDesktop(hwnd, WinQueryWindow(WinQueryWindow(hwnd,
1290 QW_PARENT),
1291 QW_PARENT))) {
1292 if (!PostMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID))
1293 DosExit(EXIT_PROCESS, 1);
1294 }
1295 }
[1063]1296# ifdef FORTIFY
1297 Fortify_LeaveScope();
1298# endif
[551]1299 break;
[2]1300 }
[551]1301 return WinDefWindowProc(hwnd, msg, mp1, mp2);
[2]1302}
[793]1303
1304#pragma alloc_text(VIEWER,MLEEditorProc,MLESubProc)
1305#pragma alloc_text(STARTUP,StartMLEEditor)
Note: See TracBrowser for help on using the repository browser.