From 5d9e062a68eaf7544d02501d7b221150d74f7555 Mon Sep 17 00:00:00 2001 From: Markus Mohrhard Date: Thu, 5 Sep 2013 13:05:53 +0200 Subject: increase conditional format range during inserting rows/cols, fdo#67783 Change-Id: Ib74667fb958aa9bbbcae3a0289b3cbd6edf8fb37 --- sc/source/core/data/conditio.cxx | 22 ++++++++++++++ sc/source/core/data/table2.cxx | 9 ++++-- sc/source/core/tool/rangelst.cxx | 62 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 90 insertions(+), 3 deletions(-) (limited to 'sc/source') diff --git a/sc/source/core/data/conditio.cxx b/sc/source/core/data/conditio.cxx index 26f561a44fa1..6cc4f1bb022b 100644 --- a/sc/source/core/data/conditio.cxx +++ b/sc/source/core/data/conditio.cxx @@ -1960,6 +1960,16 @@ void ScConditionalFormat::UpdateReference( sc::RefUpdateContext& rCxt, bool bCop maRanges.UpdateReference(rCxt.meMode, pDoc, rCxt.maRange, rCxt.mnColDelta, rCxt.mnRowDelta, rCxt.mnTabDelta); } +void ScConditionalFormat::InsertRow(SCTAB nTab, SCCOL nColStart, SCCOL nColEnd, SCROW nRowPos, SCSIZE nSize) +{ + maRanges.InsertRow(nTab, nColStart, nColEnd, nRowPos, nSize); +} + +void ScConditionalFormat::InsertCol(SCTAB nTab, SCROW nRowStart, SCROW nRowEnd, SCCOL nColPos, SCSIZE nSize) +{ + maRanges.InsertCol(nTab, nRowStart, nRowEnd, nColPos, nSize); +} + void ScConditionalFormat::UpdateInsertTab( sc::RefUpdateInsertTabContext& rCxt ) { for (CondFormatContainer::iterator it = maEntries.begin(); it != maEntries.end(); ++it) @@ -2168,6 +2178,18 @@ void ScConditionalFormatList::UpdateReference( sc::RefUpdateContext& rCxt ) } } +void ScConditionalFormatList::InsertRow(SCTAB nTab, SCCOL nColStart, SCCOL nColEnd, SCROW nRowPos, SCSIZE nSize) +{ + for(iterator it = begin(), itEnd = end(); it != itEnd; ++it) + it->InsertRow(nTab, nColStart, nColEnd, nRowPos, nSize); +} + +void ScConditionalFormatList::InsertCol(SCTAB nTab, SCROW nRowStart, SCROW nRowEnd, SCCOL nColPos, SCSIZE nSize) +{ + for(iterator it = begin(), itEnd = end(); it != itEnd; ++it) + it->InsertCol(nTab, nRowStart, nRowEnd, nColPos, nSize); +} + void ScConditionalFormatList::UpdateInsertTab( sc::RefUpdateInsertTabContext& rCxt ) { for (iterator it = begin(); it != end(); ++it) diff --git a/sc/source/core/data/table2.cxx b/sc/source/core/data/table2.cxx index da3d42317669..7bd7ac6b035b 100644 --- a/sc/source/core/data/table2.cxx +++ b/sc/source/core/data/table2.cxx @@ -218,6 +218,8 @@ void ScTable::InsertRow( SCCOL nStartCol, SCCOL nEndCol, SCROW nStartRow, SCSIZE aNotes.ReleaseNote( nCol, nRow); } + mpCondFormatList->InsertRow(nTab, nStartCol, nEndCol, nStartRow, nSize); + InvalidatePageBreaks(); if (IsStreamValid()) @@ -425,10 +427,9 @@ void ScTable::InsertCol( if (nStartCol>0) // copy old attributes { - sal_uInt16 nWhichArray[3]; + sal_uInt16 nWhichArray[2]; nWhichArray[0] = ATTR_MERGE; - nWhichArray[1] = ATTR_CONDITIONAL; - nWhichArray[2] = 0; + nWhichArray[1] = 0; sc::CopyToDocContext aCxt(*pDocument); for (SCSIZE i=0; iInsertCol(nTab, nStartRow, nEndRow, nStartCol, nSize); + InvalidatePageBreaks(); if (IsStreamValid()) diff --git a/sc/source/core/tool/rangelst.cxx b/sc/source/core/tool/rangelst.cxx index 8abb3474eee2..00a9ca025dca 100644 --- a/sc/source/core/tool/rangelst.cxx +++ b/sc/source/core/tool/rangelst.cxx @@ -459,6 +459,68 @@ bool ScRangeList::UpdateReference( return bChanged; } +void ScRangeList::InsertRow( SCTAB nTab, SCCOL nColStart, SCCOL nColEnd, SCROW nRowPos, SCSIZE nSize ) +{ + std::vector aNewRanges; + for(iterator it = maRanges.begin(), itEnd = maRanges.end(); it != itEnd; + ++it) + { + ScRange* pRange = *it; + if(pRange->aStart.Tab() <= nTab && pRange->aEnd.Tab() >= nTab) + { + if(pRange->aEnd.Row() == nRowPos - 1 && (nColStart <= pRange->aEnd.Col() || nColEnd >= pRange->aStart.Col())) + { + SCCOL nNewRangeStartCol = std::max(nColStart, pRange->aStart.Col()); + SCCOL nNewRangeEndCol = std::min(nColEnd, pRange->aEnd.Col()); + SCROW nNewRangeStartRow = pRange->aEnd.Row() + 1; + SCROW nNewRangeEndRow = nRowPos + nSize - 1; + aNewRanges.push_back(ScRange(nNewRangeStartCol, nNewRangeStartRow, nTab, nNewRangeEndCol, + nNewRangeEndRow, nTab)); + } + } + } + + for(std::vector::const_iterator it = aNewRanges.begin(), itEnd = aNewRanges.end(); + it != itEnd; ++it) + { + if(!it->IsValid()) + continue; + + Join(*it); + } +} + +void ScRangeList::InsertCol( SCTAB nTab, SCROW nRowStart, SCROW nRowEnd, SCCOL nColPos, SCSIZE nSize ) +{ + std::vector aNewRanges; + for(iterator it = maRanges.begin(), itEnd = maRanges.end(); it != itEnd; + ++it) + { + ScRange* pRange = *it; + if(pRange->aStart.Tab() <= nTab && pRange->aEnd.Tab() >= nTab) + { + if(pRange->aEnd.Col() == nColPos - 1 && (nRowStart <= pRange->aEnd.Row() || nRowEnd >= pRange->aStart.Row())) + { + SCROW nNewRangeStartRow = std::max(nRowStart, pRange->aStart.Row()); + SCROW nNewRangeEndRow = std::min(nRowEnd, pRange->aEnd.Row()); + SCCOL nNewRangeStartCol = pRange->aEnd.Col() + 1; + SCCOL nNewRangeEndCol = nColPos + nSize - 1; + aNewRanges.push_back(ScRange(nNewRangeStartCol, nNewRangeStartRow, nTab, nNewRangeEndCol, + nNewRangeEndRow, nTab)); + } + } + } + + for(std::vector::const_iterator it = aNewRanges.begin(), itEnd = aNewRanges.end(); + it != itEnd; ++it) + { + if(!it->IsValid()) + continue; + + Join(*it); + } +} + namespace { /** -- cgit v1.2.3