Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

297 lines
8.2 KiB

#include "help.h"
#pragma hdrstop
#include "inc\frstuff.h"
void STDCALL RegisterHotspots(QDE qde, int ifcm, int fFirst)
{
int imhi, imhiNew, ifr;
QFR qfr;
QFCM qfcm;
if (fFirst)
imhiNew = FOO_NIL;
else
imhiNew = IFooLastMRD(((QMRD)&qde->mrdHot));
qfcm = (QFCM)QFooInMRD(((QMRD)&qde->mrdFCM), sizeof(FCM), ifcm);
qfcm->imhiFirst = qfcm->imhiLast = FOO_NIL;
AccessMRD(((QMRD)&qde->mrdHot));
qfr = PtrFromGh(qfcm->hfr);
for (ifr = 0; ifr < qfcm->cfr; ifr++, qfr++) {
if (qfr->rgf.fHot) {
QMRD qmrd;
imhi = IFooFirstMRD(((QMRD)&qde->mrdHot));
for(;;) {
if (imhi == FOO_NIL)
break;
if (((QMHI) QFooInMRD(((QMRD) &qde->mrdHot), sizeof(MHI), imhi)) ->lHotID == qfr->lHotID)
break;
qmrd = ((QMRD)&qde->mrdHot);
imhi = IFooNextMRD(qmrd, sizeof(MHI), imhi);
}
if (imhi == FOO_NIL) {
imhiNew = IFooInsertFooMRD(((QMRD)&qde->mrdHot), sizeof(MHI), imhiNew);
((QMHI)QFooInMRD(((QMRD)&qde->mrdHot), sizeof(MHI), imhiNew))->ifcm = ifcm;
((QMHI)QFooInMRD(((QMRD)&qde->mrdHot), sizeof(MHI), imhiNew))->lHotID = qfr->lHotID;
((QMHI)QFooInMRD(((QMRD)&qde->mrdHot), sizeof(MHI), imhiNew))->ifrFirst = ifr;
((QMHI)QFooInMRD(((QMRD)&qde->mrdHot), sizeof(MHI), imhiNew))->ifrLast = ifr;
if (qfcm->imhiFirst == FOO_NIL)
qfcm->imhiFirst = imhiNew;
qfcm->imhiLast = imhiNew;
}
else
((QMHI)QFooInMRD(((QMRD)&qde->mrdHot), sizeof(MHI), imhi))->ifrLast = ifr;
}
}
DeAccessMRD(((QMRD)&qde->mrdHot));
}
void STDCALL ReleaseHotspots(QDE qde, int ifcm)
{
QFCM qfcm;
int imhi, imhiNext;
qfcm = (QFCM) QFooInMRD(((QMRD) &qde->mrdFCM), sizeof(FCM), ifcm);
if (qfcm->imhiFirst != FOO_NIL) {
AccessMRD(((QMRD) &qde->mrdHot));
if (qde->imhiSelected != FOO_NIL
&& ((QMHI) QFooInMRD(((QMRD) &qde->mrdHot), sizeof(MHI),
qde->imhiSelected)) ->ifcm == ifcm)
qde->imhiSelected = FOO_NIL;
for (imhi = qfcm->imhiFirst; imhi != FOO_NIL; imhi = imhiNext) {
imhiNext = IFooNextMRD(((QMRD) &qde->mrdHot), sizeof(MHI), imhi);
DeleteFooMRD(((QMRD) &qde->mrdHot), sizeof(MHI), imhi);
if (imhi == qfcm->imhiLast)
break;
}
DeAccessMRD(((QMRD) &qde->mrdHot));
}
}
/*
* Returns TRUE if a hotspot is left hilited, FALSE otherwise. FALSE
* implies either there are no hotspots or we moved onto the magic EOL
* hotspot (invisible).
*/
BOOL STDCALL FHiliteNextHotspot(QDE qde, int fNext)
{
int imhiNew;
ASSERT(qde->wLayoutMagic == wLayMagicValue);
if (qde->rct.top >= qde->rct.bottom)
return FALSE;
AccessMRD(((QMRD)&qde->mrdFCM));
AccessMRD(((QMRD)&qde->mrdHot));
imhiNew = qde->imhiSelected;
if (fNext) {
imhiNew = IFooNextMRD(((QMRD)&qde->mrdHot), sizeof(MHI), imhiNew);
if (imhiNew == qde->imhiSelected)
imhiNew = FOO_NIL;
else {
while (imhiNew != FOO_NIL && imhiNew != qde->imhiSelected
&& !FHotspotVisible(qde, imhiNew)) {
imhiNew = IFooNextMRD(((QMRD)&qde->mrdHot), sizeof(MHI), imhiNew);
}
}
}
else {
imhiNew = IFooPrevMRD(((QMRD)&qde->mrdHot), sizeof(MHI), imhiNew);
if (imhiNew == qde->imhiSelected)
imhiNew = FOO_NIL;
else {
while (imhiNew != FOO_NIL && imhiNew != qde->imhiSelected
&& !FHotspotVisible(qde, imhiNew)) {
imhiNew = IFooPrevMRD(((QMRD)&qde->mrdHot), sizeof(MHI), imhiNew);
}
}
}
if (!FHotspotVisible(qde, imhiNew))
imhiNew = FOO_NIL;
DeAccessMRD(((QMRD)&qde->mrdHot));
FSelectHotspot(qde, imhiNew);
DeAccessMRD(((QMRD)&qde->mrdFCM));
return imhiNew != FOO_NIL;
}
/*-------------------------------------------------------------------------
| RctLastHotpostHit(qde) |
| |
| Purpose: Returns the smallest hotspot which encloses the last hotspot |
| that the user hit. It relies on cached data which will become|
| stale after scrolling or jumping- it should only ever be |
| called immediately after a glossary button is pushed. |
-------------------------------------------------------------------------*/
void STDCALL RctLastHotspotHit(QDE qde,LPRECT lpRect)
{
MHI mhi;
QFCM qfcm;
int ifr, dx, dy;
QFR qfr;
ASSERT(qde->wLayoutMagic == wLayMagicValue);
lpRect->top = lpRect->left = 0x7fff;
lpRect->right = lpRect->bottom = 0;
/* REVIEW: (kevynct)
* qde->imhiHit may be FOO_NIL if we are displaying a hit in
* another file.
*/
if (qde->rct.top >= qde->rct.bottom || qde->imhiHit == FOO_NIL)
{
lpRect->top = lpRect->left = 0;
return;
}
AccessMRD(((QMRD)&qde->mrdFCM));
qde->wStyleDraw = wStyleNil;
ASSERT(qde->imhiHit != FOO_NIL);
AccessMRD(((QMRD)&qde->mrdHot));
mhi = *((QMHI)QFooInMRD(((QMRD)&qde->mrdHot), sizeof(MHI), qde->imhiHit));
qfcm = (QFCM)QFooInMRD(((QMRD)&qde->mrdFCM), sizeof(FCM), mhi.ifcm);
dx = qde->rct.left + qfcm->xPos - qde->xScrolled;
dy = qde->rct.top + qfcm->yPos;
qfr = (QFR)PtrFromGh(qfcm->hfr) + mhi.ifrFirst;
for (ifr = mhi.ifrFirst; ifr <= mhi.ifrLast; ifr++, qfr++)
{
if (qfr->rgf.fHot && qfr->lHotID == mhi.lHotID)
{
lpRect->top = min(dy + qfr->yPos, lpRect->top);
lpRect->left = min(dx + qfr->xPos, lpRect->left);
lpRect->bottom = max(dy + qfr->yPos + qfr->dySize, lpRect->bottom);
lpRect->right = max(dx + qfr->xPos + qfr->dxSize, lpRect->right);
}
}
DeAccessMRD(((QMRD)&qde->mrdHot));
DeAccessMRD(((QMRD)&qde->mrdFCM));
return;
}
BOOL STDCALL FHiliteVisibleHotspots(QDE qde, BOOL fHiliteOn)
{
int imhi;
if (fHiliteOn == qde->fHiliteHotspots)
return FALSE;
else
qde->fHiliteHotspots = fHiliteOn;
// Releasing CTRL-TAB will also turn off a previously hilited hotspot.
if (!fHiliteOn)
qde->imhiSelected = FOO_NIL;
AccessMRD(((QMRD)&qde->mrdFCM));
/*
* We do the un-hilighting in reverse order, in case some draw
* operations are not commutative.
*/
if (fHiliteOn)
imhi = IFooFirstMRD(((QMRD)&qde->mrdHot));
else
imhi = IFooLastMRD(((QMRD)&qde->mrdHot));
while (imhi != FOO_NIL) {
if (FHotspotVisible(qde, imhi)) {
/*
* When turning off, DrawHotspot will only invert the rect, not
* redraw it.
*/
if (!fHiliteOn || imhi != qde->imhiSelected)
DrawHotspot(qde, imhi);
}
if (fHiliteOn)
imhi = IFooNextMRD(((QMRD)&qde->mrdHot), sizeof(MHI), imhi);
else
imhi = IFooPrevMRD(((QMRD)&qde->mrdHot), sizeof(MHI), imhi);
}
DeAccessMRD(((QMRD)&qde->mrdFCM));
return TRUE;
}
void STDCALL FSelectHotspot(QDE qde, int imhi)
{
int imhiT;
int ifr;
QFR qfr;
QFCM qfcm;
if (imhi != FOO_NIL) {
AccessMRD(((QMRD)&qde->mrdHot));
AccessMRD(((QMRD)&qde->mrdFCM));
qfcm = (QFCM)QFooInMRD(((QMRD)&qde->mrdFCM), sizeof(FCM),
((QMHI)QFooInMRD(((QMRD)&qde->mrdHot), sizeof(MHI), imhi))->ifcm);
ifr = ((QMHI)QFooInMRD(((QMRD)&qde->mrdHot), sizeof(MHI), imhi))->ifrFirst;
qfr = (QFR)PtrFromGh(qfcm->hfr) + ifr;
DeAccessMRD(((QMRD)&qde->mrdFCM));
DeAccessMRD(((QMRD)&qde->mrdHot));
}
imhiT = qde->imhiSelected;
qde->imhiSelected = imhi;
DrawHotspot(qde, imhiT);
DrawHotspot(qde, qde->imhiSelected);
}
void STDCALL STDCALL DrawHotspot(QDE qde, int imhi)
{
MHI mhi;
int ifr;
QFR qfr;
QFCM qfcm;
POINT pt;
if (imhi == FOO_NIL)
return;
pt.x = qde->rct.left - qde->xScrolled;
pt.y = qde->rct.top;
AccessMRD(((QMRD) &qde->mrdHot));
mhi = *((QMHI) QFooInMRD(((QMRD) &qde->mrdHot), sizeof(MHI), imhi));
qfcm = (QFCM) QFooInMRD(((QMRD) &qde->mrdFCM), sizeof(FCM), mhi.ifcm);
qfr = (QFR) PtrFromGh(qfcm->hfr) + mhi.ifrFirst;
for (ifr = mhi.ifrFirst; ifr <= mhi.ifrLast; ifr++, qfr++) {
if (qfr->rgf.fHot && qfr->lHotID == mhi.lHotID)
DrawIfcm(qde, mhi.ifcm, pt, NULL, ifr, ifr + 1, TRUE);
}
DeAccessMRD(((QMRD)&qde->mrdHot));
}
BOOL STDCALL FHotspotVisible(QDE qde, int imhi)
{
MHI mhi;
QFCM qfcm;
int ifr, y, x;
QFR qfr;
BOOL fReturn = FALSE;
if (imhi == FOO_NIL)
return(FALSE);
AccessMRD(((QMRD)&qde->mrdHot));
mhi = *((QMHI)QFooInMRD(((QMRD)&qde->mrdHot), sizeof(MHI), imhi));
qfcm = (QFCM)QFooInMRD(((QMRD)&qde->mrdFCM), sizeof(FCM), mhi.ifcm);
x = qde->rct.left - qde->xScrolled + qfcm->xPos;
y = qde->rct.top + qfcm->yPos;
qfr = (QFR)PtrFromGh(qfcm->hfr) + mhi.ifrFirst;
for (ifr = mhi.ifrFirst; ifr <= mhi.ifrLast; ifr++, qfr++) {
if (qfr->rgf.fHot && qfr->lHotID == mhi.lHotID) {
if (y + qfr->yPos + qfr->dySize > 0 &&
y + qfr->yPos < qde->rct.bottom &&
x + qfr->xPos + qfr->dxSize > 0 &&
x + qfr->xPos < qde->rct.right)
fReturn = TRUE;
}
}
DeAccessMRD(((QMRD) &qde->mrdHot));
return(fReturn);
}