mirror of https://github.com/lianthony/NT4.0
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.
331 lines
7.9 KiB
331 lines
7.9 KiB
/*
|
|
| Outside In for Windows
|
|
| Source File OIWDRAW.C (Routines for word processor drawing to rect)
|
|
|
|
|
| ²²²²² ²²²²²
|
|
| ² ² ²
|
|
| ² ² ²
|
|
| ² ² ²
|
|
| ²²²²² ²²²²²
|
|
|
|
|
| Outside In
|
|
|
|
|
*/
|
|
|
|
/*
|
|
| Creation Date: 10/27/93
|
|
| Original Programmer: Joe Keslin
|
|
|
|
|
*/
|
|
|
|
#include <platform.h>
|
|
|
|
#include <sccut.h>
|
|
#include <sccch.h>
|
|
#include <sccvw.h>
|
|
#include <sccd.h>
|
|
#include <sccfont.h>
|
|
|
|
#include <sccdebug.h>
|
|
|
|
#include "oiw.h"
|
|
#include "oiw.pro"
|
|
|
|
WORD OIWInitDrawToRect(lpWordInfo,lpDrawInfo)
|
|
LPOIWORDINFO lpWordInfo;
|
|
PSCCDDRAWTORECT lpDrawInfo;
|
|
{
|
|
LPOIWDRAWPOSITION lpDrawPos;
|
|
lpDrawPos = lpDrawInfo->pPosition;
|
|
if (!lpDrawInfo->bWholeDoc)
|
|
{
|
|
lpDrawPos->wStartChunk = OIWordSelectTopPos.posChunk;
|
|
lpDrawPos->wStartLine = OIWordSelectTopPos.posLine;
|
|
lpDrawPos->wEndChunk = OIWordSelectBottomPos.posChunk;
|
|
lpDrawPos->wEndLine = OIWordSelectBottomPos.posLine;
|
|
}
|
|
else
|
|
{
|
|
lpDrawPos->wStartChunk = 0;
|
|
lpDrawPos->wStartLine = 0;
|
|
lpDrawPos->wEndLine = 0xFFFF;
|
|
lpDrawPos->wEndChunk = 0xFFFF;
|
|
}
|
|
return(TRUE);
|
|
}
|
|
|
|
WORD OIWMapDrawToRect(lpWordInfo,lpDrawInfo)
|
|
LPOIWORDINFO lpWordInfo;
|
|
PSCCDDRAWTORECT lpDrawInfo;
|
|
{
|
|
lpDrawInfo->lDELeft = lpDrawInfo->lLeft;
|
|
lpDrawInfo->lDETop = lpDrawInfo->lTop;
|
|
lpDrawInfo->lDERight = lpDrawInfo->lRight;
|
|
lpDrawInfo->lDEBottom = lpDrawInfo->lBottom;
|
|
return(TRUE);
|
|
}
|
|
|
|
WORD OIWDrawToRect(lpWordInfo,lpDrawInfo)
|
|
LPOIWORDINFO lpWordInfo;
|
|
PSCCDDRAWTORECT lpDrawInfo;
|
|
{
|
|
LONG locSaveWrapDPI;
|
|
LONG locSaveOutputDPI;
|
|
WORD locSaveWrapType;
|
|
WORD locSaveWrapLeft;
|
|
WORD locSaveWrapRight;
|
|
DWORD locSaveDisplayMode;
|
|
WORD locSaveMaxX;
|
|
WORD locIndex;
|
|
//SHORT locErr;
|
|
WORD locChunkIndex;
|
|
WORD locChunkLines;
|
|
WORD locDocPage;
|
|
BOOL locError;
|
|
BOOL locDone;
|
|
WORD locEndLine;
|
|
WORD locEndChunk;
|
|
WORD locStartLine;
|
|
WORD locStartChunk;
|
|
BOOL locNewPage;
|
|
|
|
WORD locBChunkIndex;
|
|
WORD locBChunkLines;
|
|
WORD locBIndex;
|
|
SHORT locBY;
|
|
SHORT locY;
|
|
SHORT locNewY;
|
|
SHORT locDeltaY;
|
|
SHORT locLastPage;
|
|
OIWORDPOS locPos;
|
|
DWORD locPrintFlags;
|
|
LPOIWDRAWPOSITION lpDrawPos;
|
|
|
|
/*
|
|
if (lpDrawInfo->bWholeDoc)
|
|
{
|
|
while (!(lpWordInfo->wiFlags & OIWF_SIZEKNOWN))
|
|
{
|
|
DUReadMeAhead(lpWordInfo);
|
|
}
|
|
}
|
|
*/
|
|
|
|
lpDrawPos = lpDrawInfo->pPosition;
|
|
|
|
locPrintFlags = OIWF_TOPRINTER | OIWF_FIRSTLINEONPAGE;
|
|
|
|
locError = FALSE;
|
|
locDone = FALSE;
|
|
locLastPage = FALSE;
|
|
|
|
/*
|
|
| Set local copy of Printers DC for ease of use
|
|
*/
|
|
|
|
locSaveWrapDPI = lpWordInfo->wiWrapDPI;
|
|
locSaveOutputDPI = lpWordInfo->wiOutputDPI;
|
|
locSaveWrapLeft = lpWordInfo->wiWrapLeft;
|
|
locSaveWrapRight = lpWordInfo->wiWrapRight;
|
|
locSaveDisplayMode = lpWordInfo->wiDisplayMode;
|
|
locSaveMaxX = lpWordInfo->wiMaxX;
|
|
locSaveWrapType = lpWordInfo->wiWrapType;
|
|
|
|
lpWordInfo->wiWrapDPI = lpDrawInfo->lUnitsPerInch;
|
|
lpWordInfo->wiOutputDPI = lpDrawInfo->lUnitsPerInch;
|
|
lpWordInfo->wiWrapType = SCCD_FORMAT;
|
|
lpWordInfo->wiPrintRect.left = (SHORT)lpDrawInfo->lLeft;
|
|
lpWordInfo->wiPrintRect.top = (SHORT)lpDrawInfo->lTop;
|
|
lpWordInfo->wiPrintRect.bottom = (SHORT)lpDrawInfo->lBottom;
|
|
lpWordInfo->wiPrintRect.right = (SHORT)lpDrawInfo->lRight;
|
|
lpWordInfo->wiWrapLeft = (WORD)lpWordInfo->wiPrintRect.left;
|
|
lpWordInfo->wiWrapRight = (WORD)lpWordInfo->wiPrintRect.right;
|
|
lpWordInfo->wiDisplayMode = WPOP_DISPLAY_PREVIEW;
|
|
|
|
/*
|
|
lpWordInfo->wiWrapType = SCCD_FORMAT;
|
|
lpWordInfo->wiWrapDPI = lpWordInfo->wiGen.lFormatUPI;
|
|
lpWordInfo->wiOutputDPI = lpWordInfo->wiGen.lOutputUPI;
|
|
lpWordInfo->wiWrapLeft = (WORD)lpWordInfo->wiGen.rFormat.left;
|
|
lpWordInfo->wiWrapRight = (WORD)lpWordInfo->wiGen.rFormat.right;
|
|
lpWordInfo->wiDisplayMode = WPOP_DISPLAY_PREVIEW;
|
|
|
|
lpWordInfo->wiPrintRect.left = (SHORT)lpDrawInfo->lLeft;
|
|
lpWordInfo->wiPrintRect.top = (SHORT)lpDrawInfo->lTop;
|
|
lpWordInfo->wiPrintRect.bottom = (SHORT)lpDrawInfo->lBottom;
|
|
lpWordInfo->wiPrintRect.right = (SHORT)lpDrawInfo->lRight;
|
|
*/
|
|
|
|
|
|
UTFlagOn(lpWordInfo->wiFlags,OIWF_PRINTING);
|
|
|
|
OIClearAllWordWrapInfo(lpWordInfo);
|
|
|
|
if (!lpDrawInfo->bWholeDoc)
|
|
{
|
|
OIFixupWordPos(&lpWordInfo->wiAnchorPos,lpWordInfo);
|
|
OIFixupWordPos(&lpWordInfo->wiEndPos,lpWordInfo);
|
|
}
|
|
|
|
/*
|
|
| Positive YDir is down
|
|
*/
|
|
|
|
lpWordInfo->wiPrintYDir = OIWSetPrintModeNP(lpWordInfo);
|
|
|
|
locDocPage = 1;
|
|
locNewPage = FALSE;
|
|
|
|
locStartChunk = lpDrawPos->wStartChunk;
|
|
locStartLine = lpDrawPos->wStartLine;
|
|
locEndChunk = lpDrawPos->wEndChunk;
|
|
locEndLine = lpDrawPos->wEndLine;
|
|
|
|
|
|
locChunkIndex = locStartChunk;
|
|
|
|
/*
|
|
| Calculate start position
|
|
*/
|
|
|
|
locY = (SHORT)lpWordInfo->wiPrintRect.top;
|
|
locBY = locY;
|
|
|
|
locBChunkLines = OILinesInChunk(locChunkIndex,lpWordInfo);
|
|
locBChunkIndex = locChunkIndex;
|
|
locBIndex = locStartLine;
|
|
|
|
do
|
|
{
|
|
locChunkLines = OILinesInChunk(locChunkIndex,lpWordInfo);
|
|
|
|
for (locIndex = locStartLine; locIndex < locChunkLines && !locError && !locDone; locIndex++)
|
|
{
|
|
locPos.posChunk = locChunkIndex;
|
|
locPos.posLine = locIndex;
|
|
locY = OIWAdjustYOffset (&locPos, locY, locBY, lpWordInfo );
|
|
locDeltaY = OIWGetLineHeight(&locPos,lpWordInfo);
|
|
locNewY = locY + locDeltaY;
|
|
|
|
if ((locNewY >= lpWordInfo->wiPrintRect.bottom && locY != locBY) || locNewPage)
|
|
{
|
|
/*
|
|
| Before sending new page, call a routine which does nothing
|
|
| but add the bottom border to the last displayed row of the
|
|
| table which is being broken by a soft page.
|
|
*/
|
|
|
|
if ( !locNewPage )
|
|
{
|
|
OIWDisplaySoftBreak( locChunkIndex, locIndex, 0,
|
|
(SHORT)(locY*lpWordInfo->wiPrintYDir), &locPrintFlags, lpWordInfo, 0);
|
|
}
|
|
|
|
/*
|
|
| New Page
|
|
*/
|
|
|
|
locDone = TRUE;
|
|
lpDrawPos->wStartChunk = locChunkIndex;
|
|
lpDrawPos->wStartLine = locIndex;
|
|
}
|
|
|
|
if (!locDone)
|
|
{
|
|
OIWDisplayLineNew(
|
|
locChunkIndex,
|
|
locIndex,
|
|
0,
|
|
(SHORT)(locY*lpWordInfo->wiPrintYDir),
|
|
&locPrintFlags,
|
|
lpWordInfo,NULL);
|
|
|
|
locPrintFlags &= ~OIWF_FIRSTLINEONPAGE;
|
|
if (locPrintFlags & OIWF_HARDPAGE)
|
|
{
|
|
locPrintFlags &= ~OIWF_HARDPAGE;
|
|
locNewPage = TRUE;
|
|
}
|
|
|
|
locY = locNewY;
|
|
|
|
if (locChunkIndex == locEndChunk && locIndex == locEndLine)
|
|
{
|
|
OIWDisplaySoftBreak( locChunkIndex, locIndex,
|
|
0, (SHORT)(locNewY*lpWordInfo->wiPrintYDir), &locPrintFlags, lpWordInfo, 1);
|
|
locDone = TRUE;
|
|
locLastPage = TRUE;
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
if ( !locLastPage && (locIndex == locChunkLines ) )
|
|
{
|
|
locIndex = 0;
|
|
locStartLine = 0;
|
|
|
|
locChunkIndex = OIGetNextChunk(locChunkIndex,TRUE,lpWordInfo);
|
|
|
|
if (locChunkIndex == (WORD)-1)
|
|
{
|
|
locDone = TRUE;
|
|
locLastPage = TRUE;
|
|
}
|
|
}
|
|
}
|
|
while (!locError && !locDone);
|
|
|
|
lpDrawInfo->lRealTop = lpDrawInfo->lTop;
|
|
lpDrawInfo->lRealLeft = lpDrawInfo->lLeft;
|
|
lpDrawInfo->lRealRight = lpDrawInfo->lRight;
|
|
lpDrawInfo->lRealBottom = locNewY;
|
|
|
|
lpWordInfo->wiWrapDPI = locSaveWrapDPI;
|
|
lpWordInfo->wiOutputDPI = locSaveOutputDPI;
|
|
lpWordInfo->wiWrapLeft = locSaveWrapLeft;
|
|
lpWordInfo->wiWrapRight = locSaveWrapRight;
|
|
lpWordInfo->wiDisplayMode = locSaveDisplayMode;
|
|
lpWordInfo->wiMaxX = locSaveMaxX;
|
|
lpWordInfo->wiWrapType = locSaveWrapType;
|
|
|
|
UTFlagOff(lpWordInfo->wiFlags,OIWF_PRINTING);
|
|
UTFlagOff(lpWordInfo->wiFlags,OIWF_PRINTINGTOMETA);
|
|
|
|
OIClearAllWordWrapInfo(lpWordInfo);
|
|
|
|
if (!lpDrawInfo->bWholeDoc)
|
|
{
|
|
OIFixupWordPos(&lpWordInfo->wiAnchorPos,lpWordInfo);
|
|
OIFixupWordPos(&lpWordInfo->wiEndPos,lpWordInfo);
|
|
}
|
|
|
|
if ( locError )
|
|
return((WORD)-1);
|
|
else if ( locLastPage )
|
|
return(0);
|
|
else
|
|
return(1);
|
|
}
|
|
|
|
SHORT OIWAdjustYOffset ( lpPos, nY, nTop, lpWordInfo )
|
|
LPOIWORDPOS lpPos;
|
|
SHORT nY;
|
|
SHORT nTop;
|
|
LPOIWORDINFO lpWordInfo;
|
|
{
|
|
SHORT locOffsetY;
|
|
|
|
OILoadWordChunk(lpPos->posChunk, lpWordInfo, NULL);
|
|
locOffsetY = lpWordInfo->wiChunkLines[lpPos->posLine].liOffsetY;
|
|
locOffsetY = MWO ( locOffsetY );
|
|
if ( lpWordInfo->wiChunkLines[lpPos->posLine].liFlags & OILF_OFFSETYFROMTOP )
|
|
return ( nTop + locOffsetY );
|
|
else if ( lpWordInfo->wiChunkLines[lpPos->posLine].liFlags & OILF_OFFSETYFROMBASE )
|
|
return ( nY + locOffsetY );
|
|
else
|
|
return(nY);
|
|
|
|
}
|
|
|
|
|