sc/source/core/data/fillinfo.cxx | 173 ++++++++++++++++++++------------------- 1 file changed, 90 insertions(+), 83 deletions(-)
New commits: commit c8774715d10707989267b550841984cd50b07e74 Author: Markus Mohrhard <markus.mohrh...@googlemail.com> Date: Sun Mar 27 04:56:55 2016 +0200 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 <ashnak...@gmail.com> Tested-by: Ashod Nakashian <ashnak...@gmail.com> diff --git a/sc/source/core/data/fillinfo.cxx b/sc/source/core/data/fillinfo.cxx index 4197b3f6..b8955b9 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 ); } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits