459 lines
11 KiB
C
459 lines
11 KiB
C
|
/************************************************************/
|
|||
|
/* Windows Write, Copyright 1985-1992 Microsoft Corporation */
|
|||
|
/************************************************************/
|
|||
|
|
|||
|
/* DiaPara.c -- Paragraph Format dialog box specific routines */
|
|||
|
#define NOGDICAPMASKS
|
|||
|
#define NOVIRTUALKEYCODES
|
|||
|
#define NOWINSTYLES
|
|||
|
#define NOCLIPBOARD
|
|||
|
#define NOSYSMETRICS
|
|||
|
#define NOMENUS
|
|||
|
#define NOCOMM
|
|||
|
#define NOSOUND
|
|||
|
#define NOSCROLL
|
|||
|
#define NOCOLOR
|
|||
|
#define NOBITMAP
|
|||
|
#define NOFONT
|
|||
|
#define NODRAWTEXT
|
|||
|
#define NOMSG
|
|||
|
#define NOWNDCLASS
|
|||
|
#define NOKEYSTATE
|
|||
|
#define NORASTEROPS
|
|||
|
#define NOGDI
|
|||
|
#define NOBRUSH
|
|||
|
#define NOPEN
|
|||
|
#include <windows.h>
|
|||
|
|
|||
|
#include "mw.h"
|
|||
|
#include "cmddefs.h"
|
|||
|
#include "docdefs.h"
|
|||
|
#include "prmdefs.h"
|
|||
|
#include "propdefs.h"
|
|||
|
#include "editdefs.h"
|
|||
|
#include "dlgdefs.h"
|
|||
|
#include "dispdefs.h"
|
|||
|
#include "str.h"
|
|||
|
#include "wwdefs.h"
|
|||
|
|
|||
|
extern struct WWD *pwwdCur;
|
|||
|
extern HANDLE hParentWw;
|
|||
|
extern struct PAP vpapAbs;
|
|||
|
extern struct PAP *vppapNormal;
|
|||
|
extern int rgval[];
|
|||
|
extern typeCP cpMacCur;
|
|||
|
extern int utCur;
|
|||
|
extern struct SEL selCur; /* Current selection (i.e., sel in current ww */
|
|||
|
extern int docCur; /* Document in current ww */
|
|||
|
extern CHAR stBuf[];
|
|||
|
extern HWND vhWndMsgBoxParent;
|
|||
|
extern int vfCursorVisible;
|
|||
|
extern HCURSOR vhcArrow;
|
|||
|
|
|||
|
#ifdef RULERALSO /* enable out because no need to bring ruler up when tab or indents is invoked */
|
|||
|
extern int docRulerSprm;
|
|||
|
extern struct TBD rgtbdRuler[];
|
|||
|
extern HWND vhDlgIndent;
|
|||
|
extern BOOL vfDisableMenus;
|
|||
|
extern int vfTabsChanged;
|
|||
|
extern int vfTempRuler;
|
|||
|
extern struct WWD rgwwd[];
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
#ifdef CASHMERE
|
|||
|
/* D O F O R M A T P A R A */
|
|||
|
DoFormatPara(rgval)
|
|||
|
VAL rgval[];
|
|||
|
/* add para sprms */
|
|||
|
|
|||
|
int val, ival;
|
|||
|
int *pval;
|
|||
|
int sprm;
|
|||
|
struct PAP *ppap;
|
|||
|
typeCP dcp;
|
|||
|
typeCP cpFirst, cpLim;
|
|||
|
struct SEL selSave;
|
|||
|
/* this temp array is used to assemble sprm values */
|
|||
|
CHAR rgb[cchTBD * itbdMax + 2/* >> cwPAPBase */];
|
|||
|
int rgw[cwPAPBase];
|
|||
|
ppap = (struct PAP *)&rgw[0];
|
|||
|
|
|||
|
if (!FWriteCk(fwcNil))
|
|||
|
return; /* Check for munging end mark in footnote window */
|
|||
|
|
|||
|
if (docRulerSprm != docNil) ClearRulerSprm();
|
|||
|
ExpandCurSel(&selSave);
|
|||
|
|
|||
|
dcp = (cpLim = selCur.cpLim) - (cpFirst = selCur.cpFirst);
|
|||
|
if (cpLim > cpMacCur)
|
|||
|
{
|
|||
|
SetUndo(uacReplNS, docCur, cpFirst, dcp,
|
|||
|
docNil, cpNil, dcp - ccpEol, 0);
|
|||
|
InsertEolInsert(docCur, cpMacCur);
|
|||
|
}
|
|||
|
else
|
|||
|
SetUndo(uacReplNS, docCur, cpFirst, dcp,
|
|||
|
docNil, cpNil, dcp, 0);
|
|||
|
/* reset adjusted selCur */
|
|||
|
selCur.cpFirst = cpFirst;
|
|||
|
selCur.cpLim = cpLim;
|
|||
|
|
|||
|
|
|||
|
/* any gray fields ? */
|
|||
|
for (ival = 0; ival <= 8; ival++)
|
|||
|
if (rgval[ival] == valNil)
|
|||
|
{
|
|||
|
/* yes. generate sprms for any that are not gray */
|
|||
|
for (ival = 0; ival <= 8; ival++)
|
|||
|
if ((val = rgval[ival]) != valNil)
|
|||
|
{
|
|||
|
switch(ival)
|
|||
|
{
|
|||
|
case 0:
|
|||
|
sprm = sprmPJc;
|
|||
|
goto LPara1;
|
|||
|
case 1:
|
|||
|
val = !val;
|
|||
|
sprm = sprmPKeep;
|
|||
|
goto LPara1;
|
|||
|
case 2:
|
|||
|
sprm = sprmPLMarg;
|
|||
|
break;
|
|||
|
case 3:
|
|||
|
sprm = sprmPFIndent;
|
|||
|
break;
|
|||
|
case 4:
|
|||
|
sprm = sprmPRMarg;
|
|||
|
break;
|
|||
|
case 5:
|
|||
|
sprm = sprmPDyaLine;
|
|||
|
break;
|
|||
|
case 6:
|
|||
|
sprm = sprmPDyaBefore;
|
|||
|
break;
|
|||
|
case 7:
|
|||
|
sprm = sprmPDyaAfter;
|
|||
|
break;
|
|||
|
case 8:
|
|||
|
val = !val;
|
|||
|
sprm = sprmPKeepFollow;
|
|||
|
goto LPara1;
|
|||
|
}
|
|||
|
/* we come here with one word value */
|
|||
|
bltbyte(&val, &rgb[1], cchINT);
|
|||
|
goto LPara2;
|
|||
|
/* we come here with one char value */
|
|||
|
LPara1: rgb[1] = val;
|
|||
|
LPara2: rgb[0] = sprm;
|
|||
|
AddSprm(rgb);
|
|||
|
}
|
|||
|
goto ParaCommon;
|
|||
|
}
|
|||
|
/* otherwise generate a sprm that applies all properties except the tabs */
|
|||
|
blt(vppapNormal, ppap, cwPAPBase);
|
|||
|
pval = &rgval[0];
|
|||
|
ppap->jc = *pval++;
|
|||
|
ppap->fKeep = !*pval++;
|
|||
|
ppap->dxaLeft = *pval++;
|
|||
|
ppap->dxaLeft1 = *pval++;
|
|||
|
ppap->dxaRight = *pval++;
|
|||
|
ppap->dyaLine = *pval++;
|
|||
|
ppap->dyaBefore = *pval++;
|
|||
|
ppap->dyaAfter = *pval++;
|
|||
|
ppap->fKeepFollow = !*pval++;
|
|||
|
bltbyte(ppap, &rgb[2], cwPAPBase * cchINT);
|
|||
|
rgb[1] = cwPAPBase * cchINT;
|
|||
|
/* we have: sprm, rgb[1 - n] set up */
|
|||
|
rgb[0] = sprmPSame;
|
|||
|
CachePara(docCur, selCur.cpFirst);
|
|||
|
if (CchDiffer(&vpapAbs, ppap, cwPAPBase * cchINT))
|
|||
|
AddSprm(rgb);
|
|||
|
ParaCommon: ;
|
|||
|
if (vfTabsChanged)
|
|||
|
{
|
|||
|
int itbd;
|
|||
|
int cchRgtbd;
|
|||
|
/* some tab changes were also made in the ruler */
|
|||
|
for (itbd = 0; rgtbdRuler[itbd].dxa != 0; itbd++);
|
|||
|
bltbyte((CHAR *)rgtbdRuler, &rgb[2], cchRgtbd = cwTBD * cchINT * itbd);
|
|||
|
rgb[1] = cchRgtbd;
|
|||
|
rgb[0] = sprmPRgtbd;
|
|||
|
AddSprm(rgb);
|
|||
|
}
|
|||
|
EndLookSel(&selSave, fTrue);
|
|||
|
SetRgvalAgain(rgval, uacFormatPara);
|
|||
|
}
|
|||
|
|
|||
|
#else /* MEMO, not CASHMERE */
|
|||
|
|
|||
|
/* D O F O R M A T P A R A */
|
|||
|
DoFormatPara(rgval)
|
|||
|
VAL rgval[];
|
|||
|
{
|
|||
|
/* add para sprms */
|
|||
|
|
|||
|
int val, ival;
|
|||
|
int *pval;
|
|||
|
int sprm;
|
|||
|
struct PAP *ppap;
|
|||
|
typeCP dcp;
|
|||
|
typeCP cpFirst, cpLim;
|
|||
|
struct SEL selSave;
|
|||
|
/* this temp array is used to assemble sprm values */
|
|||
|
CHAR rgb[cchTBD * itbdMax + 2/* >> cwPAPBase */];
|
|||
|
int rgw[cwPAPBase];
|
|||
|
ppap = (struct PAP *)&rgw[0];
|
|||
|
|
|||
|
if (!FWriteOk( fwcNil ))
|
|||
|
return;
|
|||
|
|
|||
|
#ifdef ENABLE /* no ClearRulerSprm yet */
|
|||
|
if (docRulerSprm != docNil) ClearRulerSprm();
|
|||
|
#endif
|
|||
|
ExpandCurSel(&selSave);
|
|||
|
|
|||
|
dcp = (cpLim = selCur.cpLim) - (cpFirst = selCur.cpFirst);
|
|||
|
if (cpLim > cpMacCur)
|
|||
|
{
|
|||
|
SetUndo(uacReplNS, docCur, cpFirst, dcp,
|
|||
|
docNil, cpNil, dcp - ccpEol, 0);
|
|||
|
InsertEolInsert(docCur, cpMacCur);
|
|||
|
}
|
|||
|
else
|
|||
|
SetUndo(uacReplNS, docCur, cpFirst, dcp,
|
|||
|
docNil, cpNil, dcp, 0);
|
|||
|
/* reset adjusted selCur */
|
|||
|
selCur.cpFirst = cpFirst;
|
|||
|
selCur.cpLim = cpLim;
|
|||
|
|
|||
|
for (ival = 0; ival <= 2; ival++)
|
|||
|
if ((val = rgval[ival]) != valNil)
|
|||
|
{
|
|||
|
switch(ival)
|
|||
|
{
|
|||
|
case 0:
|
|||
|
sprm = sprmPLMarg;
|
|||
|
break;
|
|||
|
case 1:
|
|||
|
sprm = sprmPFIndent;
|
|||
|
break;
|
|||
|
case 2:
|
|||
|
sprm = sprmPRMarg;
|
|||
|
break;
|
|||
|
}
|
|||
|
/* we come here with one word value */
|
|||
|
bltbyte(&val, &rgb[1], cchINT);
|
|||
|
rgb[0] = sprm;
|
|||
|
AddSprm(rgb);
|
|||
|
}
|
|||
|
|
|||
|
#ifdef RULERALSO /* tabs in format para dialog box */
|
|||
|
if (vfTabsChanged)
|
|||
|
{
|
|||
|
int itbd;
|
|||
|
int cchRgtbd;
|
|||
|
/* some tab changes were also made in the ruler */
|
|||
|
for (itbd = 0; rgtbdRuler[itbd].dxa != 0; itbd++);
|
|||
|
bltbyte((CHAR *)rgtbdRuler, &rgb[2], cchRgtbd = cwTBD * cchINT * itbd);
|
|||
|
rgb[1] = cchRgtbd;
|
|||
|
rgb[0] = sprmPRgtbd;
|
|||
|
AddSprm(rgb);
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
EndLookSel(&selSave, fTrue);
|
|||
|
#ifdef ENABLE
|
|||
|
SetRgvalAgain(rgval, uacFormatPara);
|
|||
|
#endif
|
|||
|
} /* end of DoFormatPara */
|
|||
|
#endif /* MEMO, not CASHMERE */
|
|||
|
|
|||
|
|
|||
|
/* P U T P A R A N U M */
|
|||
|
/* convert n according to unit ut, and leave result in stBuf */
|
|||
|
PutParaNum(n, ut)
|
|||
|
int n, ut;
|
|||
|
{
|
|||
|
CHAR *pch = &stBuf[1];
|
|||
|
stBuf[0] = CchExpZa(&pch, n, ut, cchMaxNum);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
BOOL far PASCAL DialogParaFormats( hDlg, message, wParam, lParam )
|
|||
|
HWND hDlg; /* Handle to the dialog box */
|
|||
|
unsigned message;
|
|||
|
WORD wParam;
|
|||
|
LONG lParam;
|
|||
|
{
|
|||
|
/* This routine handles input to the Paragraph Formats dialog box. */
|
|||
|
extern struct SEP vsepNormal;
|
|||
|
extern int ferror;
|
|||
|
unsigned dxaText;
|
|||
|
int wLowLim;
|
|||
|
int i;
|
|||
|
TSV rgtsv[itsvchMax]; /* gets attributes and gray flags from CHP */
|
|||
|
|
|||
|
switch (message)
|
|||
|
{
|
|||
|
case WM_INITDIALOG:
|
|||
|
#ifdef RULERALSO /* enable out because no need to bring ruler up */
|
|||
|
InitSpecialDialog(&vhDlgIndent, hDlg);
|
|||
|
#else
|
|||
|
EnableOtherModeless(FALSE);
|
|||
|
#endif
|
|||
|
GetRgtsvPapSel(rgtsv); /* get paragraph properties */
|
|||
|
|
|||
|
/* note the following loop assumes that the
|
|||
|
itsv Indent codes are in the same order as
|
|||
|
the idiPar Indent codes */
|
|||
|
|
|||
|
for (i = 0; i < 3; i++)
|
|||
|
if (rgtsv[itsvLIndent + i].fGray == 0)
|
|||
|
{
|
|||
|
PutParaNum(rgtsv[itsvLIndent + i].wTsv, utCur);
|
|||
|
SetDlgItemText(hDlg, (idiParLfIndent + i),
|
|||
|
(LPSTR)&stBuf[1]);
|
|||
|
}
|
|||
|
|
|||
|
SelectIdiText(hDlg, idiParLfIndent);
|
|||
|
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 right */
|
|||
|
|
|||
|
case WM_COMMAND:
|
|||
|
switch (wParam)
|
|||
|
{
|
|||
|
case idiOk:
|
|||
|
/* Get xaLeft, First line, and xaRight */
|
|||
|
if (!WPdxaFromItDxa2WId(&rgval[0], hDlg, idiParLfIndent, 0, dxaText = vsepNormal.dxaText,
|
|||
|
wBlank | wSpaces, IDPMTNOTDXA))
|
|||
|
{
|
|||
|
ferror = FALSE; /* minor error, stay in dialog */
|
|||
|
break;
|
|||
|
}
|
|||
|
if (rgval[0] == valNil)
|
|||
|
wLowLim = 0;
|
|||
|
else
|
|||
|
wLowLim = (int) -rgval[0];
|
|||
|
if (!WPdxaFromItDxa2WId(&rgval[1], hDlg, idiParFirst, wLowLim, dxaText,
|
|||
|
wBlank | wSpaces, IDPMTNOTDXA) ||
|
|||
|
!WPdxaFromItDxa2WId(&rgval[2], hDlg, idiParRtIndent, 0, dxaText,
|
|||
|
wBlank | wSpaces, IDPMTNOTDXA))
|
|||
|
{
|
|||
|
ferror = FALSE; /* minor error, stay in dialog */
|
|||
|
break;
|
|||
|
}
|
|||
|
/* we have in rgval:
|
|||
|
0 xaLeft
|
|||
|
1 xaLeft1
|
|||
|
2 xaRight */
|
|||
|
DoFormatPara(rgval);
|
|||
|
/* FALL THROUGH */
|
|||
|
case idiCancel:
|
|||
|
#ifdef RULERALSO /* enable out because no need to bring up ruler */
|
|||
|
CancelSpecialDialog(&vhDlgIndent);
|
|||
|
#else
|
|||
|
OurEndDialog(hDlg, TRUE);
|
|||
|
#endif
|
|||
|
break;
|
|||
|
default:
|
|||
|
return(FALSE);
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case WM_CLOSE:
|
|||
|
#ifdef RULERALSO /* enable out because no need to bring up ruler */
|
|||
|
CancelSpecialDialog(&vhDlgIndent);
|
|||
|
#else
|
|||
|
OurEndDialog(hDlg, TRUE);
|
|||
|
#endif
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
return(FALSE);
|
|||
|
}
|
|||
|
return(TRUE);
|
|||
|
}
|
|||
|
/* end of DialogParaFormats */
|
|||
|
|
|||
|
|
|||
|
#ifdef RULERALSO/* no need to bring up ruler when tab or indent dialog box was invoked */
|
|||
|
InitSpecialDialog(phDlg, hDlg)
|
|||
|
HANDLE *phDlg;
|
|||
|
HANDLE hDlg;
|
|||
|
{
|
|||
|
/* Special dialog box is a modal dialog box that needs to invoke a ruler if
|
|||
|
not already there. Since the ruler is a child window, the parent has to
|
|||
|
be enabled and other children except the ruler and/or modeless dialog
|
|||
|
boxes has to be disabled. Top level menu and the system menu have to
|
|||
|
be locked.
|
|||
|
|
|||
|
phDlg : address of the global handle to store the special
|
|||
|
dialog created (ptr to either vhDlgIndent or vhDlgTab)
|
|||
|
Ruler relies on these global handle to see if need to
|
|||
|
update any dialog's items when tabs or indents are moved.
|
|||
|
hDlg : handle to the special dialog box created.
|
|||
|
*/
|
|||
|
|
|||
|
*phDlg = hDlg;
|
|||
|
EnableOtherModeless(FALSE); /* disable other modeless dialogs */
|
|||
|
EnableWindow(hParentWw, TRUE);
|
|||
|
EnableWindow(wwdCurrentDoc.wwptr, FALSE);
|
|||
|
if (!pwwdCur->fRuler)
|
|||
|
{
|
|||
|
vfTempRuler = TRUE;
|
|||
|
pwwdCur->fRuler = TRUE;
|
|||
|
CreateRuler();
|
|||
|
}
|
|||
|
else
|
|||
|
UpdateRuler();
|
|||
|
vfTabsChanged = FALSE;
|
|||
|
vfDisableMenus = TRUE;
|
|||
|
} /* InitSpecialDialog */
|
|||
|
|
|||
|
|
|||
|
CancelSpecialDialog(phDlg)
|
|||
|
HANDLE * phDlg;
|
|||
|
{
|
|||
|
/* Destroy the special dialog box involves destroying the ruler if it is
|
|||
|
invoked by the creation of the dialog box, then enable the children
|
|||
|
and/or any modeless dialogs that were disabled in InitSpecialDialog.
|
|||
|
System menu and the top level menu has to be unlocked.
|
|||
|
The last thing is to reset the global dialog handle (vhDlgTab or
|
|||
|
vhDlgIndent). Ruler relies on these global handle to see if need to
|
|||
|
update any dialog's items when tabs or indents are moved.
|
|||
|
|
|||
|
phDlg : address of the global handle that stores the special
|
|||
|
dialog created (ptr to either vhDlgIndent or vhDlgTab)
|
|||
|
*/
|
|||
|
HANDLE hDlg = *phDlg;
|
|||
|
|
|||
|
if (vfTempRuler)
|
|||
|
{
|
|||
|
DestroyRuler();
|
|||
|
vfTempRuler = FALSE;
|
|||
|
pwwdCur->fRuler = FALSE;
|
|||
|
}
|
|||
|
else
|
|||
|
UpdateRuler();
|
|||
|
EndDialog(hDlg, TRUE);
|
|||
|
EnableWindow(wwdCurrentDoc.wwptr, TRUE);
|
|||
|
EnableOtherModeless(TRUE); /* enable other modeless dialogs */
|
|||
|
*phDlg = (HANDLE)NULL;
|
|||
|
vfDisableMenus = FALSE;
|
|||
|
|
|||
|
} /* CancelSpecialDialog */
|
|||
|
#endif /* RULERALSO -- no need to bring up ruler when tab or indent dialog box is invoked */
|
|||
|
|