source: trunk/dll/viewer.c@ 1228

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

Ticket 187: Moved typedef's and some #define's from fm3dll.h

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