UTILITIES DOUGLAS BOLING PMVIEW.C //======================================================================= // PMVIEW.C -- A file browse program for the OS/2 Presentation Manager. // // Copyright (c) 1990 Ziff Communications // // Written by Douglas Boling //======================================================================= #define INCL_WIN #define INCL_VIO #define INCL_AVIO #define AVIOROWS 98 #define AVIOCOLS 255 #define PATHLENGTH 255 #define BUFFERSIZE 16384 #include #include #include #include #include "pmview.h" MRESULT EXPENTRY ClientWndProc (HWND, USHORT, MPARAM, MPARAM); MRESULT EXPENTRY AboutDlgProc (HWND, USHORT, MPARAM, MPARAM); MRESULT EXPENTRY FileDlgProc (HWND, USHORT, MPARAM, MPARAM); MRESULT EXPENTRY ConfigDlgProc (HWND, USHORT, MPARAM, MPARAM); MRESULT EXPENTRY GotoDlgProc (HWND, USHORT, MPARAM, MPARAM); MRESULT EXPENTRY SearchDlgProc (HWND, USHORT, MPARAM, MPARAM); MRESULT EXPENTRY FontDlgProc (HWND, USHORT, MPARAM, MPARAM); BOOL OpenFile (PCHAR); PCHAR GetFileDataPtr (LONG lFilePtr, BOOL fForward, USHORT *usLimit, BOOL *fEndOfFile); LONG MoveViewPtr (LONG lFilePtr, SHORT *ptrRow, BOOL fDispASCII); SHORT ComputeLines (LONG lOldPtr, LONG lNewPtr, BOOL fDispASCII); VOID btoa (CHAR cNum, CHAR szOut[], BOOL fBlank); VOID Myltoa (LONG lNum, CHAR szOut[]); SHORT DisplayLine (HVPS hvps, SHORT sRow, LONG lLinePtr, BOOL fDispASCII); BOOL SearchFile (LONG *lFilePtr); VOID ScrollVis (HWND hwndFrame, HWND hwndHScroll, HWND hwndVScroll, HWND hwndMenu); VOID SetASCII (HWND hwndMenu, LONG *lViewPtr); VOID SetFontSize (HWND hwndMenu, HVPS hvps, SHORT *psCharWidth, SHORT *psCharHeight); VOID FillDriveListBox (HWND hwnd, CHAR *pcCurrentPath); VOID FillDirListBox (HWND hwnd, CHAR *pcCurPath, BOOL fIncHidden); VOID FillFileListBox (HWND hwnd, CHAR *pcSearchParam, BOOL fIncHidden); VOID FillColorBox (HWND hwnd, SHORT iListID); VOID FillCellSizeBox (HWND hwnd, SHORT iListID); SHORT GetCellSize (SHORT sHeight, SHORT sWidth); struct VideoStruct { USHORT uslength; USHORT usAdapterType; USHORT usDisplayType; } VideoData = { 6, 0, 0}; struct ParamStruct { CHAR szAttribute[2]; SHORT sxWinPos; SHORT syWinPos; SHORT sWinHeight; SHORT sWinWidth; SHORT sCellHeight; SHORT sCellWidth; SHORT sTabStop; BOOL fDispASCII; BOOL fScrollBars; BOOL fIncHiddenFiles; } Default = {{0x20,0xf0}, -1, 0, 0, 0, 17, 8, 8, TRUE, TRUE, FALSE}; struct FileStruct { CHAR szName [PATHLENGTH]; HFILE hHandle; LONG lSize; BOOL fValid; } File = {"", 0, 0L, FALSE}; FILESTATUS FileInfo; struct MemBuff { USHORT usBSel; USHORT usBOff; USHORT usDSize; LONG lFilePtr; SHORT sUseCnt; BOOL fValid; } Buff[4]; SHORT sCellSize [10][2] = {{8, 8}, {8, 12}, {8, 14}, {7, 15}, {7, 25}, {8, 17}, {12, 16}, {12, 20}, {12, 22}, {12, 30}}; HAB hab; CHAR szNewFile[PATHLENGTH]; LONG lNewViewPtr; CHAR szSearchStr[80]; BOOL fCheckCase = FALSE; BOOL fTopSearch = FALSE; LONG lLastFound = -1; BOOL fSaveWinPos; BOOL fSaveToDisk = FALSE; BOOL fMinimized; CHAR szAppName[] = "PMVIEW by Douglas Boling"; CHAR szKeyName[] = "Profile type 1"; //======================================================================= // Main Proceedure. Create message queue, parse the command line, // allocate memory buffers, create the window, and process the // message queue. //======================================================================= int main (int argc, char *argv[]) { static CHAR szClientClass [] = "PMVIEW"; static ULONG flFrameFlags = FCF_TITLEBAR | FCF_SYSMENU | FCF_SIZEBORDER | FCF_MINMAX | FCF_TASKLIST | FCF_ICON | FCF_MENU | FCF_ACCELTABLE | FCF_VERTSCROLL | FCF_HORZSCROLL | FCF_SHELLPOSITION; static SHORT fsWinPosFlags = SWP_SHOW; static USHORT usSelector; static HWND hwndFrame; HMQ hmq; HWND hwndClient; QMSG qmsg; SHORT i; hab = WinInitialize (0); hmq = WinCreateMsgQueue (hab, 0); for (i = 1; i < argc && i < 4; i++) if (strcmp(argv[i],"\\i") == 0 || strcmp (argv[i],"-i") == 0) { fMinimized = TRUE; fsWinPosFlags |= SWP_MINIMIZE; } else if (strlen (szNewFile) == 0) DosQPathInfo (argv[i], 5, szNewFile, sizeof szNewFile, 0L); DosAllocSeg( (USHORT) 0, &usSelector, 0 ); for (i = 0; i < 4; i++) { Buff[i].usBSel = usSelector; Buff[i].usBOff = i * BUFFERSIZE; Buff[i].fValid = FALSE; } i = sizeof Default; WinQueryProfileData (hab, szAppName, szKeyName, &Default, &i); WinRegisterClass ( hab, // Anchor block handle szClientClass, // Name of class being registered ClientWndProc, // Window procedure for class CS_SIZEREDRAW, // Class style 0); // Extra bytes to reserve hwndFrame = WinCreateStdWindow ( HWND_DESKTOP, // Parent window handle NULL, // Style of frame window &flFrameFlags, // Pointer to control data szClientClass, // Client window class name NULL, // Title bar text 0L, // Style of client window NULL, // Module handle for resources ID_RESOURCE, // ID of resources for window &hwndClient); // Pointer to client window handle if (Default.sxWinPos != -1) fsWinPosFlags |= SWP_MOVE | SWP_SIZE; WinSetWindowPos (hwndFrame, HWND_TOP, Default.sxWinPos, Default.syWinPos, Default.sWinWidth, Default.sWinHeight, fsWinPosFlags); while (WinGetMsg (hab, &qmsg, NULL, 0, 0)) WinDispatchMsg (hab, &qmsg); if (File.hHandle) DosClose (File.hHandle); DosFreeSeg (usSelector); WinDestroyWindow (hwndFrame); WinDestroyMsgQueue (hmq); WinTerminate (hab); return 0; } //------------------------------------------------------------------ // Open file. Open the file, query file information, reset memory // buffer structure. //------------------------------------------------------------------ BOOL OpenFile (PCHAR szNewFileName) { SHORT i; HFILE hNewHandle; USHORT usAction; BOOL fGoodRead = FALSE; if (DosOpen ( szNewFileName, // File name &hNewHandle, // File handle &usAction, // Action taken 0L, // File size 0, // File attribute 1, // Open type (Fail if no file.) 0x20, // Open mode (Read, deny write) 0L)) // Reserved. WinAlarm (HWND_DESKTOP, WA_NOTE); else { if (File.hHandle) DosClose (File.hHandle); strcpy (File.szName, szNewFileName); File.hHandle = hNewHandle; DosQFileInfo (File.hHandle, 1, (PBYTE) &FileInfo, sizeof FileInfo); File.lSize = FileInfo.cbFile; fGoodRead = TRUE; // // Reset the memory buffer to purge the old file data. // for (i = 0; i < 4; i++) { Buff[i].lFilePtr = -1; Buff[i].sUseCnt = 1; } } return fGoodRead; } //------------------------------------------------------------------ // GetFileDataPtr - Return a pointer to file data pointed to by // the file pointer. //------------------------------------------------------------------ PCHAR GetFileDataPtr (LONG lFilePtr, BOOL fForward, USHORT *usLimit, BOOL *fEndOfFile) { PCHAR pcDataPtr; ULONG ulTemp; SHORT i, sLast = -1; SHORT sOldCnt, sNewCnt; // // Check limits of file. // *fEndOfFile = FALSE; if (lFilePtr >= File.lSize) { lFilePtr = File.lSize; *fEndOfFile = fForward; } else if (lFilePtr <= 0L) { lFilePtr = 0L; *fEndOfFile = !fForward; } // // See if requested part of the file is in one of the buffers. // sOldCnt = sNewCnt = Buff[0].sUseCnt; for (i = 0; i < 4; i++) { sNewCnt = (sNewCnt < Buff[i].sUseCnt) ? Buff[i].sUseCnt : sNewCnt; sOldCnt = (sOldCnt > Buff[i].sUseCnt) ? Buff[i].sUseCnt : sOldCnt; if (Buff[i].lFilePtr != -1) if (lFilePtr >= Buff[i].lFilePtr && lFilePtr < Buff[i].lFilePtr + BUFFERSIZE) sLast = i; } // // If requested part not found, determine the oldest buffer to replace, // then read part of the file into that buffer. // if (sLast == -1) { sOldCnt = Buff[0].sUseCnt; for (i = 0; i < 4; i++) if (sOldCnt >= Buff[i].sUseCnt) { sOldCnt = Buff[i].sUseCnt; sLast = i; } Buff[sLast].fValid = TRUE; Buff[sLast].lFilePtr = (lFilePtr / BUFFERSIZE) * BUFFERSIZE; DosChgFilePtr (File.hHandle, Buff[sLast].lFilePtr, 0, &ulTemp); DosRead (File.hHandle, MAKEP (Buff[sLast].usBSel, Buff[sLast].usBOff), BUFFERSIZE, &Buff[sLast].usDSize); } // // Reset LRU count to prevent overflow // if (sNewCnt > 0x7ff0) { sNewCnt -= sOldCnt; for (i = 0; i < 4; i++) Buff[i].sUseCnt = Buff[i].sUseCnt - sOldCnt; } Buff[sLast].sUseCnt = ++sNewCnt; // // Create Pointer, set limits to buffer. // pcDataPtr = MAKEP (Buff[sLast].usBSel, Buff[sLast].usBOff + (USHORT) (lFilePtr - Buff[sLast].lFilePtr)); if (fForward) *usLimit = Buff[sLast].usBOff + Buff[sLast].usDSize - 1; else *usLimit = Buff[sLast].usBOff; return pcDataPtr; } //------------------------------------------------------------------ // MoveViewPtr - Update view pointer by scrolling the number of // lines specified in ptrRow. If limited by the top or bottom // of the file, modify ptrRow to indicate the actual number of // rows. //------------------------------------------------------------------ LONG MoveViewPtr (LONG lFilePtr, SHORT *ptrRow, BOOL fDispASCII) { SHORT i, j, sRow, sRowCount = 0, sOffset = 0; USHORT usLimit; PCHAR pcDataPtr; BOOL fEndOfFile; pcDataPtr = GetFileDataPtr (lFilePtr, *ptrRow > 0, &usLimit, &fEndOfFile); sRow = *ptrRow; if (fDispASCII) if (sRow > 0) { for (i=0; i < sRow && !fEndOfFile; i++, sOffset++){ for (j=0; j < AVIOCOLS && *pcDataPtr != 0x0d && !fEndOfFile; j++, sOffset++) if ((OFFSETOF(pcDataPtr) < usLimit)) pcDataPtr++; else { lFilePtr = ((lFilePtr + BUFFERSIZE)/ BUFFERSIZE) * BUFFERSIZE; pcDataPtr = GetFileDataPtr (lFilePtr, TRUE, &usLimit, &fEndOfFile); } if ((OFFSETOF(pcDataPtr) < usLimit)) pcDataPtr++; else { lFilePtr = ((lFilePtr + BUFFERSIZE)/ BUFFERSIZE) * BUFFERSIZE; pcDataPtr = GetFileDataPtr (lFilePtr, TRUE, &usLimit, &fEndOfFile); } if (!fEndOfFile) sRowCount++; } *ptrRow = sRowCount; } else { sRow = -sRow; for (i=0; i < sRow && !fEndOfFile; i++){ if ((OFFSETOF(pcDataPtr) > usLimit)) pcDataPtr--; else { lFilePtr = (lFilePtr / BUFFERSIZE) * BUFFERSIZE - 1; pcDataPtr = GetFileDataPtr (lFilePtr, FALSE, &usLimit, &fEndOfFile); } if (!fEndOfFile) { sRowCount--; sOffset--; } for (j=0; j < AVIOCOLS && !fEndOfFile; j++) { if ((OFFSETOF(pcDataPtr) > usLimit)) { if (*(pcDataPtr-1) == 0x0d) break; pcDataPtr--; } else { lFilePtr = (lFilePtr / BUFFERSIZE) * BUFFERSIZE - 1; pcDataPtr = GetFileDataPtr (lFilePtr, FALSE, &usLimit, &fEndOfFile); } if (!fEndOfFile) sOffset--; } } *ptrRow = sRowCount; } else { // // Align on paragraph // if (lFilePtr % 16 != 0) sOffset -= (SHORT)(lFilePtr % 16); sOffset += sRow * 16; *ptrRow = sRow; // //Limit Checking // if ((lFilePtr == 0 && sRow < 0) ||(lFilePtr == File.lSize && sRow > 0)){ sOffset = 0; *ptrRow = 0; } else if ((lFilePtr + sOffset) < 0) { sOffset = (SHORT) -lFilePtr; *ptrRow = sOffset / 16; } else if ((lFilePtr + sOffset) > File.lSize) { sOffset = (SHORT) (File.lSize - lFilePtr); *ptrRow = sOffset / 16; } } return (LONG) sOffset; } //------------------------------------------------------------------ // ComputeLines - Compute number of lines between two points in // the file. //------------------------------------------------------------------ SHORT ComputeLines (LONG lOldPtr, LONG lNewPtr, BOOL fDispASCII) { USHORT usLimit; SHORT sCount = 0; PCHAR pcDataPtr; BOOL fEndOfFile = FALSE; pcDataPtr = GetFileDataPtr (lOldPtr, lOldPtr < lNewPtr, &usLimit, &fEndOfFile); if (fDispASCII) if (lOldPtr < lNewPtr) while (lOldPtr < lNewPtr && !fEndOfFile){ if (*pcDataPtr == 0x0d) sCount++; lOldPtr++; if ((OFFSETOF(pcDataPtr) < usLimit)) pcDataPtr++; else pcDataPtr = GetFileDataPtr (lOldPtr, TRUE, &usLimit, &fEndOfFile); } else while (lOldPtr > lNewPtr && !fEndOfFile) { if (*pcDataPtr == 0x0d) sCount--; lOldPtr--; if ((OFFSETOF(pcDataPtr) > usLimit)) pcDataPtr--; else pcDataPtr = GetFileDataPtr (lOldPtr, FALSE, &usLimit, &fEndOfFile); } else sCount = (SHORT) ((lNewPtr - lOldPtr) / 16); return sCount; } //------------------------------------------------------------------ // btoa Convert byte to ASCII //------------------------------------------------------------------ VOID btoa (CHAR cNum, CHAR szOut[], BOOL fBlank) { SHORT i; for (i = 2; i > 0; i--) if (fBlank) szOut[i] = ' '; else { szOut[i] = (cNum % 16) + 0x30; if (szOut[i] > 0x39) szOut[i] += (BYTE) 7; cNum /= 16; } szOut[0] = ' '; return; } //------------------------------------------------------------------ // Myltoa Convert a long to ASCII with leading zeros //------------------------------------------------------------------ VOID Myltoa (LONG lNum, CHAR szOut[]) { SHORT i; for (i = 7; i >= 0; i--) { szOut[i + (i+1)/5] = (BYTE) (lNum % 16) + 0x30; if (szOut[i + (i+1)/5] > 0x39) szOut[i + (i+1)/5] += (BYTE) 7; lNum /= 16; } szOut[4] = ' '; return; } //------------------------------------------------------------------ // Display Line //------------------------------------------------------------------ SHORT DisplayLine (HVPS hvps, SHORT sRow, LONG lLinePtr, BOOL fDispASCII) { CHAR cHexChar, szTempBuff [256]; SHORT i, sStart, sBytesPrinted = 0; USHORT usLimit; BOOL fEndOfFile; PCHAR pcDataPtr; if (fDispASCII) { // // Print as ASCII until CR or for 255 characters. // pcDataPtr = GetFileDataPtr (lLinePtr, TRUE, &usLimit, &fEndOfFile); for (i = 0; i <= AVIOCOLS && !fEndOfFile; i++){ if (*pcDataPtr == 0x0a) { if ((OFFSETOF(pcDataPtr) < usLimit)) pcDataPtr++; else { lLinePtr = ((lLinePtr + BUFFERSIZE)/ BUFFERSIZE) * BUFFERSIZE; pcDataPtr = GetFileDataPtr (lLinePtr, TRUE, &usLimit, &fEndOfFile); } szTempBuff[i] = *pcDataPtr; sBytesPrinted++; } else szTempBuff[i] = *pcDataPtr; if ((OFFSETOF(pcDataPtr) < usLimit)) pcDataPtr++; else { lLinePtr = ((lLinePtr + BUFFERSIZE)/ BUFFERSIZE) * BUFFERSIZE; pcDataPtr = GetFileDataPtr (lLinePtr, TRUE, &usLimit, &fEndOfFile); } sBytesPrinted++; // // Expand Tab Characters // if (szTempBuff[i] == 0x09) { for (;i % Default.sTabStop != 0 && i <= AVIOCOLS; i++) szTempBuff[i] = ' '; szTempBuff[i] = ' '; } // // If CR, end of line. if (szTempBuff[i] == 0x0d) { break; } } } else { // // Convert from Hex and print. // pcDataPtr = GetFileDataPtr (lLinePtr, TRUE, &usLimit, &fEndOfFile); sStart = (SHORT) lLinePtr % 16; sBytesPrinted = 0; for (i = 0; i < 10; i++) szTempBuff[i] = ' '; if (!fEndOfFile) Myltoa (lLinePtr, szTempBuff); for (i = 0; i < 16; i++){ cHexChar = *pcDataPtr; btoa (cHexChar, szTempBuff + 10 + (i*3) + (i/8), i < sStart || fEndOfFile); szTempBuff[i+60+(i/8)] = (i < sStart || fEndOfFile) ? (CHAR) 0x20 : cHexChar; if ((OFFSETOF(pcDataPtr) < usLimit)) pcDataPtr++; else { lLinePtr = ((lLinePtr + BUFFERSIZE)/ BUFFERSIZE) * BUFFERSIZE; pcDataPtr = GetFileDataPtr (lLinePtr, TRUE, &usLimit, &fEndOfFile); } } szTempBuff[34] = ' '; szTempBuff[59] = ' '; szTempBuff[68] = ' '; sBytesPrinted = i - sStart; i += 59 + (i/8); } VioWrtCharStr (szTempBuff, i, sRow, 0, hvps); return sBytesPrinted; } //------------------------------------------------------------------ // SearchFile - Search the file for the value in szSearchStr. // If found, the file pointer is modified to the location in the // file. //------------------------------------------------------------------ BOOL SearchFile (LONG *lFilePtr) { USHORT usLimit; PCHAR pcDataPtr; BOOL fEndOfFile = FALSE, fFound = FALSE; CHAR szCmpBuffer[165]; SHORT sBufferLength, sBufferCnt, sSearchLen, i; LONG lLocalPtr, lMarker; sSearchLen = strlen (szSearchStr); lLocalPtr = (fTopSearch) ? 0L : *lFilePtr; pcDataPtr = GetFileDataPtr (lLocalPtr, TRUE, &usLimit, &fEndOfFile); while (!fEndOfFile && !fFound) { sBufferLength = (BUFFERSIZE - (SHORT)(lLocalPtr % BUFFERSIZE)) - sSearchLen; if (sBufferLength <= 0) { for (i = 0; i < BUFFERSIZE - (SHORT)(lLocalPtr % BUFFERSIZE); i++) *(szCmpBuffer + i) = *(pcDataPtr + i); sBufferCnt = i; lMarker = lLocalPtr; lLocalPtr = ((lLocalPtr + BUFFERSIZE) / BUFFERSIZE) * BUFFERSIZE; pcDataPtr = GetFileDataPtr (lLocalPtr, TRUE, &usLimit, &fEndOfFile); if (fEndOfFile) break; for (i = 0; i < min (sSearchLen + 1, BUFFERSIZE - (usLimit % BUFFERSIZE)); i++) *(szCmpBuffer + sBufferCnt + i) = *(pcDataPtr + i); for (i = 0; i < sBufferCnt; i++) if (fCheckCase) { if (strncmp (szCmpBuffer + i, szSearchStr, sSearchLen) == 0) { fFound = TRUE; break; } } else { if (strnicmp (szCmpBuffer + i, szSearchStr, sSearchLen) == 0) { fFound = TRUE; break; } } sBufferLength = (BUFFERSIZE - (usLimit%BUFFERSIZE)) - sSearchLen; } if (fFound) { lLocalPtr = lMarker + i; break; } for (i = 0; i < sBufferLength; i++) { if (fCheckCase) { if (strncmp (pcDataPtr + i, szSearchStr, sSearchLen) == 0) { fFound = TRUE; break; } } else { if (strnicmp (pcDataPtr + i, szSearchStr, sSearchLen) == 0) { fFound = TRUE; break; } } } lLocalPtr += i; } if (fFound) *lFilePtr = lLocalPtr; return fFound; } //------------------------------------------------------------------ // ScrollVis - Set Scroll Visibility //------------------------------------------------------------------ VOID ScrollVis (HWND hwndFrame, HWND hwndHScroll, HWND hwndVScroll, HWND hwndMenu) { if (Default.fScrollBars) { WinSendMsg (hwndMenu, MM_SETITEMATTR, MPFROM2SHORT (IDM_DISPSCROLLBARS, TRUE), MPFROM2SHORT (MIA_CHECKED, MIA_CHECKED)); WinSetParent (hwndVScroll, hwndFrame, FALSE ); WinSetParent (hwndHScroll, hwndFrame, FALSE ); } else { WinSendMsg (hwndMenu, MM_SETITEMATTR, MPFROM2SHORT (IDM_DISPSCROLLBARS, TRUE), MPFROM2SHORT (MIA_CHECKED, 0)); WinSetParent (hwndVScroll, HWND_OBJECT, FALSE ); WinSetParent (hwndHScroll, HWND_OBJECT, FALSE ); } WinSendMsg ( hwndFrame , WM_UPDATEFRAME , (MPARAM) (FCF_TITLEBAR | FCF_SYSMENU | FCF_MINMAX | FCF_MENU), NULL); return; } //------------------------------------------------------------------ // Set ASCII - Set ASCII Menu Check marks. //------------------------------------------------------------------ VOID SetASCII (HWND hwndMenu, LONG *lViewPtr) { SHORT sRow = -1; if (Default.fDispASCII) { if (MIA_CHECKED && WinSendMsg (hwndMenu, MM_QUERYITEMATTR, MPFROM2SHORT (IDM_DISPLAYHEX, TRUE), MPFROM2SHORT (MIA_CHECKED, 0))) { *lViewPtr += 2; *lViewPtr += MoveViewPtr (*lViewPtr, &sRow, TRUE); } WinSendMsg (hwndMenu, MM_SETITEMATTR, MPFROM2SHORT (IDM_DISPLAYHEX, TRUE), MPFROM2SHORT (MIA_CHECKED, 0)); WinSendMsg (hwndMenu, MM_SETITEMATTR, MPFROM2SHORT (IDM_DISPLAYASCII, TRUE), MPFROM2SHORT (MIA_CHECKED, MIA_CHECKED)); } else { WinSendMsg (hwndMenu, MM_SETITEMATTR, MPFROM2SHORT (IDM_DISPLAYASCII, TRUE), MPFROM2SHORT (MIA_CHECKED, 0)); WinSendMsg (hwndMenu, MM_SETITEMATTR, MPFROM2SHORT (IDM_DISPLAYHEX, TRUE), MPFROM2SHORT (MIA_CHECKED, MIA_CHECKED)); } return; } //------------------------------------------------------------------ // SetFontSize - Change font size and update menu if necessary. //------------------------------------------------------------------ VOID SetFontSize (HWND hwndMenu, HVPS hvps, SHORT *psCharWidth, SHORT *psCharHeight) { static CHAR szSmallPrompt[] = "~Small Font\tCtrl+S"; static CHAR szLargePrompt[] = "~Large Font\tCtrl+S"; VioSetDeviceCellSize (Default.sCellHeight, Default.sCellWidth, hvps); VioGetDeviceCellSize (psCharHeight, psCharWidth, hvps); switch (VideoData.usAdapterType) { case 0: case 1: //CGA, no other cell sizes. WinSendMsg (hwndMenu, MM_SETITEMATTR, MPFROM2SHORT (IDM_FONTSIZE, 0), MPFROM2SHORT (MIA_DISABLED, MIA_CHECKED)); break; case 2: //EGA case 3: //VGA if (Default.sCellHeight == 8 && Default.sCellWidth == 8) WinSendMsg (hwndMenu, MM_SETITEMTEXT, MPFROM2SHORT (IDM_FONTSIZE, 0), MPFROMP (szLargePrompt)); else WinSendMsg (hwndMenu, MM_SETITEMTEXT, MPFROM2SHORT (IDM_FONTSIZE, 0), MPFROMP (szSmallPrompt)); break; case 7: //8514 break; } return; } //======================================================================= // // Client Window Procedure // //======================================================================= MRESULT EXPENTRY ClientWndProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2) { static HWND hwndFrame, hwndMenu, hwndVScroll, hwndHScroll; static HVPS hvps; static HPS hps; static LONG lViewPtr; static BOOL fGoMinimize; static SHORT sHScroll, sVScrScale, sHPage = 20, sVPage = 20; static SHORT sCharHeight, sCharWidth, sxWinSize, syWinSize; static SHORT sRowsVisible = AVIOROWS; HDC hdc; SIZEL sizl; SHORT sRow, sDeltaRows; LONG lTemp; SWP swpWinPos; PSWP pswpWinPos; CHAR szTempBuffer[PATHLENGTH]; switch (msg) { //-------------------------------------------------------------- // When the window is created, get and store the handles to // the scroll bars and menu, read the default parameters if // saved before, set the proper attributes for the menu // selections, and create a AVIO presentation space. //-------------------------------------------------------------- case WM_CREATE: // // If no file specified and not starting as an icon, Query // user for a file name. // if (!File.fValid) { if (strlen (szNewFile) == 0) { if (!fMinimized) if (WinDlgBox(HWND_DESKTOP, hwnd, FileDlgProc, NULL, IDD_OPEN, NULL)) if (!(File.fValid = OpenFile (szNewFile))) WinMessageBox (HWND_DESKTOP, hwnd, "Unable to open the file", File.szName, NULL, MB_OK | MB_ERROR); } else if (!(File.fValid = OpenFile (szNewFile))) WinMessageBox (HWND_DESKTOP, hwnd, "Unable to open the file", File.szName, NULL, MB_OK | MB_ERROR); if (File.fValid) { if (sHScroll) { sHScroll = 0; VioSetOrg (0, sHScroll, hvps); } lViewPtr = 0; sVScrScale = (SHORT) ((File.lSize / 32768) + 1); } } fMinimized = FALSE; // // Query the Frame for the necessary window handles. // hwndFrame = WinQueryWindow (hwnd, QW_PARENT,FALSE); hwndMenu = WinWindowFromID (hwndFrame, FID_MENU); hwndVScroll = WinWindowFromID (hwndFrame, FID_VERTSCROLL); hwndHScroll = WinWindowFromID ( hwndFrame, FID_HORZSCROLL); // // Set menu attributes. // sVScrScale = (SHORT) ((File.lSize / 32768) + 1); ScrollVis (hwndFrame, hwndHScroll, hwndVScroll, hwndMenu); SetASCII(hwndMenu, &lViewPtr); // // Establish AVIO presentation space. // hdc = WinOpenWindowDC (hwnd); sizl.cx = sizl.cy = 0; hps = GpiCreatePS (hab, hdc, &sizl, PU_PELS | GPIF_DEFAULT | GPIT_MICRO | GPIA_ASSOC); VioCreatePS (&hvps, AVIOROWS, AVIOCOLS, 0, 1, NULL); VioAssociate (hdc, hvps); VioGetConfig (0, (PVOID) &VideoData, hvps); SetFontSize (hwndMenu, hvps, &sCharWidth, &sCharHeight); VioScrollUp (0, 0, -1, -1, -1, Default.szAttribute, hvps); if (strlen (File.szName) != 0) WinSetWindowText (hwndFrame, File.szName); return 0; //-------------------------------------------------------------- // Intercept the close message to abort a file open dialog box // when the program is closed from an icon. //-------------------------------------------------------------- case WM_CLOSE: fMinimized = FALSE; break; //-------------------------------------------------------------- // If the Window is being restored from an icon without a vaild // file, prompt the user for a file using the file open dialog // box. //-------------------------------------------------------------- case WM_MINMAXFRAME: if (fMinimized) if (!File.fValid) { if (WinDlgBox(HWND_DESKTOP, hwnd, FileDlgProc, NULL, IDD_OPEN, NULL)) { if (!(File.fValid = OpenFile (szNewFile))) WinMessageBox (HWND_DESKTOP, hwnd, "Unable to open the file", File.szName, NULL, MB_OK | MB_ERROR); else { if (sHScroll) { sHScroll = 0; VioSetOrg (0, sHScroll, hvps); } lViewPtr = 0; sVScrScale = (SHORT) ((File.lSize / 32768) + 1); WinSetWindowText (hwndFrame, File.szName); } } else fGoMinimize = TRUE; } // // Record the current state of the program. // pswpWinPos = PVOIDFROMMP (mp1); if (pswpWinPos->fs & SWP_MINIMIZE) fMinimized = TRUE; else fMinimized = FALSE; break; //-------------------------------------------------------------- // When the GoMimize flag is set send the frame a minimize // message. //-------------------------------------------------------------- case WM_WINDOWPOSCHANGED: if (fGoMinimize) { fGoMinimize = FALSE; WinSetWindowPos (hwndFrame, HWND_BOTTOM, 0, 0, 0, 0, SWP_MINIMIZE); } break; //-------------------------------------------------------------- // When the window is resized, record the new window size, // update the horizontal position of the AVIO space and // scroll bar, and notify the frame to modify its windows. //-------------------------------------------------------------- case WM_SIZE: sxWinSize = SHORT1FROMMP(mp2); syWinSize = SHORT2FROMMP(mp2); if (sHScroll > AVIOCOLS - sxWinSize / sCharWidth) { sHScroll = min (max (0, sHScroll), AVIOCOLS - sxWinSize / sCharWidth); VioSetOrg (0, sHScroll, hvps); WinInvalidateRect (hwnd, NULL, FALSE); } sHPage = max (sxWinSize / sCharWidth - 1, 0); sVPage = max (syWinSize / sCharHeight - 1, 0); sRowsVisible = min (syWinSize / sCharHeight + 1, AVIOROWS); WinSendMsg ( hwndFrame, WM_UPDATEFRAME, (MPARAM) (FCF_TITLEBAR | FCF_SYSMENU | FCF_MINMAX | FCF_MENU), NULL); WinSendMsg (hwndHScroll, SBM_SETSCROLLBAR, MPFROM2SHORT (sHScroll, 0), MPFROM2SHORT (0, AVIOCOLS - sxWinSize / sCharWidth)); WinSendMsg (hwndHScroll, SBM_SETTHUMBSIZE, MPFROM2SHORT (sxWinSize / sCharWidth, AVIOCOLS - sxWinSize / sCharWidth), NULL); WinSendMsg (hwndVScroll, SBM_SETSCROLLBAR, MPFROM2SHORT ((SHORT)(lViewPtr/sVScrScale), 0), MPFROM2SHORT (0, File.lSize/sVScrScale)); WinSendMsg (hwndVScroll, SBM_SETTHUMBSIZE, MPFROM2SHORT( (syWinSize/sCharHeight) * 30, File.lSize/sVScrScale),NULL); return WinDefAVioWindowProc (hwnd, msg, mp1, mp2); //-------------------------------------------------------------- // Repaint the complete AVIO space by first clearing the window // then writing to the AVIO space. //-------------------------------------------------------------- case WM_PAINT: WinBeginPaint (hwnd, hps, NULL); VioScrollUp (0, 0, -1, -1, -1, Default.szAttribute, hvps); lTemp = lViewPtr; for (sRow = 0; sRow < sRowsVisible; sRow++) lTemp += (LONG) DisplayLine (hvps, sRow, lTemp, Default.fDispASCII); WinEndPaint (hps); WinSendMsg (hwndVScroll, SBM_SETPOS, MPFROM2SHORT ((SHORT)(lViewPtr/sVScrScale), 0), NULL); return 0; //-------------------------------------------------------------- // Process each menu selection according to function. //-------------------------------------------------------------- case WM_COMMAND: switch (COMMANDMSG(&msg)->cmd) { case IDM_OPEN: if (WinDlgBox(HWND_DESKTOP, hwnd, FileDlgProc, NULL, IDD_OPEN, NULL)) { if (File.fValid = OpenFile (szNewFile)) { if (sHScroll) { sHScroll = 0; VioSetOrg (0, sHScroll, hvps); } lViewPtr = 0; sVScrScale = (SHORT) ((File.lSize / 32768) + 1); WinSendMsg (hwndVScroll, SBM_SETSCROLLBAR, MPFROM2SHORT (0, 0), MPFROM2SHORT (0, File.lSize/sVScrScale)); WinSendMsg (hwndVScroll, SBM_SETTHUMBSIZE, MPFROM2SHORT( (syWinSize/sCharHeight) * 30, File.lSize/sVScrScale),NULL); WinSetWindowText (hwndFrame, File.szName); WinInvalidateRect (hwnd, NULL, FALSE); } else WinMessageBox (HWND_DESKTOP, hwnd, "Unable to open the file", File.szName, NULL, MB_OK | MB_ERROR); } return 0; case IDM_FIND: if (WinDlgBox(HWND_DESKTOP, hwnd, SearchDlgProc, NULL, IDD_SEARCH, NULL)) if (strlen (szSearchStr) != 0) WinPostMsg (hwnd, WM_COMMAND, MPFROM2SHORT (IDM_REPFIND,0), mp2); return 0; case IDM_REPFIND: if (strlen (szSearchStr) == 0) { WinPostMsg (hwnd, WM_COMMAND, MPFROM2SHORT (IDM_FIND,0), mp2); return 0; } else { // // Check to see if we are on the same line as the last // found string. If so, start search at 1 byte past // last found string. // sDeltaRows = 1; lTemp = MoveViewPtr (lViewPtr, &sDeltaRows, Default.fDispASCII); lTemp += lViewPtr; if (lTemp > lLastFound && lLastFound > lViewPtr) lLastFound++; else lLastFound = lViewPtr; // // If string found, back up the the start fo the // current line. // WinQueryWindowText (hwndFrame, PATHLENGTH, szTempBuffer); WinSetWindowText (hwndFrame, "Searching"); if (SearchFile (&lLastFound)) { lViewPtr = lLastFound; sDeltaRows = -1; lViewPtr += MoveViewPtr (lViewPtr, &sDeltaRows, Default.fDispASCII); WinInvalidateRect (hwnd, NULL, FALSE); WinSetWindowText (hwndFrame, szTempBuffer); } else { WinSetWindowText (hwndFrame, szTempBuffer); WinMessageBox (HWND_DESKTOP, hwnd, szSearchStr, "Unable to find the string", NULL, MB_OK | MB_ICONHAND); } } return 0; case IDM_GOTO: if (WinDlgBox(HWND_DESKTOP, hwnd, GotoDlgProc, NULL, IDD_GOTO, NULL)) { lViewPtr = min (max (lNewViewPtr, 0L), File.lSize); WinInvalidateRect (hwnd, NULL, FALSE); } return 0; case IDM_CONFIGURE: if (WinDlgBox(HWND_DESKTOP, hwnd, ConfigDlgProc, NULL, IDD_CONFIGURE, NULL)) { if (fSaveToDisk) { if (fSaveWinPos) { WinQueryWindowPos (hwndFrame, &swpWinPos); Default.sxWinPos = swpWinPos.x; Default.syWinPos = swpWinPos.y; Default.sWinWidth = swpWinPos.cx; Default.sWinHeight = swpWinPos.cy; } WinWriteProfileData (hab, szAppName, szKeyName, &Default, sizeof Default); } SetASCII(hwndMenu, &lViewPtr); ScrollVis (hwndFrame, hwndHScroll, hwndVScroll, hwndMenu); SetFontSize (hwndMenu, hvps, &sCharWidth, &sCharHeight); sHPage = max (sxWinSize / sCharWidth - 1, 0); sVPage = max (syWinSize / sCharHeight - 1, 0); sRowsVisible = min (syWinSize / sCharHeight + 1, AVIOROWS); WinInvalidateRect (hwnd, NULL, FALSE); } return 0; case IDM_DISPLAYASCII: if (!Default.fDispASCII) { Default.fDispASCII = TRUE; SetASCII (hwndMenu, &lViewPtr); WinInvalidateRect (hwnd, NULL, FALSE); } return 0; case IDM_DISPLAYHEX: if (Default.fDispASCII) { Default.fDispASCII = FALSE; SetASCII (hwndMenu, &lViewPtr); WinInvalidateRect (hwnd, NULL, FALSE); } return 0; case IDM_DISPSCROLLBARS: if (Default.fScrollBars) Default.fScrollBars = FALSE; else Default.fScrollBars = TRUE; ScrollVis (hwndFrame, hwndHScroll, hwndVScroll, hwndMenu); return 0; case IDM_FONTSIZE: switch (VideoData.usAdapterType) { case 2: //EGA if (Default.sCellHeight == 8 && Default.sCellWidth == 8){ Default.sCellHeight = sCellSize[1][1]; Default.sCellWidth = sCellSize[1][0]; } else { Default.sCellHeight = sCellSize[0][1]; Default.sCellWidth = sCellSize[0][0]; } break; case 3: //VGA if (Default.sCellHeight == 8 && Default.sCellWidth == 8){ Default.sCellHeight = sCellSize[2][1]; Default.sCellWidth = sCellSize[2][0]; } else { Default.sCellHeight = sCellSize[0][1]; Default.sCellWidth = sCellSize[0][0]; } break; case 7: //8514 if (!WinDlgBox(HWND_DESKTOP, hwnd, FontDlgProc, NULL, IDD_PICKFONT, NULL)) return 0; break; } SetFontSize (hwndMenu, hvps, &sCharWidth, &sCharHeight); sHPage = max (sxWinSize / sCharWidth - 1, 0); sVPage = max (syWinSize / sCharHeight - 1, 0); sRowsVisible = min (syWinSize / sCharHeight + 1, AVIOROWS); WinInvalidateRect (hwnd, NULL, FALSE); return 0; case IDM_ABOUT: WinDlgBox(HWND_DESKTOP, hwnd, AboutDlgProc, NULL, IDD_ABOUT, NULL); return 0; case IDM_EXIT: WinSendMsg(hwnd, WM_CLOSE, 0L, 0L); return 0; } //-------------------------------------------------------------- // Convert cursor keys to scroll bar messages. //-------------------------------------------------------------- case WM_CHAR: switch (CHARMSG (&msg) -> vkey) { case VK_UP: case VK_DOWN: case VK_PAGEUP: case VK_PAGEDOWN: return WinSendMsg (hwndVScroll, msg, mp1, mp2); case VK_LEFT: case VK_RIGHT: return WinSendMsg (hwndHScroll, msg, mp1, mp2); case VK_HOME: if (lViewPtr != 0) { lViewPtr = 0; WinInvalidateRect (hwnd, NULL, FALSE); } break; case VK_END: if (lViewPtr != File.lSize - 1) { lViewPtr = File.lSize - 1; WinInvalidateRect (hwnd, NULL, FALSE); } break; } return WinDefWindowProc (hwnd, msg, mp1, mp2); //----------------------------------------------------------- // Process Horizonal Scroll Bar Messages by scrolling across // the AVIO space. //----------------------------------------------------------- case WM_HSCROLL: switch (SHORT2FROMMP (mp2)) { case SB_LINELEFT: sHScroll -= 1; break; case SB_PAGELEFT: sHScroll -= sHPage; break; case SB_LINERIGHT: sHScroll += 1; break; case SB_PAGERIGHT: sHScroll += sHPage; break; case SB_SLIDERTRACK: sHScroll = SHORT1FROMMP (mp2); break; } sHScroll = min (max (0, sHScroll), AVIOCOLS - sxWinSize / sCharWidth); if (sHScroll != SHORT1FROMMR (WinSendMsg (hwndHScroll, SBM_QUERYPOS, NULL, NULL))) { VioSetOrg (0, sHScroll, hvps); WinSendMsg (hwndHScroll, SBM_SETPOS, MPFROM2SHORT (sHScroll, 0), NULL); } return 0; //----------------------------------------------------------- // Process Vertical Scroll Bar Messages by scrolling the AVIO // space and writing the new lines. //----------------------------------------------------------- case WM_VSCROLL: switch (SHORT2FROMMP (mp2)) { case SB_LINEUP: sDeltaRows = -1; break; case SB_PAGEUP: sDeltaRows = -sVPage; break; case SB_LINEDOWN: sDeltaRows = 1; break; case SB_PAGEDOWN: sDeltaRows = sVPage; break; case SB_SLIDERTRACK: lTemp = lViewPtr; lViewPtr = (LONG) (SHORT1FROMMP(mp2) * sVScrScale); sDeltaRows = ComputeLines (lTemp, lViewPtr, Default.fDispASCII); sDeltaRows = (sDeltaRows > sRowsVisible) ? sRowsVisible : sDeltaRows; sDeltaRows = (sDeltaRows < -sRowsVisible) ? -sRowsVisible : sDeltaRows; break; default: return 0; } if (SHORT2FROMMP (mp2) != SB_SLIDERTRACK) lViewPtr += MoveViewPtr (lViewPtr, &sDeltaRows, Default.fDispASCII); WinSendMsg (hwndVScroll, SBM_SETPOS, MPFROM2SHORT ((SHORT)(lViewPtr/sVScrScale), 0), NULL); if (sDeltaRows > 0) { VioScrollUp (0, 0, sRowsVisible, AVIOCOLS, sDeltaRows, Default.szAttribute, hvps); sRow = sRowsVisible-sDeltaRows; lTemp = lViewPtr; lTemp += MoveViewPtr (lTemp, &sRow, Default.fDispASCII); for (sRow = 0; sRow <= sDeltaRows; sRow++) lTemp += DisplayLine (hvps, (sRowsVisible-sDeltaRows) + sRow, lTemp, Default.fDispASCII); } if (sDeltaRows < 0) { sDeltaRows = -sDeltaRows; VioScrollDn (0, 0, sRowsVisible, AVIOCOLS, sDeltaRows, Default.szAttribute, hvps); lTemp = lViewPtr; for (sRow = 0; sRow <= sDeltaRows; sRow++) lTemp += DisplayLine (hvps, sRow, lTemp, Default.fDispASCII); } return 0; //----------------------------------------------------------- // Destroy the AVIO space nad the presentation space. //----------------------------------------------------------- case WM_DESTROY: VioAssociate (NULL, hvps); VioDestroyPS (hvps); GpiDestroyPS (hps); return 0; } return WinDefWindowProc (hwnd, msg, mp1, mp2); } //===================================================================== // Dialog Procedures //===================================================================== //------------------------------------------------------------------ // About Dialog Box //------------------------------------------------------------------ MRESULT EXPENTRY AboutDlgProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2) { switch (msg) { case WM_COMMAND: switch (COMMANDMSG(&msg)->cmd) { case DID_OK: case DID_CANCEL: WinDismissDlg (hwnd, TRUE); return 0; } } return WinDefDlgProc (hwnd, msg, mp1, mp2); } //------------------------------------------------------------------ // Goto Dialog Box //------------------------------------------------------------------ MRESULT EXPENTRY GotoDlgProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2) { CHAR szBuffer[12]; switch (msg) { case WM_INITDLG: WinSendDlgItemMsg (hwnd, IDD_NEWOFFSET, EM_CLEAR, NULL, NULL); WinSendDlgItemMsg ( hwnd, IDD_NEWOFFSET, EM_SETTEXTLIMIT, MPFROM2SHORT (11, 0), NULL); return 0; case WM_COMMAND: switch (COMMANDMSG(&msg)->cmd) { case DID_OK: if (WinQueryDlgItemText (hwnd, IDD_NEWOFFSET, sizeof szBuffer, szBuffer)) { lNewViewPtr = atol (szBuffer); WinDismissDlg (hwnd, TRUE); return 0; } case DID_CANCEL: WinDismissDlg (hwnd, FALSE); return 0; } } return WinDefDlgProc (hwnd, msg, mp1, mp2); } //===================================================================== // Search Dialog Procedures //===================================================================== //------------------------------------------------------------------ // Search Dialog Box //------------------------------------------------------------------ MRESULT EXPENTRY SearchDlgProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2) { switch (msg) { case WM_INITDLG: WinSetDlgItemText ( hwnd, IDD_SRCHSTR, szSearchStr); WinSendDlgItemMsg (hwnd, IDD_CHKCASE, BM_SETCHECK, MPFROM2SHORT (fCheckCase, 0), NULL); WinSendDlgItemMsg (hwnd, IDD_TOPSEARCH, BM_SETCHECK, MPFROM2SHORT (fTopSearch, 0), NULL); return 0; case WM_CONTROL: switch (SHORT1FROMMP (mp1)) { case IDD_CHKCASE: switch (SHORT2FROMMP (mp1)) { case BN_CLICKED: if (fCheckCase) fCheckCase = FALSE; else fCheckCase = TRUE; return 0; } break; case IDD_TOPSEARCH: switch (SHORT2FROMMP (mp1)) { case BN_CLICKED: if (fTopSearch) fTopSearch = FALSE; else fTopSearch = TRUE; return 0; } break; } break; case WM_COMMAND: switch (COMMANDMSG(&msg)->cmd) { case DID_OK: WinQueryDlgItemText (hwnd, IDD_SRCHSTR, sizeof szSearchStr, szSearchStr); if (strlen (szSearchStr)) { WinDismissDlg (hwnd, TRUE); return 0; } case DID_CANCEL: WinDismissDlg (hwnd, FALSE); return 0; } } return WinDefDlgProc (hwnd, msg, mp1, mp2); } //=================================================================== // Procedures for File open dialog box //=================================================================== VOID FillDriveListBox (HWND hwnd, CHAR *pcCurrentPath) { static CHAR szDrive [] = " :"; SHORT sDrive; ULONG ulDriveMap; USHORT usDriveNum; DosQCurDisk (&usDriveNum, &ulDriveMap); pcCurrentPath[0] = (CHAR) usDriveNum + '@'; pcCurrentPath[1] = ':'; pcCurrentPath[2] = '\\'; WinSendDlgItemMsg (hwnd, IDD_DRIVELIST, LM_DELETEALL, NULL, NULL); for (sDrive = 0; sDrive < 26 ; sDrive++ ) if (ulDriveMap & 1L << sDrive) { szDrive [1] = (CHAR) sDrive + 'A'; WinSendDlgItemMsg (hwnd, IDD_DRIVELIST, LM_INSERTITEM, MPFROM2SHORT (LIT_END, 0), MPFROMP (szDrive)); } WinSendDlgItemMsg (hwnd, IDD_DRIVELIST, LM_SELECTITEM, MPFROM2SHORT (usDriveNum - 1, 0), MPFROM2SHORT (TRUE, 0)); } //------------------------------------------------------------------ // Fill Directory List Box Procedure //------------------------------------------------------------------ VOID FillDirListBox (HWND hwnd, CHAR *pcCurPath, BOOL fIncHidden) { static CHAR szRootStr[] = "\\"; FILEFINDBUF findbuf; HDIR hDir = 1; USHORT usCurPathLen = PATHLENGTH, usSearchCount = 1; USHORT usAttr; if (fIncHidden) usAttr = 0x0017; else usAttr = 0x0015; WinSendDlgItemMsg (hwnd, IDD_DIRLIST, LM_DELETEALL, NULL, NULL); DosQCurDir (0, pcCurPath + 3 , &usCurPathLen); DosFindFirst ("*.*", &hDir, usAttr, &findbuf, sizeof findbuf, &usSearchCount, 0L); while (usSearchCount) { if (findbuf.attrFile & 0x0010 && (findbuf.achName [0] != '.' || findbuf.achName [1] )) if (pcCurPath [strlen(pcCurPath)-1] != '\\' || findbuf.achName[1] != '.' || findbuf.achName [2]) WinSendDlgItemMsg (hwnd, IDD_DIRLIST, LM_INSERTITEM, MPFROM2SHORT (LIT_SORTASCENDING, 0), MPFROMP (findbuf.achName)); DosFindNext (hDir, &findbuf, sizeof findbuf, &usSearchCount); } if (pcCurPath [strlen(pcCurPath)-1] != '\\') WinSendDlgItemMsg (hwnd, IDD_DIRLIST, LM_INSERTITEM, MPFROM2SHORT (0, 0), MPFROMP (szRootStr)); } //------------------------------------------------------------------ // Fill File List Box Procedure //------------------------------------------------------------------ VOID FillFileListBox (HWND hwnd, CHAR *pcSearchParam, BOOL fIncHidden) { FILEFINDBUF findbuf; HDIR hDir = 1; USHORT usSearchCount = 1; USHORT usAttr; if (fIncHidden) usAttr = 0x0007; else usAttr = 0x0005; WinSendDlgItemMsg (hwnd, IDD_FILELIST, LM_DELETEALL, NULL, NULL); DosFindFirst (pcSearchParam, &hDir, usAttr, &findbuf, sizeof findbuf, &usSearchCount, 0L); while (usSearchCount) { WinSendDlgItemMsg (hwnd, IDD_FILELIST, LM_INSERTITEM, MPFROM2SHORT (LIT_SORTASCENDING, 0), MPFROMP (findbuf.achName)); DosFindNext (hDir, &findbuf, sizeof findbuf, &usSearchCount); } } //------------------------------------------------------------------ // File Open Dialog Box Procedure //------------------------------------------------------------------ MRESULT EXPENTRY FileDlgProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2) { static CHAR szCurrentPath [PATHLENGTH], szFileName[PATHLENGTH] = "*.*"; static BOOL fIncHidden; CHAR szBuffer [PATHLENGTH]; USHORT usCurPathLen = PATHLENGTH - 3; SHORT sSelect; FILEFINDBUF findbuf; HDIR hDir = 1; USHORT usSearchCount = 1, usAttr, i; switch (msg) { case WM_INITDLG: fIncHidden = Default.fIncHiddenFiles; strcpy (szFileName, "*.*"); FillDriveListBox (hwnd, szCurrentPath); FillDirListBox (hwnd, szCurrentPath, fIncHidden); FillFileListBox (hwnd, szFileName, fIncHidden); WinSendDlgItemMsg (hwnd, IDD_INCHIDDEN, BM_SETCHECK, MPFROM2SHORT (fIncHidden, 0), NULL); DosQCurDir (0, szCurrentPath + 3, &usCurPathLen); WinSendDlgItemMsg ( hwnd, IDD_FILEEDIT, EM_SETTEXTLIMIT, MPFROM2SHORT (PATHLENGTH, 0), NULL); WinSetDlgItemText ( hwnd, IDD_FILEEDIT, szCurrentPath); return 0; case WM_CONTROL: if (SHORT1FROMMP (mp1) == IDD_DRIVELIST || SHORT1FROMMP (mp1) == IDD_DIRLIST || SHORT1FROMMP (mp1) == IDD_FILELIST) { sSelect = (USHORT) WinSendDlgItemMsg (hwnd, SHORT1FROMMP (mp1), LM_QUERYSELECTION, 0L, 0L); WinSendDlgItemMsg (hwnd, SHORT1FROMMP (mp1), LM_QUERYITEMTEXT, MPFROM2SHORT (sSelect, sizeof szBuffer), MPFROMP (szBuffer)); } switch (SHORT1FROMMP (mp1)) { case IDD_DRIVELIST: switch (SHORT2FROMMP (mp1)) { case LN_ENTER: szCurrentPath[0] = szBuffer[1]; DosSelectDisk (szBuffer [1] - '@'); FillDirListBox (hwnd, szCurrentPath, fIncHidden); if (strcmp(szFileName, "*.*") != 0) { if (szCurrentPath [strlen (szCurrentPath)-1] != '\\') strcat (szCurrentPath, "\\"); strcat (szCurrentPath, szFileName); } WinSetDlgItemText ( hwnd, IDD_FILEEDIT, szCurrentPath); FillFileListBox (hwnd, szFileName, fIncHidden); return 0; } break; case IDD_DIRLIST: switch (SHORT2FROMMP (mp1)) { case LN_ENTER: DosChDir (szBuffer, 0L); FillDirListBox (hwnd, szCurrentPath, fIncHidden); if (strcmp(szFileName, "*.*") != 0) { if (szCurrentPath [strlen (szCurrentPath)-1] != '\\') strcat (szCurrentPath, "\\"); strcat (szCurrentPath, szFileName); } WinSetDlgItemText ( hwnd, IDD_FILEEDIT, szCurrentPath); FillFileListBox (hwnd, szFileName, fIncHidden); return 0; } break; case IDD_FILELIST: switch (SHORT2FROMMP (mp1)) { case LN_SELECT: DosQCurDir (0, szCurrentPath + 3, &usCurPathLen); if (szCurrentPath [strlen(szCurrentPath)-1] != '\\') strcat (szCurrentPath, "\\"); strcat (szCurrentPath, szBuffer); WinSetDlgItemText ( hwnd, IDD_FILEEDIT, szCurrentPath); return 0; case LN_ENTER: WinQueryDlgItemText (hwnd, IDD_FILEEDIT, sizeof szCurrentPath, szCurrentPath); if (DosQPathInfo (szCurrentPath, 5, szBuffer, sizeof szBuffer, 0L)) { WinMessageBox ( HWND_DESKTOP, hwnd, szBuffer, "Unrecognised path", 1, MB_OK | MB_ERROR); return 0; } else { strcpy (szNewFile, szBuffer); Default.fIncHiddenFiles = fIncHidden; WinDismissDlg (hwnd, TRUE); return 0; } } break; case IDD_INCHIDDEN: switch (SHORT2FROMMP (mp1)) { case BN_CLICKED: if (fIncHidden) fIncHidden = FALSE; else fIncHidden = TRUE; FillFileListBox (hwnd, szFileName, fIncHidden); FillDirListBox (hwnd, szCurrentPath, fIncHidden); return 0; } break; } break; case WM_COMMAND: switch (COMMANDMSG(&msg)->cmd) { case DID_OK: WinQueryDlgItemText (hwnd, IDD_FILEEDIT, sizeof szCurrentPath, szCurrentPath); if (DosQPathInfo (szCurrentPath, 5, szBuffer, sizeof szBuffer, 0L)) { WinMessageBox ( HWND_DESKTOP, hwnd, szBuffer, "Unrecognised path", 1, MB_OK | MB_ERROR); return 0; } else if (strchr (szBuffer, '*') == 0 && strchr (szBuffer, '?') == 0) { if (fIncHidden) usAttr = 0x0007; else usAttr = 0x0005; usSearchCount = 1; DosFindFirst (szBuffer, &hDir, usAttr, &findbuf, sizeof findbuf, &usSearchCount, 0L); if (usSearchCount == 0) { WinMessageBox (HWND_DESKTOP, hwnd, szBuffer, "File not Found", 1, MB_OK | MB_ERROR); return 0; } else { strcpy (szNewFile, szBuffer); Default.fIncHiddenFiles = fIncHidden; WinDismissDlg (hwnd, TRUE); return 0; } } else { for (i = strlen(szBuffer); i >= 0; i--) if (szBuffer[i] == '\\') break; strcpy (szFileName, szBuffer + i + 1); FillFileListBox (hwnd, szFileName, fIncHidden); return 0; } break; case DID_CANCEL: WinDismissDlg (hwnd, FALSE); return 0; } break; } return WinDefDlgProc (hwnd, msg, mp1, mp2); } //=================================================================== // Procedures for Configure dialog box //=================================================================== VOID FillColorBox (HWND hwnd, SHORT iListID) { static CHAR szColors [16][12] = { "Black", "Dk. Blue", "Dk. Green", "Dk. Cyan", "Dk. Red", "Dk. Magenta", "Brown", "Gray", "Dk. Gray", "Blue", "Green", "Cyan", "Red", "Magenta", "Yellow", "White"}; SHORT i; WinSendDlgItemMsg (hwnd, iListID, LM_DELETEALL, NULL, NULL); for (i = 0; i < 16 ; i++ ) WinSendDlgItemMsg (hwnd, iListID, LM_INSERTITEM, MPFROM2SHORT (LIT_END, 0), MPFROMP (szColors[i])); return; } //------------------------------------------------------------------ // Fill Character cell size box //------------------------------------------------------------------ VOID FillCellSizeBox (HWND hwnd, SHORT iListID) { static CHAR szCellSizes [10][8] = {"8 x 8", "8 x 12", "8 x 14", "7 x 15", "7 x 25", "8 x 17", "12 x 16", "12 x 20", "12 x 22", "12 x 30"}; SHORT i, sStart, sEnd; WinSendDlgItemMsg (hwnd, iListID, LM_DELETEALL, NULL, NULL); WinSendDlgItemMsg (hwnd, iListID, LM_INSERTITEM, MPFROM2SHORT (LIT_END, 0), MPFROMP (szCellSizes[0])); switch (VideoData.usAdapterType) { case 0: case 1: //CGA, no other cell sizes. sStart = 2; sEnd = 1; break; case 2: //EGA sStart = 1; sEnd = 1; break; case 3: //VGA sStart = 2; sEnd = 2; break; case 7: //8514 sStart = 3; sEnd = 9; break; } for (i = sStart; i <= sEnd; i++ ) WinSendDlgItemMsg (hwnd, iListID, LM_INSERTITEM, MPFROM2SHORT (LIT_END, 0), MPFROMP (szCellSizes[i])); return; } //------------------------------------------------------------------ // GetFontSize - Determine font size. //------------------------------------------------------------------ SHORT GetCellSize (SHORT sHeight, SHORT sWidth) { SHORT i, sIndex = 1, sStart = 1; if (sHeight == sCellSize[0][1] && sWidth == sCellSize[0][0]) return 0; if (VideoData.usAdapterType == 3) sStart = 2; else if (VideoData.usAdapterType == 7) sStart = 3; for (i = sStart; i < 10; i++, sIndex++ ) if (sHeight == sCellSize[i][1] && sWidth == sCellSize[i][0]) break; return sIndex; } //------------------------------------------------------------------ // Configure Dialog Box //------------------------------------------------------------------ MRESULT EXPENTRY ConfigDlgProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2) { static SHORT sSelect; static CHAR szAttribute[2]; static SHORT sCHeight; static SHORT sCWidth; static SHORT sTabStop; static BOOL fDispASCII; static BOOL fScrollBars; static BOOL fLocalSaveWinPos; switch (msg) { case WM_INITDLG: szAttribute[1] = Default.szAttribute[1]; sCHeight = Default.sCellHeight; sCWidth = Default.sCellWidth; sTabStop = Default.sTabStop; fDispASCII = Default.fDispASCII; fScrollBars = Default.fScrollBars; fLocalSaveWinPos = FALSE; FillColorBox (hwnd, IDD_FCOLOR); FillColorBox (hwnd, IDD_BCOLOR); FillCellSizeBox (hwnd, IDD_CELLSIZE); WinSendDlgItemMsg (hwnd, IDD_BCOLOR, LM_SELECTITEM, MPFROM2SHORT (((szAttribute[1]>>4) & 0x0f), 0), MPFROM2SHORT (TRUE,0)); WinSendDlgItemMsg (hwnd, IDD_FCOLOR, LM_SELECTITEM, MPFROM2SHORT ((szAttribute[1] & 0x0f), 0), MPFROM2SHORT (TRUE,0)); WinSendDlgItemMsg (hwnd, IDD_CELLSIZE, LM_SELECTITEM, MPFROM2SHORT (GetCellSize (sCHeight,sCWidth), 0), MPFROM2SHORT (TRUE,0)); WinSendDlgItemMsg (hwnd, IDD_DEFASCII, BM_SETCHECK, MPFROM2SHORT (fDispASCII, 0), NULL); WinSendDlgItemMsg (hwnd, IDD_DEFHEX, BM_SETCHECK, MPFROM2SHORT (!fDispASCII, 0), NULL); WinSendDlgItemMsg (hwnd, IDD_DEFSCROLL, BM_SETCHECK, MPFROM2SHORT (fScrollBars, 0), NULL); WinSendDlgItemMsg (hwnd, IDD_SAVEWINPOS, BM_SETCHECK, MPFROM2SHORT (fLocalSaveWinPos, 0), NULL); WinSendDlgItemMsg (hwnd, IDD_SAVE, BM_SETCHECK, MPFROM2SHORT (fSaveToDisk, 0), NULL); WinSetDlgItemShort ( hwnd, IDD_DEFTABS, sTabStop, FALSE); return 0; case WM_CONTROL: if (SHORT1FROMMP (mp1) == IDD_BCOLOR || SHORT1FROMMP (mp1) == IDD_FCOLOR || SHORT1FROMMP (mp1) == IDD_CELLSIZE) { sSelect = (USHORT) WinSendDlgItemMsg (hwnd, SHORT1FROMMP (mp1), LM_QUERYSELECTION, 0L, 0L); } switch (SHORT1FROMMP (mp1)) { case IDD_BCOLOR: switch (SHORT2FROMMP (mp1)) { case LN_SELECT: szAttribute[1] = (szAttribute[1] & 0x0f) | ((sSelect << 4) & 0xf0); return 0; } break; case IDD_FCOLOR: switch (SHORT2FROMMP (mp1)) { case LN_SELECT: szAttribute[1] = (szAttribute[1] & 0xf0) | (sSelect & 0x0f); return 0; } break; case IDD_CELLSIZE: switch (SHORT2FROMMP (mp1)) { case LN_SELECT: if (sSelect != 0) switch (VideoData.usAdapterType) { case 3: //VGA sSelect++; break; case 7: //8514 sSelect += 2; break; } sCHeight = sCellSize [sSelect][1]; sCWidth = sCellSize [sSelect][0]; return 0; } break; case IDD_DEFASCII: switch (SHORT2FROMMP (mp1)) { case BN_CLICKED: fDispASCII = TRUE; return 0; } break; case IDD_DEFHEX: switch (SHORT2FROMMP (mp1)) { case BN_CLICKED: fDispASCII = FALSE; return 0; } break; case IDD_DEFSCROLL: switch (SHORT2FROMMP (mp1)) { case BN_CLICKED: if (fScrollBars) fScrollBars = FALSE; else fScrollBars = TRUE; return 0; } break; case IDD_SAVEWINPOS: switch (SHORT2FROMMP (mp1)) { case BN_CLICKED: if (fLocalSaveWinPos) fLocalSaveWinPos = FALSE; else fLocalSaveWinPos = TRUE; return 0; } break; case IDD_SAVE: switch (SHORT2FROMMP (mp1)) { case BN_CLICKED: if (fSaveToDisk) fSaveToDisk = FALSE; else fSaveToDisk = TRUE; return 0; } break; } break; case WM_COMMAND: switch (COMMANDMSG(&msg)->cmd) { case DID_OK: Default.szAttribute[1] = szAttribute[1]; Default.sCellHeight = sCHeight; Default.sCellWidth = sCWidth; Default.fDispASCII = fDispASCII; Default.fScrollBars = fScrollBars; WinQueryDlgItemShort (hwnd, IDD_DEFTABS, &sSelect, FALSE); sSelect = min (max (1, sSelect), AVIOCOLS - 1); Default.sTabStop = sSelect; fSaveWinPos = fLocalSaveWinPos; WinDismissDlg (hwnd, TRUE); return 1; case DID_CANCEL: WinDismissDlg (hwnd, FALSE); return 0; } } return WinDefDlgProc (hwnd, msg, mp1, mp2); } //------------------------------------------------------------------ // Font Size Dialog Box //------------------------------------------------------------------ MRESULT EXPENTRY FontDlgProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2) { static SHORT sSelect; static SHORT sCHeight; static SHORT sCWidth; switch (msg) { case WM_INITDLG: sCHeight = Default.sCellHeight; sCWidth = Default.sCellWidth; FillCellSizeBox (hwnd, IDD_FONTS); WinSendDlgItemMsg (hwnd, IDD_FONTS, LM_SELECTITEM, MPFROM2SHORT (GetCellSize (sCHeight,sCWidth), 0), MPFROM2SHORT (TRUE,0)); return 0; case WM_CONTROL: switch (SHORT1FROMMP (mp1)) { case IDD_FONTS: switch (SHORT2FROMMP (mp1)) { case LN_SELECT: sSelect = (USHORT) WinSendDlgItemMsg (hwnd, IDD_FONTS, LM_QUERYSELECTION, 0L, 0L); if (sSelect != 0) switch (VideoData.usAdapterType) { case 3: //VGA sSelect++; break; case 7: //8514 sSelect += 2; break; } sCHeight = sCellSize [sSelect][1]; sCWidth = sCellSize [sSelect][0]; return 0; case LN_ENTER: Default.sCellHeight = sCHeight; Default.sCellWidth = sCWidth; WinDismissDlg (hwnd, TRUE); return 0; } break; } break; case WM_COMMAND: switch (COMMANDMSG(&msg)->cmd) { case DID_OK: Default.sCellHeight = sCHeight; Default.sCellWidth = sCWidth; WinDismissDlg (hwnd, TRUE); return 0; case DID_CANCEL: WinDismissDlg (hwnd, FALSE); return 0; } } return WinDefDlgProc (hwnd, msg, mp1, mp2); }