home *** CD-ROM | disk | FTP | other *** search
- /***************************************************************************
- * *
- * MODULE : MpFile.c *
- * *
- * PURPOSE : Contains the code for File i/o for Multipad. *
- * *
- * FUNCTIONS : *
- * AddFile() - Creates a new MDI window. Given an *
- * option, it loads a file into it. *
- * *
- * LoadFile () - Loads a file into the MDI window. *
- * *
- * ReadFile () - In response to File/Open menu, *
- * calls AddFile() *
- * *
- * SaveFile () - Saves contents of an edit control to *
- * a file. *
- * *
- * SetSavefrom() - Formats the "Save 'file' to" string. *
- * *
- * SaveAsDlgProc() - Dialog function for File/SaveAs. *
- * *
- * ChangeFile() - Calls File/SaveAs dialog. *
- * *
- ***************************************************************************/
- #include "multipad.h"
-
- VOID NEAR PASCAL GetFileName(PSTR);
- int FAR PASCAL DialogBoxParam(HANDLE,LPSTR,HWND,FARPROC,LONG);
-
- /****************************************************************************
- * *
- * FUNCTION : AddFile (lpName) *
- * *
- * PURPOSE : Creates a new MDI window. If the lpName parameter is not *
- * NULL, it loads a file into the window. *
- * *
- * RETURNS : HWND - A handle to the new window. *
- * *
- ****************************************************************************/
-
- HWND FAR PASCAL AddFile ( lpName )
- LPSTR lpName;
- {
- HWND hwnd;
-
- char sz[160];
- MDICREATESTRUCT mcs;
-
- if (!lpName){
- /* If the lpName parameter is NULL, load the "Untitled" string
- * from STRINGTABLE and set the title field of the MDI CreateStruct.
- */
- LoadString (hInst, IDS_UNTITLED, sz, sizeof(sz));
- mcs.szTitle = (LPSTR)sz;
- }
- else{
- /* Title the window with the supplied filename */
- AnsiUpper (lpName);
- mcs.szTitle = lpName;
- }
-
- mcs.szClass = szChild;
- mcs.hOwner = hInst;
-
- /* Use the default size for the window */
- mcs.x = mcs.cx = CW_USEDEFAULT;
- mcs.y = mcs.cy = CW_USEDEFAULT;
-
- /* Set the style DWORD of the window to default */
- mcs.style = styleDefault;
-
- /* tell the MDI Client to create the child */
- hwnd = (WORD)SendMessage (hwndMDIClient,
- WM_MDICREATE,
- 0,
- (LONG)(LPMDICREATESTRUCT)&mcs);
-
- /* Did we get a file? Read it into the window */
- if (lpName)
- LoadFile (hwnd, lpName);
-
- return hwnd;
-
- }
-
- /****************************************************************************
- * *
- * FUNCTION : LoadFile (lpName) *
- * *
- * PURPOSE : Given the handle to a MDI window and a filename, reads the *
- * file into the window's edit control child. *
- * *
- * RETURNS : TRUE - If file is sucessfully loaded. *
- * FALSE - Otherwise. *
- * *
- ****************************************************************************/
- int FAR PASCAL LoadFile (hwnd, lpName)
- HWND hwnd;
- LPSTR lpName;
- {
- WORD wLength;
- HANDLE hT;
- LPSTR lpB;
- HWND hwndEdit;
- int fh;
-
- hwndEdit = GetWindowWord (hwnd, GWW_HWNDEDIT);
-
- /* The file has a title, so mark the appropriate flag. */
- SetWindowWord(hwnd, GWW_UNTITLED, 0);
-
- fh = _lopen (lpName, 0);
-
- /* Make sure file has been opened correctly */
- if ( fh < 0 )
- goto error;
-
- /* Find the length of the file */
- wLength = (WORD)_llseek (fh, 0L, 2);
- _llseek (fh, 0L, 0);
-
- /* Attempt to reallocate the edit control's buffer to the file size */
- hT = (HANDLE)SendMessage (hwndEdit, EM_GETHANDLE, 0, 0L);
- if (!LocalReAlloc (hT, wLength+1, LHND)){
- LocalUnlock (hT);
- _lclose (fh);
- goto error;
- }
-
- /* read the file into the buffer */
- if (wLength != _lread (fh, (lpB = (LPSTR)LocalLock (hT)), wLength))
- MPError (hwnd, MB_OK|MB_ICONHAND, IDS_CANTREAD, lpName);
-
- /* Zero terminate the edit buffer */
- lpB [wLength] = 0;
- LocalUnlock (hT);
-
- SendMessage (hwndEdit, EM_SETHANDLE, hT, 0L);
- _lclose (fh);
-
- return TRUE;
-
- /* Report the error and quit */
- error:
- MPError(hwnd,MB_OK|MB_ICONHAND,IDS_CANTOPEN,lpName);
- return FALSE;
-
- }
-
- /****************************************************************************
- * *
- * FUNCTION : ReadFile (hwnd) *
- * *
- * PURPOSE : Called in response to a File/Open menu selection. It calls *
- * AddFile () to load the file into the control. *
- * *
- ****************************************************************************/
- VOID FAR PASCAL ReadFile( hwnd )
- HWND hwnd;
- {
- char szFile[128];
-
- GetFileName (szFile);
- if ( *szFile )
- AddFile (szFile);
-
- }
- /****************************************************************************
- * *
- * FUNCTION : SaveFile (hwnd) *
- * *
- * PURPOSE : Saves contents of current edit control to disk. *
- * *
- ****************************************************************************/
- VOID FAR PASCAL SaveFile( hwnd )
-
- HWND hwnd;
- {
- HANDLE hT;
- LPSTR lpT;
- char szFile[64];
- WORD cch;
- int fh;
- OFSTRUCT of;
- HWND hwndEdit;
-
- hwndEdit = GetWindowWord ( hwnd, GWW_HWNDEDIT);
- GetWindowText (hwnd, szFile, sizeof(szFile));
-
- /* If there is no extension (control is 'Untitled') add .TXT as extension */
- for (cch = FALSE, lpT = szFile; *lpT; lpT++)
- switch (*lpT){
- case '.':
- cch = TRUE;
- break;
-
- case '\\':
- case ':' :
- cch = FALSE;
- break;
- }
- if (!cch)
- LoadString (hInst, IDS_ADDEXT, lpT, lpT - (LPSTR)szFile);
-
- fh = OpenFile (szFile, &of, OF_WRITE | OF_CREATE);
-
- /* If file could not be opened, quit */
- if (fh < 0){
- MPError (hwnd, MB_OK | MB_ICONHAND, IDS_CANTCREATE, (LPSTR)szFile);
- return;
- }
-
- /* Find out the length of the text in the edit control */
- cch = GetWindowTextLength (hwndEdit);
-
- /* Obtain a handle to the text buffer */
- hT = (HANDLE)SendMessage (hwndEdit, EM_GETHANDLE, 0, 0L);
- lpT = (LPSTR)LocalLock (hT);
-
- /* Write out the contents of the buffer to the file. */
- if (cch != _lwrite (fh, lpT, cch))
- MPError (hwnd, MB_OK | MB_ICONHAND, IDS_CANTWRITE, (LPSTR)szFile);
-
- /* Clean up */
- LocalUnlock (hT);
- SendMessage (hwndEdit, EM_SETHANDLE, hT, 0L);
-
- _lclose (fh);
-
- return;
- }
- /****************************************************************************
- * *
- * FUNCTION : SetSaveFrom () *
- * *
- * PURPOSE : Formats the "Save 'file' to .." string. *
- * *
- ****************************************************************************/
-
- VOID NEAR PASCAL SetSaveFrom ( hwnd , psz)
- HWND hwnd;
- PSTR psz;
- {
- char szFmt[32];
- char szText[160];
-
- /* The text string in the .RC file contains the format string... */
- GetDlgItemText( hwnd, IDD_SAVEFROM, szFmt, sizeof(szFmt));
-
- /* NOTE: this (LPSTR) cast MUST be here... wsprintf() is a cdecl
- * (C calling conventions) function with varying args... there is
- * no way for the compiler to know that all strings must be LPSTR's
- * and do the conversion, so we have to be careful about wsprintf()'s.
- */
- wsprintf ( szText, szFmt, (LPSTR)psz);
-
- /* set the text in the static control */
- SetDlgItemText (hwnd, IDD_SAVEFROM, szText);
- }
-
- /****************************************************************************
- * *
- * FUNCTION : SaveAsDlgProc(hwnd, message, wParam, lParam) *
- * *
- * PURPOSE : Dialog function File/SaveAs. It waits for a filename, and *
- * then calls SaveFile or cancels the operation. *
- * *
- ****************************************************************************/
- BOOL FAR PASCAL SaveAsDlgProc( hwnd, message, wParam, lParam)
- HWND hwnd;
- WORD message;
- WORD wParam;
- LONG lParam;
- {
- char sz[64];
- char *pch;
- BOOL fExt;
- HWND hwndSave;
-
- switch (message){
-
- case WM_INITDIALOG:
-
- /* Identify the window whose contents we're saving */
- hwndSave = LOWORD (lParam);
-
- /* Set it's name in the property list */
- SetProp (hwnd, PROP_FILENAME, hwndSave);
-
- GetWindowText (hwndSave, sz, sizeof(sz));
-
- /* Set the save from string... */
- SetSaveFrom (hwnd,sz);
-
- /* Generate a filename complete with extension */
- AnsiUpper (sz);
- for (fExt = FALSE, pch = sz; *pch; pch++)
- if (*pch == '.')
- fExt = TRUE;
- else if (*pch == '\\')
- fExt = FALSE;
- if (!fExt)
- LoadString (hInst, IDS_ADDEXT, (LPSTR)pch, pch - sz);
-
- /* Display the filename in the edit control */
- SetDlgItemText (hwnd, IDD_SAVETO, sz);
-
- /* Select the entire range of text */
- SendDlgItemMessage (hwnd, IDD_SAVETO, EM_SETSEL, 0, MAKELONG (0,100));
-
- DlgDirList (hwnd, "*.*", IDD_DIRS, IDD_PATH, ATTR_DIRS);
-
- /* enable OK butto iff edit control is nonempty */
- if (!*sz)
- EnableWindow (GetDlgItem (hwnd, IDOK), FALSE);
- break;
-
- case WM_COMMAND:
- switch (wParam){
- case IDCANCEL:
- /* Abort operation */
- EndDialog(hwnd,1);
- break;
-
- case IDOK:
- /* Just change the title of the MDI child. The calling
- * function of ChangeFile(), which uses the title text
- * for the filename, will do the actual save.
- */
- hwndSave = GetProp (hwnd, PROP_FILENAME);
- GetDlgItemText (hwnd, IDD_SAVETO, sz, sizeof(sz));
- AnsiUpper ((LPSTR)sz);
- SetWindowText (hwndSave, sz);
- EndDialog (hwnd, 0);
- break;
-
- case IDD_SAVETO:
- /* If the edit control changes, check to see if its empty.
- * enable OK if it contains something
- */
- if (HIWORD (lParam) != EN_CHANGE)
- return FALSE;
- EnableWindow (GetDlgItem (hwnd, IDOK),
- (WORD) SendDlgItemMessage (hwnd,
- IDD_SAVETO,
- WM_GETTEXTLENGTH,
- 0,
- 0L));
- break;
-
- case IDD_DIRS:
- if (HIWORD(lParam)==LBN_DBLCLK){
- char szT[64];
-
- DlgDirSelect ( hwnd, szT, IDD_DIRS);
- lstrcat ( szT, "*.*");
- DlgDirList (hwnd, szT, IDD_DIRS, IDD_PATH, ATTR_DIRS);
- break;
- }
- return FALSE;
-
- default:
- return FALSE;
- }
-
- default:
- return FALSE;
- }
- return TRUE;
- }
- /****************************************************************************
- * *
- * FUNCTION : ChangeFile (hwnd) *
- * *
- * PURPOSE : Invokes the File/SaveAs dialog. *
- * *
- * RETURNS : TRUE - if user selected OK or NO. *
- * FALSE - otherwise. *
- * *
- ****************************************************************************/
- BOOL FAR PASCAL ChangeFile (hwnd)
- HWND hwnd;
- {
- FARPROC lpfn;
- int i;
-
- lpfn = MakeProcInstance (SaveAsDlgProc, hInst);
- i = DialogBoxParam (hInst, IDD_SAVEAS, hwnd, lpfn, MAKELONG (hwnd, 0));
- FreeProcInstance (lpfn);
- if (!i)
- SetWindowWord (hwnd, GWW_UNTITLED, 0);
- return !i;
- }
-