include/xmloff/xmltoken.hxx                                 |    4 
 sc/qa/unit/ThemeImportExportTest.cxx                        |   10 ++
 sc/source/filter/xml/xmlstyle.cxx                           |    4 
 sc/source/filter/xml/xmlstyli.cxx                           |   45 +++++-----
 schema/libreoffice/OpenDocument-v1.3+libreoffice-schema.rng |   52 ++++++++++++
 xmloff/source/core/xmltoken.cxx                             |    4 
 xmloff/source/token/tokens.txt                              |    4 
 7 files changed, 102 insertions(+), 21 deletions(-)

New commits:
commit bafacd0e9fdca1f87969ef09cc18cb26350d369a
Author:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
AuthorDate: Fri Jul 28 12:10:24 2023 +0200
Commit:     Miklos Vajna <vmik...@collabora.com>
CommitDate: Fri Aug 4 10:18:56 2023 +0200

    sc: Add import/export ODF support for border complex colors
    
    ODF Import and export support for border {left,right,top,bottom}
    complex colors. In addition round-trip test was extended with the
    border use case.
    
    Change-Id: I1d14690272c06e8ffcfcd483eb7f688ca5bb1e5d
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/155014
    Tested-by: Jenkins
    Reviewed-by: Tomaž Vajngerl <qui...@gmail.com>
    (cherry picked from commit 5e34a25aa7f58b37a2303aef9318bbe5a9af5d37)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/155177
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>

diff --git a/include/xmloff/xmltoken.hxx b/include/xmloff/xmltoken.hxx
index 09b1cc39e9bf..7d58b17a0f9a 100644
--- a/include/xmloff/xmltoken.hxx
+++ b/include/xmloff/xmltoken.hxx
@@ -354,15 +354,19 @@ namespace xmloff::token {
         XML_BOOLEAN_VALUE,
         XML_BORDER,
         XML_BORDER_BOTTOM,
+        XML_BORDER_BOTTOM_COMPLEX_COLOR,
         XML_BORDER_COLOR,
         XML_BORDER_LEFT,
+        XML_BORDER_LEFT_COMPLEX_COLOR,
         XML_BORDER_LINE_WIDTH,
         XML_BORDER_LINE_WIDTH_BOTTOM,
         XML_BORDER_LINE_WIDTH_LEFT,
         XML_BORDER_LINE_WIDTH_RIGHT,
         XML_BORDER_LINE_WIDTH_TOP,
         XML_BORDER_RIGHT,
+        XML_BORDER_RIGHT_COMPLEX_COLOR,
         XML_BORDER_TOP,
+        XML_BORDER_TOP_COMPLEX_COLOR,
         XML_BOTH,
         XML_BOTTOM,
         XML_BOTTOM_LEFT,
diff --git a/sc/qa/unit/ThemeImportExportTest.cxx 
b/sc/qa/unit/ThemeImportExportTest.cxx
index 09e4288b8a4f..a0fb408fd4e9 100644
--- a/sc/qa/unit/ThemeImportExportTest.cxx
+++ b/sc/qa/unit/ThemeImportExportTest.cxx
@@ -342,6 +342,16 @@ CPPUNIT_TEST_FIXTURE(ThemeImportExportTest, 
testCellBorderThemeColor)
     checkCellBorderThemeColor(getScDoc());
 }
 
+CPPUNIT_TEST_FIXTURE(ThemeImportExportTest, testCellBorderThemeColorODF)
+{
+    // 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
+    checkCellBorderThemeColor(getScDoc());
+}
+
 } // end anonymous namespace
 
 CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/sc/source/filter/xml/xmlstyle.cxx 
b/sc/source/filter/xml/xmlstyle.cxx
index 9e5fb1598308..ddcdd5440082 100644
--- a/sc/source/filter/xml/xmlstyle.cxx
+++ b/sc/source/filter/xml/xmlstyle.cxx
@@ -67,6 +67,7 @@ const XMLPropertyMapEntry aXMLScCellStylesProperties[] =
     MAP( SC_UNONAME_ASIANVERT, XML_NAMESPACE_STYLE, 
XML_GLYPH_ORIENTATION_VERTICAL, XML_TYPE_PROP_TABLE_CELL|XML_SC_TYPE_VERTICAL, 
0),
     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_EXT(SC_UNONAME_BOTTOM_BORDER_COMPLEX_COLOR, XML_NAMESPACE_LO_EXT, 
XML_BORDER_BOTTOM_COMPLEX_COLOR, XML_TYPE_PROP_TABLE_CELL | 
XML_TYPE_COMPLEX_COLOR | MID_FLAG_ELEMENT_ITEM, CTF_COMPLEX_COLOR),
     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 
),
@@ -91,6 +92,7 @@ const XMLPropertyMapEntry aXMLScCellStylesProperties[] =
     MAP( SC_UNONAME_WRAP, XML_NAMESPACE_FO, XML_WRAP_OPTION, 
XML_TYPE_PROP_TABLE_CELL|XML_SC_ISTEXTWRAPPED, 0 ),
     MAP( SC_UNONAME_LEFTBORDER, XML_NAMESPACE_FO, XML_BORDER, 
XML_TYPE_PROP_TABLE_CELL|XML_TYPE_BORDER, CTF_SC_ALLBORDER ),
     MAP( SC_UNONAME_LEFTBORDER, XML_NAMESPACE_FO, XML_BORDER_LEFT, 
XML_TYPE_PROP_TABLE_CELL|XML_TYPE_BORDER, CTF_SC_LEFTBORDER ),
+    MAP_EXT(SC_UNONAME_LEFT_BORDER_COMPLEX_COLOR, XML_NAMESPACE_LO_EXT, 
XML_BORDER_LEFT_COMPLEX_COLOR, XML_TYPE_PROP_TABLE_CELL | 
XML_TYPE_COMPLEX_COLOR | MID_FLAG_ELEMENT_ITEM, CTF_COMPLEX_COLOR),
     MAP( SC_UNONAME_LEFTBORDER, XML_NAMESPACE_STYLE, XML_BORDER_LINE_WIDTH, 
XML_TYPE_PROP_TABLE_CELL|XML_TYPE_BORDER_WIDTH, CTF_SC_ALLBORDERWIDTH ),
     MAP( SC_UNONAME_LEFTBORDER, XML_NAMESPACE_STYLE, 
XML_BORDER_LINE_WIDTH_LEFT, XML_TYPE_PROP_TABLE_CELL|XML_TYPE_BORDER_WIDTH, 
CTF_SC_LEFTBORDERWIDTH ),
     MAP( SC_UNONAME_NUMFMT, XML_NAMESPACE_STYLE, XML_DATA_STYLE_NAME, 
XML_TYPE_PROP_TABLE_CELL|XML_TYPE_NUMBER|MID_FLAG_SPECIAL_ITEM, 
CTF_SC_NUMBERFORMAT),
@@ -103,6 +105,7 @@ const XMLPropertyMapEntry aXMLScCellStylesProperties[] =
     MAP( SC_UNONAME_PTMARGIN, XML_NAMESPACE_FO, XML_PADDING_TOP, 
XML_TYPE_PROP_TABLE_CELL|XML_TYPE_MEASURE, CTF_SC_TOPPADDING ),
     MAP( SC_UNONAME_RIGHTBORDER, XML_NAMESPACE_FO, XML_BORDER_RIGHT, 
XML_TYPE_PROP_TABLE_CELL|XML_TYPE_BORDER, CTF_SC_RIGHTBORDER ),
     MAP( SC_UNONAME_RIGHTBORDER, XML_NAMESPACE_STYLE, 
XML_BORDER_LINE_WIDTH_RIGHT, XML_TYPE_PROP_TABLE_CELL|XML_TYPE_BORDER_WIDTH, 
CTF_SC_RIGHTBORDERWIDTH ),
+    MAP_EXT(SC_UNONAME_RIGHT_BORDER_COMPLEX_COLOR, XML_NAMESPACE_LO_EXT, 
XML_BORDER_RIGHT_COMPLEX_COLOR, XML_TYPE_PROP_TABLE_CELL | 
XML_TYPE_COMPLEX_COLOR | MID_FLAG_ELEMENT_ITEM, CTF_COMPLEX_COLOR),
     MAP( SC_UNONAME_ROTANG, XML_NAMESPACE_STYLE, XML_ROTATION_ANGLE, 
XML_TYPE_PROP_TABLE_CELL|XML_SC_TYPE_ROTATEANGLE, 0 ),
     MAP( SC_UNONAME_ROTREF, XML_NAMESPACE_STYLE, XML_ROTATION_ALIGN, 
XML_TYPE_PROP_TABLE_CELL|XML_SC_TYPE_ROTATEREFERENCE, 0),
     MAP( SC_UNONAME_SHADOW, XML_NAMESPACE_STYLE, XML_SHADOW, 
XML_TYPE_PROP_TABLE_CELL|XML_TYPE_TEXT_SHADOW, 0 ),
@@ -110,6 +113,7 @@ const XMLPropertyMapEntry aXMLScCellStylesProperties[] =
     MAP( SC_UNO_STANDARDDEC, XML_NAMESPACE_STYLE, XML_DECIMAL_PLACES, 
XML_TYPE_PROP_TABLE_CELL|XML_TYPE_NUMBER16, 0 ),
     MAP( SC_UNONAME_TOPBORDER, XML_NAMESPACE_FO, XML_BORDER_TOP, 
XML_TYPE_PROP_TABLE_CELL|XML_TYPE_BORDER, CTF_SC_TOPBORDER ),
     MAP( SC_UNONAME_TOPBORDER, XML_NAMESPACE_STYLE, XML_BORDER_LINE_WIDTH_TOP, 
XML_TYPE_PROP_TABLE_CELL|XML_TYPE_BORDER_WIDTH, CTF_SC_TOPBORDERWIDTH ),
+    MAP_EXT(SC_UNONAME_TOP_BORDER_COMPLEX_COLOR, XML_NAMESPACE_LO_EXT, 
XML_BORDER_TOP_COMPLEX_COLOR, XML_TYPE_PROP_TABLE_CELL | XML_TYPE_COMPLEX_COLOR 
| MID_FLAG_ELEMENT_ITEM, CTF_COMPLEX_COLOR),
     MAP( SC_UNONAME_USERDEF, XML_NAMESPACE_TEXT, XML_XMLNS, 
XML_TYPE_PROP_TABLE_CELL|XML_TYPE_ATTRIBUTE_CONTAINER | MID_FLAG_SPECIAL_ITEM, 
0 ),
     MAP( SC_UNONAME_VALIXML, XML_NAMESPACE_TABLE, XML_CONTENT_VALIDATION, 
XML_TYPE_PROP_TABLE_CELL|XML_TYPE_BUILDIN_CMP_ONLY, CTF_SC_VALIDATION ),
     MAP( SC_UNONAME_CELLVJUS, XML_NAMESPACE_STYLE, XML_VERTICAL_ALIGN, 
XML_TYPE_PROP_TABLE_CELL|XML_SC_TYPE_VERTJUSTIFY, 0),
diff --git a/sc/source/filter/xml/xmlstyli.cxx 
b/sc/source/filter/xml/xmlstyli.cxx
index 84812db9d6ac..b938e4e5d174 100644
--- a/sc/source/filter/xml/xmlstyli.cxx
+++ b/sc/source/filter/xml/xmlstyli.cxx
@@ -301,34 +301,37 @@ css::uno::Reference< css::xml::sax::XFastContextHandler > 
XMLTableCellPropsConte
     sal_Int32 nElement,
     const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList,
     ::std::vector< XMLPropertyState > &rProperties,
-    const XMLPropertyState& rProp )
+    const XMLPropertyState& rProperty)
 {
-    // no need for a custom context or indeed a SvXMLTokenMap to grab just the
-    // single attribute ( href ) that we are interested in.
-    // still though, we will check namespaces etc.
-    if (nElement == XML_ELEMENT(STYLE, XML_HYPERLINK) ||
-        nElement == XML_ELEMENT(LO_EXT, XML_HYPERLINK) )
+    switch 
(mxMapper->getPropertySetMapper()->GetEntryContextId(rProperty.mnIndex))
     {
-        OUString sURL;
-        for (auto &aIter : sax_fastparser::castToFastAttributeList( xAttrList 
))
+        case CTF_COMPLEX_COLOR:
         {
-            if ( aIter.getToken() == XML_ELEMENT(XLINK, XML_HREF) )
-                sURL = aIter.toString();
-            else
-                XMLOFF_WARN_UNKNOWN("sc", aIter);
+            return new XMLComplexColorContext(GetImport(), nElement, 
xAttrList, rProperty, rProperties);
         }
-        if ( !sURL.isEmpty() )
+        break;
+        case CTF_SC_HYPERLINK:
         {
-            XMLPropertyState aProp( rProp );
-            aProp.maValue <<=  sURL;
-            rProperties.push_back( aProp );
+            OUString sURL;
+            for (auto &aIter : sax_fastparser::castToFastAttributeList( 
xAttrList ))
+            {
+                if ( aIter.getToken() == XML_ELEMENT(XLINK, XML_HREF) )
+                    sURL = aIter.toString();
+                else
+                    XMLOFF_WARN_UNKNOWN("sc", aIter);
+            }
+            if ( !sURL.isEmpty() )
+            {
+                XMLPropertyState aProp(rProperty);
+                aProp.maValue <<=  sURL;
+                rProperties.push_back( aProp );
+            }
         }
+        break;
+        default:
+            break;
     }
-    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 );
+    return SvXMLPropertySetContext::createFastChildContext(nElement, 
xAttrList, rProperties, rProperty);
 }
 
 namespace {
diff --git a/schema/libreoffice/OpenDocument-v1.3+libreoffice-schema.rng 
b/schema/libreoffice/OpenDocument-v1.3+libreoffice-schema.rng
index 64ed884f7de9..11a96d2dce66 100644
--- a/schema/libreoffice/OpenDocument-v1.3+libreoffice-schema.rng
+++ b/schema/libreoffice/OpenDocument-v1.3+libreoffice-schema.rng
@@ -3546,11 +3546,63 @@ 
xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.
     </rng:element>
   </rng:define>
 
+  <!-- TODO no proposal - Document Themes -->
+  <rng:define name="loext-border-bottom-complex-color">
+    <rng:element name="loext:border-bottom-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="loext-border-top-complex-color">
+    <rng:element name="loext:border-top-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="loext-border-left-complex-color">
+    <rng:element name="loext:border-left-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="loext-border-right-complex-color">
+    <rng:element name="loext:border-right-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:optional>
+        <rng:ref name="loext-border-bottom-complex-color"/>
+    </rng:optional>
+    <rng:optional>
+        <rng:ref name="loext-border-top-complex-color"/>
+    </rng:optional>
+    <rng:optional>
+        <rng:ref name="loext-border-left-complex-color"/>
+    </rng:optional>
+    <rng:optional>
+        <rng:ref name="loext-border-right-complex-color"/>
+    </rng:optional>
   </rng:define>
 
   <rng:define name="draw-frame-attlist" combine="interleave">
diff --git a/xmloff/source/core/xmltoken.cxx b/xmloff/source/core/xmltoken.cxx
index 0efe99badab3..7cce990e113d 100644
--- a/xmloff/source/core/xmltoken.cxx
+++ b/xmloff/source/core/xmltoken.cxx
@@ -366,15 +366,19 @@ namespace xmloff::token {
         TOKEN( "boolean-value",                   XML_BOOLEAN_VALUE ),
         TOKEN( "border",                          XML_BORDER ),
         TOKEN( "border-bottom",                   XML_BORDER_BOTTOM ),
+        TOKEN( "border-bottom-complex-color",     
XML_BORDER_BOTTOM_COMPLEX_COLOR ),
         TOKEN( "border-color",                    XML_BORDER_COLOR ),
         TOKEN( "border-left",                     XML_BORDER_LEFT ),
+        TOKEN( "border-left-complex-color",       
XML_BORDER_LEFT_COMPLEX_COLOR ),
         TOKEN( "border-line-width",               XML_BORDER_LINE_WIDTH ),
         TOKEN( "border-line-width-bottom",        XML_BORDER_LINE_WIDTH_BOTTOM 
),
         TOKEN( "border-line-width-left",          XML_BORDER_LINE_WIDTH_LEFT ),
         TOKEN( "border-line-width-right",         XML_BORDER_LINE_WIDTH_RIGHT 
),
         TOKEN( "border-line-width-top",           XML_BORDER_LINE_WIDTH_TOP ),
         TOKEN( "border-right",                    XML_BORDER_RIGHT ),
+        TOKEN( "border-right-complex-color",      
XML_BORDER_RIGHT_COMPLEX_COLOR ),
         TOKEN( "border-top",                      XML_BORDER_TOP ),
+        TOKEN( "border-top-complex-color",        XML_BORDER_TOP_COMPLEX_COLOR 
),
         TOKEN( "both",                            XML_BOTH ),
         TOKEN( "bottom",                          XML_BOTTOM ),
         TOKEN( "bottom-left",                     XML_BOTTOM_LEFT ),
diff --git a/xmloff/source/token/tokens.txt b/xmloff/source/token/tokens.txt
index 9ac9bc4644ba..5375a5b5fdfe 100644
--- a/xmloff/source/token/tokens.txt
+++ b/xmloff/source/token/tokens.txt
@@ -271,15 +271,19 @@ boolean-style
 boolean-value
 border
 border-bottom
+border-bottom-complex-color
 border-color
 border-left
+border-left-complex-color
 border-line-width
 border-line-width-bottom
 border-line-width-left
 border-line-width-right
 border-line-width-top
 border-right
+border-right-complex-color
 border-top
+border-top-complex-color
 both
 bottom
 bottom-left

Reply via email to