summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorMarkus Mohrhard <markus.mohrhard@googlemail.com>2013-09-05 13:05:53 +0200
committerMarkus Mohrhard <markus.mohrhard@googlemail.com>2013-09-05 14:36:55 +0200
commit5d9e062a68eaf7544d02501d7b221150d74f7555 (patch)
tree2dc3c1dfae3e2eab701875240c36e2d59a2dc278 /sc
parentdcc05d40c6fdb41a4193072d6b72456d75269ba3 (diff)
increase conditional format range during inserting rows/cols, fdo#67783
Change-Id: Ib74667fb958aa9bbbcae3a0289b3cbd6edf8fb37
Diffstat (limited to 'sc')
-rw-r--r--sc/inc/conditio.hxx8
-rw-r--r--sc/inc/rangelst.hxx3
-rw-r--r--sc/source/core/data/conditio.cxx22
-rw-r--r--sc/source/core/data/table2.cxx9
-rw-r--r--sc/source/core/tool/rangelst.cxx62
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 {
/**