diff options
author | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2013-09-05 13:05:53 +0200 |
---|---|---|
committer | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2013-09-05 14:36:55 +0200 |
commit | 5d9e062a68eaf7544d02501d7b221150d74f7555 (patch) | |
tree | 2dc3c1dfae3e2eab701875240c36e2d59a2dc278 /sc | |
parent | dcc05d40c6fdb41a4193072d6b72456d75269ba3 (diff) |
increase conditional format range during inserting rows/cols, fdo#67783
Change-Id: Ib74667fb958aa9bbbcae3a0289b3cbd6edf8fb37
Diffstat (limited to 'sc')
-rw-r--r-- | sc/inc/conditio.hxx | 8 | ||||
-rw-r--r-- | sc/inc/rangelst.hxx | 3 | ||||
-rw-r--r-- | sc/source/core/data/conditio.cxx | 22 | ||||
-rw-r--r-- | sc/source/core/data/table2.cxx | 9 | ||||
-rw-r--r-- | sc/source/core/tool/rangelst.cxx | 62 |
5 files changed, 101 insertions, 3 deletions
diff --git a/sc/inc/conditio.hxx b/sc/inc/conditio.hxx index 7f50a279dc77..040f237c93cd 100644 --- a/sc/inc/conditio.hxx +++ b/sc/inc/conditio.hxx @@ -413,6 +413,10 @@ public: void UpdateInsertTab( sc::RefUpdateInsertTabContext& rCxt ); void UpdateDeleteTab( sc::RefUpdateDeleteTabContext& rCxt ); void UpdateMoveTab( sc::RefUpdateMoveTabContext& rCxt ); + + void InsertRow(SCTAB nTab, SCCOL nColStart, SCCOL nColEnd, SCROW nRowStart, SCSIZE nSize); + void InsertCol(SCTAB nTab, SCROW nRowStart, SCROW nRowEnd, SCCOL nColStart, SCSIZE nSize); + void DeleteArea( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 ); void RenameCellStyle( const OUString& rOld, const OUString& rNew ); @@ -478,6 +482,10 @@ public: void UpdateInsertTab( sc::RefUpdateInsertTabContext& rCxt ); void UpdateDeleteTab( sc::RefUpdateDeleteTabContext& rCxt ); void UpdateMoveTab( sc::RefUpdateMoveTabContext& rCxt ); + + void InsertRow(SCTAB nTab, SCCOL nColStart, SCCOL nColEnd, SCROW nRowStart, SCSIZE nSize); + void InsertCol(SCTAB nTab, SCROW nRowStart, SCROW nRowEnd, SCCOL nColStart, SCSIZE nSize); + void RenameCellStyle( const OUString& rOld, const OUString& rNew ); void DeleteArea( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 ); diff --git a/sc/inc/rangelst.hxx b/sc/inc/rangelst.hxx index 9902eab2e448..6ff6150d290f 100644 --- a/sc/inc/rangelst.hxx +++ b/sc/inc/rangelst.hxx @@ -59,6 +59,9 @@ public: SCsTAB nDz ); + void InsertRow( SCTAB nTab, SCCOL nColStart, SCCOL nColEnd, SCROW nRowPos, SCSIZE nSize ); + void InsertCol( SCTAB nTab, SCROW nRowStart, SCROW nRowEnd, SCCOL nColPos, SCSIZE nSize ); + /** For now this method assumes that nTab1 == nTab2 * The algorithm will be much more complicated if nTab1 != nTab2 */ 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; i<nSize; i++) @@ -441,6 +442,8 @@ void ScTable::InsertCol( } } + mpCondFormatList->InsertCol(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<ScRange> 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<SCCOL>(nColStart, pRange->aStart.Col()); + SCCOL nNewRangeEndCol = std::min<SCCOL>(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<ScRange>::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<ScRange> 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<SCROW>(nRowStart, pRange->aStart.Row()); + SCROW nNewRangeEndRow = std::min<SCROW>(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<ScRange>::const_iterator it = aNewRanges.begin(), itEnd = aNewRanges.end(); + it != itEnd; ++it) + { + if(!it->IsValid()) + continue; + + Join(*it); + } +} + namespace { /** |