source: trunk/dll/viewer.c@ 1221

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

Ticket 187: Move data declarations/definitions out of fm3dll.h

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