source: trunk/dll/viewer.c @ 593

Last change on this file since 593 was 593, checked in by Gregg Young, 14 years ago

Changes to remove GetPString from window class names

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