|
|
/************************************************************/ /* Windows Write, Copyright 1985-1992 Microsoft Corporation */ /************************************************************/
//#define NOATOM
#define NOBITMAP
#define NOBRUSH
#define NOCLIPBOARD
#define NOCOMM
#define NOCREATESTRUCT
#define NODRAWTEXT
#define NOGDICAPMASKS
#define NOICON
#define NOKEYSTATE
#define NOMB
#define NOMEMMGR
//#define NOMENUS
#define NOMETAFILE
#define NOMINMAX
#define NOOPENFILE
#define NOPEN
#define NOREGION
//#define NOSHOWWINDOW
#define NOSOUND
#define NOSYSCOMMANDS
#define NOSYSMETRICS
#define NOVIRTUALKEYCODES
#define NOWH
#define NOWINOFFSETS
#define NOWINSTYLES
#define NOWNDCLASS
#include <windows.h>
#include "mw.h"
#define NOUAC
#include "cmddefs.h"
#include "dispdefs.h"
#include "wwdefs.h"
#define NOSTRUNDO
#include "str.h"
#include "menudefs.h"
#include "prmdefs.h"
#include "propdefs.h"
#include "debug.h"
#include "fontdefs.h"
#include "preload.h"
#include "winddefs.h"
#define NOIDISAVEPRINT
#define NOIDIFORMATS
#include "dlgdefs.h"
#if defined(OLE)
#include "obj.h"
#endif
static void DrawResizeHole(HWND hWnd, HDC hDC);
extern HANDLE hMmwModInstance; /* handle to it's own module instance */ extern HWND hParentWw; /* handle to parent's window */ extern HWND vhWndMsgBoxParent; extern HCURSOR vhcHourGlass; extern HCURSOR vhcIBeam; extern HCURSOR vhcArrow; extern HMENU vhMenu; extern MSG vmsgLast; extern FARPROC lpDialogHelp;
extern struct WWD rgwwd[]; extern struct WWD *pwwdCur; extern int wwCur; extern int vfInitializing; extern int vfInsertOn; extern int vfSeeSel; extern int vfSelHidden; extern int vfDeactByOtherApp; extern int vfDownClick; extern int vfCursorVisible; extern int vfMouseExist; extern int flashID; extern int ferror; extern typeCP cpMacCur; extern struct SEL selCur; extern CHAR stBuf[]; extern HBITMAP hbmNull; extern CHAR szWindows[]; extern CHAR szDevices[]; extern CHAR szIntl[]; extern WORD fPrintOnly;
#ifdef RULERALSO
extern BOOL vfDisableMenus; #endif /* RULERALSO */
#ifdef DEBUG
#define STATIC
#else /* not DEBUG */
#define STATIC static
#endif /* not DEBUG */
CHAR **hszDevmodeChangeParam = NULL; BOOL vfDevmodeChange = fFalse; int wWininiChange = 0;
BOOL vfDead = FALSE; BOOL vfIconic = FALSE; /*int vcActiveCount = 0; 0 or 1 for active/deactive count */
void MmwCreate(HWND, LONG); void NEAR MmwPaint(HWND); void MmwSize(HWND, int, int, WORD); void MmwCommand(HWND, WORD, HWND, WORD); void MmwVertScroll(HWND, WORD, int); void NEAR MmwHorzScroll(HWND, WORD, int);
int PASCAL WinMain( hInstance, hPrevInstance, lpszCmdLine, cmdShow ) HANDLE hInstance, hPrevInstance; LPSTR lpszCmdLine; int cmdShow; { /* Set up all manner of windows-related data; create parent (menu)
window and child (document) window */
if (!FInitWinInfo( hInstance, hPrevInstance, lpszCmdLine, cmdShow )) /* Could not initialize; WRITE fails */ { return FALSE; }
if (fPrintOnly) { UpdateDisplay(FALSE); fnPrPrinter(); FMmwClose( hParentWw ); DeleteObject( hbmNull ); _exit( vmsgLast.wParam ); } else MainLoop();
DeleteObject( hbmNull ); _exit( vmsgLast.wParam ); }
long FAR PASCAL MmwWndProc(hWnd, message, wParam, lParam) HWND hWnd; unsigned message; WORD wParam; LONG lParam; { extern int vfCloseFilesInDialog; extern long ropErase; extern int vfLargeSys; extern HDC vhDCPrinter; extern HWND vhWndCancelPrint; extern HWND vhWndPageInfo; extern HFONT vhfPageInfo; extern BOOL vfWinFailure; CHAR szT[cchMaxSz]; long lReturn = 0L;
#if defined(JAPAN) & defined(IME_HIDDEN) //IME3.1J
//IR_UNDETERMINE
extern HWND vhWnd; /* WINDOWS: Handle of the current document display window*/ extern typeCP selUncpFirst; extern typeCP selUncpLim; if(selUncpFirst < selUncpLim) { switch (message) { case WM_INITMENU: case WM_VSCROLL: case WM_HSCROLL: UndetermineToDetermine(vhWnd); break; case WM_SIZE: if(SIZEICONIC == wParam ) UndetermineToDetermine(vhWnd); default: break; //Fall
} } #endif
switch (message) { case WM_MENUSELECT: SetShiftFlags(); break;
case WM_CREATE: /* Window's being created; lParam contains lpParam field
** passed to CreateWindow */ MmwCreate(hWnd, lParam); break;
case WM_PAINT: /* Time to repaint this window. */ MmwPaint(hWnd); break;
#if defined(OLE)
case WM_DROPFILES: /* We got dropped on, so bring ourselves to the top */ BringWindowToTop(hWnd); #ifdef DEBUG
OutputDebugString("Dropping on main window\r\n"); #endif
ObjGetDrop(wParam,TRUE); break; #endif
case WM_INITMENU: /* setup the pull down menu before being drawn */ /* wParam is the top level menu handle */ vhMenu = (HMENU)wParam; break;
case WM_INITMENUPOPUP: /* setup the pull down menu before being drawn */ /* wParam is the popup menu handle */ /* LOWORD(lParam) = index of popup in main menu */ /* HIWORD(lParam) = 1 if system menu, 0 if application main menu */ EndLongOp(vhcArrow); if (HIWORD(lParam) == 0) { /* we care for the application main menu only */ #ifdef CYCLESTOBURN
switch (LOWORD(lParam)) { default: break; case EDIT: PreloadCodeTsk( tskScrap ); case CHARACTER: PreloadCodeTsk( tskFormat ); break; } #endif
SetAppMenu((HMENU)wParam, LOWORD(lParam)); } /* Turn on the cursor so we can see where it is */ if (!vfInsertOn && selCur.cpFirst == selCur.cpLim) ToggleSel( selCur.cpFirst, selCur.cpFirst, TRUE ); break;
case WM_ACTIVATE: /* We are becoming the active window iff wParam is non-0 */ /* HIWORD( lParam ) is true iff the window is iconic */ if (wParam && !HIWORD(lParam) #if 0
#if defined(OLE)
&& !nBlocking #endif
#endif
&& IsWindowEnabled(wwdCurrentDoc.wwptr)) { SetFocus( wwdCurrentDoc.wwptr ); vhWndMsgBoxParent = hParentWw; } if (wParam) { vfDeactByOtherApp = FALSE; /* this is to conquer a windows' bug */ }
/* did we receive a devmode/winini change that we should process now? */ if (wWininiChange != 0) { Assert(wWininiChange > 0 && wWininiChange < wWininiChangeMax); PostMessage( hWnd, wWndMsgSysChange, WM_WININICHANGE, (LONG) wWininiChange ); }
if (vfDevmodeChange) { Assert(hszDevmodeChangeParam != NULL); PostMessage( hWnd, wWndMsgSysChange, WM_DEVMODECHANGE, (LONG) 0 ); vfDevmodeChange = fFalse; }
if (!vfInitializing && vfCursorVisible) ShowCursor(wParam); break;
case WM_ACTIVATEAPP: /* We are activated or deactivated by another application */ if (wParam == 0) /* being deactivated */ { vfDeactByOtherApp = TRUE; vfDownClick = FALSE; /* hide selection if needed */ if (!vfSelHidden) { UpdateWindow(hParentWw); ToggleSel(selCur.cpFirst, selCur.cpLim, FALSE); vfSelHidden = TRUE; }
/* 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; } } else /* being activated */ { vfDeactByOtherApp = vfWinFailure = FALSE;
#ifndef WIN30
/* We get into a recursive loop in the situation where we
have a bad/invalid/nonexistent printer driver because GetPrinterDC() calls CreateIC() which will end up sending another WM_ACTIVATEAPP! I think the machinery in Write work just fine with a null vhDCPrinter, and will retry again when it needs to do so ..pault 9/28/89 */
/* get a DC for the current printer if necessary */ if (vhDCPrinter == NULL) { GetPrinterDC(FALSE); } #endif
/* hilight selection if needed */ if (vfSelHidden) { UpdateWindow(hParentWw); /* Turn on selection highlight
vfInsEnd = selCur.fEndOfLine;*/ vfSelHidden = FALSE; ToggleSel(selCur.cpFirst, selCur.cpLim, TRUE); } } break;
case WM_TIMER: /* the only timer event for the parent window is flashID */ /* the blinking insertion point is for the doc window */ if (vfDeactByOtherApp) { FlashWindow(hParentWw, TRUE); } else { KillTimer(hParentWw, flashID); flashID = 0; FlashWindow(hParentWw, FALSE); } break;
case WM_CLOSE: /* The user has selected "Close" on the system menu */ /* Failure to process this message means that DefWindowProc */ /* Will send us a Destroy message */ /* A return value of TRUE says "don't close" */ /* Calling DestroyWindow means "Go ahead and close" */
lReturn = (LONG) !FMmwClose( hWnd ); break;
case WM_QUERYENDSESSION: /* User has selected "End Session" from the MS-DOS window */ /* Return TRUE if willing to quit, else return FALSE */ lReturn = (LONG) FConfirmSave(); break;
case WM_ENDSESSION: /* if wParam is TRUE, Windows is shutting down and we should */ /* delete temp files */ /* if wParam is FALSE, then an "End session" has been aborted */ if (wParam) { KillTempFiles( TRUE ); } break;
case WM_DESTROY: /* Window's being destroyed. */ MmwDestroy(); lReturn = (LONG) TRUE; break;
case WM_SIZE: /* Window's size is changing. lParam contains the height
** and width, in the low and high words, respectively. ** wParam contains SIZENORMAL for "normal" size changes, ** SIZEICONIC when the window is being made iconic, and ** SIZEFULLSCREEN when the window is being made full screen. */ MmwSize(hWnd, MAKEPOINT(lParam).x, MAKEPOINT(lParam).y, wParam); //if (wParam == SIZEICONIC)
lReturn = DefWindowProc(hWnd, message, wParam, lParam); break;
case WM_COMMAND: /* A menu item has been selected, or a control is notifying
** its parent. wParam is the menu item value (for menus), ** or control ID (for controls). For controls, the low word ** of lParam has the window handle of the control, and the hi ** word has the notification code. For menus, lParam contains ** 0L. */
#ifdef RULERALSO
if (!vfDisableMenus) #endif /* RULERALSO */
{ MmwCommand(hWnd, wParam, (HWND)LOWORD(lParam), HIWORD(lParam)); } break;
case WM_SYSCOMMAND: /* system command */
#ifdef RULERALSO
if (!vfDisableMenus) #endif /* RULERALSO */
{ lReturn = DefWindowProc(hWnd, message, wParam, lParam); }
break;
case WM_VSCROLL: /* Vertical scroll bar input. wParam contains the
** scroll code. For the thumb movement codes, the low ** word of lParam contain the new scroll position. ** Possible values for wParam are: SB_LINEUP, SB_LINEDOWN, ** SB_PAGEUP, SB_PAGEDOWN, SB_THUMBPOSITION, SB_THUMBTRACK */ MmwVertScroll(hWnd, wParam, (int)lParam); break;
case WM_HSCROLL: /* Horizontal scroll bar input. Parameters same as for
** WM_HSCROLL. UP and DOWN should be interpreted as LEFT ** and RIGHT, respectively. */ MmwHorzScroll(hWnd, wParam, (int)lParam); break;
case WM_WININICHANGE: /* We first save away the string passed in lParam,
then return because WM_ACTIVATE will cause our wWndMsgSysChange message to get posted ..pault */
if (lParam != NULL) { bltszx((LPSTR) lParam, (LPSTR) szT);
/* Here we only care about [devices], [windows] or [intl] changes */
if (WCompSz(szT, szWindows) == 0) wWininiChange |= wWininiChangeToWindows;
#ifdef DBCS /* was in JAPAN */
// We have to respond WININICHANGE immediately to deal with
// dispatch driver. For deleting printer DC, dispatch driver
// must be available. If do not so, syserr box comes up from
// GDI module.
if (WCompSz(szT, szDevices) == 0) { if( vhWndCancelPrint == NULL ) { MmwWinSysChange(WM_WININICHANGE); wWininiChange = 0; // reset
} else wWininiChange |= wWininiChangeToDevices; } #else
if (WCompSz(szT, szDevices) == 0) wWininiChange |= wWininiChangeToDevices; #endif
if (WCompSz(szT, szIntl) == 0) wWininiChange |= wWininiChangeToIntl;
lReturn = TRUE; } break; case WM_DEVMODECHANGE: /* See WM_WININICHANGE above */
if (lParam != NULL) { CHAR (**HszCreate())[]; bltszx((LPSTR) lParam, (LPSTR) szT);
/* was there another change before this? */ if (hszDevmodeChangeParam != NULL) FreeH(hszDevmodeChangeParam); hszDevmodeChangeParam = HszCreate(szT); vfDevmodeChange = fTrue; lReturn = TRUE; } break;
case WM_SYSCOLORCHANGE: case WM_FONTCHANGE: /* Post this message to handle soon */ PostMessage( hWnd, wWndMsgSysChange, message, (LONG) 0 ); lReturn = TRUE; break;
case wWndMsgSysChange: /* Handle postponed message from windows */
#ifdef DEBUG
if (wWininiChange != 0) Assert(wWininiChange > 0 && wWininiChange < wWininiChangeMax); #endif
MmwWinSysChange( wParam ); wWininiChange = 0; /* reset */ lReturn = TRUE; break;
default: /* Everything else comes here. This call MUST exist
** in your window proc. */ lReturn = DefWindowProc(hWnd, message, wParam, lParam); break; }
if (vfCloseFilesInDialog) CloseEveryRfn( FALSE );
return lReturn; }
void NEAR MmwPaint(hWnd) HWND hWnd; { /* This window is completely covered by it's children; so, there is
no painting of this window to do. */
extern HWND vhWndRuler; extern HWND vhWndSizeBox; extern HWND vhWndPageInfo; PAINTSTRUCT ps; HDC hDC;
hDC = BeginPaint(hWnd, &ps); // this is causing nested BeginPaint calls,
DrawResizeHole(hWnd,hDC);
/* Paint the ruler if necessary. */ if (vhWndRuler != NULL) { UpdateWindow(vhWndRuler); }
/* Paint the scroll bar controls. */ UpdateWindow(wwdCurrentDoc.hVScrBar); UpdateWindow(wwdCurrentDoc.hHScrBar); UpdateWindow(vhWndPageInfo);
/* Paint the document window. */ if (wwdCurrentDoc.wwptr != NULL) { UpdateWindow(wwdCurrentDoc.wwptr); }
EndPaint(hWnd, &ps); }
void MmwVertScroll(hWnd, code, posNew) HWND hWnd; WORD code; int posNew; { extern int vfSeeSel; extern int vfSeeEdgeSel;
/* There's nothing to do if we are just tracking the thumb. */ if (code == SB_THUMBTRACK) { return; }
vfSeeSel = vfSeeEdgeSel = FALSE; /* So Idle doesn't override the scroll */
if (code == SB_THUMBPOSITION) { /* Position to posNew; we rely upon Idle() to redraw the screen. */ if (posNew != pwwdCur->drElevator) { ClearInsertLine(); DirtyCache(pwwdCur->cpFirst = (cpMacCur - pwwdCur->cpMin) * posNew / (drMax - 1) + pwwdCur->cpMin); pwwdCur->ichCpFirst = 0; pwwdCur->fCpBad = TRUE; TrashWw(wwCur); } } else { switch (code) { case SB_LINEUP: ScrollUpCtr( 1 ); break; case SB_LINEDOWN: ScrollDownCtr( 1 ); break; case SB_PAGEUP: ScrollUpDypWw(); break; case SB_PAGEDOWN: ScrollDownCtr( 100 ); /* 100 > tr's in a page */ break; } UpdateWw(wwDocument, fFalse); } }
void near MmwHorzScroll(hWnd, code, posNew) HWND hWnd; WORD code; int posNew; { extern int vfSeeSel; extern int vfSeeEdgeSel;
/* There's nothing to do if we are just tracking the thumb. */ if (code == SB_THUMBTRACK) { return; }
vfSeeSel = vfSeeEdgeSel = FALSE; /* So Idle doesn't override the scroll */
switch (code) { case SB_LINEUP: /* line left */ ScrollRight(xpMinScroll); break; case SB_LINEDOWN: /* line right */ ScrollLeft(xpMinScroll); break; case SB_PAGEUP: /* page left */ ScrollRight(wwdCurrentDoc.xpMac - xpSelBar); break; case SB_PAGEDOWN: /* page right */ ScrollLeft(wwdCurrentDoc.xpMac - xpSelBar); break; case SB_THUMBPOSITION: /* position to posNew */ AdjWwHoriz(posNew - wwdCurrentDoc.xpMin); break; } }
static void DrawResizeHole(HWND hWnd, HDC hDC) /* There's now a hole in the bottom right corner where
the size box used to be, so need to fill it in! */ { RECT rcSB,rcClient; HBRUSH hbr, hbrPrev;
GetClientRect(hWnd,&rcClient);
rcSB.left = rcClient.right - dxpScrlBar; rcSB.right = rcClient.right; rcSB.top = rcClient.bottom - dypScrlBar; rcSB.bottom = rcClient.bottom;
if ((hbr = CreateSolidBrush(GetSysColor(COLOR_SCROLLBAR))) == NULL) hbr = GetStockObject(GRAY_BRUSH); hbrPrev = SelectObject(hDC, hbr); FillRect(hDC, (LPRECT)&rcSB, hbr);
SelectObject(hDC, hbrPrev); DeleteObject(hbr); }
|