source: trunk/dll/viewer.c@ 1009

Last change on this file since 1009 was 1009, checked in by Steven Levine, 17 years ago

Add xfree xstrdup Fortify support
Add MT capable Fortify scope logic

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