source: trunk/dll/viewer.c@ 1228

Last change on this file since 1228 was 1228, checked in by John Small, 17 years ago

Ticket 187: Moved typedef's and some #define's from fm3dll.h

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