source: trunk/dll/viewer.c@ 879

Last change on this file since 879 was 879, checked in by Gregg Young, 18 years ago

Clean up of allow readonly files in editor.

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