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 | |
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')
-rw-r--r-- | sc/source/ui/inc/gridwin.hxx | 2 | ||||
-rw-r--r-- | sc/source/ui/inc/tabview.hxx | 7 | ||||
-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 |
6 files changed, 55 insertions, 10 deletions
diff --git a/sc/source/ui/inc/gridwin.hxx b/sc/source/ui/inc/gridwin.hxx index 1775114c27c8..ff0bd43ea955 100644 --- a/sc/source/ui/inc/gridwin.hxx +++ b/sc/source/ui/inc/gridwin.hxx @@ -351,7 +351,7 @@ public: void ScrollPixel( long nDifX, long nDifY ); void UpdateEditViewPos(); - void UpdateFormulas(); + void UpdateFormulas(SCCOL nX1 = -1, SCROW nY1 = -1, SCCOL nX2 = -1, SCROW nY2 = -1); void LaunchDataSelectMenu( SCCOL nCol, SCROW nRow ); void DoScenarioMenu( const ScRange& rScenRange ); diff --git a/sc/source/ui/inc/tabview.hxx b/sc/source/ui/inc/tabview.hxx index cc8dd64568c9..4c321ec1653f 100644 --- a/sc/source/ui/inc/tabview.hxx +++ b/sc/source/ui/inc/tabview.hxx @@ -496,7 +496,7 @@ public: void UpdateShrinkOverlay(); void UpdateAllOverlays(); - void UpdateFormulas(); + void UpdateFormulas( SCCOL nStartCol = -1, SCROW nStartRow = -1, SCCOL nEndCol = -1, SCROW nEndRow = -1 ); void InterpretVisible(); void CheckNeedsRepaint(); bool NeedsRepaint(); @@ -611,6 +611,11 @@ public: /// @see ScModelObj::getRowColumnHeaders(). OUString getRowColumnHeaders(const tools::Rectangle& rRectangle); static void OnLOKNoteStateChanged(const ScPostIt* pNote); + + SCROW GetLOKStartHeaderRow() { return mnLOKStartHeaderRow; } + SCROW GetLOKEndHeaderRow() { return mnLOKEndHeaderRow; } + SCCOL GetLOKStartHeaderCol() { return mnLOKStartHeaderCol; } + SCCOL GetLOKEndHeaderCol() { return mnLOKEndHeaderCol; } }; #endif 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() ) |