source: trunk/dll/viewer.c@ 1047

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

Minor code cleanup

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