source: trunk/dll/viewer.c@ 1029

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

Fixed early memory free; Added free_... functions to make fortify checking easier; Added fortify scopes; Delete now moves to trash can on systems with the xworkplace trash can installed.

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