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.
 
 
 
 
 
 

734 lines
16 KiB

/*
| Outside In for Windows
| Source File OISANNO.C (Annotation routines)
|
| ²²²²² ²²²²²
| ² ² ²
| ² ² ²
| ² ² ²
| ²²²²² ²²²²²
|
| Outside In
|
*/
/*
| Creation Date: 10-14-94
| Original Programmer: Geoff "The Mangler" Uvena
|
|
|
|
|
*/
#include <platform.h>
#include <sccut.h>
#include <sccch.h>
#include <sccvw.h>
#include <sccd.h>
#include <sccfont.h>
#include "ois.h"
#include "ois.pro"
COLORREF gColorMap[16] =
{
RGB(0,0,0),
RGB(128,0,0),
RGB(0,128,0),
RGB(128,128,0),
RGB(0,0,128),
RGB(128,0,128),
RGB(0,128,128),
RGB(192,192,192),
RGB(128,128,128),
RGB(255,0,0),
RGB(0,255,0),
RGB(255,255,0),
RGB(0,0,255),
RGB(255,0,255),
RGB(0,255,255),
RGB(255,255,255)
};
VOID OISAddAnno(lpSheetInfo,wType,puTypes)
LPOISHEETINFO lpSheetInfo;
WORD wType;
PSSANNOTYPES puTypes;
{
PSSANNOLIST locAnnoList;
WORD locNewMax;
WORD locIndex;
WORD locPrevIndex;
BOOL locDone;
if (wType == SCCVW_INSERTICON)
{
puTypes->sInsertIcon.dwIconEnd = puTypes->sInsertIcon.dwIconPos;
}
if (lpSheetInfo->siAnnoList == NULL)
{
lpSheetInfo->siAnnoList = UTGlobalAlloc(sizeof(SSANNOLIST) + 10 * sizeof(SSANNOENTRY));
if (lpSheetInfo->siAnnoList == NULL)
return;
locAnnoList = UTGlobalLock(lpSheetInfo->siAnnoList);
locAnnoList->aEntrys[0].wNext = (WORD)-1;
locAnnoList->aEntrys[0].wPrev = (WORD)-1;
locAnnoList->aEntrys[0].wType = wType;
locAnnoList->aEntrys[0].uTypes = *puTypes;
locAnnoList->wCount = 1;
locAnnoList->wMax = 10;
locAnnoList->wStart = 0;
locAnnoList->wEnd = 0;
UTGlobalUnlock(lpSheetInfo->siAnnoList);
}
else
{
locAnnoList = UTGlobalLock(lpSheetInfo->siAnnoList);
if (!locAnnoList->bFull)
{
locPrevIndex = (WORD)-1;
locIndex = locAnnoList->wStart;
locDone = FALSE;
if( puTypes->sGen.dwStartPos < locAnnoList->aEntrys[locAnnoList->wEnd].uTypes.sGen.dwStartPos )
{
do
{
if( puTypes->sGen.dwStartPos < locAnnoList->aEntrys[locIndex].uTypes.sGen.dwStartPos )
{
if (locPrevIndex != (WORD)-1)
{
locAnnoList->aEntrys[locAnnoList->wCount].wType = wType;
locAnnoList->aEntrys[locAnnoList->wCount].uTypes = *puTypes;
locAnnoList->aEntrys[locAnnoList->wCount].wNext = locIndex;
locAnnoList->aEntrys[locAnnoList->wCount].wPrev = locPrevIndex;
locAnnoList->aEntrys[locPrevIndex].wNext = locAnnoList->wCount;
locAnnoList->aEntrys[locIndex].wPrev = locAnnoList->wCount;
}
else
{
locAnnoList->aEntrys[locAnnoList->wCount].wType = wType;
locAnnoList->aEntrys[locAnnoList->wCount].uTypes = *puTypes;
locAnnoList->aEntrys[locAnnoList->wCount].wNext = locIndex;
locAnnoList->aEntrys[locAnnoList->wCount].wPrev = (WORD)-1;
locAnnoList->aEntrys[locIndex].wPrev = locAnnoList->wCount;
locAnnoList->wStart = locAnnoList->wCount;
}
locAnnoList->wCount++;
locDone = TRUE;
}
locPrevIndex = locIndex;
locIndex = locAnnoList->aEntrys[locIndex].wNext;
}
while ((locIndex != (WORD)-1) && !locDone);
}
else
{
locPrevIndex = locAnnoList->wEnd;
}
if (!locDone)
{
locAnnoList->aEntrys[locPrevIndex].wNext = locAnnoList->wCount;
locAnnoList->aEntrys[locAnnoList->wCount].wType = wType;
locAnnoList->aEntrys[locAnnoList->wCount].uTypes = *puTypes;
locAnnoList->aEntrys[locAnnoList->wCount].wNext = (WORD)-1;
locAnnoList->aEntrys[locAnnoList->wCount].wPrev = locPrevIndex;
locAnnoList->wEnd = locAnnoList->wCount;
locAnnoList->wCount++;
}
if (locAnnoList->wCount == locAnnoList->wMax)
{
locAnnoList->wMax += 10;
locNewMax = locAnnoList->wMax;
UTGlobalUnlock(lpSheetInfo->siAnnoList);
if ((DWORD)sizeof(SSANNOLIST) + (DWORD)locNewMax * (DWORD)sizeof(SSANNOENTRY) < 0x0000FFFF)
{
lpSheetInfo->siAnnoList = UTGlobalReAlloc(lpSheetInfo->siAnnoList,sizeof(SSANNOLIST) + locNewMax * sizeof(SSANNOENTRY));
}
else
{
locAnnoList = UTGlobalLock(lpSheetInfo->siAnnoList);
locAnnoList->bFull = TRUE;
UTGlobalUnlock(lpSheetInfo->siAnnoList);
}
}
else
{
UTGlobalUnlock(lpSheetInfo->siAnnoList);
}
}
else
{
UTGlobalUnlock(lpSheetInfo->siAnnoList);
}
}
}
VOID OISClearAnnos(lpSheetInfo,dwUser)
LPOISHEETINFO lpSheetInfo;
DWORD dwUser;
{
if (lpSheetInfo->siAnnoList != NULL)
{
UTGlobalFree(lpSheetInfo->siAnnoList);
lpSheetInfo->siAnnoList = NULL;
//OIWUpdateCaret(lpSheetInfo);
InvalidateRect(lpSheetInfo->siGen.hWnd,NULL,TRUE);
UpdateWindow(lpSheetInfo->siGen.hWnd);
}
}
DWORD OISGotoAnno(lpSheetInfo,wLocation,dwMask)
LPOISHEETINFO lpSheetInfo;
WORD wLocation;
DWORD dwMask;
{
PSSANNOLIST locAnnoList;
WORD locAnnoIndex;
WORD locStartChunk;
WORD locStartOffset;
DWORD locAnnoSearch;
DWORD locRet;
WORD locCol;
DWORD locRow;
locRet = SCCVW_FOUNDNONE;
if (lpSheetInfo->siAnnoList)
{
locAnnoList = UTGlobalLock(lpSheetInfo->siAnnoList);
locAnnoIndex == (WORD) -1;
switch (wLocation & 0x00FF)
{
case SCCVW_GOTOFIRST:
locAnnoIndex = locAnnoList->wStart;
while (locAnnoIndex != (WORD)-1)
{
if (wLocation & SCCVW_MASK)
{
if ((locAnnoList->aEntrys[locAnnoIndex].uTypes.sGen.dwUser & dwMask) == dwMask)
break;
}
else if (wLocation & SCCVW_ABSOLUTE)
{
if (locAnnoList->aEntrys[locAnnoIndex].uTypes.sGen.dwUser == dwMask)
break;
}
locAnnoIndex = locAnnoList->aEntrys[locAnnoIndex].wNext;
}
if (locAnnoIndex == (WORD)-1)
locRet = SCCVW_FOUNDNONE;
else
locRet = SCCVW_FOUNDOK;
break;
case SCCVW_GOTOLAST:
locAnnoIndex = locAnnoList->wEnd;
while (locAnnoIndex != (WORD)-1)
{
if (wLocation & SCCVW_MASK)
{
if ((locAnnoList->aEntrys[locAnnoIndex].uTypes.sGen.dwUser & dwMask) == dwMask)
break;
}
else if (wLocation & SCCVW_ABSOLUTE)
{
if (locAnnoList->aEntrys[locAnnoIndex].uTypes.sGen.dwUser == dwMask)
break;
}
locAnnoIndex = locAnnoList->aEntrys[locAnnoIndex].wPrev;
}
if (locAnnoIndex == (WORD)-1)
locRet = SCCVW_FOUNDNONE;
else
locRet = SCCVW_FOUNDOK;
break;
case SCCVW_GOTOPREV:
locAnnoIndex = locAnnoList->wEnd;
locAnnoSearch = OISMapCellToChunk(lpSheetInfo,lpSheetInfo->siSelectAnchorRow,lpSheetInfo->siSelectAnchorCol);
while (locAnnoIndex != (WORD)-1)
{
// We can only go from cell to cell, so we look for the first cell
// preceding this one that contains an annotation.
if (locAnnoList->aEntrys[locAnnoIndex].uTypes.sGen.dwStartPos < locAnnoSearch)
{
break;
}
locAnnoIndex = locAnnoList->aEntrys[locAnnoIndex].wPrev;
}
while (locAnnoIndex != (WORD)-1)
{
if (wLocation & SCCVW_MASK)
{
if ((locAnnoList->aEntrys[locAnnoIndex].uTypes.sGen.dwUser & dwMask) == dwMask)
break;
}
else if (wLocation & SCCVW_ABSOLUTE)
{
if (locAnnoList->aEntrys[locAnnoIndex].uTypes.sGen.dwUser == dwMask)
break;
}
locAnnoIndex = locAnnoList->aEntrys[locAnnoIndex].wPrev;
}
if (locAnnoIndex == (WORD)-1)
locRet = SCCVW_FOUNDNONE;
else
locRet = SCCVW_FOUNDOK;
break;
case SCCVW_GOTONEXT:
locAnnoIndex = locAnnoList->wStart;
// We can only go from cell to cell, so tough luck if the current
// cell has more than one annotation.
if( lpSheetInfo->siSelectAnchorCol == lpSheetInfo->siLastColInSheet )
{
locRow = lpSheetInfo->siSelectAnchorRow+1;
locCol = 0;
}
else
{
locRow = lpSheetInfo->siSelectAnchorRow;
locCol = lpSheetInfo->siSelectAnchorCol+1;
}
locAnnoSearch = OISMapCellToChunk(lpSheetInfo,locRow,locCol);
while (locAnnoIndex != (WORD)-1)
{
if (locAnnoList->aEntrys[locAnnoIndex].uTypes.sGen.dwStartPos >= locAnnoSearch)
{
break;
}
locAnnoIndex = locAnnoList->aEntrys[locAnnoIndex].wNext;
}
while (locAnnoIndex != (WORD)-1)
{
if (wLocation & SCCVW_MASK)
{
if ((locAnnoList->aEntrys[locAnnoIndex].uTypes.sGen.dwUser & dwMask) == dwMask)
break;
}
else if (wLocation & SCCVW_ABSOLUTE)
{
if (locAnnoList->aEntrys[locAnnoIndex].uTypes.sGen.dwUser == dwMask)
break;
}
locAnnoIndex = locAnnoList->aEntrys[locAnnoIndex].wNext;
}
if (locAnnoIndex == (WORD)-1)
locRet = SCCVW_FOUNDNONE;
else
locRet = SCCVW_FOUNDOK;
break;
}
if (locAnnoIndex != (WORD)-1)
{
if (locAnnoList->aEntrys[locAnnoIndex].wType == SCCVW_HIDETEXT)
{
locStartChunk = HIWORD(locAnnoList->aEntrys[locAnnoIndex].uTypes.sGen.dwStartPos);
locStartOffset = LOWORD(locAnnoList->aEntrys[locAnnoIndex].uTypes.sGen.dwStartPos);
}
else
{
locStartChunk = HIWORD(locAnnoList->aEntrys[locAnnoIndex].uTypes.sGen.dwStartPos);
locStartOffset = LOWORD(locAnnoList->aEntrys[locAnnoIndex].uTypes.sGen.dwStartPos);
}
// Get the row & col of the annotation.
OISMapChunkPosToCell(lpSheetInfo,locStartChunk,locStartOffset,&locCol,&locRow);
// Reset the selection.
#ifdef SCCFEATURE_SELECT
OISDrawSelection(lpSheetInfo);
#endif
lpSheetInfo->siSelectAnchorRow =
lpSheetInfo->siSelectEndRow = locRow;
lpSheetInfo->siSelectAnchorCol =
lpSheetInfo->siSelectEndCol = locCol;
lpSheetInfo->siSelectMode = OISSELECT_BLOCK;
OISMakeCellVisible(lpSheetInfo,locRow,locCol);
#ifdef SCCFEATURE_SELECT
OISDrawSelection(lpSheetInfo);
#endif
//DUInvalRect(lpSheetInfo,NULL);
}
UTGlobalUnlock(lpSheetInfo->siAnnoList);
}
return(locRet);
}
BOOL OISStartAnnoTrack(lpSheetInfo,dwStartPos,pAnnoTrack)
LPOISHEETINFO lpSheetInfo;
DWORD dwStartPos;
PSSANNOTRACK pAnnoTrack;
{
PSSANNOLIST locAnnoList;
BOOL locRet;
WORD locAnnoIndex;
locRet = FALSE;
pAnnoTrack->dwNextChange = (DWORD)(-1);
if (lpSheetInfo->siAnnoList)
{
locAnnoList = UTGlobalLock(lpSheetInfo->siAnnoList);
if (locAnnoList->wCount > 0)
{
locRet = TRUE;
pAnnoTrack->bHideText = FALSE;
pAnnoTrack->bUseFore = FALSE;
pAnnoTrack->bUseBack = FALSE;
pAnnoTrack->wAnno = (WORD)-1;
pAnnoTrack->bFirst = TRUE;
locAnnoIndex = locAnnoList->wStart;
/*
| Scan right for first entry that belongs in this cell
*/
while( locAnnoIndex != (WORD)-1 )
{
if( locAnnoList->aEntrys[locAnnoIndex].uTypes.sGen.dwStartPos >= dwStartPos )
break;
locAnnoIndex = locAnnoList->aEntrys[locAnnoIndex].wNext;
}
if (locAnnoIndex == (WORD)-1)
{
locRet = FALSE;
}
else
{
locRet = TRUE;
pAnnoTrack->wAnno = locAnnoIndex;
pAnnoTrack->bNextIsStart = TRUE;
pAnnoTrack->dwNextChange = locAnnoList->aEntrys[locAnnoIndex].uTypes.sGen.dwStartPos;
}
}
UTGlobalUnlock(lpSheetInfo->siAnnoList);
}
else
{
pAnnoTrack->bHideText = FALSE;
pAnnoTrack->bUseFore = FALSE;
pAnnoTrack->bUseBack = FALSE;
}
return(locRet);
}
WORD OISTrackAnno(lpSheetInfo,dwCurPos,pAnnoTrack)
LPOISHEETINFO lpSheetInfo;
DWORD dwCurPos;
PSSANNOTRACK pAnnoTrack;
{
PSSANNOLIST locAnnoList;
WORD locRet;
WORD locIndex;
if( pAnnoTrack == NULL )
return 0;
locRet = 0;
while (dwCurPos >= pAnnoTrack->dwNextChange)
{
locAnnoList = UTGlobalLock(lpSheetInfo->siAnnoList);
switch (locAnnoList->aEntrys[pAnnoTrack->wAnno].wType)
{
case SCCVW_HILITETEXT:
UTFlagOn(locRet,OISHandleHilite(lpSheetInfo,locAnnoList,pAnnoTrack,pAnnoTrack->wAnno,pAnnoTrack->bNextIsStart));
break;
/***
case SCCVW_INSERTICON:
pAnnoTrack->wIconAnno = pAnnoTrack->wAnno;
UTFlagOn(locRet,OISHandleIcon(lpSheetInfo,locAnnoList,pAnnoTrack,pAnnoTrack->wAnno));
break;
case SCCVW_HIDETEXT:
UTFlagOn(locRet,OISHandleHide(lpSheetInfo,locAnnoList,pAnnoTrack,pAnnoTrack->wAnno,pAnnoTrack->bNextIsStart));
break;
***/
}
if (pAnnoTrack->bNextIsStart)
{
pAnnoTrack->dwNextChange = locAnnoList->aEntrys[pAnnoTrack->wAnno].uTypes.sGen.dwEndPos;
pAnnoTrack->bNextIsStart = FALSE;
}
else
{
locIndex = locAnnoList->aEntrys[pAnnoTrack->wAnno].wNext;
while (locIndex != (WORD)-1)
{
if (locAnnoList->aEntrys[locIndex].uTypes.sGen.dwStartPos >= dwCurPos)
break;
locIndex = locAnnoList->aEntrys[locIndex].wNext;
}
if (locIndex == (WORD)-1)
{
pAnnoTrack->dwNextChange = (DWORD) -1;
pAnnoTrack->wAnno = (WORD)-1;
}
else
{
pAnnoTrack->dwNextChange = locAnnoList->aEntrys[locIndex].uTypes.sGen.dwStartPos;
pAnnoTrack->wAnno = locIndex;
pAnnoTrack->bNextIsStart = TRUE;
}
}
UTGlobalUnlock(lpSheetInfo->siAnnoList);
}
return(locRet);
}
VOID OISEndAnnoTrack(lpSheetInfo,pAnnoTrack)
LPOISHEETINFO lpSheetInfo;
PSSANNOTRACK pAnnoTrack;
{
}
WORD OISHandleHilite(lpSheetInfo,pAnnoList,pAnnoTrack,wAnno,bStart)
LPOISHEETINFO lpSheetInfo;
PSSANNOLIST pAnnoList;
PSSANNOTRACK pAnnoTrack;
WORD wAnno;
BOOL bStart;
{
WORD locRet;
DWORD locDisplay;
locRet = 0;
UTFlagOn(locRet,SSANNO_HILITETEXTCHANGE);
if (bStart)
{
locDisplay = pAnnoList->aEntrys[wAnno].uTypes.sHiliteText.dwDisplay;
if (locDisplay & SCCVW_BDEFAULT)
{
pAnnoTrack->bUseBack = FALSE;
}
else
{
pAnnoTrack->bUseBack = TRUE;
pAnnoTrack->rgbBack = gColorMap[locDisplay & 0x0000000F];
}
if (locDisplay & SCCVW_FDEFAULT)
{
pAnnoTrack->bUseFore = FALSE;
}
else
{
pAnnoTrack->bUseFore = TRUE;
pAnnoTrack->rgbFore = gColorMap[((locDisplay & 0x000000F0) >> 4)];
}
}
else
{
pAnnoTrack->bUseFore = FALSE;
pAnnoTrack->bUseBack = FALSE;
}
return(locRet);
}
WORD OISHandleHide(lpSheetInfo,pAnnoList,pAnnoTrack,wAnno,bStart)
LPOISHEETINFO lpSheetInfo;
PSSANNOLIST pAnnoList;
PSSANNOTRACK pAnnoTrack;
WORD wAnno;
BOOL bStart;
{
WORD locRet;
locRet = 0;
UTFlagOn(locRet,SSANNO_HIDETEXTCHANGE);
pAnnoTrack->bHideText = bStart;
return(locRet);
}
WORD OISHandleIcon(lpSheetInfo,pAnnoList,pAnnoTrack,wAnno)
LPOISHEETINFO lpSheetInfo;
PSSANNOLIST pAnnoList;
PSSANNOTRACK pAnnoTrack;
WORD wAnno;
{
WORD locRet;
locRet = 0;
UTFlagOn(locRet,SSANNO_INSERTICON);
pAnnoTrack->hIcon = pAnnoList->aEntrys[wAnno].uTypes.sInsertIcon.hIcon;
return(locRet);
}
#ifdef NEVER
BOOL OISHandleAnnoHit(lpSheetInfo,wX,wY,bDouble)
LPOISHEETINFO lpSheetInfo;
int wX;
int wY;
BOOL bDouble;
{
WORD locCount;
int locFindX;
int locHeight;
OIWORDPOS locPos;
WORD locAnno;
PSSANNOLIST locAnnoList;
SCCVWANNOTATIONEVENT40 locEvent;
BOOL locRet;
locRet = FALSE;
if (lpSheetInfo->siAnnoList)
{
/*
| Determine the line
*/
locPos = lpSheetInfo->siCurTopPos;
/* PJB OFFSET */
locHeight = lpSheetInfo->siCurYOffset + OIWGetLineHeight(&locPos,lpSheetInfo) - lpSheetInfo->siCurTopOffset;
while (wY > locHeight)
{
if (!OINextLine(&locPos,lpSheetInfo))
break; /* ran out of lines */
locHeight += (int) OIWGetLineHeight(&locPos,lpSheetInfo);
}
/*
| Get the line information
*/
OIMapWordLineToCharInfo(&locPos,lpSheetInfo);
/*
| Calculate the normalized DC of the point in question
*/
locFindX = wX + lpSheetInfo->siCurLeftOffset;
/*
| Run through the line info looking to exceed this point
*/
for (locCount = 0; locCount < lpSheetInfo->siCharCount; locCount++)
{
if (locFindX <= lpSheetInfo->siCharXs[locCount])
break;
}
if (locCount != 0)
{
locCount--;
}
if (lpSheetInfo->siCharAnno[locCount] != (WORD)-1)
{
locAnnoList = UTGlobalLock(lpSheetInfo->siAnnoList);
locAnno = lpSheetInfo->siCharAnno[locCount];
if (bDouble)
{
if (locAnnoList->aEntrys[locAnno].uTypes.sGen.dwInteraction & SCCVW_EVENTDOUBLECLICK)
{
locEvent.dwEvent = SCCVW_EVENTDOUBLECLICK;
locEvent.dwUser = locAnnoList->aEntrys[locAnno].uTypes.sGen.dwUser;
SendMessage(GetParent(lpSheetInfo->siGen.hWnd),SCCVW_ANNOTATIONEVENT,(WPARAM)lpSheetInfo->siGen.hWnd,(LPARAM)(PSCCVWANNOTATIONEVENT40)&locEvent);
locRet = TRUE;
}
}
else
{
if (locAnnoList->aEntrys[locAnno].uTypes.sGen.dwInteraction & SCCVW_EVENTSINGLECLICK)
{
locEvent.dwEvent = SCCVW_EVENTSINGLECLICK;
locEvent.dwUser = locAnnoList->aEntrys[locAnno].uTypes.sGen.dwUser;
SendMessage(GetParent(lpSheetInfo->siGen.hWnd),SCCVW_ANNOTATIONEVENT,(WPARAM)lpSheetInfo->siGen.hWnd,(LPARAM)(PSCCVWANNOTATIONEVENT40)&locEvent);
locRet = TRUE;
}
}
UTGlobalUnlock(lpSheetInfo->siAnnoList);
}
}
return(locRet);
}
#endif