source: trunk/dll/viewer.c@ 1162

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

Ticket 187: Draft 1: Functions only

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