include/xmloff/xmltoken.hxx                                 |    1 
 sc/qa/unit/ThemeImportExportTest.cxx                        |   12 ++
 sc/source/filter/xml/xmlstyle.cxx                           |   51 +++++++++---
 sc/source/filter/xml/xmlstyli.cxx                           |    9 ++
 schema/libreoffice/OpenDocument-v1.3+libreoffice-schema.rng |   17 ++++
 xmloff/source/core/xmltoken.cxx                             |    1 
 xmloff/source/token/tokens.txt                              |    1 
 7 files changed, 80 insertions(+), 12 deletions(-)

New commits:
commit f47b0920f1add470a7c54845768e83dce2427eab
Author:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
AuthorDate: Tue Jul 18 13:23:29 2023 +0900
Commit:     Tomaž Vajngerl <qui...@gmail.com>
CommitDate: Wed Jul 19 03:01:40 2023 +0200

    sc: ODF import/export of background cell complex color
    
    Change-Id: Idf526aea21ccfeda9b03d1fb69588f120b6e161d
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/154571
    Tested-by: Jenkins
    Reviewed-by: Tomaž Vajngerl <qui...@gmail.com>
    (cherry picked from commit dceeb9550dfd4e40e93180b7e10f2539b594529f)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/154549

diff --git a/include/xmloff/xmltoken.hxx b/include/xmloff/xmltoken.hxx
index ef3725868aba..09b1cc39e9bf 100644
--- a/include/xmloff/xmltoken.hxx
+++ b/include/xmloff/xmltoken.hxx
@@ -311,6 +311,7 @@ namespace xmloff::token {
         XML_BACKFACE_CULLING,
         XML_BACKGROUND,
         XML_BACKGROUND_COLOR,
+        XML_BACKGROUND_COMPLEX_COLOR,
         XML_BACKGROUND_IMAGE,
         XML_BACKGROUND_NO_REPEAT,
         XML_BAR,
diff --git a/sc/qa/unit/ThemeImportExportTest.cxx 
b/sc/qa/unit/ThemeImportExportTest.cxx
index b7dcce552d4d..9164d41668f1 100644
--- a/sc/qa/unit/ThemeImportExportTest.cxx
+++ b/sc/qa/unit/ThemeImportExportTest.cxx
@@ -134,7 +134,7 @@ void checkCellBackgroundThemeColor(ScDocument* pDoc)
     }
 }
 
-CPPUNIT_TEST_FIXTURE(ThemeImportExportTest, testCellBackgroundThemeColor)
+CPPUNIT_TEST_FIXTURE(ThemeImportExportTest, testCellBackgroundThemeColorOOXML)
 {
     loadFromURL(u"xlsx/Test_ThemeColor_Text_Background_Border.xlsx");
     checkCellBackgroundThemeColor(getScDoc());
@@ -142,6 +142,16 @@ CPPUNIT_TEST_FIXTURE(ThemeImportExportTest, 
testCellBackgroundThemeColor)
     checkCellBackgroundThemeColor(getScDoc());
 }
 
+CPPUNIT_TEST_FIXTURE(ThemeImportExportTest, testCellBackgroundThemeColorODF)
+{
+    // Open the OOXML source
+    loadFromURL(u"xlsx/Test_ThemeColor_Text_Background_Border.xlsx");
+    // Save as ODF and load again - checks import / export cycle
+    saveAndReload("calc8");
+    // Check the values and show that the document is unchanged and all the 
data preserved
+    checkCellBackgroundThemeColor(getScDoc());
+}
+
 void checkCellTextThemeColor(ScDocument* pDoc)
 {
     // B1
diff --git a/sc/source/filter/xml/xmlstyle.cxx 
b/sc/source/filter/xml/xmlstyle.cxx
index f434432c7671..bb38d305b9a3 100644
--- a/sc/source/filter/xml/xmlstyle.cxx
+++ b/sc/source/filter/xml/xmlstyle.cxx
@@ -29,6 +29,10 @@
 #include <xmloff/families.hxx>
 #include <xmloff/contextid.hxx>
 #include <xmloff/txtprmap.hxx>
+#include <xmloff/XMLComplexColorHandler.hxx>
+#include <xmloff/XMLComplexColorExport.hxx>
+#include <docmodel/color/ComplexColor.hxx>
+#include <docmodel/uno/UnoComplexColor.hxx>
 #include <sax/tools/converter.hxx>
 #include <com/sun/star/util/CellProtection.hpp>
 #include <com/sun/star/table/CellOrientation.hpp>
@@ -36,6 +40,7 @@
 #include <com/sun/star/table/CellHoriJustify.hpp>
 #include <com/sun/star/table/CellJustifyMethod.hpp>
 #include <com/sun/star/table/BorderLine2.hpp>
+#include <com/sun/star/util/XComplexColor.hpp>
 #include <com/sun/star/sheet/XSheetConditionalEntry.hpp>
 #include <com/sun/star/sheet/XSheetCondition.hpp>
 #include <com/sun/star/beans/XPropertySet.hpp>
@@ -63,6 +68,7 @@ const XMLPropertyMapEntry aXMLScCellStylesProperties[] =
     MAP( SC_UNONAME_BOTTBORDER, XML_NAMESPACE_FO, XML_BORDER_BOTTOM, 
XML_TYPE_PROP_TABLE_CELL|XML_TYPE_BORDER, CTF_SC_BOTTOMBORDER ),
     MAP( SC_UNONAME_BOTTBORDER, XML_NAMESPACE_STYLE, 
XML_BORDER_LINE_WIDTH_BOTTOM, XML_TYPE_PROP_TABLE_CELL|XML_TYPE_BORDER_WIDTH, 
CTF_SC_BOTTOMBORDERWIDTH ),
     MAP( SC_UNONAME_CELLBACK, XML_NAMESPACE_FO, XML_BACKGROUND_COLOR, 
XML_TYPE_PROP_TABLE_CELL|XML_TYPE_COLORTRANSPARENT|MID_FLAG_MULTI_PROPERTY|MID_FLAG_MERGE_ATTRIBUTE,
 0 ),
+    MAP_EXT( SC_UNONAME_CELL_BACKGROUND_COMPLEX_COLOR, XML_NAMESPACE_LO_EXT, 
XML_BACKGROUND_COMPLEX_COLOR, 
XML_TYPE_PROP_TABLE_CELL|XML_TYPE_COMPLEX_COLOR|MID_FLAG_ELEMENT_ITEM, 
CTF_COMPLEX_COLOR),
     MAP( SC_UNONAME_CELLPRO, XML_NAMESPACE_STYLE, XML_CELL_PROTECT, 
XML_TYPE_PROP_TABLE_CELL|XML_SC_TYPE_CELLPROTECTION|MID_FLAG_MERGE_PROPERTY, 0 
),
     MAP( SC_UNONAME_CELLPRO, XML_NAMESPACE_STYLE, XML_PRINT_CONTENT, 
XML_TYPE_PROP_TABLE_CELL|XML_SC_TYPE_PRINTCONTENT|MID_FLAG_MERGE_PROPERTY, 0 ),
     MAP( SC_UNONAME_CELLSTYL, XML_NAMESPACE_STYLE, XML_STYLE, 
XML_TYPE_PROP_TABLE_CELL|XML_TYPE_STRING, CTF_SC_CELLSTYLE ),
@@ -130,6 +136,7 @@ const XMLPropertyMapEntry aXMLScRowStylesImportProperties[] 
=
     MAP( SC_UNONAME_CELLBACK, XML_NAMESPACE_FO, XML_BACKGROUND_COLOR, 
XML_TYPE_PROP_TABLE_ROW|XML_TYPE_COLORTRANSPARENT|MID_FLAG_MULTI_PROPERTY|MID_FLAG_MERGE_ATTRIBUTE,
 0 ),
     MAP( SC_UNONAME_CELLHGT, XML_NAMESPACE_STYLE, XML_ROW_HEIGHT, 
XML_TYPE_PROP_TABLE_ROW|XML_TYPE_MEASURE, CTF_SC_ROWHEIGHT),
     MAP( SC_UNONAME_CELLTRAN, XML_NAMESPACE_FO, XML_BACKGROUND_COLOR, 
XML_TYPE_PROP_TABLE_ROW|XML_TYPE_ISTRANSPARENT|MID_FLAG_MULTI_PROPERTY|MID_FLAG_MERGE_ATTRIBUTE,
 0 ),
+    MAP_EXT( SC_UNONAME_CELL_BACKGROUND_COMPLEX_COLOR, XML_NAMESPACE_LO_EXT, 
XML_BACKGROUND_COMPLEX_COLOR, XML_TYPE_PROP_TABLE_ROW|XML_TYPE_COMPLEX_COLOR, 
CTF_COMPLEX_COLOR ),
     MAP( SC_UNONAME_MANPAGE, XML_NAMESPACE_FO, XML_BREAK_BEFORE, 
XML_TYPE_PROP_TABLE_ROW|XML_SC_TYPE_BREAKBEFORE, CTF_SC_ROWBREAKBEFORE),
     MAP( SC_UNONAME_OHEIGHT, XML_NAMESPACE_STYLE, XML_USE_OPTIMAL_ROW_HEIGHT, 
XML_TYPE_PROP_TABLE_ROW|XML_TYPE_BOOL, CTF_SC_ROWOPTIMALHEIGHT),
     MAP_END()
@@ -160,6 +167,7 @@ const XMLPropertyMapEntry 
aXMLScTableStylesImportProperties[] =
 
     MAP( SC_UNONAME_CELLBACK, XML_NAMESPACE_FO, XML_BACKGROUND_COLOR, 
XML_TYPE_PROP_TABLE|XML_TYPE_COLORTRANSPARENT|MID_FLAG_MULTI_PROPERTY|MID_FLAG_MERGE_ATTRIBUTE,
 0 ),
     MAP( SC_UNONAME_CELLTRAN, XML_NAMESPACE_FO, XML_BACKGROUND_COLOR, 
XML_TYPE_PROP_TABLE|XML_TYPE_ISTRANSPARENT|MID_FLAG_MULTI_PROPERTY|MID_FLAG_MERGE_ATTRIBUTE,
 0 ),
+    MAP_EXT( SC_UNONAME_CELL_BACKGROUND_COMPLEX_COLOR, XML_NAMESPACE_LO_EXT, 
XML_BACKGROUND_COMPLEX_COLOR, XML_TYPE_PROP_TABLE|XML_TYPE_COMPLEX_COLOR, 
CTF_COMPLEX_COLOR ),
     MAP( SC_UNONAME_CELLVIS, XML_NAMESPACE_TABLE, XML_DISPLAY, 
XML_TYPE_PROP_TABLE|XML_TYPE_BOOL, 0 ),
     MAP( SC_UNONAME_PAGESTL, XML_NAMESPACE_STYLE, XML_MASTER_PAGE_NAME, 
XML_TYPE_PROP_TABLE|XML_TYPE_STRING|MID_FLAG_SPECIAL_ITEM, 
CTF_SC_MASTERPAGENAME ),
     MAP( SC_UNONAME_TABLAYOUT, XML_NAMESPACE_STYLE, XML_WRITING_MODE, 
XML_TYPE_PROP_TABLE|XML_TYPE_TEXT_WRITING_MODE, 0 ),
@@ -522,6 +530,7 @@ void ScXMLCellExportPropertyMapper::handleSpecialItem(
     // the SpecialItem ConditionlaFormat must not be handled by this method
     // the SpecialItem CharBackColor must not be handled by this method
 }
+
 void ScXMLCellExportPropertyMapper::handleElementItem(
             SvXMLExport& rExport,
             const XMLPropertyState& rProperty,
@@ -530,18 +539,33 @@ void ScXMLCellExportPropertyMapper::handleElementItem(
             sal_uInt32 /* nIdx */) const
 {
     sal_uInt32 nContextId = getPropertySetMapper()->GetEntryContextId( 
rProperty.mnIndex );
-    OUString sURL;
-    if ( ( nContextId == CTF_SC_HYPERLINK ) &&
-        ( rProperty.maValue >>= sURL ) &&
-        !sURL.isEmpty() )
+    switch (nContextId)
     {
-        rExport.AddAttribute( XML_NAMESPACE_XLINK, XML_HREF, sURL );
-        rExport.AddAttribute( XML_NAMESPACE_XLINK, XML_TYPE,
-                                      XML_SIMPLE );
-        sal_uInt32 nPropIndex = rProperty.mnIndex;
-        sal_uInt16 nPrefix = getPropertySetMapper()->GetEntryNameSpace( 
nPropIndex );
-        OUString sLocalName = getPropertySetMapper()->GetEntryXMLName( 
nPropIndex );
-        SvXMLElementExport aElem( rExport, nPrefix, sLocalName, true, true );
+        case CTF_SC_HYPERLINK:
+        {
+            OUString sURL;
+            if ((rProperty.maValue >>= sURL) && !sURL.isEmpty())
+            {
+                rExport.AddAttribute( XML_NAMESPACE_XLINK, XML_HREF, sURL );
+                rExport.AddAttribute( XML_NAMESPACE_XLINK, XML_TYPE,
+                                              XML_SIMPLE );
+                sal_uInt32 nPropIndex = rProperty.mnIndex;
+                sal_uInt16 nPrefix = 
getPropertySetMapper()->GetEntryNameSpace( nPropIndex );
+                OUString sLocalName = getPropertySetMapper()->GetEntryXMLName( 
nPropIndex );
+                SvXMLElementExport aElem( rExport, nPrefix, sLocalName, true, 
true );
+            }
+        }
+        break;
+        case CTF_COMPLEX_COLOR:
+        {
+            XMLComplexColorExport aExport(rExport);
+            aExport.exportXML(rProperty.maValue,
+                    
getPropertySetMapper()->GetEntryNameSpace(rProperty.mnIndex),
+                    
getPropertySetMapper()->GetEntryXMLName(rProperty.mnIndex));
+        }
+        break;
+        default:
+            break;
     }
 }
 
@@ -884,6 +908,11 @@ const XMLPropertyHandler* 
XMLScPropHdlFactory::GetPropertyHandler( sal_Int32 nTy
                 pHdl = new XmlScPropHdl_Vertical;
             }
             break;
+            case XML_TYPE_COMPLEX_COLOR:
+            {
+                pHdl = new XMLComplexColorHandler;
+            }
+            break;
         }
 
         if(pHdl)
diff --git a/sc/source/filter/xml/xmlstyli.cxx 
b/sc/source/filter/xml/xmlstyli.cxx
index e15840ed3fe5..84812db9d6ac 100644
--- a/sc/source/filter/xml/xmlstyli.cxx
+++ b/sc/source/filter/xml/xmlstyli.cxx
@@ -28,6 +28,7 @@
 #include <com/sun/star/table/BorderLine2.hpp>
 #include <comphelper/extract.hxx>
 #include <xmloff/xmlprcon.hxx>
+#include <xmloff/XMLComplexColorContext.hxx>
 #include "XMLTableHeaderFooterContext.hxx"
 #include "XMLConverter.hxx"
 #include "XMLTableShapeImportHelper.hxx"
@@ -43,6 +44,10 @@
 #include <conditio.hxx>
 #include <rangelst.hxx>
 
+#include <xmloff/xmltypes.hxx>
+#include <xmloff/contextid.hxx>
+#include <xmloff/txtprmap.hxx>
+
 #define XML_LINE_LEFT 0
 #define XML_LINE_RIGHT 1
 #define XML_LINE_TOP 2
@@ -319,6 +324,10 @@ css::uno::Reference< css::xml::sax::XFastContextHandler > 
XMLTableCellPropsConte
             rProperties.push_back( aProp );
         }
     }
+    else if (nElement == XML_ELEMENT(LO_EXT, XML_BACKGROUND_COMPLEX_COLOR))
+    {
+        return new XMLComplexColorContext(GetImport(), nElement, xAttrList, 
rProp, rProperties);
+    }
     return SvXMLPropertySetContext::createFastChildContext( nElement, 
xAttrList, rProperties, rProp );
 }
 
diff --git a/schema/libreoffice/OpenDocument-v1.3+libreoffice-schema.rng 
b/schema/libreoffice/OpenDocument-v1.3+libreoffice-schema.rng
index 21555a9052ac..64ed884f7de9 100644
--- a/schema/libreoffice/OpenDocument-v1.3+libreoffice-schema.rng
+++ b/schema/libreoffice/OpenDocument-v1.3+libreoffice-schema.rng
@@ -3536,6 +3536,23 @@ 
xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.
     </rng:optional>
   </rng:define>
 
+  <!-- TODO no proposal - Document Themes -->
+  <rng:define name="loext-background-complex-color">
+    <rng:element name="loext:background-complex-color">
+      <rng:ref name="loext-complex-color-attlist"/>
+      <rng:zeroOrMore>
+        <rng:ref name="loext-transformation"/>
+      </rng:zeroOrMore>
+    </rng:element>
+  </rng:define>
+
+  <!-- TODO no proposal - Document Themes-->
+  <rng:define name="style-table-cell-properties-elements" combine="interleave">
+    <rng:optional>
+        <rng:ref name="loext-background-complex-color"/>
+    </rng:optional>
+  </rng:define>
+
   <rng:define name="draw-frame-attlist" combine="interleave">
     <!-- TODO(vmiklos) no proposal for multi-page floating tables -->
     <rng:optional>
diff --git a/xmloff/source/core/xmltoken.cxx b/xmloff/source/core/xmltoken.cxx
index 1e3d0b86faa0..0efe99badab3 100644
--- a/xmloff/source/core/xmltoken.cxx
+++ b/xmloff/source/core/xmltoken.cxx
@@ -323,6 +323,7 @@ namespace xmloff::token {
         TOKEN( "backface-culling",                XML_BACKFACE_CULLING ),
         TOKEN( "background",                      XML_BACKGROUND ),
         TOKEN( "background-color",                XML_BACKGROUND_COLOR ),
+        TOKEN( "background-complex-color",        XML_BACKGROUND_COMPLEX_COLOR 
),
         TOKEN( "background-image",                XML_BACKGROUND_IMAGE ),
         TOKEN( "no-repeat",                       XML_BACKGROUND_NO_REPEAT ),
         TOKEN( "bar",                             XML_BAR ),
diff --git a/xmloff/source/token/tokens.txt b/xmloff/source/token/tokens.txt
index d4fd4c7971c1..9ac9bc4644ba 100644
--- a/xmloff/source/token/tokens.txt
+++ b/xmloff/source/token/tokens.txt
@@ -228,6 +228,7 @@ back-scale
 backface-culling
 background
 background-color
+background-complex-color
 background-image
 no-repeat
 bar

Reply via email to