sc/source/ui/inc/printfun.hxx | 8 +- sc/source/ui/view/printfun.cxx | 122 +++++++++++++++++++++++++++-------------- 2 files changed, 87 insertions(+), 43 deletions(-)
New commits: commit 51dac483c90f5d33fab5f449c0915917540ef547 Author: Armin Le Grand <a...@apache.org> Date: Wed Feb 26 03:04:14 2014 +0000 i123672 Made data used in ScPrintFunc to prepare print preview dynamic diff --git a/sc/source/ui/inc/printfun.hxx b/sc/source/ui/inc/printfun.hxx index 9c84556..b53ebe2 100644 --- a/sc/source/ui/inc/printfun.hxx +++ b/sc/source/ui/inc/printfun.hxx @@ -209,9 +209,11 @@ private: SCCOL nEndCol; SCROW nEndRow; - SCCOL* pPageEndX; // Seitenaufteilung - SCROW* pPageEndY; - ScPageRowEntry* pPageRows; + // #123672# use dynamic mem to react on size changes + std::vector< SCCOL > maPageEndX; + std::vector< SCROW > maPageEndY; + std::vector< ScPageRowEntry> maPageRows; + size_t nPagesX; size_t nPagesY; size_t nTotalY; diff --git a/sc/source/ui/view/printfun.cxx b/sc/source/ui/view/printfun.cxx index b6e94ea..5e38f66 100644 --- a/sc/source/ui/view/printfun.cxx +++ b/sc/source/ui/view/printfun.cxx @@ -190,9 +190,6 @@ void ScPrintFunc::Construct( const ScPrintOptions* pOptions ) // weil die EditEngine sonst unterschiedliche Texthoehen liefert pDev->SetMapMode(MAP_PIXEL); - pPageEndX = NULL; - pPageEndY = NULL; - pPageRows = NULL; pBorderItem = NULL; pBackgroundItem = NULL; pShadowItem = NULL; @@ -331,8 +328,25 @@ void ScPrintFunc::FillPageData() rData.SetPrintRange( ScRange( nStartCol, nStartRow, nPrintTab, nEndCol, nEndRow, nPrintTab ) ); - rData.SetPagesX( nPagesX, pPageEndX ); - rData.SetPagesY( nTotalY, pPageEndY ); + // #123672# + if(maPageEndX.empty()) + { + OSL_ENSURE(false, "vector access error for maPageEndX (!)"); + } + else + { + rData.SetPagesX( nPagesX, &maPageEndX[0]); + } + + // #123672# + if(maPageEndY.empty()) + { + OSL_ENSURE(false, "vector access error for maPageEndY (!)"); + } + else + { + rData.SetPagesY( nTotalY, &maPageEndY[0]); + } // Einstellungen rData.SetTopDown( aTableParam.bTopDown ); @@ -350,9 +364,6 @@ ScPrintFunc::~ScPrintFunc() } aNotePosList.Clear(); - delete[] pPageEndX; - delete[] pPageEndY; - delete[] pPageRows; delete pEditDefaults; delete pEditEngine; @@ -2491,7 +2502,10 @@ long ScPrintFunc::CountPages() // setzt auch nPagesX, n CalcZoom(i); if ( aTableParam.bSkipEmpty ) for (nY=0; nY<nPagesY; nY++) - nPages += pPageRows[nY].CountVisible(); + { + OSL_ENSURE(nY < maPageRows.size(), "vector access error for maPageRows (!)"); + nPages += maPageRows[nY].CountVisible(); + } else nPages += ((long) nPagesX) * nPagesY; if ( pPageData ) @@ -2503,7 +2517,10 @@ long ScPrintFunc::CountPages() // setzt auch nPagesX, n CalcZoom(RANGENO_NORANGE); // Zoom berechnen if ( aTableParam.bSkipEmpty ) for (nY=0; nY<nPagesY; nY++) - nPages += pPageRows[nY].CountVisible(); + { + OSL_ENSURE(nY < maPageRows.size(), "vector access error for maPageRows (!)"); + nPages += maPageRows[nY].CountVisible(); + } else nPages += ((long) nPagesX) * nPagesY; if ( pPageData ) @@ -2711,12 +2728,14 @@ long ScPrintFunc::DoPrint( const MultiSelection& rPageRanges, nX1 = nStartCol; for (nCountX=0; nCountX<nPagesX; nCountX++) { - nX2 = pPageEndX[nCountX]; + OSL_ENSURE(nCountX < maPageEndX.size(), "vector access error for maPageEndX (!)"); + nX2 = maPageEndX[nCountX]; for (nCountY=0; nCountY<nPagesY; nCountY++) { - nY1 = pPageRows[nCountY].GetStartRow(); - nY2 = pPageRows[nCountY].GetEndRow(); - if ( !aTableParam.bSkipEmpty || !pPageRows[nCountY].IsHidden(nCountX) ) + OSL_ENSURE(nCountY < maPageRows.size(), "vector access error for maPageRows (!)"); + nY1 = maPageRows[nCountY].GetStartRow(); + nY2 = maPageRows[nCountY].GetEndRow(); + if ( !aTableParam.bSkipEmpty || !maPageRows[nCountY].IsHidden(nCountX) ) { if ( rPageRanges.IsSelected( nPageNo+nStartPage+1 ) ) { @@ -2734,13 +2753,15 @@ long ScPrintFunc::DoPrint( const MultiSelection& rPageRanges, { for (nCountY=0; nCountY<nPagesY; nCountY++) { - nY1 = pPageRows[nCountY].GetStartRow(); - nY2 = pPageRows[nCountY].GetEndRow(); + OSL_ENSURE(nCountY < maPageRows.size(), "vector access error for maPageRows (!)"); + nY1 = maPageRows[nCountY].GetStartRow(); + nY2 = maPageRows[nCountY].GetEndRow(); nX1 = nStartCol; for (nCountX=0; nCountX<nPagesX; nCountX++) { - nX2 = pPageEndX[nCountX]; - if ( !aTableParam.bSkipEmpty || !pPageRows[nCountY].IsHidden(nCountX) ) + OSL_ENSURE(nCountX < maPageEndX.size(), "vector access error for maPageEndX (!)"); + nX2 = maPageEndX[nCountX]; + if ( !aTableParam.bSkipEmpty || !maPageRows[nCountY].IsHidden(nCountX) ) { if ( rPageRanges.IsSelected( nPageNo+nStartPage+1 ) ) { @@ -2961,8 +2982,7 @@ void ScPrintFunc::ResetBreaks( SCTAB nTab ) // Breaks fuer Anzeige richt pDoc->UpdatePageBreaks( nTab, NULL ); } -void lcl_SetHidden( ScDocument* pDoc, SCTAB nPrintTab, ScPageRowEntry& rPageRowEntry, - SCCOL nStartCol, const SCCOL* pPageEndX ) +void lcl_SetHidden( ScDocument* pDoc, SCTAB nPrintTab, ScPageRowEntry& rPageRowEntry, SCCOL nStartCol, const std::vector< SCCOL >& aPageEndX) { size_t nPagesX = rPageRowEntry.GetPagesX(); SCROW nStartRow = rPageRowEntry.GetStartRow(); @@ -2974,7 +2994,8 @@ void lcl_SetHidden( ScDocument* pDoc, SCTAB nPrintTab, ScPageRowEntry& rPageRowE for (size_t i=0; i<nPagesX; i++) { - SCCOL nEndCol = pPageEndX[i]; + OSL_ENSURE(i < aPageEndX.size(), "vector access error for maPageEndX (!)"); + SCCOL nEndCol = aPageEndX[i]; if ( pDoc->IsPrintEmpty( nPrintTab, nStartCol, nStartRow, nEndCol, nEndRow, bLeftIsEmpty, &aTempRange, &aTempRect ) ) { @@ -2990,10 +3011,11 @@ void lcl_SetHidden( ScDocument* pDoc, SCTAB nPrintTab, ScPageRowEntry& rPageRowE void ScPrintFunc::CalcPages() // berechnet aPageRect und Seiten aus nZoom { - if (!pPageEndX) pPageEndX = new SCCOL[MAXCOL+1]; - //performance impact -// if (!pPageEndY) pPageEndY = new SCROW[MAXROW+1]; -// if (!pPageRows) pPageRows = new ScPageRowEntry[MAXROW+1]; //! vorher zaehlen !!!! + // #123672# use dynamic mem to react on size changes + if(maPageEndX.size() < MAXCOL+1) + { + maPageEndX.resize(MAXCOL+1, SCCOL()); + } pDoc->SetPageSize( nPrintTab, GetDocPageSize() ); if (aAreaParam.bPrintArea) @@ -3002,10 +3024,24 @@ void ScPrintFunc::CalcPages() // berechnet aPageRect und Seiten au pDoc->UpdatePageBreaks( nPrintTab, &aRange ); } else + { pDoc->UpdatePageBreaks( nPrintTab, NULL ); // sonst wird das Ende markiert - SCROW nRealCnt = nEndRow-nStartRow+1; - if (!pPageEndY) pPageEndY = new SCROW[nRealCnt+1]; - if (!pPageRows) pPageRows = new ScPageRowEntry[nRealCnt+1]; //! vorher zaehlen !!!! + } + + const SCROW nRealCnt = nEndRow-nStartRow+1; + + // #123672# use dynamic mem to react on size changes + if(maPageEndY.size() < nRealCnt+1) + { + maPageEndY.resize(nRealCnt+1, SCROW()); + } + + // #123672# use dynamic mem to react on size changes + if(maPageRows.size() < nRealCnt+1) + { + maPageRows.resize(nRealCnt+1, ScPageRowEntry()); + } + // // Seiteneinteilung nach Umbruechen in Col/RowFlags // Von mehreren Umbruechen in einem ausgeblendeten Bereich zaehlt nur einer. @@ -3023,7 +3059,8 @@ void ScPrintFunc::CalcPages() // berechnet aPageRect und Seiten au bool bPageBreak = (pDoc->HasColBreak(i, nPrintTab) & BREAK_PAGE); if ( i>nStartCol && bVisCol && bPageBreak ) { - pPageEndX[nPagesX] = i-1; + OSL_ENSURE(nPagesX < maPageEndX.size(), "vector access error for maPageEndX (!)"); + maPageEndX[nPagesX] = i-1; ++nPagesX; bVisCol = false; } @@ -3032,7 +3069,8 @@ void ScPrintFunc::CalcPages() // berechnet aPageRect und Seiten au } if (bVisCol) // auch am Ende keine leeren Seiten { - pPageEndX[nPagesX] = nEndCol; + OSL_ENSURE(nPagesX < maPageEndX.size(), "vector access error for maPageEndX (!)"); + maPageEndX[nPagesX] = nEndCol; ++nPagesX; } @@ -3054,17 +3092,19 @@ void ScPrintFunc::CalcPages() // berechnet aPageRect und Seiten au if (nRow > nStartRow && bVisRow && bPageBreak ) { - pPageEndY[nTotalY] = nRow-1; + OSL_ENSURE(nTotalY < maPageEndY.size(), "vector access error for maPageEndY (!)"); + maPageEndY[nTotalY] = nRow-1; ++nTotalY; if ( !aTableParam.bSkipEmpty || !pDoc->IsPrintEmpty( nPrintTab, nStartCol, nPageStartRow, nEndCol, nRow-1 ) ) { - pPageRows[nPagesY].SetStartRow( nPageStartRow ); - pPageRows[nPagesY].SetEndRow( nRow-1 ); - pPageRows[nPagesY].SetPagesX( nPagesX ); + OSL_ENSURE(nPagesY < maPageRows.size(), "vector access error for maPageRows (!)"); + maPageRows[nPagesY].SetStartRow( nPageStartRow ); + maPageRows[nPagesY].SetEndRow( nRow-1 ); + maPageRows[nPagesY].SetPagesX( nPagesX ); if (aTableParam.bSkipEmpty) - lcl_SetHidden( pDoc, nPrintTab, pPageRows[nPagesY], nStartCol, pPageEndX ); + lcl_SetHidden( pDoc, nPrintTab, maPageRows[nPagesY], nStartCol, maPageEndX ); ++nPagesY; } @@ -3093,17 +3133,19 @@ void ScPrintFunc::CalcPages() // berechnet aPageRect und Seiten au if (bVisRow) { - pPageEndY[nTotalY] = nEndRow; + OSL_ENSURE(nTotalY < maPageEndY.size(), "vector access error for maPageEndY (!)"); + maPageEndY[nTotalY] = nEndRow; ++nTotalY; if ( !aTableParam.bSkipEmpty || !pDoc->IsPrintEmpty( nPrintTab, nStartCol, nPageStartRow, nEndCol, nEndRow ) ) { - pPageRows[nPagesY].SetStartRow( nPageStartRow ); - pPageRows[nPagesY].SetEndRow( nEndRow ); - pPageRows[nPagesY].SetPagesX( nPagesX ); + OSL_ENSURE(nPagesY < maPageRows.size(), "vector access error for maPageRows (!)"); + maPageRows[nPagesY].SetStartRow( nPageStartRow ); + maPageRows[nPagesY].SetEndRow( nEndRow ); + maPageRows[nPagesY].SetPagesX( nPagesX ); if (aTableParam.bSkipEmpty) - lcl_SetHidden( pDoc, nPrintTab, pPageRows[nPagesY], nStartCol, pPageEndX ); + lcl_SetHidden( pDoc, nPrintTab, maPageRows[nPagesY], nStartCol, maPageEndX ); ++nPagesY; } } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits