source: trunk/dll/viewer.c@ 1036

Last change on this file since 1036 was 1036, checked in by Gregg Young, 17 years ago

More fortify changes eliminated the leave scope wrapper except in mainwnd.c Wrapper only unlaods stuuff (archivers, commands, etc

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