source: trunk/dll/viewer.c

Last change on this file was 1893, checked in by Gregg Young, 5 years ago

Fix some layout and font issues in the viewers

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 33.5 KB
Line 
1
2/***********************************************************************
3
4 $Id: viewer.c 1893 2020-05-26 20:04:17Z gyoung $
5
6 MLE text editor/viewer
7
8 Copyright (c) 1993-97 M. Kimes
9 Copyright (c) 2005, 2010 Steven H. Levine
10
11 23 May 05 SHL Use QWL_USER
12 17 Jul 06 SHL Use Runtime_Error
13 31 Aug 06 SHL Sync with disable_menuitem changes
14 30 Mar 07 GKY Remove GetPString for window class names
15 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
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
18 29 Feb 08 GKY Refactor global command line variables to notebook.h
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
21 08 Mar 09 GKY Additional strings move to String Table
22 17 JAN 10 GKY Changes to get working with Watcom 1.9 Beta (1/16/10). Mostly cast CHAR CONSTANT * as CHAR *.
23
24***********************************************************************/
25
26#include <stdlib.h>
27#include <string.h>
28#include <io.h>
29
30#define INCL_DOS
31#define INCL_WIN
32#define INCL_LONGLONG
33
34#include "fm3dll.h"
35#include "fm3dll2.h" // #define's for UM_*, control id's, etc.
36#include "viewer.h"
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)
42#include "fm3dlg.h"
43#include "fm3str.h"
44#include "mle.h"
45#include "errutil.h" // Dos_Error...
46#include "strutil.h" // GetPString
47#include "notebook.h" // External viewers
48#include "colors.h" // ColorDlgProc
49#include "mainwnd.h" // FillClient
50#include "codepage.h" // PickCodepage
51#include "dirs.h" // switch_to
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
57#include "misc.h" // SetMenuCheck, disable_menuitem
58#include "fonts.h" // SetMLEFont
59#include "wrappers.h" // xfopen
60#include "fortify.h"
61
62#pragma data_seg(DATA1)
63
64static PSZ pszSrcFile = __FILE__;
65
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
73static LONG Colors[COLORS_MAX] = { COLR_BLACK, COLR_PALEGRAY };
74static BOOL Firsttime = TRUE;
75
76HWND StartMLEEditor(HWND hwndClient, INT flags, CHAR * filename,
77 HWND hwndRestore)
78{
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
90 HWND hwndFrame, hwnd;
91 XMLEWNDPTR *vw;
92 ULONG flFrameFlags = FCF_SYSMENU | FCF_SIZEBORDER | FCF_ICON |
93 FCF_TITLEBAR | FCF_MINMAX | FCF_MENU | FCF_ACCELTABLE | FCF_NOBYTEALIGN;
94 ULONG ulResult;
95 BOOL OpenInViewer = FALSE, readonly = FALSE;
96 FILESTATUS3 fs3;
97
98 if (fExternalViewer || strcmp(realappname, FM3Str))
99 hwndClient = HWND_DESKTOP;
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,
103 GetPString(IDS_WARNINGTEXT),
104 GetPString(IDS_EDITREADONLYFILETEXT),
105 filename);
106 switch (ulResult){
107 case MBID_YES:{
108 readonly = TRUE;
109 break;
110 }
111
112 case MBID_NO:
113 if (fUseNewViewer)
114 return StartViewer(hwndClient, (USHORT) flags, filename, hwndRestore);
115 else{
116 OpenInViewer = TRUE;
117 break;
118 }
119
120 case MBID_CANCEL:
121 return (HWND) 0;
122 }
123 }
124# ifdef FORTIFY
125 Fortify_EnterScope();
126# endif
127 vw = xmallocz(sizeof(XMLEWNDPTR), pszSrcFile, __LINE__);
128 if (!vw)
129 return (HWND) 0;
130 vw->size = sizeof(XMLEWNDPTR);
131 if (readonly)
132 vw->fileattrreadonly = TRUE;
133 else
134 vw->fileattrreadonly = FALSE;
135 if (flags & 1) {
136 if (flags & 8)
137 vw->hex = 2;
138 else if (flags & 16)
139 vw->hex = 1;
140 else if (!fGuessType)
141 vw->hex = 2;
142 }
143 else
144 vw->hex = 2;
145 vw->hwndParent = (hwndClient) ? hwndClient : HWND_DESKTOP;
146 vw->srch.size = sizeof(SRCHPTR);
147 if (flags & 4)
148 vw->dontclose = TRUE;
149 if (filename)
150 strcpy(vw->exportfilename, filename);
151 vw->hwndRestore = hwndRestore;
152 if (ParentIsDesktop(hwndClient, hwndClient))
153 flFrameFlags |= FCF_TASKLIST;
154 hwndFrame = WinCreateStdWindow(hwndClient,
155 0,
156 &flFrameFlags,
157 (CHAR *) WC_MLEEDITOR,
158 NullStr,
159 fwsAnimate,
160 FM3ModHandle, MLE_FRAME, &hwnd);
161 if (hwndFrame) {
162 vw->hwndFrame = hwndFrame;
163 if (!ParentIsDesktop(hwndFrame, hwndClient) && !(flags & 2)) {
164
165 SWP swp;
166
167 FillClient(hwndClient, &swp, NULL, FALSE);
168 WinSetWindowPos(hwndFrame,
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);
176 }
177 else if (flFrameFlags & FCF_TASKLIST) {
178
179 SWP swp, swpD;
180 ULONG size = sizeof(swp);
181 LONG cxScreen, cyScreen;
182
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;
193 }
194 WinSetWindowPos(hwndFrame,
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);
202 }
203 if (OpenInViewer | (flags & 1))
204 MLEsetreadonly(hwndMLE, ((flags & 1) != 0));
205 WinSetWindowPtr(hwnd, QWL_USER, (PVOID) vw);
206 if (!PostMsg(hwnd, UM_SETUP, MPVOID, MPFROMLONG(hwndClient)))
207 WinSendMsg(hwnd, UM_SETUP, MPVOID, MPFROMLONG(hwndClient));
208 }
209 return hwndFrame;
210}
211
212MRESULT EXPENTRY MLESubProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
213{
214
215 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
216 XMLEWNDPTR *vw;
217
218 switch (msg) {
219 case WM_SETFOCUS:
220 if (mp2)
221 PostMsg(WinQueryWindow(hwnd, QW_PARENT), UM_SELECT, mp1, mp2);
222 break;
223
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;
241
242 mr = oldproc(hwnd, msg, mp1, mp2);
243
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];
288
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 }
297 }
298 }
299 break;
300
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;
307 }
308 }
309 break;
310
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 }
332 if (!*ftprun && !fFtpRunWPSDefault)
333 WinSendMsg(vw->hwndPopupMenu, MM_DELETEITEM,
334 MPFROM2SHORT(MLE_VIEWFTP, FALSE), MPVOID);
335 if (!*httprun && !fHttpRunWPSDefault)
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);
340 }
341 }
342 break;
343 }
344 return oldproc(hwnd, msg, mp1, mp2);
345}
346
347MRESULT EXPENTRY MLEEditorProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
348{
349
350 XMLEWNDPTR *vw;
351
352 if (msg != WM_CREATE && msg != UM_SETUP)
353 vw = (XMLEWNDPTR *) WinQueryWindowPtr(hwnd, QWL_USER);
354 else
355 vw = NULL;
356
357 switch (msg) {
358 case WM_CREATE:
359 // create MLE window
360 if (!WinCreateWindow(hwnd,
361 WC_MLE,
362 (PSZ) NULL,
363 MLS_VSCROLL | MLS_BORDER |
364 WS_VISIBLE | MLS_HSCROLL,
365 0,
366 0,
367 0, 0, hwnd, HWND_TOP, MLE_MLE, MPVOID, MPVOID)) {
368 Win_Error(hwnd, hwnd, pszSrcFile, __LINE__,
369 PCSZ_WINCREATEWINDOW);
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:
383 {
384 ULONG ret;
385 CHAR lbl[162];
386
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 }
417 }
418 break;
419 }
420 break;
421
422 case UM_SETUP2:
423 vw = WinQueryWindowPtr(hwnd, QWL_USER);
424 if (vw) {
425
426 CHAR s[CCHMAXPATH + 8];
427
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) ?
442 vw->exportfilename : (CHAR *) GetPString(IDS_UNTITLEDTEXT));
443 if (fMoreButtons) {
444 WinSetWindowText(hwndName,
445 (*vw->exportfilename) ?
446 vw->exportfilename : (CHAR *) GetPString(IDS_UNTITLEDTEXT));
447 WinSetWindowText(hwndDate, NullStr);
448 WinSetWindowText(hwndAttr, NullStr);
449 }
450 if (hwndStatus)
451 WinSetWindowText(hwndStatus,
452 (CHAR *) GetPString(IDS_INTERNALVIEWEREDITORTITLETEXT));
453 }
454 }
455 return 0;
456
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;
464 MLEsetcurpos(hwndMLE, 0);
465 MLEclearall(hwndMLE);
466 MLEsetlimit(hwndMLE, -1);
467 MLEsetformat(hwndMLE, MLFIE_NOTRANS);
468 WinSetSysValue(HWND_DESKTOP, SV_INSERTMODE, TRUE);
469 vw->fWrap = FALSE;
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;
477
478 size = sizeof(BOOL);
479 PrfQueryProfileData(fmprof,
480 (CHAR *) FM3Str, "MLEWrap", (PVOID) & vw->fWrap, &size);
481 size = sizeof(BOOL);
482 PrfQueryProfileData(fmprof,
483 FM3Str,
484 "MLEstriptrail",
485 (PVOID) & vw->fStripTrail, &size);
486 size = sizeof(BOOL);
487 PrfQueryProfileData(fmprof,
488 FM3Str,
489 "MLEstriptraillines",
490 (PVOID) & vw->fStripTrailLines, &size);
491 size = sizeof(BOOL);
492 PrfQueryProfileData(fmprof,
493 FM3Str,
494 "MLEInsensitve",
495 (PVOID) & vw->srch.fInsensitive, &size);
496 size = sizeof(INT);
497 PrfQueryProfileData(fmprof,
498 FM3Str,
499 "MLEExpandTabs", (PVOID) & vw->ExpandTabs, &size);
500 size = sizeof(INT);
501 PrfQueryProfileData(fmprof,
502 FM3Str,
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;
513
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);
523
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;
534
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;
541
542 if (!PrfQueryProfileData(fmprof,
543 FM3Str,
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) {
568
569 ULONG size;
570
571 Firsttime = FALSE;
572 size = sizeof(ULONG);
573 PrfQueryProfileData(fmprof,
574 FM3Str,
575 "MLEBackgroundcolor",
576 &Colors[COLORS_BACKGROUND], &size);
577 size = sizeof(ULONG);
578 PrfQueryProfileData(fmprof,
579 FM3Str,
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;
607 }
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);
616 return 0;
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;
629 strcpy(vw->exportfilename, (CHAR *)mp2);
630 }
631 }
632 else {
633 vw->ch = FALSE;
634 *vw->exportfilename = 0;
635 }
636 WinSendMsg(hwnd, UM_SETUP2, MPVOID, MPVOID);
637 return 0;
638
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)
658 break;
659 return 0;
660
661 case UM_FOCUSME:
662 WinSetFocus(HWND_DESKTOP, hwndMLE);
663 return 0;
664
665 case WM_ERASEBACKGROUND:
666 WinFillRect((HPS) mp1, (PRECTL) mp2, 0x00d0d0d0);
667 return 0;
668
669 case WM_PAINT:
670 {
671 RECTL rcl;
672 HPS hps;
673
674 hps = WinBeginPaint(hwnd, (HPS) 0, NULL);
675 WinQueryWindowRect(hwnd, &rcl);
676 WinFillRect(hps, &rcl, CLR_PALEGRAY);
677 WinEndPaint(hps);
678 }
679 break;
680
681 case UM_LOADFILE:
682 if ((CHAR *)mp1) {
683 // switch_to(mp1);
684 if (MLEbackgroundload(hwnd,
685 UM_CONTAINER_FILLED,
686 hwndMLE, (CHAR *)mp1, vw->hex) != -1) {
687 vw->busy = TRUE;
688 WinEnableWindow(vw->hwndMenu, FALSE);
689 }
690 }
691 return 0;
692
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;
701 }
702 break;
703 }
704 return 0;
705
706 case WM_COMMAND:
707 if (vw->busy && SHORT1FROMMP(mp1) != MLE_QUIT) {
708 if (!fAlertBeepOff)
709 DosBeep(50, 100);
710 return 0;
711 }
712 switch (SHORT1FROMMP(mp1)) {
713
714 case MLE_VIEWFTP:
715 MLEinternet(hwndMLE, TRUE);
716 break;
717
718 case MLE_VIEWHTTP:
719 MLEinternet(hwndMLE, FALSE);
720 break;
721
722 case IDM_NEXTWINDOW:
723 WinSendMsg(hwndMLE,
724 WM_CHAR,
725 MPFROM2SHORT((KC_CHAR | KC_VIRTUALKEY),
726 MAKEUSHORT(1, 9)), MPFROM2SHORT(9, VK_TAB));
727 break;
728
729 case IDM_COLORPALETTE:
730 {
731 COLORS co;
732 LONG temp[COLORS_MAX];
733
734 memset(&co, 0, sizeof(co));
735 co.size = sizeof(co);
736 co.numcolors = COLORS_MAX;
737 co.colors = Colors;
738 co.descriptions = IDS_EDCOLORS1TEXT;
739 co.origs = temp;
740 co.prompt = IDS_EDCOLORSPROMPTTEXT;
741 memcpy(temp, Colors, sizeof(LONG) * COLORS_MAX);
742 if (WinDlgBox(HWND_DESKTOP,
743 hwnd,
744 ColorDlgProc,
745 FM3ModHandle, COLOR_FRAME, (PVOID) & co)) {
746 WinSendMsg(hwndMLE,
747 MLM_SETTEXTCOLOR,
748 MPFROMLONG(standardcolors[Colors[COLORS_FOREGROUND]]),
749 MPVOID);
750 PrfWriteProfileData(fmprof,
751 FM3Str,
752 "MLEForegroundcolor",
753 &Colors[COLORS_FOREGROUND], sizeof(LONG));
754 WinSendMsg(hwndMLE,
755 MLM_SETBACKCOLOR,
756 MPFROMLONG(standardcolors[Colors[COLORS_BACKGROUND]]),
757 MPVOID);
758 PrfWriteProfileData(fmprof,
759 FM3Str,
760 "MLEBackgroundcolor",
761 &Colors[COLORS_BACKGROUND], sizeof(LONG));
762 }
763 }
764 break;
765
766 case IDM_HELP:
767 if (hwndHelp)
768 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
769 MPFROM2SHORT(HELP_EDITOR, 0), MPFROMSHORT(HM_RESOURCEID));
770 break;
771
772 case MLE_CODEPAGE:
773 vw->cp = PickCodepage(hwnd);
774 vw->fattrs.usCodePage = (USHORT) vw->cp;
775 WinSendMsg(hwndMLE, MLM_SETFONT, MPFROMP(&vw->fattrs), MPVOID);
776 PrfWriteProfileData(fmprof,
777 FM3Str, "MLEFont", &vw->fattrs, sizeof(FATTRS));
778 break;
779
780 case MLE_NEWFILE:
781 if (!MLEgetreadonly(hwndMLE)) {
782 if (vw->ch) {
783
784 APIRET temp;
785
786 temp = saymsg(MB_YESNOCANCEL | MB_ICONEXCLAMATION,
787 hwnd, NullStr, GetPString(IDS_SAVECHANGESTEXT));
788 if (temp == MBID_CANCEL)
789 break;
790 if (temp == MBID_YES){
791 WinSendMsg(hwnd,
792 WM_COMMAND, MPFROM2SHORT(MLE_EXPORTFILE, 0), MPVOID);
793 if (vw->fileattrreadonly) {
794 temp = saymsg(MB_OKCANCEL | MB_ICONEXCLAMATION,
795 hwnd, NullStr, GetPString(IDS_EDITREADONLYFILETEXT3));
796 if (temp == MBID_CANCEL)
797 return 0;
798 }
799 }
800 }
801 MLEclearall(hwndMLE);
802 *vw->exportfilename = 0;
803 vw->ch = FALSE;
804 MLEsetchanged(hwndMLE, FALSE);
805 WinSendMsg(hwnd, UM_SETUP2, MPVOID, MPVOID);
806 }
807 break;
808
809 case MLE_TOGGLEREADONLY:
810 if (vw->busy || vw->hex == 1) {
811 if (!fAlertBeepOff)
812 DosBeep(50, 100);
813 }
814 else {
815 // I dunno why I gotta reset the colors...
816 BOOL ro;
817 LONG fColor, bColor;
818
819 fColor = (LONG) WinSendMsg(hwndMLE,
820 MLM_QUERYTEXTCOLOR, MPVOID, MPVOID);
821 bColor = (LONG) WinSendMsg(hwndMLE,
822 MLM_QUERYBACKCOLOR, MPVOID, MPVOID);
823 ro = MLEgetreadonly(hwndMLE);
824 ro = (ro) ? FALSE : TRUE;
825 MLEsetreadonly(hwndMLE, ro);
826 disable_menuitem(vw->hwndMenu, MLE_FILEMENU, ro);
827 disable_menuitem(vw->hwndMenu, MLE_CUTCLIP, ro);
828 disable_menuitem(vw->hwndMenu, MLE_PASTECLIP, ro);
829 disable_menuitem(vw->hwndMenu, MLE_CLEAR, ro);
830 disable_menuitem(vw->hwndMenu, MLE_CUTLINE, ro);
831 disable_menuitem(vw->hwndMenu, MLE_BLOCKMENU, ro);
832 WinSendMsg(hwndMLE, MLM_SETTEXTCOLOR, MPFROMLONG(fColor), MPVOID);
833 WinSendMsg(hwndMLE, MLM_SETBACKCOLOR, MPFROMLONG(bColor), MPVOID);
834 }
835 break;
836
837 case MLE_EXPORTAS:
838 vw->saveas = TRUE;
839 WinSendMsg(hwnd,
840 WM_COMMAND, MPFROM2SHORT(MLE_SETEXPORTFILE, 0), MPVOID);
841 break;
842
843 case IDM_RENAME:
844 case MLE_SETEXPORTFILE:
845 if (vw && !MLEgetreadonly(hwndMLE)) {
846
847 CHAR filename[1027];
848 ULONG ulResult;
849
850 strcpy(filename, vw->exportfilename);
851 if (export_filename(hwnd, filename, !vw->fileattrreadonly)) {
852 if (stricmp(filename, vw->exportfilename)) {
853 vw->ch = TRUE;
854 vw->fileattrreadonly = FALSE;
855 MLEsetchanged(hwndMLE, TRUE);
856 strcpy(vw->exportfilename, filename);
857 WinSendMsg(hwnd, UM_SETUP2, MPVOID, MPVOID);
858 if (vw->saveas) {
859 vw->saveas = FALSE;
860 WinSendMsg(hwnd,
861 WM_COMMAND, MPFROM2SHORT(MLE_EXPORTFILE, 0), MPVOID);
862 }
863 }
864 else if (vw->fileattrreadonly){
865 ulResult = saymsg(MB_OKCANCEL | MB_ICONQUESTION | MB_DEFBUTTON1, HWND_DESKTOP,
866 GetPString(IDS_WARNINGTEXT),
867 GetPString(IDS_EDITREADONLYFILETEXT2),
868 filename);
869 if (ulResult == MBID_OK){
870 WinSendMsg(hwnd,
871 WM_COMMAND, MPFROM2SHORT(MLE_SETEXPORTFILE, 0), MPVOID);
872 break;
873 }
874 else
875 vw->saveas = FALSE;
876 }
877 else if (vw->saveas) {
878 vw->saveas = FALSE;
879 WinSendMsg(hwnd,
880 WM_COMMAND, MPFROM2SHORT(MLE_EXPORTFILE, 0), MPVOID);
881 }
882 }
883 }
884 break;
885
886 case MLE_EXPORTFILE:
887 if (vw->fileattrreadonly){
888 WinSendMsg(hwnd,
889 WM_COMMAND, MPFROM2SHORT(MLE_SETEXPORTFILE, 0), MPVOID);
890 break;
891 }
892 if (!MLEgetreadonly(hwndMLE)) {
893
894 ULONG oldsize;
895
896 if (!*vw->exportfilename ||
897 strchr(vw->exportfilename, '?') ||
898 strchr(vw->exportfilename, '*')) {
899 WinSendMsg(hwnd,
900 WM_COMMAND, MPFROM2SHORT(MLE_SETEXPORTFILE, 0), MPVOID);
901 if (!*vw->exportfilename ||
902 strchr(vw->exportfilename, '?') ||
903 strchr(vw->exportfilename, '*'))
904 break;
905 }
906 {
907 // zero file length instead of unlink (protects EAs from loss)
908 FILE *fp;
909 CHAR *moder = "r+";
910
911 fp = xfopen(vw->exportfilename, moder, pszSrcFile, __LINE__, TRUE);
912 if (fp) {
913 oldsize = filelength(fileno(fp));
914 DosSetFileSize(fileno(fp), 0);
915 fclose(fp);
916 }
917 }
918 if (!MLEexportfile(hwndMLE,
919 vw->exportfilename,
920 vw->ExpandTabs,
921 vw->fStripTrailLines, vw->fStripTrail)) {
922 FILE *fp;
923 CHAR *moder = "r+";
924
925 Runtime_Error(pszSrcFile, __LINE__, "MLEexportfile");
926 fp = xfopen(vw->exportfilename, moder, pszSrcFile, __LINE__, FALSE);
927 if (fp) {
928 DosSetFileSize(fileno(fp), oldsize);
929 fclose(fp);
930 }
931 }
932 else {
933 vw->ch = FALSE;
934 MLEsetchanged(hwndMLE, FALSE);
935 }
936 }
937 break;
938
939 case IDM_EDIT:
940 case IDM_VIEW:
941 case MLE_LOADFILE:
942 if (vw->ch && !MLEgetreadonly(hwndMLE)) {
943
944 APIRET temp;
945
946 temp = saymsg(MB_YESNO, hwnd, NullStr, GetPString(IDS_LOADOVERTEXT));
947 if (temp != MBID_YES)
948 break;
949 }
950 // intentional fallthru
951 case MLE_INSERTFILE:
952 if (!MLEgetreadonly(hwndMLE)) {
953
954 CHAR filename[1027];
955
956 strcpy(filename, vw->importfilename);
957 if (insert_filename(hwnd,
958 filename,
959 (SHORT1FROMMP(mp1) == MLE_INSERTFILE) ?
960 FALSE : TRUE, FALSE)) {
961 strcpy(vw->importfilename, filename);
962 if (SHORT1FROMMP(mp1) == MLE_INSERTFILE)
963 MLEinsertfile(hwndMLE, filename);
964 else {
965 if (MLEbackgroundload(hwnd,
966 UM_CONTAINER_FILLED,
967 hwndMLE, filename, vw->hex) != -1) {
968 vw->busy = TRUE;
969 WinEnableWindow(vw->hwndMenu, FALSE);
970 }
971 }
972 }
973 }
974 break;
975
976 case MLE_STRIPTRAILBLANKS:
977 SetMenuCheck(vw->hwndMenu,
978 MLE_STRIPTRAILBLANKS,
979 &vw->fStripTrail, TRUE, "MLEstriptrail");
980 break;
981
982 case MLE_STRIPTRAILLINES:
983 SetMenuCheck(vw->hwndMenu,
984 MLE_STRIPTRAILLINES,
985 &vw->fStripTrailLines, TRUE, "MLEstriptraillines");
986 break;
987
988 case MLE_TAB:
989 {
990 STRINGINPARMS sip;
991 CHAR s[35];
992
993 sip.help = GetPString(IDS_TABSTOPHELPTEXT);
994 sip.ret = s;
995 sprintf(s, "%u", vw->TabStops);
996 sip.prompt = GetPString(IDS_TABSTOPPROMPTTEXT);
997 sip.inputlen = 34;
998 sip.title = GetPString(IDS_TABSTOPTITLETEXT);
999 WinDlgBox(HWND_DESKTOP,
1000 hwnd, InputDlgProc, FM3ModHandle, STR_FRAME, &sip);
1001 if (*s && atoi(s) > -1 && atoi(s) < 512) {
1002 vw->TabStops = atoi(s);
1003 WinSendMsg(hwndMLE,
1004 MLM_SETTABSTOP, MPFROMLONG(vw->TabStops), MPVOID);
1005 PrfWriteProfileData(fmprof,
1006 FM3Str,
1007 "MLETabStops", &vw->TabStops, sizeof(INT));
1008 }
1009 }
1010 break;
1011
1012 case MLE_EXPANDTABS:
1013 {
1014 BOOL tempbool;
1015 STRINGINPARMS sip;
1016 CHAR s[35];
1017
1018 sip.help = GetPString(IDS_EXTABHELPTEXT);
1019 sip.ret = s;
1020 sprintf(s, "%u", vw->ExpandTabs);
1021 sip.prompt = GetPString(IDS_EXTABPROMPTTEXT);
1022 sip.inputlen = 34;
1023 sip.title = GetPString(IDS_EXTABTITLETEXT);
1024 WinDlgBox(HWND_DESKTOP,
1025 hwnd, InputDlgProc, FM3ModHandle, STR_FRAME, &sip);
1026 if (*s && atoi(s) > -1 && atoi(s) < 33) {
1027 vw->ExpandTabs = atoi(s);
1028 tempbool = (vw->ExpandTabs != 0);
1029 SetMenuCheck(vw->hwndMenu, MLE_EXPANDTABS, &tempbool, FALSE, NULL);
1030 PrfWriteProfileData(fmprof,
1031 FM3Str,
1032 "MLEExpandTabs", &vw->ExpandTabs, sizeof(INT));
1033 }
1034 }
1035 break;
1036
1037 case MLE_APPENDCLIP:
1038 MLEdoblock(hwndMLE, APPENDCLIP, NULL);
1039 break;
1040
1041 case MLE_WRITEBLOCK:
1042 {
1043 CHAR filename[1027];
1044
1045 strcpy(filename, vw->exportfilename);
1046 if (export_filename(hwnd, filename, !vw->fileattrreadonly))
1047 MLEdoblock(hwndMLE, WRITE, filename);
1048 }
1049 break;
1050
1051 case MLE_FORMAT:
1052 if (!MLEgetreadonly(hwndMLE))
1053 MLEdoblock(hwndMLE, FORMAT, NULL);
1054 break;
1055
1056 case MLE_XOR:
1057 if (!MLEgetreadonly(hwndMLE))
1058 MLEdoblock(hwndMLE, XOR, NULL);
1059 break;
1060
1061 case MLE_ROT13:
1062 if (!MLEgetreadonly(hwndMLE))
1063 MLEdoblock(hwndMLE, ROT13, NULL);
1064 break;
1065
1066 case MLE_UPPERCASE:
1067 if (!MLEgetreadonly(hwndMLE))
1068 MLEdoblock(hwndMLE, UPPERCASE, NULL);
1069 break;
1070
1071 case MLE_LOWERCASE:
1072 if (!MLEgetreadonly(hwndMLE))
1073 MLEdoblock(hwndMLE, LOWERCASE, NULL);
1074 break;
1075
1076 case MLE_TOGGLECASE:
1077 if (!MLEgetreadonly(hwndMLE))
1078 MLEdoblock(hwndMLE, TOGGLECASE, NULL);
1079 break;
1080
1081 case MLE_JUMP:
1082 {
1083 ULONG numlines, linenum;
1084 CHAR s[35], ss[133];
1085 STRINGINPARMS sip;
1086
1087 sip.help = GetPString(IDS_NVLINEJUMPTEXT);
1088 sip.ret = s;
1089 *s = 0;
1090 sip.inputlen = 34;
1091 sip.title = GetPString(IDS_NVLINEJUMPTITLETEXT);
1092 numlines = MLEnumlines(hwndMLE);
1093 if (!numlines)
1094 if (!fAlertBeepOff)
1095 DosBeep(50, 100);
1096 else {
1097 sprintf(ss,
1098 GetPString(IDS_NVJUMPTEXT),
1099 GetPString(IDS_LINETEXT), 1, numlines);
1100 sip.prompt = ss;
1101 WinDlgBox(HWND_DESKTOP,
1102 hwnd, InputDlgProc, FM3ModHandle, STR_FRAME, &sip);
1103 if (*s) {
1104 linenum = atol(s);
1105 if (linenum > 0 && linenum <= numlines) {
1106 MLEsettopline(hwndMLE, MLEstartofline(hwndMLE, linenum));
1107 MLEsetcurpos(hwndMLE, MLEstartofline(hwndMLE, linenum));
1108 }
1109 }
1110 }
1111 }
1112 break;
1113
1114 case MLE_CUTLINE: // delete current line
1115 if (!MLEgetreadonly(hwndMLE))
1116 MLEdeletecurline(hwndMLE);
1117 break;
1118
1119 case IDM_DELETE:
1120 case MLE_CLEAR:
1121 if (!MLEgetreadonly(hwndMLE))
1122 MLEclear(hwndMLE);
1123 break;
1124
1125 case DID_CANCEL: // escape
1126 if (MLEgetreadonly(hwndMLE))
1127 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
1128 else
1129 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(MLE_DESELECTALL, 0), MPVOID);
1130 break;
1131
1132 case MLE_QUIT: // outtahere
1133 MLEsetchanged(hwndMLE, FALSE);
1134 vw->ch = FALSE;
1135 // intentional fallthru
1136 case MLE_END:
1137 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
1138 break;
1139
1140 case MLE_SETFONT: // select a new font
1141 SetMLEFont(hwndMLE, &vw->fattrs, 2);
1142 PrfWriteProfileData(fmprof,
1143 FM3Str, "MLEFont", &vw->fattrs, sizeof(FATTRS));
1144 break;
1145
1146 case MLE_SELECTALL:
1147 MLEselectall(hwndMLE);
1148 break;
1149
1150 case MLE_DESELECTALL:
1151 MLEsetcurpos(hwndMLE, MLEcurpos(hwndMLE));
1152 break;
1153
1154 case MLE_UNDO:
1155 if (!MLEgetreadonly(hwndMLE))
1156 MLEundo(hwndMLE);
1157 break;
1158
1159 case IDM_SAVETOCLIP:
1160 case MLE_COPYCLIP:
1161 MLEcopy(hwndMLE);
1162 break;
1163
1164 case MLE_CUTCLIP:
1165 if (!MLEgetreadonly(hwndMLE))
1166 MLEcut(hwndMLE);
1167 break;
1168
1169 case IDM_COLLECTFROMCLIP:
1170 case MLE_PASTECLIP:
1171 if (!MLEgetreadonly(hwndMLE))
1172 MLEpaste(hwndMLE);
1173 break;
1174
1175 case MLE_SENSITIVE:
1176 SetMenuCheck(vw->hwndMenu,
1177 MLE_SENSITIVE,
1178 &vw->srch.fInsensitive, TRUE, "MLEInsensitive");
1179 break;
1180
1181 case MLE_FINDFIRST: // search
1182 if (MLEfindfirst(hwnd, &vw->srch))
1183 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(MLE_FINDNEXT, 0), MPVOID);
1184 break;
1185
1186 case IDM_GREP:
1187 case MLE_FINDNEXT:
1188 {
1189 INT temp;
1190
1191 temp = MLEfindnext(hwnd, &vw->srch);
1192 if (temp < 0)
1193 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(MLE_FINDFIRST, 0), MPVOID);
1194 else if (temp > 0)
1195 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(MLE_FINDNEXT, 0), MPVOID);
1196 }
1197 break;
1198
1199 case MLE_TOGWRAP: // toggle wrap mode
1200 if (vw->hex != 1) {
1201 SetMenuCheck(vw->hwndMenu, MLE_TOGWRAP, &vw->fWrap, TRUE, "MLEWrap");
1202 MLEsetwrap(hwndMLE, vw->fWrap);
1203 }
1204 break;
1205
1206 case IDM_ABOUT:
1207 case MLE_ABOUT:
1208 saymsg(MB_ENTER | MB_ICONASTERISK,
1209 hwnd,
1210 GetPString(IDS_VIEWABOUTTITLETEXT),
1211 GetPString(IDS_VIEWABOUTTEXT));
1212 break;
1213 }
1214 return 0;
1215
1216 case WM_SAVEAPPLICATION:
1217 if (vw && ParentIsDesktop(hwnd, vw->hwndParent)) {
1218
1219 SWP swp;
1220
1221 WinQueryWindowPos(vw->hwndFrame, &swp);
1222 if (!(swp.fl & (SWP_HIDE | SWP_MINIMIZE | SWP_MAXIMIZE)))
1223 PrfWriteProfileData(fmprof,
1224 appname, "ViewSizePos", &swp, sizeof(swp));
1225 }
1226 break;
1227
1228 case WM_CLOSE: // outtahere
1229 WinSendMsg(hwnd, WM_SAVEAPPLICATION, MPVOID, MPVOID);
1230 if (vw) {
1231 if (vw->busy) {
1232 vw->killme = TRUE;
1233 return 0;
1234 }
1235 if (vw->ch && !MLEgetreadonly(hwndMLE)) {
1236
1237 APIRET temp;
1238
1239 temp = saymsg(MB_YESNOCANCEL | MB_ICONEXCLAMATION,
1240 hwnd, NullStr, GetPString(IDS_SAVECHANGESTEXT));
1241 if (temp == MBID_CANCEL)
1242 return 0;
1243 if (temp == MBID_YES){
1244 WinSendMsg(hwnd,
1245 WM_COMMAND, MPFROM2SHORT(MLE_EXPORTFILE, 0), MPVOID);
1246 if (vw->fileattrreadonly) {
1247 temp = saymsg(MB_OKCANCEL | MB_ICONEXCLAMATION,
1248 hwnd, NullStr, GetPString(IDS_EDITREADONLYFILETEXT3));
1249 if (temp == MBID_CANCEL)
1250 return 0;
1251 }
1252 }
1253 }
1254 }
1255 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
1256 return 0;
1257
1258 case WM_DESTROY:
1259 DosPostEventSem(CompactSem);
1260 {
1261 BOOL dontclose = FALSE;
1262
1263 if (vw) {
1264 if (vw->hwndPopupMenu)
1265 WinDestroyWindow(vw->hwndPopupMenu);
1266 if (vw->accel)
1267 WinDestroyAccelTable(vw->accel);
1268 dontclose = vw->dontclose;
1269 WinSetWindowPtr(hwnd, QWL_USER, NULL);
1270 if (vw->hwndRestore) {
1271
1272 ULONG fl = SWP_SHOW | SWP_ACTIVATE | SWP_ZORDER;
1273 SWP swp;
1274
1275 if (WinQueryWindowPos(vw->hwndRestore, &swp)) {
1276 if (!(swp.fl & SWP_MAXIMIZE))
1277 fl |= SWP_RESTORE;
1278 WinSetWindowPos(vw->hwndRestore, HWND_TOP, 0, 0, 0, 0, fl);
1279 }
1280 }
1281 free(vw);
1282 }
1283 if (!dontclose &&
1284 ParentIsDesktop(hwnd, WinQueryWindow(WinQueryWindow(hwnd,
1285 QW_PARENT),
1286 QW_PARENT))) {
1287 if (!PostMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID))
1288 DosExit(EXIT_PROCESS, 1);
1289 }
1290 }
1291# ifdef FORTIFY
1292 Fortify_LeaveScope();
1293# endif
1294 break;
1295 }
1296 return WinDefWindowProc(hwnd, msg, mp1, mp2);
1297}
1298
1299#pragma alloc_text(VIEWER,MLEEditorProc,MLESubProc)
1300#pragma alloc_text(STARTUP,StartMLEEditor)
Note: See TracBrowser for help on using the repository browser.