home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
tolkit45.zip
/
os2tk45
/
samples
/
pm
/
template
/
file.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-05-11
|
18KB
|
603 lines
/**************************************************************************
* File name : file.c
*
* Description: This module contains the code for the WM_COMMAND messages
* posted by the standard File menu.
*
* This source file contains the following functions:
*
* FileNew(mp2);
* FileOpen(mp2);
* FileSave(mp2);
* FileSaveAs(mp2);
* WriteFileToDisk(hf);
* GetFileName();
* UpdateTitleText(hwnd);
* TemplateOpenFilterProc(hwnd, msg, mp1, mp2)
* TemplateSaveFilterProc(hwnd, msg, mp1, mp2)
*
* Concepts : file management
*
* API's : WinLoadString
* WinFileDlg
* DosOpen
* DosClose
* WinSetWindowText
* WinWindowFromID
* WinDefFileDlgProc
*
* Required
* Files : OS2.H, STRING.H, MAIN.H, HELP.H, XTRN.H
*
* Copyright (C) 1991 IBM Corporation
*
* DISCLAIMER OF WARRANTIES. The following [enclosed] code is
* sample code created by IBM Corporation. This sample code is not
* part of any standard or IBM product and is provided to you solely
* for the purpose of assisting you in the development of your
* applications. The code is provided "AS IS", without
* warranty of any kind. IBM shall not be liable for any damages
* arising out of your use of the sample code, even if they have been
* advised of the possibility of such damages. *
*************************************************************************/
/*
* Include files, macros, defined constants, and externs
*/
#define INCL_WINFRAMEMGR
#define INCL_WINSWITCHLIST
#define INCL_WINSTDFILE
#include <os2.h>
#include <string.h>
#include "main.h"
#include "xtrn.h"
#include "help.h"
/*
* Global variables
*/
CHAR szFullPath[CCHMAXPATH] = "";
/*
* Entry point declarations
*/
/**************************************************************************
*
* Name : FileNew(mp2)
*
* Description: Processes the File menu's New item
*
* Concepts: called whenever NEW from the FILE menu is selected
*
* API's : [none]
*
* Parameters : mp2 = second message parameter
*
* Return : [none]
*
*************************************************************************/
VOID FileNew(MPARAM mp2)
{
/*
* Enter routines for creating a new file and window
*/
/* clear file name and reset the titlebar text */
szFullPath[0] = '\0';
UpdateTitleText(hwndMainFrame);
/* This routine currently doesn't use the mp2 parameter but
* it is referenced here to prevent an 'Unreferenced Parameter'
* warning at compile time.
*/
mp2;
} /* End of FileNew */
/**************************************************************************
*
* Name : FileOpen(mp2)
*
* Description: Processes the File menu's Open item
*
* Concepts: Called whenever OPEN from the FILE menu is selected
*
* Calls the standard file open dialog to get the
* file name. The file name is passed onto DosOpen
* which returns the handle to the file. The file
* input procedure is called and then the file handle
* is closed.
*
* API's : WinLoadString
* WinFileDlg
* DosOpen
* DosClose
*
* Parameters : mp2 = second message parameter
*
* Return : [none]
*
*************************************************************************/
VOID FileOpen(MPARAM mp2)
{
FILEDLG fdg;
HFILE hfIn;
ULONG ulAction;
CHAR szTitle[MESSAGELEN], szButton[MESSAGELEN];
fdg.cbSize = sizeof(FILEDLG);
if(!WinLoadString(hab, (HMODULE)0, IDS_OPEN, MESSAGELEN, szTitle))
{
MessageBox(hwndMain, IDMSG_CANNOTLOADSTRING, MB_OK | MB_ERROR, TRUE);
return;
}
if(!WinLoadString(hab, (HMODULE)0, IDS_OPEN, MESSAGELEN, szButton))
{
MessageBox(hwndMain, IDMSG_CANNOTLOADSTRING, MB_OK | MB_ERROR, TRUE);
return;
}
fdg.pszTitle = szTitle;
fdg.pszOKButton = szButton;
fdg.ulUser = 0L;
fdg.fl = FDS_HELPBUTTON | FDS_CENTER | FDS_OPEN_DIALOG;
fdg.pfnDlgProc = (PFNWP)TemplateOpenFilterProc;
fdg.lReturn = 0L;
fdg.lSRC = 0L;
fdg.hMod = 0;
fdg.usDlgId = FILEOPEN;
fdg.x = 0;
fdg.y = 0;
if(!WinLoadString(hab, (HMODULE)0, IDS_FILEOPENEXT, CCHMAXPATH,
fdg.szFullFile))
{
MessageBox(hwndMain, IDMSG_CANNOTLOADSTRING, MB_OK | MB_ERROR, TRUE);
return;
}
fdg.pszIType = (PSZ)NULL;
fdg.papszITypeList = (PAPSZ)NULL;
fdg.pszIDrive = (PSZ)NULL;
fdg.papszIDriveList= (PAPSZ)NULL;
fdg.sEAType = (SHORT)0;
fdg.papszFQFilename= (PAPSZ)NULL;
fdg.ulFQFCount = 0L;
/* get the file */
if(!WinFileDlg(HWND_DESKTOP, hwndMain, &fdg))
return;
/*
* Upon sucessful return of a file, open it for reading
*/
if(fdg.lReturn == ID_OK)
{
if( DosOpen(fdg.szFullFile, /* file name from Open dialog */
&hfIn, /* file handle returned */
&ulAction,
0L,
FILE_NORMAL,
FILE_OPEN,
OPEN_ACCESS_READONLY | OPEN_SHARE_DENYNONE,
(PEAOP2)NULL))
{
MessageBox(hwndMain,
IDMSG_CANNOTOPENINPUTFILE,
MB_OK | MB_ERROR,
FALSE);
/*
* NOTE: You now have several options on how to proceed
* from this point:
* - You can abort the File Open by returning from
* this procedure.
* - You can bring up the File Open dialog again
* and have the user pick another file.
* - You can check the error code from the DosOpen,
* determine why the open failed, and take an
* action appropriate to the specific failure.
*/
return;
}
/* copy file name into file name buffer */
strcpy(szFullPath, fdg.szFullFile);
/*
* Place routine for reading the file here.
*/
DosClose(hfIn);
UpdateTitleText(hwndMainFrame);
}
/* This routine currently doesn't use the mp2 parameter but *\
* it is referenced here to prevent an 'Unreferenced Parameter'
\* warning at compile time. */
mp2;
} /* End of FileOpen */
/**************************************************************************
*
* Name : FileSave(mp2)
*
* Description: Processes the File menu's Save item
*
* Concepts: Called whenever SAVE from the FILE menu is selected
*
* Routine opens the file for output, calls the
* application's save routine, and closes the file.
*
* API's : DosOpen
* DosClose
*
* Parameters : mp2 = second message parameter
*
* Return : [none]
*
*************************************************************************/
VOID FileSave(MPARAM mp2)
{
HFILE hf;
ULONG ulAction;
/*
* If the file currently is untitled, we will need to get a file
* name from the user before we can open the file. Getting a
* file name is normally done during the FileSaveAs operation
* so we will treat this save as a SaveAs and call FileSaveAs().
* If the file is titled, then we save the file.
*
* NOTE: This routine will be called by FileSaveAs(), but only
* after a valid file name has been obtained. So, FileSaveAs()
* will not be called again from this routine.
*/
if(szFullPath[0] == '\0')
{
FileSaveAs(mp2);
return;
}
/* open the file */
if( DosOpen(szFullPath, /* file name of current document */
&hf, /* file handle of output file */
&ulAction,
0L,
FILE_NORMAL,
FILE_OPEN | FILE_CREATE,
OPEN_ACCESS_WRITEONLY | OPEN_SHARE_DENYNONE,
(PEAOP2)NULL))
{
MessageBox(hwndMain,
IDMSG_CANNOTOPENOUTPUTFILE,
MB_OK | MB_ERROR,
FALSE);
return;
}
WriteFileToDisk(hf);
DosClose(hf);
/* This routine currently doesn't use the mp2 parameter but *\
* it is referenced here to prevent an 'Unreferenced Parameter'
\* warning at compile time. */
mp2;
} /* End of FileSave */
/**************************************************************************
*
* Name : FileSaveAs(mp2)
*
* Description: Processes the File menu's Save as item
*
* Concepts: Called whenever SAVE AS from the FILE menu is selected
*
* Routine prompts the user for the name of the file,
* then saves the file.
*
* API's : DosOpen
* DosClose
*
* Parameters : mp2 = second message parameter
*
* Return : [none]
*
*************************************************************************/
VOID FileSaveAs(MPARAM mp2)
{
HFILE hf;
ULONG ulAction;
ULONG sT;
while(TRUE) /* infinite loop until we break out of it */
{
/* Get a name for the file */
if(!GetFileName())
return;
/* See if the file exists. If it does, then confirm that the
* user wants to overwrite it. If he doesn't, then get a new
* file name
*/
if( DosOpen(szFullPath, /* file name from, GetFileName() */
&hf, /* handle of opened file */
&ulAction,
0L,
FILE_NORMAL,
FILE_CREATE,
OPEN_ACCESS_WRITEONLY | OPEN_SHARE_DENYNONE,
(PEAOP2)NULL))
{
MessageBox(hwndMain,
IDMSG_CANNOTOPENOUTPUTFILE,
MB_OK | MB_ERROR,
FALSE);
return;
}
else
DosClose(hf);
/* if file exists, ask if we want to overwrite it */
if(ulAction == FILE_EXISTED)
{
sT = MessageBox(hwndMain,
IDMSG_OVERWRITEFILE,
MB_QUERY | MB_YESNOCANCEL,
FALSE);
if(sT == MBID_CANCEL)
return;
if(sT == MBID_YES)
break;
/* if user selected no, repeat the sequence */
}
} /* while(TRUE) */
UpdateTitleText(hwndMainFrame);
/*
* Now that we have a valid file name, save the file. This is
* normally done under the File Save function so we can just
* call the FileSave() function here. Note that FileSave() will
* not call FileSaveAs() back since there is a valid file name
*/
FileSave(mp2);
/* This routine currently doesn't use the mp2 parameter but
* it is referenced here to prevent an 'Unreferenced Parameter'
* warning at compile time.
*/
mp2;
} /* End of FileSaveAs */
/**************************************************************************
*
* Name : WriteFileToDisk(hfile)
*
* Description: writes the current file to the file in hf
*
* Concepts: called from FileSave and FileSaveAs when a fileelected
* is to be saved to disk
*
* NOTE: This routine must not close the file.
*
* API's : [none]
*
* Parameters : hfile = file handle
*
* Return : [none]
*
*************************************************************************/
VOID WriteFileToDisk(HFILE hf) \
{
/*
* Place routine to write a disk file here.
*/
hf;
} /* End of WriteFileToDisk */
/**************************************************************************
*
* Name : GetFileName()
*
* Description: gets the name of the save file
*
* Concepts: called when the user needs to supply a name for
* the file to be saved
*
* calls the standard file open dialog to get the
* file name.
*
* API's : WinLoadString
* WinFileDlg
*
* Parameters : [none]
*
* Return : TRUE if successful in getting a file name
* FALSE if not successful in getting a file name
*
*************************************************************************/
BOOL GetFileName(VOID)
{
FILEDLG fdg;
CHAR szTitle[MESSAGELEN], szButton[MESSAGELEN];
fdg.cbSize = sizeof(FILEDLG);
if(!WinLoadString(hab, 0, IDS_SAVE, MESSAGELEN, szTitle))
{
MessageBox(hwndMain, IDMSG_CANNOTLOADSTRING, MB_OK | MB_ERROR, TRUE);
return FALSE;
}
if(!WinLoadString(hab, 0, IDS_SAVE, MESSAGELEN, szButton))
{
MessageBox(hwndMain, IDMSG_CANNOTLOADSTRING, MB_OK | MB_ERROR, TRUE);
return FALSE;
}
fdg.pszTitle = szTitle;
fdg.pszOKButton = szButton;
fdg.ulUser = 0L;
fdg.fl = FDS_HELPBUTTON | FDS_CENTER | FDS_SAVEAS_DIALOG;
fdg.pfnDlgProc = (PFNWP)TemplateSaveFilterProc;
fdg.lReturn = 0L;
fdg.lSRC = 0L;
fdg.hMod = (HMODULE)NULL;
fdg.usDlgId = FILESAVE;
fdg.x = 0;
fdg.y = 0;
fdg.pszIType = (PSZ)NULL;
fdg.papszITypeList = (PAPSZ)NULL;
fdg.pszIDrive = (PSZ)NULL;
fdg.papszIDriveList = (PAPSZ)NULL;
fdg.sEAType = (SHORT)0;
fdg.papszFQFilename = (PAPSZ)NULL;
fdg.ulFQFCount = 0L;
strcpy(fdg.szFullFile, szFullPath);
/* get the file */
if(!WinFileDlg(HWND_DESKTOP, hwndMain, &fdg))
return FALSE;
if(fdg.lReturn != ID_OK)
return FALSE;
/* copy file name and path returned into buffers */
strcpy(szFullPath, fdg.szFullFile);
return TRUE;
} /* End of GetFileName */
/**************************************************************************
*
* Name : UpdateTitleText
*
* Description: Updates the text in the main window's title bar to
* display the app name, followed by the separator,
* followed by the file name.
*
* Concepts : Called at init time and when the text file is changed.
* Gets the program name, appends the separator, and
* appends the file name.
*
* API's : WinLoadString
* WinSetWindowText
* WinWindowFromID
*
* Parameters : hwnd = window handle
*
* Return : [none]
*
*************************************************************************/
VOID UpdateTitleText(HWND hwnd)
{
CHAR szBuf[MAXNAMEL+TITLESEPARATORLEN+CCHMAXPATH];
CHAR szSeparator[TITLESEPARATORLEN+1];
PSZ pszT;
WinLoadString(hab, (HMODULE)0, IDS_APPNAME, MAXNAMEL, szBuf);
WinLoadString(hab,
(HMODULE)0,
IDS_TITLEBARSEPARATOR,
TITLESEPARATORLEN,
szSeparator);
strcat(szBuf, szSeparator);
if(szFullPath[0] == '\0')
pszT = szUntitled;
else
pszT = szFullPath;
strcat(szBuf, pszT);
WinSetWindowText(WinWindowFromID(hwnd, FID_TITLEBAR), szBuf);
} /* End of UpdateTitleText */
/**************************************************************************
*
* Name : TemplateOpenFilterProc(hwnd, msg, mp1, mp2)
*
* Description: Filters the help messages to the open dialog
*
* Concepts : If help is requested during the standard OPEN
* dialog, this routine will display an appropriate
* panel.
*
* API's : WinDefFileDlgProc
*
* Parameters : hwnd = window handle
* message = message i.d.
* mp1 = first message parameter
* mp2 = second message parameter
*
* Return : the result of the message
*
*************************************************************************/
MRESULT EXPENTRY TemplateOpenFilterProc(HWND hwnd, ULONG message,
MPARAM mp1, MPARAM mp2 )
{
if(message == WM_HELP)
{
DisplayHelpPanel(HID_FS_OPEN_DLG_HELP_PANEL);
return (MRESULT)FALSE ;
}
return WinDefFileDlgProc( hwnd, message, mp1, mp2 ) ;
} /* End of TemplateSaveFilterProc */
/**************************************************************************
*
* Name : TemplateSaveFilterProc(hwnd, msg, mp1, mp2)
*
* Description: Filters the help messages to the save dialog
*
* Concepts : If help is requested during the standard SAVEAS
* dialog, this routine will display an appropriate
* panel.
*
* API's : WinDefFileDlgProc
*
* Parameters : hwnd = window handle
* message = message i.d.
* mp1 = first message parameter
* mp2 = second message parameter
*
* Return : the result of the message
*
*************************************************************************/
MRESULT EXPENTRY TemplateSaveFilterProc(HWND hwnd,
ULONG message,
MPARAM mp1,
MPARAM mp2 )
{
if(message == WM_HELP)
{
DisplayHelpPanel(HID_FS_SAVE_DLG_HELP_PANEL);
return (MRESULT)FALSE ;
}
return WinDefFileDlgProc( hwnd, message, mp1, mp2 );
} /* End of TemplateSaveFilterProc */
/*************************** End of file.c ***************************/