396 lines
9.2 KiB
C
396 lines
9.2 KiB
C
|
/************************************************************/
|
|||
|
/* Windows Write, Copyright 1985-1992 Microsoft Corporation */
|
|||
|
/************************************************************/
|
|||
|
|
|||
|
/* Quit.c -- MW quit commands (non-resident) */
|
|||
|
|
|||
|
#define NOGDICAPMASKS
|
|||
|
#define NOVIRTUALKEYCODES
|
|||
|
#define NOWINSTYLES
|
|||
|
#define NOSYSMETRICS
|
|||
|
#define NOMENUS
|
|||
|
#define NOICON
|
|||
|
#define NOKEYSTATE
|
|||
|
#define NOSYSCOMMANDS
|
|||
|
#define NORASTEROPS
|
|||
|
#define NOSHOWWINDOW
|
|||
|
//#define NOATOM
|
|||
|
#define NOBITMAP
|
|||
|
#define NOBRUSH
|
|||
|
#define NOCLIPBOARD
|
|||
|
#define NOCOLOR
|
|||
|
#define NOCREATESTRUCT
|
|||
|
#define NOCTLMGR
|
|||
|
#define NODRAWTEXT
|
|||
|
#define NOFONT
|
|||
|
#define NOHDC
|
|||
|
#define NOMB
|
|||
|
#define NOMEMMGR
|
|||
|
#define NOMENUS
|
|||
|
#define NOMETAFILE
|
|||
|
#define NOMINMAX
|
|||
|
//#define NOMSG
|
|||
|
#define NOOPENFILE
|
|||
|
#define NOPEN
|
|||
|
#define NOPOINT
|
|||
|
#define NORECT
|
|||
|
#define NOREGION
|
|||
|
#define NOSCROLL
|
|||
|
#define NOSOUND
|
|||
|
#define NOWH
|
|||
|
#define NOWINOFFSETS
|
|||
|
#define NOWNDCLASS
|
|||
|
#define NOCOMM
|
|||
|
#include <windows.h>
|
|||
|
|
|||
|
#include "mw.h"
|
|||
|
#include "str.h"
|
|||
|
#include "cmddefs.h"
|
|||
|
#define NOKCCODES
|
|||
|
#include "ch.h"
|
|||
|
#include "docdefs.h"
|
|||
|
#include "editdefs.h"
|
|||
|
#include "filedefs.h"
|
|||
|
#include "wwdefs.h"
|
|||
|
#include "propdefs.h"
|
|||
|
#include "dlgdefs.h"
|
|||
|
#include "commdlg.h"
|
|||
|
#if defined(OLE)
|
|||
|
#include "obj.h"
|
|||
|
#endif
|
|||
|
|
|||
|
#include "debug.h"
|
|||
|
|
|||
|
extern PRINTDLG PD; /* Common print dlg structure, initialized in the init code */
|
|||
|
extern struct FCB (**hpfnfcb)[];
|
|||
|
extern int fnMac;
|
|||
|
extern struct WWD rgwwd[];
|
|||
|
extern int wwMac;
|
|||
|
extern struct DOD (**hpdocdod)[];
|
|||
|
extern int docCur; /* Document in current ww */
|
|||
|
extern int vfExtScrap;
|
|||
|
extern int rgval[];
|
|||
|
extern int docMac;
|
|||
|
extern int vfBuffersDirty;
|
|||
|
extern int vdxaPaper;
|
|||
|
extern int vdyaPaper;
|
|||
|
extern int ferror;
|
|||
|
extern int docScrap;
|
|||
|
extern struct PAP vpapAbs;
|
|||
|
extern int vccpFetch;
|
|||
|
extern CHAR *vpchFetch;
|
|||
|
extern int vfScrapIsPic;
|
|||
|
extern typeCP vcpLimParaCache;
|
|||
|
|
|||
|
|
|||
|
FMmwClose( hwnd )
|
|||
|
HWND hwnd;
|
|||
|
{ /* Handle WM_CLOSE message sent to parent window. Return FALSE if
|
|||
|
the CLOSE should be aborted, TRUE if it is OK to go ahead
|
|||
|
and CLOSE (DestroyWindow is called in this case). */
|
|||
|
|
|||
|
extern int vfDead;
|
|||
|
extern VOID (FAR PASCAL *lpfnRegisterPenApp)(WORD, BOOL);
|
|||
|
extern WORD fPrintOnly;
|
|||
|
|
|||
|
if (fPrintOnly || FConfirmSave())
|
|||
|
{
|
|||
|
extern int vfOwnClipboard;
|
|||
|
|
|||
|
FreeMemoryDC( FALSE ); /* To give FRenderAll max memory */
|
|||
|
|
|||
|
/* Render Data BEFORE the world collapses around our ears */
|
|||
|
if (vfOwnClipboard)
|
|||
|
{ /* We are the clipboard owner -- render the clipboard contents in
|
|||
|
all datatypes that we know about */
|
|||
|
if (!FRenderAll())
|
|||
|
/* Render failed; abort close */
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
#if defined(OLE)
|
|||
|
if (ObjClosingDoc(docCur,NULL)) // do this *after* call to RenderAll!
|
|||
|
return FALSE;
|
|||
|
#endif
|
|||
|
|
|||
|
/* pen windows */
|
|||
|
if (lpfnRegisterPenApp) // global
|
|||
|
(*lpfnRegisterPenApp)((WORD)1, fFalse); // deregister
|
|||
|
|
|||
|
if (PD.hDevMode)
|
|||
|
{
|
|||
|
/* We'd opened a Win3 printer driver before, now discard */
|
|||
|
GlobalFree(PD.hDevMode);
|
|||
|
PD.hDevMode = NULL;
|
|||
|
}
|
|||
|
vfDead = TRUE; /* So we don't repaint or idle anymore */
|
|||
|
|
|||
|
DestroyWindow( hwnd );
|
|||
|
KillTempFiles( FALSE );
|
|||
|
return TRUE; /* OK to close window */
|
|||
|
}
|
|||
|
|
|||
|
return FALSE; /* ABort the close */
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
MmwDestroy()
|
|||
|
{ /* Parent window is being destroyed */
|
|||
|
extern HWND hParentWw;
|
|||
|
extern HWND vhWndPageInfo;
|
|||
|
extern HDC vhDCRuler;
|
|||
|
extern HBRUSH hbrBkgrnd;
|
|||
|
extern HFONT vhfPageInfo;
|
|||
|
extern HBITMAP hbmBtn;
|
|||
|
extern HBITMAP hbmMark;
|
|||
|
#ifdef JAPAN //01/21/93
|
|||
|
extern HANDLE hszNoMemorySel;
|
|||
|
#endif
|
|||
|
extern HANDLE hszNoMemory;
|
|||
|
extern HANDLE hszDirtyDoc;
|
|||
|
extern HANDLE hszCantPrint;
|
|||
|
extern HANDLE hszPRFAIL;
|
|||
|
|
|||
|
HBRUSH hbr = GetStockObject( WHITE_BRUSH );
|
|||
|
HDC hDC = GetDC( vhWndPageInfo );
|
|||
|
|
|||
|
#ifdef WIN30
|
|||
|
{
|
|||
|
/* We use the help engine so advise it we're going far far away */
|
|||
|
|
|||
|
CHAR sz[cchMaxFile];
|
|||
|
PchFillPchId(sz, IDSTRHELPF, sizeof(sz));
|
|||
|
WinHelp(hParentWw, (LPSTR)sz, HELP_QUIT, NULL);
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
FreeMemoryDC( TRUE );
|
|||
|
SelectObject( GetDC( hParentWw ), hbr );
|
|||
|
SelectObject( wwdCurrentDoc.hDC, hbr );
|
|||
|
if (vhDCRuler != NULL)
|
|||
|
{
|
|||
|
SelectObject( vhDCRuler, hbr );
|
|||
|
}
|
|||
|
DeleteObject( hbrBkgrnd );
|
|||
|
|
|||
|
DeleteObject( SelectObject( hDC, hbr ) );
|
|||
|
if (vhfPageInfo != NULL)
|
|||
|
{
|
|||
|
DeleteObject( SelectObject( hDC, GetStockObject( SYSTEM_FONT ) ) );
|
|||
|
}
|
|||
|
|
|||
|
if (hbmBtn != NULL)
|
|||
|
{
|
|||
|
DeleteObject( hbmBtn );
|
|||
|
}
|
|||
|
if (hbmMark != NULL)
|
|||
|
{
|
|||
|
DeleteObject( hbmMark );
|
|||
|
}
|
|||
|
|
|||
|
#ifdef JAPAN //01/21/93
|
|||
|
if (hszNoMemorySel != NULL)
|
|||
|
{
|
|||
|
GlobalFree( hszNoMemorySel );
|
|||
|
}
|
|||
|
#endif
|
|||
|
if (hszNoMemory != NULL)
|
|||
|
{
|
|||
|
GlobalFree( hszNoMemory );
|
|||
|
}
|
|||
|
if (hszDirtyDoc != NULL)
|
|||
|
{
|
|||
|
GlobalFree( hszDirtyDoc );
|
|||
|
}
|
|||
|
if (hszCantPrint != NULL)
|
|||
|
{
|
|||
|
GlobalFree( hszCantPrint );
|
|||
|
}
|
|||
|
if (hszPRFAIL != NULL)
|
|||
|
{
|
|||
|
GlobalFree( hszPRFAIL );
|
|||
|
}
|
|||
|
|
|||
|
#if defined(JAPAN) & defined(DBCS_IME)
|
|||
|
/* Release Ime communication memory */
|
|||
|
{
|
|||
|
extern HANDLE hImeMem;
|
|||
|
extern HANDLE hImeSetFont;
|
|||
|
|
|||
|
if (hImeMem)
|
|||
|
GlobalFree(hImeMem);
|
|||
|
|
|||
|
if(hImeSetFont != NULL) {
|
|||
|
HDC hdc;
|
|||
|
HANDLE oldhfont;
|
|||
|
|
|||
|
hdc = GetDC(NULL);
|
|||
|
oldhfont = SelectObject(hdc,hImeSetFont);
|
|||
|
SelectObject(hdc,oldhfont);
|
|||
|
DeleteObject(hImeSetFont);
|
|||
|
ReleaseDC(NULL, hdc);
|
|||
|
}
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
#if defined(JAPAN) & defined(IME_HIDDEN) //IME3.1J
|
|||
|
//IR_UNDETERMINE
|
|||
|
/* Release Ime Undetermin string & attrib memory */
|
|||
|
{
|
|||
|
extern HANDLE hImeUnAttrib;
|
|||
|
extern HANDLE hImeUnString;
|
|||
|
extern CHAR szWriteProduct[];
|
|||
|
extern CHAR szImeHidden[];
|
|||
|
extern int vfImeHidden; /*T-HIROYN ImeHidden Mode flag*/
|
|||
|
|
|||
|
if (hImeUnAttrib)
|
|||
|
GlobalFree(hImeUnAttrib);
|
|||
|
|
|||
|
if (hImeUnString)
|
|||
|
GlobalFree(hImeUnString);
|
|||
|
|
|||
|
WriteProfileString((LPSTR)szWriteProduct, (LPSTR)szImeHidden,
|
|||
|
vfImeHidden ? (LPSTR)"1" : (LPSTR)"0" );
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
#ifdef FONT_KLUDGE
|
|||
|
RemoveFontResource( (LPSTR)"helv.fon" );
|
|||
|
#endif /* FONT_KLUDGE */
|
|||
|
|
|||
|
#if defined(OLE)
|
|||
|
ObjShutDown();
|
|||
|
#endif
|
|||
|
|
|||
|
PostQuitMessage( 0 );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
KillTempFiles( fEndSession )
|
|||
|
int fEndSession;
|
|||
|
{ /* Kill off all of the temp files. MEMO cannot run after this is done */
|
|||
|
int f;
|
|||
|
int fn, fnT;
|
|||
|
|
|||
|
CloseEveryRfn( TRUE );
|
|||
|
|
|||
|
/* Delete all temp files */
|
|||
|
|
|||
|
/* loop thru the FCB table looking for files that should be deleted before
|
|||
|
we quit. */
|
|||
|
for (fn = 0; fn < fnMac; fn++)
|
|||
|
{
|
|||
|
int fpe;
|
|||
|
struct FCB *pfcb = &(**hpfnfcb)[fn];
|
|||
|
if (pfcb->rfn != rfnFree && pfcb->fDelete)
|
|||
|
/* Having found a file that must be deleted, delete it */
|
|||
|
{
|
|||
|
/* This should be FDeleteFile all of the time, but we don't
|
|||
|
want to add a window enumeration during End Session
|
|||
|
at this very late stage of the project */
|
|||
|
|
|||
|
if (fEndSession)
|
|||
|
FpeDeleteSzFfname( **pfcb->hszFile );
|
|||
|
else
|
|||
|
FDeleteFile( **pfcb->hszFile );
|
|||
|
(**hpfnfcb) [fn].rfn = rfnFree;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#ifdef ENABLE /* Part of "Save All", not needed */
|
|||
|
int CnfrmSz(sz)
|
|||
|
CHAR *sz;
|
|||
|
{
|
|||
|
extern AlertBoxSz2();
|
|||
|
int cch;
|
|||
|
|
|||
|
cch = CchFillSzId(&stBuf[1], IDPMTSaveChanges);
|
|||
|
stBuf[++cch] = chSpace;
|
|||
|
cch += CchCopySz(sz, &stBuf[cch+1]);
|
|||
|
stBuf[++cch] = chQMark;
|
|||
|
stBuf[0] = cch;
|
|||
|
return(AlertBoxSz2(stBuf));
|
|||
|
}
|
|||
|
#endif /* ENABLE */
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#ifdef ENABLE /* Not needed, only 1 document in MEMO */
|
|||
|
int
|
|||
|
FAllDocsClean()
|
|||
|
{
|
|||
|
int fAllClean = true;
|
|||
|
int dty;
|
|||
|
int doc;
|
|||
|
|
|||
|
if (vfBuffersDirty)
|
|||
|
return false;
|
|||
|
|
|||
|
for (doc = 0; doc < docMac; ++doc)
|
|||
|
{
|
|||
|
dty = (**hpdocdod)[doc].dty;
|
|||
|
if ((dty != dtyNormal && dty != dtySsht) ||
|
|||
|
(**hpdocdod)[doc].hpctb == 0 || !(**hpdocdod)[doc].fDirty)
|
|||
|
continue;
|
|||
|
fAllClean = false;
|
|||
|
}
|
|||
|
return fAllClean;
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#ifdef ENABLE /* We don't support saving between-session state info */
|
|||
|
WriteStateInfo()
|
|||
|
{ /* Write out state information into Word resource file */
|
|||
|
struct STATEINFO stiTemp;
|
|||
|
HANDLE hRes, hData;
|
|||
|
|
|||
|
UseResFile(vresSystem);
|
|||
|
|
|||
|
SetWords(&stiTemp,0,cwSTATEINFO);
|
|||
|
|
|||
|
stiTemp.sf.fScrnDraftStor = vfScrnDraft;
|
|||
|
stiTemp.sf.fPrintModeStor = vfPrintMode;
|
|||
|
stiTemp.sf.fDriverDefaultOK = vfDriverDefaultOK;
|
|||
|
stiTemp.utCurStor = utCur;
|
|||
|
stiTemp.vcDaisyPitchStor = vcDaisyPitch;
|
|||
|
stiTemp.vBaudRateStor =vBaudRate;
|
|||
|
stiTemp.vPortNumStor = vPortNum;
|
|||
|
if (hszPrdFile != 0)
|
|||
|
{/* User has a Word printer driver selected currently */
|
|||
|
int cch = CchCopySz(**hszPrdFile,stiTemp.rgchPrd);
|
|||
|
stiTemp.vdxaPaperStor = vdxaPaper;
|
|||
|
stiTemp.vdyaPaperStor = vdyaPaper;
|
|||
|
stiTemp.sf.fPrintStateOK = true;
|
|||
|
}
|
|||
|
else
|
|||
|
stiTemp.sf.fPrintStateOK = false;
|
|||
|
hRes = GetResource(WINF, 1);
|
|||
|
if (hRes != 0L)
|
|||
|
RmveResource(hRes);
|
|||
|
hData = NewHandle(0);
|
|||
|
if (HandleAppendQ(hData,&stiTemp,sizeof(stiTemp)))
|
|||
|
AddResource(hData, WINF, 1, "");
|
|||
|
}
|
|||
|
#endif /* ENABLE */
|
|||
|
|
|||
|
|
|||
|
fnQuit(hWnd)
|
|||
|
/* user has selected Quit menu item... */
|
|||
|
HWND hWnd;
|
|||
|
{
|
|||
|
SendMessage(hWnd, WM_CLOSE, 0, 0L);
|
|||
|
}
|
|||
|
|