sc/inc/document.hxx | 2 sc/source/core/data/documen2.cxx | 1 sc/source/core/data/documen8.cxx | 2 sc/source/core/data/document.cxx | 16 +--- sc/source/core/tool/addinlis.cxx | 1 sc/source/core/tool/adiasync.cxx | 1 sc/source/ui/docshell/docsh3.cxx | 5 - sc/source/ui/view/gridwin4.cxx | 3 sc/source/ui/view/tabview3.cxx | 152 +++++++++++++++++++-------------------- 9 files changed, 86 insertions(+), 97 deletions(-)
New commits: commit 3b1e88a8eb6b3f9da7c899a791e491db21d1bbdc Author: Kohei Yoshida <[email protected]> Date: Tue Nov 15 16:55:49 2011 -0500 Reset formula cell's changed flag only for those within visible range. Especially avoid marking all cells in all sheets which would cause a performance problem. diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx index de903d0..02cc60d 100644 --- a/sc/inc/document.hxx +++ b/sc/inc/document.hxx @@ -864,7 +864,7 @@ public: const ::editeng::SvxBorderLine** ppRight, const ::editeng::SvxBorderLine** ppBottom ) const; - void ResetChanged( const ScRangeList& rRanges ); + void ResetChanged( const ScRange& rRange ); void SetDirty(); void SetDirty( const ScRange& ); diff --git a/sc/source/core/data/documen2.cxx b/sc/source/core/data/documen2.cxx index 223c505..5798f4d 100644 --- a/sc/source/core/data/documen2.cxx +++ b/sc/source/core/data/documen2.cxx @@ -336,7 +336,6 @@ IMPL_LINK( ScDocument, TrackTimeHdl, Timer*, EMPTYARG ) { TrackFormulas(); pShell->Broadcast( SfxSimpleHint( FID_DATACHANGED ) ); - ResetChanged( ScRange(0,0,0,MAXCOL,MAXROW,MAXTAB) ); // modified... diff --git a/sc/source/core/data/documen8.cxx b/sc/source/core/data/documen8.cxx index 914cfef..1a439a7 100644 --- a/sc/source/core/data/documen8.cxx +++ b/sc/source/core/data/documen8.cxx @@ -1056,7 +1056,6 @@ void ScDocument::UpdateExternalRefLinks(Window* pWin) { TrackFormulas(); pShell->Broadcast( SfxSimpleHint(FID_DATACHANGED) ); - ResetChanged( ScRange(0, 0, 0, MAXCOL, MAXROW, MAXTAB) ); // #i101960# set document modified, as in TrackTimeHdl for DDE links if (!pShell->IsModified()) @@ -1117,7 +1116,6 @@ void ScDocument::UpdateDdeLinks(Window* pWin) // Formeln berechnen und painten wie im TrackTimeHdl TrackFormulas(); pShell->Broadcast( SfxSimpleHint( FID_DATACHANGED ) ); - ResetChanged( ScRange(0,0,0,MAXCOL,MAXROW,MAXTAB) ); // wenn FID_DATACHANGED irgendwann mal asynchron werden sollte // (z.B. mit Invalidate am Window), muss hier ein Update erzwungen werden. diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx index 9f44829..40e85d7 100644 --- a/sc/source/core/data/document.cxx +++ b/sc/source/core/data/document.cxx @@ -3504,18 +3504,14 @@ sal_uInt16 ScDocument::GetErrCode( const ScAddress& rPos ) const } -void ScDocument::ResetChanged( const ScRangeList& rRanges ) +void ScDocument::ResetChanged( const ScRange& rRange ) { SCTAB nTabSize = static_cast<SCTAB>(maTabs.size()); - for (size_t i = 0, n = rRanges.size(); i < n; ++i) - { - const ScRange& rRange = *rRanges[i]; - SCTAB nTab1 = rRange.aStart.Tab(); - SCTAB nTab2 = rRange.aEnd.Tab(); - for (SCTAB nTab = nTab1; nTab1 <= nTab2 && nTab < nTabSize; ++nTab) - if (maTabs[nTab]) - maTabs[nTab]->ResetChanged(rRange); - } + SCTAB nTab1 = rRange.aStart.Tab(); + SCTAB nTab2 = rRange.aEnd.Tab(); + for (SCTAB nTab = nTab1; nTab1 <= nTab2 && nTab < nTabSize; ++nTab) + if (maTabs[nTab]) + maTabs[nTab]->ResetChanged(rRange); } // diff --git a/sc/source/core/tool/addinlis.cxx b/sc/source/core/tool/addinlis.cxx index 267d006..292824a 100644 --- a/sc/source/core/tool/addinlis.cxx +++ b/sc/source/core/tool/addinlis.cxx @@ -135,7 +135,6 @@ void SAL_CALL ScAddInListener::modified( const ::com::sun::star::sheet::ResultEv ScDocument* pDoc = (ScDocument*)*ppDoc; pDoc->TrackFormulas(); pDoc->GetDocumentShell()->Broadcast( SfxSimpleHint( FID_DATACHANGED ) ); - pDoc->ResetChanged( ScRange(0,0,0,MAXCOL,MAXROW,MAXTAB) ); } } diff --git a/sc/source/core/tool/adiasync.cxx b/sc/source/core/tool/adiasync.cxx index 341aee1..208305f 100644 --- a/sc/source/core/tool/adiasync.cxx +++ b/sc/source/core/tool/adiasync.cxx @@ -151,7 +151,6 @@ void ScAddInAsync::CallBack( sal_uLong nHandleP, void* pData ) ScDocument* pDoc = (ScDocument*)*ppDoc; pDoc->TrackFormulas(); pDoc->GetDocumentShell()->Broadcast( SfxSimpleHint( FID_DATACHANGED ) ); - pDoc->ResetChanged( ScRange(0,0,0,MAXCOL,MAXROW,MAXTAB) ); } } diff --git a/sc/source/ui/docshell/docsh3.cxx b/sc/source/ui/docshell/docsh3.cxx index b392c2d..b7a139f 100644 --- a/sc/source/ui/docshell/docsh3.cxx +++ b/sc/source/ui/docshell/docsh3.cxx @@ -105,8 +105,6 @@ void ScDocShell::PostEditView( ScEditEngineDefaulter* pEditEngine, const ScAddre void ScDocShell::PostDataChanged() { Broadcast( SfxSimpleHint( FID_DATACHANGED ) ); - aDocument.ResetChanged( ScRange(0,0,0,MAXCOL,MAXROW,MAXTAB) ); - SFX_APP()->Broadcast(SfxSimpleHint( FID_ANYDATACHANGED )); // Navigator //! Navigator direkt benachrichtigen! } @@ -184,9 +182,6 @@ void ScDocShell::PostPaint( const ScRangeList& rRanges, sal_uInt16 nPart, sal_uI } Broadcast(ScPaintHint(aPaintRanges.Combine(), nPart)); - - if (nPart & PAINT_GRID) - aDocument.ResetChanged(aPaintRanges); } void ScDocShell::PostPaintGridAll() diff --git a/sc/source/ui/view/gridwin4.cxx b/sc/source/ui/view/gridwin4.cxx index 1db7cd9..1ee84cf 100644 --- a/sc/source/ui/view/gridwin4.cxx +++ b/sc/source/ui/view/gridwin4.cxx @@ -885,6 +885,9 @@ void ScGridWindow::Draw( SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2, ScUpdateMod --nPaintCount; if (!nPaintCount) CheckNeedsRepaint(); + + // Flag drawn formula cells "unchanged". + pDoc->ResetChanged(ScRange(nX1,nY1,nTab,nX2,nY2,nTab)); } void ScGridWindow::CheckNeedsRepaint() commit 5fc37762b68c9b94734b84546fce2309ff7bb2c0 Author: Kohei Yoshida <[email protected]> Date: Tue Nov 15 16:01:09 2011 -0500 Reduce scoping. diff --git a/sc/source/ui/view/tabview3.cxx b/sc/source/ui/view/tabview3.cxx index fdb0b92..b7f7ef8 100644 --- a/sc/source/ui/view/tabview3.cxx +++ b/sc/source/ui/view/tabview3.cxx @@ -1841,7 +1841,6 @@ void ScTabView::UpdateFormulas() void ScTabView::PaintArea( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, ScUpdateMode eMode ) { - sal_uInt16 i; SCCOL nCol1; SCROW nRow1; SCCOL nCol2; @@ -1850,87 +1849,88 @@ void ScTabView::PaintArea( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCRO PutInOrder( nStartCol, nEndCol ); PutInOrder( nStartRow, nEndRow ); - for (i=0; i<4; i++) - if (pGridWin[i]) - if (pGridWin[i]->IsVisible()) + for (size_t i = 0; i < 4; ++i) + { + if (!pGridWin[i] || !pGridWin[i]->IsVisible()) + continue; + + ScHSplitPos eHWhich = WhichH( (ScSplitPos) i ); + ScVSplitPos eVWhich = WhichV( (ScSplitPos) i ); + bool bOut = false; + + nCol1 = nStartCol; + nRow1 = nStartRow; + nCol2 = nEndCol; + nRow2 = nEndRow; + + SCCOL nScrX = aViewData.GetPosX( eHWhich ); + SCROW nScrY = aViewData.GetPosY( eVWhich ); + if (nCol1 < nScrX) nCol1 = nScrX; + if (nCol2 < nScrX) + { + if ( eMode == SC_UPDATE_ALL ) // for UPDATE_ALL, paint anyway + nCol2 = nScrX; // (because of extending strings to the right) + else + bOut = true; // completely outside the window + } + if (nRow1 < nScrY) nRow1 = nScrY; + if (nRow2 < nScrY) bOut = true; + + SCCOL nLastX = nScrX + aViewData.VisibleCellsX( eHWhich ) + 1; + SCROW nLastY = nScrY + aViewData.VisibleCellsY( eVWhich ) + 1; + if (nCol1 > nLastX) bOut = true; + if (nCol2 > nLastX) nCol2 = nLastX; + if (nRow1 > nLastY) bOut = true; + if (nRow2 > nLastY) nRow2 = nLastY; + + if (bOut) + continue; + + if ( eMode == SC_UPDATE_CHANGED ) + pGridWin[i]->Draw( nCol1, nRow1, nCol2, nRow2, eMode ); + else // ALL oder MARKS + { + bool bLayoutRTL = aViewData.GetDocument()->IsLayoutRTL( aViewData.GetTabNo() ); + long nLayoutSign = bLayoutRTL ? -1 : 1; + + Point aStart = aViewData.GetScrPos( nCol1, nRow1, (ScSplitPos) i ); + Point aEnd = aViewData.GetScrPos( nCol2+1, nRow2+1, (ScSplitPos) i ); + if ( eMode == SC_UPDATE_ALL ) + aEnd.X() = bLayoutRTL ? 0 : (pGridWin[i]->GetOutputSizePixel().Width()); + aEnd.X() -= nLayoutSign; + aEnd.Y() -= 1; + + // #i85232# include area below cells (could be done in GetScrPos?) + if ( eMode == SC_UPDATE_ALL && nRow2 >= MAXROW ) + aEnd.Y() = pGridWin[i]->GetOutputSizePixel().Height(); + + bool bShowChanges = true; //! ... + if (bShowChanges) { - ScHSplitPos eHWhich = WhichH( (ScSplitPos) i ); - ScVSplitPos eVWhich = WhichV( (ScSplitPos) i ); - bool bOut = false; - - nCol1 = nStartCol; - nRow1 = nStartRow; - nCol2 = nEndCol; - nRow2 = nEndRow; - - SCCOL nScrX = aViewData.GetPosX( eHWhich ); - SCROW nScrY = aViewData.GetPosY( eVWhich ); - if (nCol1 < nScrX) nCol1 = nScrX; - if (nCol2 < nScrX) - { - if ( eMode == SC_UPDATE_ALL ) // for UPDATE_ALL, paint anyway - nCol2 = nScrX; // (because of extending strings to the right) - else - bOut = true; // completely outside the window - } - if (nRow1 < nScrY) nRow1 = nScrY; - if (nRow2 < nScrY) bOut = true; - - SCCOL nLastX = nScrX + aViewData.VisibleCellsX( eHWhich ) + 1; - SCROW nLastY = nScrY + aViewData.VisibleCellsY( eVWhich ) + 1; - if (nCol1 > nLastX) bOut = true; - if (nCol2 > nLastX) nCol2 = nLastX; - if (nRow1 > nLastY) bOut = true; - if (nRow2 > nLastY) nRow2 = nLastY; + aStart.X() -= nLayoutSign; // include change marks + aStart.Y() -= 1; + } - if (!bOut) + bool bMarkClipped = aViewData.GetOptions().GetOption( VOPT_CLIPMARKS ); + if (bMarkClipped) + { + // dazu muesste ScColumn::IsEmptyBlock optimiert werden + // (auf Search() umstellen) + //!if ( nCol1 > 0 && !aViewData.GetDocument()->IsBlockEmpty( + //! aViewData.GetTabNo(), + //! 0, nRow1, nCol1-1, nRow2 ) ) { - if ( eMode == SC_UPDATE_CHANGED ) - pGridWin[i]->Draw( nCol1, nRow1, nCol2, nRow2, eMode ); - else // ALL oder MARKS - { - bool bLayoutRTL = aViewData.GetDocument()->IsLayoutRTL( aViewData.GetTabNo() ); - long nLayoutSign = bLayoutRTL ? -1 : 1; - - Point aStart = aViewData.GetScrPos( nCol1, nRow1, (ScSplitPos) i ); - Point aEnd = aViewData.GetScrPos( nCol2+1, nRow2+1, (ScSplitPos) i ); - if ( eMode == SC_UPDATE_ALL ) - aEnd.X() = bLayoutRTL ? 0 : (pGridWin[i]->GetOutputSizePixel().Width()); - aEnd.X() -= nLayoutSign; - aEnd.Y() -= 1; - - // #i85232# include area below cells (could be done in GetScrPos?) - if ( eMode == SC_UPDATE_ALL && nRow2 >= MAXROW ) - aEnd.Y() = pGridWin[i]->GetOutputSizePixel().Height(); - - bool bShowChanges = true; //! ... - if (bShowChanges) - { - aStart.X() -= nLayoutSign; // include change marks - aStart.Y() -= 1; - } - - bool bMarkClipped = aViewData.GetOptions().GetOption( VOPT_CLIPMARKS ); - if (bMarkClipped) - { - // dazu muesste ScColumn::IsEmptyBlock optimiert werden - // (auf Search() umstellen) - //!if ( nCol1 > 0 && !aViewData.GetDocument()->IsBlockEmpty( - //! aViewData.GetTabNo(), - //! 0, nRow1, nCol1-1, nRow2 ) ) - { - long nMarkPixel = (long)( SC_CLIPMARK_SIZE * aViewData.GetPPTX() ); - aStart.X() -= nMarkPixel * nLayoutSign; - if (!bShowChanges) - aStart.X() -= nLayoutSign; // cell grid - } - } - - pGridWin[i]->Invalidate( pGridWin[i]->PixelToLogic( Rectangle( aStart,aEnd ) ) ); - } + long nMarkPixel = (long)( SC_CLIPMARK_SIZE * aViewData.GetPPTX() ); + aStart.X() -= nMarkPixel * nLayoutSign; + if (!bShowChanges) + aStart.X() -= nLayoutSign; // cell grid } } + pGridWin[i]->Invalidate( pGridWin[i]->PixelToLogic( Rectangle( aStart,aEnd ) ) ); + } + } + // #i79909# Calling UpdateAllOverlays here isn't necessary and would lead to overlay calls from a timer, // with a wrong MapMode if editing in a cell (reference input). // #i80499# Overlays need updates in a lot of cases, e.g. changing row/column size, _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
