include/xmloff/xmltoken.hxx                      |    8 ++
 sc/source/filter/xml/xmlexprt.cxx                |   81 +++++++++++++++++++++++
 sc/source/filter/xml/xmlexprt.hxx                |    3 
 sc/source/ui/dataprovider/datatransformation.cxx |   50 ++++++++++++++
 sc/source/ui/inc/datatransformation.hxx          |   22 +++++-
 xmloff/source/core/xmltoken.cxx                  |    7 +
 xmloff/source/token/tokens.txt                   |    7 +
 7 files changed, 176 insertions(+), 2 deletions(-)

New commits:
commit cb875f3ef1aa14b931131c4c0ddc595e3841273d
Author: Vikas <vikasmaha...@gmail.com>
Date:   Fri Jun 29 13:52:02 2018 +0530

    Export data transformations to odf
    
    Change-Id: Ie36aef4a4ee550a1bb5407305f13726d55eeea58
    Reviewed-on: https://gerrit.libreoffice.org/56665
    Tested-by: Jenkins
    Reviewed-by: Markus Mohrhard <markus.mohrh...@googlemail.com>

diff --git a/include/xmloff/xmltoken.hxx b/include/xmloff/xmltoken.hxx
index 5a1cd6157887..862741d0a0eb 100644
--- a/include/xmloff/xmltoken.hxx
+++ b/include/xmloff/xmltoken.hxx
@@ -3278,6 +3278,14 @@ namespace xmloff { namespace token {
         XML_DATA_MAPPINGS,
         XML_DATA_MAPPING,
         XML_DATA_FREQUENCY,
+        XML_DATA_TRANSFORMATIONS,
+        XML_COLUMN_REMOVE_TRANSFORMATION,
+        XML_COLUMN_SPLIT_TRANSFORMATION,
+        XML_COLUMN_MERGE_TRANSFORMATION,
+        XML_COLUMN_SORT_TRANSFORMATION,
+        XML_SORT_PARAM,
+        XML_MERGE_STRING,
+        //Already defined XML_SEPARATOR,
 
         // regina, ODF1.2 additional symbols in charts
         XML_STAR,
diff --git a/sc/source/filter/xml/xmlexprt.cxx 
b/sc/source/filter/xml/xmlexprt.cxx
index bcfe73fe22d8..58d0e197b975 100644
--- a/sc/source/filter/xml/xmlexprt.cxx
+++ b/sc/source/filter/xml/xmlexprt.cxx
@@ -159,6 +159,8 @@
 #include <vector>
 #include <vbahelper/vbaaccesshelper.hxx>
 
+
+
 //! not found in unonames.hxx
 #define SC_LAYERID "LayerID"
 
@@ -4061,6 +4063,7 @@ void ScXMLExport::WriteExternalDataMapping()
 
     sc::ExternalDataMapper& rDataMapper = pDoc->GetExternalDataMapper();
     auto& rDataSources = rDataMapper.getDataSources();
+
     if (!rDataSources.empty())
     {
         SvXMLElementExport aMappings(*this, XML_NAMESPACE_CALC_EXT, 
XML_DATA_MAPPINGS, true, true);
@@ -4071,11 +4074,89 @@ void ScXMLExport::WriteExternalDataMapping()
             AddAttribute(XML_NAMESPACE_CALC_EXT, XML_DATA_FREQUENCY, 
OUString::number(itr.getUpdateFrequency()));
             AddAttribute(XML_NAMESPACE_CALC_EXT, XML_ID, itr.getID());
             AddAttribute(XML_NAMESPACE_CALC_EXT, XML_DATABASE_NAME, 
itr.getDBName());
+
+            // Add the data transformations
+            WriteExternalDataTransformations(itr.getDataTransformation());
+
             SvXMLElementExport aMapping(*this, XML_NAMESPACE_CALC_EXT, 
XML_DATA_MAPPING, true, true);
         }
     }
 }
 
+void ScXMLExport::WriteExternalDataTransformations(const 
std::vector<std::shared_ptr<sc::DataTransformation>>& aDataTransformations)
+{
+    SvXMLElementExport aTransformations(*this, XML_NAMESPACE_CALC_EXT, 
XML_DATA_TRANSFORMATIONS, true, true);
+    for (auto& itr : aDataTransformations)
+    {
+        sc::TransformationType aTransformationType = 
itr->getTransformationType();
+
+        switch(aTransformationType)
+        {
+            case sc::TransformationType::DELETE_TRANSFORMATION:
+            {
+                // Delete Columns Transformation
+                std::shared_ptr<sc::ColumnRemoveTransformation> 
aDeleteTransformation = 
std::dynamic_pointer_cast<sc::ColumnRemoveTransformation>(itr);
+                std::set<SCCOL> aColumns = aDeleteTransformation->getColumns();
+                SvXMLElementExport aTransformation(*this, 
XML_NAMESPACE_CALC_EXT, XML_COLUMN_REMOVE_TRANSFORMATION, true, true);
+                for(auto& col : aColumns)
+                {
+                    // Add Columns
+                    AddAttribute(XML_NAMESPACE_CALC_EXT, XML_COLUMN, 
OUString::number(col));
+                    SvXMLElementExport aCol(*this, XML_NAMESPACE_CALC_EXT, 
XML_COLUMN, true, true);
+                }
+            }
+            break;
+            case sc::TransformationType::SPLIT_TRANSFORMATION:
+            {
+                std::shared_ptr<sc::SplitColumnTransformation> 
aSplitTransformation = 
std::dynamic_pointer_cast<sc::SplitColumnTransformation>(itr);
+
+                AddAttribute(XML_NAMESPACE_CALC_EXT, XML_COLUMN, 
OUString::number(aSplitTransformation->getColumn()));
+                AddAttribute(XML_NAMESPACE_CALC_EXT, XML_SEPARATOR, 
OUString::number(aSplitTransformation->getSeparator()));
+                SvXMLElementExport aTransformation(*this, 
XML_NAMESPACE_CALC_EXT, XML_COLUMN_SPLIT_TRANSFORMATION, true, true);
+            }
+            break;
+            case sc::TransformationType::MERGE_TRANSFORMATION:
+            {
+                // Merge Transformation
+                std::shared_ptr<sc::MergeColumnTransformation> 
aMergeTransformation = 
std::dynamic_pointer_cast<sc::MergeColumnTransformation>(itr);
+                std::set<SCCOL> aColumns = aMergeTransformation->getColumns();
+
+                AddAttribute(XML_NAMESPACE_CALC_EXT, XML_MERGE_STRING, 
aMergeTransformation->getMergeString());
+                SvXMLElementExport aTransformation(*this, 
XML_NAMESPACE_CALC_EXT, XML_COLUMN_MERGE_TRANSFORMATION, true, true);
+
+                for(auto& col : aColumns)
+                {
+                    // Columns
+                    AddAttribute(XML_NAMESPACE_CALC_EXT, XML_COLUMN, 
OUString::number(col));
+                    SvXMLElementExport aCol(*this, XML_NAMESPACE_CALC_EXT, 
XML_COLUMN, true, true);
+                }
+            }
+            break;
+            case sc::TransformationType::SORT_TRANSFORMATION:
+            {
+                // Sort Transformation
+                std::shared_ptr<sc::SortTransformation> aSortTransformation = 
std::dynamic_pointer_cast<sc::SortTransformation>(itr);
+                ScSortParam aSortParam = aSortTransformation->getSortParam();
+                const sc::DocumentLinkManager& rMgr = 
pDoc->GetDocLinkManager();
+                const sc::DataStream* pStrm = rMgr.getDataStream();
+                if (!pStrm)
+                    // No data stream.
+                    return;
+
+                // Streamed range
+                ScRange aRange = pStrm->GetRange();
+
+                SvXMLElementExport aTransformation(*this, 
XML_NAMESPACE_CALC_EXT, XML_COLUMN_SORT_TRANSFORMATION, true, true);
+
+                writeSort(*this, aSortParam, aRange, pDoc);
+            }
+            break;
+            default:
+            break;
+        }
+    }
+}
+
 void ScXMLExport::WriteDataStream()
 {
     if (!pDoc)
diff --git a/sc/source/filter/xml/xmlexprt.hxx 
b/sc/source/filter/xml/xmlexprt.hxx
index 6107aa86d102..e0eeea036dc7 100644
--- a/sc/source/filter/xml/xmlexprt.hxx
+++ b/sc/source/filter/xml/xmlexprt.hxx
@@ -30,6 +30,8 @@
 #include <memory>
 #include <unordered_map>
 
+#include <datatransformation.hxx>
+
 
 namespace com { namespace sun { namespace star {
     namespace beans { class XPropertySet; }
@@ -196,6 +198,7 @@ class ScXMLExport : public SvXMLExport
     void WriteLabelRanges( const css::uno::Reference< 
css::container::XIndexAccess >& xRangesIAccess, bool bColumn );
     void WriteNamedExpressions();
     void WriteExternalDataMapping();
+    void WriteExternalDataTransformations(const 
std::vector<std::shared_ptr<sc::DataTransformation>>& aDataTransformations);
     void WriteDataStream();
     void WriteNamedRange(ScRangeName* pRangeName);
     void ExportConditionalFormat(SCTAB nTab);
diff --git a/sc/source/ui/dataprovider/datatransformation.cxx 
b/sc/source/ui/dataprovider/datatransformation.cxx
index bbb9bd068c7f..09370a8e82c7 100644
--- a/sc/source/ui/dataprovider/datatransformation.cxx
+++ b/sc/source/ui/dataprovider/datatransformation.cxx
@@ -43,6 +43,16 @@ void ColumnRemoveTransformation::Transform(ScDocument& rDoc) 
const
     }
 }
 
+TransformationType ColumnRemoveTransformation::getTransformationType() const
+{
+    return TransformationType::DELETE_TRANSFORMATION;
+}
+
+std::set<SCCOL> ColumnRemoveTransformation::getColumns() const
+{
+    return maColumns;
+}
+
 SplitColumnTransformation::SplitColumnTransformation(SCCOL nCol, sal_Unicode 
cSeparator):
     mnCol(nCol),
     mcSeparator(cSeparator)
@@ -71,6 +81,21 @@ void SplitColumnTransformation::Transform(ScDocument& rDoc) 
const
     }
 }
 
+TransformationType SplitColumnTransformation::getTransformationType() const
+{
+    return TransformationType::SPLIT_TRANSFORMATION;
+}
+
+SCCOL SplitColumnTransformation::getColumn() const
+{
+    return mnCol;
+}
+
+sal_Unicode SplitColumnTransformation::getSeparator() const
+{
+    return mcSeparator;
+}
+
 MergeColumnTransformation::MergeColumnTransformation(const std::set<SCCOL>& 
rColumns, const OUString& rMergeString):
     maColumns(rColumns),
     maMergeString(rMergeString)
@@ -113,6 +138,21 @@ void MergeColumnTransformation::Transform(ScDocument& 
rDoc) const
     }
 }
 
+TransformationType MergeColumnTransformation::getTransformationType() const
+{
+    return TransformationType::MERGE_TRANSFORMATION;
+}
+
+OUString MergeColumnTransformation::getMergeString() const
+{
+    return maMergeString;
+}
+
+std::set<SCCOL> MergeColumnTransformation::getColumns() const
+{
+    return maColumns;
+}
+
 SortTransformation::SortTransformation(const ScSortParam& rSortParam):
     maSortParam(rSortParam)
 {
@@ -123,6 +163,16 @@ void SortTransformation::Transform(ScDocument& rDoc) const
     rDoc.Sort(0, maSortParam, false, false, nullptr, nullptr);
 }
 
+TransformationType SortTransformation::getTransformationType() const
+{
+    return TransformationType::SORT_TRANSFORMATION;
+}
+
+ScSortParam SortTransformation::getSortParam() const
+{
+    return maSortParam;
+}
+
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/ui/inc/datatransformation.hxx 
b/sc/source/ui/inc/datatransformation.hxx
index 251397ca8304..8dbae9600384 100644
--- a/sc/source/ui/inc/datatransformation.hxx
+++ b/sc/source/ui/inc/datatransformation.hxx
@@ -21,6 +21,14 @@ class ScDocument;
 
 namespace sc {
 
+enum class TransformationType
+{
+    MERGE_TRANSFORMATION,
+    SPLIT_TRANSFORMATION,
+    DELETE_TRANSFORMATION,
+    SORT_TRANSFORMATION
+};
+
 class SC_DLLPUBLIC DataTransformation
 {
 protected:
@@ -32,6 +40,8 @@ public:
 
     virtual void Transform(ScDocument& rDoc) const = 0;
 
+    virtual TransformationType getTransformationType() const = 0;
+
 };
 
 class SC_DLLPUBLIC ColumnRemoveTransformation : public DataTransformation
@@ -42,8 +52,9 @@ public:
 
     ColumnRemoveTransformation(const std::set<SCCOL>& rColumns);
     virtual ~ColumnRemoveTransformation() override;
-
     virtual void Transform(ScDocument& rDoc) const override;
+    virtual TransformationType getTransformationType() const override;
+    std::set<SCCOL> getColumns() const;
 };
 
 class SC_DLLPUBLIC SplitColumnTransformation : public DataTransformation
@@ -55,6 +66,9 @@ public:
 
     SplitColumnTransformation(SCCOL nCol, sal_Unicode cSeparator);
     virtual void Transform(ScDocument& rDoc) const override;
+    virtual TransformationType getTransformationType() const override;
+    SCCOL getColumn() const;
+    sal_Unicode getSeparator() const;
 };
 
 class SC_DLLPUBLIC MergeColumnTransformation : public DataTransformation
@@ -66,6 +80,9 @@ public:
 
     MergeColumnTransformation(const std::set<SCCOL>& rColumns, const OUString& 
rMergeString);
     virtual void Transform(ScDocument& rDoc) const  override;
+    virtual TransformationType getTransformationType() const override;
+    OUString getMergeString() const;
+    std::set<SCCOL> getColumns() const;
 };
 
 class SC_DLLPUBLIC SortTransformation : public DataTransformation
@@ -74,8 +91,9 @@ class SC_DLLPUBLIC SortTransformation : public 
DataTransformation
 public:
 
     SortTransformation(const ScSortParam& rParam);
-
     virtual void Transform(ScDocument& rDoc) const override;
+    virtual TransformationType getTransformationType() const override;
+    ScSortParam getSortParam() const;
 };
 
 }
diff --git a/xmloff/source/core/xmltoken.cxx b/xmloff/source/core/xmltoken.cxx
index d9e221bf34b2..f32309b3e1a1 100644
--- a/xmloff/source/core/xmltoken.cxx
+++ b/xmloff/source/core/xmltoken.cxx
@@ -3274,6 +3274,13 @@ namespace xmloff { namespace token {
         TOKEN( "data-mappings", XML_DATA_MAPPINGS),
         TOKEN( "data-mapping", XML_DATA_MAPPING),
         TOKEN( "frequency", XML_DATA_FREQUENCY),
+        TOKEN( "data-transformations", XML_DATA_TRANSFORMATIONS),
+        TOKEN( "column-remove-transformation", 
XML_COLUMN_REMOVE_TRANSFORMATION),
+        TOKEN( "column-split-transformation", XML_COLUMN_SPLIT_TRANSFORMATION),
+        TOKEN( "column-merge-transformation", XML_COLUMN_MERGE_TRANSFORMATION),
+        TOKEN( "column-sort-transformation", XML_COLUMN_SORT_TRANSFORMATION),
+        TOKEN( "sort-param", XML_SORT_PARAM ),
+        TOKEN( "merge-string", XML_MERGE_STRING ),
 
         // regina, ODF1.2 additional symbols in charts
         TOKEN( "star",                         XML_STAR ),
diff --git a/xmloff/source/token/tokens.txt b/xmloff/source/token/tokens.txt
index 095b21a8c46f..63e8b99015ab 100644
--- a/xmloff/source/token/tokens.txt
+++ b/xmloff/source/token/tokens.txt
@@ -3055,6 +3055,13 @@ provider
 data-mappings
 data-mapping
 frequency
+data-transformations
+column-remove-transformation
+column-split-transformation
+column-merge-transformation
+column-sort-transformation
+sort-param
+merge-string
 star
 asterisk
 horizontal-bar
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to