diff options
author | Tomaž Vajngerl <tomaz.vajngerl@collabora.co.uk> | 2023-07-28 12:10:24 +0200 |
---|---|---|
committer | Mike Kaganski <mike.kaganski@collabora.com> | 2023-08-28 12:40:10 +0200 |
commit | 69b3d9be8d8781431f1901613d03de5e6b37c969 (patch) | |
tree | 13cd8f8c3a1bd986337819a63a385f0eaf7d7da0 | |
parent | 5a3cb219f135e17fa4745811521c718b97f287c4 (diff) |
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 <quikee@gmail.com>
(cherry picked from commit 5e34a25aa7f58b37a2303aef9318bbe5a9af5d37)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/156101
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
-rw-r--r-- | include/xmloff/xmltoken.hxx | 4 | ||||
-rw-r--r-- | sc/qa/unit/ThemeImportExportTest.cxx | 10 | ||||
-rw-r--r-- | sc/source/filter/xml/xmlstyle.cxx | 4 | ||||
-rw-r--r-- | sc/source/filter/xml/xmlstyli.cxx | 45 | ||||
-rw-r--r-- | schema/libreoffice/OpenDocument-v1.3+libreoffice-schema.rng | 52 | ||||
-rw-r--r-- | xmloff/source/core/xmltoken.cxx | 4 | ||||
-rw-r--r-- | xmloff/source/token/tokens.txt | 4 |
7 files changed, 102 insertions, 21 deletions
diff --git a/include/xmloff/xmltoken.hxx b/include/xmloff/xmltoken.hxx index 21f2a614c45b..580285fa5d30 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 0e5b093b42ff..f8b2a49b7114 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 b2dd7ebc3c3c..ee9aa7fb7c5c 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 8c61e57ca55f..d562661d6a95 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 051db56b5cd3..b2d19cdc8dc0 100644 --- a/schema/libreoffice/OpenDocument-v1.3+libreoffice-schema.rng +++ b/schema/libreoffice/OpenDocument-v1.3+libreoffice-schema.rng @@ -3479,11 +3479,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 37d97b57b13d..a5c71365b0ea 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 7a31802d8ad0..7d788bdb6c19 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 |