diff options
author | Marco Cecchetti <marco.cecchetti@collabora.com> | 2018-05-07 12:49:22 +0200 |
---|---|---|
committer | Jan Holesovsky <kendy@collabora.com> | 2018-07-09 17:50:19 +0200 |
commit | daaf101ffe683eb691418ec2df4adc260d7e6a15 (patch) | |
tree | d2cdd2d6b826f57f85da070c4aa4d85c68a17b38 /sc/source/ui/view | |
parent | 08db80ebb4e831d6501ea30de561b175819cc68c (diff) |
lok: sc: formulas were not updated correctly
this patch fixes several issues:
- any cell containing a formula above row 1024 causing a tile
invalidation whenever any cell content was changed, even if unrelated
to the formula;
- any formula below row 1024 wasn't updated even if it was inside the
visible area.
Change-Id: Ib92153d5755c4e231aa68dee807fe997f9e80a46
Reviewed-on: https://gerrit.libreoffice.org/53935
Tested-by: Jenkins
Reviewed-by: Jan Holesovsky <kendy@collabora.com>
Diffstat (limited to 'sc/source/ui/view')
-rw-r--r-- | sc/source/ui/view/gridwin.cxx | 35 | ||||
-rw-r--r-- | sc/source/ui/view/gridwin4.cxx | 4 | ||||
-rw-r--r-- | sc/source/ui/view/tabview.cxx | 13 | ||||
-rw-r--r-- | sc/source/ui/view/tabview3.cxx | 4 |
4 files changed, 48 insertions, 8 deletions
diff --git a/sc/source/ui/view/gridwin.cxx b/sc/source/ui/view/gridwin.cxx index f3dacb97f4f7..e94a46c3c46b 100644 --- a/sc/source/ui/view/gridwin.cxx +++ b/sc/source/ui/view/gridwin.cxx @@ -4505,7 +4505,7 @@ void ScGridWindow::ScrollPixel( long nDifX, long nDifY ) // Update Formulas ------------------------------------------------------ -void ScGridWindow::UpdateFormulas() +void ScGridWindow::UpdateFormulas(SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2) { if (pViewData->GetView()->IsMinimized()) return; @@ -4520,10 +4520,30 @@ void ScGridWindow::UpdateFormulas() return; } - SCCOL nX1 = pViewData->GetPosX( eHWhich ); - SCROW nY1 = pViewData->GetPosY( eVWhich ); - SCCOL nX2 = nX1 + pViewData->VisibleCellsX( eHWhich ); - SCROW nY2 = nY1 + pViewData->VisibleCellsY( eVWhich ); + if ( comphelper::LibreOfficeKit::isActive() ) + { + ScTabViewShell* pViewShell = pViewData->GetViewShell(); + if (nX1 < 0) + nX1 = pViewShell->GetLOKStartHeaderCol() + 1; + if (nY1 < 0) + nY1 = pViewShell->GetLOKStartHeaderRow() + 1; + if (nX2 < 0) + nX2 = pViewShell->GetLOKEndHeaderCol(); + if (nY2 < 0) + nY2 = pViewShell->GetLOKEndHeaderRow(); + + if (nX1 < 0 || nY1 < 0) return; + } + else + { + nX1 = pViewData->GetPosX( eHWhich ); + nY1 = pViewData->GetPosY( eVWhich ); + nX2 = nX1 + pViewData->VisibleCellsX( eHWhich ); + nY2 = nY1 + pViewData->VisibleCellsY( eVWhich ); + } + + if (nX2 < nX1) nX2 = nX1; + if (nY2 < nY1) nY2 = nY1; if (nX2 > MAXCOL) nX2 = MAXCOL; if (nY2 > MAXROW) nY2 = MAXROW; @@ -4537,7 +4557,10 @@ void ScGridWindow::UpdateFormulas() ScDocument& rDoc = *pViewData->GetDocument(); SCTAB nTab = pViewData->GetTabNo(); - rDoc.ExtendHidden( nX1, nY1, nX2, nY2, nTab ); + if ( !comphelper::LibreOfficeKit::isActive() ) + { + rDoc.ExtendHidden( nX1, nY1, nX2, nY2, nTab ); + } Point aScrPos = pViewData->GetScrPos( nX1, nY1, eWhich ); long nMirrorWidth = GetSizePixel().Width(); diff --git a/sc/source/ui/view/gridwin4.cxx b/sc/source/ui/view/gridwin4.cxx index 32fe801027c5..595b7a325d28 100644 --- a/sc/source/ui/view/gridwin4.cxx +++ b/sc/source/ui/view/gridwin4.cxx @@ -1217,6 +1217,10 @@ void ScGridWindow::PaintTile( VirtualDevice& rDevice, DrawContent(rDevice, aTabInfo, aOutputData, true); rDevice.SetMapMode(aOriginalMode); + + // Flag drawn formula cells "unchanged". + pDoc->ResetChanged(ScRange(nTopLeftTileCol, nTopLeftTileRow, nTab, nBottomRightTileCol, nBottomRightTileRow, nTab)); + pDoc->PrepareFormulaCalc(); } void ScGridWindow::LogicInvalidate(const tools::Rectangle* pRectangle) diff --git a/sc/source/ui/view/tabview.cxx b/sc/source/ui/view/tabview.cxx index ce567a793310..5e53f937e102 100644 --- a/sc/source/ui/view/tabview.cxx +++ b/sc/source/ui/view/tabview.cxx @@ -2493,6 +2493,9 @@ OUString ScTabView::getRowColumnHeaders(const tools::Rectangle& rRectangle) long nStartWidthPx = 0; long nEndWidthPx = 0; + tools::Rectangle aOldVisArea( + mnLOKStartHeaderCol + 1, mnLOKStartHeaderRow + 1, + mnLOKEndHeaderCol, mnLOKEndHeaderRow); /// *** start collecting ROWS *** @@ -2777,6 +2780,16 @@ OUString ScTabView::getRowColumnHeaders(const tools::Rectangle& rRectangle) aBuffer.append("\n}"); OUString sRet = aBuffer.makeStringAndClear(); + vcl::Region aNewVisArea( + tools::Rectangle(mnLOKStartHeaderCol + 1, mnLOKStartHeaderRow + 1, + mnLOKEndHeaderCol, mnLOKEndHeaderRow)); + aNewVisArea.Exclude(aOldVisArea); + tools::Rectangle aChangedArea = aNewVisArea.GetBoundRect(); + if (!aChangedArea.IsEmpty()) + { + UpdateFormulas(aChangedArea.Left(), aChangedArea.Top(), aChangedArea.Right(), aChangedArea.Bottom()); + } + return sRet; } diff --git a/sc/source/ui/view/tabview3.cxx b/sc/source/ui/view/tabview3.cxx index 393735d3df6b..7030f1b31cdd 100644 --- a/sc/source/ui/view/tabview3.cxx +++ b/sc/source/ui/view/tabview3.cxx @@ -2206,7 +2206,7 @@ void ScTabView::KillEditView( bool bNoPaint ) } } -void ScTabView::UpdateFormulas() +void ScTabView::UpdateFormulas(SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow) { if ( aViewData.GetDocument()->IsAutoCalcShellDisabled() ) return; @@ -2214,7 +2214,7 @@ void ScTabView::UpdateFormulas() for (sal_uInt16 i = 0; i < 4; i++) { if (pGridWin[i] && pGridWin[i]->IsVisible()) - pGridWin[i]->UpdateFormulas(); + pGridWin[i]->UpdateFormulas(nStartCol, nStartRow, nEndCol, nEndRow); } if ( aViewData.IsPagebreakMode() ) |