source: trunk/dll/viewer.c@ 1673

Last change on this file since 1673 was 1673, checked in by Gregg Young, 13 years ago

Update to Doxygen comment style Ticket 55. Also some minor code cleanup.

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