summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomaž Vajngerl <tomaz.vajngerl@collabora.co.uk>2023-07-28 12:10:24 +0200
committerMike Kaganski <mike.kaganski@collabora.com>2023-08-28 12:40:10 +0200
commit69b3d9be8d8781431f1901613d03de5e6b37c969 (patch)
tree13cd8f8c3a1bd986337819a63a385f0eaf7d7da0
parent5a3cb219f135e17fa4745811521c718b97f287c4 (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.hxx4
-rw-r--r--sc/qa/unit/ThemeImportExportTest.cxx10
-rw-r--r--sc/source/filter/xml/xmlstyle.cxx4
-rw-r--r--sc/source/filter/xml/xmlstyli.cxx45
-rw-r--r--schema/libreoffice/OpenDocument-v1.3+libreoffice-schema.rng52
-rw-r--r--xmloff/source/core/xmltoken.cxx4
-rw-r--r--xmloff/source/token/tokens.txt4
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