external data: add merge column transformation

Change-Id: I112650bbb0ed279b386389e7df6b372bde080b62
Reviewed-on: https://gerrit.libreoffice.org/41157
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Markus Mohrhard <markus.mohrhard@googlemail.com>
diff --git a/sc/qa/unit/datatransformation_test.cxx b/sc/qa/unit/datatransformation_test.cxx
index bcd8c9a..785b702 100644
--- a/sc/qa/unit/datatransformation_test.cxx
+++ b/sc/qa/unit/datatransformation_test.cxx
@@ -30,10 +30,12 @@ public:

    void testColumnRemove();
    void testColumnSplit();
    void testColumnMerge();

    CPPUNIT_TEST_SUITE(ScDataTransformationTest);
    CPPUNIT_TEST(testColumnRemove);
    CPPUNIT_TEST(testColumnSplit);
    CPPUNIT_TEST(testColumnMerge);
    CPPUNIT_TEST_SUITE_END();

private:
@@ -95,6 +97,32 @@ void ScDataTransformationTest::testColumnSplit()
    CPPUNIT_ASSERT_EQUAL(OUString("Test2,Test3"), m_pDoc->GetString(3, 3, 0));
}

void ScDataTransformationTest::testColumnMerge()
{
    m_pDoc->SetString(2, 0, 0, "Berlin");
    m_pDoc->SetString(2, 1, 0, "Brussels");
    m_pDoc->SetString(2, 2, 0, "Paris");
    m_pDoc->SetString(2, 3, 0, "Peking");

    m_pDoc->SetString(4, 0, 0, "Germany");
    m_pDoc->SetString(4, 1, 0, "Belgium");
    m_pDoc->SetString(4, 2, 0, "France");
    m_pDoc->SetString(4, 3, 0, "China");

    sc::MergeColumnTransformation aTransform(2, 4, ", ");
    aTransform.Transform(*m_pDoc);

    CPPUNIT_ASSERT_EQUAL(OUString("Berlin, Germany"), m_pDoc->GetString(2, 0, 0));
    CPPUNIT_ASSERT_EQUAL(OUString("Brussels, Belgium"), m_pDoc->GetString(2, 1, 0));
    CPPUNIT_ASSERT_EQUAL(OUString("Paris, France"), m_pDoc->GetString(2, 2, 0));
    CPPUNIT_ASSERT_EQUAL(OUString("Peking, China"), m_pDoc->GetString(2, 3, 0));

    for (SCROW nRow = 0; nRow <= 3; ++nRow)
    {
        CPPUNIT_ASSERT(m_pDoc->GetString(4, nRow, 0).isEmpty());
    }
}

ScDataTransformationTest::ScDataTransformationTest() :
    ScBootstrapFixture( "/sc/qa/unit/data/dataprovider" ),
    m_pDoc(nullptr)
diff --git a/sc/source/ui/dataprovider/datatransformation.cxx b/sc/source/ui/dataprovider/datatransformation.cxx
index e5e65dc..2c2fe72 100644
--- a/sc/source/ui/dataprovider/datatransformation.cxx
+++ b/sc/source/ui/dataprovider/datatransformation.cxx
@@ -68,6 +68,29 @@ void SplitColumnTransformation::Transform(ScDocument& rDoc)
    }
}

MergeColumnTransformation::MergeColumnTransformation(SCCOL nCol1, SCCOL nCol2, const OUString& rMergeString):
    mnCol1(nCol1),
    mnCol2(nCol2),
    maMergeString(rMergeString)
{
}

void MergeColumnTransformation::Transform(ScDocument& rDoc)
{
    SCROW nEndRow1 = getLastRow(rDoc, mnCol1);
    SCROW nEndRow2 = getLastRow(rDoc, mnCol2);
    SCROW nEndRow = std::max(nEndRow1, nEndRow2);

    for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
    {
        OUString aStr1 = rDoc.GetString(mnCol1, nRow, 0);
        OUString aStr2 = rDoc.GetString(mnCol2, nRow, 0);
        rDoc.SetString(mnCol1, nRow, 0, aStr1 + maMergeString + aStr2);
    }

    rDoc.DeleteCol(0, 0, MAXROW, 0, mnCol2, 1);
}

}

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/ui/inc/datatransformation.hxx b/sc/source/ui/inc/datatransformation.hxx
index 4cb55e7..09c677b 100644
--- a/sc/source/ui/inc/datatransformation.hxx
+++ b/sc/source/ui/inc/datatransformation.hxx
@@ -53,6 +53,18 @@ public:
    virtual void Transform(ScDocument& rDoc) override;
};

class SC_DLLPUBLIC MergeColumnTransformation : public DataTransformation
{
    SCCOL mnCol1;
    SCCOL mnCol2;
    OUString maMergeString;

public:

    MergeColumnTransformation(SCCOL nCol1, SCCOL nCol2, const OUString& rMergeString);
    virtual void Transform(ScDocument& rDoc) override;
};

}

#endif