summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarkus Mohrhard <markus.mohrhard@googlemail.com>2016-03-27 04:56:55 +0200
committerAshod Nakashian <ashnakash@gmail.com>2016-05-22 03:34:01 +0000
commitc8774715d10707989267b550841984cd50b07e74 (patch)
tree53dc70e3de9be865d1ffbfb4b4c40178a3a3bd67
parentb921fbc46e7593fd2d5e5d5c88508522937fdae0 (diff)
extract another function from ScDocument::FillInfo
(cherry picked from commit a70824f0220b88f3f209266f8e1cba98dc89ca8f) Change-Id: Ifd39ec5ad7aebac532ea7145274005507a5b177f Reviewed-on: https://gerrit.libreoffice.org/25283 Reviewed-by: Ashod Nakashian <ashnakash@gmail.com> Tested-by: Ashod Nakashian <ashnakash@gmail.com>
-rw-r--r--sc/source/core/data/fillinfo.cxx173
1 files changed, 90 insertions, 83 deletions
diff --git a/sc/source/core/data/fillinfo.cxx b/sc/source/core/data/fillinfo.cxx
index 4197b3f647ec..b8955b92ef7c 100644
--- a/sc/source/core/data/fillinfo.cxx
+++ b/sc/source/core/data/fillinfo.cxx
@@ -42,6 +42,10 @@
#include "cellvalue.hxx"
#include "mtvcellfunc.hxx"
+#include <vector>
+#include <memory>
+#include <o3tl/make_unique.hxx>
+
const sal_uInt16 ROWINFO_MAX = 1024;
enum FillInfoLinePos
@@ -71,7 +75,7 @@ static void lcl_GetMergeRange( SCsCOL nX, SCsROW nY, SCSIZE nArrY,
while (bHOver) // nY constant
{
--rStartX;
- if (rStartX >= (SCsCOL) nX1 && !pDoc->ColHidden(rStartX, nTab, NULL, &nLastCol))
+ if (rStartX >= (SCsCOL) nX1 && !pDoc->ColHidden(rStartX, nTab, nullptr, &nLastCol))
{
bHOver = pRowInfo[nArrY].pCellInfo[rStartX+1].bHOverlapped;
bVOver = pRowInfo[nArrY].pCellInfo[rStartX+1].bVOverlapped;
@@ -93,8 +97,8 @@ static void lcl_GetMergeRange( SCsCOL nX, SCsROW nY, SCSIZE nArrY,
--nArrY; // local copy !
if (rStartX >= (SCsCOL) nX1 && rStartY >= (SCsROW) nY1 &&
- !pDoc->ColHidden(rStartX, nTab, NULL, &nLastCol) &&
- !pDoc->RowHidden(rStartY, nTab, NULL, &nLastRow) &&
+ !pDoc->ColHidden(rStartX, nTab, nullptr, &nLastCol) &&
+ !pDoc->RowHidden(rStartY, nTab, nullptr, &nLastRow) &&
(SCsROW) pRowInfo[nArrY].nRowNo == rStartY)
{
bVOver = pRowInfo[nArrY].pCellInfo[rStartX+1].bVOverlapped;
@@ -109,8 +113,8 @@ static void lcl_GetMergeRange( SCsCOL nX, SCsROW nY, SCSIZE nArrY,
const ScMergeAttr* pMerge;
if (rStartX >= (SCsCOL) nX1 && rStartY >= (SCsROW) nY1 &&
- !pDoc->ColHidden(rStartX, nTab, NULL, &nLastCol) &&
- !pDoc->RowHidden(rStartY, nTab, NULL, &nLastRow) &&
+ !pDoc->ColHidden(rStartX, nTab, nullptr, &nLastCol) &&
+ !pDoc->RowHidden(rStartY, nTab, nullptr, &nLastRow) &&
(SCsROW) pRowInfo[nArrY].nRowNo == rStartY)
{
pMerge = static_cast<const ScMergeAttr*>( &pRowInfo[nArrY].pCellInfo[rStartX+1].pPatternAttr->
@@ -131,7 +135,7 @@ class RowInfoFiller
SCTAB mnTab;
RowInfo* mpRowInfo;
SCCOL mnArrX;
- SCSIZE& mrArrY;
+ SCSIZE mnArrY;
SCROW mnHiddenEndRow;
bool mbHiddenRow;
@@ -139,31 +143,31 @@ class RowInfoFiller
{
SCROW nThisRow = static_cast<SCROW>(nRow);
if (nThisRow > mnHiddenEndRow)
- mbHiddenRow = mrDoc.RowHidden(nThisRow, mnTab, NULL, &mnHiddenEndRow);
+ mbHiddenRow = mrDoc.RowHidden(nThisRow, mnTab, nullptr, &mnHiddenEndRow);
return mbHiddenRow;
}
void alignArray(size_t nRow)
{
- while (mpRowInfo[mrArrY].nRowNo < static_cast<SCROW>(nRow))
- ++mrArrY;
+ while (mpRowInfo[mnArrY].nRowNo < static_cast<SCROW>(nRow))
+ ++mnArrY;
}
void setInfo(size_t nRow, const ScRefCellValue& rCell)
{
alignArray(nRow);
- RowInfo* pThisRowInfo = &mpRowInfo[mrArrY];
+ RowInfo* pThisRowInfo = &mpRowInfo[mnArrY];
CellInfo* pInfo = &pThisRowInfo->pCellInfo[mnArrX];
pInfo->maCell = rCell;
pThisRowInfo->bEmptyText = false;
pInfo->bEmptyCellText = false;
- ++mrArrY;
+ ++mnArrY;
}
public:
RowInfoFiller(ScDocument& rDoc, SCTAB nTab, RowInfo* pRowInfo, SCCOL nArrX, SCSIZE& rArrY) :
- mrDoc(rDoc), mnTab(nTab), mpRowInfo(pRowInfo), mnArrX(nArrX), mrArrY(rArrY),
+ mrDoc(rDoc), mnTab(nTab), mpRowInfo(pRowInfo), mnArrX(nArrX), mnArrY(rArrY),
mnHiddenEndRow(-1), mbHiddenRow(false) {}
void operator() (size_t nRow, double fVal)
@@ -205,6 +209,58 @@ bool isRotateItemUsed(ScDocumentPool *pPool)
return false;
}
+void initRowInfo(ScDocument* pDoc, RowInfo* pRowInfo, SCROW& rY,
+ double fRowScale, SCROW nRow1, SCTAB nTab, SCROW& rYExtra, SCSIZE& rArrRow, SCROW& rRow2)
+{
+ sal_uInt16 nDocHeight = ScGlobal::nStdRowHeight;
+ SCROW nDocHeightEndRow = -1;
+ for (SCsROW nSignedY=((SCsROW)nRow1)-1; nSignedY<=(SCsROW)rYExtra; nSignedY++)
+ {
+ if (nSignedY >= 0)
+ rY = (SCROW) nSignedY;
+ else
+ rY = MAXROW+1; // invalid
+
+ if (rY > nDocHeightEndRow)
+ {
+ if (ValidRow(rY))
+ nDocHeight = pDoc->GetRowHeight( rY, nTab, nullptr, &nDocHeightEndRow );
+ else
+ nDocHeight = ScGlobal::nStdRowHeight;
+ }
+
+ if ( rArrRow==0 || nDocHeight || rY > MAXROW )
+ {
+ RowInfo* pThisRowInfo = &pRowInfo[rArrRow];
+ pThisRowInfo->pCellInfo = nullptr; // is loaded below
+
+ sal_uInt16 nHeight = (sal_uInt16) ( nDocHeight * fRowScale );
+ if (!nHeight)
+ nHeight = 1;
+
+ pThisRowInfo->nRowNo = rY; //TODO: case < 0 ?
+ pThisRowInfo->nHeight = nHeight;
+ pThisRowInfo->bEmptyBack = true;
+ pThisRowInfo->bEmptyText = true;
+ pThisRowInfo->bChanged = true;
+ pThisRowInfo->bAutoFilter = false;
+ pThisRowInfo->bPivotButton = false;
+ pThisRowInfo->nRotMaxCol = SC_ROTMAX_NONE;
+
+ ++rArrRow;
+ if (rArrRow >= ROWINFO_MAX)
+ {
+ OSL_FAIL("FillInfo: Range too big" );
+ rYExtra = nSignedY; // End
+ rRow2 = rYExtra - 1; // Adjust range
+ }
+ }
+ else
+ if (nSignedY==(SCsROW) rYExtra) // hidden additional line?
+ ++rYExtra;
+ }
+}
+
}
void ScDocument::FillInfo(
@@ -270,53 +326,8 @@ void ScDocument::FillInfo(
nArrRow=0;
SCROW nYExtra = nRow2+1;
- sal_uInt16 nDocHeight = ScGlobal::nStdRowHeight;
- SCROW nDocHeightEndRow = -1;
- for (nSignedY=((SCsROW)nRow1)-1; nSignedY<=(SCsROW)nYExtra; nSignedY++)
- {
- if (nSignedY >= 0)
- nY = (SCROW) nSignedY;
- else
- nY = MAXROW+1; // invalid
-
- if (nY > nDocHeightEndRow)
- {
- if (ValidRow(nY))
- nDocHeight = GetRowHeight( nY, nTab, NULL, &nDocHeightEndRow );
- else
- nDocHeight = ScGlobal::nStdRowHeight;
- }
-
- if ( nArrRow==0 || nDocHeight || nY > MAXROW )
- {
- RowInfo* pThisRowInfo = &pRowInfo[nArrRow];
- pThisRowInfo->pCellInfo = NULL; // is loaded below
-
- sal_uInt16 nHeight = (sal_uInt16) ( nDocHeight * fRowScale );
- if (!nHeight)
- nHeight = 1;
-
- pThisRowInfo->nRowNo = nY; //TODO: case < 0 ?
- pThisRowInfo->nHeight = nHeight;
- pThisRowInfo->bEmptyBack = true;
- pThisRowInfo->bEmptyText = true;
- pThisRowInfo->bChanged = true;
- pThisRowInfo->bAutoFilter = false;
- pThisRowInfo->bPivotButton = false;
- pThisRowInfo->nRotMaxCol = SC_ROTMAX_NONE;
-
- ++nArrRow;
- if (nArrRow >= ROWINFO_MAX)
- {
- OSL_FAIL("FillInfo: Range too big" );
- nYExtra = nSignedY; // End
- nRow2 = nYExtra - 1; // Adjust range
- }
- }
- else
- if (nSignedY==(SCsROW) nYExtra) // hidden additional line?
- ++nYExtra;
- }
+ initRowInfo(this, pRowInfo, nY, fRowScale, nRow1,
+ nTab, nYExtra, nArrRow, nRow2);
nArrCount = nArrRow; // incl. Dummys
// Rotated text...
@@ -325,7 +336,7 @@ void ScDocument::FillInfo(
bool bAnyItem = isRotateItemUsed(pPool);
SCCOL nRotMax = nCol2;
- if ( bAnyItem && HasAttrib( 0,nRow1,nTab, MAXCOL,nRow2+1,nTab,
+ if ( bAnyItem && HasAttrib( 0, nRow1, nTab, MAXCOL, nRow2+1, nTab,
HASATTR_ROTATE | HASATTR_CONDITIONAL ) )
{
//TODO: check Conditionals also for HASATTR_ROTATE ????
@@ -379,17 +390,17 @@ void ScDocument::FillInfo(
pInfo->bHideGrid = false; // view-internal
pInfo->bEditEngine = false; // view-internal
- pInfo->pBackground = NULL; //TODO: omit?
- pInfo->pPatternAttr = NULL;
- pInfo->pConditionSet= NULL;
+ pInfo->pBackground = nullptr; //TODO: omit?
+ pInfo->pPatternAttr = nullptr;
+ pInfo->pConditionSet= nullptr;
- pInfo->pLinesAttr = NULL;
- pInfo->mpTLBRLine = NULL;
- pInfo->mpBLTRLine = NULL;
+ pInfo->pLinesAttr = nullptr;
+ pInfo->mpTLBRLine = nullptr;
+ pInfo->mpBLTRLine = nullptr;
pInfo->pShadowAttr = pDefShadow;
- pInfo->pHShadowOrigin = NULL;
- pInfo->pVShadowOrigin = NULL;
+ pInfo->pHShadowOrigin = nullptr;
+ pInfo->pVShadowOrigin = nullptr;
}
}
@@ -433,18 +444,17 @@ void ScDocument::FillInfo(
ScColumn* pThisCol = &maTabs[nTab]->aCol[nX]; // Column data
- nArrRow = 1;
+ nArrRow = 0;
// Iterate between rows nY1 and nY2 and pick up non-empty
// cells that are not hidden.
RowInfoFiller aFunc(*this, nTab, pRowInfo, nArrCol, nArrRow);
sc::ParseAllNonEmpty(
- pThisCol->maCells.begin(), pThisCol->maCells, nRow1, nRow2, aFunc);
+ pThisCol->maCells.begin(), pThisCol->maCells, std::max<SCROW>(0 , nRow1 - 1), nYExtra, aFunc);
if (nX+1 >= nCol1) // Attribute/Blockmark from nX1-1
{
ScAttrArray* pThisAttrArr = pThisCol->pAttrArray; // Attribute
- nArrRow = 0;
const ScPatternAttr* pPattern;
SCROW nCurRow=nRow1; // single rows
if (nCurRow>0)
@@ -507,10 +517,10 @@ void ScDocument::FillInfo(
do
{
SCROW nLastHiddenRow = -1;
- bool bRowHidden = RowHidden(nCurRow, nTab, NULL, &nLastHiddenRow);
+ bool bRowHidden = RowHidden(nCurRow, nTab, nullptr, &nLastHiddenRow);
if ( nArrRow==0 || !bRowHidden )
{
- if ( GetPreviewCellStyle( nX, nCurRow, nTab ) != NULL )
+ if ( GetPreviewCellStyle( nX, nCurRow, nTab ) != nullptr )
bAnyPreview = true;
RowInfo* pThisRowInfo = &pRowInfo[nArrRow];
if (pBackground != pDefBackground) // Column background == Default ?
@@ -682,7 +692,7 @@ void ScDocument::FillInfo(
pCondFormList->endRendering();
// bedingte Formatierung auswerten
- ::boost::ptr_vector<ScPatternAttr> aAltPatterns;
+ std::vector< std::unique_ptr<ScPatternAttr> > aAltPatterns;
// favour preview over condition
if (bAnyCondition || bAnyPreview)
{
@@ -692,14 +702,14 @@ void ScDocument::FillInfo(
{
CellInfo* pInfo = &pRowInfo[nArrRow].pCellInfo[nArrCol];
SCCOL nCol = (nArrCol>0) ? nArrCol-1 : MAXCOL+1;
- ScPatternAttr* pModifiedPatt = NULL;
+ ScPatternAttr* pModifiedPatt = nullptr;
if ( ValidCol(nCol) && pRowInfo[nArrRow].nRowNo <= MAXROW )
{
if ( ScStyleSheet* pPreviewStyle = GetPreviewCellStyle( nCol, pRowInfo[nArrRow].nRowNo, nTab ) )
{
- aAltPatterns.push_back( new ScPatternAttr( *pInfo->pPatternAttr ) );
- pModifiedPatt = &aAltPatterns.back();
+ aAltPatterns.push_back( o3tl::make_unique<ScPatternAttr>( *pInfo->pPatternAttr ) );
+ pModifiedPatt = aAltPatterns.back().get();
pModifiedPatt->SetStyleSheet( pPreviewStyle );
}
}
@@ -1090,8 +1100,8 @@ void ScDocument::FillInfo(
}
else
{
- pBox = 0;
- pTLBR = pBLTR = 0;
+ pBox = nullptr;
+ pTLBR = pBLTR = nullptr;
}
}
}
@@ -1113,10 +1123,7 @@ void ScDocument::FillInfo(
}
}
- /* Mirror the entire frame array.
- 1st param = Mirror the vertical double line styles as well.
- 2nd param = Do not swap diagonal lines.
- */
+ /* Mirror the entire frame array. */
if( bLayoutRTL )
rArray.MirrorSelfX( true, false );
}