430 lines
13 KiB
C
430 lines
13 KiB
C
|
/************************************************************/
|
|||
|
/* Windows Write, Copyright 1985-1992 Microsoft Corporation */
|
|||
|
/************************************************************/
|
|||
|
#include <windows.h>
|
|||
|
#include "mw.h"
|
|||
|
#include "menudefs.h"
|
|||
|
#include "str.h"
|
|||
|
#include <commdlg.h>
|
|||
|
#include "filedefs.h"
|
|||
|
#include <dlgs.h>
|
|||
|
#include "doslib.h"
|
|||
|
#include "obj.h"
|
|||
|
|
|||
|
extern HANDLE hMmwModInstance;
|
|||
|
extern CHAR szAppName[];
|
|||
|
extern HWND vhWndMsgBoxParent,hParentWw,vhWnd;
|
|||
|
static OPENFILENAME OFN;
|
|||
|
static bSave;
|
|||
|
FARPROC lpfnOFNHook=NULL;
|
|||
|
BOOL FAR PASCAL fnOFNHook(HWND hDlg, unsigned msg, WORD wParam, LONG lParam) ;
|
|||
|
|
|||
|
#define hINSTANCE hMmwModInstance
|
|||
|
|
|||
|
#define hDOCWINDOW vhWnd
|
|||
|
#define hMAINWINDOW hParentWw
|
|||
|
#define hPARENTWINDOW ((vhWndMsgBoxParent == NULL) ? \
|
|||
|
hParentWw : vhWndMsgBoxParent)
|
|||
|
|
|||
|
#define CBPATHMAX cchMaxFile
|
|||
|
#define CFILTERMAX 6 /* Max # filters */
|
|||
|
#define CBFILTERSIZE 40
|
|||
|
#define CBFILTERMAX (CBFILTERSIZE * CFILTERMAX) /* Max # chars/filter */
|
|||
|
#define CBMESSAGEMAX 80
|
|||
|
|
|||
|
static char fDefFileType;
|
|||
|
#define SA_WORDTEXT 0
|
|||
|
#define SA_TEXTONLY 1
|
|||
|
#define SA_WORD 2
|
|||
|
#define SA_OLDWRITE 3
|
|||
|
#define SA_WRITE 4
|
|||
|
|
|||
|
static char *szDefExtensions[6];
|
|||
|
static int nTextOnly,nWordText,nWord,nOldWrite; // position in filterspec list box
|
|||
|
static char szNull[1] = "";
|
|||
|
static char szWild[3] = "*.";
|
|||
|
static char szOpenFile[CBMESSAGEMAX];
|
|||
|
static char szSaveFile[CBMESSAGEMAX];
|
|||
|
static char szFileName[CBPATHMAX];
|
|||
|
static char szLastDir[CBPATHMAX];
|
|||
|
static char szDefWriExtension[CBMESSAGEMAX];
|
|||
|
static char szDefDocExtension[CBMESSAGEMAX];
|
|||
|
static char szDefTxtExtension[CBMESSAGEMAX];
|
|||
|
static char szWriDescr[CBMESSAGEMAX];
|
|||
|
static char szDocDescr[CBMESSAGEMAX];
|
|||
|
static char szTxtDescr[CBMESSAGEMAX];
|
|||
|
static char szAllFilesDescr[CBMESSAGEMAX];
|
|||
|
static char szDocTxtDescr[CBMESSAGEMAX];
|
|||
|
static char szOldWriteDescr[CBMESSAGEMAX];
|
|||
|
static char szFilterSpec[CBFILTERMAX];
|
|||
|
static char szCustFilterSpec[CBFILTERSIZE];
|
|||
|
|
|||
|
static MakeFilterString(int iWhichOper);
|
|||
|
int InitCommDlg(int iWhichOper);
|
|||
|
|
|||
|
int InitCommDlg(int iWhichOper)
|
|||
|
{
|
|||
|
OFN.lpstrDefExt = NULL;
|
|||
|
OFN.lpstrFile = szFileName;
|
|||
|
OFN.lpstrFilter = szFilterSpec;
|
|||
|
OFN.lpstrCustomFilter = szCustFilterSpec;
|
|||
|
|
|||
|
switch(iWhichOper)
|
|||
|
{
|
|||
|
case 0: // beginning of Write session
|
|||
|
OFN.lStructSize = sizeof(OPENFILENAME);
|
|||
|
OFN.hInstance = hINSTANCE;
|
|||
|
OFN.lCustData = NULL;
|
|||
|
OFN.lpTemplateName = NULL;
|
|||
|
OFN.lpstrFileTitle = NULL;
|
|||
|
OFN.nMaxFileTitle = 0;
|
|||
|
OFN.nMaxFile = CBPATHMAX;
|
|||
|
OFN.lpstrInitialDir = NULL;
|
|||
|
OFN.nMaxCustFilter = CBFILTERSIZE;
|
|||
|
|
|||
|
LoadString(hINSTANCE, IDSTROpenfile, szOpenFile, sizeof(szOpenFile));
|
|||
|
LoadString(hINSTANCE, IDSTRSavefile, szSaveFile, sizeof(szSaveFile));
|
|||
|
LoadString(hINSTANCE, IDSTRDefWriExtension, szDefWriExtension, sizeof(szDefWriExtension));
|
|||
|
LoadString(hINSTANCE, IDSTRDefDocExtension, szDefDocExtension, sizeof(szDefDocExtension));
|
|||
|
LoadString(hINSTANCE, IDSTRDefTxtExtension, szDefTxtExtension, sizeof(szDefTxtExtension));
|
|||
|
LoadString(hINSTANCE, IDSTRWriDescr, szWriDescr, sizeof(szWriDescr));
|
|||
|
LoadString(hINSTANCE, IDSTRDocDescr, szDocDescr, sizeof(szDocDescr));
|
|||
|
LoadString(hINSTANCE, IDSTRTxtDescr, szTxtDescr, sizeof(szTxtDescr));
|
|||
|
LoadString(hINSTANCE, IDSTRDocTextDescr, szDocTxtDescr, sizeof(szDocTxtDescr));
|
|||
|
LoadString(hINSTANCE, IDSTRAllFilesDescr, szAllFilesDescr, sizeof(szAllFilesDescr));
|
|||
|
LoadString(hINSTANCE, IDSTROldWriteDescr, szOldWriteDescr, sizeof(szOldWriteDescr));
|
|||
|
|
|||
|
return FALSE;
|
|||
|
|
|||
|
case imiOpen:
|
|||
|
if ((lpfnOFNHook = MakeProcInstance(fnOFNHook, hINSTANCE)) == NULL)
|
|||
|
return TRUE;
|
|||
|
|
|||
|
OFN.hwndOwner = hPARENTWINDOW;
|
|||
|
OFN.Flags = OFN_ENABLEHOOK|OFN_HIDEREADONLY|OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST;
|
|||
|
OFN.lpfnHook = lpfnOFNHook;
|
|||
|
lstrcpy(szFileName,szWild);
|
|||
|
lstrcat(szFileName,szDefWriExtension);
|
|||
|
OFN.lpstrTitle = szOpenFile;
|
|||
|
szCustFilterSpec[0] = '\0';
|
|||
|
|
|||
|
fDefFileType = SA_WRITE; /* see MakeFilterSpec */
|
|||
|
MakeFilterString(iWhichOper);
|
|||
|
|
|||
|
return FALSE;
|
|||
|
|
|||
|
case imiSaveAs:
|
|||
|
/* read only will become the backup check box */
|
|||
|
if ((lpfnOFNHook = MakeProcInstance(fnOFNHook, hINSTANCE)) == NULL)
|
|||
|
return TRUE;
|
|||
|
|
|||
|
OFN.hwndOwner = hPARENTWINDOW;
|
|||
|
OFN.Flags = OFN_ENABLEHOOK|OFN_PATHMUSTEXIST|OFN_OVERWRITEPROMPT;
|
|||
|
OFN.lpfnHook = lpfnOFNHook;
|
|||
|
OFN.lpstrTitle = szSaveFile;
|
|||
|
szCustFilterSpec[0] = '\0';
|
|||
|
MakeFilterString(iWhichOper);
|
|||
|
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
int DoCommDlg(int iWhichOper)
|
|||
|
/* returns whether file was retrieved */
|
|||
|
/* iWhichOper is the imi* code from the menu */
|
|||
|
{
|
|||
|
int iRetval;
|
|||
|
|
|||
|
bSave = iWhichOper == imiSaveAs;
|
|||
|
|
|||
|
iRetval = !InitCommDlg(iWhichOper);
|
|||
|
|
|||
|
if (!iRetval)
|
|||
|
goto end;
|
|||
|
|
|||
|
LockData(0);
|
|||
|
switch(iWhichOper)
|
|||
|
{
|
|||
|
case imiOpen:
|
|||
|
iRetval = GetOpenFileName((LPOPENFILENAME)&OFN);
|
|||
|
break;
|
|||
|
case imiSaveAs:
|
|||
|
iRetval = GetSaveFileName((LPOPENFILENAME)&OFN);
|
|||
|
break;
|
|||
|
}
|
|||
|
UnlockData(0);
|
|||
|
|
|||
|
if (CommDlgExtendedError())
|
|||
|
{
|
|||
|
iRetval = FALSE;
|
|||
|
Error(IDPMTNoMemory);
|
|||
|
}
|
|||
|
|
|||
|
end:
|
|||
|
|
|||
|
if (iRetval)
|
|||
|
{
|
|||
|
lstrcpy(szLastDir,szFileName);
|
|||
|
szLastDir[OFN.nFileOffset] = 0;
|
|||
|
OFN.lpstrInitialDir = szLastDir;
|
|||
|
}
|
|||
|
|
|||
|
switch(iWhichOper)
|
|||
|
{
|
|||
|
case imiOpen:
|
|||
|
case imiSaveAs:
|
|||
|
if (lpfnOFNHook)
|
|||
|
FreeProcInstance(lpfnOFNHook);
|
|||
|
lpfnOFNHook = NULL;
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
return iRetval;
|
|||
|
}
|
|||
|
|
|||
|
#include "docdefs.h"
|
|||
|
|
|||
|
BOOL FAR PASCAL fnOFNHook(HWND hDlg, unsigned msg, WORD wParam, LONG lParam)
|
|||
|
{
|
|||
|
static unsigned wmListBoxChange;
|
|||
|
static unsigned wmCheckShare;
|
|||
|
extern int docCur;
|
|||
|
extern struct DOD (**hpdocdod)[];
|
|||
|
|
|||
|
switch (msg)
|
|||
|
{
|
|||
|
case WM_INITDIALOG:
|
|||
|
if (bSave)
|
|||
|
{
|
|||
|
char szTitle[CBMESSAGEMAX];
|
|||
|
|
|||
|
LoadString(hINSTANCE, IDSTRBackup, szTitle, sizeof(szTitle));
|
|||
|
SetDlgItemText(hDlg,chx1,szTitle);
|
|||
|
|
|||
|
CheckDlgButton(hDlg,chx1,OFN.Flags&OFN_READONLY);
|
|||
|
if (szFileName[0] == 0)
|
|||
|
SetDlgItemText(hDlg,edt1,"");
|
|||
|
}
|
|||
|
else // open
|
|||
|
wmCheckShare = RegisterWindowMessage(SHAREVISTRING);
|
|||
|
wmListBoxChange = RegisterWindowMessage(LBSELCHSTRING);
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
case WM_COMMAND:
|
|||
|
if (bSave)
|
|||
|
switch (wParam)
|
|||
|
{
|
|||
|
case chx1:
|
|||
|
/* handle checking the readonly button (I forget what does this do??)
|
|||
|
(we've changed readonly to be a "Backup" button) */
|
|||
|
return TRUE;
|
|||
|
break;
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
if ((msg == wmListBoxChange) && (wParam == cmb1))
|
|||
|
/* file type selected, set the default extension */
|
|||
|
OFN.lpstrDefExt = szDefExtensions[LOWORD(lParam)];
|
|||
|
else if ((msg == wmCheckShare) && !bSave)
|
|||
|
/* we want to be able to reopen current document */
|
|||
|
{
|
|||
|
if (!lstrcmpi((LPSTR)(**((**hpdocdod)[docCur].hszFile)),(LPSTR)lParam))
|
|||
|
return OFN_SHAREFALLTHROUGH;
|
|||
|
else
|
|||
|
return OFN_SHAREWARN;
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
}
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
static MakeFilterString(int iWhichOper)
|
|||
|
/* Construct the filter string for the Open, Save dialogs */
|
|||
|
/* assume fDefFileType is set */
|
|||
|
{
|
|||
|
LPSTR lpStr = szFilterSpec;
|
|||
|
char **ppstr = szDefExtensions;
|
|||
|
int nCount=1;
|
|||
|
|
|||
|
/* WRI */
|
|||
|
lstrcpy(lpStr, szWriDescr);
|
|||
|
lpStr += lstrlen(lpStr)+1;
|
|||
|
lstrcpy(lpStr, szWild);
|
|||
|
lstrcat(lpStr, szDefWriExtension);
|
|||
|
lpStr += lstrlen(lpStr)+1;
|
|||
|
*ppstr++ = szDefWriExtension;
|
|||
|
++nCount;
|
|||
|
|
|||
|
if (iWhichOper == imiSaveAs)
|
|||
|
{
|
|||
|
/* Old WRI (without objects) */
|
|||
|
vcObjects = ObjEnumInDoc(docCur,NULL);
|
|||
|
|
|||
|
if (vcObjects > 0)
|
|||
|
{
|
|||
|
lstrcpy(lpStr, szOldWriteDescr);
|
|||
|
lpStr += lstrlen(lpStr)+1;
|
|||
|
lstrcpy(lpStr, szWild);
|
|||
|
lstrcat(lpStr, szDefWriExtension);
|
|||
|
lpStr += lstrlen(lpStr)+1;
|
|||
|
*ppstr++ = szDefWriExtension;
|
|||
|
nOldWrite = nCount;
|
|||
|
++nCount;
|
|||
|
}
|
|||
|
else if (fDefFileType == SA_OLDWRITE)
|
|||
|
fDefFileType = SA_WRITE;
|
|||
|
}
|
|||
|
|
|||
|
#ifndef JAPAN // added 09 Jun. 1992 by Hiraisi
|
|||
|
/*
|
|||
|
* The reason is as follows.
|
|||
|
* We don't show the MS-WORD document at list files of type in OPEN
|
|||
|
* DIALOG and SAVE (AS) DIALOG in Japan because the file format of
|
|||
|
* MS-WORD(JPN) differs from that of WRITE.
|
|||
|
* But I modified only this part, because it is easy to restore when
|
|||
|
* we show the MS-WORD document at file type lists in those dialogs.
|
|||
|
*/
|
|||
|
/* DOC */
|
|||
|
lstrcpy(lpStr, szDocDescr);
|
|||
|
lpStr += lstrlen(lpStr)+1;
|
|||
|
lstrcpy(lpStr, szWild);
|
|||
|
lstrcat(lpStr, szDefDocExtension);
|
|||
|
lpStr += lstrlen(lpStr)+1;
|
|||
|
*ppstr++ = szDefDocExtension;
|
|||
|
nWord = nCount;
|
|||
|
++nCount;
|
|||
|
|
|||
|
/* DOC, Text only */
|
|||
|
if (iWhichOper == imiSaveAs)
|
|||
|
{
|
|||
|
lstrcpy(lpStr, szDocTxtDescr);
|
|||
|
lpStr += lstrlen(lpStr)+1;
|
|||
|
lstrcpy(lpStr, szWild);
|
|||
|
lstrcat(lpStr, szDefDocExtension);
|
|||
|
lpStr += lstrlen(lpStr)+1;
|
|||
|
*ppstr++ = szDefDocExtension;
|
|||
|
nWordText = nCount;
|
|||
|
++nCount;
|
|||
|
}
|
|||
|
#endif // !JAPAN
|
|||
|
|
|||
|
/* Text only */
|
|||
|
lstrcpy(lpStr, szTxtDescr);
|
|||
|
lpStr += lstrlen(lpStr)+1;
|
|||
|
lstrcpy(lpStr, szWild);
|
|||
|
lstrcat(lpStr, szDefTxtExtension);
|
|||
|
lpStr += lstrlen(lpStr)+1;
|
|||
|
*ppstr++ = szDefTxtExtension;
|
|||
|
nTextOnly = nCount;
|
|||
|
++nCount;
|
|||
|
|
|||
|
/* All files */
|
|||
|
lstrcpy(lpStr, szAllFilesDescr);
|
|||
|
lpStr += lstrlen(lpStr)+1;
|
|||
|
lstrcpy(lpStr, szWild);
|
|||
|
lstrcat(lpStr, "*");
|
|||
|
lpStr += lstrlen(lpStr)+1;
|
|||
|
*ppstr++ = NULL;
|
|||
|
++nCount;
|
|||
|
|
|||
|
*lpStr = 0;
|
|||
|
|
|||
|
switch(fDefFileType)
|
|||
|
{
|
|||
|
case SA_WORDTEXT:
|
|||
|
OFN.nFilterIndex = nWordText;
|
|||
|
break;
|
|||
|
case SA_TEXTONLY:
|
|||
|
OFN.nFilterIndex = nTextOnly;
|
|||
|
break;
|
|||
|
case SA_WORD :
|
|||
|
OFN.nFilterIndex = nWord;
|
|||
|
break;
|
|||
|
case SA_OLDWRITE:
|
|||
|
OFN.nFilterIndex = nOldWrite;
|
|||
|
break;
|
|||
|
case SA_WRITE :
|
|||
|
OFN.nFilterIndex = 1;
|
|||
|
break;
|
|||
|
}
|
|||
|
OFN.lpstrDefExt = szDefExtensions[OFN.nFilterIndex - 1];
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
DoOpenFilenameGet(LPSTR lpstrFilenameBuf)
|
|||
|
/* returns whether filename retrieved */
|
|||
|
{
|
|||
|
int nRetval;
|
|||
|
|
|||
|
if (nRetval = DoCommDlg(imiOpen))
|
|||
|
lstrcpy(lpstrFilenameBuf,(LPSTR)szFileName);
|
|||
|
|
|||
|
return nRetval;
|
|||
|
}
|
|||
|
|
|||
|
DoSaveAsFilenameGet(LPSTR lpstrDefault,LPSTR lpstrFilenameBuf,int *fBackup,int *fTextOnly,int *fWordFmt,int *fOldWriteFmt)
|
|||
|
/* Returns whether filename retrieved. Returns filename. If readonly is checked,
|
|||
|
returns if readonly is checked in fBackup. Returns file type selected in fTextOonly and
|
|||
|
fWordFmt. */
|
|||
|
{
|
|||
|
int nRetval;
|
|||
|
|
|||
|
lstrcpy(szFileName,lpstrDefault);
|
|||
|
|
|||
|
/* see MakeFilterSpec */
|
|||
|
if (*fTextOnly && *fWordFmt)
|
|||
|
fDefFileType = SA_WORDTEXT;
|
|||
|
else if (*fTextOnly)
|
|||
|
fDefFileType = SA_TEXTONLY;
|
|||
|
else if (*fWordFmt)
|
|||
|
fDefFileType = SA_WORD;
|
|||
|
else if (*fOldWriteFmt)
|
|||
|
fDefFileType = SA_OLDWRITE;
|
|||
|
else
|
|||
|
fDefFileType = SA_WRITE;
|
|||
|
|
|||
|
/* check or uncheck backup prompt */
|
|||
|
OFN.Flags |= (*fBackup) ? OFN_READONLY : 0;
|
|||
|
|
|||
|
if (nRetval = DoCommDlg(imiSaveAs))
|
|||
|
{
|
|||
|
lstrcpy(lpstrFilenameBuf,(LPSTR)szFileName);
|
|||
|
|
|||
|
if (OFN.nFilterIndex == 1)
|
|||
|
{
|
|||
|
*fTextOnly = *fWordFmt = FALSE;
|
|||
|
*fOldWriteFmt = FALSE;
|
|||
|
}
|
|||
|
else if (OFN.nFilterIndex == nOldWrite)
|
|||
|
{
|
|||
|
*fTextOnly = *fWordFmt = FALSE;
|
|||
|
*fOldWriteFmt = TRUE;
|
|||
|
}
|
|||
|
else if (OFN.nFilterIndex == nWord)
|
|||
|
{
|
|||
|
*fTextOnly = *fOldWriteFmt = FALSE;
|
|||
|
*fWordFmt = TRUE;
|
|||
|
}
|
|||
|
else if (OFN.nFilterIndex == nWordText)
|
|||
|
{
|
|||
|
*fTextOnly = *fWordFmt = TRUE;
|
|||
|
*fOldWriteFmt = FALSE;
|
|||
|
}
|
|||
|
else if (OFN.nFilterIndex == nTextOnly)
|
|||
|
{
|
|||
|
*fTextOnly = TRUE;
|
|||
|
*fWordFmt = *fOldWriteFmt = FALSE;
|
|||
|
}
|
|||
|
|
|||
|
*fBackup = OFN.Flags & OFN_READONLY;
|
|||
|
}
|
|||
|
|
|||
|
return nRetval;
|
|||
|
}
|
|||
|
|
|||
|
|