[Libreoffice-commits] core.git: 2 commits - sc/qa sc/source
Kohei Yoshida
kohei.yoshida at collabora.com
Tue May 13 19:47:21 PDT 2014
sc/qa/unit/ucalc.cxx | 106 +++++++++++++++++++++++++++++++++++++++
sc/qa/unit/ucalc.hxx | 2
sc/source/core/data/conditio.cxx | 37 +++++++++++++
3 files changed, 145 insertions(+)
New commits:
commit 146f6e7e68ea56f79b72047b97bd9fba66db499d
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date: Tue May 13 22:46:17 2014 -0400
fdo#76710: Adjust sheet position of conditional format entries.
When inserting or deleting sheets.
Change-Id: Ibf898350e22f092ec38b75ad98957832a5580e6a
diff --git a/sc/source/core/data/conditio.cxx b/sc/source/core/data/conditio.cxx
index 49f2fea..80a2b53 100644
--- a/sc/source/core/data/conditio.cxx
+++ b/sc/source/core/data/conditio.cxx
@@ -2002,12 +2002,49 @@ void ScConditionalFormat::InsertCol(SCTAB nTab, SCROW nRowStart, SCROW nRowEnd,
void ScConditionalFormat::UpdateInsertTab( sc::RefUpdateInsertTabContext& rCxt )
{
+ for (size_t i = 0, n = maRanges.size(); i < n; ++i)
+ {
+ // We assume that the start and end sheet indices are equal.
+ ScRange* pRange = maRanges[i];
+ SCTAB nTab = pRange->aStart.Tab();
+
+ if (nTab < rCxt.mnInsertPos)
+ // Unaffected.
+ continue;
+
+ pRange->aStart.IncTab(rCxt.mnSheets);
+ pRange->aEnd.IncTab(rCxt.mnSheets);
+ }
+
for (CondFormatContainer::iterator it = maEntries.begin(); it != maEntries.end(); ++it)
it->UpdateInsertTab(rCxt);
}
void ScConditionalFormat::UpdateDeleteTab( sc::RefUpdateDeleteTabContext& rCxt )
{
+ for (size_t i = 0, n = maRanges.size(); i < n; ++i)
+ {
+ // We assume that the start and end sheet indices are equal.
+ ScRange* pRange = maRanges[i];
+ SCTAB nTab = pRange->aStart.Tab();
+
+ if (nTab < rCxt.mnDeletePos)
+ // Left of the deleted sheet(s). Unaffected.
+ continue;
+
+ if (nTab <= rCxt.mnDeletePos+rCxt.mnSheets-1)
+ {
+ // On the deleted sheet(s).
+ pRange->aStart.SetTab(-1);
+ pRange->aEnd.SetTab(-1);
+ continue;
+ }
+
+ // Right of the deleted sheet(s). Adjust the sheet indices.
+ pRange->aStart.IncTab(-1*rCxt.mnSheets);
+ pRange->aEnd.IncTab(-1*rCxt.mnSheets);
+ }
+
for (CondFormatContainer::iterator it = maEntries.begin(); it != maEntries.end(); ++it)
it->UpdateDeleteTab(rCxt);
}
commit dff4725f0dbb3bd7c32155e51ba49c05ee104d4f
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date: Tue May 13 22:42:44 2014 -0400
fdo#76710: Write test for this.
Change-Id: Ia0338d2839f0f319881948c208a74bee950da4af
diff --git a/sc/qa/unit/ucalc.cxx b/sc/qa/unit/ucalc.cxx
index 2a2f706..14a323b 100644
--- a/sc/qa/unit/ucalc.cxx
+++ b/sc/qa/unit/ucalc.cxx
@@ -5882,6 +5882,112 @@ void Test::testCondFormatInsertRow()
m_pDoc->DeleteTab(0);
}
+void Test::testCondFormatInsertDeleteSheets()
+{
+ m_pDoc->InsertTab(0, "Test");
+
+ // Add a conditional format to B2:B4.
+ ScConditionalFormat* pFormat = new ScConditionalFormat(1, m_pDoc);
+ pFormat->AddRange(ScRange(1,1,0,1,3,0));
+
+ sal_uLong nKey = m_pDoc->AddCondFormat(pFormat, 0);
+
+ // Add condition in which if the value equals 2, set the "Result" style.
+ ScCondFormatEntry* pEntry = new ScCondFormatEntry(
+ SC_COND_EQUAL, "=2", "" , m_pDoc, ScAddress(0,0,0), ScGlobal::GetRscString(STR_STYLENAME_RESULT));
+ pFormat->AddEntry(pEntry);
+
+ // Apply the format to the range.
+ m_pDoc->AddCondFormatData(pFormat->GetRange(), 0, nKey);
+
+ // Make sure this conditional format entry is really there.
+ ScConditionalFormatList* pList = m_pDoc->GetCondFormList(0);
+ CPPUNIT_ASSERT(pList);
+ const ScConditionalFormat* pCheck = pList->GetFormat(nKey);
+ CPPUNIT_ASSERT_MESSAGE("Wrong condntional format instance.", pCheck == pFormat);
+
+ // ... and its range is B2:B4.
+ ScRangeList aCheckRange = pCheck->GetRange();
+ CPPUNIT_ASSERT_MESSAGE("This should be a single range.", aCheckRange.size() == 1);
+ const ScRange* pRange = aCheckRange[0];
+ CPPUNIT_ASSERT(pRange);
+ CPPUNIT_ASSERT_MESSAGE("Format should be applied to B2:B4.", *pRange == ScRange(1,1,0,1,3,0));
+
+ ScDocFunc& rFunc = getDocShell().GetDocFunc();
+
+ // Insert a new sheet at the left.
+ bool bInserted = rFunc.InsertTable(0, "Inserted", true, true);
+ CPPUNIT_ASSERT(bInserted);
+
+ pList = m_pDoc->GetCondFormList(1);
+ CPPUNIT_ASSERT(pList);
+ pCheck = pList->GetFormat(nKey);
+ CPPUNIT_ASSERT(pCheck);
+
+ // Make sure the range also got shifted.
+ aCheckRange = pCheck->GetRange();
+ CPPUNIT_ASSERT_MESSAGE("This should be a single range.", aCheckRange.size() == 1);
+ pRange = aCheckRange[0];
+ CPPUNIT_ASSERT(pRange);
+ CPPUNIT_ASSERT_MESSAGE("Format should be applied to B2:B4 on the 2nd sheet after the sheet insertion.", *pRange == ScRange(1,1,1,1,3,1));
+
+ // Delete the sheet to the left.
+ bool bDeleted = rFunc.DeleteTable(0, true, true);
+ CPPUNIT_ASSERT(bDeleted);
+
+ pList = m_pDoc->GetCondFormList(0);
+ CPPUNIT_ASSERT(pList);
+ pCheck = pList->GetFormat(nKey);
+ CPPUNIT_ASSERT(pCheck);
+
+ // Make sure the range got shifted back.
+ aCheckRange = pCheck->GetRange();
+ CPPUNIT_ASSERT_MESSAGE("This should be a single range.", aCheckRange.size() == 1);
+ pRange = aCheckRange[0];
+ CPPUNIT_ASSERT(pRange);
+ CPPUNIT_ASSERT_MESSAGE("Format should be applied to B2:B4 on the 1st sheet after the sheet removal.", *pRange == ScRange(1,1,0,1,3,0));
+
+ SfxUndoManager* pUndoMgr = m_pDoc->GetUndoManager();
+ CPPUNIT_ASSERT(pUndoMgr);
+
+ // Undo and re-check.
+ pUndoMgr->Undo();
+
+ pList = m_pDoc->GetCondFormList(1);
+ CPPUNIT_ASSERT(pList);
+ pCheck = pList->GetFormat(nKey);
+ CPPUNIT_ASSERT(pCheck);
+
+ aCheckRange = pCheck->GetRange();
+ CPPUNIT_ASSERT_MESSAGE("This should be a single range.", aCheckRange.size() == 1);
+ pRange = aCheckRange[0];
+ CPPUNIT_ASSERT(pRange);
+ CPPUNIT_ASSERT_MESSAGE("Format should be applied to B2:B4 on the 2nd sheet after the undo of the sheet removal.", *pRange == ScRange(1,1,1,1,3,1));
+
+#if 0 // TODO : Undo of sheet insertion currently depends on the presence of
+ // view shell, and crashes when executed during cppunit run.
+
+ // Undo again and re-check.
+ pUndoMgr->Undo();
+
+ pList = m_pDoc->GetCondFormList(0);
+ CPPUNIT_ASSERT(pList);
+ pCheck = pList->GetFormat(nKey);
+ CPPUNIT_ASSERT(pCheck);
+
+ // Make sure the range got shifted back.
+ aCheckRange = pCheck->GetRange();
+ CPPUNIT_ASSERT_MESSAGE("This should be a single range.", aCheckRange.size() == 1);
+ pRange = aCheckRange[0];
+ CPPUNIT_ASSERT(pRange);
+ CPPUNIT_ASSERT_MESSAGE("Format should be applied to B2:B4 on the 1st sheet after the undo of sheet insertion.", *pRange == ScRange(1,1,0,1,3,0));
+#else
+ m_pDoc->DeleteTab(1);
+#endif
+
+ m_pDoc->DeleteTab(0);
+}
+
void Test::testCondCopyPaste()
{
m_pDoc->InsertTab(0, "Test");
diff --git a/sc/qa/unit/ucalc.hxx b/sc/qa/unit/ucalc.hxx
index f69da1b..ec32e23 100644
--- a/sc/qa/unit/ucalc.hxx
+++ b/sc/qa/unit/ucalc.hxx
@@ -353,6 +353,7 @@ public:
void testCondFormatINSDEL();
void testCondFormatInsertRow();
void testCondFormatInsertCol();
+ void testCondFormatInsertDeleteSheets();
void testCondCopyPaste();
void testIconSet();
@@ -512,6 +513,7 @@ public:
CPPUNIT_TEST(testCondFormatINSDEL);
CPPUNIT_TEST(testCondFormatInsertRow);
CPPUNIT_TEST(testCondFormatInsertCol);
+ CPPUNIT_TEST(testCondFormatInsertDeleteSheets);
CPPUNIT_TEST(testCondCopyPaste);
CPPUNIT_TEST(testIconSet);
CPPUNIT_TEST(testImportStream);
More information about the Libreoffice-commits
mailing list