193 lines
4.5 KiB
C
193 lines
4.5 KiB
C
/************************************************************/
|
||
/* Windows Write, Copyright 1985-1992 Microsoft Corporation */
|
||
/************************************************************/
|
||
|
||
#define NOGDICAPMASKS
|
||
#define NOVIRTUALKEYCODES
|
||
#define NOWINSTYLES
|
||
#define NOCLIPBOARD
|
||
#define NOSYSMETRICS
|
||
#define NOMENUS
|
||
#define NOSOUND
|
||
#define NOCOMM
|
||
#define NOSCROLL
|
||
#define NOMB
|
||
#include <windows.h>
|
||
|
||
#include "mw.h"
|
||
#include "dlgdefs.h"
|
||
#include "cmddefs.h"
|
||
#include "dispdefs.h"
|
||
#include "wwdefs.h"
|
||
#include "str.h"
|
||
#include "propdefs.h"
|
||
#include "printdef.h" /* printdefs.h */
|
||
#include "docdefs.h"
|
||
|
||
|
||
extern int rgval[];
|
||
extern struct WWD *pwwdCur;
|
||
extern struct DOD (**hpdocdod)[];
|
||
extern int docCur; /* Document in current ww */
|
||
extern struct SEL selCur; /* Current selection (i.e., sel in current ww */
|
||
extern struct SEP vsepNormal;
|
||
extern HWND vhWndMsgBoxParent;
|
||
extern int vfCursorVisible;
|
||
extern HCURSOR vhcArrow;
|
||
|
||
|
||
|
||
BOOL far PASCAL DialogGoTo( hDlg, message, wParam, lParam )
|
||
HWND hDlg; /* Handle to the dialog box */
|
||
unsigned message;
|
||
WORD wParam;
|
||
LONG lParam;
|
||
{
|
||
/* This routine handles input to the Go To dialog box. */
|
||
/*RECT rc;*/
|
||
struct SEP **hsep = (**hpdocdod)[docCur].hsep;
|
||
struct SEP *psep;
|
||
CHAR szT[cchMaxNum];
|
||
CHAR *pch = &szT[0];
|
||
extern ferror;
|
||
|
||
switch (message)
|
||
{
|
||
case WM_INITDIALOG:
|
||
EnableOtherModeless(false);
|
||
/* Get a pointer to the section properties. */
|
||
psep = (hsep == NULL) ? &vsepNormal : *hsep;
|
||
|
||
/* Initialize the starting page number. */
|
||
if (psep->pgnStart != pgnNil)
|
||
{
|
||
szT[ncvtu(psep->pgnStart, &pch)] = '\0';
|
||
SetDlgItemText(hDlg, idiGtoPage, (LPSTR)szT);
|
||
SelectIdiText(hDlg, idiGtoPage);
|
||
}
|
||
else
|
||
{
|
||
SetDlgItemText(hDlg, idiGtoPage, (LPSTR)"1");
|
||
SelectIdiText(hDlg, idiGtoPage);
|
||
}
|
||
break;
|
||
|
||
case WM_SETVISIBLE:
|
||
if (wParam)
|
||
EndLongOp(vhcArrow);
|
||
return(FALSE);
|
||
|
||
case WM_ACTIVATE:
|
||
if (wParam)
|
||
vhWndMsgBoxParent = hDlg;
|
||
if (vfCursorVisible)
|
||
ShowCursor(wParam);
|
||
return(FALSE); /* so that we leave the activate message to
|
||
the dialog manager to take care of setting the focus correctly */
|
||
|
||
case WM_COMMAND:
|
||
switch (wParam)
|
||
{
|
||
case idiOk:
|
||
if (!WPwFromItW3Id(&rgval[0], hDlg, idiGtoPage, pgnMin, pgnMax, wNormal, IDPMTNPI))
|
||
{
|
||
ferror = FALSE; /* reset error condition, so as to report any
|
||
further error */
|
||
break;
|
||
}
|
||
OurEndDialog(hDlg, TRUE); /* So we take down the dialog box and
|
||
only screen update ONCE ..pault */
|
||
CmdJumpPage();
|
||
if (pwwdCur->fRuler)
|
||
UpdateRuler();
|
||
break;
|
||
|
||
case idiCancel:
|
||
CancelDlg:
|
||
OurEndDialog(hDlg, TRUE);
|
||
break;
|
||
default:
|
||
return(FALSE);
|
||
}
|
||
break;
|
||
|
||
case WM_CLOSE:
|
||
goto CancelDlg;
|
||
|
||
default:
|
||
return(FALSE);
|
||
}
|
||
return(TRUE);
|
||
}
|
||
/* end of DialogGoTo */
|
||
|
||
|
||
/* C M D J U M P P A G E */
|
||
CmdJumpPage()
|
||
{ /* JUMP PAGE:
|
||
0 page number
|
||
*/
|
||
|
||
extern typeCP cpMinCur;
|
||
|
||
int ipgd;
|
||
int cpgd;
|
||
register struct PGD *ppgd;
|
||
struct PGTB **hpgtb = (**hpdocdod)[docCur].hpgtb;
|
||
BOOL fWrap = FALSE;
|
||
typeCP cpTarget;
|
||
|
||
|
||
ClearInsertLine();
|
||
|
||
if (hpgtb == NULL)
|
||
{
|
||
goto SelFirstPage;
|
||
}
|
||
|
||
cpgd = (**hpgtb).cpgd;
|
||
|
||
TryAgain:
|
||
for (ipgd = 0, ppgd = &(**hpgtb).rgpgd[0]; ipgd < cpgd; ipgd++, ppgd++)
|
||
{
|
||
if (ppgd->pgn == rgval[0] && (fWrap || ipgd + 1 == cpgd ||
|
||
(ppgd + 1)->cpMin > selCur.cpFirst))
|
||
{
|
||
cpTarget = ppgd->cpMin;
|
||
goto ShowPage;
|
||
}
|
||
}
|
||
if (!fWrap)
|
||
{
|
||
fWrap = TRUE;
|
||
goto TryAgain;
|
||
}
|
||
|
||
/* If rgval[0] > last page number jump to last page */
|
||
if ((ppgd = &(**hpgtb).rgpgd[cpgd - 1])->pgn < rgval[0])
|
||
{
|
||
cpTarget = ppgd->cpMin;
|
||
}
|
||
else if (rgval[0] == 1)
|
||
{
|
||
|
||
SelFirstPage:
|
||
cpTarget = cpMinCur;
|
||
}
|
||
else
|
||
{
|
||
Error(IDPMTNoPage);
|
||
return;
|
||
}
|
||
|
||
ShowPage:
|
||
/* Position first char of page on the first dl */
|
||
DirtyCache(pwwdCur->cpFirst = cpTarget);
|
||
pwwdCur->ichCpFirst = 0;
|
||
CtrBackDypCtr(0, 0);
|
||
|
||
/* In this case, CpFirstSty() will update the screen. */
|
||
cpTarget = CpFirstSty(cpTarget, styLine);
|
||
Select(cpTarget, cpTarget);
|
||
}
|
||
|