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