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.
2597 lines
55 KiB
2597 lines
55 KiB
/*
|
|
| Outside In for Windows
|
|
| Source File OIWRTNS.C (Routines for word processor window)
|
|
|
|
|
| ²²²²² ²²²²²
|
|
| ² ² ²
|
|
| ² ² ²
|
|
| ² ² ²
|
|
| ²²²²² ²²²²²
|
|
|
|
|
| Outside In
|
|
|
|
|
*/
|
|
|
|
/*
|
|
| Creation Date: 10/14/90
|
|
| Original Programmer: Philip Boutros
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
#include <platform.h>
|
|
|
|
#include <sccut.h>
|
|
#include <sccch.h>
|
|
#include <sccvw.h>
|
|
#include <sccd.h>
|
|
#include <sccfont.h>
|
|
|
|
#include "oiw.h"
|
|
#include "oiwstr.h"
|
|
#include "oiw.pro"
|
|
|
|
/*
|
|
| Defines
|
|
*/
|
|
|
|
|
|
/*
|
|
| Routines
|
|
*/
|
|
|
|
#ifndef SCCFEATURE_SELECT
|
|
#define OIWUpdateCaret(lpWordInfo)
|
|
#define OIWHideCaret(lpWordInfo)
|
|
#define OIWMoveCaret(lpWordInfo,wDirection)
|
|
#define OIWDrawCaret(lpWordInfo)
|
|
#endif
|
|
|
|
|
|
VOID OIWDebugCharInfo(LPOIWORDINFO,WORD,WORD);
|
|
|
|
|
|
/*
|
|
| OIWSize
|
|
|
|
|
|
|
|
*/
|
|
|
|
VOID OIWSize(lpWordInfo,pDisplayRect)
|
|
LPOIWORDINFO lpWordInfo;
|
|
RECT FAR *pDisplayRect;
|
|
{
|
|
WORD wHeight, wWidth;
|
|
SHORT nWindowXOffset, nWindowYOffset;
|
|
|
|
wWidth = (WORD)(pDisplayRect->right - pDisplayRect->left);
|
|
wHeight = (WORD)(pDisplayRect->bottom - pDisplayRect->top);
|
|
nWindowXOffset = (SHORT)pDisplayRect->left;
|
|
nWindowYOffset = (SHORT)pDisplayRect->top;
|
|
|
|
OIWHideCaret(lpWordInfo);
|
|
|
|
if (wWidth != lpWordInfo->wiCurWidth && (lpWordInfo->wiDisplayMode == WPOP_DISPLAY_DRAFT || lpWordInfo->wiDisplayMode == WPOP_DISPLAY_NORMAL))
|
|
{
|
|
lpWordInfo->wiCurWidth = wWidth;
|
|
lpWordInfo->wiCurHeight = wHeight;
|
|
lpWordInfo->wiCurXOffset = nWindowXOffset;
|
|
lpWordInfo->wiCurYOffset = nWindowYOffset;
|
|
lpWordInfo->wiCurLeftOffset = 0;
|
|
|
|
OIWSetDisplayMode(lpWordInfo,lpWordInfo->wiDisplayMode);
|
|
|
|
OIClearAllWordWrapInfo(lpWordInfo);
|
|
|
|
OIFixupWordPos(&lpWordInfo->wiCurTopPos,lpWordInfo);
|
|
OIFixupWordPos(&lpWordInfo->wiAnchorPos,lpWordInfo);
|
|
OIFixupWordPos(&lpWordInfo->wiEndPos,lpWordInfo);
|
|
|
|
#ifdef SCCFEATURE_SELECT
|
|
if (lpWordInfo->wiFlags & OIWF_WORDSELECTION)
|
|
{
|
|
OIFixupWordPos(&lpWordInfo->wiWordAnchorLeft,lpWordInfo);
|
|
OIFixupWordPos(&lpWordInfo->wiWordAnchorRight,lpWordInfo);
|
|
}
|
|
#endif
|
|
|
|
DUInvalRect(lpWordInfo,NULL);
|
|
}
|
|
else
|
|
{
|
|
lpWordInfo->wiCurWidth = wWidth;
|
|
lpWordInfo->wiCurHeight = wHeight;
|
|
lpWordInfo->wiCurXOffset = nWindowXOffset;
|
|
lpWordInfo->wiCurYOffset = nWindowYOffset;
|
|
}
|
|
|
|
OIWUpdateVertScrollRange(lpWordInfo);
|
|
OIWUpdateVertScrollPos(lpWordInfo);
|
|
OIWUpdateHorzScrollRange(lpWordInfo);
|
|
OIWUpdateHorzScrollPos(lpWordInfo);
|
|
}
|
|
|
|
/*
|
|
| OIWOpenSection
|
|
|
|
|
|
|
|
*/
|
|
|
|
VOID OIWOpenSection(lpWordInfo)
|
|
LPOIWORDINFO lpWordInfo;
|
|
{
|
|
CHSECTIONINFO locSecInfo;
|
|
RECT locRect;
|
|
PCHUNK pChunkTable;
|
|
|
|
/*
|
|
| Set section ON
|
|
*/
|
|
|
|
UTFlagOn(lpWordInfo->wiFlags,OIWF_SECTIONOPEN);
|
|
|
|
/*
|
|
| Initialize maximum right margin
|
|
*/
|
|
|
|
lpWordInfo->wiMaxX = 0;
|
|
|
|
/*
|
|
| Initialize buffered chunks
|
|
*/
|
|
|
|
lpWordInfo->wiChunkA.ciChunkId = 0xFFFF;
|
|
lpWordInfo->wiChunkA.ciLineHandle = NULL;
|
|
lpWordInfo->wiChunkA.ciRunHandle = NULL;
|
|
lpWordInfo->wiChunkB.ciChunkId = 0xFFFF;
|
|
lpWordInfo->wiChunkB.ciLineHandle = NULL;
|
|
lpWordInfo->wiChunkB.ciRunHandle = NULL;
|
|
lpWordInfo->wiChunkValid = FALSE;
|
|
|
|
/*
|
|
| Initialize character offset cache
|
|
*/
|
|
|
|
lpWordInfo->wiCharLine = 0xFFFF;
|
|
|
|
/*
|
|
| Get info about the section
|
|
*/
|
|
|
|
// CHGetSecInfo(lpWordInfo->wiGen.hFilter,lpWordInfo->wiGen.wSection,(PCHSECTIONINFO) &locSecInfo);
|
|
locSecInfo = *(CHLockSectionInfo(lpWordInfo->wiGen.hFilter,lpWordInfo->wiGen.wSection));
|
|
CHUnlockSectionInfo(lpWordInfo->wiGen.hFilter,lpWordInfo->wiGen.wSection);
|
|
|
|
if (locSecInfo.wType != SO_PARAGRAPHS)
|
|
{
|
|
return;
|
|
}
|
|
|
|
lpWordInfo->wiChunkTable = locSecInfo.hChunkTable;
|
|
lpWordInfo->wiFirstChunk = 0;
|
|
lpWordInfo->wiTotalChunks = CHTotalChunks(lpWordInfo->wiGen.wSection,lpWordInfo->wiGen.hFilter);
|
|
#ifdef SCCFEATURE_FONTS
|
|
lpWordInfo->wiFontTable = locSecInfo.hFontTable;
|
|
lpWordInfo->wiFontCount = locSecInfo.wNumFonts;
|
|
#else
|
|
lpWordInfo->wiFontTable = NULL;
|
|
lpWordInfo->wiFontCount = 0;
|
|
#endif
|
|
|
|
/*
|
|
| Set wiLastChunk to last COMPLETE!!! chunk
|
|
*/
|
|
|
|
pChunkTable = (PCHUNK) UTGlobalLock(lpWordInfo->wiChunkTable);
|
|
|
|
if (pChunkTable[locSecInfo.IDLastChunk].Flags & CH_COMPLETE)
|
|
lpWordInfo->wiLastChunk = locSecInfo.IDLastChunk;
|
|
else
|
|
lpWordInfo->wiLastChunk = locSecInfo.IDLastChunk - 1;
|
|
|
|
UTGlobalUnlock(lpWordInfo->wiChunkTable);
|
|
|
|
#ifdef SCCFEATURE_RAWTEXT
|
|
OIWSendRawText(lpWordInfo,lpWordInfo->wiFirstChunk,lpWordInfo->wiLastChunk);
|
|
#endif
|
|
|
|
/* PJB move to WIN.3E */
|
|
if (locSecInfo.Flags & CH_SECTIONFINISHED)
|
|
{
|
|
#ifdef SCCFEATURE_RAWTEXT
|
|
OIWSendRawText(lpWordInfo,(WORD)-1,(WORD)-1);
|
|
#endif
|
|
UTFlagOn(lpWordInfo->wiFlags,OIWF_SIZEKNOWN);
|
|
}
|
|
|
|
/*
|
|
| Initialize current width and height of the window
|
|
| and setup left and right wrap if in WRAP TO SCREEN mode
|
|
*/
|
|
DUGetDisplayRect(lpWordInfo,&locRect);
|
|
lpWordInfo->wiCurWidth = (WORD)(locRect.right - locRect.left);
|
|
lpWordInfo->wiCurHeight = (SHORT)(locRect.bottom - locRect.top);
|
|
lpWordInfo->wiCurXOffset = (SHORT)locRect.left;
|
|
lpWordInfo->wiCurYOffset = (SHORT)locRect.top;
|
|
|
|
if (lpWordInfo->wiDisplayMode == WPOP_DISPLAY_DRAFT || lpWordInfo->wiDisplayMode == WPOP_DISPLAY_NORMAL)
|
|
{
|
|
lpWordInfo->wiWrapLeft = OIW_LEFTBORDER;
|
|
lpWordInfo->wiWrapRight = lpWordInfo->wiCurWidth - 10;
|
|
}
|
|
|
|
/*
|
|
| Initialize the line displayed at the top of the window to zero and the left edge to zero
|
|
*/
|
|
|
|
lpWordInfo->wiCurLeftOffset = 0;
|
|
|
|
OIWGetFirstPos(&lpWordInfo->wiCurTopPos,lpWordInfo);
|
|
|
|
OIWUpdateVertScrollRange(lpWordInfo);
|
|
OIWUpdateVertScrollPos(lpWordInfo);
|
|
OIWUpdateHorzScrollRange(lpWordInfo);
|
|
OIWUpdateHorzScrollPos(lpWordInfo);
|
|
|
|
#ifdef SCCFEATURE_SELECT
|
|
|
|
/*
|
|
| Initialize selection to none OR the first tag
|
|
*/
|
|
|
|
lpWordInfo->wiEndPos = lpWordInfo->wiAnchorPos = lpWordInfo->wiCurTopPos;
|
|
|
|
#ifdef SCCFEATURE_TAGS
|
|
lpWordInfo->wiTagSelectChunk = 0xFFFF;
|
|
|
|
if (lpWordInfo->wiGen.wUserFlags & SCCVW_TAGSELECT)
|
|
{
|
|
if (OIGetFirstTagPos(&lpWordInfo->wiAnchorPos,&lpWordInfo->wiEndPos,lpWordInfo) == SCC_OK)
|
|
{
|
|
OIFixupWordPos(&lpWordInfo->wiAnchorPos,lpWordInfo);
|
|
OIFixupWordPos(&lpWordInfo->wiEndPos,lpWordInfo);
|
|
UTFlagOn(lpWordInfo->wiFlags,OIWF_AREASELECTED);
|
|
}
|
|
}
|
|
#endif /*SCCFEATURE_TAGS*/
|
|
|
|
DUSendParent( lpWordInfo, SCCVW_SELCHANGE, FALSE, 0 );
|
|
|
|
#endif /*SCCFEATURE_SELECT*/
|
|
}
|
|
|
|
/*
|
|
| OIWPaint
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
VOID OIWPaint(lpWordInfo,lpPaint)
|
|
LPOIWORDINFO lpWordInfo;
|
|
LPRECT lpPaint;
|
|
{
|
|
OIWORDPOS locPos;
|
|
SHORT locX;
|
|
SHORT locY;
|
|
SHORT locNewY;
|
|
DWORD locFlags;
|
|
OIWORDPOS locTopPos;
|
|
BOOL locHaveTopPos;
|
|
|
|
/*
|
|
| Do BeginPaint
|
|
*/
|
|
|
|
if (lpWordInfo->wiFlags & OIWF_PRINTING)
|
|
{
|
|
return;
|
|
}
|
|
|
|
/*
|
|
| Make sure text background is transparent
|
|
*/
|
|
#ifdef WINDOWS
|
|
SetBkMode(lpWordInfo->wiGen.hDC,TRANSPARENT);
|
|
#endif
|
|
locPos = lpWordInfo->wiCurTopPos;
|
|
locX = lpWordInfo->wiCurXOffset - lpWordInfo->wiCurLeftOffset;
|
|
locY = locNewY = lpWordInfo->wiCurYOffset;
|
|
locFlags = 0;
|
|
locHaveTopPos = FALSE;
|
|
|
|
while (locY < lpPaint->bottom)
|
|
{
|
|
locNewY = locY + OIWGetLineHeight(&locPos,lpWordInfo);
|
|
|
|
if (locNewY >= lpPaint->top)
|
|
{
|
|
if (!locHaveTopPos)
|
|
{
|
|
locTopPos = locPos;
|
|
locHaveTopPos = TRUE;
|
|
}
|
|
OIWDisplayLine(locPos.posChunk,locPos.posLine,locX,locY,&locFlags,lpWordInfo,NULL);
|
|
}
|
|
|
|
locY = locNewY;
|
|
|
|
if (!OINextLine(&locPos,lpWordInfo))
|
|
break; /* ran out of lines */
|
|
}
|
|
|
|
if (locY < lpPaint->bottom)
|
|
{
|
|
#ifdef WINDOWS
|
|
// SelectObject(lpWordInfo->wiGen.hDC,lpWordInfo->wiBackBrush);
|
|
SelectObject(lpWordInfo->wiGen.hDC,GetStockObject(LTGRAY_BRUSH));
|
|
SelectObject(lpWordInfo->wiGen.hDC,GetStockObject(NULL_PEN));
|
|
Rectangle(lpWordInfo->wiGen.hDC,0,locY,lpWordInfo->wiCurWidth+1,lpPaint->bottom+1);
|
|
#endif
|
|
}
|
|
|
|
/*
|
|
| If text is selected, show it
|
|
| else show the caret
|
|
*/
|
|
|
|
#ifdef SCCFEATURE_SELECT
|
|
if (lpWordInfo->wiFlags & OIWF_AREASELECTED)
|
|
{
|
|
OIWInvertArea(lpWordInfo,
|
|
&lpWordInfo->wiAnchorPos,
|
|
&lpWordInfo->wiEndPos,
|
|
&locTopPos);
|
|
}
|
|
else if (lpWordInfo->wiFlags & OIWF_CARETVISIBLE)
|
|
{
|
|
OIWDrawCaret(lpWordInfo);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
/*
|
|
| OIWScrollUp
|
|
|
|
|
|
|
|
*/
|
|
|
|
VOID OIWScrollUp(lpWordInfo,wLinesToScroll)
|
|
LPOIWORDINFO lpWordInfo;
|
|
WORD wLinesToScroll;
|
|
{
|
|
OIWORDPOS locPos;
|
|
SHORT locDeltaY;
|
|
|
|
if (lpWordInfo->wiCurTopPos.posChunk == lpWordInfo->wiFirstChunk && wLinesToScroll > lpWordInfo->wiCurTopPos.posLine)
|
|
wLinesToScroll = lpWordInfo->wiCurTopPos.posLine;
|
|
|
|
if (wLinesToScroll > 0)
|
|
{
|
|
locPos = lpWordInfo->wiCurTopPos;
|
|
OIMinusLines(&lpWordInfo->wiCurTopPos,&locPos,wLinesToScroll,lpWordInfo);
|
|
|
|
if (OIWGetDeltaY(lpWordInfo,&locPos,&lpWordInfo->wiCurTopPos,&locDeltaY))
|
|
DUScrollDisplay(lpWordInfo,0,-locDeltaY,NULL);
|
|
else
|
|
DUInvalRect(lpWordInfo,NULL);
|
|
|
|
OIFixupWordPosByLine(&lpWordInfo->wiCurTopPos,lpWordInfo);
|
|
OIWUpdateVertScrollPos(lpWordInfo);
|
|
DUUpdateWindow(lpWordInfo);
|
|
}
|
|
}
|
|
|
|
/*
|
|
| OIWScrollDown
|
|
|
|
|
|
|
|
*/
|
|
|
|
VOID OIWScrollDown(lpWordInfo,wLinesToScroll)
|
|
LPOIWORDINFO lpWordInfo;
|
|
WORD wLinesToScroll;
|
|
{
|
|
OIWORDPOS locPos;
|
|
SHORT locDeltaY;
|
|
|
|
if (wLinesToScroll != 0)
|
|
{
|
|
locPos = lpWordInfo->wiCurTopPos;
|
|
OIPlusLines(&lpWordInfo->wiCurTopPos,&locPos,wLinesToScroll,lpWordInfo);
|
|
|
|
if (OIWGetDeltaY(lpWordInfo,&locPos,&lpWordInfo->wiCurTopPos,&locDeltaY))
|
|
DUScrollDisplay(lpWordInfo,0,-locDeltaY,NULL);
|
|
else
|
|
DUInvalRect(lpWordInfo,NULL);
|
|
|
|
OIFixupWordPosByLine(&lpWordInfo->wiCurTopPos,lpWordInfo);
|
|
OIWUpdateVertScrollPos(lpWordInfo);
|
|
DUUpdateWindow(lpWordInfo);
|
|
}
|
|
}
|
|
|
|
|
|
BOOL OIWGetDeltaY(lpWordInfo,pPosA,pPosB,pDeltaY)
|
|
LPOIWORDINFO lpWordInfo;
|
|
LPOIWORDPOS pPosA;
|
|
LPOIWORDPOS pPosB;
|
|
SHORT FAR * pDeltaY;
|
|
{
|
|
LPOIWORDPOS locTempPosPtr;
|
|
OIWORDPOS locPosA;
|
|
SHORT locResult;
|
|
|
|
locResult = OIWComparePosByLine(lpWordInfo,pPosA,pPosB);
|
|
|
|
if (locResult == 0)
|
|
{
|
|
*pDeltaY = 0;
|
|
return(TRUE);
|
|
}
|
|
else if (locResult == 1)
|
|
{
|
|
locTempPosPtr = pPosA;
|
|
pPosA = pPosB;
|
|
pPosB = locTempPosPtr;
|
|
}
|
|
|
|
*pDeltaY = 0;
|
|
locPosA = *pPosA;
|
|
|
|
while (OIWComparePosByLine(lpWordInfo,&locPosA,pPosB))
|
|
{
|
|
*pDeltaY += OIWGetLineHeight(&locPosA,lpWordInfo);
|
|
|
|
if (*pDeltaY > lpWordInfo->wiCurHeight)
|
|
return(FALSE);
|
|
|
|
if (!OINextLine(&locPosA,lpWordInfo))
|
|
break; /* ran out of lines */
|
|
}
|
|
|
|
*pDeltaY = *pDeltaY * (-locResult);
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
|
|
/*
|
|
| OIWPageDown
|
|
|
|
|
|
|
|
*/
|
|
|
|
VOID OIWPageDown(lpWordInfo)
|
|
LPOIWORDINFO lpWordInfo;
|
|
{
|
|
SHORT locY;
|
|
|
|
locY = OIWGetLineHeight(&lpWordInfo->wiCurTopPos,lpWordInfo);
|
|
|
|
do
|
|
{
|
|
if (!OINextLine(&lpWordInfo->wiCurTopPos,lpWordInfo))
|
|
break; /* ran out of lines */
|
|
locY += OIWGetLineHeight(&lpWordInfo->wiCurTopPos,lpWordInfo);
|
|
} while (locY < lpWordInfo->wiCurHeight);
|
|
|
|
OIFixupWordPosByLine(&lpWordInfo->wiCurTopPos,lpWordInfo);
|
|
DUInvalRect(lpWordInfo,NULL);
|
|
OIWUpdateVertScrollPos(lpWordInfo);
|
|
OIWUpdateCaret(lpWordInfo);
|
|
}
|
|
|
|
/*
|
|
| OIWPageUp
|
|
|
|
|
|
|
|
*/
|
|
|
|
VOID OIWPageUp(lpWordInfo)
|
|
LPOIWORDINFO lpWordInfo;
|
|
{
|
|
SHORT locY;
|
|
|
|
locY = 0;
|
|
|
|
while (locY < lpWordInfo->wiCurHeight)
|
|
{
|
|
if (!OIPrevLine(&lpWordInfo->wiCurTopPos,lpWordInfo))
|
|
break; /* ran out of lines */
|
|
locY += OIWGetLineHeight(&lpWordInfo->wiCurTopPos,lpWordInfo);
|
|
}
|
|
|
|
OIFixupWordPosByLine(&lpWordInfo->wiCurTopPos,lpWordInfo);
|
|
DUInvalRect(lpWordInfo,NULL);
|
|
OIWUpdateVertScrollPos(lpWordInfo);
|
|
OIWUpdateCaret(lpWordInfo);
|
|
}
|
|
|
|
VOID OIWGotoTop(lpWordInfo)
|
|
LPOIWORDINFO lpWordInfo;
|
|
{
|
|
OIWORDPOS locOrgPos;
|
|
|
|
locOrgPos = lpWordInfo->wiCurTopPos;
|
|
|
|
OIWGetFirstPos(&lpWordInfo->wiCurTopPos,lpWordInfo);
|
|
OIFixupWordPosByLine(&lpWordInfo->wiCurTopPos,lpWordInfo);
|
|
|
|
if (OIWComparePosByLine(lpWordInfo,&locOrgPos,&lpWordInfo->wiCurTopPos) != 0)
|
|
{
|
|
DUInvalRect(lpWordInfo,NULL);
|
|
OIWUpdateVertScrollPos(lpWordInfo);
|
|
OIWUpdateCaret(lpWordInfo);
|
|
}
|
|
|
|
}
|
|
|
|
VOID OIWGotoBottom(lpWordInfo)
|
|
LPOIWORDINFO lpWordInfo;
|
|
{
|
|
SHORT locY;
|
|
BOOL locRanOut;
|
|
OIWORDPOS locOrgPos;
|
|
|
|
locOrgPos = lpWordInfo->wiCurTopPos;
|
|
|
|
|
|
/*
|
|
| Force read ahead to the end of the file
|
|
*/
|
|
|
|
while (!(lpWordInfo->wiFlags & OIWF_SIZEKNOWN))
|
|
{
|
|
DUReadMeAhead(lpWordInfo);
|
|
}
|
|
|
|
OIWGetLastPos(&lpWordInfo->wiCurTopPos,lpWordInfo);
|
|
OIFixupWordPosByLine(&lpWordInfo->wiCurTopPos,lpWordInfo);
|
|
|
|
/*
|
|
| Scan back so full page is visible
|
|
*/
|
|
|
|
locY = 0;
|
|
locRanOut = FALSE;
|
|
|
|
while (locY < lpWordInfo->wiCurHeight)
|
|
{
|
|
if (!OIPrevLine(&lpWordInfo->wiCurTopPos,lpWordInfo))
|
|
{
|
|
locRanOut = TRUE;
|
|
break; /* ran out of lines */
|
|
}
|
|
locY += OIWGetLineHeight(&lpWordInfo->wiCurTopPos,lpWordInfo);
|
|
}
|
|
|
|
/*
|
|
| Move forward to make it look good
|
|
*/
|
|
|
|
if (!locRanOut)
|
|
{
|
|
OINextLine(&lpWordInfo->wiCurTopPos,lpWordInfo);
|
|
OINextLine(&lpWordInfo->wiCurTopPos,lpWordInfo);
|
|
}
|
|
|
|
/*
|
|
| Invalidate and set scroll bars
|
|
*/
|
|
|
|
if (OIWComparePosByLine(lpWordInfo,&locOrgPos,&lpWordInfo->wiCurTopPos) != 0)
|
|
{
|
|
DUInvalRect(lpWordInfo,NULL);
|
|
OIWUpdateVertScrollPos(lpWordInfo);
|
|
OIWUpdateCaret(lpWordInfo);
|
|
}
|
|
}
|
|
|
|
/*
|
|
| OIWUpdateHorzScrollPos
|
|
|
|
|
|
|
|
*/
|
|
|
|
VOID OIWUpdateHorzScrollPos(lpWordInfo)
|
|
LPOIWORDINFO lpWordInfo;
|
|
{
|
|
DUSetHScrollPos(lpWordInfo,lpWordInfo->wiCurLeftOffset);
|
|
}
|
|
|
|
/*
|
|
| OIWUpdateHorzScrollRange
|
|
|
|
|
|
|
|
*/
|
|
|
|
VOID OIWUpdateHorzScrollRange(lpWordInfo)
|
|
LPOIWORDINFO lpWordInfo;
|
|
{
|
|
if (lpWordInfo->wiMaxX < lpWordInfo->wiCurWidth)
|
|
{
|
|
DUEnableHScroll(lpWordInfo,FALSE);
|
|
}
|
|
else
|
|
{
|
|
DUEnableHScroll(lpWordInfo,TRUE);
|
|
DUSetHScrollRange(lpWordInfo,0x0000,lpWordInfo->wiMaxX - lpWordInfo->wiCurWidth);
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
| OIWUpdateVertScrollRange
|
|
|
|
|
|
|
|
*/
|
|
|
|
VOID OIWUpdateVertScrollRange(lpWordInfo)
|
|
LPOIWORDINFO lpWordInfo;
|
|
{
|
|
BOOL locEnabled;
|
|
OIWORDPOS locTopPos;
|
|
OIWORDPOS locBottomPos;
|
|
SHORT locDeltaY;
|
|
|
|
locEnabled = TRUE;
|
|
|
|
if (lpWordInfo->wiFlags & OIWF_SIZEKNOWN && lpWordInfo->wiFirstChunk == lpWordInfo->wiLastChunk)
|
|
{
|
|
locTopPos.posChunk = lpWordInfo->wiFirstChunk;
|
|
locTopPos.posLine = 0;
|
|
locBottomPos.posChunk = lpWordInfo->wiLastChunk;
|
|
locBottomPos.posLine = OILinesInChunk(locBottomPos.posChunk,lpWordInfo);
|
|
|
|
if (OIWGetDeltaY(lpWordInfo,&locTopPos,&locBottomPos,&locDeltaY))
|
|
{
|
|
locEnabled = FALSE;
|
|
}
|
|
}
|
|
|
|
if (!locEnabled)
|
|
{
|
|
DUEnableVScroll(lpWordInfo,FALSE);
|
|
|
|
if (lpWordInfo->wiCurTopPos.posLine != 0)
|
|
OIWPosVertical(lpWordInfo,0);
|
|
}
|
|
else
|
|
{
|
|
DUEnableVScroll(lpWordInfo,TRUE);
|
|
DUSetVScrollRange(lpWordInfo,0,(lpWordInfo->wiTotalChunks * OIW_SCROLLGRAN)-1);
|
|
}
|
|
}
|
|
|
|
/*
|
|
| OIWUpdateVertScrollPos
|
|
|
|
|
|
|
|
*/
|
|
|
|
VOID OIWUpdateVertScrollPos(lpWordInfo)
|
|
LPOIWORDINFO lpWordInfo;
|
|
{
|
|
WORD locChunksToTop;
|
|
WORD locLinesInChunk;
|
|
WORD locPos;
|
|
|
|
locChunksToTop = OIChunksBetween(lpWordInfo->wiFirstChunk,lpWordInfo->wiCurTopPos.posChunk,lpWordInfo);
|
|
locLinesInChunk = OILinesInChunk(lpWordInfo->wiCurTopPos.posChunk,lpWordInfo);
|
|
|
|
if (locLinesInChunk <= 1)
|
|
{
|
|
locPos = OIW_SCROLLGRAN * locChunksToTop;
|
|
}
|
|
else
|
|
{
|
|
locPos = OIW_SCROLLGRAN * locChunksToTop + (WORD) ((DWORD)OIW_SCROLLGRAN * (DWORD)lpWordInfo->wiCurTopPos.posLine / (DWORD)(locLinesInChunk-1));
|
|
}
|
|
|
|
DUSetVScrollPos(lpWordInfo,locPos);
|
|
}
|
|
|
|
/*
|
|
| OIWPosVertical
|
|
|
|
|
|
|
|
*/
|
|
|
|
VOID OIWPosVertical(lpWordInfo,wPos)
|
|
LPOIWORDINFO lpWordInfo;
|
|
WORD wPos;
|
|
{
|
|
WORD locLinesInChunk;
|
|
|
|
lpWordInfo->wiCurTopPos.posChunk = OIWMapCountToChunk((WORD)(wPos/OIW_SCROLLGRAN),lpWordInfo);
|
|
|
|
locLinesInChunk = OILinesInChunk(lpWordInfo->wiCurTopPos.posChunk,lpWordInfo);
|
|
|
|
if (locLinesInChunk <= 1)
|
|
{
|
|
lpWordInfo->wiCurTopPos.posLine = 0;
|
|
}
|
|
else
|
|
{
|
|
lpWordInfo->wiCurTopPos.posLine = (WORD) ((DWORD) (wPos % OIW_SCROLLGRAN) * (DWORD) (locLinesInChunk-1) / (DWORD) OIW_SCROLLGRAN);
|
|
}
|
|
|
|
OIFixupWordPosByLine(&lpWordInfo->wiCurTopPos,lpWordInfo);
|
|
DUInvalRect(lpWordInfo,NULL);
|
|
OIWUpdateVertScrollPos(lpWordInfo);
|
|
}
|
|
|
|
VOID OIWPosHorizontal(lpWordInfo,wPos)
|
|
LPOIWORDINFO lpWordInfo;
|
|
WORD wPos;
|
|
{
|
|
lpWordInfo->wiCurLeftOffset = wPos;
|
|
DUInvalRect(lpWordInfo,NULL);
|
|
OIWUpdateHorzScrollPos(lpWordInfo);
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
| OIWComparePosByOffset
|
|
|
|
|
|
|
|
*/
|
|
|
|
SHORT OIWComparePosByOffset(lpWordInfo,pPosA,pPosB)
|
|
LPOIWORDINFO lpWordInfo;
|
|
LPOIWORDPOS pPosA;
|
|
LPOIWORDPOS pPosB;
|
|
{
|
|
SHORT locComp;
|
|
|
|
locComp = OICompareChunks(pPosA->posChunk,pPosB->posChunk,lpWordInfo);
|
|
|
|
if (locComp != 0)
|
|
{
|
|
return(locComp);
|
|
}
|
|
else
|
|
{
|
|
if (pPosA->posOffset < pPosB->posOffset)
|
|
{
|
|
return(-1);
|
|
}
|
|
else if (pPosA->posOffset > pPosB->posOffset)
|
|
{
|
|
return(1);
|
|
}
|
|
else
|
|
{
|
|
return(0);
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
| OIWComparePosByLine
|
|
|
|
|
|
|
|
*/
|
|
|
|
SHORT OIWComparePosByLine(lpWordInfo,pPosA,pPosB)
|
|
LPOIWORDINFO lpWordInfo;
|
|
LPOIWORDPOS pPosA;
|
|
LPOIWORDPOS pPosB;
|
|
{
|
|
SHORT locComp;
|
|
|
|
locComp = OICompareChunks(pPosA->posChunk,pPosB->posChunk,lpWordInfo);
|
|
|
|
if (locComp != 0)
|
|
{
|
|
return(locComp);
|
|
}
|
|
else
|
|
{
|
|
if (pPosA->posLine < pPosB->posLine)
|
|
{
|
|
return(-1);
|
|
}
|
|
else if (pPosA->posLine > pPosB->posLine)
|
|
{
|
|
return(1);
|
|
}
|
|
else
|
|
{
|
|
return(0);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
VOID OIWMakePosVisible(lpWordInfo,pPos)
|
|
LPOIWORDINFO lpWordInfo;
|
|
LPOIWORDPOS pPos;
|
|
{
|
|
OIWORDPOS locTopPos;
|
|
OIWORDPOS locBottomPos;
|
|
SHORT locTopComp;
|
|
SHORT locBottomComp;
|
|
SHORT locDeltaY;
|
|
SHORT locShift, locNewLeftOffset, locX1, locX2;
|
|
|
|
/*
|
|
| Make position visible vertically
|
|
*/
|
|
|
|
locTopPos = lpWordInfo->wiCurTopPos;
|
|
locTopComp = OIWComparePosByLine(lpWordInfo,&locTopPos,pPos);
|
|
|
|
if (locTopComp == 1)
|
|
{
|
|
lpWordInfo->wiCurTopPos = *pPos;
|
|
|
|
if (OIWGetDeltaY(lpWordInfo,pPos,&locTopPos,&locDeltaY))
|
|
{
|
|
DUScrollDisplay(lpWordInfo,0,locDeltaY,NULL);
|
|
}
|
|
else
|
|
{
|
|
DUInvalRect(lpWordInfo,NULL);
|
|
}
|
|
|
|
OIFixupWordPosByLine(&lpWordInfo->wiCurTopPos,lpWordInfo);
|
|
OIWUpdateVertScrollPos(lpWordInfo);
|
|
DUUpdateWindow(lpWordInfo);
|
|
}
|
|
else if (locTopComp == -1)
|
|
{
|
|
OIPlusLinesByDY(&locBottomPos,&locTopPos,lpWordInfo->wiCurHeight,lpWordInfo);
|
|
locBottomComp = OIWComparePosByLine(lpWordInfo,&locBottomPos,pPos);
|
|
|
|
if (locBottomComp == -1)
|
|
{
|
|
OIMinusLinesByDY(&locTopPos,pPos,lpWordInfo->wiCurHeight,lpWordInfo);
|
|
|
|
if (OIWGetDeltaY(lpWordInfo,&lpWordInfo->wiCurTopPos,&locTopPos,&locDeltaY))
|
|
{
|
|
DUScrollDisplay(lpWordInfo,0,-locDeltaY,NULL);
|
|
}
|
|
else
|
|
{
|
|
DUInvalRect(lpWordInfo,NULL);
|
|
}
|
|
|
|
lpWordInfo->wiCurTopPos = locTopPos;
|
|
OIFixupWordPosByLine(&lpWordInfo->wiCurTopPos,lpWordInfo);
|
|
OIWUpdateVertScrollPos(lpWordInfo);
|
|
DUUpdateWindow(lpWordInfo);
|
|
}
|
|
}
|
|
|
|
/*
|
|
| Make position visible horizontally
|
|
*/
|
|
|
|
locShift = 0;
|
|
OIMapWordLineToCharInfo(pPos,lpWordInfo);
|
|
locX1 = lpWordInfo->wiCharXs[pPos->posChar];
|
|
if ( pPos->posChar < lpWordInfo->wiCharCount )
|
|
locX2 = lpWordInfo->wiCharXs[pPos->posChar + 1];
|
|
else
|
|
locX2 = locX1;
|
|
locNewLeftOffset = lpWordInfo->wiCurLeftOffset;
|
|
if ( locX1 < lpWordInfo->wiCurLeftOffset )
|
|
{
|
|
if ( pPos->posChar == 0 && locX2 <= (SHORT)lpWordInfo->wiCurWidth )
|
|
locNewLeftOffset = 0;
|
|
else
|
|
locNewLeftOffset = (locX1/OIWORD_HORZSHIFT)*OIWORD_HORZSHIFT;
|
|
}
|
|
else if ( locX2 > (SHORT)(lpWordInfo->wiCurLeftOffset + lpWordInfo->wiCurWidth) )
|
|
{
|
|
locNewLeftOffset = (locX1/OIWORD_HORZSHIFT)*OIWORD_HORZSHIFT;
|
|
while ( locNewLeftOffset + (SHORT)lpWordInfo->wiCurWidth - OIWORD_HORZSHIFT > locX2 )
|
|
locNewLeftOffset -= OIWORD_HORZSHIFT;
|
|
}
|
|
if ( locNewLeftOffset != lpWordInfo->wiCurLeftOffset )
|
|
{
|
|
locShift = lpWordInfo->wiCurLeftOffset - locNewLeftOffset;
|
|
if ( locShift < 0 )
|
|
{
|
|
if ( -locShift < (SHORT)lpWordInfo->wiCurWidth )
|
|
DUScrollDisplay(lpWordInfo,locShift,0,NULL);
|
|
else
|
|
DUInvalRect(lpWordInfo,NULL);
|
|
}
|
|
else
|
|
{
|
|
if ( locShift < (SHORT)lpWordInfo->wiCurWidth )
|
|
DUScrollDisplay(lpWordInfo,locShift,0,NULL);
|
|
else
|
|
DUInvalRect(lpWordInfo,NULL);
|
|
}
|
|
lpWordInfo->wiCurLeftOffset = locNewLeftOffset;
|
|
OIWUpdateHorzScrollPos(lpWordInfo);
|
|
}
|
|
}
|
|
|
|
/*
|
|
| OIWScrollLeft
|
|
*/
|
|
|
|
VOID OIWScrollLeft(lpWordInfo)
|
|
LPOIWORDINFO lpWordInfo;
|
|
{
|
|
if (lpWordInfo->wiCurLeftOffset > 0)
|
|
{
|
|
DUScrollDisplay(lpWordInfo,OIWORD_HORZSHIFT,0,NULL);
|
|
lpWordInfo->wiCurLeftOffset -= OIWORD_HORZSHIFT;
|
|
OIWUpdateHorzScrollPos(lpWordInfo);
|
|
}
|
|
}
|
|
|
|
/*
|
|
| OIWPageLeft
|
|
*/
|
|
|
|
VOID OIWPageLeft(lpWordInfo)
|
|
LPOIWORDINFO lpWordInfo;
|
|
{
|
|
SHORT locShift;
|
|
|
|
if (lpWordInfo->wiCurLeftOffset > 0)
|
|
{
|
|
locShift = lpWordInfo->wiCurWidth;
|
|
|
|
if (lpWordInfo->wiCurLeftOffset < locShift)
|
|
locShift = lpWordInfo->wiCurLeftOffset;
|
|
|
|
DUScrollDisplay(lpWordInfo,locShift,0,NULL);
|
|
lpWordInfo->wiCurLeftOffset -= locShift;
|
|
OIWUpdateHorzScrollPos(lpWordInfo);
|
|
}
|
|
}
|
|
|
|
/*
|
|
| OIWScrollRight
|
|
*/
|
|
|
|
VOID OIWScrollRight(lpWordInfo)
|
|
LPOIWORDINFO lpWordInfo;
|
|
{
|
|
if (lpWordInfo->wiCurLeftOffset < (SHORT)(lpWordInfo->wiMaxX - lpWordInfo->wiCurWidth))
|
|
{
|
|
DUScrollDisplay(lpWordInfo,-OIWORD_HORZSHIFT,0,NULL);
|
|
lpWordInfo->wiCurLeftOffset += OIWORD_HORZSHIFT;
|
|
OIWUpdateHorzScrollPos(lpWordInfo);
|
|
}
|
|
}
|
|
|
|
/*
|
|
| OIWPageRight
|
|
*/
|
|
|
|
VOID OIWPageRight(lpWordInfo)
|
|
LPOIWORDINFO lpWordInfo;
|
|
{
|
|
SHORT locShift;
|
|
|
|
if (lpWordInfo->wiCurLeftOffset < (SHORT)(lpWordInfo->wiMaxX - lpWordInfo->wiCurWidth))
|
|
{
|
|
locShift = lpWordInfo->wiCurWidth;
|
|
|
|
if (lpWordInfo->wiCurLeftOffset + locShift > (SHORT)(lpWordInfo->wiMaxX - lpWordInfo->wiCurWidth))
|
|
locShift = lpWordInfo->wiMaxX - lpWordInfo->wiCurWidth - lpWordInfo->wiCurLeftOffset;
|
|
|
|
DUScrollDisplay(lpWordInfo,-locShift,0,NULL);
|
|
lpWordInfo->wiCurLeftOffset += locShift;
|
|
OIWUpdateHorzScrollPos(lpWordInfo);
|
|
}
|
|
}
|
|
|
|
/*
|
|
| OIWDoReadAhead
|
|
|
|
|
|
|
|
*/
|
|
|
|
VOID OIWDoReadAhead(lpWordInfo)
|
|
LPOIWORDINFO lpWordInfo;
|
|
{
|
|
CHSECTIONINFO locSecInfo;
|
|
PCHUNK locChunkTable;
|
|
WORD locNewLastChunk;
|
|
|
|
// CHGetSecInfo(lpWordInfo->wiGen.hFilter,lpWordInfo->wiGen.wSection,(PCHSECTIONINFO) &locSecInfo);
|
|
locSecInfo = *(CHLockSectionInfo(lpWordInfo->wiGen.hFilter,lpWordInfo->wiGen.wSection));
|
|
CHUnlockSectionInfo(lpWordInfo->wiGen.hFilter,lpWordInfo->wiGen.wSection);
|
|
|
|
lpWordInfo->wiFirstChunk = 0;
|
|
lpWordInfo->wiChunkTable = locSecInfo.hChunkTable;
|
|
lpWordInfo->wiFontTable = locSecInfo.hFontTable;
|
|
lpWordInfo->wiFontCount = locSecInfo.wNumFonts;
|
|
|
|
locChunkTable = (PCHUNK) UTGlobalLock(lpWordInfo->wiChunkTable);
|
|
|
|
if (locChunkTable[locSecInfo.IDLastChunk].Flags & CH_COMPLETE)
|
|
locNewLastChunk = locSecInfo.IDLastChunk;
|
|
else
|
|
locNewLastChunk = locSecInfo.IDLastChunk - 1;
|
|
|
|
if (locNewLastChunk != lpWordInfo->wiLastChunk)
|
|
{
|
|
lpWordInfo->wiLastChunk = locNewLastChunk;
|
|
UTFlagOn(locChunkTable[locNewLastChunk].Flags,CH_WRAPINVALID);
|
|
#ifdef SCCFEATURE_RAWTEXT
|
|
OIWSendRawText(lpWordInfo,locNewLastChunk,locNewLastChunk);
|
|
#endif
|
|
}
|
|
|
|
UTGlobalUnlock(lpWordInfo->wiChunkTable);
|
|
|
|
if (locSecInfo.Flags & CH_SECTIONFINISHED)
|
|
{
|
|
/* PJB move to WIN.3E */
|
|
#ifdef SCCFEATURE_RAWTEXT
|
|
if (!(lpWordInfo->wiFlags & OIWF_SIZEKNOWN))
|
|
OIWSendRawText(lpWordInfo,(WORD)-1,(WORD)-1);
|
|
#endif
|
|
UTFlagOn(lpWordInfo->wiFlags,OIWF_SIZEKNOWN);
|
|
}
|
|
|
|
lpWordInfo->wiTotalChunks = CHTotalChunks(lpWordInfo->wiGen.wSection,lpWordInfo->wiGen.hFilter);
|
|
|
|
OIWUpdateVertScrollRange(lpWordInfo);
|
|
OIWUpdateHorzScrollRange(lpWordInfo);
|
|
}
|
|
|
|
/*
|
|
| OIWDoBackground
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#ifdef SCCFEATURE_CLIP
|
|
|
|
/*
|
|
| OIWGetClipInfo
|
|
|
|
|
|
|
|
*/
|
|
|
|
DWORD OIWGetClipInfo(lpWordInfo)
|
|
LPOIWORDINFO lpWordInfo;
|
|
{
|
|
DWORD locRet;
|
|
|
|
locRet = 0;
|
|
|
|
if (lpWordInfo->wiFlags & OIWF_AREASELECTED)
|
|
{
|
|
locRet |= SCCVW_CANCOPYTOCLIP;
|
|
if (lpWordInfo->wiGen.wUserFlags & SCCVW_EDITOR)
|
|
{
|
|
locRet |= SCCVW_CANCUTTOCLIP;
|
|
}
|
|
}
|
|
|
|
#ifdef WINDOWS
|
|
|
|
if (lpWordInfo->wiGen.wUserFlags & SCCVW_EDITOR && IsClipboardFormatAvailable(CF_TEXT))
|
|
{
|
|
locRet |= SCCVW_CANPASTEFROMCLIP;
|
|
}
|
|
|
|
#endif
|
|
|
|
return(locRet);
|
|
}
|
|
|
|
#endif //SCCFEATURE_CLIP
|
|
|
|
/*
|
|
| OIWUpdateCaret
|
|
|
|
|
|
|
|
*/
|
|
#ifdef SCCFEATURE_SELECT
|
|
|
|
VOID OIWUpdateCaret(lpWordInfo)
|
|
LPOIWORDINFO lpWordInfo;
|
|
{
|
|
#ifdef NEVER
|
|
SHORT wX;
|
|
SHORT wY;
|
|
BYTE tempBuf[80];
|
|
SHORT wCaretHeight;
|
|
|
|
#ifdef WINDOWS
|
|
if (lpWordInfo->wiGen.hWnd != GetFocus())
|
|
return;
|
|
#endif /*WINDOWS*/
|
|
|
|
if (lpWordInfo->wiFlags & OIWF_AREASELECTED || lpWordInfo->wiFlags & OIWF_NOCARET)
|
|
{
|
|
OIWHideCaret(lpWordInfo);
|
|
}
|
|
else
|
|
{
|
|
|
|
#ifdef NEVER
|
|
if (lpWordInfo->wiGen.wUserFlags & SCCVW_SPAM)
|
|
{
|
|
wsprintf(tempBuf,"Chunk[%i] Offset[%i] Line[%i]",lpWordInfo->wiAnchorPos.posChunk,lpWordInfo->wiAnchorPos.posOffset,lpWordInfo->wiAnchorPos.posLine);
|
|
SendMessage(GetParent(lpWordInfo->wiGen.hWnd),SCCD_STATUSTEXT,0,(DWORD)(LPSTR)tempBuf);
|
|
}
|
|
#endif /*NEVER*/
|
|
|
|
if (OIWIsPosOnScreen(&lpWordInfo->wiAnchorPos,lpWordInfo))
|
|
{
|
|
OIMapWordPosToXy(
|
|
&lpWordInfo->wiAnchorPos,
|
|
&wX,
|
|
&wY,
|
|
lpWordInfo);
|
|
|
|
wCaretHeight = OIWGetLineHeight(&lpWordInfo->wiAnchorPos,lpWordInfo);
|
|
|
|
OIWHideCaret(lpWordInfo);
|
|
|
|
OIWNewCaret(lpWordInfo,wCaretHeight);
|
|
|
|
OIWSetCaretPosNP(lpWordInfo,wX,wY);
|
|
|
|
OIWShowCaret(lpWordInfo);
|
|
}
|
|
else
|
|
{
|
|
OIWHideCaret(lpWordInfo);
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
#endif //SCCFEATURE_SELECT
|
|
|
|
/*
|
|
| OIWHandleKey
|
|
|
|
|
|
|
|
*/
|
|
|
|
VOID OIWHandleKeyEvent(lpWordInfo,wKey,wModifierKeys)
|
|
LPOIWORDINFO lpWordInfo;
|
|
WORD wKey;
|
|
WORD wModifierKeys;
|
|
{
|
|
DUBeginDraw(lpWordInfo);
|
|
|
|
switch (wKey)
|
|
{
|
|
case SCCD_KLEFT:
|
|
case SCCD_KUP:
|
|
case SCCD_KRIGHT:
|
|
case SCCD_KDOWN:
|
|
case SCCD_KPAGEUP:
|
|
case SCCD_KPAGEDOWN:
|
|
case SCCD_KHOME:
|
|
case SCCD_KEND:
|
|
OIWHandleDirectionKey(lpWordInfo,wKey,wModifierKeys);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
DUEndDraw(lpWordInfo);
|
|
}
|
|
/*
|
|
| OIWHandleDirectionKey
|
|
|
|
|
|
|
|
*/
|
|
|
|
VOID OIWHandleDirectionKey(lpWordInfo,wDirection,wModifierKeys)
|
|
LPOIWORDINFO lpWordInfo;
|
|
WORD wDirection;
|
|
WORD wModifierKeys;
|
|
{
|
|
#ifdef SCCFEATURE_TAGS
|
|
if (lpWordInfo->wiGen.wUserFlags & SCCVW_TAGSELECT)
|
|
{
|
|
OIWMoveTag(lpWordInfo,wDirection);
|
|
return;
|
|
}
|
|
#endif /*SCCFEATURE_TAGS*/
|
|
#ifdef SCCFEATURE_SELECT
|
|
if (lpWordInfo->wiGen.wUserFlags & SCCVW_SELECTION)
|
|
{
|
|
if (wModifierKeys & SCCD_KSHIFT)
|
|
OIWMoveEnd(lpWordInfo,wDirection);
|
|
else
|
|
OIWMoveCaret(lpWordInfo,wDirection);
|
|
}
|
|
else
|
|
#endif
|
|
{
|
|
switch (wDirection)
|
|
{
|
|
case SCCD_KLEFT:
|
|
OIWScrollLeft(lpWordInfo);
|
|
break;
|
|
|
|
case SCCD_KUP:
|
|
OIWScrollUp(lpWordInfo,1);
|
|
break;
|
|
|
|
case SCCD_KPAGEUP:
|
|
|
|
OIWPageUp(lpWordInfo);
|
|
break;
|
|
|
|
case SCCD_KRIGHT:
|
|
OIWScrollRight(lpWordInfo);
|
|
break;
|
|
|
|
case SCCD_KDOWN:
|
|
OIWScrollDown(lpWordInfo,1);
|
|
break;
|
|
|
|
case SCCD_KPAGEDOWN:
|
|
|
|
OIWPageDown(lpWordInfo);
|
|
break;
|
|
|
|
case SCCD_KHOME:
|
|
|
|
if (wModifierKeys & SCCD_KCONTROL)
|
|
{
|
|
OIWGotoTop(lpWordInfo);
|
|
}
|
|
|
|
break;
|
|
|
|
case SCCD_KEND:
|
|
|
|
if (wModifierKeys & SCCD_KCONTROL)
|
|
{
|
|
OIWGotoBottom(lpWordInfo);
|
|
}
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
| OIWMoveTag
|
|
|
|
|
|
|
|
*/
|
|
|
|
#ifdef SCCFEATURE_TAGS
|
|
|
|
VOID OIWMoveTag(lpWordInfo,wDirection)
|
|
LPOIWORDINFO lpWordInfo;
|
|
WORD wDirection;
|
|
{
|
|
OIWORDPOS locStartPos;
|
|
OIWORDPOS locEndPos;
|
|
BOOL locChange;
|
|
#ifdef WINDOWS
|
|
locChange = FALSE;
|
|
|
|
switch (wDirection)
|
|
{
|
|
case VK_LEFT:
|
|
|
|
if (OIGetPrevTagPos(&locStartPos,&locEndPos,lpWordInfo))
|
|
locChange = TRUE;
|
|
|
|
break;
|
|
|
|
case VK_UP:
|
|
|
|
if (OIGetPrevTagPos(&locStartPos,&locEndPos,lpWordInfo))
|
|
locChange = TRUE;
|
|
break;
|
|
|
|
case VK_PRIOR:
|
|
break;
|
|
|
|
case VK_RIGHT:
|
|
|
|
if (OIGetNextTagPos(&locStartPos,&locEndPos,lpWordInfo))
|
|
locChange = TRUE;
|
|
break;
|
|
|
|
case VK_DOWN:
|
|
|
|
if (OIGetNextTagPos(&locStartPos,&locEndPos,lpWordInfo))
|
|
locChange = TRUE;
|
|
break;
|
|
|
|
case VK_NEXT:
|
|
break;
|
|
|
|
case VK_HOME:
|
|
break;
|
|
|
|
case VK_END:
|
|
break;
|
|
}
|
|
|
|
if (locChange)
|
|
{
|
|
OIWSetSelection(lpWordInfo,&locStartPos,&locEndPos);
|
|
OISendDropForCurrentTag(lpWordInfo,SCCVWEVENT_SELECT);
|
|
OIWMakePosVisible(lpWordInfo,&lpWordInfo->wiAnchorPos);
|
|
}
|
|
#endif
|
|
}
|
|
#endif //SCCFEATURE_TAGS
|
|
|
|
/*
|
|
| OIWMoveCaret
|
|
|
|
|
|
|
|
*/
|
|
|
|
#ifdef SCCFEATURE_SELECT
|
|
|
|
VOID OIWMoveCaret(lpWordInfo,wDirection)
|
|
LPOIWORDINFO lpWordInfo;
|
|
WORD wDirection;
|
|
{
|
|
OIWORDPOS locPos;
|
|
OIWORDPOS locDummyPos;
|
|
|
|
if (lpWordInfo->wiFlags & OIWF_AREASELECTED)
|
|
{
|
|
OIWClearSelection(lpWordInfo);
|
|
|
|
if (wDirection == SCCD_KLEFT || wDirection == SCCD_KUP)
|
|
{
|
|
lpWordInfo->wiAnchorPos = lpWordInfo->wiEndPos = OIWordSelectTopPos;
|
|
}
|
|
else
|
|
{
|
|
lpWordInfo->wiAnchorPos = lpWordInfo->wiEndPos = OIWordSelectBottomPos;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
OIWHideCaret(lpWordInfo);
|
|
}
|
|
|
|
switch (wDirection)
|
|
{
|
|
case SCCD_KLEFT:
|
|
|
|
OIGetWordPosPrev(&lpWordInfo->wiAnchorPos,&locPos,lpWordInfo);
|
|
lpWordInfo->wiAnchorPos = lpWordInfo->wiEndPos = locPos;
|
|
break;
|
|
|
|
case SCCD_KUP:
|
|
|
|
OIGetWordPosUp(&lpWordInfo->wiAnchorPos,&locPos,lpWordInfo);
|
|
lpWordInfo->wiAnchorPos = lpWordInfo->wiEndPos = locPos;
|
|
break;
|
|
|
|
case SCCD_KPAGEUP:
|
|
|
|
OIMinusLinesByDY(&locPos,&lpWordInfo->wiAnchorPos,lpWordInfo->wiCurHeight,lpWordInfo);
|
|
OIFixupWordPosByLine(&locPos,lpWordInfo);
|
|
lpWordInfo->wiAnchorPos = lpWordInfo->wiEndPos = locPos;
|
|
break;
|
|
|
|
case SCCD_KRIGHT:
|
|
|
|
OIGetWordPosNext(&lpWordInfo->wiAnchorPos,&locPos,lpWordInfo);
|
|
lpWordInfo->wiAnchorPos = lpWordInfo->wiEndPos = locPos;
|
|
break;
|
|
|
|
case SCCD_KDOWN:
|
|
|
|
OIGetWordPosDown(&lpWordInfo->wiAnchorPos,&locPos,lpWordInfo);
|
|
lpWordInfo->wiAnchorPos = lpWordInfo->wiEndPos = locPos;
|
|
break;
|
|
|
|
case SCCD_KPAGEDOWN:
|
|
|
|
OIPlusLinesByDY(&locPos,&lpWordInfo->wiAnchorPos,lpWordInfo->wiCurHeight,lpWordInfo);
|
|
OIFixupWordPosByLine(&locPos,lpWordInfo);
|
|
lpWordInfo->wiAnchorPos = lpWordInfo->wiEndPos = locPos;
|
|
break;
|
|
|
|
case SCCD_KHOME:
|
|
OIGetWordLineEnds(&lpWordInfo->wiAnchorPos,&locPos,&locDummyPos,lpWordInfo);
|
|
lpWordInfo->wiAnchorPos = lpWordInfo->wiEndPos = locPos;
|
|
break;
|
|
|
|
case SCCD_KEND:
|
|
OIGetWordLineEnds(&lpWordInfo->wiAnchorPos,&locDummyPos,&locPos,lpWordInfo);
|
|
lpWordInfo->wiAnchorPos = lpWordInfo->wiEndPos = locPos;
|
|
break;
|
|
}
|
|
|
|
OIWShowCaret(lpWordInfo);
|
|
OIWMakePosVisible(lpWordInfo,&lpWordInfo->wiAnchorPos);
|
|
}
|
|
|
|
VOID OIWMoveEnd(lpWordInfo,wDirection)
|
|
LPOIWORDINFO lpWordInfo;
|
|
WORD wDirection;
|
|
{
|
|
#ifdef WINDOWS
|
|
OIWORDPOS locPos;
|
|
OIWORDPOS locDummyPos;
|
|
|
|
switch (wDirection)
|
|
{
|
|
case SCCD_KLEFT:
|
|
|
|
OIGetWordPosPrev(&lpWordInfo->wiEndPos,&locPos,lpWordInfo);
|
|
break;
|
|
|
|
case SCCD_KUP:
|
|
|
|
OIGetWordPosUp(&lpWordInfo->wiEndPos,&locPos,lpWordInfo);
|
|
break;
|
|
|
|
case SCCD_KPAGEUP:
|
|
|
|
OIMinusLinesByDY(&locPos,&lpWordInfo->wiEndPos,lpWordInfo->wiCurHeight,lpWordInfo);
|
|
OIFixupWordPosByLine(&locPos,lpWordInfo);
|
|
break;
|
|
|
|
case SCCD_KRIGHT:
|
|
|
|
OIGetWordPosNext(&lpWordInfo->wiEndPos,&locPos,lpWordInfo);
|
|
break;
|
|
|
|
case SCCD_KDOWN:
|
|
|
|
OIGetWordPosDown(&lpWordInfo->wiEndPos,&locPos,lpWordInfo);
|
|
break;
|
|
|
|
case SCCD_KPAGEDOWN:
|
|
|
|
OIPlusLines(&locPos,&lpWordInfo->wiEndPos,lpWordInfo->wiCurHeight,lpWordInfo);
|
|
OIFixupWordPosByLine(&locPos,lpWordInfo);
|
|
break;
|
|
|
|
case SCCD_KHOME:
|
|
OIGetWordLineEnds(&lpWordInfo->wiEndPos,&locPos,&locDummyPos,lpWordInfo);
|
|
break;
|
|
|
|
case SCCD_KEND:
|
|
OIGetWordLineEnds(&lpWordInfo->wiEndPos,&locDummyPos,&locPos,lpWordInfo);
|
|
break;
|
|
|
|
default:
|
|
locPos = lpWordInfo->wiEndPos;
|
|
}
|
|
|
|
if (lpWordInfo->wiFlags & OIWF_AREASELECTED)
|
|
{
|
|
if (OIWComparePosByOffset(lpWordInfo,&lpWordInfo->wiAnchorPos,&locPos))
|
|
{
|
|
UTFlagOff(lpWordInfo->wiFlags,OIWF_WORDSELECTION);
|
|
OIWAddToSelection(lpWordInfo,&locPos);
|
|
}
|
|
else
|
|
{
|
|
OIWClearSelection(lpWordInfo);
|
|
lpWordInfo->wiEndPos = lpWordInfo->wiAnchorPos;
|
|
OIWShowCaret(lpWordInfo);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
OIWSetSelection(lpWordInfo,&lpWordInfo->wiAnchorPos,&locPos);
|
|
}
|
|
|
|
OIWMakePosVisible(lpWordInfo,&lpWordInfo->wiEndPos);
|
|
#endif //WINDOWS
|
|
}
|
|
#endif //SCCFEATURE_SELECT
|
|
|
|
VOID OIWProcessEnterKey(lpWordInfo)
|
|
LPOIWORDINFO lpWordInfo;
|
|
{
|
|
#ifdef SCCFEATURE_TAGS
|
|
#ifdef WINDOWS
|
|
OIWORDPOS locDummy1;
|
|
OIWORDPOS locDummy2;
|
|
|
|
if (!(lpWordInfo->wiGen.wUserFlags & SCCVW_EDITOR))
|
|
{
|
|
if (lpWordInfo->wiGen.wUserFlags & SCCVW_TAGSELECT)
|
|
{
|
|
OISendDropForCurrentTag(lpWordInfo,SCCVWEVENT_ENTER);
|
|
}
|
|
else if (!(lpWordInfo->wiFlags & OIWF_AREASELECTED) && lpWordInfo->wiGen.wUserFlags & SCCVW_SELECTION)
|
|
{
|
|
OIMapWordPosToTag(&lpWordInfo->wiAnchorPos,&locDummy1,&locDummy2,lpWordInfo);
|
|
OISendDropForCurrentTag(lpWordInfo,SCCVWEVENT_ENTER);
|
|
}
|
|
}
|
|
#endif //WINDOWS
|
|
#endif //SCCFEATURE_TAGS
|
|
}
|
|
|
|
VOID OIInvalidateWordLines(lpWordInfo,pStartPos,pEndPos,bErase)
|
|
LPOIWORDINFO lpWordInfo;
|
|
LPOIWORDPOS pStartPos;
|
|
LPOIWORDPOS pEndPos;
|
|
BOOL bErase;
|
|
{
|
|
|
|
/* NEED TO REPLACE WITH VARIABLE HEIGHT ??? */
|
|
}
|
|
|
|
LONG OIWEraseBackground(lpWordInfo,wParam,lParam)
|
|
LPOIWORDINFO lpWordInfo;
|
|
WORD wParam;
|
|
LONG lParam;
|
|
{
|
|
LONG locRet;
|
|
#ifdef WINDOWS
|
|
//WORD locOldBrushHnd;
|
|
|
|
if (lpWordInfo->wiFlags & OIWF_PRINTING)
|
|
{
|
|
locRet = DefWindowProc(lpWordInfo->wiGen.hWnd, WM_ERASEBKGND, wParam, lParam);
|
|
}
|
|
else
|
|
{
|
|
// locOldBrushHnd = SetClassWord(lpWordInfo->wiGen.hWnd, GCW_HBRBACKGROUND, (WORD) lpWordInfo->wiBackBrush);
|
|
|
|
locRet = DefWindowProc(lpWordInfo->wiGen.hWnd, WM_ERASEBKGND, wParam, lParam);
|
|
|
|
// SetClassWord(lpWordInfo->wiGen.hWnd, GCW_HBRBACKGROUND, locOldBrushHnd);
|
|
}
|
|
|
|
#endif
|
|
return(locRet);
|
|
}
|
|
|
|
|
|
|
|
VOID OISetWordUserFlags(lpWordInfo,wFlags)
|
|
LPOIWORDINFO lpWordInfo;
|
|
WORD wFlags;
|
|
{
|
|
#ifdef SCCFEATURE_SELECT
|
|
if (wFlags & SCCVW_TAGSELECT || !(wFlags & SCCVW_SELECTION))
|
|
#endif
|
|
UTFlagOn(lpWordInfo->wiFlags,OIWF_NOCARET);
|
|
#ifdef SCCFEATURE_SELECT
|
|
else
|
|
UTFlagOff(lpWordInfo->wiFlags,OIWF_NOCARET);
|
|
#endif
|
|
|
|
lpWordInfo->wiGen.wUserFlags = wFlags;
|
|
}
|
|
|
|
VOID OIHandleWordMouseEvent(lpWordInfo,wMessage,wKeyInfo,wX,wY)
|
|
LPOIWORDINFO lpWordInfo;
|
|
WORD wMessage;
|
|
WORD wKeyInfo;
|
|
SHORT wX;
|
|
SHORT wY;
|
|
{
|
|
|
|
|
|
if (wMessage == SCCD_MOUSEMOVE)
|
|
{
|
|
#ifdef SCCFEATURE_SELECT
|
|
if (lpWordInfo->wiMouseFlags & OIWF_MOUSELEFTACTIVE)
|
|
{
|
|
if (lpWordInfo->wiGen.wUserFlags & SCCVW_SELECTION)
|
|
{
|
|
DUBeginDraw(lpWordInfo);
|
|
|
|
OIWUpdateSelection(lpWordInfo,wX,wY);
|
|
|
|
DUEndDraw(lpWordInfo);
|
|
}
|
|
else
|
|
{
|
|
OIWAutoScrollCheck(lpWordInfo,&wX,&wY);
|
|
}
|
|
|
|
return;
|
|
}
|
|
#endif //SCCFEATURE_SELECT
|
|
#ifdef SCCFEATURE_WORDDRAG
|
|
if (lpWordInfo->wiMouseFlags & OIWF_MOUSERIGHTACTIVE
|
|
&& lpWordInfo->wiMouseFlags & OIWF_MOUSERIGHTSINGLE
|
|
&& lpWordInfo->wiGen.wUserFlags & SCCVW_WORDDRAG)
|
|
{
|
|
OIDoWordDrag(lpWordInfo,wX,wY);
|
|
}
|
|
#endif
|
|
return;
|
|
}
|
|
|
|
switch (wMessage)
|
|
{
|
|
case SCCD_LBUTTONDOWN:
|
|
|
|
UTFlagOn(lpWordInfo->wiMouseFlags,OIWF_MOUSELEFTSINGLE);
|
|
UTFlagOff(lpWordInfo->wiMouseFlags,OIWF_MOUSELEFTDOUBLE);
|
|
#ifdef SCCFEATURE_SELECT
|
|
|
|
if (!(lpWordInfo->wiMouseFlags & OIWF_MOUSERIGHTACTIVE))
|
|
{
|
|
UTFlagOn(lpWordInfo->wiMouseFlags,OIWF_MOUSELEFTACTIVE);
|
|
#ifdef WINDOWS
|
|
SetCapture(lpWordInfo->wiGen.hWnd);
|
|
#endif
|
|
UTFlagOn(lpWordInfo->wiErrorFlags,OIWF_RELEASEMOUSE);
|
|
|
|
if (lpWordInfo->wiGen.wUserFlags & SCCVW_SELECTION)
|
|
{
|
|
DUBeginDraw(lpWordInfo);
|
|
|
|
if (wKeyInfo & SCCD_MOUSESHIFT)
|
|
{
|
|
OIWUpdateSelection(lpWordInfo,wX,wY);
|
|
}
|
|
else
|
|
{
|
|
OIWStartSelection(lpWordInfo,wX,wY,FALSE);
|
|
}
|
|
|
|
DUEndDraw(lpWordInfo);
|
|
}
|
|
}
|
|
#endif //SCCFEATURE_SELECT
|
|
|
|
break;
|
|
|
|
case SCCD_LBUTTONDBLCLK:
|
|
|
|
UTFlagOff(lpWordInfo->wiMouseFlags,OIWF_MOUSELEFTSINGLE);
|
|
UTFlagOn(lpWordInfo->wiMouseFlags,OIWF_MOUSELEFTDOUBLE);
|
|
#ifdef SCCFEATURE_SELECT
|
|
|
|
if (!(lpWordInfo->wiMouseFlags & OIWF_MOUSERIGHTACTIVE))
|
|
{
|
|
UTFlagOn(lpWordInfo->wiMouseFlags,OIWF_MOUSELEFTACTIVE);
|
|
|
|
if (!(lpWordInfo->wiGen.wUserFlags & SCCVW_TAGLEFTDOUBLE))
|
|
{
|
|
#ifdef WINDOWS
|
|
SetCapture(lpWordInfo->wiGen.hWnd);
|
|
#endif
|
|
UTFlagOn(lpWordInfo->wiErrorFlags,OIWF_RELEASEMOUSE);
|
|
|
|
if (lpWordInfo->wiGen.wUserFlags & SCCVW_SELECTION)
|
|
{
|
|
DUBeginDraw(lpWordInfo);
|
|
|
|
if (wKeyInfo & SCCD_MOUSESHIFT)
|
|
{
|
|
OIWUpdateSelection(lpWordInfo,wX,wY);
|
|
}
|
|
else
|
|
{
|
|
OIWStartSelection(lpWordInfo,wX,wY,TRUE);
|
|
}
|
|
|
|
OIWUpdateCaret(lpWordInfo);
|
|
|
|
DUEndDraw(lpWordInfo);
|
|
}
|
|
}
|
|
}
|
|
#endif //SCCFEATURE_SELECT
|
|
break;
|
|
|
|
case SCCD_LBUTTONUP:
|
|
|
|
if (lpWordInfo->wiMouseFlags & OIWF_MOUSELEFTACTIVE)
|
|
{
|
|
#ifdef SCCFEATURE_SELECT
|
|
if (lpWordInfo->wiErrorFlags & OIWF_RELEASEMOUSE)
|
|
{
|
|
UTFlagOff(lpWordInfo->wiErrorFlags,OIWF_RELEASEMOUSE);
|
|
#ifdef WINDOWS
|
|
ReleaseCapture();
|
|
#endif
|
|
}
|
|
|
|
if (lpWordInfo->wiGen.wUserFlags & SCCVW_SELECTION)
|
|
{
|
|
DUBeginDraw(lpWordInfo);
|
|
|
|
OIWUpdateSelection(lpWordInfo,wX,wY);
|
|
|
|
OIWEndSelection(lpWordInfo);
|
|
|
|
DUEndDraw(lpWordInfo);
|
|
}
|
|
#endif //SCCFEATURE_SELECT
|
|
|
|
#ifdef SCCFEATURE_TAGS
|
|
#ifdef WINDOWS
|
|
if (lpWordInfo->wiGen.wUserFlags & SCCVW_TAGLEFTDOUBLE && lpWordInfo->wiMouseFlags & OIWF_MOUSELEFTDOUBLE)
|
|
{
|
|
OIWORDPOS locDummy1;
|
|
OIWORDPOS locDummy2;
|
|
|
|
if (OIMapWordXyToTag(wX,wY,&locDummy1,&locDummy2,lpWordInfo))
|
|
OISendDropForCurrentTag(lpWordInfo,SCCVWEVENT_LEFTDBL);
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef SCCFEATURE_EMBEDGRAPHICS
|
|
#ifdef WINDOWS
|
|
else if (lpWordInfo->wiMouseFlags & OIWF_MOUSELEFTDOUBLE)
|
|
{
|
|
SCCDDRAWGRAPHIC locDrawGraphic;
|
|
DWORD locGraphicId;
|
|
OIWORDPOS locPos;
|
|
WORD locWidth;
|
|
WORD locHeight;
|
|
|
|
if ((locGraphicId = OIMapWordXyToPos(wX,wY,&locPos,lpWordInfo)) & OIW_GRAPHIC)
|
|
{
|
|
DUBeginDraw(lpWordInfo);
|
|
|
|
/*
|
|
| Clear selections and
|
|
| preempt turning mouse flags off
|
|
| to avoid undesired selection while
|
|
| OLE objects are loading.
|
|
| (OLE object use PeekMessage loop while
|
|
| loading)
|
|
*/
|
|
|
|
#ifdef SCCFEATURE_SELECT
|
|
OIWClearSelection(lpWordInfo);
|
|
#endif
|
|
UTFlagOff(lpWordInfo->wiMouseFlags,OIWF_MOUSELEFTACTIVE);
|
|
UTFlagOff(lpWordInfo->wiMouseFlags,OIWF_MOUSELEFTSINGLE);
|
|
UTFlagOff(lpWordInfo->wiMouseFlags,OIWF_MOUSELEFTDOUBLE);
|
|
|
|
/*
|
|
| Get graphic's info
|
|
*/
|
|
|
|
UTFlagOff(locGraphicId,OIW_GRAPHIC);
|
|
OIWGetGraphicObject ( lpWordInfo, locGraphicId, &locDrawGraphic.soGraphicObject);
|
|
|
|
/*
|
|
| Get graphic's rect
|
|
*/
|
|
|
|
OIMapWordPosToXy(&locPos,&wX,&wY,lpWordInfo);
|
|
wY += OIWGetLineHeight(&locPos,lpWordInfo);
|
|
|
|
locHeight = MWO ( MTW ( locDrawGraphic.soGraphicObject.soGraphic.dwFinalHeight ) );
|
|
locWidth = MWO ( MTW ( locDrawGraphic.soGraphicObject.soGraphic.dwFinalWidth ) );
|
|
locDrawGraphic.rDest.left = wX;
|
|
locDrawGraphic.rDest.right = wX + locWidth;
|
|
locDrawGraphic.rDest.bottom = wY;
|
|
locDrawGraphic.rDest.top = wY - locHeight;
|
|
|
|
/*
|
|
| Send ACTIVATEGRAPHIC
|
|
*/
|
|
|
|
// locDrawGraphic.hDestDC = lpWordInfo->wiGen.hDC;
|
|
locDrawGraphic.dwUniqueId = ((DWORD)(locPos.posChunk)<<16) | (DWORD)(locPos.posOffset);
|
|
DUSendParent(lpWordInfo,SCCD_ACTIVATEGRAPHIC,0,(DWORD)((LPSCCDDRAWGRAPHIC)&locDrawGraphic));
|
|
|
|
DUEndDraw(lpWordInfo);
|
|
}
|
|
}
|
|
#endif //WINDOWS
|
|
#endif //SCCFEATURE_EMBEDGRAPHICS
|
|
|
|
}
|
|
|
|
UTFlagOff(lpWordInfo->wiMouseFlags,OIWF_MOUSELEFTACTIVE);
|
|
UTFlagOff(lpWordInfo->wiMouseFlags,OIWF_MOUSELEFTSINGLE);
|
|
UTFlagOff(lpWordInfo->wiMouseFlags,OIWF_MOUSELEFTDOUBLE);
|
|
|
|
break;
|
|
|
|
case SCCD_RBUTTONDOWN:
|
|
UTFlagOn(lpWordInfo->wiMouseFlags,OIWF_MOUSERIGHTSINGLE);
|
|
UTFlagOff(lpWordInfo->wiMouseFlags,OIWF_MOUSERIGHTDOUBLE);
|
|
|
|
#ifdef SCCFEATURE_WORDDRAG
|
|
if (!(lpWordInfo->wiMouseFlags & OIWF_MOUSELEFTACTIVE))
|
|
{
|
|
UTFlagOn(lpWordInfo->wiMouseFlags,OIWF_MOUSERIGHTACTIVE);
|
|
|
|
if (lpWordInfo->wiGen.wUserFlags & SCCVW_WORDDRAG)
|
|
{
|
|
#ifdef WINDOWS
|
|
SetCapture(lpWordInfo->wiGen.hWnd);
|
|
#endif
|
|
UTFlagOn(lpWordInfo->wiErrorFlags,OIWF_RELEASEMOUSE);
|
|
|
|
OIStartWordDrag(lpWordInfo,wX,wY);
|
|
}
|
|
|
|
#ifdef SCCDEBUG
|
|
OIWDebugCharInfo(lpWordInfo,wX,wY);
|
|
#endif
|
|
}
|
|
#endif // SCCFEATURE_WORDDRAG
|
|
|
|
break;
|
|
|
|
case SCCD_RBUTTONDBLCLK:
|
|
|
|
UTFlagOff(lpWordInfo->wiMouseFlags,OIWF_MOUSERIGHTSINGLE);
|
|
UTFlagOn(lpWordInfo->wiMouseFlags,OIWF_MOUSERIGHTDOUBLE);
|
|
|
|
if (!(lpWordInfo->wiMouseFlags & OIWF_MOUSELEFTACTIVE))
|
|
{
|
|
UTFlagOn(lpWordInfo->wiMouseFlags,OIWF_MOUSERIGHTACTIVE);
|
|
}
|
|
|
|
break;
|
|
|
|
case SCCD_RBUTTONUP:
|
|
|
|
if (lpWordInfo->wiMouseFlags & OIWF_MOUSERIGHTACTIVE)
|
|
{
|
|
#ifdef SCCFEATURE_WORDDRAG
|
|
if (lpWordInfo->wiMouseFlags & OIWF_MOUSERIGHTSINGLE && lpWordInfo->wiGen.wUserFlags & SCCVW_WORDDRAG)
|
|
{
|
|
OIEndWordDrag(lpWordInfo,wX,wY);
|
|
|
|
UTFlagOff(lpWordInfo->wiErrorFlags,OIWF_RELEASEMOUSE);
|
|
#ifdef WINDOWS
|
|
ReleaseCapture();
|
|
#endif
|
|
}
|
|
else
|
|
#endif
|
|
#ifdef SCCFEATURE_TAGS
|
|
if (lpWordInfo->wiMouseFlags & OIWF_MOUSERIGHTDOUBLE)
|
|
{
|
|
OIWORDPOS locStartPos;
|
|
OIWORDPOS locEndPos;
|
|
BYTE locWord[40];
|
|
|
|
if (OIMapWordXyToTag(wX,wY,&locStartPos,&locEndPos,lpWordInfo))
|
|
{
|
|
OIWSetSelection(lpWordInfo,&locStartPos,&locEndPos);
|
|
#ifdef WINDOWS
|
|
OISendDropForCurrentTag(lpWordInfo,SCCVWEVENT_RIGHTDBL);
|
|
#endif
|
|
}
|
|
else
|
|
{
|
|
if (OIMapWordXyToWord(wX,wY,&locStartPos,&locEndPos,locWord,lpWordInfo) == SCC_OK)
|
|
{
|
|
OISendDropForWord(lpWordInfo,locWord);
|
|
}
|
|
}
|
|
}
|
|
#endif //SCCFEATURE_TAGS
|
|
}
|
|
|
|
UTFlagOff(lpWordInfo->wiMouseFlags,OIWF_MOUSERIGHTACTIVE);
|
|
UTFlagOff(lpWordInfo->wiMouseFlags,OIWF_MOUSERIGHTSINGLE);
|
|
UTFlagOff(lpWordInfo->wiMouseFlags,OIWF_MOUSERIGHTDOUBLE);
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
DWORD OIWBuildTextFromChunk(hChunk,hTextBuf,hMapBuf,cParaToken)
|
|
HANDLE hChunk;
|
|
HANDLE hTextBuf;
|
|
HANDLE hMapBuf;
|
|
BYTE cParaToken;
|
|
{
|
|
BYTE FAR * locChunkBufPtr;
|
|
BYTE FAR * locTextBufPtr;
|
|
WORD FAR * locMapBufPtr;
|
|
|
|
BYTE FAR * locTextCurPtr;
|
|
WORD FAR * locMapCurPtr;
|
|
|
|
BYTE FAR * locThisToken;
|
|
BYTE FAR * locNextToken;
|
|
|
|
BYTE FAR * locChunkCurPtr;
|
|
BYTE FAR * locEndPtr;
|
|
|
|
BOOL locDone;
|
|
|
|
BYTE locChar;
|
|
BYTE locType;
|
|
|
|
locChunkBufPtr = (BYTE FAR *) UTGlobalLock(hChunk);
|
|
locTextBufPtr = (BYTE FAR *) UTGlobalLock(hTextBuf);
|
|
locMapBufPtr = (WORD FAR *) UTGlobalLock(hMapBuf);
|
|
|
|
locChunkCurPtr = locChunkBufPtr;
|
|
locEndPtr = locChunkBufPtr + UTGlobalSize(hChunk);
|
|
locTextCurPtr = locTextBufPtr;
|
|
locMapCurPtr = locMapBufPtr;
|
|
|
|
locEndPtr = locChunkBufPtr + UTGlobalSize(hChunk);
|
|
|
|
locDone = FALSE;
|
|
|
|
while (locChunkCurPtr < locEndPtr && !locDone)
|
|
{
|
|
locThisToken = locChunkCurPtr;
|
|
|
|
if (*locChunkCurPtr != SO_BEGINTOKEN)
|
|
{
|
|
if (*locChunkCurPtr != 0x00)
|
|
{
|
|
locNextToken = WPNextChar(locChunkCurPtr);
|
|
while ( locChunkCurPtr < locNextToken )
|
|
*locTextCurPtr++ = *locChunkCurPtr++;
|
|
*locMapCurPtr++ = locThisToken - locChunkBufPtr;
|
|
}
|
|
else
|
|
locNextToken = locChunkCurPtr + 1;
|
|
}
|
|
else
|
|
{
|
|
locChunkCurPtr++;
|
|
|
|
switch (*locChunkCurPtr)
|
|
{
|
|
case SO_CHARATTR:
|
|
|
|
locNextToken = OISkipCharAttr(locChunkCurPtr);
|
|
break;
|
|
|
|
case SO_CHARHEIGHT:
|
|
|
|
locNextToken = OISkipCharHeight(locChunkCurPtr);
|
|
break;
|
|
|
|
case SO_CHARFONTBYID:
|
|
|
|
locNextToken = OISkipCharFontById(locChunkCurPtr);
|
|
break;
|
|
|
|
case SO_PARAALIGN:
|
|
|
|
locNextToken = OISkipParaAlign(locChunkCurPtr);
|
|
break;
|
|
|
|
case SO_PARAINDENT:
|
|
|
|
locNextToken = OISkipParaIndent(locChunkCurPtr);
|
|
break;
|
|
|
|
case SO_PARASPACING:
|
|
|
|
locNextToken = OISkipParaSpacing(locChunkCurPtr);
|
|
break;
|
|
|
|
case SO_TABSTOPS:
|
|
|
|
locNextToken = OISkipParaTabs(locChunkCurPtr);
|
|
break;
|
|
|
|
case SO_MARGINS:
|
|
|
|
locNextToken = OISkipParaMargins(locChunkCurPtr);
|
|
break;
|
|
|
|
case SO_BEGINSUB:
|
|
|
|
locNextToken = OISkipBeginSubdoc(locChunkCurPtr);
|
|
break;
|
|
|
|
case SO_ENDSUB:
|
|
|
|
locNextToken = OISkipEndSubdoc(locChunkCurPtr);
|
|
break;
|
|
|
|
case SO_CHARX:
|
|
|
|
locNextToken = OIParseCharX(locChunkCurPtr,&locType,&locChar);
|
|
|
|
if (!(locType & SO_HIDDENBIT))
|
|
{
|
|
*locTextCurPtr++ = locChar;
|
|
*locMapCurPtr++ = locThisToken - locChunkBufPtr;
|
|
}
|
|
|
|
break;
|
|
|
|
case SO_SPECIALCHAR:
|
|
|
|
locNextToken = OIParseSpecialChar(locChunkCurPtr,&locType,&locChar);
|
|
|
|
if (!(locType & SO_HIDDENBIT))
|
|
{
|
|
switch (locChar)
|
|
{
|
|
case SO_CHTAB:
|
|
*locTextCurPtr++ = 0x09;
|
|
*locMapCurPtr++ = locThisToken - locChunkBufPtr;
|
|
break;
|
|
case SO_CHHPAGE:
|
|
case SO_CHHLINE:
|
|
*locTextCurPtr++ = cParaToken;
|
|
*locMapCurPtr++ = locThisToken - locChunkBufPtr;
|
|
break;
|
|
case SO_CHSHYPHEN:
|
|
case SO_CHUNKNOWN:
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
break;
|
|
|
|
case SO_BREAK:
|
|
|
|
locNextToken = locChunkCurPtr + 2;
|
|
|
|
*locTextCurPtr++ = cParaToken;
|
|
*locMapCurPtr++ = locThisToken - locChunkBufPtr;
|
|
|
|
break;
|
|
|
|
case SO_TABLE:
|
|
|
|
locNextToken = OISkipTableBegin ( locChunkCurPtr );
|
|
break;
|
|
|
|
case SO_TABLEEND:
|
|
|
|
locNextToken = OISkipTableEnd ( locChunkCurPtr );
|
|
break;
|
|
|
|
case SO_GRAPHICOBJECT:
|
|
|
|
locNextToken = OISkipGraphicObject ( locChunkCurPtr );
|
|
break;
|
|
|
|
case SO_GOTOPOSITION:
|
|
locNextToken = OISkipGoToPosition ( locChunkCurPtr );
|
|
break;
|
|
|
|
case SO_DRAWLINE:
|
|
locNextToken = OISkipDrawLine ( locChunkCurPtr );
|
|
break;
|
|
|
|
case SO_ENDOFCHUNK:
|
|
|
|
locNextToken = locChunkCurPtr + 1;
|
|
|
|
*locTextCurPtr++ = 0x00;
|
|
*locMapCurPtr++ = locThisToken - locChunkBufPtr;
|
|
*locTextCurPtr++ = 0x00;
|
|
*locMapCurPtr++ = locThisToken - locChunkBufPtr;
|
|
|
|
locDone = TRUE;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
locNextToken = locChunkCurPtr;
|
|
break;
|
|
}
|
|
}
|
|
|
|
locChunkCurPtr = locNextToken;
|
|
}
|
|
|
|
*locMapCurPtr = 0xFFFF;
|
|
|
|
UTGlobalUnlock(hChunk);
|
|
UTGlobalUnlock(hTextBuf);
|
|
UTGlobalUnlock(hMapBuf);
|
|
|
|
return(MAKELONG(locChunkCurPtr - locChunkBufPtr, locTextCurPtr - locTextBufPtr));
|
|
}
|
|
|
|
VOID OIWDisplayModeChange(LPOIWORDINFO lpWordInfo)
|
|
{
|
|
DWORD locNewMode;
|
|
|
|
locNewMode = WPOP_DISPLAY_NORMAL;
|
|
|
|
#ifdef SCCFEATURE_OPTIONS
|
|
if (!DUGetOption(lpWordInfo, SCCID_WPDISPLAYMODE, 0, &locNewMode))
|
|
locNewMode = WPOP_DISPLAY_NORMAL;
|
|
#endif //SCCFEATURE_OPTIONS
|
|
|
|
OIWSetDisplayMode(lpWordInfo,locNewMode);
|
|
}
|
|
|
|
VOID OIWSetDisplayMode(lpWordInfo,dwMode)
|
|
LPOIWORDINFO lpWordInfo;
|
|
DWORD dwMode;
|
|
{
|
|
#ifdef WINDOWS
|
|
if (!lpWordInfo->wiGen.hFormatIC && dwMode == WPOP_DISPLAY_PREVIEW)
|
|
dwMode = WPOP_DISPLAY_NORMAL;
|
|
#endif
|
|
|
|
lpWordInfo->wiDisplayMode = dwMode;
|
|
|
|
#ifdef SCCFEATURE_MENU
|
|
#ifdef WINDOWS
|
|
if (lpWordInfo->wiGen.hDisplayMenu)
|
|
{
|
|
CheckMenuItem(lpWordInfo->wiGen.hDisplayMenu,OIWMENU_DRAFT + lpWordInfo->wiGen.wMenuOffset, MF_BYCOMMAND | (lpWordInfo->wiDisplayMode == WPOP_DISPLAY_DRAFT ? MF_CHECKED : MF_UNCHECKED));
|
|
CheckMenuItem(lpWordInfo->wiGen.hDisplayMenu,OIWMENU_NORMAL + lpWordInfo->wiGen.wMenuOffset, MF_BYCOMMAND | (lpWordInfo->wiDisplayMode == WPOP_DISPLAY_NORMAL ? MF_CHECKED : MF_UNCHECKED));
|
|
CheckMenuItem(lpWordInfo->wiGen.hDisplayMenu,OIWMENU_PREVIEW + lpWordInfo->wiGen.wMenuOffset, MF_BYCOMMAND | (lpWordInfo->wiDisplayMode == WPOP_DISPLAY_PREVIEW ? MF_CHECKED : MF_UNCHECKED));
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef SCCFEATURE_LAYOUT
|
|
switch (dwMode)
|
|
{
|
|
case WPOP_DISPLAY_DRAFT:
|
|
#endif
|
|
|
|
lpWordInfo->wiWrapType = SCCD_OUTPUT;
|
|
lpWordInfo->wiWrapDPI = lpWordInfo->wiGen.lOutputUPI;
|
|
lpWordInfo->wiOutputDPI = lpWordInfo->wiGen.lOutputUPI;
|
|
lpWordInfo->wiWrapLeft = 10;
|
|
lpWordInfo->wiWrapRight = lpWordInfo->wiCurWidth - 10;
|
|
lpWordInfo->wiMaxX = 0;
|
|
|
|
#ifdef SCCFEATURE_LAYOUT
|
|
break;
|
|
|
|
case WPOP_DISPLAY_NORMAL:
|
|
|
|
lpWordInfo->wiWrapType = SCCD_OUTPUT;
|
|
lpWordInfo->wiWrapDPI = lpWordInfo->wiGen.lOutputUPI;
|
|
lpWordInfo->wiOutputDPI = lpWordInfo->wiGen.lOutputUPI;
|
|
lpWordInfo->wiWrapLeft = 10;
|
|
lpWordInfo->wiWrapRight = lpWordInfo->wiCurWidth - 10;
|
|
lpWordInfo->wiMaxX = 0;
|
|
break;
|
|
|
|
case 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->wiMaxX = 0;
|
|
break;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
#ifdef SCCFEATURE_PRINT
|
|
VOID OIWPrinterChanged(lpWordInfo)
|
|
LPOIWORDINFO lpWordInfo;
|
|
{
|
|
|
|
if (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->wiMaxX = 0;
|
|
|
|
OIClearAllWordWrapInfo(lpWordInfo);
|
|
|
|
OIFixupWordPos(&lpWordInfo->wiCurTopPos,lpWordInfo);
|
|
OIFixupWordPos(&lpWordInfo->wiAnchorPos,lpWordInfo);
|
|
OIFixupWordPos(&lpWordInfo->wiEndPos,lpWordInfo);
|
|
|
|
if (lpWordInfo->wiFlags & OIWF_WORDSELECTION)
|
|
{
|
|
OIFixupWordPos(&lpWordInfo->wiWordAnchorLeft,lpWordInfo);
|
|
OIFixupWordPos(&lpWordInfo->wiWordAnchorRight,lpWordInfo);
|
|
}
|
|
|
|
OIWUpdateCaret(lpWordInfo);
|
|
|
|
DUInvalRect(lpWordInfo,NULL);
|
|
DUUpdateWindow(lpWordInfo);
|
|
}
|
|
}
|
|
#endif //SCCFEATURE_PRINT
|
|
|
|
#ifdef SCCFEATURE_RAWTEXT
|
|
|
|
/*
|
|
|
|
|
| OIWSendRawText
|
|
|
|
|
*/
|
|
|
|
VOID OIWSendRawText(lpWordInfo,wStartChunk,wEndChunk)
|
|
LPOIWORDINFO lpWordInfo;
|
|
WORD wStartChunk;
|
|
WORD wEndChunk;
|
|
{
|
|
WORD locIndex;
|
|
HANDLE locChunkHnd;
|
|
HANDLE locTextBufHnd;
|
|
WORD locTextBufLen;
|
|
HANDLE locMapBufHnd;
|
|
SCCVWRAWTEXT locRawText;
|
|
|
|
if (lpWordInfo->wiGen.wUserFlags & SCCVW_NEEDRAWTEXT)
|
|
{
|
|
/* PJB move to WIN.3E */
|
|
if (wStartChunk == (WORD)-1 && wEndChunk == (WORD)-1)
|
|
{
|
|
DUSendParent(lpWordInfo,SCCVW_RAWTEXT,0,NULL);
|
|
return;
|
|
}
|
|
|
|
for (locIndex = wStartChunk; locIndex <= wEndChunk; locIndex++)
|
|
{
|
|
locChunkHnd = CHGetChunk(lpWordInfo->wiGen.wSection,locIndex,lpWordInfo->wiGen.hFilter);
|
|
|
|
if ((locTextBufHnd = UTGlobalAlloc(SO_CHUNK_SIZE)) == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if ((locMapBufHnd = UTGlobalAlloc(SO_CHUNK_SIZE * sizeof(WORD))) == NULL)
|
|
{
|
|
UTGlobalFree(locTextBufHnd);
|
|
return;
|
|
}
|
|
|
|
locTextBufLen = HIWORD(OIWBuildTextFromChunk(locChunkHnd,locTextBufHnd,locMapBufHnd,0x0D));
|
|
|
|
locRawText.wChunk = locIndex;
|
|
locRawText.wCount = locTextBufLen;
|
|
locRawText.hText = locTextBufHnd;
|
|
locRawText.hMap = locMapBufHnd;
|
|
|
|
DUSendParent(lpWordInfo,SCCVW_RAWTEXT,0,(LPSCCVWRAWTEXT)&locRawText);
|
|
}
|
|
}
|
|
}
|
|
#endif //SCCFEATURE_RAWTEXT
|
|
|
|
#ifdef SCCFEATURE_SELECT
|
|
VOID OIWDrawCaret(lpWordInfo)
|
|
LPOIWORDINFO lpWordInfo;
|
|
{
|
|
SHORT locX;
|
|
SHORT locY;
|
|
SHORT locCaretHeight;
|
|
RECT locRect;
|
|
OIWORDPOS FAR * locCaretPosPtr;
|
|
|
|
locCaretPosPtr = &lpWordInfo->wiAnchorPos;
|
|
|
|
/*
|
|
| If caret positions is outside visible area, don't do anything
|
|
*/
|
|
|
|
if (!OIWIsPosOnScreen(locCaretPosPtr,lpWordInfo))
|
|
{
|
|
return;
|
|
}
|
|
|
|
/*
|
|
| Calculate caret position
|
|
*/
|
|
|
|
OIMapWordPosToXy(locCaretPosPtr,&locX,&locY,lpWordInfo);
|
|
locCaretHeight = OIWGetLineHeight(locCaretPosPtr,lpWordInfo);
|
|
|
|
locRect.left = locX;
|
|
locRect.right = locX+1;
|
|
locRect.top = locY;
|
|
locRect.bottom = locY + locCaretHeight;
|
|
|
|
/*
|
|
| Invert the caret area
|
|
*/
|
|
|
|
DUBeginDraw(lpWordInfo);
|
|
OIWInvertRectNP(lpWordInfo,&locRect);
|
|
DUEndDraw(lpWordInfo);
|
|
}
|
|
|
|
|
|
VOID OIWHideCaret(lpWordInfo)
|
|
LPOIWORDINFO lpWordInfo;
|
|
{
|
|
if (lpWordInfo->wiFlags & OIWF_CARETVISIBLE)
|
|
{
|
|
OIWDrawCaret(lpWordInfo);
|
|
UTFlagOff(lpWordInfo->wiFlags,OIWF_CARETVISIBLE);
|
|
}
|
|
}
|
|
|
|
VOID OIWBlinkCaret(lpWordInfo)
|
|
LPOIWORDINFO lpWordInfo;
|
|
{
|
|
if (!(lpWordInfo->wiFlags & OIWF_AREASELECTED))
|
|
{
|
|
if (lpWordInfo->wiFlags & OIWF_CARETVISIBLE)
|
|
{
|
|
OIWDrawCaret(lpWordInfo);
|
|
UTFlagOff(lpWordInfo->wiFlags,OIWF_CARETVISIBLE);
|
|
}
|
|
else
|
|
{
|
|
OIWDrawCaret(lpWordInfo);
|
|
UTFlagOn(lpWordInfo->wiFlags,OIWF_CARETVISIBLE);
|
|
}
|
|
}
|
|
}
|
|
|
|
VOID OIWShowCaret(lpWordInfo)
|
|
LPOIWORDINFO lpWordInfo;
|
|
{
|
|
if (!(lpWordInfo->wiFlags & OIWF_CARETVISIBLE))
|
|
{
|
|
OIWDrawCaret(lpWordInfo);
|
|
UTFlagOn(lpWordInfo->wiFlags,OIWF_CARETVISIBLE);
|
|
}
|
|
}
|
|
#endif //SCCFEATURE_SELECT
|
|
|
|
VOID OIWScreenFontChange(lpWordInfo)
|
|
LPOIWORDINFO lpWordInfo;
|
|
{
|
|
if (lpWordInfo->wiFlags & OIWF_SECTIONOPEN && lpWordInfo->wiDisplayMode != WPOP_DISPLAY_PREVIEW)
|
|
{
|
|
OIClearAllWordWrapInfo(lpWordInfo);
|
|
OIFixupWordPos(&lpWordInfo->wiCurTopPos,lpWordInfo);
|
|
OIFixupWordPos(&lpWordInfo->wiAnchorPos,lpWordInfo);
|
|
OIFixupWordPos(&lpWordInfo->wiEndPos,lpWordInfo);
|
|
|
|
if (lpWordInfo->wiFlags & OIWF_WORDSELECTION)
|
|
{
|
|
OIFixupWordPos(&lpWordInfo->wiWordAnchorLeft,lpWordInfo);
|
|
OIFixupWordPos(&lpWordInfo->wiWordAnchorRight,lpWordInfo);
|
|
}
|
|
|
|
/*
|
|
| Update scroll bars
|
|
*/
|
|
|
|
OIWUpdateVertScrollRange(lpWordInfo);
|
|
OIWUpdateVertScrollPos(lpWordInfo);
|
|
OIWUpdateHorzScrollRange(lpWordInfo);
|
|
OIWUpdateHorzScrollPos(lpWordInfo);
|
|
|
|
DUInvalRect(lpWordInfo,NULL);
|
|
}
|
|
}
|
|
|
|
#ifdef SCCFEATURE_PRINT
|
|
|
|
VOID OIWPrinterFontChange(lpWordInfo)
|
|
LPOIWORDINFO lpWordInfo;
|
|
{
|
|
|
|
if (lpWordInfo->wiFlags & OIWF_SECTIONOPEN && lpWordInfo->wiDisplayMode == WPOP_DISPLAY_PREVIEW)
|
|
{
|
|
OIClearAllWordWrapInfo(lpWordInfo);
|
|
OIFixupWordPos(&lpWordInfo->wiCurTopPos,lpWordInfo);
|
|
OIFixupWordPos(&lpWordInfo->wiAnchorPos,lpWordInfo);
|
|
OIFixupWordPos(&lpWordInfo->wiEndPos,lpWordInfo);
|
|
|
|
if (lpWordInfo->wiFlags & OIWF_WORDSELECTION)
|
|
{
|
|
OIFixupWordPos(&lpWordInfo->wiWordAnchorLeft,lpWordInfo);
|
|
OIFixupWordPos(&lpWordInfo->wiWordAnchorRight,lpWordInfo);
|
|
}
|
|
|
|
/*
|
|
| Update scroll bars
|
|
*/
|
|
|
|
OIWUpdateVertScrollRange(lpWordInfo);
|
|
OIWUpdateVertScrollPos(lpWordInfo);
|
|
OIWUpdateHorzScrollRange(lpWordInfo);
|
|
OIWUpdateHorzScrollPos(lpWordInfo);
|
|
|
|
OIWUpdateCaret(lpWordInfo);
|
|
|
|
DUInvalRect(lpWordInfo,NULL);
|
|
}
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
VOID OIWGetDocOrigin ( lpWordInfo, lpLPoint )
|
|
LPOIWORDINFO lpWordInfo;
|
|
LPLONGPOINT lpLPoint;
|
|
{
|
|
OIWORDPOS locPos;
|
|
WORD i;
|
|
|
|
lpLPoint->x = lpWordInfo->wiCurLeftOffset;
|
|
lpLPoint->y = 0;
|
|
for ( i=0; i < lpWordInfo->wiCurTopPos.posChunk; i++ )
|
|
{
|
|
OILinesInChunk ( i, lpWordInfo ); /* Force rewrap of invalid wrap chunks */
|
|
lpLPoint->y += OIWGetChunkHeight ( lpWordInfo, i );
|
|
}
|
|
|
|
locPos.posChunk = lpWordInfo->wiCurTopPos.posChunk;
|
|
locPos.posLine = 0;
|
|
locPos.posOffset = 0;
|
|
locPos.posChar = 0;
|
|
for ( i=0; i < lpWordInfo->wiCurTopPos.posLine; i++ )
|
|
{
|
|
lpLPoint->y += OIWGetLineHeight(&locPos,lpWordInfo);
|
|
if (!OINextLine(&locPos,lpWordInfo))
|
|
break; /* ran out of lines */
|
|
}
|
|
|
|
}
|
|
|
|
VOID OIWGetDocDimensions ( lpWordInfo, lpLPoint )
|
|
LPOIWORDINFO lpWordInfo;
|
|
LPLONGPOINT lpLPoint;
|
|
{
|
|
WORD i;
|
|
/* First make sure entire document has been read-ahead */
|
|
lpLPoint->y = 0;
|
|
while (!(lpWordInfo->wiFlags & OIWF_SIZEKNOWN))
|
|
{
|
|
DUReadMeAhead(lpWordInfo);
|
|
}
|
|
|
|
/*
|
|
| Now wrap-ahead any chunks which we don't know the size of,
|
|
| This is easily done by asking how many lines are in the chunk
|
|
| Add up the chunk heights as we go.
|
|
*/
|
|
for ( i=0; i < lpWordInfo->wiTotalChunks; i++ )
|
|
{
|
|
OILinesInChunk ( i, lpWordInfo );
|
|
lpLPoint->y += OIWGetChunkHeight ( lpWordInfo, i );
|
|
}
|
|
|
|
lpLPoint->x = lpWordInfo->wiMaxX;
|
|
|
|
}
|
|
|
|
#define HEIGHTALLOCGRAN 10
|
|
|
|
VOID OIWStoreChunkHeight ( lpWordInfo, wChunkId, wChunkHeight )
|
|
LPOIWORDINFO lpWordInfo;
|
|
WORD wChunkId;
|
|
WORD wChunkHeight;
|
|
{
|
|
LPWORD lpHeight;
|
|
if ( lpWordInfo->wiHeightTable == NULL )
|
|
{
|
|
lpWordInfo->wiHeightTable = UTGlobalAlloc ( sizeof(WORD) * HEIGHTALLOCGRAN );
|
|
if ( lpWordInfo->wiHeightTable )
|
|
lpWordInfo->wiMaxHeights = HEIGHTALLOCGRAN;
|
|
else
|
|
return;
|
|
}
|
|
else if ( wChunkId >= lpWordInfo->wiMaxHeights )
|
|
{
|
|
HANDLE hTmp;
|
|
WORD wMaxHeights;
|
|
wMaxHeights = ((wChunkId / HEIGHTALLOCGRAN) + 1) * HEIGHTALLOCGRAN;
|
|
hTmp = UTGlobalReAlloc ( lpWordInfo->wiHeightTable, sizeof(WORD) * wMaxHeights );
|
|
if ( hTmp )
|
|
{
|
|
lpWordInfo->wiMaxHeights = wMaxHeights;
|
|
lpWordInfo->wiHeightTable = hTmp;
|
|
}
|
|
else
|
|
return;
|
|
}
|
|
lpHeight = UTGlobalLock ( lpWordInfo->wiHeightTable );
|
|
lpHeight[wChunkId] = wChunkHeight;
|
|
|
|
UTGlobalUnlock ( lpWordInfo->wiHeightTable );
|
|
|
|
}
|
|
|
|
WORD OIWGetChunkHeight ( lpWordInfo, wChunkId )
|
|
LPOIWORDINFO lpWordInfo;
|
|
WORD wChunkId;
|
|
{
|
|
LPWORD lpHeight;
|
|
WORD wChunkHeight;
|
|
|
|
wChunkHeight = 0;
|
|
if ( (lpWordInfo->wiHeightTable) && (wChunkId < lpWordInfo->wiMaxHeights) )
|
|
{
|
|
lpHeight = UTGlobalLock ( lpWordInfo->wiHeightTable );
|
|
wChunkHeight = lpHeight[wChunkId];
|
|
UTGlobalUnlock ( lpWordInfo->wiHeightTable );
|
|
}
|
|
return ( wChunkHeight );
|
|
}
|
|
|
|
|
|
|
|
VOID OIWUpdateRect ( lpWordInfo, lpLRect )
|
|
LPOIWORDINFO lpWordInfo;
|
|
LPLONGRECT lpLRect;
|
|
{
|
|
LONG lY;
|
|
OIWORDPOS locPos;
|
|
SHORT locX;
|
|
SHORT locY;
|
|
SHORT locNewY;
|
|
WORD wChunkHeight;
|
|
WORD wLineHeight;
|
|
DWORD locFlags;
|
|
WORD wLinesInChunk;
|
|
|
|
if (lpWordInfo->wiFlags & OIWF_PRINTING) // Can't print and update at same time
|
|
return;
|
|
|
|
/*
|
|
| Make sure text background is transparent
|
|
*/
|
|
#ifdef WINDOWS
|
|
SetBkMode(lpWordInfo->wiGen.hDC,TRANSPARENT);
|
|
#endif
|
|
|
|
/* Find position to start displaying from */
|
|
|
|
lY = 0;
|
|
for ( locPos.posChunk = 0; locPos.posChunk < lpWordInfo->wiTotalChunks; locPos.posChunk++ )
|
|
{
|
|
wChunkHeight = OIWGetChunkHeight ( lpWordInfo, locPos.posChunk );
|
|
if ( lY + (LONG)wChunkHeight > lpLRect->top )
|
|
break;
|
|
lY += (LONG)wChunkHeight;
|
|
}
|
|
wLinesInChunk = OILinesInChunk ( locPos.posChunk, lpWordInfo );
|
|
for ( locPos.posLine=0; locPos.posLine < wLinesInChunk; locPos.posLine++ )
|
|
{
|
|
wLineHeight = OIWGetLineHeight(&locPos,lpWordInfo);
|
|
if ( lY + (LONG)wLineHeight > lpLRect->top )
|
|
break;
|
|
lY += (LONG)wLineHeight;
|
|
}
|
|
|
|
|
|
|
|
locX = (SHORT) (-lpLRect->left);
|
|
locY = (SHORT)(lY - lpLRect->top);
|
|
|
|
locFlags = 0;
|
|
|
|
while ( lpLRect->top + (LONG)locY < lpLRect->bottom)
|
|
{
|
|
locNewY = locY + OIWGetLineHeight(&locPos,lpWordInfo);
|
|
|
|
OIWDisplayLine(locPos.posChunk,locPos.posLine,locX,locY,&locFlags,lpWordInfo,NULL);
|
|
|
|
locY = locNewY;
|
|
|
|
if (!OINextLine(&locPos,lpWordInfo))
|
|
break; /* ran out of lines */
|
|
}
|
|
|
|
}
|
|
|