home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Professional / OS2PRO194.ISO / os2 / editor / pmview / pmview.c next >
C/C++ Source or Header  |  1994-01-31  |  97KB  |  3,264 lines

  1. //UTILITIES
  2. //DOUGLAS BOLING
  3. //PMVIEW.C
  4.  
  5. //=============================================================================
  6. // PMVIEW.C -- A file browse program for the OS/2 Presentation Manager.
  7. //
  8. // Copyright (c) 1990 Ziff Communications
  9. //
  10. // Written by Douglas Boling
  11. // Modified by K. L. Singer as follows:
  12. //  1. Fixed bug when displaying ASCII bytes > 7F in Hex display.
  13. //  2. Corrected to display found search string as top line of Hex display.
  14. //  3. Added Hex string search option.
  15. //  4. Corrected inability to scroll past 64K using vertical scroll slider.
  16. //  5. Corrected random posiition in top line when using vert. scroll slider.
  17. //  6. Added Hex offset and Line No. options in Search Goto command.
  18. //  7. Corrected expanding of Tabs.
  19. //  8. Corrected Hex display when jumping to/near end of file.
  20. //  9. Modified End key to go to start of last line (ASCII)/16-byte para (Hex).
  21. // 10. Corrected repeating lines of text between last CR and last byte of file.
  22. // 11. Corrected to prevent scrolling of Hex display beyond end of file.
  23. // 12. Added Hex-EBCDIC display option.
  24. // 13. Corrected to ensure vertical scroll slider visibility in Hex display.
  25. // 14. Corrected problem introduced by item 5.
  26. // 15. Modified Open File Dialog to put name of viewed file at top of list box.
  27. // 16. Corrected incorrect file name displayed in "Unable to open file" msg.
  28. // 17. Added file name filter retention between Open File dialogs.
  29. // 18. Added "New" item on File sub-menu to close file and leave PMVIEW active.
  30. // 19. Changed shortcut key for Exit to Alt-X (from Alt-E) to conform to CUA.
  31. // 20. Corrected handling of command line option for slash and upper case.
  32. // 21. Added command line parameter /M to exclude Min. button from frame wndw.
  33. // 22. Added mnemonic keys for all dialog box items.
  34. // 23. Modified Open File dialog box to place file entry field at top of box.
  35. // 24. Modified all dialog boxes to be centered, when possible, in client wndw.
  36. // 25. Added capability to include wild cards in cmd line file name as filter.
  37. // 26. Modified title bar and moved Searching... msg to box to conform to CUA.
  38. // 27. Added on-line help facility.
  39. // 28. Corrected window status to be active/focus when executed from CMD.
  40. // 29. Added option to display file position at the bottom of the display.
  41. // 30. Added hourglass pointer during waiting periods.
  42. // 31. Added XGA support and selections for all OS/2 1.3 VIO font sizes.
  43. // 32. Added ability to accept dragged and dropped file from OS/2 1.3 appl.
  44. // 33. Added ability to accept dragged and dropped file from File Manager.
  45. // 34. Fixed file position line scrolling into text area on non-VGA dsply.
  46. // 35. Circumvented OS/2 1.3 XGA Driver bug and improved font list generation.
  47. // 36. Corrected error recovery when Open File Name entered is zero length.
  48. // 37. Added test for valid dragged object file name (from OS/2 2.0 WP/appl.).
  49. // 38. Increased stack size for OS/2 2.0.
  50. //=============================================================================
  51.  
  52. #define INCL_DEV
  53.  
  54. //#define INCL_WIN
  55. #define INCL_WINACCELERATORS
  56. #define INCL_WINBUTTONS
  57. #define INCL_WINCLIPBOARD
  58. #define INCL_WINDIALOGS
  59. #define INCL_WINENTRYFIELDS
  60. #define INCL_WINERRORS
  61. #define INCL_WINFRAMECTLS
  62. #define INCL_WINFRAMEMGR
  63. #define INCL_WINHELP
  64. #define INCL_WININPUT
  65. #define INCL_WINLISTBOXES
  66. #define INCL_WINMENUS
  67. #define INCL_WINMESSAGEMGR
  68. #define INCL_WINENTRYFIELDS
  69. #define INCL_WINPOINTERS
  70. #define INCL_WINRECTANGLES
  71. #define INCL_WINSCROLLBARS
  72. #define INCL_WINSHELLDATA
  73. #define INCL_WINSYS
  74. #define INCL_WINWINDOWMGR
  75.  
  76. #define  INCL_WINSTDDRAG
  77.  
  78. #define  INCL_GPIREGIONS
  79.  
  80. #define  INCL_VIO
  81. #define  INCL_AVIO
  82.  
  83. #define  FM_DRAGOVER 0x300
  84. #define  FM_DROP     0x301
  85.  
  86. #define  NO_OF_VIO_SIZES 100
  87.  
  88. #define  AVIOROWS 98
  89. #define  AVIOCOLS 255
  90. #define  PATHLENGTH 255
  91. #define  BUFFERSIZE 16384
  92.  
  93. #include <os2.h>
  94. #include <stdio.h>
  95. #include <string.h>
  96. #include <stdlib.h>
  97.  
  98. #include "pmview.h"
  99.  
  100. #define  NULL 0L
  101.  
  102. MRESULT  EXPENTRY ClientWndProc (HWND, USHORT, MPARAM, MPARAM);
  103. MRESULT  EXPENTRY MessageDlgProc (HWND, USHORT, MPARAM, MPARAM);
  104. MRESULT  EXPENTRY AboutDlgProc (HWND, USHORT, MPARAM, MPARAM);
  105. MRESULT  EXPENTRY FileDlgProc (HWND, USHORT, MPARAM, MPARAM);
  106. MRESULT  EXPENTRY ConfigDlgProc (HWND, USHORT, MPARAM, MPARAM);
  107. MRESULT  EXPENTRY GotoDlgProc (HWND, USHORT, MPARAM, MPARAM);
  108. MRESULT  EXPENTRY SearchDlgProc (HWND, USHORT, MPARAM, MPARAM);
  109. MRESULT  EXPENTRY FontDlgProc (HWND, USHORT, MPARAM, MPARAM);
  110.  
  111. BOOL TestOpenFile (PCHAR);
  112. BOOL OpenFile (PCHAR);
  113. PCHAR GetFileDataPtr (LONG lFilePtr, BOOL fForward, USHORT *usLimit,
  114.               BOOL *fEndOfFile);
  115. CHAR GetFileChar (LONG lFilePtr);
  116. LONG MoveViewPtr (LONG lFilePtr, LONG *ptrRow, BOOL fDispASCII);
  117. LONG lComputeLines (LONG lOldPtr, LONG lNewPtr, BOOL fDispASCII);
  118. SHORT sComputeLines (LONG lOldPtr, LONG lNewPtr, BOOL fDispASCII);
  119. VOID btoa (UCHAR cNum, UCHAR szOut[], BOOL fBlank);
  120. VOID Myltoa (ULONG lNum, UCHAR szOut[]);
  121. SHORT atob (UCHAR szHStr[], UCHAR szStr[]);
  122. SHORT DisplayLine (HVPS hvps, SHORT sRow, LONG lLinePtr, BOOL fDispASCII);
  123. VOID DisplayFilePos (HPS hps, HWND hwnd, LONG lFilePtr);
  124. VOID DispStatusLine (HPS hps, HWND hwnd, CHAR * szStatusText);
  125. BOOL SearchFile (LONG *lFilePtr);
  126. VOID ScrollVis (HWND hwndFrame, HWND hwndHScroll, HWND hwndVScroll,
  127.         HWND hwndMenu);
  128. VOID SetASCII (HWND hwndMenu, LONG *lViewPtr);
  129. VOID SetDispFilePos (HWND hwndMenu);
  130. VOID SetFontSize (HWND hwndMenu, HVPS hvps, SHORT *psCharWidth,
  131.           SHORT *psCharHeight);
  132. VOID CenterDlgBox (HWND hwndDialog, HWND hwndParent);
  133. VOID FillDriveListBox (HWND hwnd, CHAR *pcCurrentPath);
  134. VOID FillDirListBox (HWND hwnd, CHAR *pcCurPath, BOOL fIncHidden);
  135. VOID FillFileListBox (HWND hwnd, CHAR *pcSearchParam, BOOL fIncHidden);
  136. VOID FillColorBox (HWND hwnd, SHORT iListID);
  137. VOID FillCellSizeBox (HWND hwnd, SHORT iListID);
  138. SHORT GetCellSize (SHORT sHeight, SHORT sWidth);
  139. HWND StartMessageBox (USHORT idDlg, CHAR * szString);
  140. VOID EndMessageBox (HWND hwndMsgBox);
  141. VOID SetClipAVIO (HPS hps, HWND hwnd);
  142.  
  143. HELPINIT helpinit = {
  144.              sizeof( HELPINIT),
  145.              0L,
  146.              NULL,
  147.              MAKEP(0xFFFF, ID_RESOURCE),
  148.              0,
  149.              0,
  150.              0,
  151.              0,
  152.              "PM File View Help Facility",
  153.              CMIC_HIDE_PANEL_ID,
  154.              "pmview.hlp"
  155.             };
  156.  
  157. struct ParamStruct {
  158.    UCHAR    szAttribute[2];
  159.    SHORT    sxWinPos;
  160.    SHORT    syWinPos;
  161.    SHORT    sWinHeight;
  162.    SHORT    sWinWidth;
  163.    SHORT    sCellHeight;
  164.    SHORT    sCellWidth;
  165.    SHORT    sTabStop;
  166.    BOOL     fDispASCII;
  167.    BOOL     fScrollBars;
  168.    BOOL     fIncHiddenFiles;
  169.    BOOL     fDispEBCDIC;
  170.    BOOL     fDispFilePos;
  171. } Default = {{0x20,0xf0}, -1, 0, 0, 0, -1, -1, 8, TRUE, TRUE, FALSE, FALSE,
  172.          FALSE};
  173.  
  174. struct FileStruct {
  175.    CHAR     szName [PATHLENGTH];
  176.    HFILE    hHandle;
  177.    LONG     lSize;
  178.    BOOL     fValid;
  179. } File = {"", 0, 0L, FALSE};
  180.  
  181. FILESTATUS FileInfo;
  182.  
  183. struct MemBuff {
  184.    USHORT   usBSel;
  185.    USHORT   usBOff;
  186.    USHORT   usDSize;
  187.    LONG     lFilePtr;
  188.    SHORT    sUseCnt;
  189.    BOOL     fValid;
  190. } Buff[4];
  191.  
  192. SHORT sCellSize[NO_OF_VIO_SIZES][2];
  193. SHORT sCellSizeCount;
  194.  
  195. HAB     hab;
  196. HWND     hwndFrame;
  197. HWND     hwndClient;
  198. HWND     hwndHelp;
  199.  
  200. CHAR     szNewFile[PATHLENGTH] = "";
  201. CHAR     szWildCardFilename[PATHLENGTH];
  202. LONG     lNewViewPtr;
  203.  
  204. LONG     lRowNumber = 1L;
  205. LONG     lRowPointer = 0L;
  206. LONG     lLastRowNumber = 0L;
  207. LONG     lLastRow = 0L;
  208.  
  209. CHAR     szSearchStr[80];
  210. CHAR     sSearchStr[80];
  211. CHAR     szSearchHStr[80];
  212. SHORT     cbSearchStrLen;
  213. BOOL     fCheckCase = FALSE;
  214. BOOL     fTopSearch = FALSE;
  215. BOOL     fHexString = FALSE;
  216. BOOL     fHexGoto = FALSE;
  217. BOOL     fLineGoto = FALSE;
  218. BOOL     fDecGoto = TRUE;
  219. LONG     lLastFound = -1;
  220.  
  221. BOOL     fSaveWinPos;
  222. BOOL     fSaveToDisk = FALSE;
  223. BOOL     fMinimized;
  224. CHAR     szAppName[] = "PMVIEW by Douglas Boling";
  225. CHAR     szKeyName[] = "Profile type 1";
  226.  
  227. CHAR     szStartTitleText[80];
  228.  
  229. BOOL     fNoMinButton = FALSE;
  230.  
  231. //                0/8  1/9  2/A  3/B    4/C  5/D  6/E  7/F
  232. UCHAR caEBtoASCII[256] = { 0x22,0x22,0x22,0x22,0x22,0x9E,0x22,0x22, //0
  233.                0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, //0
  234.                0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, //1
  235.                0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, //1
  236.                0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, //2
  237.                0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, //2
  238.                0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, //3
  239.                0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, //3
  240.                0x20,0x5B,0x5D,0x9C,0x9D,0x9E,0x0F,0xE1, //4
  241.                0x15,0xC4,0x9B,0x2E,0x3C,0x28,0x2B,0xB3, //4
  242.                0x26,0xF8,0x20,0x5E,0x22,0x27,0x87,0x85, //5
  243.                0x8A,0x8D,0x21,0x24,0x2A,0x29,0x2B,0xAA, //5
  244.                0x2D,0x2F,0x95,0x97,0x61,0x6F,0x98,0x85, //6
  245.                0x84,0x82,0x7C,0x2C,0x25,0x5F,0x3E,0x3F, //6
  246.                0x8D,0x95,0x97,0x81,0x87,0x84,0x89,0x8B, //7
  247.                0x94,0x60,0x3A,0x23,0x40,0x27,0x3D,0x22, //7
  248.                0x81,0x61,0x62,0x63,0x64,0x65,0x66,0x67, //8
  249.                0x68,0x69,0x83,0x88,0x8C,0x93,0x96,0xA0, //8
  250.                0x82,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70, //9
  251.                0x71,0x72,0xA1,0xA2,0xA3,0xA4,0x41,0x45, //9
  252.                0x49,0x7E,0x73,0x74,0x75,0x76,0x77,0x78, //A
  253.                0x79,0x7A,0x4F,0x55,0x41,0x4F,0x59,0x4A, //A
  254.                0x45,0x45,0x49,0x4F,0x55,0x59,0x53,0x8E, //B
  255.                0x45,0x49,0x99,0x9A,0x41,0x45,0x49,0x4F, //B
  256.                0x7B,0x41,0x42,0x43,0x44,0x45,0x46,0x47, //C
  257.                0x48,0x49,0x55,0x41,0x90,0x49,0x20,0x20, //C
  258.                0x7D,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50, //D
  259.                0x51,0x52,0x4F,0x55,0xA5,0x20,0x20,0x20, //D
  260.                0x5C,0x91,0x53,0x54,0x55,0x56,0x57,0x58, //E
  261.                0x59,0x5A,0xED,0x86,0x87,0x20,0x20,0x3B, //E
  262.                0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, //F
  263.                0x38,0x39,0x91,0xED,0x8F,0x80,0x2A,0x20};//F
  264.  
  265. //=======================================================================
  266. // Main Proceedure.  Create message queue, parse the command line,
  267. //    allocate memory buffers, create the window, and process the
  268. //    message queue.
  269. //=======================================================================
  270. int main (int argc, char *argv[])
  271.    {
  272.    static   CHAR  szClientClass [] = "PMVIEW";
  273.  
  274.    static   ULONG flFrameFlags = FCF_TITLEBAR       | FCF_SYSMENU  |
  275.                  FCF_SIZEBORDER    | FCF_MINMAX   |
  276.                  FCF_TASKLIST       | FCF_ICON      |
  277.                  FCF_MENU       | FCF_ACCELTABLE |
  278.                  FCF_VERTSCROLL    | FCF_HORZSCROLL |
  279.                  FCF_SHELLPOSITION;
  280.  
  281.    static   SHORT    fsWinPosFlags = SWP_SHOW;
  282.    static   USHORT   usSelector;
  283.    HMQ        hmq;
  284.    QMSG     qmsg;
  285.    SHORT    i;
  286.  
  287.    if ( !(hab = WinInitialize (0)) )
  288.      exit((USHORT)ERRORIDERROR(WinGetLastError(hab)));
  289.  
  290.    if ( !(hmq = WinCreateMsgQueue (hab, 0)) )
  291.      exit((USHORT)ERRORIDERROR(WinGetLastError(hab)));
  292.  
  293.    hwndHelp = WinCreateHelpInstance( hab, &helpinit);
  294.  
  295.    fNoMinButton = FALSE;
  296.  
  297.    for (i = 1; i < argc && i < 4; i++)
  298.       if (stricmp(argv[i],"/i") == 0 || stricmp (argv[i],"-i") == 0)
  299.      {
  300.      fMinimized = TRUE;
  301.      fsWinPosFlags |= SWP_MINIMIZE;
  302.      }
  303.       else
  304.      {
  305.      fsWinPosFlags |= SWP_FOCUSACTIVATE | SWP_ACTIVATE;
  306.      if (stricmp(argv[i],"/m") == 0 || stricmp (argv[i],"-m") == 0)
  307.         {
  308.         fNoMinButton = TRUE;
  309.         }
  310.      else
  311.         {
  312.         if (strlen (szNewFile) == 0)
  313.            DosQPathInfo (argv[i], 5, szNewFile, sizeof szNewFile, 0L);
  314.         }
  315.      }
  316.    if ( (strchr (szNewFile, '*') != 0) ||
  317.     (strchr (szNewFile, '?') != 0) )
  318.      {
  319.      strcpy (szWildCardFilename, szNewFile);
  320.      *szNewFile = '\0';
  321.      }
  322.    else
  323.      *szWildCardFilename = '\0';
  324.  
  325.    DosAllocSeg( (USHORT) 0, &usSelector, 0 );
  326.    for (i = 0; i < 4; i++) {
  327.       Buff[i].usBSel = usSelector;
  328.       Buff[i].usBOff = i * BUFFERSIZE;
  329.       Buff[i].fValid = FALSE;
  330.    }
  331.    i = sizeof Default;
  332.    WinQueryProfileData (hab, szAppName, szKeyName, &Default, &i);
  333.  
  334.    WinRegisterClass (
  335.            hab,            // Anchor block handle
  336.            szClientClass,        // Name of class being registered
  337.            ClientWndProc,        // Window procedure for class
  338.            CS_SIZEREDRAW,        // Class style
  339.            0);            // Extra bytes to reserve
  340.  
  341.    if (fNoMinButton)
  342.      flFrameFlags = FCF_TITLEBAR      | FCF_SYSMENU  |
  343.             FCF_SIZEBORDER    | FCF_MAXBUTTON |
  344.             FCF_TASKLIST      | FCF_ICON     |
  345.             FCF_MENU          | FCF_ACCELTABLE |
  346.             FCF_VERTSCROLL    | FCF_HORZSCROLL |
  347.             FCF_SHELLPOSITION;
  348.    else
  349.      flFrameFlags = FCF_TITLEBAR      | FCF_SYSMENU  |
  350.             FCF_SIZEBORDER    | FCF_MINMAX   |
  351.             FCF_TASKLIST      | FCF_ICON     |
  352.             FCF_MENU          | FCF_ACCELTABLE |
  353.             FCF_VERTSCROLL    | FCF_HORZSCROLL |
  354.             FCF_SHELLPOSITION;
  355.  
  356.    hwndFrame = WinCreateStdWindow (
  357.            HWND_DESKTOP,        // Parent window handle
  358.            0L,            // Style of frame window
  359.            &flFrameFlags,        // Pointer to control data
  360.            szClientClass,        // Client window class name
  361.            "",                  // Title bar text
  362.            0L,            // Style of client window
  363.            (HMODULE) NULL,        // Module handle for resources
  364.            ID_RESOURCE,        // ID of resources for window
  365.            &hwndClient);        // Pointer to client window handle
  366.  
  367.    if ((NULL == hwndFrame) || (NULL == hwndClient)) {
  368.       /* Make sure the window was created.    */
  369.       exit((USHORT)ERRORIDERROR(WinGetLastError(hab)));
  370.    } /* endif */
  371.  
  372.    WinSetWindowUShort(hwndFrame, QWS_ID, ID_RESOURCE);
  373.    if (hwndHelp != NULL)
  374.      WinAssociateHelpInstance( hwndHelp, hwndFrame);
  375.  
  376.    if (Default.sxWinPos != -1)
  377.       fsWinPosFlags |= SWP_MOVE | SWP_SIZE;
  378.  
  379.    WinSetWindowPos (hwndFrame, HWND_TOP, Default.sxWinPos, Default.syWinPos,
  380.              Default.sWinWidth, Default.sWinHeight, fsWinPosFlags);
  381.  
  382.    while (WinGetMsg (hab, &qmsg, NULL, 0, 0))
  383.       WinDispatchMsg (hab, &qmsg);
  384.  
  385.    if (File.hHandle)
  386.       DosClose (File.hHandle);
  387.    DosFreeSeg (usSelector);
  388.  
  389.    WinDestroyWindow (hwndFrame);
  390.    if (hwndHelp != NULL)
  391.      WinDestroyHelpInstance( hwndHelp);
  392.    WinDestroyMsgQueue (hmq);
  393.    WinTerminate (hab);
  394.    return 0;
  395. }
  396. //------------------------------------------------------------------
  397. // Test opening file.  Open the file and close it.  Return TRUE if
  398. //     successful.
  399. //------------------------------------------------------------------
  400. BOOL TestOpenFile (PCHAR szNewFileName) {
  401.  
  402.    HFILE       hNewHandle;
  403.    USHORT      usAction;
  404.    BOOL        fGoodRead = FALSE;
  405.  
  406.    if (DosOpen (
  407.     szNewFileName,               // File name
  408.     &hNewHandle,               // File handle
  409.     &usAction,               // Action taken
  410.     0L,                   // File size
  411.     0,                   // File attribute
  412.     1,                   // Open type (Fail if no file.)
  413.     0x20,                   // Open mode (Read, deny write)
  414.     0L))                   // Reserved.
  415.      ;
  416.    else {
  417.      if (hNewHandle)
  418.        DosClose (hNewHandle);
  419.      fGoodRead = TRUE;
  420.    }
  421.    return fGoodRead;
  422. }
  423. //------------------------------------------------------------------
  424. // Open file.  Open the file, query file information, reset memory
  425. //     buffer structure.
  426. //------------------------------------------------------------------
  427. BOOL OpenFile (PCHAR szNewFileName) {
  428.  
  429.    SHORT       i;
  430.    HFILE       hNewHandle;
  431.    USHORT      usAction;
  432.    BOOL        fGoodRead = FALSE;
  433.  
  434.    if (DosOpen (
  435.     szNewFileName,               // File name
  436.     &hNewHandle,               // File handle
  437.     &usAction,               // Action taken
  438.     0L,                   // File size
  439.     0,                   // File attribute
  440.     1,                   // Open type (Fail if no file.)
  441.     0x20,                   // Open mode (Read, deny write)
  442.     0L))                   // Reserved.
  443.       WinAlarm (HWND_DESKTOP, WA_NOTE);
  444.    else {
  445.       if (File.hHandle)
  446.      DosClose (File.hHandle);
  447.       strcpy (File.szName, szNewFileName);
  448.       File.hHandle = hNewHandle;
  449.       DosQFileInfo (File.hHandle, 1, (PBYTE) &FileInfo,
  450.                  sizeof FileInfo);
  451.       File.lSize = FileInfo.cbFile;
  452.       fGoodRead = TRUE;
  453.       //
  454.       // Reset the memory buffer to purge the old file data.
  455.       //
  456.       for (i = 0; i < 4; i++) {
  457.      Buff[i].lFilePtr = -1;
  458.      Buff[i].sUseCnt = 1;
  459.       }
  460.    }
  461.    return fGoodRead;
  462. }
  463. //------------------------------------------------------------------
  464. // GetFileDataPtr - Return a pointer to file data pointed to by
  465. //            the file pointer.
  466. //------------------------------------------------------------------
  467. PCHAR GetFileDataPtr (LONG lFilePtr, BOOL fForward, USHORT *usLimit,
  468.               BOOL *fEndOfFile) {
  469.    PCHAR    pcDataPtr;
  470.    ULONG    ulTemp;
  471.    SHORT    i, sLast = -1;
  472.    SHORT    sOldCnt, sNewCnt;
  473.    //
  474.    // Check limits of file.
  475.    //
  476.    *fEndOfFile = FALSE;
  477.    if (lFilePtr >= File.lSize) {
  478.       lFilePtr = File.lSize;
  479.       *fEndOfFile = fForward;
  480.    } else if (lFilePtr <= 0L) {
  481.       lFilePtr = 0L;
  482.       *fEndOfFile = !fForward;
  483.    }
  484.    //
  485.    // See if requested part of the file is in one of the buffers.
  486.    //
  487.    sOldCnt = sNewCnt = Buff[0].sUseCnt;
  488.    for (i = 0; i < 4; i++) {
  489.       sNewCnt = (sNewCnt < Buff[i].sUseCnt) ? Buff[i].sUseCnt : sNewCnt;
  490.       sOldCnt = (sOldCnt > Buff[i].sUseCnt) ? Buff[i].sUseCnt : sOldCnt;
  491.       if (Buff[i].lFilePtr != -1)
  492.      if (lFilePtr >= Buff[i].lFilePtr &&
  493.             lFilePtr < Buff[i].lFilePtr + BUFFERSIZE)
  494.         sLast = i;
  495.    }
  496.    //
  497.    // If requested part not found, determine the oldest buffer to replace,
  498.    //      then read part of the file into that buffer.
  499.    //
  500.    if (sLast == -1) {
  501.       sOldCnt = Buff[0].sUseCnt;
  502.       for (i = 0; i < 4; i++)
  503.      if (sOldCnt >= Buff[i].sUseCnt) {
  504.         sOldCnt = Buff[i].sUseCnt;
  505.         sLast = i;
  506.      }
  507.       Buff[sLast].fValid = TRUE;
  508.       Buff[sLast].lFilePtr = (lFilePtr / BUFFERSIZE) * BUFFERSIZE;
  509.  
  510.       DosChgFilePtr (File.hHandle, Buff[sLast].lFilePtr, 0, &ulTemp);
  511.  
  512.       DosRead (File.hHandle, MAKEP (Buff[sLast].usBSel,
  513.                Buff[sLast].usBOff), BUFFERSIZE,
  514.                &Buff[sLast].usDSize);
  515.    }
  516.    //
  517.    // Reset LRU count to prevent overflow
  518.    //
  519.    if (sNewCnt > 0x7ff0) {
  520.       sNewCnt -= sOldCnt;
  521.       for (i = 0; i < 4; i++)
  522.      Buff[i].sUseCnt = Buff[i].sUseCnt - sOldCnt;
  523.    }
  524.    Buff[sLast].sUseCnt = ++sNewCnt;
  525.    //
  526.    // Create Pointer, set limits to buffer.
  527.    //
  528.    pcDataPtr = MAKEP (Buff[sLast].usBSel, Buff[sLast].usBOff
  529.              + (USHORT) (lFilePtr - Buff[sLast].lFilePtr));
  530.    if (fForward)
  531.       *usLimit = Buff[sLast].usBOff + Buff[sLast].usDSize - 1;
  532.    else
  533.       *usLimit = Buff[sLast].usBOff;
  534.  
  535.    return pcDataPtr;
  536. }
  537. //------------------------------------------------------------------
  538. // GetChar - Get character in file at requested file pointer position
  539. //------------------------------------------------------------------
  540. CHAR GetFileChar (LONG lFilePtr) {
  541.  
  542.    USHORT   usLimit;
  543.    BOOL     fEndOfFile;
  544.  
  545.    if (File.fValid)
  546.      return *GetFileDataPtr (lFilePtr, TRUE, &usLimit, &fEndOfFile);
  547.    else
  548.      return '\0';
  549. }
  550. //------------------------------------------------------------------
  551. // MoveViewPtr - Update view pointer by scrolling the number of
  552. //     lines specified in ptrRow.  If limited by the top or bottom
  553. //     of the file, modify ptrRow to indicate the actual number of
  554. //    rows.
  555. //------------------------------------------------------------------
  556. LONG MoveViewPtr (LONG lFilePtr, LONG *ptrRow, BOOL fDispASCII) {
  557.    SHORT    j;
  558.    LONG     li;
  559.    LONG     lRow, lRowCount = 0L;
  560.    LONG     lOffset = 0L;
  561.    LONG     lOffsetLastCR = 0L;
  562.    USHORT   usLimit;
  563.    PCHAR    pcDataPtr;
  564.    BOOL     fEndOfFile;
  565.  
  566.    pcDataPtr = GetFileDataPtr (lFilePtr, *ptrRow > 0, &usLimit, &fEndOfFile);
  567.    lRow = *ptrRow;
  568.  
  569.    if (fDispASCII) {
  570.  
  571.       if (lRow > 0L) {
  572.      for (li=0; li < lRow && !fEndOfFile; li++, lOffset++){
  573.  
  574.         for (j=0; j < AVIOCOLS && *pcDataPtr != 0x0d
  575.               && !fEndOfFile; j++, lOffset++)
  576.            if ((OFFSETOF(pcDataPtr) < usLimit))
  577.           pcDataPtr++;
  578.            else {
  579.           lFilePtr = ((lFilePtr + BUFFERSIZE)/ BUFFERSIZE) * BUFFERSIZE;
  580.           pcDataPtr = GetFileDataPtr (lFilePtr, TRUE,
  581.                           &usLimit, &fEndOfFile);
  582.            }
  583.         if ((OFFSETOF(pcDataPtr) < usLimit))
  584.            pcDataPtr++;
  585.         else {
  586.            lFilePtr = ((lFilePtr + BUFFERSIZE)/ BUFFERSIZE) * BUFFERSIZE;
  587.            pcDataPtr = GetFileDataPtr (lFilePtr, TRUE,
  588.                        &usLimit, &fEndOfFile);
  589.         }
  590.         if (!fEndOfFile) {
  591.            lRowCount++;
  592.            lOffsetLastCR = lOffset + 1;
  593.         }
  594.      }
  595.      if (fEndOfFile) {
  596.         lOffset = lOffsetLastCR;
  597.      }
  598.      *ptrRow = lRowCount;
  599.       } else {
  600.      lRow = -lRow;
  601.      for (li=0; li < lRow && !fEndOfFile; li++){
  602.  
  603.         if ((OFFSETOF(pcDataPtr) > usLimit))
  604.            pcDataPtr--;
  605.         else {
  606.            lFilePtr = (lFilePtr / BUFFERSIZE) * BUFFERSIZE - 1;
  607.            pcDataPtr = GetFileDataPtr (lFilePtr, FALSE,
  608.                        &usLimit, &fEndOfFile);
  609.         }
  610.         if (!fEndOfFile) {
  611.            lRowCount--;
  612.            lOffset--;
  613.         }
  614.         for (j=0; j < AVIOCOLS && !fEndOfFile; j++) {
  615.            if ((OFFSETOF(pcDataPtr) > usLimit)) {
  616.           if (*(pcDataPtr-1) == 0x0d)
  617.              break;
  618.           pcDataPtr--;
  619.            } else {
  620.           lFilePtr = (lFilePtr / BUFFERSIZE) * BUFFERSIZE - 1;
  621.           pcDataPtr = GetFileDataPtr (lFilePtr, FALSE,
  622.                           &usLimit, &fEndOfFile);
  623.            }
  624.            if (!fEndOfFile) {
  625.           lOffset--;
  626.            }
  627.         }
  628.      }
  629.      *ptrRow = lRowCount;
  630.       }
  631.    }
  632.  
  633.    else {
  634.       //
  635.       // Align on paragraph
  636.       //
  637.       if (lFilePtr % 16 != 0)
  638.      lOffset -= (lFilePtr % 16);
  639.       lOffset += lRow * 16;
  640.       *ptrRow = lRow;
  641.       //
  642.       //Limit Checking
  643.       //
  644.       if ((lFilePtr == 0L && lRow < 0L)
  645.       ||(lFilePtr == File.lSize && lRow > 0L)){
  646.      lOffset = 0L;
  647.      *ptrRow = 0L;
  648.       } else if ((lFilePtr + lOffset) < 0) {
  649.     lOffset =  -lFilePtr;
  650.     *ptrRow = lOffset / 16L;
  651.       } else if ((lFilePtr + lOffset) >= File.lSize) {
  652.        if (lFilePtr % 16 == 0)
  653.          lOffset = (File.lSize - lFilePtr - 1L);
  654.        else
  655.          lOffset = (File.lSize - lFilePtr - 2L);
  656.     *ptrRow = lOffset / 16L;
  657.       }
  658.    }
  659.    return lOffset;
  660. }
  661. //------------------------------------------------------------------
  662. // ComputeLines (SHORT) - Compute number of lines between two points in
  663. //     the file. (Faster (SHORT count variable) version)
  664. //------------------------------------------------------------------
  665. SHORT sComputeLines (LONG lOldPtr, LONG lNewPtr, BOOL fDispASCII) {
  666.    USHORT   usLimit;
  667.    SHORT    sCount = 0L;
  668.    PCHAR    pcDataPtr;
  669.    BOOL     fEndOfFile = FALSE;
  670.  
  671.    pcDataPtr = GetFileDataPtr (lOldPtr, lOldPtr < lNewPtr, &usLimit,
  672.                    &fEndOfFile);
  673.    if (fDispASCII)
  674.       if (lOldPtr < lNewPtr) {
  675.      while (lOldPtr < lNewPtr && !fEndOfFile){
  676.         if (*pcDataPtr == 0x0d)
  677.            sCount++;
  678.         lOldPtr++;
  679.         if ((OFFSETOF(pcDataPtr) < usLimit))
  680.            pcDataPtr++;
  681.         else
  682.            pcDataPtr = GetFileDataPtr (lOldPtr, TRUE, &usLimit,
  683.                        &fEndOfFile);
  684.      }
  685.       }
  686.       else {
  687.      while (lOldPtr > lNewPtr && !fEndOfFile) {
  688.         if (*pcDataPtr == 0x0d)
  689.            sCount--;
  690.         lOldPtr--;
  691.         if ((OFFSETOF(pcDataPtr) > usLimit))
  692.            pcDataPtr--;
  693.         else
  694.            pcDataPtr = GetFileDataPtr (lOldPtr, FALSE, &usLimit,
  695.                        &fEndOfFile);
  696.      }
  697.       }
  698.    else
  699.       sCount = (SHORT) ((lNewPtr - lOldPtr) / 16);
  700.    return sCount;
  701. }
  702. //------------------------------------------------------------------
  703. // ComputeLines (LONG) - Compute number of lines between two points in
  704. //     the file. (Slower (LONG count variable) version)
  705. //------------------------------------------------------------------
  706. LONG lComputeLines (LONG lOldPtr, LONG lNewPtr, BOOL fDispASCII) {
  707.    USHORT   usLimit;
  708.    LONG     lCount = 0L;
  709.    PCHAR    pcDataPtr;
  710.    BOOL     fEndOfFile = FALSE;
  711.  
  712.    if (labs(lNewPtr - lOldPtr) > 65536)
  713.      WinSetPointer (HWND_DESKTOP,
  714.             WinQuerySysPointer (HWND_DESKTOP,
  715.                     SPTR_WAIT,
  716.                     FALSE) );
  717.  
  718.    pcDataPtr = GetFileDataPtr (lOldPtr, lOldPtr < lNewPtr, &usLimit,
  719.                    &fEndOfFile);
  720.    if (fDispASCII)
  721.       if (lOldPtr < lNewPtr) {
  722.      while (lOldPtr < lNewPtr && !fEndOfFile){
  723.         if (*pcDataPtr == 0x0d)
  724.            lCount++;
  725.         lOldPtr++;
  726.         if ((OFFSETOF(pcDataPtr) < usLimit))
  727.            pcDataPtr++;
  728.         else
  729.            pcDataPtr = GetFileDataPtr (lOldPtr, TRUE, &usLimit,
  730.                        &fEndOfFile);
  731.      }
  732.       }
  733.       else {
  734.      while (lOldPtr > lNewPtr && !fEndOfFile) {
  735.         if (*pcDataPtr == 0x0d)
  736.            lCount--;
  737.         lOldPtr--;
  738.         if ((OFFSETOF(pcDataPtr) > usLimit))
  739.            pcDataPtr--;
  740.         else
  741.            pcDataPtr = GetFileDataPtr (lOldPtr, FALSE, &usLimit,
  742.                        &fEndOfFile);
  743.      }
  744.       }
  745.    else
  746.       lCount = ((lNewPtr - lOldPtr) / 16L);
  747.  
  748.    WinSetPointer (HWND_DESKTOP,
  749.           WinQuerySysPointer (HWND_DESKTOP,
  750.                       SPTR_ARROW,
  751.                       FALSE) );
  752.  
  753.    return lCount;
  754. }
  755. //------------------------------------------------------------------
  756. // btoa Convert byte to ASCII
  757. //------------------------------------------------------------------
  758. VOID btoa (UCHAR cNum, UCHAR szOut[], BOOL fBlank) {
  759.    SHORT    i;
  760.  
  761.    for (i = 2; i > 0; i--)
  762.       if (fBlank)
  763.      szOut[i] = ' ';
  764.       else {
  765.      szOut[i] = (cNum % (UCHAR) 16) + (UCHAR) 0x30;
  766.      if (szOut[i] > 0x39) szOut[i] += (BYTE) 7;
  767.         cNum /= 16;
  768.       }
  769.    szOut[0] = ' ';
  770.    return;
  771. }
  772.  
  773. //------------------------------------------------------------------
  774. // Myltoa Convert a long to ASCII with leading zeros
  775. //------------------------------------------------------------------
  776. VOID Myltoa (ULONG lNum, UCHAR szOut[]) {
  777.    SHORT    i;
  778.  
  779.    for (i = 7; i >= 0; i--) {
  780.       szOut[i + (i+1)/5] = (BYTE) (lNum % 16) + (CHAR) 0x30;
  781.       if (szOut[i + (i+1)/5] > 0x39) szOut[i + (i+1)/5] += (BYTE) 7;
  782.       lNum /= 16;
  783.    }
  784.    szOut[4] = ' ';
  785.    return;
  786. }
  787.  
  788. //------------------------------------------------------------------
  789. // atob Convert ASCII Hex string to binary string
  790. //------------------------------------------------------------------
  791. SHORT atob (UCHAR szHStr[], UCHAR sStr[]) {
  792.    SHORT    inyble;
  793.    SHORT    ibyte;
  794.    SHORT    i;
  795.    SHORT    iDigit;
  796.  
  797.    ibyte = 0;
  798.  
  799.    if (strlen(szHStr) != 0) {
  800.      i = 0;
  801.      for (inyble = 0; inyble < (SHORT) strlen(szHStr); inyble++) {
  802.  
  803.        iDigit = (int) (toupper(szHStr[inyble]) - '0');
  804.        if (iDigit > 9)
  805.      iDigit = iDigit - 7;
  806.        if ((iDigit < 0) || (iDigit > 15)) {
  807.      if (i == 1) {
  808.        i = 0;
  809.        ibyte++;
  810.        }
  811.      continue;
  812.      }
  813.  
  814.        if (i == 0) {
  815.      sStr[ibyte] = (UCHAR) iDigit;
  816.      i = 1;
  817.      }
  818.        else {
  819.      sStr[ibyte] = (sStr[ibyte]*(UCHAR)16) + (UCHAR) iDigit;
  820.      i = 0;
  821.      ibyte++;
  822.      }
  823.        }
  824.      }
  825.    return ibyte;
  826. }
  827.  
  828. //------------------------------------------------------------------
  829. // Display Line
  830. //------------------------------------------------------------------
  831. SHORT DisplayLine (HVPS hvps, SHORT sRow, LONG lLinePtr, BOOL fDispASCII) {
  832.  
  833.    UCHAR    cHexChar, szTempBuff[256];
  834.    SHORT    i, sStart, sBytesPrinted = 0;
  835.    USHORT   usLimit;
  836.    BOOL     fEndOfFile;
  837.    PCHAR    pcDataPtr;
  838.  
  839.  
  840.    if (fDispASCII) {
  841.       //
  842.       // Print as ASCII until CR or for 255 characters.
  843.       //
  844.       pcDataPtr = GetFileDataPtr (lLinePtr, TRUE, &usLimit, &fEndOfFile);
  845.  
  846.       for (i = 0; i <= AVIOCOLS && !fEndOfFile; i++){
  847.      if (*pcDataPtr == 0x0a) {
  848.         if ((OFFSETOF(pcDataPtr) < usLimit))
  849.            pcDataPtr++;
  850.         else {
  851.            lLinePtr = ((lLinePtr + BUFFERSIZE)/ BUFFERSIZE) * BUFFERSIZE;
  852.            pcDataPtr = GetFileDataPtr (lLinePtr, TRUE, &usLimit,
  853.                        &fEndOfFile);
  854.         }
  855.         if (fEndOfFile)
  856.           szTempBuff[i] = ' ';
  857.         else
  858.           szTempBuff[i] = *pcDataPtr;
  859.         sBytesPrinted++;
  860.      } else
  861.         szTempBuff[i] = *pcDataPtr;
  862.  
  863.      if ((OFFSETOF(pcDataPtr) < usLimit))
  864.         pcDataPtr++;
  865.      else {
  866.         lLinePtr = ((lLinePtr + BUFFERSIZE)/ BUFFERSIZE) * BUFFERSIZE;
  867.         pcDataPtr = GetFileDataPtr (lLinePtr, TRUE, &usLimit,
  868.                     &fEndOfFile);
  869.      }
  870.      sBytesPrinted++;
  871.      //
  872.      // Expand Tab Characters
  873.      //
  874.      if (szTempBuff[i] == 0x09) {
  875.         for (;(i+1) % Default.sTabStop != 0 && i <= AVIOCOLS; i++)
  876.            szTempBuff[i] = ' ';
  877.         szTempBuff[i] = ' ';
  878.      }
  879.      //
  880.      // If CR, end of line.
  881.      if (szTempBuff[i] == 0x0d) {
  882.         break;
  883.      }
  884.       }
  885.    } else {
  886.       //
  887.       // Convert from Hex and print.
  888.       //
  889.       pcDataPtr = GetFileDataPtr (lLinePtr, TRUE, &usLimit, &fEndOfFile);
  890.       sStart = (SHORT) (lLinePtr % 16L);
  891.       sBytesPrinted = 0;
  892.       for (i = 0; i < 10; i++)
  893.      szTempBuff[i] = ' ';
  894.  
  895.       if (!fEndOfFile)
  896.      Myltoa (lLinePtr, szTempBuff);
  897.  
  898.       for (i = 0; i < 16; i++){
  899.  
  900.      cHexChar = *pcDataPtr;
  901.  
  902.      btoa (cHexChar, szTempBuff + 10 + (i*3) + (i/8),
  903.            ((i < sStart) || fEndOfFile) );
  904.      if (Default.fDispEBCDIC)
  905.         szTempBuff[i+60+(i/8)] = ((i < sStart) || fEndOfFile) ?
  906.                       (CHAR) 0x20 : caEBtoASCII[cHexChar];
  907.      else
  908.         szTempBuff[i+60+(i/8)] = ((i < sStart) || fEndOfFile) ? (CHAR) 0x20
  909.                                   : cHexChar;
  910.  
  911.  
  912.      if (i >= sStart){
  913.         if ((OFFSETOF(pcDataPtr) < usLimit))
  914.            pcDataPtr++;
  915.         else {
  916.            lLinePtr = ((lLinePtr + BUFFERSIZE)/ BUFFERSIZE) * BUFFERSIZE;
  917.            pcDataPtr = GetFileDataPtr (lLinePtr, TRUE, &usLimit,
  918.                        &fEndOfFile);
  919.         }
  920.      }
  921.       }
  922.       szTempBuff[34] = ' ';
  923.       szTempBuff[59] = ' ';
  924.       szTempBuff[68] = ' ';
  925.       sBytesPrinted = i - sStart;
  926.       i += 59 + (i/8);
  927.    }
  928.    VioWrtCharStr (szTempBuff, i, sRow, 0, hvps);
  929.    return sBytesPrinted;
  930. }
  931. //------------------------------------------------------------------
  932. // SearchFile - Search the file for the value in szSearchStr or sSearchStr.
  933. //    If found, the file pointer is modified to the location in the
  934. //     file.
  935. //------------------------------------------------------------------
  936. BOOL SearchFile (LONG *lFilePtr) {
  937.    USHORT   usLimit;
  938.    PCHAR    pcDataPtr;
  939.    BOOL     fEndOfFile = FALSE, fFound = FALSE;
  940.    CHAR     szCmpBuffer[165];
  941.    SHORT    sBufferLength, sBufferCnt, sSearchLen, i;
  942.    LONG     lLocalPtr, lMarker;
  943.  
  944.  
  945.    WinSetPointer (HWND_DESKTOP,
  946.           WinQuerySysPointer (HWND_DESKTOP,
  947.                       SPTR_WAIT,
  948.                       FALSE) );
  949.    if (fHexString)
  950.      sSearchLen = cbSearchStrLen;
  951.    else
  952.      sSearchLen = strlen (szSearchStr);
  953.  
  954.    lLocalPtr = (fTopSearch) ? 0L : *lFilePtr;
  955.  
  956.    pcDataPtr = GetFileDataPtr (lLocalPtr, TRUE, &usLimit, &fEndOfFile);
  957.  
  958.    while (!fEndOfFile && !fFound) {
  959.  
  960.       sBufferLength = (BUFFERSIZE - (SHORT)(lLocalPtr % BUFFERSIZE))
  961.               - sSearchLen;
  962.       if (sBufferLength <= 0) {
  963.  
  964.      for (i = 0; i < BUFFERSIZE - (SHORT)(lLocalPtr % BUFFERSIZE); i++)
  965.         *(szCmpBuffer + i) = *(pcDataPtr + i);
  966.  
  967.      sBufferCnt = i;
  968.      lMarker = lLocalPtr;
  969.      lLocalPtr = ((lLocalPtr + BUFFERSIZE) / BUFFERSIZE) * BUFFERSIZE;
  970.  
  971.      pcDataPtr = GetFileDataPtr (lLocalPtr, TRUE, &usLimit,
  972.                      &fEndOfFile);
  973.      if (fEndOfFile)
  974.         break;
  975.      for (i = 0; i < min (sSearchLen + 1,
  976.                   BUFFERSIZE - (usLimit % BUFFERSIZE)); i++)
  977.         *(szCmpBuffer + sBufferCnt + i) = *(pcDataPtr + i);
  978.  
  979.      for (i = 0; i < sBufferCnt; i++)
  980.         if (fHexString) {
  981.            if (memcmp (szCmpBuffer + i, sSearchStr, sSearchLen) == 0) {
  982.           fFound = TRUE;
  983.           break;
  984.           }
  985.            }
  986.         else
  987.            if (fCheckCase) {
  988.           if (strncmp (szCmpBuffer + i, szSearchStr, sSearchLen) == 0) {
  989.              fFound = TRUE;
  990.              break;
  991.           }
  992.            } else {
  993.           if (strnicmp (szCmpBuffer + i, szSearchStr, sSearchLen) == 0) {
  994.              fFound = TRUE;
  995.              break;
  996.           }
  997.            }
  998.      sBufferLength = (BUFFERSIZE - (usLimit%BUFFERSIZE)) - sSearchLen;
  999.       }
  1000.       if (fFound) {
  1001.      lLocalPtr = lMarker + i;
  1002.      break;
  1003.       }
  1004.       for (i = 0; i < sBufferLength; i++) {
  1005.         if (fHexString) {
  1006.            if (memcmp (pcDataPtr + i, sSearchStr, sSearchLen) == 0) {
  1007.           fFound = TRUE;
  1008.           break;
  1009.            }
  1010.         }
  1011.      else
  1012.         if (fCheckCase) {
  1013.            if (strncmp (pcDataPtr + i, szSearchStr, sSearchLen) == 0) {
  1014.           fFound = TRUE;
  1015.           break;
  1016.            }
  1017.         } else {
  1018.            if (strnicmp (pcDataPtr + i, szSearchStr, sSearchLen) == 0) {
  1019.           fFound = TRUE;
  1020.           break;
  1021.            }
  1022.         }
  1023.       }
  1024.       lLocalPtr += i;
  1025.    }
  1026.    if (fFound)
  1027.       *lFilePtr = lLocalPtr;
  1028.  
  1029.    WinSetPointer (HWND_DESKTOP,
  1030.           WinQuerySysPointer (HWND_DESKTOP,
  1031.                       SPTR_ARROW,
  1032.                       FALSE) );
  1033.    return fFound;
  1034. }
  1035. //------------------------------------------------------------------
  1036. // ScrollVis - Set Scroll Visibility
  1037. //------------------------------------------------------------------
  1038. VOID ScrollVis (HWND hwndFrame, HWND hwndHScroll, HWND hwndVScroll,
  1039.         HWND hwndMenu) {
  1040.  
  1041.    if (Default.fScrollBars) {
  1042.  
  1043.       WinSendMsg (hwndMenu, MM_SETITEMATTR,
  1044.           MPFROM2SHORT (IDM_DISPSCROLLBARS, TRUE),
  1045.           MPFROM2SHORT (MIA_CHECKED, MIA_CHECKED));
  1046.  
  1047.       WinSetParent (hwndVScroll, hwndFrame, FALSE );
  1048.       WinSetParent (hwndHScroll, hwndFrame, FALSE );
  1049.    } else {
  1050.  
  1051.       WinSendMsg (hwndMenu, MM_SETITEMATTR,
  1052.           MPFROM2SHORT (IDM_DISPSCROLLBARS, TRUE),
  1053.           MPFROM2SHORT (MIA_CHECKED, 0));
  1054.  
  1055.       WinSetParent (hwndVScroll, HWND_OBJECT, FALSE );
  1056.       WinSetParent (hwndHScroll, HWND_OBJECT, FALSE );
  1057.    }
  1058.    WinSendMsg ( hwndFrame , WM_UPDATEFRAME ,
  1059.    (MPARAM) (FCF_TITLEBAR | FCF_SYSMENU | FCF_MINMAX |
  1060.    FCF_MENU), NULL);
  1061.  
  1062.    return;
  1063. }
  1064. //------------------------------------------------------------------
  1065. // Set ASCII - Set ASCII Menu Check marks.
  1066. //------------------------------------------------------------------
  1067. VOID SetASCII (HWND hwndMenu, LONG *lViewPtr) {
  1068.    LONG  lRow = -1;
  1069.    if (Default.fDispASCII) {
  1070.       if (!(MIA_CHECKED && WinSendMsg (hwndMenu, MM_QUERYITEMATTR,
  1071.                    MPFROM2SHORT (IDM_DISPLAYASCII, TRUE),
  1072.                    MPFROM2SHORT (MIA_CHECKED, 0)))) {
  1073.      *lViewPtr += 2;
  1074.      *lViewPtr += MoveViewPtr (*lViewPtr, &lRow, TRUE);
  1075.       }
  1076.       WinSendMsg (hwndMenu, MM_SETITEMATTR,
  1077.           MPFROM2SHORT (IDM_DISPLAYHEXASC, TRUE),
  1078.           MPFROM2SHORT (MIA_CHECKED, 0));
  1079.  
  1080.       WinSendMsg (hwndMenu, MM_SETITEMATTR,
  1081.           MPFROM2SHORT (IDM_DISPLAYHEXEBC, TRUE),
  1082.           MPFROM2SHORT (MIA_CHECKED, 0));
  1083.  
  1084.       WinSendMsg (hwndMenu, MM_SETITEMATTR,
  1085.           MPFROM2SHORT (IDM_DISPLAYASCII, TRUE),
  1086.           MPFROM2SHORT (MIA_CHECKED, MIA_CHECKED));
  1087.    } else {
  1088.       WinSendMsg (hwndMenu, MM_SETITEMATTR,
  1089.           MPFROM2SHORT (IDM_DISPLAYASCII, TRUE),
  1090.           MPFROM2SHORT (MIA_CHECKED, 0));
  1091.  
  1092.       if (Default.fDispEBCDIC) {
  1093.      WinSendMsg (hwndMenu, MM_SETITEMATTR,
  1094.              MPFROM2SHORT (IDM_DISPLAYHEXASC, TRUE),
  1095.              MPFROM2SHORT (MIA_CHECKED, 0));
  1096.  
  1097.      WinSendMsg (hwndMenu, MM_SETITEMATTR,
  1098.              MPFROM2SHORT (IDM_DISPLAYHEXEBC, TRUE),
  1099.              MPFROM2SHORT (MIA_CHECKED, MIA_CHECKED));
  1100.       } else {
  1101.      WinSendMsg (hwndMenu, MM_SETITEMATTR,
  1102.              MPFROM2SHORT (IDM_DISPLAYHEXASC, TRUE),
  1103.              MPFROM2SHORT (MIA_CHECKED, MIA_CHECKED));
  1104.  
  1105.      WinSendMsg (hwndMenu, MM_SETITEMATTR,
  1106.              MPFROM2SHORT (IDM_DISPLAYHEXEBC, TRUE),
  1107.              MPFROM2SHORT (MIA_CHECKED, 0));
  1108.       }
  1109.    }
  1110.    return;
  1111. }
  1112.  
  1113.  
  1114.  
  1115.  
  1116. //------------------------------------------------------------------
  1117. // SetDispFilePos - Set File Position Menu Check Marks.
  1118. //------------------------------------------------------------------
  1119. VOID SetDispFilePos (HWND hwndMenu)
  1120.   {
  1121.   if (Default.fDispFilePos)
  1122.     {
  1123.     WinSendMsg (hwndMenu, MM_SETITEMATTR,
  1124.         MPFROM2SHORT (IDM_DISPFILEPOS, TRUE),
  1125.         MPFROM2SHORT (MIA_CHECKED, MIA_CHECKED));
  1126.     }
  1127.   else
  1128.     {
  1129.     WinSendMsg (hwndMenu, MM_SETITEMATTR,
  1130.         MPFROM2SHORT (IDM_DISPFILEPOS, TRUE),
  1131.         MPFROM2SHORT (MIA_CHECKED, 0));
  1132.     }
  1133.   }
  1134. //------------------------------------------------------------------
  1135. // SetFontSize - Change font size and update menu if necessary.
  1136. //------------------------------------------------------------------
  1137. VOID SetFontSize (HWND hwndMenu, HVPS hvps, SHORT *psCharWidth,
  1138.           SHORT *psCharHeight) {
  1139.  
  1140.    VioSetDeviceCellSize (Default.sCellHeight, Default.sCellWidth, hvps);
  1141.    VioGetDeviceCellSize (psCharHeight, psCharWidth, hvps);
  1142.  
  1143.    return;
  1144. }
  1145. //=======================================================================
  1146. //
  1147. // Client Window Procedure
  1148. //
  1149. //=======================================================================
  1150. MRESULT EXPENTRY ClientWndProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
  1151.    {
  1152.    static   HWND  hwndFrame, hwndMenu, hwndVScroll, hwndHScroll;
  1153.  
  1154.    static   HVPS  hvps;
  1155.    static   HPS   hps;
  1156.  
  1157.    static   LONG  lViewPtr;
  1158.    static   BOOL  fGoMinimize;
  1159.  
  1160.    static   SHORT sHScroll, sVScrScale, sHPage = 20, sVPage = 20;
  1161.    static   SHORT sCharHeight, sCharWidth, sxWinSize, syWinSize;
  1162.    static   SHORT sRowsVisible = AVIOROWS;
  1163.    static   SHORT syStatusLine = 0;
  1164.  
  1165.    static   CHAR  szBuffer[81];
  1166.    static   CHAR  szDragItemRMF[41];
  1167.    static   CHAR  szDropDirectory[81];
  1168.    static   CHAR  szDropFileName[81];
  1169.    static   CHAR  szDropNewFileName[81];
  1170.    static   BOOL  fDropFile = FALSE;
  1171.    static   SHORT fsWinPosFlags = SWP_SHOW;
  1172.  
  1173.    static   PDRAGINFO pDragInfo;
  1174.    static   DRAGITEM  DragItem;
  1175.  
  1176.    static   CHAR * pszFMFileList;
  1177.  
  1178.    HDC        hdc;
  1179.    SIZEL    sizl;
  1180.    SHORT    sRow;
  1181.    SHORT    sTempRow;
  1182.    LONG     lRow;
  1183.    SHORT    sTemp;
  1184.    LONG     lDeltaRows;
  1185.    LONG     lTemp;
  1186.    SWP        swpWinPos;
  1187.    PSWP     pswpWinPos;
  1188.    CHAR     szTempBuffer[PATHLENGTH];
  1189.    HWND     hwndSearchMsg;
  1190.    SHORT    i;
  1191.  
  1192.    BOOL     fFileNameOK = FALSE;
  1193.  
  1194.    LONG     lOutCount;
  1195.  
  1196.    struct VioCellStruct {
  1197.       VIOSIZECOUNT    VioSizeCount;
  1198.       VIOFONTCELLSIZE VioCellSize[NO_OF_VIO_SIZES];
  1199.    } OutData;
  1200.  
  1201.    switch (msg) {
  1202.  
  1203.       //--------------------------------------------------------------
  1204.       // When the window is created, get and store the handles to
  1205.       //   the scroll bars and menu, read the default parameters if
  1206.       //   saved before, set the proper attributes for the menu
  1207.       //   selections, and create a AVIO presentation space.
  1208.       //--------------------------------------------------------------
  1209.       case WM_CREATE:
  1210.  
  1211.      WinQueryWindowText (hwndFrame,
  1212.                  sizeof szStartTitleText,
  1213.                  szStartTitleText);
  1214.      strcpy (szStartTitleText, "PM File View");
  1215.  
  1216.      //
  1217.      // If no file specified and not starting as an icon, Query
  1218.      // user for a file name.
  1219.      //
  1220.      if (!File.fValid) {
  1221.         if (strlen (szNewFile) == 0) {
  1222.            if (!fMinimized)
  1223.           if (WinDlgBox(HWND_DESKTOP, hwnd, FileDlgProc,
  1224.              (HMODULE) NULL, IDD_OPEN, (PVOID) NULL))
  1225.              if (!(File.fValid = OpenFile (szNewFile)))
  1226.             WinMessageBox (HWND_DESKTOP, hwnd,
  1227.                        "Unable to open the file",
  1228.                        szNewFile,
  1229.                        (USHORT) NULL,
  1230.                        MB_OK | MB_ERROR);
  1231.         } else
  1232.            if (!(File.fValid = OpenFile (szNewFile)))
  1233.           WinMessageBox (HWND_DESKTOP, hwnd,
  1234.                  "Unable to open the file", szNewFile,
  1235.                  (USHORT) NULL, MB_OK | MB_ERROR);
  1236.         if (File.fValid) {
  1237.            if (sHScroll) {
  1238.           sHScroll = 0;
  1239.           VioSetOrg (0, sHScroll, hvps);
  1240.            }
  1241.            lViewPtr = 0L;
  1242.            lRowNumber = 1L;
  1243.            lLastRowNumber = 0L;
  1244.            lLastRow = 0L;
  1245.            lRowPointer = lViewPtr;
  1246.            sVScrScale  = (SHORT) ((File.lSize / 32768) + 1);
  1247.         }
  1248.      }
  1249.      fMinimized = FALSE;
  1250.      //
  1251.      // Query the Frame for the necessary window handles.
  1252.      //
  1253.      hwndFrame = WinQueryWindow (hwnd, QW_PARENT,FALSE);
  1254.      hwndMenu = WinWindowFromID (hwndFrame, FID_MENU);
  1255.      hwndVScroll = WinWindowFromID (hwndFrame, FID_VERTSCROLL);
  1256.      hwndHScroll = WinWindowFromID ( hwndFrame, FID_HORZSCROLL);
  1257.      //
  1258.      // Set menu attributes.
  1259.      //
  1260.      sVScrScale  = (SHORT) ((File.lSize / 32768) + 1);
  1261.      ScrollVis (hwndFrame, hwndHScroll, hwndVScroll, hwndMenu);
  1262.      SetASCII (hwndMenu, &lViewPtr);
  1263.      SetDispFilePos (hwndMenu);
  1264.      //
  1265.      // Establish AVIO presentation space.
  1266.      //
  1267.      hdc = WinOpenWindowDC (hwnd);
  1268.      sizl.cx = sizl.cy = 0;
  1269.      hps = GpiCreatePS (hab, hdc, &sizl, PU_PELS | GPIF_DEFAULT |
  1270.                 GPIT_MICRO | GPIA_ASSOC);
  1271.      VioCreatePS (&hvps, AVIOROWS, AVIOCOLS, 0, 1, (HVPS) NULL);
  1272.      VioAssociate (hdc, hvps);
  1273.      if ( (Default.sCellWidth <= 0) || (Default.sCellHeight <= 0) )
  1274.        VioGetDeviceCellSize (&Default.sCellHeight,
  1275.                  &Default.sCellWidth,
  1276.                  hvps);
  1277.  
  1278.      //
  1279.      // Get available font sizes
  1280.      //
  1281.      DevEscape(hdc, DEVESC_QUERYVIOCELLSIZES,
  1282.             0L,
  1283.             (PBYTE) NULL,
  1284.             &lOutCount,
  1285.             (PBYTE) &OutData);
  1286.      sCellSizeCount = (SHORT) OutData.VioSizeCount.count;
  1287.      for (i=0; i<sCellSizeCount; i++)
  1288.        {
  1289.        sCellSize[i][0] = (SHORT) OutData.VioCellSize[i].cx;
  1290.        sCellSize[i][1] = (SHORT)OutData.VioCellSize[i].cy;
  1291.        }
  1292.  
  1293.      SetFontSize (hwndMenu, hvps, &sCharWidth, &sCharHeight);
  1294.      VioScrollUp (0, 0, -1, -1, -1, Default.szAttribute, hvps);
  1295.  
  1296.      if (strlen (File.szName) != 0)
  1297.         {
  1298.         sprintf (szTempBuffer, "PM File View - %s", File.szName);
  1299.         WinSetWindowText (hwndFrame, szTempBuffer);
  1300.         }
  1301.      else
  1302.         WinSetWindowText (hwndFrame, szStartTitleText);
  1303.  
  1304.      return 0;
  1305.  
  1306.       //--------------------------------------------------------------
  1307.       // Intercept the close message to abort a file open dialog box
  1308.       //   when the program is closed from an icon.
  1309.       //--------------------------------------------------------------
  1310.       case WM_CLOSE:
  1311.  
  1312.         fMinimized = FALSE;
  1313.      break;
  1314.  
  1315.       //--------------------------------------------------------------
  1316.       // If the Window is being restored from an icon without a vaild
  1317.       //   file, prompt the user for a file using the file open dialog
  1318.       //   box.
  1319.       //--------------------------------------------------------------
  1320.       case WM_MINMAXFRAME:
  1321.  
  1322.      if (fMinimized)
  1323.         if (!File.fValid) {
  1324.            if (WinDlgBox(HWND_DESKTOP, hwnd, FileDlgProc, (HMODULE) NULL,
  1325.                  IDD_OPEN, (PVOID) NULL)) {
  1326.           if (!(File.fValid = OpenFile (szNewFile)))
  1327.              WinMessageBox (HWND_DESKTOP, hwnd,
  1328.                     "Unable to open the file",
  1329.                     szNewFile, (USHORT) NULL,
  1330.                     MB_OK | MB_ERROR);
  1331.           else {
  1332.              if (sHScroll) {
  1333.             sHScroll = 0;
  1334.             VioSetOrg (0, sHScroll, hvps);
  1335.              }
  1336.              lViewPtr = 0;
  1337.              sVScrScale  = (SHORT) ((File.lSize / 32768) + 1);
  1338.              sprintf (szTempBuffer, "PM File View - %s", File.szName);
  1339.              WinSetWindowText (hwndFrame, szTempBuffer);
  1340.           }
  1341.            } else
  1342.           fGoMinimize = TRUE;
  1343.         }
  1344.      //
  1345.      // Record the current state of the program.
  1346.      //
  1347.      pswpWinPos = PVOIDFROMMP (mp1);
  1348.      if (pswpWinPos->fs & SWP_MINIMIZE)
  1349.         fMinimized = TRUE;
  1350.      else
  1351.         fMinimized = FALSE;
  1352.      break;
  1353.  
  1354.       //--------------------------------------------------------------
  1355.       // When the GoMinimize flag is set send the frame a minimize
  1356.       //   message.
  1357.       //--------------------------------------------------------------
  1358.       case WM_WINDOWPOSCHANGED:
  1359.  
  1360.         if (fGoMinimize) {
  1361.            fGoMinimize = FALSE;
  1362.            WinSetWindowPos (hwndFrame, HWND_BOTTOM, 0, 0, 0, 0,
  1363.                  SWP_MINIMIZE);
  1364.         }
  1365.      break;
  1366.  
  1367.       //--------------------------------------------------------------
  1368.       // When the window is resized, record the new window size,
  1369.       //   update the horizontal position of the AVIO space and
  1370.       //   scroll bar, and notify the frame to modify its windows.
  1371.       //--------------------------------------------------------------
  1372.       case WM_SIZE:
  1373.  
  1374.      sxWinSize = SHORT1FROMMP(mp2);
  1375.      syWinSize = SHORT2FROMMP(mp2);
  1376.  
  1377.      // Set Clipping Rectangle to AVIO text area
  1378.      SetClipAVIO (hps, hwnd);
  1379.  
  1380.      if (sHScroll > AVIOCOLS - sxWinSize / sCharWidth) {
  1381.         sHScroll = min (max (0, sHScroll),
  1382.                  AVIOCOLS - sxWinSize / sCharWidth);
  1383.         VioSetOrg (0, sHScroll, hvps);
  1384.         WinInvalidateRect (hwnd, NULL, FALSE);
  1385.      }
  1386.      if (Default.fDispFilePos)
  1387.        syStatusLine = (SHORT) WinQuerySysValue (HWND_DESKTOP, SV_CYMENU);
  1388.      else
  1389.        syStatusLine = 0;
  1390.      sHPage = max (sxWinSize / sCharWidth - 1, 0);
  1391.      sVPage = max ((syWinSize-syStatusLine) / sCharHeight - 1, 0);
  1392.  
  1393.      sRowsVisible = min ((syWinSize-syStatusLine) / sCharHeight + 1,
  1394.                  AVIOROWS);
  1395.  
  1396.      WinSendMsg ( hwndFrame, WM_UPDATEFRAME, (MPARAM) (FCF_TITLEBAR
  1397.               | FCF_SYSMENU | FCF_MINMAX | FCF_MENU), NULL);
  1398.  
  1399.      WinSendMsg (hwndHScroll, SBM_SETSCROLLBAR,
  1400.              MPFROM2SHORT (sHScroll, 0),
  1401.              MPFROM2SHORT (0, AVIOCOLS - sxWinSize / sCharWidth));
  1402.  
  1403.      WinSendMsg (hwndHScroll, SBM_SETTHUMBSIZE,
  1404.              MPFROM2SHORT (sxWinSize / sCharWidth,
  1405.              AVIOCOLS - sxWinSize / sCharWidth), NULL);
  1406.  
  1407.      WinSendMsg (hwndVScroll, SBM_SETSCROLLBAR,
  1408.              MPFROM2SHORT ((SHORT)(lViewPtr/sVScrScale), 0),
  1409.              MPFROM2SHORT (0, (SHORT)(File.lSize/sVScrScale)));
  1410.  
  1411.  
  1412.      if ( (SHORT)((syWinSize/sCharHeight) * 30) <
  1413.           (SHORT)(File.lSize/sVScrScale) )
  1414.         WinSendMsg (hwndVScroll, SBM_SETTHUMBSIZE,
  1415.             MPFROM2SHORT( (syWinSize/sCharHeight) * 30,
  1416.             (SHORT)(File.lSize/sVScrScale)),NULL);
  1417.      else
  1418.         WinSendMsg (hwndVScroll, SBM_SETTHUMBSIZE,
  1419.             MPFROM2SHORT( (syWinSize/sCharHeight) * 16,
  1420.             (SHORT)(File.lSize/sVScrScale)),NULL);
  1421.  
  1422.      return WinDefAVioWindowProc (hwnd, msg, mp1, mp2);
  1423.  
  1424.       //--------------------------------------------------------------
  1425.       // Repaint the complete AVIO space by first clearing the window
  1426.       //   then writing to the AVIO space.
  1427.       //--------------------------------------------------------------
  1428.       case WM_PAINT:
  1429.  
  1430.      WinBeginPaint (hwnd, hps, NULL);
  1431.      VioScrollUp (0, 0, -1, -1, -1, Default.szAttribute, hvps);
  1432.  
  1433.      lTemp = lViewPtr;
  1434.      for (sRow = 0; sRow < sRowsVisible; sRow++)
  1435.         lTemp += (LONG) DisplayLine (hvps, sRow, lTemp,
  1436.                       Default.fDispASCII);
  1437.  
  1438.      DisplayFilePos (hps, hwnd, lViewPtr);
  1439.      WinEndPaint (hps);
  1440.  
  1441.      WinSendMsg (hwndVScroll, SBM_SETPOS,
  1442.              MPFROM2SHORT ((SHORT)(lViewPtr/sVScrScale), 0),
  1443.              NULL);
  1444.      return 0;
  1445.  
  1446.       //--------------------------------------------------------------
  1447.       // Process each menu selection according to function.
  1448.       //--------------------------------------------------------------
  1449.       case WM_COMMAND:
  1450.  
  1451.      switch (COMMANDMSG(&msg)->cmd) {
  1452.  
  1453.      case IDM_NEW:
  1454.  
  1455.         if (File.hHandle)
  1456.            DosClose (File.hHandle);
  1457.         VioScrollUp (0, 0, -1, -1, -1, Default.szAttribute, hvps);
  1458.  
  1459.         *File.szName = '\0';
  1460.         File.hHandle = NULL;
  1461.         File.lSize = 0L;
  1462.         File.fValid = FALSE;
  1463.         lRowNumber = 1L;
  1464.         lLastRowNumber = 0L;
  1465.         lLastRow = 0L;
  1466.         lRowPointer = 0L;
  1467.  
  1468.         WinSetWindowText (hwndFrame, szStartTitleText);
  1469.  
  1470.         WinPostMsg (hwnd, WM_COMMAND,
  1471.             MPFROM2SHORT (IDM_OPEN,0), 0L);
  1472.  
  1473.         return 0;
  1474.  
  1475.      case IDM_OPEN:
  1476.         WinSetPointer (HWND_DESKTOP,
  1477.                WinQuerySysPointer (HWND_DESKTOP,
  1478.                            SPTR_WAIT,
  1479.                            FALSE) );
  1480.         if (fDropFile)
  1481.           {
  1482.           strcpy (szNewFile, szDropNewFileName);
  1483.           fFileNameOK = TRUE;
  1484.           fDropFile = FALSE;
  1485.           if (fMinimized)
  1486.         {
  1487.         File.fValid = TRUE; /* Necessary to prevent file dialog */
  1488.         fsWinPosFlags = SWP_SHOW | SWP_RESTORE;
  1489.         fsWinPosFlags |= SWP_FOCUSACTIVATE | SWP_ACTIVATE;
  1490.         if (Default.sxWinPos != -1)
  1491.            fsWinPosFlags |= SWP_MOVE | SWP_SIZE;
  1492.         WinSetWindowPos (hwndFrame, HWND_TOP, Default.sxWinPos,
  1493.                               Default.syWinPos,
  1494.                               Default.sWinWidth,
  1495.                               Default.sWinHeight,
  1496.                               fsWinPosFlags);
  1497.         fMinimized = FALSE;
  1498.         }
  1499.           }
  1500.         else
  1501.           {
  1502.           fFileNameOK = WinDlgBox(HWND_DESKTOP, hwnd, FileDlgProc,
  1503.                       (HMODULE) NULL, IDD_OPEN, (PVOID) NULL);
  1504.           }
  1505.         if (fFileNameOK) {
  1506.            WinSetPointer (HWND_DESKTOP,
  1507.                   WinQuerySysPointer (HWND_DESKTOP,
  1508.                           SPTR_ARROW,
  1509.                           FALSE) );
  1510.            if (File.fValid = OpenFile (szNewFile)) {
  1511.           if (sHScroll) {
  1512.              sHScroll = 0;
  1513.              VioSetOrg (0, sHScroll, hvps);
  1514.           }
  1515.           lViewPtr = 0;
  1516.           lLastRowNumber = 0L;
  1517.           lLastRow = 0L;
  1518.           lRowNumber = 1L;
  1519.           lRowPointer = lViewPtr;
  1520.  
  1521.           sVScrScale  = (SHORT) ((File.lSize / 32768) + 1);
  1522.  
  1523.           WinSendMsg (hwndVScroll, SBM_SETSCROLLBAR,
  1524.                   MPFROM2SHORT (0, 0),
  1525.                   MPFROM2SHORT (0,
  1526.                         (SHORT)(File.lSize/sVScrScale)));
  1527.           if ( (SHORT)((syWinSize/sCharHeight) * 30) <
  1528.                (SHORT)(File.lSize/sVScrScale) )
  1529.              WinSendMsg (hwndVScroll, SBM_SETTHUMBSIZE,
  1530.                  MPFROM2SHORT( (syWinSize/sCharHeight) * 30,
  1531.                  (SHORT)(File.lSize/sVScrScale)),NULL);
  1532.           else
  1533.              WinSendMsg (hwndVScroll, SBM_SETTHUMBSIZE,
  1534.                  MPFROM2SHORT( (syWinSize/sCharHeight) * 16,
  1535.                  (SHORT)(File.lSize/sVScrScale)),NULL);
  1536.           sprintf (szTempBuffer, "PM File View - %s", File.szName);
  1537.           WinSetWindowText (hwndFrame, szTempBuffer);
  1538.           WinInvalidateRect (hwnd, NULL, FALSE);
  1539.            } else {
  1540.           WinSetPointer (HWND_DESKTOP,
  1541.                  WinQuerySysPointer (HWND_DESKTOP,
  1542.                              SPTR_ARROW,
  1543.                              FALSE) );
  1544.           WinMessageBox (HWND_DESKTOP, hwnd, "Unable to open the file",
  1545.                  szNewFile, (USHORT) NULL, MB_OK | MB_ERROR);
  1546.            }
  1547.         }
  1548.         return 0;
  1549.  
  1550.      case IDM_FIND:
  1551.         if (WinDlgBox(HWND_DESKTOP, hwnd, SearchDlgProc,
  1552.               (HMODULE) NULL, IDD_SEARCH, (PVOID) NULL)) {
  1553.            if (fHexString) {
  1554.          if (strlen (szSearchHStr) != 0)
  1555.             WinPostMsg (hwnd, WM_COMMAND,
  1556.                 MPFROM2SHORT (IDM_REPFIND,0), mp2);
  1557.          }
  1558.            else
  1559.          if (strlen (szSearchStr) != 0)
  1560.             WinPostMsg (hwnd, WM_COMMAND,
  1561.                 MPFROM2SHORT (IDM_REPFIND,0), mp2);
  1562.            }
  1563.         return 0;
  1564.  
  1565.      case IDM_REPFIND:
  1566.         if ( ((fHexString) && (strlen (szSearchHStr) == 0)) ||
  1567.          ((!fHexString) && (strlen (szSearchStr) == 0)) ) {
  1568.            WinPostMsg (hwnd, WM_COMMAND, MPFROM2SHORT (IDM_FIND,0),
  1569.                mp2);
  1570.            return 0;
  1571.         } else {
  1572.            //
  1573.            //   Check to see if we are on the same line as the last
  1574.            // found string.  If so, start search at 1 byte past
  1575.            // last found string.
  1576.            //
  1577.            lDeltaRows = 1L;
  1578.            lTemp = MoveViewPtr (lViewPtr, &lDeltaRows,
  1579.                        Default.fDispASCII);
  1580.            lTemp += lViewPtr;
  1581.  
  1582.            if (lTemp > lLastFound && lLastFound >= lViewPtr)
  1583.           lLastFound++;
  1584.            else
  1585.           lLastFound = lViewPtr;
  1586.            //
  1587.            //   If string found, back up to the start of the
  1588.            // current line.
  1589.            //
  1590.            hwndSearchMsg = StartMessageBox (IDD_SRCHMSG, "");
  1591.            if (SearchFile (&lLastFound)) {
  1592.  
  1593.           lViewPtr = lLastFound;
  1594.           if (!Default.fDispASCII)
  1595.              lDeltaRows = 0L;
  1596.           else
  1597.              lDeltaRows = -1L;
  1598.           lViewPtr += MoveViewPtr (lViewPtr, &lDeltaRows,
  1599.                        Default.fDispASCII);
  1600.           WinInvalidateRect (hwnd, NULL, FALSE);
  1601.           EndMessageBox (hwndSearchMsg);
  1602.            } else {
  1603.           EndMessageBox (hwndSearchMsg);
  1604.           if (fHexString)
  1605.             WinMessageBox (HWND_DESKTOP, hwnd, szSearchHStr,
  1606.                    "Unable to find the hex string",
  1607.                    (USHORT) NULL, MB_OK | MB_ICONHAND);
  1608.           else
  1609.             WinMessageBox (HWND_DESKTOP, hwnd, szSearchStr,
  1610.                    "Unable to find the string",
  1611.                    (USHORT) NULL, MB_OK | MB_ICONHAND);
  1612.            }
  1613.         }
  1614.         return 0;
  1615.  
  1616.      case IDM_GOTO:
  1617.         if (WinDlgBox(HWND_DESKTOP, hwnd, GotoDlgProc,
  1618.               (HMODULE) NULL, IDD_GOTO, (PVOID) NULL)) {
  1619.            lViewPtr = min (max (lNewViewPtr, 0L), File.lSize);
  1620.            WinInvalidateRect (hwnd, NULL, FALSE);
  1621.         }
  1622.         return 0;
  1623.  
  1624.      case IDM_CONFIGURE:
  1625.         if (WinDlgBox(HWND_DESKTOP, hwnd, ConfigDlgProc,
  1626.               (HMODULE) NULL, IDD_CONFIGURE, (PVOID) NULL)) {
  1627.            if (fSaveToDisk) {
  1628.           if (fSaveWinPos) {
  1629.              WinQueryWindowPos (hwndFrame, &swpWinPos);
  1630.              Default.sxWinPos = swpWinPos.x;
  1631.              Default.syWinPos = swpWinPos.y;
  1632.              Default.sWinWidth = swpWinPos.cx;
  1633.              Default.sWinHeight = swpWinPos.cy;
  1634.           }
  1635.           WinWriteProfileData (hab, szAppName, szKeyName,
  1636.                        &Default, sizeof Default);
  1637.            }
  1638.            SetASCII(hwndMenu, &lViewPtr);
  1639.            SetDispFilePos(hwndMenu);
  1640.            ScrollVis (hwndFrame, hwndHScroll, hwndVScroll, hwndMenu);
  1641.            SetFontSize (hwndMenu, hvps, &sCharWidth, &sCharHeight);
  1642.            if (Default.fDispFilePos)
  1643.          syStatusLine = (SHORT) WinQuerySysValue (HWND_DESKTOP,
  1644.                               SV_CYMENU);
  1645.            else
  1646.          syStatusLine = 0;
  1647.            sHPage = max (sxWinSize / sCharWidth - 1, 0);
  1648.            sVPage = max ((syWinSize-syStatusLine) / sCharHeight - 1, 0);
  1649.            sRowsVisible = min ((syWinSize-syStatusLine) / sCharHeight + 1,
  1650.                    AVIOROWS);
  1651.            WinInvalidateRect (hwnd, NULL, FALSE);
  1652.         }
  1653.         return 0;
  1654.  
  1655.      case IDM_DISPLAYASCII:
  1656.         if (!Default.fDispASCII) {
  1657.            Default.fDispASCII = TRUE;
  1658.            SetASCII (hwndMenu, &lViewPtr);
  1659.            WinInvalidateRect (hwnd, NULL, FALSE);
  1660.         }
  1661.         return 0;
  1662.  
  1663.      case IDM_DISPLAYHEXASC:
  1664.         if ((Default.fDispASCII) || (Default.fDispEBCDIC)) {
  1665.            Default.fDispASCII = FALSE;
  1666.            Default.fDispEBCDIC = FALSE;
  1667.            SetASCII (hwndMenu, &lViewPtr);
  1668.            WinInvalidateRect (hwnd, NULL, FALSE);
  1669.         }
  1670.         return 0;
  1671.  
  1672.      case IDM_DISPLAYHEXEBC:
  1673.         if ((Default.fDispASCII) || (!Default.fDispEBCDIC)) {
  1674.            Default.fDispASCII = FALSE;
  1675.            Default.fDispEBCDIC = TRUE;
  1676.            SetASCII (hwndMenu, &lViewPtr);
  1677.            WinInvalidateRect (hwnd, NULL, FALSE);
  1678.         }
  1679.         return 0;
  1680.  
  1681.      case IDM_DISPSCROLLBARS:
  1682.         if (Default.fScrollBars)
  1683.            Default.fScrollBars = FALSE;
  1684.         else
  1685.            Default.fScrollBars = TRUE;
  1686.  
  1687.         ScrollVis (hwndFrame, hwndHScroll, hwndVScroll, hwndMenu);
  1688.         return 0;
  1689.  
  1690.      case IDM_DISPFILEPOS:
  1691.         if (Default.fDispFilePos)
  1692.            Default.fDispFilePos = FALSE;
  1693.         else
  1694.            Default.fDispFilePos = TRUE;
  1695.  
  1696.         SetDispFilePos (hwndMenu);
  1697.         if (Default.fDispFilePos)
  1698.           syStatusLine = (SHORT) WinQuerySysValue (HWND_DESKTOP,
  1699.                                SV_CYMENU);
  1700.         else
  1701.           {
  1702.           syStatusLine = 0;
  1703.           }
  1704.  
  1705.         sVPage = max ((syWinSize-syStatusLine) / sCharHeight - 1, 0);
  1706.         sRowsVisible = min ((syWinSize-syStatusLine) / sCharHeight + 1,
  1707.                 AVIOROWS);
  1708.  
  1709.         // Set Clipping Rectangle to AVIO text area
  1710.         SetClipAVIO (hps, hwnd);
  1711.  
  1712.         WinInvalidateRect (hwnd, NULL, FALSE);
  1713.         return 0;
  1714.  
  1715.      case IDM_FONTSIZE:
  1716.         if (!WinDlgBox(HWND_DESKTOP, hwnd, FontDlgProc,
  1717.                (HMODULE) NULL, IDD_PICKFONT, (PVOID) NULL))
  1718.            return 0;
  1719.         SetFontSize (hwndMenu, hvps, &sCharWidth, &sCharHeight);
  1720.         if (Default.fDispFilePos)
  1721.           syStatusLine = (SHORT) WinQuerySysValue (HWND_DESKTOP,
  1722.                                SV_CYMENU);
  1723.         else
  1724.           syStatusLine = 0;
  1725.         sHPage = max (sxWinSize / sCharWidth - 1, 0);
  1726.         sVPage = max ((syWinSize-syStatusLine) / sCharHeight - 1, 0);
  1727.         sRowsVisible = min ((syWinSize-syStatusLine) / sCharHeight + 1,
  1728.                 AVIOROWS);
  1729.         WinInvalidateRect (hwnd, NULL, FALSE);
  1730.         return 0;
  1731.  
  1732.      case IDM_ABOUT:
  1733.         WinDlgBox(HWND_DESKTOP, hwnd, AboutDlgProc,
  1734.               (HMODULE) NULL, IDD_ABOUT, (PVOID) NULL);
  1735.         return 0;
  1736.  
  1737.      case IDM_EXIT:
  1738.         WinSendMsg(hwnd, WM_CLOSE, 0L, 0L);
  1739.         return 0;
  1740.  
  1741.      case IDM_HELPFORHELP:
  1742.        if (hwndHelp != NULL)
  1743.          {
  1744.          WinSendMsg( hwndHelp, HM_DISPLAY_HELP, 0L, 0L);
  1745.          return 0;
  1746.          }
  1747.        break;
  1748.  
  1749.      case IDM_EXTENDEDHELP:
  1750.        if (hwndHelp != NULL)
  1751.          {
  1752.          WinSendMsg( hwndHelp, HM_EXT_HELP, 0L, 0L);
  1753.          return 0;
  1754.          }
  1755.        break;
  1756.  
  1757.      case IDM_KEYSHELP:
  1758.        if (hwndHelp != NULL)
  1759.          {
  1760.          WinSendMsg( hwndHelp, HM_KEYS_HELP, 0L, 0L);
  1761.          return 0;
  1762.          }
  1763.        break;
  1764.  
  1765.      case IDM_HELPINDEX:
  1766.        if (hwndHelp != NULL)
  1767.          {
  1768.          WinSendMsg( hwndHelp, HM_HELP_INDEX, 0L, 0L);
  1769.          return 0;
  1770.          }
  1771.        break;
  1772.  
  1773.       }
  1774.       break;
  1775.  
  1776.       case WM_HELP:
  1777.     return (WinDefWindowProc(hwnd, msg, mp1, mp2));
  1778.     break;    /* let the default handle it */
  1779.  
  1780.       case HM_QUERY_KEYS_HELP:
  1781.     return (MRESULT) IDM_KEYSHELP;
  1782.  
  1783.       case HM_ERROR:
  1784.     WinMessageBox( HWND_DESKTOP, hwnd,
  1785.       "A Help Manager error was encountered.",
  1786.       "Help Manager Error", 0, MB_OK | MB_WARNING);
  1787.       return 0;
  1788.  
  1789.       //--------------------------------------------------------------
  1790.       // Convert cursor keys to scroll bar messages.
  1791.       //--------------------------------------------------------------
  1792.       case WM_CHAR:
  1793.  
  1794.      switch (CHARMSG (&msg) -> vkey) {
  1795.  
  1796.         case VK_UP:
  1797.         case VK_DOWN:
  1798.         case VK_PAGEUP:
  1799.         case VK_PAGEDOWN:
  1800.            return WinSendMsg (hwndVScroll, msg, mp1, mp2);
  1801.  
  1802.         case VK_LEFT:
  1803.         case VK_RIGHT:
  1804.            return WinSendMsg (hwndHScroll, msg, mp1, mp2);
  1805.  
  1806.         case VK_HOME:
  1807.            if (lViewPtr != 0) {
  1808.           lViewPtr = 0L;
  1809.           lRowNumber = 1L;
  1810.           lRowPointer = 0L;
  1811.  
  1812.           WinInvalidateRect (hwnd, NULL, FALSE);
  1813.            }
  1814.            break;
  1815.  
  1816.         case VK_END:
  1817.            if (lViewPtr != File.lSize - 1) {
  1818.           lViewPtr = File.lSize - 1;
  1819.  
  1820.           if (Default.fDispASCII)
  1821.             lDeltaRows = -1L;
  1822.           else
  1823.             lDeltaRows = 0L;
  1824.           lViewPtr += MoveViewPtr (lViewPtr, &lDeltaRows,
  1825.                              Default.fDispASCII);
  1826.           if (lLastRowNumber > 0L)
  1827.             {
  1828.             lRowNumber = lLastRowNumber;
  1829.             lRowPointer = File.lSize - 1;
  1830.             }
  1831.  
  1832.           WinInvalidateRect (hwnd, NULL, FALSE);
  1833.            }
  1834.            break;
  1835.      }
  1836.      return WinDefWindowProc (hwnd, msg, mp1, mp2);
  1837.  
  1838.       //-----------------------------------------------------------
  1839.       // Process Horizonal Scroll Bar Messages by scrolling across
  1840.       //    the AVIO space.
  1841.       //-----------------------------------------------------------
  1842.       case WM_HSCROLL:
  1843.  
  1844.      switch (SHORT2FROMMP (mp2)) {
  1845.  
  1846.         case SB_LINELEFT:
  1847.  
  1848.            sHScroll -= 1;
  1849.            break;
  1850.  
  1851.         case SB_PAGELEFT:
  1852.  
  1853.            sHScroll -= sHPage;
  1854.            break;
  1855.  
  1856.         case SB_LINERIGHT:
  1857.  
  1858.            sHScroll += 1;
  1859.            break;
  1860.  
  1861.         case SB_PAGERIGHT:
  1862.  
  1863.            sHScroll += sHPage;
  1864.            break;
  1865.  
  1866.         case SB_SLIDERTRACK:
  1867.  
  1868.            sHScroll = SHORT1FROMMP (mp2);
  1869.            break;
  1870.      }
  1871.      sHScroll = min (max (0, sHScroll),
  1872.               AVIOCOLS - sxWinSize / sCharWidth);
  1873.  
  1874.      if (sHScroll != (SHORT) SHORT1FROMMR (WinSendMsg (hwndHScroll,
  1875.                            SBM_QUERYPOS, NULL, NULL))) {
  1876.         VioSetOrg (0, sHScroll, hvps);
  1877.         DisplayFilePos (hps, hwnd, lViewPtr);
  1878.         WinSendMsg (hwndHScroll, SBM_SETPOS,
  1879.             MPFROM2SHORT (sHScroll, 0), NULL);
  1880.      }
  1881.      return 0;
  1882.  
  1883.       //-----------------------------------------------------------
  1884.       // Process Vertical Scroll Bar Messages by scrolling the AVIO
  1885.       //    space and writing the new lines.
  1886.       //-----------------------------------------------------------
  1887.       case WM_VSCROLL:
  1888.  
  1889.      switch (SHORT2FROMMP (mp2)) {
  1890.  
  1891.         case SB_LINEUP:
  1892.  
  1893.            lDeltaRows = -1L;
  1894.            break;
  1895.  
  1896.         case SB_PAGEUP:
  1897.  
  1898.            lDeltaRows = (LONG) -sVPage;
  1899.            break;
  1900.  
  1901.         case SB_LINEDOWN:
  1902.  
  1903.            lDeltaRows = 1L;
  1904.            break;
  1905.  
  1906.         case SB_PAGEDOWN:
  1907.  
  1908.            lDeltaRows = (LONG) sVPage;
  1909.            break;
  1910.  
  1911.         case SB_SLIDERTRACK:
  1912.  
  1913.            lTemp = lViewPtr;
  1914.  
  1915.            lViewPtr = (LONG) ((LONG)SHORT1FROMMP(mp2) * (LONG)sVScrScale);
  1916.            if (Default.fDispASCII) {
  1917.          lDeltaRows = -1L;
  1918.          lViewPtr += MoveViewPtr (lViewPtr, &lDeltaRows, Default.fDispASCII);
  1919.          if (lDeltaRows != 0) {
  1920.             lDeltaRows = 1L;
  1921.             lViewPtr += MoveViewPtr (lViewPtr, &lDeltaRows, Default.fDispASCII);
  1922.          }
  1923.            }
  1924.            else {
  1925.          lDeltaRows = 0L;
  1926.          lViewPtr += MoveViewPtr (lViewPtr, &lDeltaRows, Default.fDispASCII);
  1927.            }
  1928.  
  1929.            sTemp = sComputeLines (lTemp, lViewPtr,
  1930.                          Default.fDispASCII);
  1931.            sTemp = (sTemp > sRowsVisible) ? sRowsVisible : sTemp;
  1932.            sTemp = (sTemp < -sRowsVisible) ? -sRowsVisible : sTemp;
  1933.            lDeltaRows = (LONG) sTemp;
  1934.  
  1935.            break;
  1936.  
  1937.         default:
  1938.            return 0;
  1939.      }
  1940.      if (SHORT2FROMMP (mp2) != SB_SLIDERTRACK)
  1941.         lViewPtr += MoveViewPtr (lViewPtr, &lDeltaRows, Default.fDispASCII);
  1942.      WinSendMsg (hwndVScroll, SBM_SETPOS,
  1943.              MPFROM2SHORT ((SHORT)(lViewPtr/sVScrScale), 0), NULL);
  1944.  
  1945.      if (lDeltaRows > 0L) {
  1946.         VioScrollUp (0, 0, sRowsVisible, AVIOCOLS, (SHORT) lDeltaRows,
  1947.              Default.szAttribute, hvps);
  1948.  
  1949.         sRow = sRowsVisible-(SHORT)lDeltaRows;
  1950.         sTempRow = sRow;
  1951.  
  1952.         lTemp = lViewPtr;
  1953.         lRow = (LONG) sRow;
  1954.         lTemp += MoveViewPtr (lTemp, &lRow, Default.fDispASCII);
  1955.         sRow = (SHORT) lRow;
  1956.  
  1957.         if (sRow == sTempRow) {
  1958.            if (!Default.fDispASCII)
  1959.           for (sRow = 0; sRow <= (SHORT)lDeltaRows; sRow++)
  1960.              lTemp += DisplayLine (hvps,
  1961.                        (sRowsVisible-(SHORT)lDeltaRows) + sRow,
  1962.                        lTemp, Default.fDispASCII);
  1963.            else
  1964.           for (sRow = 0; sRow < (SHORT)lDeltaRows; sRow++)
  1965.              lTemp += DisplayLine (hvps,
  1966.                        (sRowsVisible-(SHORT)lDeltaRows) + sRow,
  1967.                        lTemp, Default.fDispASCII);
  1968.         }
  1969.      }
  1970.      if (lDeltaRows < 0L) {
  1971.         lDeltaRows = -lDeltaRows;
  1972.         VioScrollDn (0, 0, sRowsVisible, AVIOCOLS, (SHORT) lDeltaRows,
  1973.              Default.szAttribute, hvps);
  1974.  
  1975.         lTemp = lViewPtr;
  1976.         for (sRow = 0; sRow <= (SHORT) lDeltaRows; sRow++)
  1977.            lTemp += DisplayLine (hvps, sRow, lTemp, Default.fDispASCII);
  1978.      }
  1979.      DisplayFilePos (hps, hwnd, lViewPtr);
  1980.  
  1981.      return 0;
  1982.  
  1983.       //-----------------------------------------------------------
  1984.       // Handle OS/2 1.3 object (file) dragging to this application.
  1985.       //-----------------------------------------------------------
  1986.       case DM_DRAGOVER:
  1987.  
  1988.      pDragInfo = (PDRAGINFO) mp1;
  1989.      if ( DrgAccessDraginfo (pDragInfo) )
  1990.        {
  1991.        if (pDragInfo->cditem == 1)
  1992.          {
  1993.          if (DrgQueryDragitem (pDragInfo,
  1994.                    sizeof(DragItem),
  1995.                    &DragItem,
  1996.                    0) )
  1997.            {
  1998.            if (DrgQueryNativeRMF (&DragItem,
  1999.                       sizeof(szDragItemRMF),
  2000.                       szDragItemRMF) )
  2001.          {
  2002.          if ( strncmp (szDragItemRMF, "DRM_OS2FILE", 11) )
  2003.            {
  2004.            DrgQueryStrName (DragItem.hstrContainerName,
  2005.                     sizeof(szDropDirectory),
  2006.                     szDropDirectory);
  2007.            DrgQueryStrName (DragItem.hstrSourceName,
  2008.                     sizeof(szDropFileName),
  2009.                     szDropFileName);
  2010.            strcpy (szBuffer, szDropDirectory);
  2011.            if (szBuffer[strlen (szBuffer)-1] != '\\')
  2012.               strcat (szBuffer, "\\");
  2013.            strcat (szBuffer, szDropFileName);
  2014.            if (TestOpenFile (szBuffer))
  2015.              {
  2016.              return (MRFROM2SHORT(DOR_DROP, DO_UNKNOWN));
  2017.              }
  2018.            }
  2019.          }
  2020.            }
  2021.          }
  2022.        }
  2023.      return (MRFROM2SHORT(DOR_NEVERDROP, DO_UNKNOWN));
  2024.  
  2025.       case DM_DROP:
  2026.  
  2027.      pDragInfo = (PDRAGINFO) mp1;
  2028.      if ( DrgAccessDraginfo (pDragInfo) )
  2029.        {
  2030.        if (pDragInfo->cditem == 1)
  2031.          {
  2032.          if (DrgQueryDragitem (pDragInfo,
  2033.                    sizeof(DragItem),
  2034.                    &DragItem,
  2035.                    0) )
  2036.            {
  2037.            if (DrgQueryNativeRMF (&DragItem,
  2038.                       sizeof(szDragItemRMF),
  2039.                       szDragItemRMF) )
  2040.          {
  2041.          if ( strncmp (szDragItemRMF, "DRM_OS2FILE", 11) )
  2042.            {
  2043.            DrgQueryStrName (DragItem.hstrContainerName,
  2044.                     sizeof(szDropDirectory),
  2045.                     szDropDirectory);
  2046.            DrgQueryStrName (DragItem.hstrSourceName,
  2047.                     sizeof(szDropFileName),
  2048.                     szDropFileName);
  2049.            strcpy (szBuffer, szDropDirectory);
  2050.            if (szBuffer[strlen (szBuffer)-1] != '\\')
  2051.               strcat (szBuffer, "\\");
  2052.            strcat (szBuffer, szDropFileName);
  2053.            strcpy (szDropNewFileName, szBuffer);
  2054.            fDropFile = TRUE;
  2055.            DrgSendTransferMsg (DragItem.hwndItem, DM_ENDCONVERSATION,
  2056.                        MPFROMLONG(DragItem.ulItemID),
  2057.                        MPFROMSHORT(DMFL_TARGETSUCCESSFUL));
  2058.            DrgDeleteDraginfoStrHandles (pDragInfo);
  2059.            DrgFreeDraginfo (pDragInfo);
  2060.            WinPostMsg (hwnd, WM_COMMAND,
  2061.                    MPFROM2SHORT (IDM_OPEN,0), 0L);
  2062.            return 0;
  2063.            }
  2064.          }
  2065.            }
  2066.          }
  2067.        }
  2068.      fDropFile = FALSE;
  2069.      return 0;
  2070.  
  2071.       case DM_DRAGLEAVE:
  2072.  
  2073.      return 0;
  2074.  
  2075.       case DM_DROPHELP:
  2076.  
  2077.      return 0;
  2078.  
  2079.       //-----------------------------------------------------------
  2080.       // Handle File Manager object (file) dragging to this application.
  2081.       // Note: This undocumented private File Manager protocol may not
  2082.       //       be valid in subsequent OS/2 releases.
  2083.       //-----------------------------------------------------------
  2084.       case FM_DRAGOVER:
  2085.  
  2086.      // Signal File Manager that we can accept drop by returning TRUE
  2087.  
  2088.      return MRFROMSHORT(TRUE);
  2089.  
  2090.       case FM_DROP:
  2091.  
  2092.      // File Manager sends FM_DROP message.  mp1 is pointer to structure
  2093.      //   containing unknown info. + list of files selected.  List of
  2094.      //   files begins at pointer+8.  File names are separated by '\n'
  2095.      //   (0x0A), and list ends with '\0' (0x00)
  2096.      pszFMFileList = PVOIDFROMMP(mp1);
  2097.      if (strchr (pszFMFileList+8, 0x0A) == NULL)
  2098.        {
  2099.        strcpy (szBuffer, pszFMFileList+8);
  2100.        }
  2101.      else
  2102.        {
  2103.        strcpy (szBuffer, strtok (pszFMFileList+8, "\n") );
  2104.        }
  2105.  
  2106.      strcpy (szDropNewFileName, szBuffer);
  2107.      fDropFile = TRUE;
  2108.      WinPostMsg (hwnd, WM_COMMAND,
  2109.              MPFROM2SHORT (IDM_OPEN,0), 0L);
  2110.  
  2111.      return 0;
  2112.  
  2113.       //-----------------------------------------------------------
  2114.       // Destroy the AVIO space and the presentation space.
  2115.       //-----------------------------------------------------------
  2116.       case WM_DESTROY:
  2117.  
  2118.      VioAssociate (NULL, hvps);
  2119.      VioDestroyPS (hvps);
  2120.      GpiDestroyPS (hps);
  2121.      return 0;
  2122.    }
  2123.    return WinDefWindowProc (hwnd, msg, mp1, mp2);
  2124. }
  2125. //=====================================================================
  2126. // Display File Position Procedure
  2127. //=====================================================================
  2128. VOID DisplayFilePos (HPS hps, HWND hwnd, LONG lFilePtr)
  2129.   {
  2130.   CHAR       szFilePosText[50];
  2131.  
  2132.   if (Default.fDispFilePos)
  2133.     {
  2134.     if (Default.fDispASCII)
  2135.       {
  2136.       lRowNumber = lRowNumber +
  2137.             lComputeLines (lRowPointer, lFilePtr, TRUE);
  2138.       lRowPointer = lFilePtr;
  2139.       if (lLastRowNumber < 1L)
  2140.     {
  2141.     lLastRowNumber = lRowNumber +
  2142.             lComputeLines (lRowPointer, (File.lSize-1L),
  2143.                             TRUE);
  2144.     lLastRow = lLastRowNumber;
  2145.     if (GetFileChar (File.lSize-1L) == 0x0A)
  2146.       lLastRow = lLastRowNumber - 1L;
  2147.     }
  2148.       sprintf (szFilePosText, "Line %ld of %ld", lRowNumber,
  2149.                          lLastRow);
  2150.       }
  2151.     else
  2152.       sprintf (szFilePosText, "Byte %ld of %ld (%lX Hex)",
  2153.                   lFilePtr, (File.lSize-1), (File.lSize-1));
  2154.     DispStatusLine (hps, hwnd, szFilePosText);
  2155.     }
  2156.  
  2157.   // Set Clipping Rectangle to AVIO text area
  2158.   SetClipAVIO (hps, hwnd);
  2159.  
  2160.   return;
  2161.   }
  2162. //=====================================================================
  2163. // Status Line (File Position) Procedure
  2164. //=====================================================================
  2165. VOID DispStatusLine (HPS hps, HWND hwnd, CHAR * szStatusText)
  2166.   {
  2167.      RECTL    rclStatusLine;
  2168.   static HRGN    hrgnStatus;
  2169.      HRGN    hrgnOldClip;
  2170.  
  2171.   WinQueryWindowRect (hwnd, &rclStatusLine);
  2172.   rclStatusLine.yTop = WinQuerySysValue (HWND_DESKTOP, SV_CYMENU);
  2173.  
  2174.   // Set clip rectangle to status line so status line can be redrawn.
  2175.   GpiSetClipRegion (hps, NULL, &hrgnOldClip);
  2176.   GpiDestroyRegion (hps, hrgnStatus);
  2177.   hrgnStatus = GpiCreateRegion (hps, 1L, &rclStatusLine);
  2178.   GpiSetClipRegion (hps, hrgnStatus, &hrgnOldClip);
  2179.  
  2180.   WinDrawBorder (hps, &rclStatusLine, 0, 1, SYSCLR_WINDOWSTATICTEXT,
  2181.                         SYSCLR_WINDOW,
  2182.                         DB_STANDARD |
  2183.                         DB_INTERIOR );
  2184.   WinDrawText (hps, 0xFFFF, szStatusText, &rclStatusLine,
  2185.                       SYSCLR_WINDOWSTATICTEXT,
  2186.                       SYSCLR_WINDOW,
  2187.                       DT_CENTER | DT_VCENTER);
  2188.  
  2189.   }
  2190. //=====================================================================
  2191. // Procedure to Set Clip Rectangle to AVIO (Text) Area
  2192. //=====================================================================
  2193. VOID SetClipAVIO (HPS hps, HWND hwnd)
  2194.   {
  2195.      RECTL    rclVIOSpace;
  2196.   static HRGN    hrgnVIO;
  2197.      HRGN    hrgnOldClip;
  2198.  
  2199.   GpiSetClipRegion (hps, NULL, &hrgnOldClip);
  2200.  
  2201.   // Following prevents the Status Line (drawn in GPI) from being
  2202.   //   scrolled up when the AVIO text is scrolled (i.e., the VIO region is
  2203.   //   the clipped region)
  2204.  
  2205.   if (Default.fDispFilePos)
  2206.     {
  2207.     WinQueryWindowRect (hwnd, &rclVIOSpace);
  2208.     rclVIOSpace.yBottom = WinQuerySysValue (HWND_DESKTOP, SV_CYMENU);
  2209.     GpiDestroyRegion (hps, hrgnVIO);
  2210.     hrgnVIO = GpiCreateRegion (hps, 1L, &rclVIOSpace);
  2211.     GpiSetClipRegion (hps, hrgnVIO, &hrgnOldClip);
  2212.     }
  2213.   }
  2214. //=====================================================================
  2215. // Message Box Procedures
  2216. //=====================================================================
  2217.  
  2218. HWND StartMessageBox (USHORT idDlg, CHAR * szString)
  2219.  
  2220.   {
  2221.   HWND     hwndMsgBox;
  2222.  
  2223.   hwndMsgBox = WinLoadDlg (hwndClient,
  2224.                hwndFrame,
  2225.                MessageDlgProc,
  2226.                (HMODULE) NULL,
  2227.                idDlg,
  2228.                (PVOID) NULL);
  2229.   if (strlen (szString) > 0)
  2230.     WinSetDlgItemText (hwndMsgBox, idDlg, szString);
  2231.  
  2232.   return hwndMsgBox;
  2233.  
  2234.   }
  2235.  
  2236. VOID EndMessageBox (HWND hwndMsgBox)
  2237.  
  2238.   {
  2239.  
  2240.   if (hwndMsgBox != NULL)
  2241.     {
  2242.     WinDismissDlg (hwndMsgBox, TRUE);
  2243.     WinDestroyWindow (hwndMsgBox);
  2244.     }
  2245.   }
  2246.  
  2247. //=====================================================================
  2248. // Dialog Procedures
  2249. //=====================================================================
  2250. //------------------------------------------------------------------
  2251. //  Message Dialog Box
  2252. //------------------------------------------------------------------
  2253. MRESULT EXPENTRY MessageDlgProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
  2254.    {
  2255.    switch (msg) {
  2256.  
  2257.       case WM_COMMAND:
  2258.  
  2259.      switch (COMMANDMSG(&msg)->cmd) {
  2260.  
  2261.         case DID_OK:
  2262.         case DID_CANCEL:
  2263.             WinDismissDlg (hwnd, TRUE);
  2264.             return 0;
  2265.      }
  2266.    }
  2267.    return WinDefDlgProc (hwnd, msg, mp1, mp2);
  2268. }
  2269. //------------------------------------------------------------------
  2270. //  About Dialog Box
  2271. //------------------------------------------------------------------
  2272. MRESULT EXPENTRY AboutDlgProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
  2273.    {
  2274.    switch (msg) {
  2275.  
  2276.       case WM_INITDLG:
  2277.  
  2278.      WinSetWindowUShort(hwnd, QWS_ID, IDW_ABOUT);
  2279.      if (hwndHelp != NULL)
  2280.        WinAssociateHelpInstance( hwndHelp, hwnd);
  2281.  
  2282.      CenterDlgBox (hwnd, hwndClient);
  2283.  
  2284.      return 0;
  2285.  
  2286.       case WM_COMMAND:
  2287.  
  2288.      switch (COMMANDMSG(&msg)->cmd) {
  2289.  
  2290.         case DID_OK:
  2291.         case DID_CANCEL:
  2292.             WinDismissDlg (hwnd, TRUE);
  2293.             return 0;
  2294.      }
  2295.    }
  2296.    return WinDefDlgProc (hwnd, msg, mp1, mp2);
  2297. }
  2298. //------------------------------------------------------------------
  2299. //  Goto Dialog Box
  2300. //------------------------------------------------------------------
  2301. MRESULT EXPENTRY GotoDlgProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
  2302.    {
  2303.    CHAR  szBuffer[12];
  2304.    LONG  lDeltaRows;
  2305.  
  2306.    switch (msg) {
  2307.  
  2308.       case WM_INITDLG:
  2309.  
  2310.      WinSetWindowUShort(hwnd, QWS_ID, IDW_GOTO);
  2311.      if (hwndHelp != NULL)
  2312.        WinAssociateHelpInstance( hwndHelp, hwnd);
  2313.  
  2314.      CenterDlgBox (hwnd, hwndClient);
  2315.  
  2316.      WinSendDlgItemMsg (hwnd, IDD_NEWOFFSET, EM_CLEAR, NULL, NULL);
  2317.  
  2318.      WinSendDlgItemMsg ( hwnd, IDD_NEWOFFSET, EM_SETTEXTLIMIT,
  2319.                  MPFROM2SHORT (11, 0), NULL);
  2320.  
  2321.      WinSendDlgItemMsg (hwnd, IDD_HEXGOTO, BM_SETCHECK,
  2322.                 MPFROM2SHORT (fHexGoto, 0), NULL);
  2323.      WinSendDlgItemMsg (hwnd, IDD_LINEGOTO, BM_SETCHECK,
  2324.                 MPFROM2SHORT (fLineGoto, 0), NULL);
  2325.      WinSendDlgItemMsg (hwnd, IDD_DECGOTO, BM_SETCHECK,
  2326.                 MPFROM2SHORT (fDecGoto, 0), NULL);
  2327.      return 0;
  2328.  
  2329.  
  2330.       case WM_CONTROL:
  2331.  
  2332.      switch (SHORT1FROMMP (mp1)) {
  2333.  
  2334.         case IDD_HEXGOTO:
  2335.            switch (SHORT2FROMMP (mp1)) {
  2336.  
  2337.           case BN_CLICKED:
  2338.              fDecGoto = FALSE;
  2339.              fLineGoto = FALSE;
  2340.              fHexGoto = TRUE;
  2341.              return 0;
  2342.            }
  2343.            break;
  2344.  
  2345.         case IDD_DECGOTO:
  2346.            switch (SHORT2FROMMP (mp1)) {
  2347.  
  2348.           case BN_CLICKED:
  2349.              fDecGoto = TRUE;
  2350.              fLineGoto = FALSE;
  2351.              fHexGoto = FALSE;
  2352.              return 0;
  2353.            }
  2354.            break;
  2355.  
  2356.         case IDD_LINEGOTO:
  2357.            switch (SHORT2FROMMP (mp1)) {
  2358.  
  2359.           case BN_CLICKED:
  2360.              fDecGoto = FALSE;
  2361.              fLineGoto = TRUE;
  2362.              fHexGoto = FALSE;
  2363.              return 0;
  2364.            }
  2365.            break;
  2366.      }
  2367.      break;
  2368.  
  2369.  
  2370.       case WM_COMMAND:
  2371.  
  2372.      switch (COMMANDMSG(&msg)->cmd) {
  2373.  
  2374.         case DID_OK:
  2375.            if (WinQueryDlgItemText (hwnd, IDD_NEWOFFSET, sizeof szBuffer,
  2376.             szBuffer)) {
  2377.           if (fHexGoto)
  2378.             lNewViewPtr = strtol(szBuffer, NULL, 16);
  2379.           else {
  2380.             if (fLineGoto) {
  2381.               WinSetPointer (HWND_DESKTOP,
  2382.                      WinQuerySysPointer (HWND_DESKTOP,
  2383.                              SPTR_WAIT,
  2384.                              FALSE) );
  2385.               lDeltaRows = atol(szBuffer) - 1L;
  2386.               lNewViewPtr = MoveViewPtr (0L, &lDeltaRows, TRUE);
  2387.               lRowNumber = lDeltaRows + 1L;
  2388.               lRowPointer = lNewViewPtr;
  2389.               WinSetPointer (HWND_DESKTOP,
  2390.                      WinQuerySysPointer (HWND_DESKTOP,
  2391.                              SPTR_ARROW,
  2392.                              FALSE) );
  2393.               }
  2394.             else
  2395.               lNewViewPtr = atol (szBuffer);
  2396.             }
  2397.           WinDismissDlg (hwnd, TRUE);
  2398.           return 0;
  2399.            }
  2400.         case DID_CANCEL:
  2401.            WinDismissDlg (hwnd, FALSE);
  2402.            return 0;
  2403.      }
  2404.    }
  2405.    return WinDefDlgProc (hwnd, msg, mp1, mp2);
  2406. }
  2407. //=====================================================================
  2408. // Search Dialog Procedures
  2409. //=====================================================================
  2410. //------------------------------------------------------------------
  2411. //  Search Dialog Box
  2412. //------------------------------------------------------------------
  2413. MRESULT EXPENTRY SearchDlgProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
  2414.    {
  2415.    switch (msg) {
  2416.  
  2417.       case WM_INITDLG:
  2418.  
  2419.      WinSetWindowUShort(hwnd, QWS_ID, IDW_SEARCH);
  2420.      if (hwndHelp != NULL)
  2421.        WinAssociateHelpInstance( hwndHelp, hwnd);
  2422.  
  2423.      CenterDlgBox (hwnd, hwndClient);
  2424.  
  2425.      if (fHexString)
  2426.        WinSetDlgItemText ( hwnd, IDD_SRCHSTR, szSearchHStr);
  2427.      else
  2428.        WinSetDlgItemText ( hwnd, IDD_SRCHSTR, szSearchStr);
  2429.  
  2430.      WinSendDlgItemMsg (hwnd, IDD_CHKCASE, BM_SETCHECK,
  2431.                 MPFROM2SHORT (fCheckCase, 0), NULL);
  2432.  
  2433.      WinSendDlgItemMsg (hwnd, IDD_TOPSEARCH, BM_SETCHECK,
  2434.                 MPFROM2SHORT (fTopSearch, 0), NULL);
  2435.  
  2436.      WinSendDlgItemMsg (hwnd, IDD_HEXSTRING, BM_SETCHECK,
  2437.                 MPFROM2SHORT (fHexString, 0), NULL);
  2438.      return 0;
  2439.  
  2440.       case WM_CONTROL:
  2441.  
  2442.      switch (SHORT1FROMMP (mp1)) {
  2443.  
  2444.         case IDD_CHKCASE:
  2445.            switch (SHORT2FROMMP (mp1)) {
  2446.  
  2447.           case BN_CLICKED:
  2448.              if (fCheckCase)
  2449.             fCheckCase = FALSE;
  2450.              else
  2451.             fCheckCase = TRUE;
  2452.              return 0;
  2453.            }
  2454.            break;
  2455.  
  2456.         case IDD_TOPSEARCH:
  2457.            switch (SHORT2FROMMP (mp1)) {
  2458.  
  2459.           case BN_CLICKED:
  2460.              if (fTopSearch)
  2461.             fTopSearch = FALSE;
  2462.              else
  2463.             fTopSearch = TRUE;
  2464.              return 0;
  2465.            }
  2466.            break;
  2467.  
  2468.         case IDD_HEXSTRING:
  2469.            switch (SHORT2FROMMP (mp1)) {
  2470.  
  2471.           case BN_CLICKED:
  2472.              if (fHexString)
  2473.             fHexString = FALSE;
  2474.              else
  2475.             fHexString = TRUE;
  2476.              return 0;
  2477.            }
  2478.            break;
  2479.      }
  2480.      break;
  2481.  
  2482.       case WM_COMMAND:
  2483.  
  2484.      switch (COMMANDMSG(&msg)->cmd) {
  2485.  
  2486.         case DID_OK:
  2487.            if (fHexString) {
  2488.          WinQueryDlgItemText (hwnd, IDD_SRCHSTR, sizeof szSearchHStr,
  2489.               szSearchHStr);
  2490.          cbSearchStrLen = atob(szSearchHStr, sSearchStr);
  2491.          if (cbSearchStrLen) {
  2492.             WinDismissDlg (hwnd, TRUE);
  2493.             return 0;
  2494.             }
  2495.          }
  2496.            else {
  2497.          WinQueryDlgItemText (hwnd, IDD_SRCHSTR, sizeof szSearchStr,
  2498.               szSearchStr);
  2499.          if (strlen (szSearchStr)) {
  2500.             WinDismissDlg (hwnd, TRUE);
  2501.             return 0;
  2502.             }
  2503.          }
  2504.  
  2505.         case DID_CANCEL:
  2506.            WinDismissDlg (hwnd, FALSE);
  2507.            return 0;
  2508.      }
  2509.    }
  2510.    return WinDefDlgProc (hwnd, msg, mp1, mp2);
  2511. }
  2512. //===================================================================
  2513. // Procedures for File open dialog box
  2514. //===================================================================
  2515. //------------------------------------------------------------------
  2516. //  Center Dialog Box Procedure
  2517. //------------------------------------------------------------------
  2518. VOID CenterDlgBox (HWND hwndDialog, HWND hwndParent)
  2519.   {
  2520.   static SWP   swpParent;
  2521.   static SWP   swpDialog;
  2522.  
  2523.   WinQueryWindowPos (hwndParent, &swpParent);
  2524.   WinQueryWindowPos (hwndDialog, &swpDialog);
  2525.   if (swpParent.cx > swpDialog.cx)
  2526.     swpDialog.x = swpDialog.x + ((swpParent.cx - swpDialog.cx)/2);
  2527.   if (swpParent.cy > swpDialog.cy)
  2528.     swpDialog.y = swpDialog.y + ((swpParent.cy - swpDialog.cy)/2);
  2529.   WinSetWindowPos (hwndDialog,
  2530.            swpDialog.hwndInsertBehind,
  2531.            swpDialog.x,
  2532.            swpDialog.y,
  2533.            swpDialog.cx,
  2534.            swpDialog.cy,
  2535.            swpDialog.fs);
  2536.   return;
  2537.   }
  2538. //------------------------------------------------------------------
  2539. //  Fill Drive List Box Procedure
  2540. //------------------------------------------------------------------
  2541. VOID FillDriveListBox (HWND hwnd, CHAR *pcCurrentPath) {
  2542.    static CHAR szDrive [] = "  :";
  2543.    SHORT  sDrive;
  2544.    ULONG  ulDriveMap;
  2545.    USHORT usDriveNum;
  2546.  
  2547.    DosQCurDisk (&usDriveNum, &ulDriveMap);
  2548.  
  2549.    pcCurrentPath[0] = (CHAR) usDriveNum + (CHAR) '@';
  2550.    pcCurrentPath[1] = ':';
  2551.    pcCurrentPath[2] = '\\';
  2552.  
  2553.    WinSendDlgItemMsg (hwnd, IDD_DRIVELIST, LM_DELETEALL, NULL, NULL);
  2554.  
  2555.    for (sDrive = 0; sDrive < 26 ; sDrive++ )
  2556.       if (ulDriveMap & 1L << sDrive) {
  2557.      szDrive [1] = (CHAR) sDrive + (CHAR) 'A';
  2558.  
  2559.      WinSendDlgItemMsg (hwnd, IDD_DRIVELIST, LM_INSERTITEM,
  2560.                   MPFROM2SHORT (LIT_END, 0),
  2561.                   MPFROMP (szDrive));
  2562.       }
  2563.       WinSendDlgItemMsg (hwnd, IDD_DRIVELIST, LM_SELECTITEM,
  2564.                MPFROM2SHORT (usDriveNum - 1, 0),
  2565.                MPFROM2SHORT (TRUE, 0));
  2566. }
  2567. //------------------------------------------------------------------
  2568. //  Fill Directory List Box Procedure
  2569. //------------------------------------------------------------------
  2570. VOID FillDirListBox (HWND hwnd, CHAR *pcCurPath, BOOL fIncHidden) {
  2571.    static      CHAR  szRootStr[] = "\\";
  2572.    FILEFINDBUF findbuf;
  2573.    HDIR        hDir = 1;
  2574.    USHORT      usCurPathLen = PATHLENGTH, usSearchCount = 1;
  2575.    USHORT      usAttr;
  2576.  
  2577.    if (fIncHidden)
  2578.       usAttr = 0x0017;
  2579.    else
  2580.       usAttr = 0x0015;
  2581.  
  2582.    WinSendDlgItemMsg (hwnd, IDD_DIRLIST, LM_DELETEALL, NULL, NULL);
  2583.  
  2584.    DosQCurDir (0, pcCurPath + 3 , &usCurPathLen);
  2585.  
  2586.    DosFindFirst ("*.*", &hDir, usAttr, &findbuf, sizeof findbuf,
  2587.          &usSearchCount, 0L);
  2588.  
  2589.    while (usSearchCount) {
  2590.       if (findbuf.attrFile & 0x0010
  2591.       && (findbuf.achName [0] != '.' || findbuf.achName [1] ))
  2592.  
  2593.      if (pcCurPath [strlen(pcCurPath)-1] != '\\'
  2594.          || findbuf.achName[1] != '.' || findbuf.achName [2])
  2595.  
  2596.         WinSendDlgItemMsg (hwnd, IDD_DIRLIST, LM_INSERTITEM,
  2597.                  MPFROM2SHORT (LIT_SORTASCENDING, 0),
  2598.                  MPFROMP (findbuf.achName));
  2599.  
  2600.       DosFindNext (hDir, &findbuf, sizeof findbuf, &usSearchCount);
  2601.    }
  2602.    if (pcCurPath [strlen(pcCurPath)-1] != '\\')
  2603.       WinSendDlgItemMsg (hwnd, IDD_DIRLIST, LM_INSERTITEM,
  2604.               MPFROM2SHORT (0, 0), MPFROMP (szRootStr));
  2605. }
  2606. //------------------------------------------------------------------
  2607. //  Fill File List Box Procedure
  2608. //------------------------------------------------------------------
  2609. VOID FillFileListBox (HWND hwnd, CHAR *pcSearchParam, BOOL fIncHidden) {
  2610.    FILEFINDBUF findbuf;
  2611.    HDIR        hDir = 1;
  2612.    USHORT      usSearchCount = 1;
  2613.    USHORT      usAttr;
  2614.  
  2615.    if (fIncHidden)
  2616.       usAttr = 0x0007;
  2617.    else
  2618.       usAttr = 0x0005;
  2619.  
  2620.    WinSendDlgItemMsg (hwnd, IDD_FILELIST, LM_DELETEALL, NULL, NULL);
  2621.  
  2622.    DosFindFirst (pcSearchParam, &hDir, usAttr, &findbuf, sizeof findbuf,
  2623.          &usSearchCount, 0L);
  2624.  
  2625.    while (usSearchCount) {
  2626.       WinSendDlgItemMsg (hwnd, IDD_FILELIST, LM_INSERTITEM,
  2627.                MPFROM2SHORT (LIT_SORTASCENDING, 0),
  2628.                MPFROMP (findbuf.achName));
  2629.       DosFindNext (hDir, &findbuf, sizeof findbuf, &usSearchCount);
  2630.    }
  2631. }
  2632. //------------------------------------------------------------------
  2633. //  File Open Dialog Box Procedure
  2634. //------------------------------------------------------------------
  2635. MRESULT EXPENTRY FileDlgProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
  2636.    {
  2637.    static      CHAR  szCurrentPath [PATHLENGTH], szFileName[PATHLENGTH] = "*.*";
  2638.    static      CHAR  szFileNameFilter[PATHLENGTH] = "*.*";
  2639.    static      BOOL  fIncHidden;
  2640.    CHAR        *pFileName;
  2641.    CHAR        szBuffer [PATHLENGTH];
  2642.    CHAR        szFilterText [PATHLENGTH+12];
  2643.    CHAR        szLastFileName [PATHLENGTH];
  2644.    USHORT      sLastFileIndex;
  2645.    USHORT      usCurPathLen = PATHLENGTH - 3;
  2646.    SHORT       sSelect;
  2647.    FILEFINDBUF findbuf;
  2648.    HDIR        hDir = 1;
  2649.    USHORT      usSearchCount = 1, usAttr;
  2650.    SHORT       i;
  2651.  
  2652.    switch (msg) {
  2653.  
  2654.       case WM_INITDLG:
  2655.  
  2656.      WinSetWindowUShort(hwnd, QWS_ID, IDW_OPEN);
  2657.      if (hwndHelp != NULL)
  2658.        WinAssociateHelpInstance( hwndHelp, hwnd);
  2659.  
  2660.      fIncHidden = Default.fIncHiddenFiles;
  2661.  
  2662.      CenterDlgBox (hwnd, hwndClient);
  2663.  
  2664.      if (strlen(szWildCardFilename) != 0)
  2665.        {
  2666.        if (DosQPathInfo (szWildCardFilename, 5, szBuffer,
  2667.                  sizeof szBuffer, 0L))
  2668.           WinMessageBox ( HWND_DESKTOP, hwnd, szBuffer,
  2669.                    "Unrecognized path", 1,
  2670.                    MB_OK | MB_CRITICAL);
  2671.        for (i = strlen(szBuffer); i >= 0; i--)
  2672.           if (szBuffer[i] == '\\')
  2673.          break;
  2674.        strcpy (szFileNameFilter, szBuffer + i + 1);
  2675.        strcpy (szFilterText, "File Filter: ");
  2676.        strcat (szFilterText, szFileNameFilter);
  2677.        DosSelectDisk ((USHORT) (*szBuffer - 'A' + 1));
  2678.        if (strchr (szBuffer, '\\') != strrchr (szBuffer, '\\'))
  2679.          *(strrchr (szBuffer, '\\')) = '\0';
  2680.        else
  2681.          *(szBuffer+3) = '\0';
  2682.        DosChDir (szBuffer+2, 0L);
  2683.        *szWildCardFilename = '\0';
  2684.        }
  2685.      else
  2686.        {
  2687.        strcpy (szFileName, "*.*");
  2688.        strcpy (szFilterText, "File Filter: ");
  2689.        strcat (szFilterText, szFileNameFilter);
  2690.        }
  2691.      WinSetDlgItemText (hwnd, IDD_FILEFILTER, szFilterText);
  2692.      FillDriveListBox (hwnd, szCurrentPath);
  2693.      FillDirListBox (hwnd, szCurrentPath, fIncHidden);
  2694.      FillFileListBox (hwnd, szFileNameFilter, fIncHidden);
  2695.  
  2696.      WinSendDlgItemMsg (hwnd, IDD_INCHIDDEN, BM_SETCHECK,
  2697.                 MPFROM2SHORT (fIncHidden, 0), NULL);
  2698.  
  2699.      DosQCurDir (0, szCurrentPath + 3, &usCurPathLen);
  2700.  
  2701.      WinSendDlgItemMsg ( hwnd, IDD_FILEEDIT, EM_SETTEXTLIMIT,
  2702.                  MPFROM2SHORT (PATHLENGTH, 0), NULL);
  2703.  
  2704.      WinSetDlgItemText ( hwnd, IDD_FILEEDIT, szCurrentPath);
  2705.  
  2706.  
  2707.      pFileName = strrchr(File.szName, '\\');
  2708.      if (pFileName != NULL) {
  2709.         strcpy (szLastFileName, (pFileName + 1));
  2710.         for (i = 0; i < (SHORT) strlen(szLastFileName); i++)
  2711.            szLastFileName[i] = (CHAR) toupper(szLastFileName[i]);
  2712.         sLastFileIndex = SHORT1FROMMR (
  2713.            WinSendDlgItemMsg ( hwnd, IDD_FILELIST, LM_SEARCHSTRING,
  2714.                     MPFROM2SHORT (LSS_CASESENSITIVE, LIT_FIRST),
  2715.                     MPFROMP (szLastFileName) )
  2716.                     );
  2717.         if ( (sLastFileIndex != LIT_ERROR) && (sLastFileIndex != LIT_NONE) )
  2718.            WinSendDlgItemMsg ( hwnd, IDD_FILELIST, LM_SETTOPINDEX,
  2719.                    MPFROMSHORT (sLastFileIndex),
  2720.                    NULL);
  2721.      }
  2722.  
  2723.  
  2724.      return 0;
  2725.  
  2726.       case WM_CONTROL:
  2727.  
  2728.      if (SHORT1FROMMP (mp1) == IDD_DRIVELIST ||
  2729.          SHORT1FROMMP (mp1) == IDD_DIRLIST     ||
  2730.          SHORT1FROMMP (mp1) == IDD_FILELIST) {
  2731.  
  2732.         sSelect = (USHORT) SHORT1FROMMR (
  2733.               WinSendDlgItemMsg (hwnd, SHORT1FROMMP (mp1),
  2734.                          LM_QUERYSELECTION, 0L, 0L) );
  2735.  
  2736.         WinSendDlgItemMsg (hwnd, SHORT1FROMMP (mp1),
  2737.                   LM_QUERYITEMTEXT,
  2738.                   MPFROM2SHORT (sSelect, sizeof szBuffer),
  2739.                   MPFROMP (szBuffer));
  2740.      }
  2741.  
  2742.      switch (SHORT1FROMMP (mp1)) {
  2743.  
  2744.         case IDD_DRIVELIST:
  2745.            switch (SHORT2FROMMP (mp1)) {
  2746.  
  2747.           case LN_ENTER:
  2748.              szCurrentPath[0] = szBuffer[1];
  2749.              DosSelectDisk (szBuffer [1] - '@');
  2750.  
  2751.              FillDirListBox (hwnd, szCurrentPath, fIncHidden);
  2752.              if (strcmp(szFileName, "*.*") != 0) {
  2753.             if (szCurrentPath [strlen (szCurrentPath)-1]
  2754.                                 != '\\')
  2755.                strcat (szCurrentPath, "\\");
  2756.             strcat (szCurrentPath, szFileName);
  2757.              }
  2758.              WinSetDlgItemText ( hwnd, IDD_FILEEDIT, szCurrentPath);
  2759.              FillFileListBox (hwnd, szFileNameFilter, fIncHidden);
  2760.  
  2761.              return 0;
  2762.            }
  2763.            break;
  2764.  
  2765.         case IDD_DIRLIST:
  2766.            switch (SHORT2FROMMP (mp1)) {
  2767.  
  2768.           case LN_ENTER:
  2769.  
  2770.              DosChDir (szBuffer, 0L);
  2771.  
  2772.              FillDirListBox (hwnd, szCurrentPath, fIncHidden);
  2773.              if (strcmp(szFileName, "*.*") != 0) {
  2774.             if (szCurrentPath [strlen (szCurrentPath)-1]
  2775.                                 != '\\')
  2776.                strcat (szCurrentPath, "\\");
  2777.             strcat (szCurrentPath, szFileName);
  2778.              }
  2779.              WinSetDlgItemText ( hwnd, IDD_FILEEDIT, szCurrentPath);
  2780.              FillFileListBox (hwnd, szFileNameFilter, fIncHidden);
  2781.              return 0;
  2782.            }
  2783.            break;
  2784.  
  2785.         case IDD_FILELIST:
  2786.            switch (SHORT2FROMMP (mp1)) {
  2787.  
  2788.           case LN_SELECT:
  2789.  
  2790.              DosQCurDir (0, szCurrentPath + 3, &usCurPathLen);
  2791.              if (szCurrentPath [strlen(szCurrentPath)-1] != '\\')
  2792.             strcat (szCurrentPath, "\\");
  2793.              strcat (szCurrentPath, szBuffer);
  2794.  
  2795.              WinSetDlgItemText ( hwnd, IDD_FILEEDIT, szCurrentPath);
  2796.              return 0;
  2797.  
  2798.           case LN_ENTER:
  2799.  
  2800.              WinQueryDlgItemText (hwnd, IDD_FILEEDIT,
  2801.                       sizeof szCurrentPath,
  2802.                       szCurrentPath);
  2803.              if (DosQPathInfo (szCurrentPath, 5, szBuffer,
  2804.                    sizeof szBuffer, 0L)) {
  2805.             WinMessageBox ( HWND_DESKTOP, hwnd, szBuffer,
  2806.                          "Unrecognised path", 1,
  2807.                          MB_OK | MB_ERROR);
  2808.             return 0;
  2809.              } else {
  2810.             strcpy (szNewFile, szBuffer);
  2811.             Default.fIncHiddenFiles = fIncHidden;
  2812.             WinDismissDlg (hwnd, TRUE);
  2813.             return 0;
  2814.              }
  2815.            }
  2816.            break;
  2817.  
  2818.         case IDD_INCHIDDEN:
  2819.            switch (SHORT2FROMMP (mp1)) {
  2820.  
  2821.           case BN_CLICKED:
  2822.              if (fIncHidden)
  2823.             fIncHidden = FALSE;
  2824.              else
  2825.             fIncHidden = TRUE;
  2826.              FillFileListBox (hwnd, szFileName, fIncHidden);
  2827.              FillDirListBox (hwnd, szCurrentPath, fIncHidden);
  2828.              return 0;
  2829.            }
  2830.            break;
  2831.      }
  2832.      break;
  2833.  
  2834.       case WM_COMMAND:
  2835.  
  2836.      switch (COMMANDMSG(&msg)->cmd) {
  2837.  
  2838.         case DID_OK:
  2839.            if (WinQueryDlgItemText (hwnd, IDD_FILEEDIT,
  2840.                     sizeof szCurrentPath,
  2841.                     szCurrentPath) == 0)
  2842.          {
  2843.          strcpy (szCurrentPath, " ");
  2844.          }
  2845.            strcpy (szBuffer, szCurrentPath);
  2846.            if (DosQPathInfo (szCurrentPath, 5, szBuffer,
  2847.                  sizeof szBuffer, 0L)) {
  2848.           WinMessageBox ( HWND_DESKTOP, hwnd, szBuffer,
  2849.                        "Unrecognized path", 1,
  2850.                        MB_OK | MB_ERROR);
  2851.           return 0;
  2852.            } else
  2853.           if (strchr (szBuffer, '*') == 0
  2854.               && strchr (szBuffer, '?') == 0) {
  2855.              if (fIncHidden)
  2856.             usAttr = 0x0007;
  2857.              else
  2858.             usAttr = 0x0005;
  2859.              usSearchCount = 1;
  2860.  
  2861.              DosFindFirst (szBuffer, &hDir, usAttr, &findbuf,
  2862.                    sizeof findbuf, &usSearchCount, 0L);
  2863.              if (usSearchCount    == 0) {
  2864.             WinMessageBox (HWND_DESKTOP, hwnd, szBuffer,
  2865.                        "File not Found", 1, MB_OK | MB_ERROR);
  2866.             return 0;
  2867.              } else {
  2868.             strcpy (szNewFile, szBuffer);
  2869.             Default.fIncHiddenFiles = fIncHidden;
  2870.             WinDismissDlg (hwnd, TRUE);
  2871.             return 0;
  2872.              }
  2873.           } else {
  2874.              for (i = strlen(szBuffer); i >= 0; i--)
  2875.             if (szBuffer[i] == '\\')
  2876.                break;
  2877.              strcpy (szFileNameFilter, szBuffer + i + 1);
  2878.              strcpy (szFilterText, "File Filter: ");
  2879.              strcat (szFilterText, szFileNameFilter);
  2880.              WinSetDlgItemText (hwnd, IDD_FILEFILTER, szFilterText);
  2881.              DosSelectDisk ((USHORT) (*szBuffer - 'A' + 1));
  2882.              if (strchr (szBuffer, '\\') != strrchr (szBuffer, '\\'))
  2883.                *(strrchr (szBuffer, '\\')) = '\0';
  2884.              else
  2885.                *(szBuffer+3) = '\0';
  2886.              DosChDir (szBuffer+2, 0L);
  2887.              FillDriveListBox (hwnd, szCurrentPath);
  2888.              FillDirListBox (hwnd, szCurrentPath, fIncHidden);
  2889.              FillFileListBox (hwnd, szFileNameFilter, fIncHidden);
  2890.              FillFileListBox (hwnd, szFileNameFilter, fIncHidden);
  2891.              return 0;
  2892.           }
  2893.            break;
  2894.         case DID_CANCEL:
  2895.            WinDismissDlg (hwnd, FALSE);
  2896.            return 0;
  2897.      }
  2898.      break;
  2899.    }
  2900.    return WinDefDlgProc (hwnd, msg, mp1, mp2);
  2901. }
  2902. //===================================================================
  2903. // Procedures for Configure dialog box
  2904. //===================================================================
  2905. VOID FillColorBox (HWND hwnd, SHORT iListID) {
  2906.  
  2907.    static CHAR szColors [16][12] = { "Black", "Dk. Blue", "Dk. Green",
  2908.       "Dk. Cyan", "Dk. Red", "Dk. Magenta", "Brown", "Gray", "Dk. Gray",
  2909.       "Blue", "Green", "Cyan", "Red", "Magenta", "Yellow", "White"};
  2910.  
  2911.    SHORT  i;
  2912.  
  2913.    WinSendDlgItemMsg (hwnd, iListID, LM_DELETEALL, NULL, NULL);
  2914.  
  2915.    for (i = 0; i < 16 ; i++ )
  2916.      WinSendDlgItemMsg (hwnd, iListID, LM_INSERTITEM,
  2917.                   MPFROM2SHORT (LIT_END, 0),
  2918.                   MPFROMP (szColors[i]));
  2919.    return;
  2920. }
  2921. //------------------------------------------------------------------
  2922. //  Fill Character cell size box
  2923. //------------------------------------------------------------------
  2924. VOID FillCellSizeBox (HWND hwnd, SHORT iListID) {
  2925.  
  2926.    SHORT  i;
  2927.    CHAR   szBuffer[8];
  2928.  
  2929.    WinSendDlgItemMsg (hwnd, iListID, LM_DELETEALL, NULL, NULL);
  2930.  
  2931.    for (i=0; i<sCellSizeCount; i++)
  2932.      {
  2933.      sprintf (szBuffer, "%2d x %2d", sCellSize[i][0], sCellSize[i][1]);
  2934.      WinSendDlgItemMsg (hwnd, iListID, LM_INSERTITEM,
  2935.              MPFROM2SHORT (LIT_END, 0),
  2936.              MPFROMP (szBuffer));
  2937.      }
  2938.    return;
  2939. }
  2940. //------------------------------------------------------------------
  2941. // GetFontSize - Determine font size.
  2942. //------------------------------------------------------------------
  2943. SHORT GetCellSize (SHORT sHeight, SHORT sWidth) {
  2944.  
  2945.    SHORT  i, sIndex = 0;
  2946.  
  2947.    sIndex = 0;
  2948.  
  2949.    for (i = 0; i < sCellSizeCount; i++ )
  2950.      {
  2951.      if (sHeight == sCellSize[i][1] && sWidth == sCellSize[i][0])
  2952.        {
  2953.        sIndex = i;
  2954.        break;
  2955.        }
  2956.      }
  2957.    return sIndex;
  2958. }
  2959. //------------------------------------------------------------------
  2960. //  Configure Dialog Box
  2961. //------------------------------------------------------------------
  2962. MRESULT EXPENTRY ConfigDlgProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
  2963.    {
  2964.    static   SHORT    sSelect;
  2965.    static   UCHAR    szAttribute[2];
  2966.    static   SHORT    sCHeight;
  2967.    static   SHORT    sCWidth;
  2968.    static   SHORT    sTabStop;
  2969.    static   BOOL     fDispASCII;
  2970.    static   BOOL     fScrollBars;
  2971.    static   BOOL     fDispEBCDIC;
  2972.    static   BOOL     fDispFilePos;
  2973.    static   BOOL     fLocalSaveWinPos;
  2974.  
  2975.    switch (msg) {
  2976.  
  2977.       case WM_INITDLG:
  2978.  
  2979.      WinSetWindowUShort(hwnd, QWS_ID, IDW_CONFIGURE);
  2980.      if (hwndHelp != NULL)
  2981.        WinAssociateHelpInstance( hwndHelp, hwnd);
  2982.  
  2983.      CenterDlgBox (hwnd, hwndClient);
  2984.  
  2985.      szAttribute[1] = Default.szAttribute[1];
  2986.      sCHeight = Default.sCellHeight;
  2987.      sCWidth = Default.sCellWidth;
  2988.      sTabStop = Default.sTabStop;
  2989.      fDispASCII = Default.fDispASCII;
  2990.      fScrollBars = Default.fScrollBars;
  2991.      fDispEBCDIC = Default.fDispEBCDIC;
  2992.      fDispFilePos = Default.fDispFilePos;
  2993.      fLocalSaveWinPos = FALSE;
  2994.  
  2995.      FillColorBox (hwnd, IDD_FCOLOR);
  2996.      FillColorBox (hwnd, IDD_BCOLOR);
  2997.      FillCellSizeBox (hwnd, IDD_CELLSIZE);
  2998.  
  2999.      WinSendDlgItemMsg (hwnd, IDD_BCOLOR, LM_SELECTITEM,
  3000.            MPFROM2SHORT (((szAttribute[1]>>4) & 0x0f), 0),
  3001.            MPFROM2SHORT (TRUE,0));
  3002.  
  3003.      WinSendDlgItemMsg (hwnd, IDD_FCOLOR, LM_SELECTITEM,
  3004.            MPFROM2SHORT ((szAttribute[1] & 0x0f), 0),
  3005.            MPFROM2SHORT (TRUE,0));
  3006.  
  3007.      WinSendDlgItemMsg (hwnd, IDD_CELLSIZE, LM_SELECTITEM,
  3008.            MPFROM2SHORT (GetCellSize (sCHeight,sCWidth), 0),
  3009.            MPFROM2SHORT (TRUE,0));
  3010.  
  3011.      WinSendDlgItemMsg (hwnd, IDD_DEFASCII, BM_SETCHECK,
  3012.                 MPFROM2SHORT (fDispASCII, 0), NULL);
  3013.  
  3014.      WinSendDlgItemMsg (hwnd, IDD_DEFHEXASC, BM_SETCHECK,
  3015.                 MPFROM2SHORT (!fDispASCII, 0), NULL);
  3016.  
  3017.      WinSendDlgItemMsg (hwnd, IDD_DEFHEXEBC, BM_SETCHECK,
  3018.                 MPFROM2SHORT (fDispEBCDIC, 0), NULL);
  3019.  
  3020.      WinSendDlgItemMsg (hwnd, IDD_DEFSCROLL, BM_SETCHECK,
  3021.                 MPFROM2SHORT (fScrollBars, 0), NULL);
  3022.  
  3023.      WinSendDlgItemMsg (hwnd, IDD_DEFFILEPOS, BM_SETCHECK,
  3024.                 MPFROM2SHORT (fDispFilePos, 0), NULL);
  3025.  
  3026.      WinSendDlgItemMsg (hwnd, IDD_SAVEWINPOS, BM_SETCHECK,
  3027.                 MPFROM2SHORT (fLocalSaveWinPos, 0), NULL);
  3028.  
  3029.      WinSendDlgItemMsg (hwnd, IDD_SAVE, BM_SETCHECK,
  3030.                 MPFROM2SHORT (fSaveToDisk, 0), NULL);
  3031.  
  3032.      WinSetDlgItemShort ( hwnd, IDD_DEFTABS, sTabStop, FALSE);
  3033.  
  3034.      return 0;
  3035.  
  3036.       case WM_CONTROL:
  3037.  
  3038.      if (SHORT1FROMMP (mp1) == IDD_BCOLOR     ||
  3039.          SHORT1FROMMP (mp1) == IDD_FCOLOR     ||
  3040.          SHORT1FROMMP (mp1) == IDD_CELLSIZE) {
  3041.         sSelect = (USHORT) SHORT1FROMMR (
  3042.                    WinSendDlgItemMsg (hwnd,
  3043.                           SHORT1FROMMP (mp1),
  3044.                           LM_QUERYSELECTION, 0L,
  3045.                           0L) );
  3046.      }
  3047.      switch (SHORT1FROMMP (mp1)) {
  3048.  
  3049.         case IDD_BCOLOR:
  3050.            switch (SHORT2FROMMP (mp1)) {
  3051.  
  3052.           case LN_SELECT:
  3053.  
  3054.              szAttribute[1] = (szAttribute[1] & (UCHAR) 0x0f)
  3055.                       | (UCHAR) ((sSelect << 4) & 0xf0);
  3056.              return 0;
  3057.            }
  3058.            break;
  3059.  
  3060.         case IDD_FCOLOR:
  3061.            switch (SHORT2FROMMP (mp1)) {
  3062.  
  3063.           case LN_SELECT:
  3064.  
  3065.              szAttribute[1] = (szAttribute[1] & (UCHAR) 0xf0)
  3066.                       | (UCHAR) (sSelect & 0x0f);
  3067.              return 0;
  3068.            }
  3069.            break;
  3070.  
  3071.         case IDD_CELLSIZE:
  3072.            switch (SHORT2FROMMP (mp1)) {
  3073.  
  3074.           case LN_SELECT:
  3075.  
  3076.              sCHeight = sCellSize [sSelect][1];
  3077.              sCWidth = sCellSize [sSelect][0];
  3078.              return 0;
  3079.            }
  3080.            break;
  3081.  
  3082.         case IDD_DEFASCII:
  3083.            switch (SHORT2FROMMP (mp1)) {
  3084.  
  3085.           case BN_CLICKED:
  3086.              fDispASCII = TRUE;
  3087.              fDispEBCDIC = FALSE;
  3088.              return 0;
  3089.            }
  3090.            break;
  3091.  
  3092.         case IDD_DEFHEXASC:
  3093.            switch (SHORT2FROMMP (mp1)) {
  3094.  
  3095.           case BN_CLICKED:
  3096.              fDispASCII = FALSE;
  3097.              fDispEBCDIC = FALSE;
  3098.              return 0;
  3099.            }
  3100.            break;
  3101.  
  3102.         case IDD_DEFHEXEBC:
  3103.            switch (SHORT2FROMMP (mp1)) {
  3104.  
  3105.           case BN_CLICKED:
  3106.              fDispASCII = FALSE;
  3107.              fDispEBCDIC = TRUE;
  3108.              return 0;
  3109.            }
  3110.            break;
  3111.  
  3112.         case IDD_DEFFILEPOS:
  3113.            switch (SHORT2FROMMP (mp1)) {
  3114.  
  3115.           case BN_CLICKED:
  3116.              if (fDispFilePos)
  3117.             fDispFilePos = FALSE;
  3118.              else
  3119.             fDispFilePos = TRUE;
  3120.              return 0;
  3121.            }
  3122.            break;
  3123.  
  3124.         case IDD_DEFSCROLL:
  3125.            switch (SHORT2FROMMP (mp1)) {
  3126.  
  3127.           case BN_CLICKED:
  3128.              if (fScrollBars)
  3129.             fScrollBars = FALSE;
  3130.              else
  3131.             fScrollBars = TRUE;
  3132.              return 0;
  3133.            }
  3134.            break;
  3135.  
  3136.         case IDD_SAVEWINPOS:
  3137.            switch (SHORT2FROMMP (mp1)) {
  3138.  
  3139.           case BN_CLICKED:
  3140.              if (fLocalSaveWinPos)
  3141.             fLocalSaveWinPos = FALSE;
  3142.              else
  3143.             fLocalSaveWinPos = TRUE;
  3144.              return 0;
  3145.            }
  3146.            break;
  3147.  
  3148.         case IDD_SAVE:
  3149.            switch (SHORT2FROMMP (mp1)) {
  3150.  
  3151.           case BN_CLICKED:
  3152.              if (fSaveToDisk)
  3153.             fSaveToDisk = FALSE;
  3154.              else
  3155.             fSaveToDisk = TRUE;
  3156.              return 0;
  3157.            }
  3158.            break;
  3159.      }
  3160.      break;
  3161.  
  3162.       case WM_COMMAND:
  3163.  
  3164.      switch (COMMANDMSG(&msg)->cmd) {
  3165.  
  3166.           case DID_OK:
  3167.              Default.szAttribute[1] = szAttribute[1];
  3168.              Default.sCellHeight = sCHeight;
  3169.              Default.sCellWidth = sCWidth;
  3170.              Default.fDispASCII = fDispASCII;
  3171.              Default.fScrollBars = fScrollBars;
  3172.              Default.fDispEBCDIC = fDispEBCDIC;
  3173.              Default.fDispFilePos = fDispFilePos;
  3174.              WinQueryDlgItemShort (hwnd, IDD_DEFTABS, &sSelect,
  3175.                        FALSE);
  3176.              sSelect = min (max (1, sSelect), AVIOCOLS - 1);
  3177.              Default.sTabStop = sSelect;
  3178.              fSaveWinPos = fLocalSaveWinPos;
  3179.              WinDismissDlg (hwnd, TRUE);
  3180.              return (MRESULT) 1;
  3181.  
  3182.           case DID_CANCEL:
  3183.               WinDismissDlg (hwnd, FALSE);
  3184.               return 0;
  3185.      }
  3186.    }
  3187.    return WinDefDlgProc (hwnd, msg, mp1, mp2);
  3188. }
  3189. //------------------------------------------------------------------
  3190. //  Font Size Dialog Box
  3191. //------------------------------------------------------------------
  3192. MRESULT EXPENTRY FontDlgProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
  3193.    {
  3194.    static   SHORT    sSelect;
  3195.    static   SHORT    sCHeight;
  3196.    static   SHORT    sCWidth;
  3197.  
  3198.    switch (msg) {
  3199.  
  3200.       case WM_INITDLG:
  3201.  
  3202.      WinSetWindowUShort(hwnd, QWS_ID, IDW_PICKFONT);
  3203.      if (hwndHelp != NULL)
  3204.        WinAssociateHelpInstance( hwndHelp, hwnd);
  3205.  
  3206.      CenterDlgBox (hwnd, hwndClient);
  3207.  
  3208.      sCHeight = Default.sCellHeight;
  3209.      sCWidth = Default.sCellWidth;
  3210.  
  3211.      FillCellSizeBox (hwnd, IDD_FONTS);
  3212.  
  3213.      WinSendDlgItemMsg (hwnd, IDD_FONTS, LM_SELECTITEM,
  3214.            MPFROM2SHORT (GetCellSize (sCHeight,sCWidth), 0),
  3215.            MPFROM2SHORT (TRUE,0));
  3216.      return 0;
  3217.  
  3218.       case WM_CONTROL:
  3219.  
  3220.      switch (SHORT1FROMMP (mp1)) {
  3221.  
  3222.         case IDD_FONTS:
  3223.            switch (SHORT2FROMMP (mp1)) {
  3224.  
  3225.           case LN_SELECT:
  3226.              sSelect = (USHORT) SHORT1FROMMR (
  3227.                     WinSendDlgItemMsg (hwnd,
  3228.                                IDD_FONTS,
  3229.                                LM_QUERYSELECTION,
  3230.                                0L, 0L) );
  3231.  
  3232.              sCHeight = sCellSize [sSelect][1];
  3233.              sCWidth = sCellSize [sSelect][0];
  3234.              return 0;
  3235.  
  3236.           case LN_ENTER:
  3237.              Default.sCellHeight = sCHeight;
  3238.              Default.sCellWidth = sCWidth;
  3239.              WinDismissDlg (hwnd, TRUE);
  3240.              return 0;
  3241.  
  3242.            }
  3243.            break;
  3244.      }
  3245.      break;
  3246.  
  3247.       case WM_COMMAND:
  3248.  
  3249.      switch (COMMANDMSG(&msg)->cmd) {
  3250.  
  3251.           case DID_OK:
  3252.              Default.sCellHeight = sCHeight;
  3253.              Default.sCellWidth = sCWidth;
  3254.              WinDismissDlg (hwnd, TRUE);
  3255.              return 0;
  3256.  
  3257.           case DID_CANCEL:
  3258.              WinDismissDlg (hwnd, FALSE);
  3259.              return 0;
  3260.      }
  3261.    }
  3262.    return WinDefDlgProc (hwnd, msg, mp1, mp2);
  3263. }
  3264.