|
|
1.1 ! root 1: /*************************************************************************** ! 2: * * ! 3: * MODULE : MpFile.c * ! 4: * * ! 5: * PURPOSE : Contains the code for File I/O for Multipad. * ! 6: * * ! 7: * FUNCTIONS : AlreadyOpen - Determines if a file is already open. * ! 8: * * ! 9: * AddFile - Creates a new MDI window and, if specified,* ! 10: * loads a file into it. * ! 11: * * ! 12: * LoadFile - Loads a file into a MDI window. * ! 13: * * ! 14: * MyReadFile - Calls File/Open dialog and appropriately * ! 15: * responds to the user's input. * ! 16: * * ! 17: * SaveFile - Saves the contents of a MDI window's edit * ! 18: * control to a file. * ! 19: * * ! 20: * SetSaveFrom - Formats the "Save 'file' to" string. * ! 21: * * ! 22: * SaveAsDlgProc - Dialog function for the File/SaveAs dialog.* ! 23: * * ! 24: * ChangeFile - Calls File/SaveAs dialog. * ! 25: * * ! 26: ***************************************************************************/ ! 27: #include "multipad.h" ! 28: #include <fcntl.h> ! 29: #include <SYS\types.h> ! 30: #include <SYS\stat.h> ! 31: #include <io.h> ! 32: #include <string.h> ! 33: ! 34: VOID APIENTRY GetFileName(PSTR); ! 35: //INT APIENTRY DialogBoxParam(HANDLE,LPSTR,HWND,FARPROC,LONG); ! 36: //LPSTR WINAPI AnsiUpper(LPSTR); ! 37: ! 38: OFSTRUCT of; ! 39: /**************************************************************************** ! 40: * * ! 41: * FUNCTION : AlreadyOpen(szFile) * ! 42: * * ! 43: * PURPOSE : Checks to see if the file described by the string pointed * ! 44: * to by 'szFile' is already open. * ! 45: * * ! 46: * RETURNS : a handle to the described file's window if that file is * ! 47: * already open; NULL otherwise. * ! 48: * * ! 49: ****************************************************************************/ ! 50: ! 51: HWND APIENTRY AlreadyOpen(CHAR *szFile) ! 52: { ! 53: BOOL fFound; ! 54: HWND hwndCheck; ! 55: CHAR szChild[MAX_PATH+1]; ! 56: LPSTR lpChild, lpFile, lp; ! 57: ! 58: /* Open the file with the OF_PARSE flag to obtain the fully qualified ! 59: * pathname in the OFSTRUCT structure. ! 60: */ ! 61: if (HFILE_ERROR == OpenFile((LPSTR)szFile, (LPOFSTRUCT)&of, OF_PARSE)) ! 62: return NULL; ! 63: ! 64: lpFile= CharUpper(of.szPathName); ! 65: ! 66: /* Check each MDI child window in Multipad */ ! 67: for ( hwndCheck = GetWindow(hwndMDIClient, GW_CHILD); ! 68: hwndCheck; ! 69: hwndCheck = GetWindow(hwndCheck, GW_HWNDNEXT) ) { ! 70: /* Initialization for comparison */ ! 71: lpChild = szChild; ! 72: ! 73: /* Skip icon title windows */ ! 74: if (GetWindow(hwndCheck, GW_OWNER)) ! 75: continue; ! 76: ! 77: /* Get current child window's name */ ! 78: GetWindowText(hwndCheck, lpChild, MAX_PATH+1); ! 79: ! 80: CharUpper(lpChild); ! 81: ! 82: for (fFound= TRUE, lp= lpFile; (*lpChild) || (*lp); ++lpChild, ++lp) ! 83: if (*lpChild != *lp) ! 84: { ! 85: fFound= FALSE; ! 86: break; ! 87: } ! 88: ! 89: if (fFound) return(hwndCheck); ! 90: } ! 91: /* No match found -- file is not open -- return NULL handle */ ! 92: return(NULL); ! 93: } ! 94: ! 95: /**************************************************************************** ! 96: * * ! 97: * FUNCTION : AddFile (lpName) * ! 98: * * ! 99: * PURPOSE : Creates a new MDI window. If the lpName parameter is not * ! 100: * NULL, it loads a file into the window. * ! 101: * * ! 102: * RETURNS : HWND - A handle to the new window. * ! 103: * * ! 104: ****************************************************************************/ ! 105: ! 106: HWND APIENTRY AddFile(CHAR * pName) ! 107: { ! 108: HWND hwnd; ! 109: ! 110: CHAR sz[160]; ! 111: MDICREATESTRUCT mcs; ! 112: ! 113: if (!pName) { ! 114: /* The pName parameter is NULL -- load the "Untitled" string from */ ! 115: /* STRINGTABLE and set the title field of the MDI CreateStruct. */ ! 116: LoadString (hInst, IDS_UNTITLED, sz, sizeof(sz)); ! 117: mcs.szTitle = (LPSTR)sz; ! 118: } ! 119: else ! 120: /* Title the window with the fully qualified pathname obtained by ! 121: * calling OpenFile() with the OF_PARSE flag (in function ! 122: * AlreadyOpen(), which is called before AddFile(). ! 123: */ ! 124: mcs.szTitle = of.szPathName; ! 125: ! 126: mcs.szClass = szChild; ! 127: mcs.hOwner = hInst; ! 128: ! 129: /* Use the default size for the window */ ! 130: mcs.x = mcs.cx = CW_USEDEFAULT; ! 131: mcs.y = mcs.cy = CW_USEDEFAULT; ! 132: ! 133: /* Set the style DWORD of the window to default */ ! 134: mcs.style = styleDefault; ! 135: ! 136: /* tell the MDI Client to create the child */ ! 137: hwnd = (HWND)SendMessage (hwndMDIClient, ! 138: WM_MDICREATE, ! 139: 0, ! 140: (LONG)(LPMDICREATESTRUCT)&mcs); ! 141: ! 142: /* Did we get a file? Read it into the window */ ! 143: if (pName){ ! 144: if (!LoadFile(hwnd, pName)){ ! 145: /* File couldn't be loaded -- close window */ ! 146: SendMessage(hwndMDIClient, WM_MDIDESTROY, (DWORD) hwnd, 0L); ! 147: } ! 148: } ! 149: ! 150: return hwnd; ! 151: } ! 152: ! 153: /**************************************************************************** ! 154: * * ! 155: * FUNCTION : LoadFile (lpName) * ! 156: * * ! 157: * PURPOSE : Given the handle to a MDI window and a filename, reads the * ! 158: * file into the window's edit control child. * ! 159: * * ! 160: * RETURNS : TRUE - If file is sucessfully loaded. * ! 161: * FALSE - Otherwise. * ! 162: * * ! 163: ****************************************************************************/ ! 164: ! 165: INT APIENTRY LoadFile ( ! 166: HWND hwnd, ! 167: CHAR * pName) ! 168: { ! 169: LONG wLength; ! 170: HANDLE hT; ! 171: LPSTR lpB; ! 172: HWND hwndEdit; ! 173: HFILE fh; ! 174: OFSTRUCT of; ! 175: hwndEdit = (HWND)GetWindowLong (hwnd, GWL_HWNDEDIT); ! 176: ! 177: /* The file has a title, so reset the UNTITLED flag. */ ! 178: SetWindowWord(hwnd, GWW_UNTITLED, FALSE); ! 179: ! 180: fh = OpenFile(pName, &of, OF_READ); /* JAP was 0, which is OF_READ)*/ ! 181: ! 182: /* Make sure file has been opened correctly */ ! 183: if ( fh < 0 ) ! 184: goto error; ! 185: ! 186: /* Find the length of the file */ ! 187: wLength = (DWORD)_llseek(fh, 0L, 2); ! 188: _llseek(fh, 0L, 0); ! 189: ! 190: /* Attempt to reallocate the edit control's buffer to the file size */ ! 191: hT = (HANDLE)SendMessage (hwndEdit, EM_GETHANDLE, 0, 0L); ! 192: if (LocalReAlloc(hT, wLength+1, LHND) == NULL) { ! 193: /* Couldn't reallocate to new size -- error */ ! 194: _lclose(fh); ! 195: goto error; ! 196: } ! 197: ! 198: /* read the file into the buffer */ ! 199: if (wLength != (LONG)_lread(fh, (lpB = (LPSTR)LocalLock (hT)), (UINT)wLength)) ! 200: MPError (hwnd, MB_OK|MB_ICONHAND, IDS_CANTREAD, (LPSTR)pName); ! 201: ! 202: /* Zero terminate the edit buffer */ ! 203: lpB[wLength] = 0; ! 204: LocalUnlock (hT); ! 205: ! 206: SendMessage (hwndEdit, EM_SETHANDLE, (UINT)hT, 0L); ! 207: _lclose(fh); ! 208: ! 209: return TRUE; ! 210: ! 211: error: ! 212: /* Report the error and quit */ ! 213: MPError(hwnd, MB_OK | MB_ICONHAND, IDS_CANTOPEN, (LPSTR)pName); ! 214: return FALSE; ! 215: } ! 216: ! 217: /**************************************************************************** ! 218: * * ! 219: * FUNCTION : MyReadFile(hwnd) * ! 220: * * ! 221: * PURPOSE : Called in response to a File/Open menu selection. It asks * ! 222: * the user for a file name and responds appropriately. * ! 223: * * ! 224: ****************************************************************************/ ! 225: ! 226: VOID APIENTRY MyReadFile(HWND hwnd) ! 227: { ! 228: CHAR szFile[128]; ! 229: HWND hwndFile; ! 230: ! 231: GetFileName (szFile); ! 232: ! 233: /* If the result is not the empty string -- take appropriate action */ ! 234: if (*szFile) { ! 235: /* Is file already open?? */ ! 236: if (hwndFile = AlreadyOpen(szFile)) { ! 237: /* Yes -- bring the file's window to the top */ ! 238: BringWindowToTop(hwndFile); ! 239: } ! 240: else { ! 241: /* No -- make a new window and load file into it */ ! 242: AddFile(szFile); ! 243: } ! 244: } ! 245: UNREFERENCED_PARAMETER(hwnd); ! 246: } ! 247: ! 248: /**************************************************************************** ! 249: * * ! 250: * FUNCTION : SaveFile (hwnd) * ! 251: * * ! 252: * PURPOSE : Saves contents of current edit control to disk. * ! 253: * * ! 254: ****************************************************************************/ ! 255: ! 256: VOID APIENTRY SaveFile(HWND hwnd) ! 257: { ! 258: HANDLE hT; ! 259: LPSTR lpT; ! 260: CHAR szFile[128]; ! 261: INT cch; ! 262: INT fh; ! 263: // OFSTRUCT of; ! 264: HWND hwndEdit; ! 265: ! 266: PSTR pch; ! 267: ! 268: hwndEdit = (HWND)GetWindowLong ( hwnd, GWL_HWNDEDIT); ! 269: GetWindowText (hwnd, szFile, sizeof(szFile)); ! 270: ! 271: /* If there is no extension (control is 'Untitled') add .TXT as extension */ ! 272: for (cch = FALSE, lpT = szFile; *lpT; lpT++) ! 273: switch (*lpT){ ! 274: case '.': ! 275: cch = TRUE; ! 276: break; ! 277: ! 278: case '\\': ! 279: case ':' : ! 280: cch = FALSE; ! 281: break; ! 282: } ! 283: if (!cch) ! 284: LoadString (hInst, IDS_ADDEXT, lpT, lpT - (LPSTR)szFile); ! 285: ! 286: fh = open(szFile, O_BINARY | O_WRONLY | O_CREAT, S_IWRITE); ! 287: ! 288: /* If file could not be opened, quit */ ! 289: if (fh < 0){ ! 290: MPError (hwnd, MB_OK | MB_ICONHAND, IDS_CANTCREATE, (LPSTR)szFile); ! 291: return; ! 292: } ! 293: ! 294: /* Find out the length of the text in the edit control */ ! 295: cch = GetWindowTextLength (hwndEdit); ! 296: ! 297: /* Obtain a handle to the text buffer */ ! 298: hT = (HANDLE)SendMessage (hwndEdit, EM_GETHANDLE, 0, 0L); ! 299: lpT = (LPSTR)LocalLock (hT); ! 300: ! 301: /* Write out the contents of the buffer to the file. */ ! 302: if (cch != write(fh, lpT, cch)) ! 303: MPError (hwnd, MB_OK | MB_ICONHAND, IDS_CANTWRITE, (LPSTR)szFile); ! 304: ! 305: /* Clean up */ ! 306: LocalUnlock (hT); ! 307: SendMessage (hwndEdit, EM_SETHANDLE, (UINT)hT, 0L); ! 308: ! 309: close(fh); ! 310: ! 311: return; ! 312: UNREFERENCED_PARAMETER(pch); ! 313: } ! 314: ! 315: /**************************************************************************** ! 316: * * ! 317: * FUNCTION : SetSaveFrom () * ! 318: * * ! 319: * PURPOSE : Formats the "Save 'file' to .." string. * ! 320: * * ! 321: ****************************************************************************/ ! 322: ! 323: VOID NEAR PASCAL SetSaveFrom ( ! 324: HWND hwnd, ! 325: PSTR psz) ! 326: { ! 327: CHAR szFmt[32]; ! 328: CHAR szText[160]; ! 329: ! 330: /* The text string in the .RC file contains the format string... */ ! 331: GetDlgItemText( hwnd, IDD_SAVEFROM, szFmt, sizeof(szFmt)); ! 332: ! 333: /* NOTE: this (LPSTR) cast MUST be here... wsprintf() is a cdecl ! 334: * (C calling conventions) function with varying args... there is ! 335: * no way for the compiler to know that all strings must be LPSTR's ! 336: * and do the conversion, so we have to be careful about wsprintf()'s. ! 337: */ ! 338: wsprintf ( szText, szFmt, (LPSTR)psz); ! 339: ! 340: /* set the text in the static control */ ! 341: SetDlgItemText (hwnd, IDD_SAVEFROM, szText); ! 342: } ! 343: ! 344: /**************************************************************************** ! 345: * * ! 346: * FUNCTION : SaveAsDlgProc(hwnd, message, wParam, lParam) * ! 347: * * ! 348: * PURPOSE : Dialog function File/SaveAs. It waits for a filename, and * ! 349: * then calls SaveFile or cancels the operation. * ! 350: * * ! 351: ****************************************************************************/ ! 352: ! 353: BOOL APIENTRY SaveAsDlgProc( ! 354: HWND hwnd, ! 355: UINT message, ! 356: UINT wParam, ! 357: LONG lParam) ! 358: { ! 359: CHAR sz[64]; ! 360: CHAR *pch; ! 361: BOOL fExt; ! 362: HWND hwndSave; ! 363: ! 364: switch (message){ ! 365: ! 366: case WM_INITDIALOG: ! 367: ! 368: /* Identify the window whose contents we're saving */ ! 369: #ifdef ORGCODE ! 370: hwndSave = LOWORD (lParam); ! 371: #else ! 372: hwndSave = (HWND)lParam; /*passed in from another procedure*/ ! 373: #endif ! 374: /* Set it's name in the property list */ ! 375: SetProp (hwnd, PROP_FILENAME, hwndSave); ! 376: ! 377: GetWindowText (hwndSave, sz, sizeof(sz)); ! 378: ! 379: /* Set the save from string... */ ! 380: SetSaveFrom (hwnd,sz); ! 381: ! 382: /* Generate a filename complete with extension */ ! 383: AnsiUpper (sz); ! 384: for (fExt = FALSE, pch = sz; *pch; pch++) ! 385: if (*pch == '.') ! 386: fExt = TRUE; ! 387: else if (*pch == '\\') ! 388: fExt = FALSE; ! 389: if (!fExt) ! 390: LoadString (hInst, IDS_ADDEXT, (LPSTR)pch, pch - sz); ! 391: ! 392: /* Display the filename in the edit control */ ! 393: SetDlgItemText (hwnd, IDD_SAVETO, sz); ! 394: ! 395: /* Select the entire range of text */ ! 396: SendMessage(GetDlgItem(hwnd, IDD_SAVETO), EM_SETSEL, GET_EM_SETSEL_MPS(0, 100)); ! 397: ! 398: DlgDirList (hwnd, "*.*", (INT)IDD_DIRS, (INT)IDD_PATH, (WORD)ATTR_DIRS); ! 399: ! 400: /* enable OK butto iff edit control is nonempty */ ! 401: if (!*sz) ! 402: EnableWindow (GetDlgItem (hwnd, IDOK), FALSE); ! 403: break; ! 404: ! 405: case WM_COMMAND: ! 406: switch (LOWORD(wParam)){ ! 407: case IDCANCEL: ! 408: /* Abort operation */ ! 409: EndDialog(hwnd,1); ! 410: break; ! 411: ! 412: case IDOK: ! 413: /* Just change the title of the MDI child. The calling ! 414: * function of ChangeFile(), which uses the title text ! 415: * for the filename, will do the actual save. ! 416: */ ! 417: hwndSave = GetProp (hwnd, PROP_FILENAME); ! 418: GetDlgItemText (hwnd, IDD_SAVETO, sz, sizeof(sz)); ! 419: AnsiUpper ((LPSTR)sz); ! 420: SetWindowText (hwndSave, sz); ! 421: EndDialog (hwnd, 0); ! 422: break; ! 423: ! 424: case IDD_SAVETO: ! 425: /* If the edit control changes, check to see if its empty. ! 426: * enable OK if it contains something ! 427: */ ! 428: if (HIWORD (lParam) != EN_CHANGE) ! 429: return FALSE; ! 430: EnableWindow (GetDlgItem (hwnd, IDOK), ! 431: SendDlgItemMessage (hwnd, ! 432: IDD_SAVETO, ! 433: WM_GETTEXTLENGTH, ! 434: 0, ! 435: 0L)); ! 436: break; ! 437: ! 438: case IDD_DIRS: ! 439: if (HIWORD(lParam)==LBN_DBLCLK){ ! 440: CHAR szT[64]; ! 441: ! 442: DlgDirSelectEx(hwnd, szT, 64, IDD_DIRS); ! 443: lstrcat ( szT, "*.*"); ! 444: DlgDirList (hwnd, szT, (INT)IDD_DIRS, (INT)IDD_PATH, (WORD)ATTR_DIRS); ! 445: break; ! 446: } ! 447: return FALSE; ! 448: ! 449: default: ! 450: return FALSE; ! 451: } ! 452: ! 453: default: ! 454: return FALSE; ! 455: } ! 456: return TRUE; ! 457: } ! 458: ! 459: /**************************************************************************** ! 460: * * ! 461: * FUNCTION : ChangeFile (hwnd) * ! 462: * * ! 463: * PURPOSE : Invokes the File/SaveAs dialog. * ! 464: * * ! 465: * RETURNS : TRUE - if user selected OK or NO. * ! 466: * FALSE - otherwise. * ! 467: * * ! 468: ****************************************************************************/ ! 469: ! 470: BOOL APIENTRY ChangeFile (HWND hwnd) ! 471: { ! 472: INT i; ! 473: ! 474: #ifdef NOTCOMMONDIALOGS ! 475: i = DialogBoxParam (hInst, IDD_SAVEAS, hwnd, SaveAsDlgProc, (LONG)hwnd); ! 476: if (!i) ! 477: SetWindowWord (hwnd, GWW_UNTITLED, 0); ! 478: return !i; ! 479: #else ! 480: OPENFILENAME ofn; ! 481: CHAR szFilterSpec [128] = /* file type filters */ ! 482: "TEXT FILES(*.TXT)\0*.txt\0"; ! 483: ! 484: #define MAXFILENAME 256 ! 485: CHAR szFileName[MAXFILENAME]; ! 486: CHAR szFileTitle[MAXFILENAME]; ! 487: ! 488: strcpy(szFileName, ""); /* these need be NULL*/ ! 489: strcpy(szFileTitle, ""); ! 490: ! 491: /* fill in non-variant fields of OPENFILENAME struct. */ ! 492: ofn.lStructSize = sizeof(OPENFILENAME); ! 493: ofn.hwndOwner = hwnd; ! 494: ofn.lpstrFilter = szFilterSpec; ! 495: ofn.lpstrCustomFilter = NULL; ! 496: ofn.nMaxCustFilter = 0; ! 497: ofn.nFilterIndex = 0; ! 498: ofn.lpstrFile = szFileName; ! 499: ofn.nMaxFile = MAXFILENAME; ! 500: ofn.lpstrInitialDir = NULL; ! 501: ofn.lpstrFileTitle = szFileTitle; ! 502: ofn.nMaxFileTitle = MAXFILENAME; ! 503: ofn.lpstrTitle = "Save TextFiles"; ! 504: ofn.lpstrDefExt = "TXT"; ! 505: ofn.Flags = 0; ! 506: /* Use standard open dialog */ ! 507: i = GetSaveFileName ((LPOPENFILENAME)&ofn); ! 508: AnsiUpper ((LPSTR)ofn.lpstrFile); ! 509: SetWindowText (hwnd, ofn.lpstrFile); ! 510: if (i) ! 511: SetWindowWord (hwnd, GWW_UNTITLED, 0); ! 512: return i; ! 513: #endif ! 514: ! 515: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.