337 lines
9 KiB
C
337 lines
9 KiB
C
/************************************************************/
|
||
/* Windows Write, Copyright 1985-1992 Microsoft Corporation */
|
||
/************************************************************/
|
||
|
||
#define NOGDICAPMASKS
|
||
#define NOCLIPBOARD
|
||
#define NOMENUS
|
||
#define NOSOUND
|
||
#define NOCOMM
|
||
#define NOOPENFILE
|
||
#define NORESOURCE
|
||
#define NODRAWTEXT
|
||
#define NOSOUND
|
||
#define NOCOMM
|
||
#include <windows.h>
|
||
|
||
#include "mw.h"
|
||
#include "winddefs.h"
|
||
#include "cmddefs.h"
|
||
#include "wwdefs.h"
|
||
#include "dispdefs.h"
|
||
#include "docdefs.h"
|
||
#include "debug.h"
|
||
|
||
extern HWND vhWnd;
|
||
extern HWND vhWndSizeBox;
|
||
extern HWND vhWndRuler;
|
||
extern HWND vhWndPageInfo;
|
||
extern HWND vhWndCancelPrint;
|
||
extern HDC vhDCPrinter;
|
||
extern HFONT vhfPageInfo;
|
||
extern HCURSOR vhcArrow;
|
||
extern HCURSOR vhcIBeam;
|
||
extern HCURSOR vhcBarCur;
|
||
extern struct WWD rgwwd[];
|
||
extern struct WWD *pwwdCur;
|
||
extern HANDLE hMmwModInstance; /* handle to own module instance */
|
||
extern int vfShiftKey;
|
||
extern int vfCommandKey;
|
||
extern int vfOptionKey;
|
||
extern int vfDoubleClick;
|
||
extern struct SEL selCur;
|
||
extern long rgbBkgrnd;
|
||
extern long rgbText;
|
||
extern HBRUSH hbrBkgrnd;
|
||
extern long ropErase;
|
||
extern int vfIconic;
|
||
extern int vfLargeSys;
|
||
extern int dxpRuler;
|
||
extern HMENU vhMenu;
|
||
|
||
#ifdef JAPAN // Indicate whether to show IME convert window
|
||
extern BOOL ConvertEnable;
|
||
#endif
|
||
|
||
|
||
|
||
void MmwSize(hWnd, cxpNew, cypNew, code)
|
||
HWND hWnd;
|
||
int cxpNew;
|
||
int cypNew;
|
||
WORD code;
|
||
{
|
||
if (code == SIZEICONIC)
|
||
{
|
||
#ifdef NOT_RECOMMENDED
|
||
/* This should already be done by Windows itself!
|
||
Moving here could cause confusion */
|
||
|
||
/* Resize the document window. */
|
||
if (wwdCurrentDoc.wwptr != NULL)
|
||
MoveWindow(wwdCurrentDoc.wwptr, 0, 0, 0, 0, FALSE);
|
||
#endif
|
||
|
||
/* Deselect our fonts so that they can move if necessary. */
|
||
ResetFont(FALSE);
|
||
if (vhWndCancelPrint == NULL)
|
||
{
|
||
/* Reset the printer font iff we are not printing or repaginating.
|
||
*/
|
||
ResetFont(TRUE);
|
||
}
|
||
if (!vfLargeSys && vhfPageInfo != NULL)
|
||
{
|
||
DeleteObject(SelectObject(GetDC(vhWndPageInfo),
|
||
GetStockObject(SYSTEM_FONT)));
|
||
vhfPageInfo = NULL;
|
||
}
|
||
|
||
vfIconic = TRUE;
|
||
}
|
||
else
|
||
{
|
||
int dxpBorder = GetSystemMetrics(SM_CXBORDER);
|
||
int dypBorder = GetSystemMetrics(SM_CYBORDER);
|
||
int xpMac = cxpNew - dxpScrlBar + dxpBorder;
|
||
int ypMac = cypNew - dypScrlBar + dypBorder;
|
||
int dypOverlap = 0;
|
||
|
||
/* If we are coming back from being iconic, then reestablish the printer
|
||
DC. */
|
||
if (vfIconic && vhDCPrinter == NULL)
|
||
{
|
||
GetPrinterDC(FALSE);
|
||
}
|
||
|
||
/* Reposition all of the windows. */
|
||
MoveWindow(wwdCurrentDoc.hVScrBar, xpMac, -dypBorder, dxpScrlBar, ypMac
|
||
+ (dypBorder << 1), TRUE);
|
||
MoveWindow(wwdCurrentDoc.hHScrBar, dxpInfoSize, ypMac, cxpNew -
|
||
dxpInfoSize - dxpScrlBar + (dxpBorder << 1), dypScrlBar, TRUE);
|
||
#ifndef NOMORESIZEBOX
|
||
MoveWindow(vhWndSizeBox, xpMac, ypMac, dxpScrlBar, dypScrlBar, TRUE);
|
||
#endif
|
||
MoveWindow(vhWndPageInfo, 0, ypMac, dxpInfoSize, dypScrlBar, TRUE);
|
||
if (vhWndRuler != NULL)
|
||
{
|
||
dypOverlap = dypRuler - (wwdCurrentDoc.ypMin - 1);
|
||
MoveWindow(vhWndRuler, 0, 0, xpMac, dypRuler, TRUE);
|
||
}
|
||
|
||
/* Resize the document window. */
|
||
if (wwdCurrentDoc.wwptr != NULL)
|
||
{
|
||
MoveWindow(wwdCurrentDoc.wwptr, 0, dypOverlap, xpMac, ypMac -
|
||
dypOverlap, FALSE);
|
||
|
||
/* Validate the area of the document window that is overlapped by
|
||
the ruler if necessary. */
|
||
if (vhWndRuler != (HWND)NULL)
|
||
{
|
||
RECT rc;
|
||
|
||
rc.left = rc.top = 0;
|
||
rc.right = dxpRuler;
|
||
rc.bottom = wwdCurrentDoc.ypMin;
|
||
ValidateRect(wwdCurrentDoc.wwptr, (LPRECT)&rc);
|
||
}
|
||
|
||
}
|
||
|
||
vhMenu = GetMenu(hWnd); // kludge patch cause Write does its own
|
||
// accelerator handling (6.24.91) v-dougk
|
||
vfIconic = FALSE;
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
void MdocSize(hWnd, cxpNew, cypNew, code)
|
||
HWND hWnd;
|
||
int cxpNew;
|
||
int cypNew;
|
||
WORD code;
|
||
{
|
||
extern int wwCur;
|
||
extern int vfSeeSel;
|
||
extern int vfInitializing;
|
||
|
||
typeCP cp;
|
||
struct EDL *pedl;
|
||
|
||
/* Let's start thing off with a couple of assumptions. */
|
||
Assert( code == SIZENORMAL || code == SIZEFULLSCREEN );
|
||
Assert( wwdCurrentDoc.wwptr == hWnd );
|
||
|
||
#ifdef ENABLE /* We repaint completely on resize */
|
||
if (cypNew > wwdCurrentDoc.ypMac)
|
||
/* We are growing vertically, mark exposed area invalid
|
||
so UpdateWw does not try to recycle a partial line
|
||
at the bottom of the window. */
|
||
InvalBand( &wwdCurrentDoc, wwdCurrentDoc.ypMac, cypNew );
|
||
#endif
|
||
if (wwCur != wwNil)
|
||
TrashWw( wwCur );
|
||
|
||
/* Mark the window dirty so that dlMac gets reset according to the new
|
||
window size */
|
||
wwdCurrentDoc.fDirty = TRUE;
|
||
|
||
wwdCurrentDoc.xpMac = cxpNew;
|
||
wwdCurrentDoc.ypMac = cypNew;
|
||
|
||
/* If minimizing the window, we are done */
|
||
if ((cxpNew == 0) && (cypNew == 0))
|
||
return;
|
||
|
||
/* If the selection was visible before, so shall it be hereafter */
|
||
if ( ((cp = CpEdge()) >= wwdCurrentDoc.cpFirst) &&
|
||
(wwdCurrentDoc.dlMac > 0) &&
|
||
(cp < (pedl =
|
||
&(**wwdCurrentDoc.hdndl)[wwdCurrentDoc.dlMac - 1])->cpMin +
|
||
pedl->dcpMac))
|
||
{
|
||
/* Normally, we would just set vfSeeSel and wait for Idle to
|
||
put the selection in view. However, we can be resized even
|
||
when we are not the current app, and in that case Idle will not
|
||
get called soon enough. So, we scroll the selection into view here */
|
||
|
||
if (!vfInitializing)
|
||
{ /* Avoid the peril of trying to do this operation too early */
|
||
extern int wwCur;
|
||
|
||
UpdateWw( wwCur, FALSE ); /* To lock in the new dlMac */
|
||
PutCpInWwVert( cp );
|
||
UpdateWw( wwCur, FALSE );
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
|
||
FreeMemoryDC( fPrinterToo )
|
||
BOOL fPrinterToo;
|
||
{
|
||
extern HDC vhMDC;
|
||
extern int dxpbmMDC;
|
||
extern int dypbmMDC;
|
||
extern HBITMAP hbmNull;
|
||
|
||
/* Delete the memory DC if necessary. */
|
||
if ( vhMDC != NULL )
|
||
{
|
||
/* Delete the old bitmap if necessary. */
|
||
if (dxpbmMDC != 0 || dypbmMDC != 0)
|
||
{
|
||
DeleteObject( SelectObject( vhMDC, hbmNull ) );
|
||
dxpbmMDC = dypbmMDC = 0;
|
||
}
|
||
/* Discard the screen fonts. */
|
||
FreeFonts( TRUE, FALSE );
|
||
|
||
/* Delete the memory DC. */
|
||
DeleteDC( vhMDC );
|
||
vhMDC = NULL;
|
||
}
|
||
|
||
/* Also, delete the DC for the printer width, if necessary. */
|
||
if ( fPrinterToo )
|
||
{
|
||
FreePrinterDC();
|
||
}
|
||
}
|
||
|
||
|
||
FreePrinterDC()
|
||
{
|
||
extern int vdocBitmapCache;
|
||
extern HDC vhDCPrinter;
|
||
extern BOOL vfPrinterValid;
|
||
extern HWND hParentWw;
|
||
|
||
/* Delete the printer DC if necessary. */
|
||
if ( vhDCPrinter != NULL )
|
||
{
|
||
/* Discard the printer fonts. */
|
||
FreeFonts( FALSE, TRUE );
|
||
|
||
if ( vfPrinterValid )
|
||
{
|
||
/* This is a real printer DC; delete it. */
|
||
DeleteDC( vhDCPrinter );
|
||
}
|
||
else
|
||
{
|
||
/* This is really the screen DC; it must be released. */
|
||
ReleaseDC( hParentWw, vhDCPrinter );
|
||
}
|
||
vhDCPrinter = NULL;
|
||
|
||
/* Free the cached bitmap because it was stretched for the display to
|
||
reflect its appearance on the printer. */
|
||
if (vdocBitmapCache != docNil)
|
||
FreeBitmapCache();
|
||
}
|
||
}
|
||
|
||
|
||
void MdocGetFocus(hWnd, hWndPrevFocus)
|
||
HWND hWnd;
|
||
HWND hWndPrevFocus;
|
||
{
|
||
extern int vfInsertOn;
|
||
extern int vfFocus;
|
||
|
||
if (!vfFocus)
|
||
{
|
||
vfFocus = TRUE;
|
||
/* Start up a timer event to blink the caret */
|
||
/* MdocWndProc gets notified with a message of WM_TIMER */
|
||
/* every wCaretBlinkTime milliseconds */
|
||
SetTimer( hWnd, tidCaret, GetCaretBlinkTime(), (FARPROC)NULL );
|
||
|
||
/* Set the caret on right away, for looks */
|
||
if (!vfInsertOn)
|
||
MdocTimer( hWnd, tidCaret );
|
||
|
||
/* Update globals that tell us the state of the lock/shift keys */
|
||
SetShiftFlags();
|
||
}
|
||
#ifdef JAPAN
|
||
ConvertEnable = TRUE;
|
||
IMEManage( FALSE );
|
||
#endif
|
||
}
|
||
|
||
|
||
|
||
void MdocLoseFocus(hWnd, hWndNewFocus)
|
||
HWND hWnd;
|
||
HWND hWndNewFocus;
|
||
{
|
||
extern int vfFocus;
|
||
|
||
if (vfFocus)
|
||
{
|
||
extern int vfGotoKeyMode;
|
||
|
||
/* Cancel caret blink timer event & clear the caret */
|
||
KillTimer( hWnd, tidCaret );
|
||
ClearInsertLine();
|
||
/* Free up the memory DC */
|
||
/* We interpret the loss of focus as a signal that */
|
||
/* some other app will be using resources */
|
||
vfFocus = FALSE;
|
||
vfGotoKeyMode = FALSE; /* Cancel GOTO key modifier */
|
||
/* Close all files on removable media in case the guy swaps disks */
|
||
CloseEveryRfn( FALSE );
|
||
}
|
||
#ifdef JAPAN
|
||
ConvertEnable = FALSE;
|
||
IMEManage( TRUE );
|
||
#endif
|
||
}
|
||
|