sc/source/core/data/table3.cxx | 15 +++++++++ sc/source/core/tool/token.cxx | 67 +++++++++++++++++++++++++++++++++++++---- 2 files changed, 76 insertions(+), 6 deletions(-)
New commits: commit 800eb8025233c340b154843c074fd5b6e8d21d35 Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Mon Oct 27 07:32:32 2014 -0700 fdo#85282: Correct adjustment of range reference on delete & shift. Change-Id: I6e01c160f77599dfa4a2e55b60e23d256184c822 diff --git a/sc/source/core/tool/token.cxx b/sc/source/core/tool/token.cxx index 7208d9d..f78e1c1 100644 --- a/sc/source/core/tool/token.cxx +++ b/sc/source/core/tool/token.cxx @@ -2536,6 +2536,9 @@ void setRefDeleted( ScComplexRefData& rRef, const sc::RefUpdateContext& rCxt ) bool shrinkRange( const sc::RefUpdateContext& rCxt, ScRange& rRefRange, const ScRange& rDeletedRange ) { + if (!rDeletedRange.Intersects(rRefRange)) + return false; + if (rCxt.mnColDelta < 0) { // Shifting left. @@ -2543,9 +2546,35 @@ bool shrinkRange( const sc::RefUpdateContext& rCxt, ScRange& rRefRange, const Sc // Deleted range is only partially overlapping in vertical direction. Bail out. return false; - // Move the last column position to the left. - SCCOL nDelta = rDeletedRange.aStart.Col() - rDeletedRange.aEnd.Col() - 1; - rRefRange.aEnd.IncCol(nDelta); + if (rDeletedRange.aStart.Col() <= rRefRange.aStart.Col()) + { + if (rRefRange.aEnd.Col() <= rDeletedRange.aEnd.Col()) + { + // Reference is entirely deleted. + rRefRange.SetInvalid(); + } + else + { + // The reference range is truncated on the left. + SCCOL nOffset = rDeletedRange.aStart.Col() - rRefRange.aStart.Col(); + SCCOL nDelta = rRefRange.aStart.Col() - rDeletedRange.aEnd.Col() - 1; + rRefRange.aStart.IncCol(nOffset); + rRefRange.aEnd.IncCol(nDelta+nOffset); + } + } + else if (rDeletedRange.aEnd.Col() < rRefRange.aEnd.Col()) + { + // Reference is deleted in the middle. Move the last column + // position to the left. + SCCOL nDelta = rDeletedRange.aStart.Col() - rDeletedRange.aEnd.Col() - 1; + rRefRange.aEnd.IncCol(nDelta); + } + else + { + // The reference range is truncated on the right. + SCCOL nDelta = rDeletedRange.aStart.Col() - rRefRange.aEnd.Col() - 1; + rRefRange.aEnd.IncCol(nDelta); + } return true; } else if (rCxt.mnRowDelta < 0) @@ -2556,9 +2585,35 @@ bool shrinkRange( const sc::RefUpdateContext& rCxt, ScRange& rRefRange, const Sc // Deleted range is only partially overlapping in horizontal direction. Bail out. return false; - // Move the last row position up. - SCROW nDelta = rDeletedRange.aStart.Row() - rDeletedRange.aEnd.Row() - 1; - rRefRange.aEnd.IncRow(nDelta); + if (rDeletedRange.aStart.Row() <= rRefRange.aStart.Row()) + { + if (rRefRange.aEnd.Row() <= rDeletedRange.aEnd.Row()) + { + // Reference is entirely deleted. + rRefRange.SetInvalid(); + } + else + { + // The reference range is truncated on the top. + SCCOL nOffset = rDeletedRange.aStart.Row() - rRefRange.aStart.Row(); + SCCOL nDelta = rRefRange.aStart.Row() - rDeletedRange.aEnd.Row() - 1; + rRefRange.aStart.IncRow(nOffset); + rRefRange.aEnd.IncRow(nDelta+nOffset); + } + } + else if (rDeletedRange.aEnd.Row() < rRefRange.aEnd.Row()) + { + // Reference is deleted in the middle. Move the last row + // position upward. + SCCOL nDelta = rDeletedRange.aStart.Row() - rDeletedRange.aEnd.Row() - 1; + rRefRange.aEnd.IncRow(nDelta); + } + else + { + // The reference range is truncated on the bottom. + SCCOL nDelta = rDeletedRange.aStart.Row() - rRefRange.aEnd.Row() - 1; + rRefRange.aEnd.IncRow(nDelta); + } return true; } commit 452165fb459dd026b86de1e4b5fe0ade5beb3a83 Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Mon Oct 27 08:52:38 2014 -0700 fdo#85215: Ensure that formula broadcasting works after sort. When the reference update on sort is turned off. Change-Id: I547dd1525a638dd447fe331e22583af4a7947308 (cherry picked from commit 1eb82c78a223d9a0b2bb5c3f5c129c1ee8bdf303) diff --git a/sc/source/core/data/table3.cxx b/sc/source/core/data/table3.cxx index 9a6069c..d646678 100644 --- a/sc/source/core/data/table3.cxx +++ b/sc/source/core/data/table3.cxx @@ -802,6 +802,15 @@ void ScTable::SortReorderByRow( ScSortInfoArray::RowsType* pRows = pArray->GetDataRows(); assert(pRows); // In sort-by-row mode we must have data rows already populated. + if (!pArray->IsUpdateRefs()) + { + // When the update ref mode is disabled, we need to detach all formula + // cells in the sorted range before reordering, and re-start them + // afterward. + sc::EndListeningContext aCxt(*pDocument); + DetachFormulaCells(aCxt, nCol1, nRow1, nCol2, nRow2); + } + // Split formula groups at the sort range boundaries (if applicable). std::vector<SCROW> aRowBounds; aRowBounds.reserve(2); @@ -1080,6 +1089,12 @@ void ScTable::SortReorderByRow( // Re-group columns in the sorted range too. for (SCCOL i = nCol1; i <= nCol2; ++i) aCol[i].RegroupFormulaCells(); + + if (!pArray->IsUpdateRefs()) + { + sc::StartListeningContext aCxt(*pDocument); + AttachFormulaCells(aCxt, nCol1, nRow1, nCol2, nRow2); + } } short ScTable::CompareCell( _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits