summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHenry Castro <hcvcastro@gmail.com>2015-03-06 13:51:25 -0400
committerAndras Timar <andras.timar@collabora.com>2015-03-09 09:38:51 +0000
commit097a16b59884c777f724cec6c5d42734974ed44b (patch)
tree81f6830bf415cc1602c99d29ca026436e106fa6e
parente697d9694a62b2943fa19b0fcd19e9b3354f6ad7 (diff)
Resolves tdf#80137 Paste array formula into range pastes as non-array formula
Change-Id: I500008b32e5af07702b76afb901a3ec270453462 Reviewed-on: https://gerrit.libreoffice.org/14770 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Andras Timar <andras.timar@collabora.com>
-rw-r--r--sc/qa/unit/ucalc.cxx68
-rw-r--r--sc/qa/unit/ucalc.hxx4
-rw-r--r--sc/source/core/data/column4.cxx2
3 files changed, 72 insertions, 2 deletions
diff --git a/sc/qa/unit/ucalc.cxx b/sc/qa/unit/ucalc.cxx
index 330ff68982f1..2f11f48ef24f 100644
--- a/sc/qa/unit/ucalc.cxx
+++ b/sc/qa/unit/ucalc.cxx
@@ -1,4 +1,3 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
@@ -6311,6 +6310,73 @@ void Test::testSetStringAndNote()
m_pDoc->DeleteTab(0);
}
+void Test::testCopyPasteMatrixFormula()
+{
+ m_pDoc->InsertTab(0, "hcv");
+
+ // Set Values to B1, C1, D1
+ m_pDoc->SetValue(ScAddress(1,0,0), 2.0); // B1
+ m_pDoc->SetValue(ScAddress(2,0,0), 5.0); // C1
+ m_pDoc->SetValue(ScAddress(3,0,0), 3.0); // D1
+
+ // Set Values to B2, C2
+ m_pDoc->SetString(ScAddress(1,1,0), "B2"); // B2
+ //m_pDoc->SetString(ScAddress(2,1,0), "C2"); // C2
+ m_pDoc->SetString(ScAddress(3,1,0), "D2"); // D2
+
+ // Set Vallues to D3
+ //m_pDoc->SetValue(ScAddress(1,2,0), 9.0); // B3
+ //m_pDoc->SetString(ScAddress(2,2,0), "C3"); // C3
+ m_pDoc->SetValue(ScAddress(3,2,0), 11.0); // D3
+
+ // Insert matrix formula to A1
+ ScMarkData aMark;
+ aMark.SelectOneTable(0);
+ m_pDoc->InsertMatrixFormula(0, 0, 0, 0, aMark, "=COUNTIF(ISBLANK(B1:D1);TRUE())");
+ m_pDoc->CalcAll();
+ // A1 should containg 0
+ CPPUNIT_ASSERT_EQUAL( 0.0, m_pDoc->GetValue(ScAddress(0,0,0)) ); // A1
+
+ // Copy cell A1 to clipboard.
+ ScAddress aPos(0,0,0); // A1
+ ScDocument aClipDoc(SCDOCMODE_CLIP);
+ ScClipParam aParam(aPos, false);
+ m_pDoc->CopyToClip(aParam, &aClipDoc, &aMark);
+ // Formula string should be equal.
+ CPPUNIT_ASSERT_EQUAL(m_pDoc->GetString(aPos), aClipDoc.GetString(aPos));
+
+ // First try single range.
+ // Paste matrix formula to A2
+ pasteFromClip(m_pDoc, ScRange(0,1,0,0,1,0), &aClipDoc); // A2
+ // A2 Cell value should contain 1.0
+ CPPUNIT_ASSERT_EQUAL( 1.0, m_pDoc->GetValue(ScAddress(0,1,0)));
+
+ // Paste matrix formula to A3
+ pasteFromClip(m_pDoc, ScRange(0,2,0,0,2,0), &aClipDoc); // A3
+ // A3 Cell value should contain 2.0
+ CPPUNIT_ASSERT_EQUAL( 2.0, m_pDoc->GetValue(ScAddress(0,2,0)));
+
+ // Paste matrix formula to A4
+ pasteFromClip(m_pDoc, ScRange(0,3,0,0,3,0), &aClipDoc); // A4
+ // A4 Cell value should contain 3.0
+ CPPUNIT_ASSERT_EQUAL( 3.0, m_pDoc->GetValue(ScAddress(0,3,0)));
+
+ // Clear cell A2:A4
+ clearRange(m_pDoc, ScRange(0,1,0,0,3,0));
+
+ // Paste matrix formula to range A2:A4
+ pasteFromClip(m_pDoc, ScRange(0,1,0,0,3,0), &aClipDoc); // A2:A4
+
+ // A2 Cell value should contain 1.0
+ CPPUNIT_ASSERT_EQUAL( 1.0, m_pDoc->GetValue(ScAddress(0,1,0)));
+ // A3 Cell value should contain 2.0
+ CPPUNIT_ASSERT_EQUAL( 2.0, m_pDoc->GetValue(ScAddress(0,2,0)));
+ // A4 Cell value should contain 3.0
+ CPPUNIT_ASSERT_EQUAL( 3.0, m_pDoc->GetValue(ScAddress(0,3,0)));
+
+ m_pDoc->DeleteTab(0);
+}
+
ScDocShell* Test::findLoadedDocShellByName(const OUString& rName)
{
TypeId aType(TYPE(ScDocShell));
diff --git a/sc/qa/unit/ucalc.hxx b/sc/qa/unit/ucalc.hxx
index d9f1e5807294..66d281752a45 100644
--- a/sc/qa/unit/ucalc.hxx
+++ b/sc/qa/unit/ucalc.hxx
@@ -424,6 +424,9 @@ public:
void testColumnFindEditCells();
void testSetStringAndNote();
+ // tdf#80137
+ void testCopyPasteMatrixFormula();
+
CPPUNIT_TEST_SUITE(Test);
#if CALC_TEST_PERF
CPPUNIT_TEST(testPerf);
@@ -627,6 +630,7 @@ public:
CPPUNIT_TEST(testFormulaToValue2);
CPPUNIT_TEST(testColumnFindEditCells);
CPPUNIT_TEST(testSetStringAndNote);
+ CPPUNIT_TEST(testCopyPasteMatrixFormula);
CPPUNIT_TEST_SUITE_END();
private:
diff --git a/sc/source/core/data/column4.cxx b/sc/source/core/data/column4.cxx
index ee64aa0add97..d8c10abcc49e 100644
--- a/sc/source/core/data/column4.cxx
+++ b/sc/source/core/data/column4.cxx
@@ -516,7 +516,7 @@ void ScColumn::CloneFormulaCell(
xGroup->compileCode(*pDocument, aPos, pDocument->GetGrammar());
for (size_t i = 0; i < nLen; ++i, aPos.IncRow())
{
- ScFormulaCell* pCell = new ScFormulaCell(pDocument, aPos, xGroup);
+ ScFormulaCell* pCell = new ScFormulaCell(pDocument, aPos, xGroup, pDocument->GetGrammar(), rSrc.GetMatrixFlag());
if (i == 0)
{
xGroup->mpTopCell = pCell;