source: branches/ticket_150/dll/viewer.c@ 869

Last change on this file since 869 was 847, checked in by Gregg Young, 18 years ago

Removed large file APIs from code where hey are not needed.

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