NT4/private/windows/win4help/winhelp/frmisc.c
2020-09-30 17:12:29 +02:00

397 lines
11 KiB
C

#include "help.h"
#pragma hdrstop
#include "inc\frstuff.h"
void STDCALL StoreExportTableFrame(QDE, int*, BYTE);
/* REVIEW: These should be exported */
/* (kevynct) Fix for H3.5 717
* The macro XPixelsFromPoints truncates its result to an int.
* This truncation FAILS when using a 300-dpi printer, for example,
* if converting a big enough value. Here, for example, we may
* convert values which are relative to 0x7fff, and use this macro
* in those cases. Routines in frconv also use this macro
* but are OK since the point sizes never get anywhere near half that big.
*/
#define LXPixelsFromPoints(p1, p2) (p1 * p2 / 144)
void STDCALL LayoutSideBySide(QDE qde, QFCM qfcm, PBYTE qbObj, PSTR qchText,
int xWidth, QOLR qolr)
{
#ifdef _X86_
QMSBS qmsbs;
QMCOL qmcol;
QI qwChild;
QI qwChildT;
#endif
int xPos, iCol, ifr;
int rgxPos[cColumnMax], rgdxWidth[cColumnMax], rgyPos[cColumnMax];
QB qbObjChild;
OLR olr;
MOBJ mobj;
OBJRG objrgFirst;
OBJRG objrgFront;
LONG lxRelativePixels;
int dxRowMax;
int dyColMax;
int wXAspectMul = qde->wXAspectMul;
int wYAspectMul = qde->wYAspectMul;
#ifdef _X86_
qmsbs = (QMSBS) (qbObj + CbUnpackMOBJ((QMOBJ) &mobj, qbObj));
// REVIEW: We need to modify FVerivyQMSBS for relative table format
if (qmsbs->fAbsolute)
qmcol = (QMCOL) (qmsbs + 1);
else {
WORD* qw = (WORD*) (qmsbs + 1);
int xT = *qw * wXAspectMul / 144;
if (xT > xWidth)
xWidth = xT;
qmcol = (QMCOL) (qw + 1);
lxRelativePixels = LXPixelsFromPoints(0x7fff, wXAspectMul);
}
ifr = qolr->ifrFirst;
objrgFirst = qolr->objrgFirst;
objrgFront = qolr->objrgFront;
xPos = 0;
dxRowMax = 0;
ASSERT(qmsbs->bcCol <= cColumnMax);
for (iCol = 0; iCol < qmsbs->bcCol; iCol++, qmcol++) {
if (qmsbs->fAbsolute) {
xPos += XPixelsFromPoints(qde, qmcol->xWidthSpace);
rgxPos[iCol] = xPos;
xPos += (rgdxWidth[iCol] = XPixelsFromPoints(qde, qmcol->xWidthColumn));
}
else
{
xPos += ((LONG) xWidth * LXPixelsFromPoints(wXAspectMul, qmcol->xWidthSpace)
/ lxRelativePixels );
rgxPos[iCol] = xPos;
xPos += (rgdxWidth[iCol] = ((LONG) xWidth *
LXPixelsFromPoints(wXAspectMul, qmcol->xWidthColumn) / lxRelativePixels));
}
/* Here we use the fact that xPos values are relative to 0 */
dxRowMax = max(dxRowMax, xPos);
rgyPos[iCol] = 0;
}
dyColMax = 0;
for (qwChild = (QI) qmcol; *qwChild != iColumnNil; )
{
qbObjChild = (QB)qwChild + sizeof(INT16);
olr.ifrFirst = ifr;
olr.objrgFirst = objrgFirst;
olr.objrgFront = objrgFront;
olr.xPos = qolr->xPos + rgxPos[*qwChild];
olr.yPos = qolr->yPos + rgyPos[*qwChild];
LayoutObject(qde, qfcm, qbObjChild, qchText, rgdxWidth[*qwChild], (QOLR)&olr);
ifr = olr.ifrMax;
objrgFirst = olr.objrgMax;
objrgFront = olr.objrgFront;
rgyPos[*qwChild] += olr.dySize;
/* Here we use the fact that rgyPos values are relative to 0 */
dyColMax = max(dyColMax, rgyPos[*qwChild]);
qwChildT = qwChild;
qwChild = (QI) (qbObjChild + CbUnpackMOBJ((QMOBJ)&mobj, qbObjChild));
qwChild = (QI) ((QB) qwChild + mobj.lcbSize);
if (qfcm->fExport && *qwChild != iColumnNil && *qwChildT != *qwChild)
StoreExportTableFrame(qde, &ifr, bFrTypeExportEndOfCell);
}
#else // _X86_
MCOL mcol;
QB qbSrc;
MSBS msbs;
SHORT iChild;
SHORT iChildT;
qbSrc = qbObj + CbUnpackMOBJ((QMOBJ)&mobj, qbObj, QDE_ISDFFTOPIC(qde));
qbSrc += LcbMapSDFF(QDE_ISDFFTOPIC(qde), SE_MSBS, (QV)&msbs, qbSrc);
/* REVIEW: We need to modify FVerivyQMSBS for relative table format */
/*Assert(FVerifyQMSBS(qde, qmsbs, isdff)); */
if (!msbs.fAbsolute)
{
WORD w;
INT xT;
qbSrc += LcbQuickMapSDFF(QDE_ISDFFTOPIC(qde), TE_WORD, (QV)&w, qbSrc);
xT = XPixelsFromPoints(qde, w);
if (xT > xWidth)
xWidth = xT;
lxRelativePixels = LXPixelsFromPoints(qde->wXAspectMul, 0x7fff);
}
ifr = qolr->ifrFirst;
objrgFirst = qolr->objrgFirst;
objrgFront = qolr->objrgFront;
xPos = 0;
dxRowMax = 0;
ASSERT((INT)msbs.bcCol <= cColumnMax);
for (iCol = 0; iCol < (INT)msbs.bcCol; iCol++)
{
qbSrc += LcbMapSDFF(QDE_ISDFFTOPIC(qde), SE_MCOL, (QV)&mcol, qbSrc);
if (msbs.fAbsolute)
{
xPos += XPixelsFromPoints(qde, mcol.xWidthSpace);
rgxPos[iCol] = xPos;
xPos += (rgdxWidth[iCol] = XPixelsFromPoints(qde, mcol.xWidthColumn));
}
else
{
xPos += (INT) ((LONG) xWidth * LXPixelsFromPoints(qde->wXAspectMul, mcol.xWidthSpace)
/ lxRelativePixels );
rgxPos[iCol] = xPos;
xPos += (rgdxWidth[iCol] = (INT) ((LONG) xWidth *
LXPixelsFromPoints(qde->wXAspectMul, mcol.xWidthColumn) / lxRelativePixels));
}
/* Here we use the fact that xPos values are relative to 0 */
dxRowMax = __max(dxRowMax, xPos);
rgyPos[iCol] = 0;
}
dyColMax = 0;
qbSrc += LcbQuickMapSDFF(QDE_ISDFFTOPIC(qde), TE_WORD, (QV)&iChild, qbSrc);
while (iChild != iColumnNil)
{
qbObjChild = qbSrc;
olr.ifrFirst = ifr;
olr.objrgFirst = objrgFirst;
olr.objrgFront = objrgFront;
olr.xPos = qolr->xPos + rgxPos[iChild];
olr.yPos = qolr->yPos + rgyPos[iChild];
LayoutObject(qde, qfcm, qbObjChild, qchText, rgdxWidth[iChild], (QOLR)&olr);
ifr = olr.ifrMax;
objrgFirst = olr.objrgMax;
objrgFront = olr.objrgFront;
rgyPos[iChild] += olr.dySize;
/* Here we use the fact that rgyPos values are relative to 0 */
dyColMax = __max(dyColMax, rgyPos[iChild]);
iChildT = iChild;
qbSrc += CbUnpackMOBJ((QMOBJ)&mobj, qbObjChild, QDE_ISDFFTOPIC(qde));
qbSrc += mobj.lcbSize;
qbSrc += LcbQuickMapSDFF(QDE_ISDFFTOPIC(qde), TE_WORD, (QV)&iChild, qbSrc);
if (qfcm->fExport && iChild != iColumnNil && iChildT != iChild)
StoreExportTableFrame(qde, &ifr, bFrTypeExportEndOfCell);
}
#endif
if (qfcm->fExport)
StoreExportTableFrame(qde, &ifr, bFrTypeExportEndOfTable);
/* We set our size here. The frame positions have already been set
* within our own LayoutObject call, so it's OK that the calling
* LayoutObject won't do it.
*/
qolr->dxSize = dxRowMax;
qolr->dySize = dyColMax;
qolr->ifrMax = ifr;
qolr->objrgMax = objrgFirst;
qolr->objrgFront = objrgFront;
}
void STDCALL StoreExportTableFrame(QDE qde, int* qifr, BYTE bFrType)
{
FR fr;
fr.bType = bFrType;
fr.yAscent = fr.dySize = 0;
*((QFR) QFooInMR((QMR)&qde->mrFr, sizeof(FR), *qifr)) = fr;
AppendMR((QMR)&qde->mrFr, sizeof(FR));
++*qifr;
}
int STDCALL DxBoxBorder(QMOPG qmopg, int wLine)
{
/*
* Please carefully note the nested IFs. This was to
* work around a bug in the C 5.1 compiler involving expressions
* of the form if( !A && !B ) where A and B are bitfield elements.
*/
switch (wLine)
{
case wLineTop:
if (!qmopg->mbox.fFullBox)
{
if(!qmopg->mbox.fTopLine)
return(0);
}
break;
case wLineLeft:
if (!qmopg->mbox.fFullBox)
{
if(!qmopg->mbox.fLeftLine)
return(0);
}
break;
case wLineBottom:
if (!qmopg->mbox.fFullBox)
{
if(!qmopg->mbox.fBottomLine)
return(0);
}
break;
case wLineRight:
if (!qmopg->mbox.fFullBox)
{
if(!qmopg->mbox.fRightLine)
return(0);
}
break;
}
switch (qmopg->mbox.wLineType)
{
case wBoxLineNormal:
case wBoxLineDotted:
return(5);
case wBoxLineThick:
case wBoxLineShadow:
return(6);
case wBoxLineDouble:
return(7);
}
}
void STDCALL DrawBoxFrame(qde, qfr, pt)
QDE qde;
QFR qfr;
PT pt;
{
HSGC hsgc;
INT16 wLineType, xLeft, xRight, yTop, yBottom;
INT16 xLeftT, xRightT, yTopT, yBottomT;
wLineType = qfr->u.frf.mbox.wLineType;
xLeft = pt.x + qfr->xPos + 1;
yTop = pt.y + qfr->yPos + 1;
hsgc = HsgcFromQde(qde);
switch (wLineType)
{
case wBoxLineNormal:
case wBoxLineDotted:
xRight = pt.x + qfr->xPos + qfr->dxSize - 2;
yBottom = pt.y + qfr->yPos + qfr->dySize - 2;
FSetPen(hsgc, 1, coDEFAULT, coDEFAULT, wTRANSPARENT, roCOPY, wPenSolid);
break;
case wBoxLineDouble:
xRight = pt.x + qfr->xPos + qfr->dxSize - 4;
yBottom = pt.y + qfr->yPos + qfr->dySize - 4;
FSetPen(hsgc, 1, coDEFAULT, coDEFAULT, wTRANSPARENT, roCOPY, wPenSolid);
break;
case wBoxLineThick:
xRight = pt.x + qfr->xPos + qfr->dxSize - 3;
yBottom = pt.y + qfr->yPos + qfr->dySize - 3;
FSetPen(hsgc, 2, coDEFAULT, coDEFAULT, wTRANSPARENT, roCOPY, wPenSolid);
break;
case wBoxLineShadow:
xRight = pt.x + qfr->xPos + qfr->dxSize - 3;
yBottom = pt.y + qfr->yPos + qfr->dySize - 3;
FSetPen(hsgc, 1, coDEFAULT, coDEFAULT, wTRANSPARENT, roCOPY, wPenSolid);
break;
#ifdef _DEBUG
default:
ASSERT(FALSE);
#endif /* DEBUG */
}
if (qfr->u.frf.mbox.fFullBox)
{
Rectangle(hsgc, xLeft, yTop, xRight, yBottom);
if (wLineType == wBoxLineDouble)
Rectangle(hsgc, xLeft + 2, yTop + 2, xRight - 2, yBottom - 2);
if (wLineType == wBoxLineShadow)
{
MoveToEx(hsgc, xRight + 1, yTop + 1, NULL);
LineTo(hsgc, xRight + 1, yBottom + 1);
LineTo(hsgc, xLeft + 1, yBottom + 1);
}
}
else
{
yTopT = yTop + (qfr->u.frf.mbox.fTopLine ? 2 : 0);
xLeftT = xLeft + (qfr->u.frf.mbox.fLeftLine ? 2 : 0);
yBottomT = yBottom - (qfr->u.frf.mbox.fBottomLine ? 2 : 0);
xRightT = xRight - (qfr->u.frf.mbox.fRightLine ? 2 : 0);
if (qfr->u.frf.mbox.fTopLine)
{
MoveToEx(hsgc, xLeft, yTop, NULL);
LineTo(hsgc, xRight, yTop);
if (wLineType == wBoxLineDouble)
{
MoveToEx(hsgc, xLeftT, yTop + 2, NULL);
LineTo(hsgc, xRightT, yTop + 2);
}
}
if (qfr->u.frf.mbox.fRightLine)
{
MoveToEx(hsgc, xRight, yTop, NULL);
LineTo(hsgc, xRight, yBottom);
if (wLineType == wBoxLineDouble)
{
MoveToEx(hsgc, xRight - 2, yTopT, NULL);
LineTo(hsgc, xRight - 2, yBottomT);
}
if (wLineType == wBoxLineShadow)
{
MoveToEx(hsgc, xRight + 1, yTop + 1, NULL);
LineTo(hsgc, xRight + 1, yBottom);
}
}
if (qfr->u.frf.mbox.fBottomLine)
{
MoveToEx(hsgc, xRight, yBottom, NULL);
LineTo(hsgc, xLeft, yBottom);
if (wLineType == wBoxLineDouble)
{
MoveToEx(hsgc, xRightT, yBottom - 2, NULL);
LineTo(hsgc, xLeftT, yBottom - 2);
}
if (wLineType == wBoxLineShadow)
{
MoveToEx(hsgc, xRight + 1, yBottom + 1, NULL);
LineTo(hsgc, xLeft + 1, yBottom + 1);
}
}
if (qfr->u.frf.mbox.fLeftLine)
{
MoveToEx(hsgc, xLeft, yBottom, NULL);
LineTo(hsgc, xLeft, yTop);
if (wLineType == wBoxLineDouble)
{
MoveToEx(hsgc, xLeft + 2, yBottomT, NULL);
LineTo(hsgc, xLeft + 2, yTopT);
}
}
}
FreeHsgc(hsgc);
}
void STDCALL DrawAnnoFrame(QDE qde, QFR qfr, POINT pt)
{
MHI mhi;
if (qde->fHiliteHotspots)
DisplayAnnoSym(qde->hwnd, qde->hdc, pt.x + qfr->xPos, pt.y + qfr->yPos, TRUE);
else if (qde->imhiSelected != FOO_NIL) {
AccessMRD(((QMRD)&qde->mrdHot));
mhi = *(QMHI)QFooInMRD(((QMRD)&qde->mrdHot), sizeof(MHI), qde->imhiSelected);
DeAccessMRD(((QMRD)&qde->mrdHot));
if (qfr->lHotID == mhi.lHotID)
DisplayAnnoSym(qde->hwnd, qde->hdc, pt.x + qfr->xPos, pt.y + qfr->yPos, TRUE);
else
DisplayAnnoSym(qde->hwnd, qde->hdc, pt.x + qfr->xPos, pt.y + qfr->yPos, FALSE);
}
else
DisplayAnnoSym(qde->hwnd, qde->hdc, pt.x + qfr->xPos, pt.y + qfr->yPos, FALSE);
}