clean up accessing CellInfo array in RowInfo
The array allocates one extra item before and after, which means all indexing must add 1 to column number. And a lot of the code uses array index variables instead of column numbers, which makes it confusing whether the value is +1 or not. To sort this out, hide the array inside RowInfo and provide access functions that will hide those +1 from caller code, plus it will do error checking. Change-Id: Ia91bd76e15fc6c96c09f27c742d71001f4c4151c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/129698 Tested-by: Jenkins Reviewed-by: Luboš Luňák <l.lunak@collabora.com>
This commit is contained in:
+29
-1
@@ -176,7 +176,26 @@ struct RowInfo
|
||||
RowInfo(const RowInfo&) = delete;
|
||||
const RowInfo& operator=(const RowInfo&) = delete;
|
||||
|
||||
CellInfo* pCellInfo;
|
||||
CellInfo& cellInfo(SCCOL nCol)
|
||||
{
|
||||
#ifdef DBG_UTIL
|
||||
assert( nCol >= -1 && nCol <= nCols + 1 );
|
||||
#endif
|
||||
return pCellInfo[ nCol + 1 ];
|
||||
}
|
||||
const CellInfo& cellInfo(SCCOL nCol) const
|
||||
{
|
||||
return const_cast<RowInfo*>(this)->cellInfo(nCol);
|
||||
}
|
||||
|
||||
void allocCellInfo(SCCOL cols)
|
||||
{
|
||||
#ifdef DBG_UTIL
|
||||
nCols = cols;
|
||||
#endif
|
||||
pCellInfo = new CellInfo[ cols + 2 ];
|
||||
}
|
||||
void freeCellInfo() { delete[] pCellInfo; }
|
||||
|
||||
sal_uInt16 nHeight;
|
||||
SCROW nRowNo;
|
||||
@@ -186,6 +205,15 @@ struct RowInfo
|
||||
bool bAutoFilter:1;
|
||||
bool bPivotButton:1;
|
||||
bool bChanged:1; // TRUE, if not tested
|
||||
|
||||
private:
|
||||
// This class allocates CellInfo with also one item extra before and after.
|
||||
// To make handling easier, this is private and access functions take care of adjusting
|
||||
// the array indexes and error-checking.
|
||||
CellInfo* pCellInfo;
|
||||
#ifdef DBG_UTIL
|
||||
SCCOL nCols;
|
||||
#endif
|
||||
};
|
||||
|
||||
struct ScTableInfo
|
||||
|
||||
@@ -53,7 +53,7 @@ static void lcl_GetMergeRange( SCCOL nX, SCROW nY, SCSIZE nArrY,
|
||||
SCCOL nX1, SCROW nY1, SCTAB nTab,
|
||||
SCCOL& rStartX, SCROW& rStartY, SCCOL& rEndX, SCROW& rEndY )
|
||||
{
|
||||
CellInfo* pInfo = &pRowInfo[nArrY].pCellInfo[nX+1];
|
||||
CellInfo* pInfo = &pRowInfo[nArrY].cellInfo(nX);
|
||||
|
||||
rStartX = nX;
|
||||
rStartY = nY;
|
||||
@@ -67,8 +67,8 @@ static void lcl_GetMergeRange( SCCOL nX, SCROW nY, SCSIZE nArrY,
|
||||
--rStartX;
|
||||
if (rStartX >= nX1 && !pDoc->ColHidden(rStartX, nTab, nullptr, &nLastCol))
|
||||
{
|
||||
bHOver = pRowInfo[nArrY].pCellInfo[rStartX+1].bHOverlapped;
|
||||
bVOver = pRowInfo[nArrY].pCellInfo[rStartX+1].bVOverlapped;
|
||||
bHOver = pRowInfo[nArrY].cellInfo(rStartX).bHOverlapped;
|
||||
bVOver = pRowInfo[nArrY].cellInfo(rStartX).bVOverlapped;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -90,7 +90,7 @@ static void lcl_GetMergeRange( SCCOL nX, SCROW nY, SCSIZE nArrY,
|
||||
!pDoc->RowHidden(rStartY, nTab, nullptr, &nLastRow) &&
|
||||
pRowInfo[nArrY].nRowNo == rStartY)
|
||||
{
|
||||
bVOver = pRowInfo[nArrY].pCellInfo[rStartX+1].bVOverlapped;
|
||||
bVOver = pRowInfo[nArrY].cellInfo(rStartX).bVOverlapped;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -106,7 +106,7 @@ static void lcl_GetMergeRange( SCCOL nX, SCROW nY, SCSIZE nArrY,
|
||||
!pDoc->RowHidden(rStartY, nTab, nullptr, &nLastRow) &&
|
||||
pRowInfo[nArrY].nRowNo == rStartY)
|
||||
{
|
||||
pMerge = &pRowInfo[nArrY].pCellInfo[rStartX+1].pPatternAttr->
|
||||
pMerge = &pRowInfo[nArrY].cellInfo(rStartX).pPatternAttr->
|
||||
GetItem(ATTR_MERGE);
|
||||
}
|
||||
else
|
||||
@@ -123,7 +123,7 @@ class RowInfoFiller
|
||||
ScDocument& mrDoc;
|
||||
SCTAB mnTab;
|
||||
RowInfo* mpRowInfo;
|
||||
SCCOL mnArrX;
|
||||
SCCOL mnCol;
|
||||
SCSIZE mnArrY;
|
||||
SCROW mnHiddenEndRow;
|
||||
bool mbHiddenRow;
|
||||
@@ -147,15 +147,15 @@ class RowInfoFiller
|
||||
alignArray(nRow);
|
||||
|
||||
RowInfo& rThisRowInfo = mpRowInfo[mnArrY];
|
||||
CellInfo& rInfo = rThisRowInfo.pCellInfo[mnArrX];
|
||||
CellInfo& rInfo = rThisRowInfo.cellInfo(mnCol);
|
||||
rInfo.maCell = rCell;
|
||||
rInfo.bEmptyCellText = false;
|
||||
++mnArrY;
|
||||
}
|
||||
|
||||
public:
|
||||
RowInfoFiller(ScDocument& rDoc, SCTAB nTab, RowInfo* pRowInfo, SCCOL nArrX, SCSIZE nArrY) :
|
||||
mrDoc(rDoc), mnTab(nTab), mpRowInfo(pRowInfo), mnArrX(nArrX), mnArrY(nArrY),
|
||||
RowInfoFiller(ScDocument& rDoc, SCTAB nTab, RowInfo* pRowInfo, SCCOL nCol, SCSIZE nArrY) :
|
||||
mrDoc(rDoc), mnTab(nTab), mpRowInfo(pRowInfo), mnCol(nCol), mnArrY(nArrY),
|
||||
mnHiddenEndRow(-1), mbHiddenRow(false) {}
|
||||
|
||||
void operator() (size_t nRow, double fVal)
|
||||
@@ -212,7 +212,7 @@ void initRowInfo(const ScDocument* pDoc, RowInfo* pRowInfo, const SCSIZE nMaxRow
|
||||
if ( rArrRow==0 || nDocHeight || nY > pDoc->MaxRow() )
|
||||
{
|
||||
RowInfo* pThisRowInfo = &pRowInfo[rArrRow];
|
||||
pThisRowInfo->pCellInfo = nullptr; // is loaded below
|
||||
// pThisRowInfo->pCellInfo is set below using allocCellInfo()
|
||||
|
||||
sal_uInt16 nHeight = static_cast<sal_uInt16>(
|
||||
std::clamp(
|
||||
@@ -246,11 +246,11 @@ void initCellInfo(RowInfo* pRowInfo, SCSIZE nArrCount, SCCOL nRotMax,
|
||||
for (SCSIZE nArrRow = 0; nArrRow < nArrCount; ++nArrRow)
|
||||
{
|
||||
RowInfo& rThisRowInfo = pRowInfo[nArrRow];
|
||||
rThisRowInfo.pCellInfo = new CellInfo[nRotMax + 1 + 2]; // to delete the caller!
|
||||
rThisRowInfo.allocCellInfo( nRotMax + 1 );
|
||||
|
||||
for (SCCOL nArrCol = 0; nArrCol <= nRotMax+2; ++nArrCol) // Preassign cell info
|
||||
for (SCCOL nCol = -1; nCol <= nRotMax+1; ++nCol) // Preassign cell info
|
||||
{
|
||||
CellInfo& rInfo = rThisRowInfo.pCellInfo[nArrCol];
|
||||
CellInfo& rInfo = rThisRowInfo.cellInfo(nCol);
|
||||
rInfo.bEmptyCellText = true;
|
||||
rInfo.pShadowAttr = pDefShadow;
|
||||
}
|
||||
@@ -259,18 +259,17 @@ void initCellInfo(RowInfo* pRowInfo, SCSIZE nArrCount, SCCOL nRotMax,
|
||||
|
||||
void initColWidths(RowInfo* pRowInfo, const ScDocument* pDoc, double fColScale, SCTAB nTab, SCCOL nCol2, SCCOL nRotMax)
|
||||
{
|
||||
for (SCCOL nArrCol=nCol2+3; nArrCol<=nRotMax+2; nArrCol++) // Add remaining widths
|
||||
for (SCCOL nCol=nCol2+2; nCol<=nRotMax+1; nCol++) // Add remaining widths
|
||||
{
|
||||
SCCOL nX = nArrCol-1;
|
||||
if ( pDoc->ValidCol(nX) )
|
||||
if ( pDoc->ValidCol(nCol) )
|
||||
{
|
||||
if (!pDoc->ColHidden(nX, nTab))
|
||||
if (!pDoc->ColHidden(nCol, nTab))
|
||||
{
|
||||
sal_uInt16 nThisWidth = static_cast<sal_uInt16>(pDoc->GetColWidth( nX, nTab ) * fColScale);
|
||||
sal_uInt16 nThisWidth = static_cast<sal_uInt16>(pDoc->GetColWidth( nCol, nTab ) * fColScale);
|
||||
if (!nThisWidth)
|
||||
nThisWidth = 1;
|
||||
|
||||
pRowInfo[0].pCellInfo[nArrCol].nWidth = nThisWidth;
|
||||
pRowInfo[0].cellInfo(nCol).nWidth = nThisWidth;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -395,7 +394,7 @@ void ScDocument::FillInfo(
|
||||
|
||||
OSL_ENSURE( nArrCount>2, "nArrCount too small" );
|
||||
FindMaxRotCol( nTab, &pRowInfo[1], nArrCount-1, nCol1, nCol2 );
|
||||
// FindMaxRotCol setzt nRotMaxCol
|
||||
// FindMaxRotCol sets nRotMaxCol
|
||||
|
||||
for (nArrRow=0; nArrRow<nArrCount; nArrRow++)
|
||||
if (pRowInfo[nArrRow].nRotMaxCol != SC_ROTMAX_NONE && pRowInfo[nArrRow].nRotMaxCol > nRotMax)
|
||||
@@ -412,31 +411,29 @@ void ScDocument::FillInfo(
|
||||
if (pCondFormList)
|
||||
pCondFormList->startRendering();
|
||||
|
||||
for (SCCOL nArrCol=0; nArrCol<=nCol2+2; nArrCol++) // left & right + 1
|
||||
for (SCCOL nCol=-1; nCol<=nCol2+1; nCol++) // left & right + 1
|
||||
{
|
||||
SCCOL nX = (nArrCol>0) ? nArrCol-1 : MaxCol()+1; // negative -> invalid
|
||||
|
||||
if (ValidCol(nX))
|
||||
if (ValidCol(nCol))
|
||||
{
|
||||
// #i58049#, #i57939# Hidden columns must be skipped here, or their attributes
|
||||
// will disturb the output
|
||||
|
||||
// TODO: Optimize this loop.
|
||||
if (!ColHidden(nX, nTab))
|
||||
if (!ColHidden(nCol, nTab))
|
||||
{
|
||||
sal_uInt16 nThisWidth = static_cast<sal_uInt16>(std::clamp(GetColWidth( nX, nTab ) * fColScale, 1.0, double(std::numeric_limits<sal_uInt16>::max())));
|
||||
sal_uInt16 nThisWidth = static_cast<sal_uInt16>(std::clamp(GetColWidth( nCol, nTab ) * fColScale, 1.0, double(std::numeric_limits<sal_uInt16>::max())));
|
||||
|
||||
pRowInfo[0].pCellInfo[nArrCol].nWidth = nThisWidth; //TODO: this should be enough
|
||||
pRowInfo[0].cellInfo(nCol).nWidth = nThisWidth; //TODO: this should be enough
|
||||
|
||||
const ScAttrArray* pThisAttrArr; // Attribute
|
||||
if (nX < maTabs[nTab]->GetAllocatedColumnsCount())
|
||||
if (nCol < maTabs[nTab]->GetAllocatedColumnsCount())
|
||||
{
|
||||
ScColumn* pThisCol = &maTabs[nTab]->aCol[nX]; // Column data
|
||||
ScColumn* pThisCol = &maTabs[nTab]->aCol[nCol]; // Column data
|
||||
|
||||
nArrRow = 1;
|
||||
// Iterate between rows nY1 and nY2 and pick up non-empty
|
||||
// cells that are not hidden.
|
||||
RowInfoFiller aFunc(*this, nTab, pRowInfo, nArrCol, nArrRow);
|
||||
RowInfoFiller aFunc(*this, nTab, pRowInfo, nCol, nArrRow);
|
||||
sc::ParseAllNonEmpty(pThisCol->maCells.begin(), pThisCol->maCells, nRow1, nRow2,
|
||||
aFunc);
|
||||
|
||||
@@ -445,7 +442,7 @@ void ScDocument::FillInfo(
|
||||
else
|
||||
pThisAttrArr = &maTabs[nTab]->aDefaultColAttrArray;
|
||||
|
||||
if (nX+1 >= nCol1) // Attribute/Blockmark from nX1-1
|
||||
if (nCol+1 >= nCol1) // Attribute/Blockmark from nX1-1
|
||||
{
|
||||
nArrRow = 0;
|
||||
|
||||
@@ -519,7 +516,7 @@ void ScDocument::FillInfo(
|
||||
bool bRowHidden = RowHidden(nCurRow, nTab, nullptr, &nLastHiddenRow);
|
||||
if ( nArrRow==0 || !bRowHidden )
|
||||
{
|
||||
if ( GetPreviewCellStyle( nX, nCurRow, nTab ) != nullptr )
|
||||
if ( GetPreviewCellStyle( nCol, nCurRow, nTab ) != nullptr )
|
||||
bAnyPreview = true;
|
||||
RowInfo* pThisRowInfo = &pRowInfo[nArrRow];
|
||||
if (pBackground != pDefBackground) // Column background == Default ?
|
||||
@@ -531,7 +528,7 @@ void ScDocument::FillInfo(
|
||||
if (bPivotButton || bPivotPopupButton)
|
||||
pThisRowInfo->bPivotButton = true;
|
||||
|
||||
CellInfo* pInfo = &pThisRowInfo->pCellInfo[nArrCol];
|
||||
CellInfo* pInfo = &pThisRowInfo->cellInfo(nCol);
|
||||
pInfo->pBackground = pBackground;
|
||||
pInfo->pPatternAttr = pPattern;
|
||||
pInfo->bMerged = bMerged;
|
||||
@@ -555,7 +552,7 @@ void ScDocument::FillInfo(
|
||||
|
||||
if (bContainsCondFormat && pCondFormList)
|
||||
{
|
||||
bAnyCondition |= handleConditionalFormat(*pCondFormList, rCondFormats, pInfo, pStlPool, ScAddress(nX, nCurRow, nTab),
|
||||
bAnyCondition |= handleConditionalFormat(*pCondFormList, rCondFormats, pInfo, pStlPool, ScAddress(nCol, nCurRow, nTab),
|
||||
bHidden, bHideFormula, bTabProtect);
|
||||
}
|
||||
|
||||
@@ -580,7 +577,7 @@ void ScDocument::FillInfo(
|
||||
if (pMarkData && pMarkData->IsMultiMarked())
|
||||
{
|
||||
// Block marks
|
||||
ScMarkArray aThisMarkArr(pMarkData->GetMarkArray( nX ));
|
||||
ScMarkArray aThisMarkArr(pMarkData->GetMarkArray( nCol ));
|
||||
nArrRow = 1;
|
||||
nCurRow = nRow1; // single rows
|
||||
|
||||
@@ -610,7 +607,7 @@ void ScDocument::FillInfo(
|
||||
for (nArrRow=1; nArrRow+1<nArrCount; nArrRow++)
|
||||
{
|
||||
RowInfo* pThisRowInfo = &pRowInfo[nArrRow];
|
||||
CellInfo* pInfo = &pThisRowInfo->pCellInfo[nArrCol];
|
||||
CellInfo* pInfo = &pThisRowInfo->cellInfo(nCol);
|
||||
|
||||
pInfo->nWidth = nThisWidth; //TODO: or check only 0 ??
|
||||
}
|
||||
@@ -618,7 +615,7 @@ void ScDocument::FillInfo(
|
||||
}
|
||||
}
|
||||
else
|
||||
pRowInfo[0].pCellInfo[nArrCol].nWidth = STD_COL_WIDTH;
|
||||
pRowInfo[0].cellInfo(nCol).nWidth = STD_COL_WIDTH;
|
||||
// STD_COL_WIDTH farthest to the left and right is needed for DrawExtraShadow
|
||||
}
|
||||
|
||||
@@ -632,10 +629,9 @@ void ScDocument::FillInfo(
|
||||
{
|
||||
for (nArrRow=0; nArrRow<nArrCount; nArrRow++)
|
||||
{
|
||||
for (SCCOL nArrCol=nCol1; nArrCol<=nCol2+2; nArrCol++) // 1 more left and right
|
||||
for (SCCOL nCol=nCol1-1; nCol<=nCol2+1; nCol++) // 1 more left and right
|
||||
{
|
||||
CellInfo* pInfo = &pRowInfo[nArrRow].pCellInfo[nArrCol];
|
||||
SCCOL nCol = (nArrCol>0) ? nArrCol-1 : MaxCol()+1;
|
||||
CellInfo* pInfo = &pRowInfo[nArrRow].cellInfo(nCol);
|
||||
ScPatternAttr* pModifiedPatt = nullptr;
|
||||
|
||||
if ( ValidCol(nCol) && pRowInfo[nArrRow].nRowNo <= MaxRow() )
|
||||
@@ -697,10 +693,9 @@ void ScDocument::FillInfo(
|
||||
RowInfo* pThisRowInfo = &pRowInfo[nArrRow];
|
||||
SCROW nSignedY = nArrRow ? pThisRowInfo->nRowNo : nRow1-1;
|
||||
|
||||
for (SCCOL nArrCol=nCol1; nArrCol<=nCol2+2; nArrCol++) // 1 more left and right
|
||||
for (SCCOL nCol=nCol1-1; nCol<=nCol2+1; nCol++) // 1 more left and right
|
||||
{
|
||||
SCCOL nSignedX = nArrCol - 1;
|
||||
CellInfo* pInfo = &pThisRowInfo->pCellInfo[nArrCol];
|
||||
CellInfo* pInfo = &pThisRowInfo->cellInfo(nCol);
|
||||
|
||||
if (pInfo->bMerged || pInfo->bHOverlapped || pInfo->bVOverlapped)
|
||||
{
|
||||
@@ -708,7 +703,7 @@ void ScDocument::FillInfo(
|
||||
SCROW nStartY;
|
||||
SCCOL nEndX;
|
||||
SCROW nEndY;
|
||||
lcl_GetMergeRange( nSignedX,nSignedY, nArrRow, this,pRowInfo, nCol1,nRow1,nTab,
|
||||
lcl_GetMergeRange( nCol,nSignedY, nArrRow, this,pRowInfo, nCol1,nRow1,nTab,
|
||||
nStartX,nStartY, nEndX,nEndY );
|
||||
const ScPatternAttr* pStartPattern = GetPattern( nStartX,nStartY,nTab );
|
||||
const SfxItemSet* pStartCond = GetCondResult( nStartX,nStartY,nTab );
|
||||
@@ -742,12 +737,12 @@ void ScDocument::FillInfo(
|
||||
bool bTop = ( nArrRow == 0 );
|
||||
bool bBottom = ( nArrRow+1 == nArrCount );
|
||||
|
||||
for (SCCOL nArrCol=nCol1; nArrCol<=nCol2+2; nArrCol++) // 1 more left and right
|
||||
for (SCCOL nCol=nCol1-1; nCol<=nCol2+1; nCol++) // 1 more left and right
|
||||
{
|
||||
bool bLeft = ( nArrCol == nCol1 );
|
||||
bool bRight = ( nArrCol == nCol2+2 );
|
||||
bool bLeft = ( nCol == nCol1-1 );
|
||||
bool bRight = ( nCol == nCol2+1 );
|
||||
|
||||
CellInfo* pInfo = &pRowInfo[nArrRow].pCellInfo[nArrCol];
|
||||
CellInfo* pInfo = &pRowInfo[nArrRow].cellInfo(nCol);
|
||||
const SvxShadowItem* pThisAttr = pInfo->pShadowAttr;
|
||||
SvxShadowLocation eLoc = pThisAttr ? pThisAttr->GetLocation() : SvxShadowLocation::NONE;
|
||||
if (eLoc != SvxShadowLocation::NONE)
|
||||
@@ -757,19 +752,19 @@ void ScDocument::FillInfo(
|
||||
SCCOL nDxPos = 1;
|
||||
SCCOL nDxNeg = -1;
|
||||
|
||||
while ( nArrCol+nDxPos < nCol2+2 && pRowInfo[0].pCellInfo[nArrCol+nDxPos].nWidth == 0 )
|
||||
while ( nCol+nDxPos < nCol2+1 && pRowInfo[0].cellInfo(nCol+nDxPos).nWidth == 0 )
|
||||
++nDxPos;
|
||||
while ( nArrCol+nDxNeg > nCol1 && pRowInfo[0].pCellInfo[nArrCol+nDxNeg].nWidth == 0 )
|
||||
while ( nCol+nDxNeg > nCol1-1 && pRowInfo[0].cellInfo(nCol+nDxNeg).nWidth == 0 )
|
||||
--nDxNeg;
|
||||
|
||||
bool bLeftDiff = !bLeft &&
|
||||
pRowInfo[nArrRow].pCellInfo[nArrCol+nDxNeg].pShadowAttr->GetLocation() == SvxShadowLocation::NONE;
|
||||
pRowInfo[nArrRow].cellInfo(nCol+nDxNeg).pShadowAttr->GetLocation() == SvxShadowLocation::NONE;
|
||||
bool bRightDiff = !bRight &&
|
||||
pRowInfo[nArrRow].pCellInfo[nArrCol+nDxPos].pShadowAttr->GetLocation() == SvxShadowLocation::NONE;
|
||||
pRowInfo[nArrRow].cellInfo(nCol+nDxPos).pShadowAttr->GetLocation() == SvxShadowLocation::NONE;
|
||||
bool bTopDiff = !bTop &&
|
||||
pRowInfo[nArrRow-1].pCellInfo[nArrCol].pShadowAttr->GetLocation() == SvxShadowLocation::NONE;
|
||||
pRowInfo[nArrRow-1].cellInfo(nCol).pShadowAttr->GetLocation() == SvxShadowLocation::NONE;
|
||||
bool bBottomDiff = !bBottom &&
|
||||
pRowInfo[nArrRow+1].pCellInfo[nArrCol].pShadowAttr->GetLocation() == SvxShadowLocation::NONE;
|
||||
pRowInfo[nArrRow+1].cellInfo(nCol).pShadowAttr->GetLocation() == SvxShadowLocation::NONE;
|
||||
|
||||
if ( bLayoutRTL )
|
||||
{
|
||||
@@ -791,80 +786,80 @@ void ScDocument::FillInfo(
|
||||
case SvxShadowLocation::BottomRight:
|
||||
if (bBottomDiff)
|
||||
{
|
||||
pRowInfo[nArrRow+1].pCellInfo[nArrCol].pHShadowOrigin = pThisAttr;
|
||||
pRowInfo[nArrRow+1].pCellInfo[nArrCol].eHShadowPart =
|
||||
pRowInfo[nArrRow+1].cellInfo(nCol).pHShadowOrigin = pThisAttr;
|
||||
pRowInfo[nArrRow+1].cellInfo(nCol).eHShadowPart =
|
||||
bLeftDiff ? SC_SHADOW_HSTART : SC_SHADOW_HORIZ;
|
||||
}
|
||||
if (bRightDiff)
|
||||
{
|
||||
pRowInfo[nArrRow].pCellInfo[nArrCol+1].pVShadowOrigin = pThisAttr;
|
||||
pRowInfo[nArrRow].pCellInfo[nArrCol+1].eVShadowPart =
|
||||
pRowInfo[nArrRow].cellInfo(nCol+1).pVShadowOrigin = pThisAttr;
|
||||
pRowInfo[nArrRow].cellInfo(nCol+1).eVShadowPart =
|
||||
bTopDiff ? SC_SHADOW_VSTART : SC_SHADOW_VERT;
|
||||
}
|
||||
if (bBottomDiff && bRightDiff)
|
||||
{
|
||||
pRowInfo[nArrRow+1].pCellInfo[nArrCol+1].pHShadowOrigin = pThisAttr;
|
||||
pRowInfo[nArrRow+1].pCellInfo[nArrCol+1].eHShadowPart = SC_SHADOW_CORNER;
|
||||
pRowInfo[nArrRow+1].cellInfo(nCol).pHShadowOrigin = pThisAttr;
|
||||
pRowInfo[nArrRow+1].cellInfo(nCol).eHShadowPart = SC_SHADOW_CORNER;
|
||||
}
|
||||
break;
|
||||
|
||||
case SvxShadowLocation::BottomLeft:
|
||||
if (bBottomDiff)
|
||||
{
|
||||
pRowInfo[nArrRow+1].pCellInfo[nArrCol].pHShadowOrigin = pThisAttr;
|
||||
pRowInfo[nArrRow+1].pCellInfo[nArrCol].eHShadowPart =
|
||||
pRowInfo[nArrRow+1].cellInfo(nCol).pHShadowOrigin = pThisAttr;
|
||||
pRowInfo[nArrRow+1].cellInfo(nCol).eHShadowPart =
|
||||
bRightDiff ? SC_SHADOW_HSTART : SC_SHADOW_HORIZ;
|
||||
}
|
||||
if (bLeftDiff)
|
||||
{
|
||||
pRowInfo[nArrRow].pCellInfo[nArrCol-1].pVShadowOrigin = pThisAttr;
|
||||
pRowInfo[nArrRow].pCellInfo[nArrCol-1].eVShadowPart =
|
||||
pRowInfo[nArrRow].cellInfo(nCol-1).pVShadowOrigin = pThisAttr;
|
||||
pRowInfo[nArrRow].cellInfo(nCol-1).eVShadowPart =
|
||||
bTopDiff ? SC_SHADOW_VSTART : SC_SHADOW_VERT;
|
||||
}
|
||||
if (bBottomDiff && bLeftDiff)
|
||||
{
|
||||
pRowInfo[nArrRow+1].pCellInfo[nArrCol-1].pHShadowOrigin = pThisAttr;
|
||||
pRowInfo[nArrRow+1].pCellInfo[nArrCol-1].eHShadowPart = SC_SHADOW_CORNER;
|
||||
pRowInfo[nArrRow+1].cellInfo(nCol-1).pHShadowOrigin = pThisAttr;
|
||||
pRowInfo[nArrRow+1].cellInfo(nCol-1).eHShadowPart = SC_SHADOW_CORNER;
|
||||
}
|
||||
break;
|
||||
|
||||
case SvxShadowLocation::TopRight:
|
||||
if (bTopDiff)
|
||||
{
|
||||
pRowInfo[nArrRow-1].pCellInfo[nArrCol].pHShadowOrigin = pThisAttr;
|
||||
pRowInfo[nArrRow-1].pCellInfo[nArrCol].eHShadowPart =
|
||||
pRowInfo[nArrRow-1].cellInfo(nCol).pHShadowOrigin = pThisAttr;
|
||||
pRowInfo[nArrRow-1].cellInfo(nCol).eHShadowPart =
|
||||
bLeftDiff ? SC_SHADOW_HSTART : SC_SHADOW_HORIZ;
|
||||
}
|
||||
if (bRightDiff)
|
||||
{
|
||||
pRowInfo[nArrRow].pCellInfo[nArrCol+1].pVShadowOrigin = pThisAttr;
|
||||
pRowInfo[nArrRow].pCellInfo[nArrCol+1].eVShadowPart =
|
||||
pRowInfo[nArrRow].cellInfo(nCol+1).pVShadowOrigin = pThisAttr;
|
||||
pRowInfo[nArrRow].cellInfo(nCol+1).eVShadowPart =
|
||||
bBottomDiff ? SC_SHADOW_VSTART : SC_SHADOW_VERT;
|
||||
}
|
||||
if (bTopDiff && bRightDiff)
|
||||
{
|
||||
pRowInfo[nArrRow-1].pCellInfo[nArrCol+1].pHShadowOrigin = pThisAttr;
|
||||
pRowInfo[nArrRow-1].pCellInfo[nArrCol+1].eHShadowPart = SC_SHADOW_CORNER;
|
||||
pRowInfo[nArrRow-1].cellInfo(nCol+1).pHShadowOrigin = pThisAttr;
|
||||
pRowInfo[nArrRow-1].cellInfo(nCol+1).eHShadowPart = SC_SHADOW_CORNER;
|
||||
}
|
||||
break;
|
||||
|
||||
case SvxShadowLocation::TopLeft:
|
||||
if (bTopDiff)
|
||||
{
|
||||
pRowInfo[nArrRow-1].pCellInfo[nArrCol].pHShadowOrigin = pThisAttr;
|
||||
pRowInfo[nArrRow-1].pCellInfo[nArrCol].eHShadowPart =
|
||||
pRowInfo[nArrRow-1].cellInfo(nCol).pHShadowOrigin = pThisAttr;
|
||||
pRowInfo[nArrRow-1].cellInfo(nCol).eHShadowPart =
|
||||
bRightDiff ? SC_SHADOW_HSTART : SC_SHADOW_HORIZ;
|
||||
}
|
||||
if (bLeftDiff)
|
||||
{
|
||||
pRowInfo[nArrRow].pCellInfo[nArrCol-1].pVShadowOrigin = pThisAttr;
|
||||
pRowInfo[nArrRow].pCellInfo[nArrCol-1].eVShadowPart =
|
||||
pRowInfo[nArrRow].cellInfo(nCol-1).pVShadowOrigin = pThisAttr;
|
||||
pRowInfo[nArrRow].cellInfo(nCol-1).eVShadowPart =
|
||||
bBottomDiff ? SC_SHADOW_VSTART : SC_SHADOW_VERT;
|
||||
}
|
||||
if (bTopDiff && bLeftDiff)
|
||||
{
|
||||
pRowInfo[nArrRow-1].pCellInfo[nArrCol-1].pHShadowOrigin = pThisAttr;
|
||||
pRowInfo[nArrRow-1].pCellInfo[nArrCol-1].eHShadowPart = SC_SHADOW_CORNER;
|
||||
pRowInfo[nArrRow-1].cellInfo(nCol-1).pHShadowOrigin = pThisAttr;
|
||||
pRowInfo[nArrRow-1].cellInfo(nCol-1).eHShadowPart = SC_SHADOW_CORNER;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -882,9 +877,9 @@ void ScDocument::FillInfo(
|
||||
// *** create the frame border array ***
|
||||
|
||||
// RowInfo structs are filled in the range [ 0 , nArrCount-1 ]
|
||||
// each RowInfo contains CellInfo structs in the range [ nX1-1 , nX2+1 ]
|
||||
// each RowInfo contains CellInfo structs in the range [ nCol1-1 , nCol2+1 ]
|
||||
|
||||
size_t nColCount = nCol2 - nCol1 + 3;
|
||||
size_t nColCount = nCol2 - nCol1 + 1 + 2;
|
||||
size_t nRowCount = nArrCount;
|
||||
|
||||
svx::frame::Array& rArray = rTabInfo.maArray;
|
||||
@@ -895,21 +890,22 @@ void ScDocument::FillInfo(
|
||||
sal_uInt16 nCellInfoY = static_cast< sal_uInt16 >( nRow );
|
||||
RowInfo& rThisRowInfo = pRowInfo[ nCellInfoY ];
|
||||
|
||||
for( size_t nCol = 0; nCol < nColCount; ++nCol )
|
||||
for( SCCOL nCol = nCol1 - 1; nCol <= nCol2 + 1; ++nCol ) // 1 more left and right
|
||||
{
|
||||
sal_uInt16 nCellInfoX = static_cast< sal_uInt16 >( nCol + nCol1 );
|
||||
const CellInfo& rInfo = rThisRowInfo.pCellInfo[ nCellInfoX ];
|
||||
|
||||
const CellInfo& rInfo = rThisRowInfo.cellInfo( nCol );
|
||||
const SvxBoxItem* pBox = rInfo.pLinesAttr;
|
||||
const SvxLineItem* pTLBR = rInfo.mpTLBRLine;
|
||||
const SvxLineItem* pBLTR = rInfo.mpBLTRLine;
|
||||
|
||||
size_t nFirstCol = nCol;
|
||||
size_t colToIndex = -(nCol1 - 1);
|
||||
// These are rArray indexes (0-based), not really rows/columns.
|
||||
size_t nX = nCol + colToIndex;
|
||||
size_t nFirstCol = nX;
|
||||
size_t nFirstRow = nRow;
|
||||
|
||||
// *** merged cells *** -------------------------------------------
|
||||
|
||||
if( !rArray.IsMerged( nCol, nRow ) && (rInfo.bMerged || rInfo.bHOverlapped || rInfo.bVOverlapped) )
|
||||
if( !rArray.IsMerged( nX, nRow ) && (rInfo.bMerged || rInfo.bHOverlapped || rInfo.bVOverlapped) )
|
||||
{
|
||||
// *** insert merged range in svx::frame::Array ***
|
||||
|
||||
@@ -918,11 +914,10 @@ void ScDocument::FillInfo(
|
||||
complete merged range, then calculate dimensions and
|
||||
document position of the visible range. */
|
||||
|
||||
// note: document columns are always one less than CellInfoX coords
|
||||
// note: document rows must be looked up in RowInfo structs
|
||||
|
||||
// current column and row in document coordinates
|
||||
SCCOL nCurrDocCol = static_cast< SCCOL >( nCellInfoX - 1 );
|
||||
SCCOL nCurrDocCol = nCol;
|
||||
SCROW nCurrDocRow = static_cast< SCROW >( (nCellInfoY > 0) ? rThisRowInfo.nRowNo : (nRow1 - 1) );
|
||||
|
||||
// find entire merged range in document, returns signed document coordinates
|
||||
@@ -938,15 +933,13 @@ void ScDocument::FillInfo(
|
||||
SCCOL nLastRealDocCol = nLastRealDocColS;
|
||||
SCROW nLastRealDocRow = nLastRealDocRowS;
|
||||
|
||||
// first visible column (nX1-1 is first processed document column)
|
||||
// first visible column (nCol1-1 is first processed document column)
|
||||
SCCOL nFirstDocCol = (nCol1 > 0) ? ::std::max< SCCOL >( nFirstRealDocCol, nCol1 - 1 ) : nFirstRealDocCol;
|
||||
sal_uInt16 nFirstCellInfoX = static_cast< sal_uInt16 >( nFirstDocCol + 1 );
|
||||
nFirstCol = static_cast< size_t >( nFirstCellInfoX - nCol1 );
|
||||
nFirstCol = nFirstDocCol + colToIndex;
|
||||
|
||||
// last visible column (nX2+1 is last processed document column)
|
||||
// last visible column (nCol2+1 is last processed document column)
|
||||
SCCOL nLastDocCol = (nCol2 < MaxCol()) ? ::std::min< SCCOL >( nLastRealDocCol, nCol2 + 1 ) : nLastRealDocCol;
|
||||
sal_uInt16 nLastCellInfoX = static_cast< sal_uInt16 >( nLastDocCol + 1 );
|
||||
size_t nLastCol = static_cast< size_t >( nLastCellInfoX - nCol1 );
|
||||
size_t nLastCol = nLastDocCol + colToIndex;
|
||||
|
||||
// first visible row
|
||||
sal_uInt16 nFirstCellInfoY = nCellInfoY;
|
||||
@@ -975,7 +968,7 @@ void ScDocument::FillInfo(
|
||||
tools::Long nSize = 0;
|
||||
for( SCCOL nDocCol = nFirstRealDocCol; nDocCol < nFirstDocCol; ++nDocCol )
|
||||
nSize += std::max( tools::Long(GetColWidth( nDocCol, nTab ) * fColScale), tools::Long(1) );
|
||||
rArray.SetAddMergedLeftSize( nCol, nRow, nSize );
|
||||
rArray.SetAddMergedLeftSize( nX, nRow, nSize );
|
||||
}
|
||||
// additional space after last column
|
||||
if( nLastCol + 1 == nColCount )
|
||||
@@ -983,7 +976,7 @@ void ScDocument::FillInfo(
|
||||
tools::Long nSize = 0;
|
||||
for( SCCOL nDocCol = nLastDocCol + 1; nDocCol <= nLastRealDocCol; ++nDocCol )
|
||||
nSize += std::max( tools::Long(GetColWidth( nDocCol, nTab ) * fColScale), tools::Long(1) );
|
||||
rArray.SetAddMergedRightSize( nCol, nRow, nSize );
|
||||
rArray.SetAddMergedRightSize( nX, nRow, nSize );
|
||||
}
|
||||
// additional space above first row
|
||||
if( nFirstRow == 0 )
|
||||
@@ -991,7 +984,7 @@ void ScDocument::FillInfo(
|
||||
tools::Long nSize = 0;
|
||||
for( SCROW nDocRow = nFirstRealDocRow; nDocRow < nFirstDocRow; ++nDocRow )
|
||||
nSize += std::max( tools::Long(GetRowHeight( nDocRow, nTab ) * fRowScale), tools::Long(1) );
|
||||
rArray.SetAddMergedTopSize( nCol, nRow, nSize );
|
||||
rArray.SetAddMergedTopSize( nX, nRow, nSize );
|
||||
}
|
||||
// additional space beyond last row
|
||||
if( nLastRow + 1 == nRowCount )
|
||||
@@ -999,7 +992,7 @@ void ScDocument::FillInfo(
|
||||
tools::Long nSize = 0;
|
||||
for( SCROW nDocRow = nLastDocRow + 1; nDocRow <= nLastRealDocRow; ++nDocRow )
|
||||
nSize += std::max( tools::Long(GetRowHeight( nDocRow, nTab ) * fRowScale), tools::Long(1) );
|
||||
rArray.SetAddMergedBottomSize( nCol, nRow, nSize );
|
||||
rArray.SetAddMergedBottomSize( nX, nRow, nSize );
|
||||
}
|
||||
|
||||
// *** use line attributes from real origin cell ***
|
||||
@@ -1055,7 +1048,7 @@ ScTableInfo::ScTableInfo(const SCSIZE capacity)
|
||||
ScTableInfo::~ScTableInfo()
|
||||
{
|
||||
for( SCSIZE nIdx = 0; nIdx < mnArrCapacity; ++nIdx )
|
||||
delete [] mpRowInfo[ nIdx ].pCellInfo;
|
||||
mpRowInfo[ nIdx ].freeCellInfo();
|
||||
}
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
||||
|
||||
@@ -138,7 +138,7 @@ private:
|
||||
const ScPatternAttr* mpOldPattern;
|
||||
const SfxItemSet* mpOldCondSet;
|
||||
const SfxItemSet* mpOldPreviewFontSet;
|
||||
const RowInfo* mpThisRowInfo;
|
||||
RowInfo* mpThisRowInfo;
|
||||
const std::vector<editeng::MisspellRanges>* mpMisspellRanges;
|
||||
|
||||
explicit DrawEditParam(const ScPatternAttr* pPattern, const SfxItemSet* pCondSet, bool bCellIsValue);
|
||||
|
||||
@@ -2044,7 +2044,7 @@ void ScGridWindow::DrawButtons(SCCOL nX1, SCCOL nX2, const ScTableInfo& rTabInfo
|
||||
|
||||
for (nCol=nX1; nCol<=nX2; nCol++)
|
||||
{
|
||||
CellInfo* pInfo = &pThisRowInfo->pCellInfo[nCol+1];
|
||||
CellInfo* pInfo = &pThisRowInfo->cellInfo(nCol);
|
||||
//if several columns merged on a row, there should be only one auto button at the end of the columns.
|
||||
//if several rows merged on a column, the button may be in the middle, so "!pInfo->bVOverlapped" should not be used
|
||||
if ( pInfo->bAutoFilter && !pInfo->bHOverlapped )
|
||||
@@ -2124,7 +2124,7 @@ void ScGridWindow::DrawButtons(SCCOL nX1, SCCOL nX2, const ScTableInfo& rTabInfo
|
||||
nRow = pThisRowInfo->nRowNo;
|
||||
for (nCol=nX1; nCol<=nX2; nCol++)
|
||||
{
|
||||
CellInfo* pInfo = &pThisRowInfo->pCellInfo[nCol+1];
|
||||
CellInfo* pInfo = &pThisRowInfo->cellInfo(nCol);
|
||||
if (pInfo->bHOverlapped || pInfo->bVOverlapped)
|
||||
continue;
|
||||
|
||||
|
||||
@@ -195,7 +195,7 @@ ScOutputData::ScOutputData( OutputDevice* pNewDev, ScOutputType eNewType,
|
||||
|
||||
nScrW = 0;
|
||||
for (SCCOL nX=nVisX1; nX<=nVisX2; nX++)
|
||||
nScrW += pRowInfo[0].pCellInfo[nX+1].nWidth;
|
||||
nScrW += pRowInfo[0].cellInfo(nX).nWidth;
|
||||
|
||||
nMirrorW = nScrW;
|
||||
|
||||
@@ -368,9 +368,7 @@ void ScOutputData::DrawGrid(vcl::RenderContext& rRenderContext, bool bGrid, bool
|
||||
|
||||
for (nX=nX1; nX<=nX2; nX++)
|
||||
{
|
||||
SCCOL nXplus1 = nX+1;
|
||||
SCCOL nXplus2 = nX+2;
|
||||
sal_uInt16 nWidth = pRowInfo[0].pCellInfo[nXplus1].nWidth;
|
||||
sal_uInt16 nWidth = pRowInfo[0].cellInfo(nX).nWidth;
|
||||
if (nWidth)
|
||||
{
|
||||
nPosX += nWidth * nLayoutSign;
|
||||
@@ -378,7 +376,7 @@ void ScOutputData::DrawGrid(vcl::RenderContext& rRenderContext, bool bGrid, bool
|
||||
if ( bPage )
|
||||
{
|
||||
// Search also in hidden part for page breaks
|
||||
SCCOL nCol = nXplus1;
|
||||
SCCOL nCol = nX + 1;
|
||||
while (nCol <= mpDoc->MaxCol())
|
||||
{
|
||||
nBreak = mpDoc->HasColBreak(nCol, nTab);
|
||||
@@ -411,16 +409,16 @@ void ScOutputData::DrawGrid(vcl::RenderContext& rRenderContext, bool bGrid, bool
|
||||
|
||||
bool bDraw = bGrid || nBreakOld != ScBreakType::NONE || bMergeCover; // simple grid only if set that way
|
||||
|
||||
sal_uInt16 nWidthXplus2 = pRowInfo[0].pCellInfo[nXplus2].nWidth;
|
||||
sal_uInt16 nWidthXplus1 = pRowInfo[0].cellInfo(nX+1).nWidth;
|
||||
bSingle = false; //! get into Fillinfo !!!!!
|
||||
if ( nX<mpDoc->MaxCol() && !bSingle )
|
||||
{
|
||||
bSingle = ( nWidthXplus2 == 0 );
|
||||
bSingle = ( nWidthXplus1 == 0 );
|
||||
for (nArrY=1; nArrY+1<nArrCount && !bSingle; nArrY++)
|
||||
{
|
||||
if (pRowInfo[nArrY].pCellInfo[nXplus2].bHOverlapped)
|
||||
if (pRowInfo[nArrY].cellInfo(nX+1).bHOverlapped)
|
||||
bSingle = true;
|
||||
if (pRowInfo[nArrY].pCellInfo[nXplus1].bHideGrid)
|
||||
if (pRowInfo[nArrY].cellInfo(nX).bHideGrid)
|
||||
bSingle = true;
|
||||
}
|
||||
}
|
||||
@@ -429,7 +427,7 @@ void ScOutputData::DrawGrid(vcl::RenderContext& rRenderContext, bool bGrid, bool
|
||||
{
|
||||
if ( nX<mpDoc->MaxCol() && bSingle )
|
||||
{
|
||||
SCCOL nVisX = nXplus1;
|
||||
SCCOL nVisX = nX + 1;
|
||||
while ( nVisX < mpDoc->MaxCol() && !mpDoc->GetColWidth(nVisX,nTab) )
|
||||
++nVisX;
|
||||
|
||||
@@ -439,22 +437,22 @@ void ScOutputData::DrawGrid(vcl::RenderContext& rRenderContext, bool bGrid, bool
|
||||
RowInfo* pThisRowInfo = &pRowInfo[nArrY];
|
||||
const tools::Long nNextY = nPosY + pThisRowInfo->nHeight;
|
||||
|
||||
bool bHOver = pThisRowInfo->pCellInfo[nXplus1].bHideGrid;
|
||||
bool bHOver = pThisRowInfo->cellInfo(nX).bHideGrid;
|
||||
if (!bHOver)
|
||||
{
|
||||
if (nWidthXplus2)
|
||||
bHOver = pThisRowInfo->pCellInfo[nXplus2].bHOverlapped;
|
||||
if (nWidthXplus1)
|
||||
bHOver = pThisRowInfo->cellInfo(nX+1).bHOverlapped;
|
||||
else
|
||||
{
|
||||
if (nVisX <= nX2)
|
||||
bHOver = pThisRowInfo->pCellInfo[nVisX+1].bHOverlapped;
|
||||
bHOver = pThisRowInfo->cellInfo(nVisX).bHOverlapped;
|
||||
else
|
||||
bHOver = mpDoc->GetAttr(
|
||||
nVisX,pThisRowInfo->nRowNo,nTab,ATTR_MERGE_FLAG)
|
||||
->IsHorOverlapped();
|
||||
if (bHOver)
|
||||
bHOver = mpDoc->GetAttr(
|
||||
nXplus1,pThisRowInfo->nRowNo,nTab,ATTR_MERGE_FLAG)
|
||||
nX + 1,pThisRowInfo->nRowNo,nTab,ATTR_MERGE_FLAG)
|
||||
->IsHorOverlapped();
|
||||
}
|
||||
}
|
||||
@@ -532,7 +530,7 @@ void ScOutputData::DrawGrid(vcl::RenderContext& rRenderContext, bool bGrid, bool
|
||||
bSingle = !bNextYisNextRow; // Hidden
|
||||
for (SCCOL i=nX1; i<=nX2 && !bSingle; i++)
|
||||
{
|
||||
if (pRowInfo[nArrYplus1].pCellInfo[i+1].bVOverlapped)
|
||||
if (pRowInfo[nArrYplus1].cellInfo(i).bVOverlapped)
|
||||
bSingle = true;
|
||||
}
|
||||
|
||||
@@ -548,12 +546,12 @@ void ScOutputData::DrawGrid(vcl::RenderContext& rRenderContext, bool bGrid, bool
|
||||
|
||||
for (SCCOL i=nX1; i<=nX2; i++)
|
||||
{
|
||||
const tools::Long nNextX = nPosX + pRowInfo[0].pCellInfo[i+1].nWidth * nLayoutSign;
|
||||
const tools::Long nNextX = nPosX + pRowInfo[0].cellInfo(i).nWidth * nLayoutSign;
|
||||
if (nNextX != nPosX) // visible
|
||||
{
|
||||
bool bVOver;
|
||||
if ( bNextYisNextRow )
|
||||
bVOver = pRowInfo[nArrYplus1].pCellInfo[i+1].bVOverlapped;
|
||||
bVOver = pRowInfo[nArrYplus1].cellInfo(i).bVOverlapped;
|
||||
else
|
||||
{
|
||||
bVOver = mpDoc->GetAttr(
|
||||
@@ -608,7 +606,7 @@ void ScOutputData::SetPagebreakMode( ScPageBreakData* pPageData )
|
||||
pThisRowInfo->nRowNo <= nEndY )
|
||||
{
|
||||
for (SCCOL nX=nStartX; nX<=nEndX; nX++)
|
||||
pThisRowInfo->pCellInfo[nX+1].bPrinted = true;
|
||||
pThisRowInfo->cellInfo(nX).bPrinted = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -633,7 +631,7 @@ void ScOutputData::SetCellRotations()
|
||||
|
||||
for (SCCOL nX=0; nX<=nRotMax; nX++)
|
||||
{
|
||||
CellInfo* pInfo = &pThisRowInfo->pCellInfo[nX+1];
|
||||
CellInfo* pInfo = &pThisRowInfo->cellInfo(nX);
|
||||
const ScPatternAttr* pPattern = pInfo->pPatternAttr;
|
||||
const SfxItemSet* pCondSet = pInfo->pConditionSet;
|
||||
|
||||
@@ -757,8 +755,8 @@ static bool lcl_EqualBack( const RowInfo& rFirst, const RowInfo& rOther,
|
||||
{
|
||||
for ( nX=nX1; nX<=nX2; nX++ )
|
||||
{
|
||||
const ScPatternAttr* pPat1 = rFirst.pCellInfo[nX+1].pPatternAttr;
|
||||
const ScPatternAttr* pPat2 = rOther.pCellInfo[nX+1].pPatternAttr;
|
||||
const ScPatternAttr* pPat1 = rFirst.cellInfo(nX).pPatternAttr;
|
||||
const ScPatternAttr* pPat2 = rOther.cellInfo(nX).pPatternAttr;
|
||||
if ( !pPat1 || !pPat2 ||
|
||||
&pPat1->GetItem(ATTR_PROTECTION) != &pPat2->GetItem(ATTR_PROTECTION) )
|
||||
return false;
|
||||
@@ -767,32 +765,32 @@ static bool lcl_EqualBack( const RowInfo& rFirst, const RowInfo& rOther,
|
||||
else
|
||||
{
|
||||
for ( nX=nX1; nX<=nX2; nX++ )
|
||||
if ( rFirst.pCellInfo[nX+1].pBackground != rOther.pCellInfo[nX+1].pBackground )
|
||||
if ( rFirst.cellInfo(nX).pBackground != rOther.cellInfo(nX).pBackground )
|
||||
return false;
|
||||
}
|
||||
|
||||
if ( rFirst.nRotMaxCol != SC_ROTMAX_NONE || rOther.nRotMaxCol != SC_ROTMAX_NONE )
|
||||
for ( nX=nX1; nX<=nX2; nX++ )
|
||||
if ( rFirst.pCellInfo[nX+1].nRotateDir != rOther.pCellInfo[nX+1].nRotateDir )
|
||||
if ( rFirst.cellInfo(nX).nRotateDir != rOther.cellInfo(nX).nRotateDir )
|
||||
return false;
|
||||
|
||||
if ( bPagebreakMode )
|
||||
for ( nX=nX1; nX<=nX2; nX++ )
|
||||
if ( rFirst.pCellInfo[nX+1].bPrinted != rOther.pCellInfo[nX+1].bPrinted )
|
||||
if ( rFirst.cellInfo(nX).bPrinted != rOther.cellInfo(nX).bPrinted )
|
||||
return false;
|
||||
|
||||
for ( nX=nX1; nX<=nX2; nX++ )
|
||||
{
|
||||
std::optional<Color> const & pCol1 = rFirst.pCellInfo[nX+1].mxColorScale;
|
||||
std::optional<Color> const & pCol2 = rOther.pCellInfo[nX+1].mxColorScale;
|
||||
std::optional<Color> const & pCol1 = rFirst.cellInfo(nX).mxColorScale;
|
||||
std::optional<Color> const & pCol2 = rOther.cellInfo(nX).mxColorScale;
|
||||
if( (pCol1 && !pCol2) || (!pCol1 && pCol2) )
|
||||
return false;
|
||||
|
||||
if (pCol1 && (*pCol1 != *pCol2))
|
||||
return false;
|
||||
|
||||
const ScDataBarInfo* pInfo1 = rFirst.pCellInfo[nX+1].pDataBar.get();
|
||||
const ScDataBarInfo* pInfo2 = rOther.pCellInfo[nX+1].pDataBar.get();
|
||||
const ScDataBarInfo* pInfo1 = rFirst.cellInfo(nX).pDataBar.get();
|
||||
const ScDataBarInfo* pInfo2 = rOther.cellInfo(nX).pDataBar.get();
|
||||
|
||||
if( (pInfo1 && !pInfo2) || (!pInfo1 && pInfo2) )
|
||||
return false;
|
||||
@@ -801,8 +799,8 @@ static bool lcl_EqualBack( const RowInfo& rFirst, const RowInfo& rOther,
|
||||
return false;
|
||||
|
||||
// each cell with an icon set should be painted the same way
|
||||
const ScIconSetInfo* pIconSet1 = rFirst.pCellInfo[nX+1].pIconSet.get();
|
||||
const ScIconSetInfo* pIconSet2 = rOther.pCellInfo[nX+1].pIconSet.get();
|
||||
const ScIconSetInfo* pIconSet1 = rFirst.cellInfo(nX).pIconSet.get();
|
||||
const ScIconSetInfo* pIconSet2 = rOther.cellInfo(nX).pIconSet.get();
|
||||
|
||||
if(pIconSet1 || pIconSet2)
|
||||
return false;
|
||||
@@ -1097,7 +1095,7 @@ void ScOutputData::DrawBackground(vcl::RenderContext& rRenderContext)
|
||||
|
||||
for (SCCOL nX=nX1; nX + nMergedCols <= nX2 + 1; nX += nOldMerged)
|
||||
{
|
||||
CellInfo* pInfo = &pThisRowInfo->pCellInfo[nX+nMergedCols];
|
||||
CellInfo* pInfo = &pThisRowInfo->cellInfo(nX-1+nMergedCols);
|
||||
|
||||
nOldMerged = nMergedCols;
|
||||
|
||||
@@ -1158,7 +1156,7 @@ void ScOutputData::DrawBackground(vcl::RenderContext& rRenderContext)
|
||||
SCCOL nCol = nX+nOldMerged+nMerged;
|
||||
if (nCol > nX2+2)
|
||||
break;
|
||||
nPosX += pRowInfo[0].pCellInfo[nCol].nWidth * nLayoutSign;
|
||||
nPosX += pRowInfo[0].cellInfo(nCol-1).nWidth * nLayoutSign;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1210,22 +1208,22 @@ void ScOutputData::DrawExtraShadow(bool bLeft, bool bTop, bool bRight, bool bBot
|
||||
|
||||
if ( pThisRowInfo->bChanged && !bSkipY )
|
||||
{
|
||||
tools::Long nPosX = nInitPosX - pRowInfo[0].pCellInfo[nX1].nWidth * nLayoutSign;
|
||||
for (SCCOL nArrX=nX1; nArrX<=nX2+2; nArrX++)
|
||||
tools::Long nPosX = nInitPosX - pRowInfo[0].cellInfo(nX1-1).nWidth * nLayoutSign;
|
||||
for (SCCOL nCol=nX1-1; nCol<=nX2+1; nCol++)
|
||||
{
|
||||
bool bCornerX = ( nArrX==nX1 || nArrX==nX2+2 );
|
||||
bool bSkipX = ( nArrX==nX1 && !bLeft ) || ( nArrX==nX2+2 && !bRight );
|
||||
bool bCornerX = ( nCol==nX1-1 || nCol==nX2+1 );
|
||||
bool bSkipX = ( nCol==nX1-1 && !bLeft ) || ( nCol==nX2+1 && !bRight );
|
||||
|
||||
for (sal_uInt16 nPass=0; nPass<2; nPass++) // horizontal / vertical
|
||||
{
|
||||
const SvxShadowItem* pAttr = nPass ?
|
||||
pThisRowInfo->pCellInfo[nArrX].pVShadowOrigin :
|
||||
pThisRowInfo->pCellInfo[nArrX].pHShadowOrigin;
|
||||
pThisRowInfo->cellInfo(nCol).pVShadowOrigin :
|
||||
pThisRowInfo->cellInfo(nCol).pHShadowOrigin;
|
||||
if ( pAttr && !bSkipX )
|
||||
{
|
||||
ScShadowPart ePart = nPass ?
|
||||
pThisRowInfo->pCellInfo[nArrX].eVShadowPart :
|
||||
pThisRowInfo->pCellInfo[nArrX].eHShadowPart;
|
||||
pThisRowInfo->cellInfo(nCol).eVShadowPart :
|
||||
pThisRowInfo->cellInfo(nCol).eHShadowPart;
|
||||
|
||||
bool bDo = true;
|
||||
if ( (nPass==0 && bCornerX) || (nPass==1 && bCornerY) )
|
||||
@@ -1234,15 +1232,15 @@ void ScOutputData::DrawExtraShadow(bool bLeft, bool bTop, bool bRight, bool bBot
|
||||
|
||||
if (bDo)
|
||||
{
|
||||
tools::Long nThisWidth = pRowInfo[0].pCellInfo[nArrX].nWidth;
|
||||
tools::Long nThisWidth = pRowInfo[0].cellInfo(nCol).nWidth;
|
||||
tools::Long nMaxWidth = nThisWidth;
|
||||
if (!nMaxWidth)
|
||||
{
|
||||
//! direction must depend on shadow location
|
||||
SCCOL nWx = nArrX; // nX+1
|
||||
while (nWx<nX2 && !pRowInfo[0].pCellInfo[nWx+1].nWidth)
|
||||
SCCOL nWx = nCol+1;
|
||||
while (nWx<nX2 && !pRowInfo[0].cellInfo(nWx).nWidth)
|
||||
++nWx;
|
||||
nMaxWidth = pRowInfo[0].pCellInfo[nWx+1].nWidth;
|
||||
nMaxWidth = pRowInfo[0].cellInfo(nWx).nWidth;
|
||||
}
|
||||
|
||||
// rectangle is in logical orientation
|
||||
@@ -1314,7 +1312,7 @@ void ScOutputData::DrawExtraShadow(bool bLeft, bool bTop, bool bRight, bool bBot
|
||||
}
|
||||
}
|
||||
|
||||
nPosX += pRowInfo[0].pCellInfo[nArrX].nWidth * nLayoutSign;
|
||||
nPosX += pRowInfo[0].cellInfo(nCol).nWidth * nLayoutSign;
|
||||
}
|
||||
}
|
||||
nPosY += nRowHeight;
|
||||
@@ -1376,11 +1374,6 @@ static tools::Long lclGetSnappedY( const OutputDevice& rDev, tools::Long nPosY,
|
||||
return (bSnapPixel && nPosY) ? rDev.PixelToLogic( rDev.LogicToPixel( Size( 0, nPosY ) ) ).Height() : nPosY;
|
||||
}
|
||||
|
||||
static size_t lclGetArrayColFromCellInfoX( sal_uInt16 nCellInfoX, sal_uInt16 nCellInfoFirstX, sal_uInt16 nCellInfoLastX, bool bRTL )
|
||||
{
|
||||
return static_cast< size_t >( bRTL ? (nCellInfoLastX + 2 - nCellInfoX) : (nCellInfoX - nCellInfoFirstX) );
|
||||
}
|
||||
|
||||
void ScOutputData::DrawFrame(vcl::RenderContext& rRenderContext)
|
||||
{
|
||||
DrawModeFlags nOldDrawMode = rRenderContext.GetDrawMode();
|
||||
@@ -1453,19 +1446,19 @@ void ScOutputData::DrawFrame(vcl::RenderContext& rRenderContext)
|
||||
|
||||
// column widths
|
||||
|
||||
// column nX1 is not visible (dummy for borders from left) - subtract its width from initial position
|
||||
// column nX1-1 is not visible (dummy for borders from left) - subtract its width from initial position
|
||||
// subtract 1 unit more, because position 0 is first *in* cell, grid line is one unit above
|
||||
tools::Long nOldPosX = nInitPosX - nLayoutSign * (1 + pRowInfo[ 0 ].pCellInfo[ nX1 ].nWidth);
|
||||
tools::Long nOldPosX = nInitPosX - nLayoutSign * (1 + pRowInfo[ 0 ].cellInfo( nX1 - 1 ).nWidth);
|
||||
tools::Long nOldSnapX = lclGetSnappedX( rRenderContext, nOldPosX, bSnapPixel );
|
||||
// set X offset for left-to-right sheets; for right-to-left sheets this is done after for() loop
|
||||
if( !bLayoutRTL )
|
||||
rArray.SetXOffset( nOldSnapX );
|
||||
for( sal_uInt16 nInfoIdx = nX1; nInfoIdx <= nX2 + 2; ++nInfoIdx )
|
||||
for( SCCOL nCol = nX1 - 1; nCol <= nX2 + 1; ++nCol )
|
||||
{
|
||||
size_t nCol = lclGetArrayColFromCellInfoX( nInfoIdx, nX1, nX2, bLayoutRTL );
|
||||
tools::Long nNewPosX = nOldPosX + pRowInfo[ 0 ].pCellInfo[ nInfoIdx ].nWidth * nLayoutSign;
|
||||
size_t nArrCol = bLayoutRTL ? nX2 + 1 - nCol : nCol - (nX1 - 1);
|
||||
tools::Long nNewPosX = nOldPosX + pRowInfo[ 0 ].cellInfo( nCol ).nWidth * nLayoutSign;
|
||||
tools::Long nNewSnapX = lclGetSnappedX( rRenderContext, nNewPosX, bSnapPixel );
|
||||
rArray.SetColWidth( nCol, std::abs( nNewSnapX - nOldSnapX ) );
|
||||
rArray.SetColWidth( nArrCol, std::abs( nNewSnapX - nOldSnapX ) );
|
||||
nOldPosX = nNewPosX;
|
||||
nOldSnapX = nNewSnapX;
|
||||
}
|
||||
@@ -1561,10 +1554,8 @@ void ScOutputData::DrawRotatedFrame(vcl::RenderContext& rRenderContext)
|
||||
{
|
||||
if (nX==nX1) nPosX = nInitPosX; // calculated individually for preceding positions
|
||||
|
||||
sal_uInt16 nArrX = nX + 1;
|
||||
|
||||
CellInfo* pInfo = &rThisRowInfo.pCellInfo[nArrX];
|
||||
tools::Long nColWidth = pRowInfo[0].pCellInfo[nArrX].nWidth;
|
||||
CellInfo* pInfo = &rThisRowInfo.cellInfo(nX);
|
||||
tools::Long nColWidth = pRowInfo[0].cellInfo(nX).nWidth;
|
||||
if ( pInfo->nRotateDir > ScRotateDir::Standard &&
|
||||
!pInfo->bHOverlapped && !pInfo->bVOverlapped )
|
||||
{
|
||||
@@ -1593,7 +1584,7 @@ void ScOutputData::DrawRotatedFrame(vcl::RenderContext& rRenderContext)
|
||||
while (nCol > nX)
|
||||
{
|
||||
--nCol;
|
||||
nPosX -= nLayoutSign * static_cast<tools::Long>(pRowInfo[0].pCellInfo[nCol + 1].nWidth);
|
||||
nPosX -= nLayoutSign * static_cast<tools::Long>(pRowInfo[0].cellInfo(nCol).nWidth);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1833,7 +1824,7 @@ void ScOutputData::FindChanged()
|
||||
RowInfo* pThisRowInfo = &pRowInfo[nArrY];
|
||||
for (nX=nX1; nX<=nX2; nX++)
|
||||
{
|
||||
const ScRefCellValue& rCell = pThisRowInfo->pCellInfo[nX+1].maCell;
|
||||
const ScRefCellValue& rCell = pThisRowInfo->cellInfo(nX).maCell;
|
||||
|
||||
if (rCell.meType != CELLTYPE_FORMULA)
|
||||
continue;
|
||||
@@ -1882,7 +1873,7 @@ void ScOutputData::FindChanged()
|
||||
RowInfo* pThisRowInfo = &pRowInfo[nArrY];
|
||||
for (nX=nX1; nX<=nX2; nX++)
|
||||
{
|
||||
const ScRefCellValue& rCell = pThisRowInfo->pCellInfo[nX+1].maCell;
|
||||
const ScRefCellValue& rCell = pThisRowInfo->cellInfo(nX).maCell;
|
||||
|
||||
if (rCell.meType != CELLTYPE_FORMULA)
|
||||
continue;
|
||||
@@ -1897,11 +1888,11 @@ void ScOutputData::FindChanged()
|
||||
continue;
|
||||
|
||||
pThisRowInfo->bChanged = true;
|
||||
if ( pThisRowInfo->pCellInfo[nX+1].bMerged )
|
||||
if ( pThisRowInfo->cellInfo(nX).bMerged )
|
||||
{
|
||||
SCSIZE nOverY = nArrY + 1;
|
||||
while ( nOverY<nArrCount &&
|
||||
pRowInfo[nOverY].pCellInfo[nX+1].bVOverlapped )
|
||||
pRowInfo[nOverY].cellInfo(nX).bVOverlapped )
|
||||
{
|
||||
pRowInfo[nOverY].bChanged = true;
|
||||
++nOverY;
|
||||
@@ -1988,10 +1979,10 @@ ReferenceMark ScOutputData::FillReferenceMark( SCCOL nRefStartX, SCROW nRefStart
|
||||
}
|
||||
if ( nX==nRefEndX )
|
||||
{
|
||||
nMaxX = nPosX + ( pRowInfo[0].pCellInfo[nX+1].nWidth - 2 ) * nLayoutSign;
|
||||
nMaxX = nPosX + ( pRowInfo[0].cellInfo(nX).nWidth - 2 ) * nLayoutSign;
|
||||
bRight = true;
|
||||
}
|
||||
nPosX += pRowInfo[0].pCellInfo[nX+1].nWidth * nLayoutSign;
|
||||
nPosX += pRowInfo[0].cellInfo(nX).nWidth * nLayoutSign;
|
||||
}
|
||||
|
||||
if (bTop && bBottom && bLeft && bRight)
|
||||
@@ -2080,10 +2071,10 @@ void ScOutputData::DrawRefMark( SCCOL nRefStartX, SCROW nRefStartY,
|
||||
}
|
||||
if ( nX==nRefEndX )
|
||||
{
|
||||
nMaxX = nPosX + ( pRowInfo[0].pCellInfo[nX+1].nWidth - 2 ) * nLayoutSign;
|
||||
nMaxX = nPosX + ( pRowInfo[0].cellInfo(nX).nWidth - 2 ) * nLayoutSign;
|
||||
bRight = true;
|
||||
}
|
||||
nPosX += pRowInfo[0].pCellInfo[nX+1].nWidth * nLayoutSign;
|
||||
nPosX += pRowInfo[0].cellInfo(nX).nWidth * nLayoutSign;
|
||||
}
|
||||
|
||||
if ( nMaxX * nLayoutSign < nMinX * nLayoutSign || nMaxY < nMinY )
|
||||
@@ -2207,10 +2198,10 @@ void ScOutputData::DrawOneChange( SCCOL nRefStartX, SCROW nRefStartY,
|
||||
}
|
||||
if ( nX==nRefEndX )
|
||||
{
|
||||
nMaxX = nPosX + ( pRowInfo[0].pCellInfo[nX+1].nWidth - 1 ) * nLayoutSign;
|
||||
nMaxX = nPosX + ( pRowInfo[0].cellInfo(nX).nWidth - 1 ) * nLayoutSign;
|
||||
bRight = true;
|
||||
}
|
||||
nPosX += pRowInfo[0].pCellInfo[nX+1].nWidth * nLayoutSign;
|
||||
nPosX += pRowInfo[0].cellInfo(nX).nWidth * nLayoutSign;
|
||||
}
|
||||
|
||||
if ( nMaxX * nLayoutSign < nMinX * nLayoutSign || nMaxY < nMinY )
|
||||
@@ -2338,7 +2329,7 @@ void ScOutputData::DrawNoteMarks(vcl::RenderContext& rRenderContext)
|
||||
tools::Long nPosX = nInitPosX;
|
||||
for (SCCOL nX=nX1; nX<=nX2; nX++)
|
||||
{
|
||||
CellInfo* pInfo = &pThisRowInfo->pCellInfo[nX+1];
|
||||
CellInfo* pInfo = &pThisRowInfo->cellInfo(nX);
|
||||
bool bIsMerged = false;
|
||||
|
||||
if ( nX==nX1 && pInfo->bHOverlapped && !pInfo->bVOverlapped )
|
||||
@@ -2367,14 +2358,14 @@ void ScOutputData::DrawNoteMarks(vcl::RenderContext& rRenderContext)
|
||||
bFirst = false;
|
||||
}
|
||||
|
||||
tools::Long nMarkX = nPosX + ( pRowInfo[0].pCellInfo[nX+1].nWidth - 4 ) * nLayoutSign;
|
||||
tools::Long nMarkX = nPosX + ( pRowInfo[0].cellInfo(nX).nWidth - 4 ) * nLayoutSign;
|
||||
if ( bIsMerged || pInfo->bMerged )
|
||||
{
|
||||
// if merged, add widths of all cells
|
||||
SCCOL nNextX = nX + 1;
|
||||
while ( nNextX <= nX2 + 1 && pThisRowInfo->pCellInfo[nNextX+1].bHOverlapped )
|
||||
while ( nNextX <= nX2 + 1 && pThisRowInfo->cellInfo(nNextX).bHOverlapped )
|
||||
{
|
||||
nMarkX += pRowInfo[0].pCellInfo[nNextX+1].nWidth * nLayoutSign;
|
||||
nMarkX += pRowInfo[0].cellInfo(nNextX).nWidth * nLayoutSign;
|
||||
++nNextX;
|
||||
}
|
||||
}
|
||||
@@ -2382,7 +2373,7 @@ void ScOutputData::DrawNoteMarks(vcl::RenderContext& rRenderContext)
|
||||
rRenderContext.DrawRect( tools::Rectangle( nMarkX-5*nLayoutSign,nPosY,nMarkX+1*nLayoutSign,nPosY+6 ) );
|
||||
}
|
||||
|
||||
nPosX += pRowInfo[0].pCellInfo[nX+1].nWidth * nLayoutSign;
|
||||
nPosX += pRowInfo[0].cellInfo(nX).nWidth * nLayoutSign;
|
||||
}
|
||||
}
|
||||
nPosY += pThisRowInfo->nHeight;
|
||||
@@ -2413,7 +2404,7 @@ void ScOutputData::AddPDFNotes()
|
||||
tools::Long nPosX = nInitPosX;
|
||||
for (SCCOL nX=nX1; nX<=nX2; nX++)
|
||||
{
|
||||
CellInfo* pInfo = &pThisRowInfo->pCellInfo[nX+1];
|
||||
CellInfo* pInfo = &pThisRowInfo->cellInfo(nX);
|
||||
bool bIsMerged = false;
|
||||
SCROW nY = pRowInfo[nArrY].nRowNo;
|
||||
SCCOL nMergeX = nX;
|
||||
@@ -2433,14 +2424,14 @@ void ScOutputData::AddPDFNotes()
|
||||
tools::Long nNoteWidth = static_cast<tools::Long>( SC_CLIPMARK_SIZE * mnPPTX );
|
||||
tools::Long nNoteHeight = static_cast<tools::Long>( SC_CLIPMARK_SIZE * mnPPTY );
|
||||
|
||||
tools::Long nMarkX = nPosX + ( pRowInfo[0].pCellInfo[nX+1].nWidth - nNoteWidth ) * nLayoutSign;
|
||||
tools::Long nMarkX = nPosX + ( pRowInfo[0].cellInfo(nX).nWidth - nNoteWidth ) * nLayoutSign;
|
||||
if ( bIsMerged || pInfo->bMerged )
|
||||
{
|
||||
// if merged, add widths of all cells
|
||||
SCCOL nNextX = nX + 1;
|
||||
while ( nNextX <= nX2 + 1 && pThisRowInfo->pCellInfo[nNextX+1].bHOverlapped )
|
||||
while ( nNextX <= nX2 + 1 && pThisRowInfo->cellInfo(nNextX).bHOverlapped )
|
||||
{
|
||||
nMarkX += pRowInfo[0].pCellInfo[nNextX+1].nWidth * nLayoutSign;
|
||||
nMarkX += pRowInfo[0].cellInfo(nNextX).nWidth * nLayoutSign;
|
||||
++nNextX;
|
||||
}
|
||||
}
|
||||
@@ -2464,7 +2455,7 @@ void ScOutputData::AddPDFNotes()
|
||||
}
|
||||
}
|
||||
|
||||
nPosX += pRowInfo[0].pCellInfo[nX+1].nWidth * nLayoutSign;
|
||||
nPosX += pRowInfo[0].cellInfo(nX).nWidth * nLayoutSign;
|
||||
}
|
||||
}
|
||||
nPosY += pThisRowInfo->nHeight;
|
||||
@@ -2504,7 +2495,7 @@ void ScOutputData::DrawClipMarks()
|
||||
tools::Long nPosX = nInitPosX;
|
||||
for (SCCOL nX=nX1; nX<=nX2; nX++)
|
||||
{
|
||||
CellInfo* pInfo = &pThisRowInfo->pCellInfo[nX+1];
|
||||
CellInfo* pInfo = &pThisRowInfo->cellInfo(nX);
|
||||
if (pInfo->nClipMark != ScClipMark::NONE)
|
||||
{
|
||||
if (pInfo->bHOverlapped || pInfo->bVOverlapped)
|
||||
@@ -2546,7 +2537,7 @@ void ScOutputData::DrawClipMarks()
|
||||
}
|
||||
else
|
||||
{
|
||||
tools::Long nOutWidth = pRowInfo[0].pCellInfo[nX+1].nWidth;
|
||||
tools::Long nOutWidth = pRowInfo[0].cellInfo(nX).nWidth;
|
||||
tools::Long nOutHeight = pThisRowInfo->nHeight;
|
||||
|
||||
if ( pInfo->bMerged && pInfo->pPatternAttr )
|
||||
@@ -2617,7 +2608,7 @@ void ScOutputData::DrawClipMarks()
|
||||
}
|
||||
}
|
||||
}
|
||||
nPosX += pRowInfo[0].pCellInfo[nX+1].nWidth * nLayoutSign;
|
||||
nPosX += pRowInfo[0].cellInfo(nX).nWidth * nLayoutSign;
|
||||
}
|
||||
}
|
||||
nPosY += pThisRowInfo->nHeight;
|
||||
|
||||
@@ -991,7 +991,7 @@ bool ScOutputData::GetMergeOrigin( SCCOL nX, SCROW nY, SCSIZE nArrY,
|
||||
if (!mpDoc->ColHidden(nX, nTab) && nX >= nX1 && nX <= nX2
|
||||
&& !mpDoc->RowHidden(nY, nTab) && nY >= nY1 && nY <= nY2)
|
||||
{
|
||||
CellInfo* pInfo = &pRowInfo[nArrY].pCellInfo[nX+1];
|
||||
CellInfo* pInfo = &pRowInfo[nArrY].cellInfo(nX);
|
||||
bHOver = pInfo->bHOverlapped;
|
||||
bVOver = pInfo->bVOverlapped;
|
||||
}
|
||||
@@ -1021,8 +1021,8 @@ bool ScOutputData::GetMergeOrigin( SCCOL nX, SCROW nY, SCSIZE nArrY,
|
||||
|
||||
if (rOverX >= nX1 && !bHidden)
|
||||
{
|
||||
bHOver = pRowInfo[nArrY].pCellInfo[rOverX+1].bHOverlapped;
|
||||
bVOver = pRowInfo[nArrY].pCellInfo[rOverX+1].bVOverlapped;
|
||||
bHOver = pRowInfo[nArrY].cellInfo(rOverX).bHOverlapped;
|
||||
bVOver = pRowInfo[nArrY].cellInfo(rOverX).bVOverlapped;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1047,7 +1047,7 @@ bool ScOutputData::GetMergeOrigin( SCCOL nX, SCROW nY, SCSIZE nArrY,
|
||||
!mpDoc->RowHidden(rOverY, nTab) &&
|
||||
pRowInfo[nArrY].nRowNo == rOverY)
|
||||
{
|
||||
bVOver = pRowInfo[nArrY].pCellInfo[rOverX+1].bVOverlapped;
|
||||
bVOver = pRowInfo[nArrY].cellInfo(rOverX).bVOverlapped;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1159,7 +1159,7 @@ bool ScOutputData::IsEmptyCellText( const RowInfo* pThisRowInfo, SCCOL nX, SCROW
|
||||
|
||||
bool bEmpty;
|
||||
if ( pThisRowInfo && nX <= nX2 )
|
||||
bEmpty = pThisRowInfo->pCellInfo[nX+1].bEmptyCellText;
|
||||
bEmpty = pThisRowInfo->cellInfo(nX).bEmptyCellText;
|
||||
else
|
||||
{
|
||||
ScRefCellValue aCell(*mpDoc, ScAddress(nX, nY, nTab));
|
||||
@@ -1245,7 +1245,7 @@ void ScOutputData::GetOutputArea( SCCOL nX, SCSIZE nArrY, tools::Long nPosX, too
|
||||
{
|
||||
//! extra member function for width?
|
||||
tools::Long nColWidth = ( nCompCol <= nX2 ) ?
|
||||
pRowInfo[0].pCellInfo[nCompCol+1].nWidth :
|
||||
pRowInfo[0].cellInfo(nCompCol).nWidth :
|
||||
static_cast<tools::Long>( mpDoc->GetColWidth( nCompCol, nTab ) * mnPPTX );
|
||||
nCellPosX += nColWidth * nLayoutSign;
|
||||
++nCompCol;
|
||||
@@ -1254,7 +1254,7 @@ void ScOutputData::GetOutputArea( SCCOL nX, SCSIZE nArrY, tools::Long nPosX, too
|
||||
{
|
||||
--nCompCol;
|
||||
tools::Long nColWidth = ( nCompCol <= nX2 ) ?
|
||||
pRowInfo[0].pCellInfo[nCompCol+1].nWidth :
|
||||
pRowInfo[0].cellInfo(nCompCol).nWidth :
|
||||
static_cast<tools::Long>( mpDoc->GetColWidth( nCompCol, nTab ) * mnPPTX );
|
||||
nCellPosX -= nColWidth * nLayoutSign;
|
||||
}
|
||||
@@ -1293,7 +1293,7 @@ void ScOutputData::GetOutputArea( SCCOL nX, SCSIZE nArrY, tools::Long nPosX, too
|
||||
for ( tools::Long i=0; i<nMergeCols; i++ )
|
||||
{
|
||||
tools::Long nColWidth = ( nCellX+i <= nX2 ) ?
|
||||
pRowInfo[0].pCellInfo[nCellX+i+1].nWidth :
|
||||
pRowInfo[0].cellInfo(nCellX+i).nWidth :
|
||||
static_cast<tools::Long>( mpDoc->GetColWidth( sal::static_int_cast<SCCOL>(nCellX+i), nTab ) * mnPPTX );
|
||||
nMergeSizeX += nColWidth;
|
||||
}
|
||||
@@ -1369,13 +1369,13 @@ void ScOutputData::GetOutputArea( SCCOL nX, SCSIZE nArrY, tools::Long nPosX, too
|
||||
rParam.maClipRect.AdjustRight(nAdd * nLayoutSign );
|
||||
|
||||
if ( rThisRowInfo.nRowNo == nCellY && nRightX >= nX1 && nRightX <= nX2 )
|
||||
rThisRowInfo.pCellInfo[nRightX].bHideGrid = true;
|
||||
rThisRowInfo.cellInfo(nRightX-1).bHideGrid = true;
|
||||
}
|
||||
|
||||
while ( nLeftMissing > 0 && nLeftX > 0 && ( bOverwrite || IsAvailable( nLeftX-1, nCellY ) ) )
|
||||
{
|
||||
if ( rThisRowInfo.nRowNo == nCellY && nLeftX >= nX1 && nLeftX <= nX2 )
|
||||
rThisRowInfo.pCellInfo[nLeftX].bHideGrid = true;
|
||||
rThisRowInfo.cellInfo(nLeftX-1).bHideGrid = true;
|
||||
|
||||
--nLeftX;
|
||||
tools::Long nAdd = static_cast<tools::Long>( mpDoc->GetColWidth( nLeftX, nTab ) * mnPPTX );
|
||||
@@ -1388,14 +1388,14 @@ void ScOutputData::GetOutputArea( SCCOL nX, SCSIZE nArrY, tools::Long nPosX, too
|
||||
// even if rThisRowInfo isn't for nCellY (merged cells).
|
||||
if ( nRightMissing > 0 && bMarkClipped && nRightX >= nX1 && nRightX <= nX2 && !bBreak && !bCellIsValue )
|
||||
{
|
||||
rThisRowInfo.pCellInfo[nRightX+1].nClipMark |= ScClipMark::Right;
|
||||
rThisRowInfo.cellInfo(nRightX).nClipMark |= ScClipMark::Right;
|
||||
bAnyClipped = true;
|
||||
tools::Long nMarkPixel = static_cast<tools::Long>( SC_CLIPMARK_SIZE * mnPPTX );
|
||||
rParam.maClipRect.AdjustRight( -(nMarkPixel * nLayoutSign) );
|
||||
}
|
||||
if ( nLeftMissing > 0 && bMarkClipped && nLeftX >= nX1 && nLeftX <= nX2 && !bBreak && !bCellIsValue )
|
||||
{
|
||||
rThisRowInfo.pCellInfo[nLeftX+1].nClipMark |= ScClipMark::Left;
|
||||
rThisRowInfo.cellInfo(nLeftX).nClipMark |= ScClipMark::Left;
|
||||
bAnyClipped = true;
|
||||
tools::Long nMarkPixel = static_cast<tools::Long>( SC_CLIPMARK_SIZE * mnPPTX );
|
||||
rParam.maClipRect.AdjustLeft(nMarkPixel * nLayoutSign );
|
||||
@@ -1566,11 +1566,11 @@ tools::Rectangle ScOutputData::LayoutStrings(bool bPixelToLogic, bool bPaint, co
|
||||
{
|
||||
tools::Long nPosX = nInitPosX;
|
||||
if ( nLoopStartX < nX1 )
|
||||
nPosX -= pRowInfo[0].pCellInfo[nLoopStartX+1].nWidth * nLayoutSign;
|
||||
nPosX -= pRowInfo[0].cellInfo(nLoopStartX).nWidth * nLayoutSign;
|
||||
for (SCCOL nX=nLoopStartX; nX<=nX2; nX++)
|
||||
{
|
||||
bool bMergeEmpty = false;
|
||||
CellInfo* pInfo = &pThisRowInfo->pCellInfo[nX+1];
|
||||
const CellInfo* pInfo = &pThisRowInfo->cellInfo(nX);
|
||||
bool bEmpty = nX < nX1 || pInfo->bEmptyCellText;
|
||||
|
||||
SCCOL nCellX = nX; // position where the cell really starts
|
||||
@@ -1659,7 +1659,7 @@ tools::Rectangle ScOutputData::LayoutStrings(bool bPixelToLogic, bool bPaint, co
|
||||
if (bDoCell)
|
||||
{
|
||||
if ( nCellY == nY && nCellX == nX && nCellX >= nX1 && nCellX <= nX2 )
|
||||
aCell = pThisRowInfo->pCellInfo[nCellX+1].maCell;
|
||||
aCell = pThisRowInfo->cellInfo(nCellX).maCell;
|
||||
else
|
||||
GetVisibleCell( nCellX, nCellY, nTab, aCell ); // get from document
|
||||
if (aCell.isEmpty())
|
||||
@@ -1679,7 +1679,7 @@ tools::Rectangle ScOutputData::LayoutStrings(bool bPixelToLogic, bool bPaint, co
|
||||
{
|
||||
if ( nCellY == nY && nCellX >= nX1 && nCellX <= nX2 )
|
||||
{
|
||||
CellInfo& rCellInfo = pThisRowInfo->pCellInfo[nCellX+1];
|
||||
CellInfo& rCellInfo = pThisRowInfo->cellInfo(nCellX);
|
||||
pPattern = rCellInfo.pPatternAttr;
|
||||
pCondSet = rCellInfo.pConditionSet;
|
||||
|
||||
@@ -1897,7 +1897,7 @@ tools::Rectangle ScOutputData::LayoutStrings(bool bPixelToLogic, bool bPaint, co
|
||||
// right are handled by the flag for nX2
|
||||
SCCOL nMarkX = ( nCellX <= nX2 ) ? nCellX : nX2;
|
||||
RowInfo* pMarkRowInfo = ( nCellY == nY ) ? pThisRowInfo : &pRowInfo[0];
|
||||
pMarkRowInfo->pCellInfo[nMarkX+1].bEditEngine = true;
|
||||
pMarkRowInfo->cellInfo(nMarkX).bEditEngine = true;
|
||||
bDoCell = false; // don't draw here
|
||||
}
|
||||
if ( bDoCell )
|
||||
@@ -2173,7 +2173,7 @@ tools::Rectangle ScOutputData::LayoutStrings(bool bPixelToLogic, bool bPaint, co
|
||||
}
|
||||
}
|
||||
}
|
||||
nPosX += pRowInfo[0].pCellInfo[nX+1].nWidth * nLayoutSign;
|
||||
nPosX += pRowInfo[0].cellInfo(nX).nWidth * nLayoutSign;
|
||||
}
|
||||
}
|
||||
nPosY += pRowInfo[nArrY].nHeight;
|
||||
@@ -3129,10 +3129,10 @@ void ScOutputData::DrawEditStandard(DrawEditParam& rParam)
|
||||
{
|
||||
// anywhere in the merged area...
|
||||
SCCOL nClipX = ( rParam.mnX < nX1 ) ? nX1 : rParam.mnX;
|
||||
pClipMarkCell = &pRowInfo[(rParam.mnArrY != 0) ? rParam.mnArrY : 1].pCellInfo[nClipX+1];
|
||||
pClipMarkCell = &pRowInfo[(rParam.mnArrY != 0) ? rParam.mnArrY : 1].cellInfo(nClipX);
|
||||
}
|
||||
else
|
||||
pClipMarkCell = &rParam.mpThisRowInfo->pCellInfo[rParam.mnX+1];
|
||||
pClipMarkCell = &rParam.mpThisRowInfo->cellInfo(rParam.mnX);
|
||||
|
||||
pClipMarkCell->nClipMark |= ScClipMark::Right; //! also allow left?
|
||||
bAnyClipped = true;
|
||||
@@ -3234,10 +3234,10 @@ void ScOutputData::ShowClipMarks( DrawEditParam& rParam, tools::Long nEngineWidt
|
||||
{
|
||||
// anywhere in the merged area...
|
||||
SCCOL nClipX = (rParam.mnX < nX1) ? nX1 : rParam.mnX;
|
||||
pClipMarkCell = &pRowInfo[(rParam.mnArrY != 0) ? rParam.mnArrY : 1].pCellInfo[nClipX + 1];
|
||||
pClipMarkCell = &pRowInfo[(rParam.mnArrY != 0) ? rParam.mnArrY : 1].cellInfo(nClipX);
|
||||
}
|
||||
else
|
||||
pClipMarkCell = &rParam.mpThisRowInfo->pCellInfo[rParam.mnX + 1];
|
||||
pClipMarkCell = &rParam.mpThisRowInfo->cellInfo(rParam.mnX);
|
||||
|
||||
bAnyClipped = true;
|
||||
bVertical = true;
|
||||
@@ -3970,10 +3970,10 @@ void ScOutputData::DrawEditStacked(DrawEditParam& rParam)
|
||||
{
|
||||
// anywhere in the merged area...
|
||||
SCCOL nClipX = ( rParam.mnX < nX1 ) ? nX1 : rParam.mnX;
|
||||
pClipMarkCell = &pRowInfo[(rParam.mnArrY != 0) ? rParam.mnArrY : 1].pCellInfo[nClipX+1];
|
||||
pClipMarkCell = &pRowInfo[(rParam.mnArrY != 0) ? rParam.mnArrY : 1].cellInfo(nClipX);
|
||||
}
|
||||
else
|
||||
pClipMarkCell = &rParam.mpThisRowInfo->pCellInfo[rParam.mnX+1];
|
||||
pClipMarkCell = &rParam.mpThisRowInfo->cellInfo(rParam.mnX);
|
||||
|
||||
pClipMarkCell->nClipMark |= ScClipMark::Right; //! also allow left?
|
||||
bAnyClipped = true;
|
||||
@@ -4257,10 +4257,10 @@ void ScOutputData::DrawEditAsianVertical(DrawEditParam& rParam)
|
||||
{
|
||||
// anywhere in the merged area...
|
||||
SCCOL nClipX = ( rParam.mnX < nX1 ) ? nX1 : rParam.mnX;
|
||||
pClipMarkCell = &pRowInfo[(rParam.mnArrY != 0) ? rParam.mnArrY : 1].pCellInfo[nClipX+1];
|
||||
pClipMarkCell = &pRowInfo[(rParam.mnArrY != 0) ? rParam.mnArrY : 1].cellInfo(nClipX);
|
||||
}
|
||||
else
|
||||
pClipMarkCell = &rParam.mpThisRowInfo->pCellInfo[rParam.mnX+1];
|
||||
pClipMarkCell = &rParam.mpThisRowInfo->cellInfo(rParam.mnX);
|
||||
|
||||
pClipMarkCell->nClipMark |= ScClipMark::Right; //! also allow left?
|
||||
bAnyClipped = true;
|
||||
@@ -4354,7 +4354,7 @@ void ScOutputData::DrawEdit(bool bPixelToLogic)
|
||||
std::unique_ptr< ScPatternAttr > pPreviewPattr;
|
||||
if (nX==nX1) nPosX = nInitPosX; // positions before nX1 are calculated individually
|
||||
|
||||
CellInfo* pInfo = &pThisRowInfo->pCellInfo[nX+1];
|
||||
const CellInfo* pInfo = &pThisRowInfo->cellInfo(nX);
|
||||
if (pInfo->bEditEngine)
|
||||
{
|
||||
SCROW nY = pThisRowInfo->nRowNo;
|
||||
@@ -4377,7 +4377,7 @@ void ScOutputData::DrawEdit(bool bPixelToLogic)
|
||||
bDoCell = true;
|
||||
}
|
||||
}
|
||||
else if ( nX == nX2 && pThisRowInfo->pCellInfo[nX+1].maCell.isEmpty() )
|
||||
else if ( nX == nX2 && pThisRowInfo->cellInfo(nX).maCell.isEmpty() )
|
||||
{
|
||||
// Rest of a long text further to the right?
|
||||
|
||||
@@ -4408,7 +4408,7 @@ void ScOutputData::DrawEdit(bool bPixelToLogic)
|
||||
if ( nCellY == nY && nCellX >= nX1 && nCellX <= nX2 &&
|
||||
!mpDoc->ColHidden(nCellX, nTab) )
|
||||
{
|
||||
CellInfo& rCellInfo = pThisRowInfo->pCellInfo[nCellX+1];
|
||||
CellInfo& rCellInfo = pThisRowInfo->cellInfo(nCellX);
|
||||
pPattern = rCellInfo.pPatternAttr;
|
||||
pCondSet = rCellInfo.pConditionSet;
|
||||
aCell = rCellInfo.maCell;
|
||||
@@ -4495,7 +4495,7 @@ void ScOutputData::DrawEdit(bool bPixelToLogic)
|
||||
bHyphenatorSet = aParam.mbHyphenatorSet;
|
||||
}
|
||||
}
|
||||
nPosX += pRowInfo[0].pCellInfo[nX+1].nWidth * nLayoutSign;
|
||||
nPosX += pRowInfo[0].cellInfo(nX).nWidth * nLayoutSign;
|
||||
}
|
||||
}
|
||||
nRowPosY += pRowInfo[nArrY].nHeight;
|
||||
@@ -4551,7 +4551,7 @@ void ScOutputData::DrawRotated(bool bPixelToLogic)
|
||||
{
|
||||
if (nX==nX1) nPosX = nInitPosX; // positions before nX1 are calculated individually
|
||||
|
||||
CellInfo* pInfo = &pThisRowInfo->pCellInfo[nX+1];
|
||||
const CellInfo* pInfo = &pThisRowInfo->cellInfo(nX);
|
||||
if ( pInfo->nRotateDir != ScRotateDir::NONE )
|
||||
{
|
||||
SCROW nY = pThisRowInfo->nRowNo;
|
||||
@@ -4590,7 +4590,7 @@ void ScOutputData::DrawRotated(bool bPixelToLogic)
|
||||
if (aCell.isEmpty() || IsEmptyCellText(pThisRowInfo, nX, nY))
|
||||
bHidden = true; // nRotateDir is also set without a cell
|
||||
|
||||
tools::Long nCellWidth = static_cast<tools::Long>(pRowInfo[0].pCellInfo[nX+1].nWidth);
|
||||
tools::Long nCellWidth = static_cast<tools::Long>(pRowInfo[0].cellInfo(nX).nWidth);
|
||||
|
||||
SvxCellHorJustify eHorJust =
|
||||
pPattern->GetItem(ATTR_HOR_JUSTIFY, pCondSet).GetValue();
|
||||
@@ -4617,7 +4617,7 @@ void ScOutputData::DrawRotated(bool bPixelToLogic)
|
||||
while (nCol > nX)
|
||||
{
|
||||
--nCol;
|
||||
nStartX -= nLayoutSign * static_cast<tools::Long>(pRowInfo[0].pCellInfo[nCol+1].nWidth);
|
||||
nStartX -= nLayoutSign * static_cast<tools::Long>(pRowInfo[0].cellInfo(nCol).nWidth);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5140,7 +5140,7 @@ void ScOutputData::DrawRotated(bool bPixelToLogic)
|
||||
}
|
||||
}
|
||||
}
|
||||
nPosX += pRowInfo[0].pCellInfo[nX+1].nWidth * nLayoutSign;
|
||||
nPosX += pRowInfo[0].cellInfo(nX).nWidth * nLayoutSign;
|
||||
}
|
||||
}
|
||||
nRowPosY += pRowInfo[nArrY].nHeight;
|
||||
|
||||
@@ -443,7 +443,7 @@ static void lcl_HidePrint( const ScTableInfo& rTabInfo, SCCOL nX1, SCCOL nX2 )
|
||||
RowInfo* pThisRowInfo = &rTabInfo.mpRowInfo[nArrY];
|
||||
for (SCCOL nX=nX1; nX<=nX2; nX++)
|
||||
{
|
||||
CellInfo& rCellInfo = pThisRowInfo->pCellInfo[nX+1];
|
||||
CellInfo& rCellInfo = pThisRowInfo->cellInfo(nX);
|
||||
if (!rCellInfo.bEmptyCellText)
|
||||
if (rCellInfo.pPatternAttr->
|
||||
GetItem(ATTR_PROTECTION, rCellInfo.pConditionSet).GetHidePrint())
|
||||
@@ -1407,8 +1407,8 @@ void ScPrintFunc::DrawBorder( tools::Long nScrX, tools::Long nScrY, tools::Long
|
||||
OSL_ENSURE(aTabInfo.mnArrCount,"nArrCount == 0");
|
||||
|
||||
aTabInfo.mpRowInfo[1].nHeight = static_cast<sal_uInt16>(nEffHeight);
|
||||
aTabInfo.mpRowInfo[0].pCellInfo[1].nWidth =
|
||||
aTabInfo.mpRowInfo[1].pCellInfo[1].nWidth = static_cast<sal_uInt16>(nEffWidth);
|
||||
aTabInfo.mpRowInfo[0].cellInfo(0).nWidth =
|
||||
aTabInfo.mpRowInfo[1].cellInfo(0).nWidth = static_cast<sal_uInt16>(nEffWidth);
|
||||
|
||||
ScOutputData aOutputData( pDev, OUTTYPE_PRINTER, aTabInfo, pBorderDoc.get(), 0,
|
||||
nScrX+nLeft, nScrY+nTop, 0,0, 0,0, nScaleX, nScaleY );
|
||||
|
||||
Reference in New Issue
Block a user