From e2bdd31c0231444f1ba1463bffb5656c230c3073 Mon Sep 17 00:00:00 2001 From: Samuel Mehrbrodt Date: Wed, 28 Apr 2021 16:25:42 +0200 Subject: tdf#76258 Add ODF import/export XML looks like: Change-Id: Idcddf0ce436da69567e5a7e9dfd7d796dc872586 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/114812 Tested-by: Jenkins Reviewed-by: Michael Stahl Reviewed-by: Samuel Mehrbrodt --- include/xmloff/xmltoken.hxx | 1 + sc/qa/unit/data/ods/autofilter-colors.ods | Bin 0 -> 9556 bytes sc/qa/unit/subsequent_export-test.cxx | 16 +++++++++++++ sc/source/filter/xml/XMLExportDatabaseRanges.cxx | 26 +++++++++++++++++---- sc/source/filter/xml/xmlfilti.cxx | 9 +++++++ .../OpenDocument-schema-v1.3+libreoffice.rng | 12 ++++++++++ xmloff/source/core/xmltoken.cxx | 1 + xmloff/source/token/tokens.txt | 1 + 8 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 sc/qa/unit/data/ods/autofilter-colors.ods diff --git a/include/xmloff/xmltoken.hxx b/include/xmloff/xmltoken.hxx index 12a0632a5af7..b75907d8cba4 100644 --- a/include/xmloff/xmltoken.hxx +++ b/include/xmloff/xmltoken.hxx @@ -1914,6 +1914,7 @@ namespace xmloff::token { XML_TEXT_BACKGROUND_COLOR, XML_TEXT_BLINKING, XML_TEXT_BOX, + XML_TEXT_COLOR, XML_TEXT_COMBINE, XML_TEXT_COMBINE_END_CHAR, XML_TEXT_COMBINE_START_CHAR, diff --git a/sc/qa/unit/data/ods/autofilter-colors.ods b/sc/qa/unit/data/ods/autofilter-colors.ods new file mode 100644 index 000000000000..d5a88e9299fb Binary files /dev/null and b/sc/qa/unit/data/ods/autofilter-colors.ods differ diff --git a/sc/qa/unit/subsequent_export-test.cxx b/sc/qa/unit/subsequent_export-test.cxx index b25aae6c4ab4..01cf0a236a24 100644 --- a/sc/qa/unit/subsequent_export-test.cxx +++ b/sc/qa/unit/subsequent_export-test.cxx @@ -218,6 +218,7 @@ public: void testTdf95640_ods_to_xlsx_with_standard_list(); void testTdf95640_xlsx_to_xlsx(); void testDateAutofilterXLSX(); + void testAutofilterColorsODF(); void testRefStringXLSX(); void testRefStringConfigXLSX(); @@ -404,6 +405,7 @@ public: CPPUNIT_TEST(testTdf95640_ods_to_xlsx_with_standard_list); CPPUNIT_TEST(testTdf95640_xlsx_to_xlsx); CPPUNIT_TEST(testDateAutofilterXLSX); + CPPUNIT_TEST(testAutofilterColorsODF); CPPUNIT_TEST(testRefStringXLSX); CPPUNIT_TEST(testRefStringConfigXLSX); @@ -4611,6 +4613,20 @@ void ScExportTest::testDateAutofilterXLSX() xDocSh->DoClose(); } +void ScExportTest::testAutofilterColorsODF() +{ + ScDocShellRef xDocSh = loadDoc(u"autofilter-colors.", FORMAT_ODS); + CPPUNIT_ASSERT(xDocSh.is()); + + xmlDocUniquePtr pDoc = XPathHelper::parseExport2(*this, *xDocSh, m_xSFactory, "content.xml", FORMAT_ODS); + CPPUNIT_ASSERT(pDoc); + + assertXPath(pDoc, "//table:filter/table:filter-and/table:filter-condition[1]", "value", "#e8f2a1"); + assertXPath(pDoc, "//table:filter/table:filter-and/table:filter-condition[1][@loext:data-type='background-color']"); + assertXPath(pDoc, "//table:filter/table:filter-and/table:filter-condition[2]", "value", "#3465a4"); + assertXPath(pDoc, "//table:filter/table:filter-and/table:filter-condition[2][@loext:data-type='text-color']"); +} + void ScExportTest::testTdf88657ODS() { ScDocShellRef xDocSh = loadDoc(u"tdf88657.", FORMAT_ODS); diff --git a/sc/source/filter/xml/XMLExportDatabaseRanges.cxx b/sc/source/filter/xml/XMLExportDatabaseRanges.cxx index d329bdf2385f..c3f651e5416b 100644 --- a/sc/source/filter/xml/XMLExportDatabaseRanges.cxx +++ b/sc/source/filter/xml/XMLExportDatabaseRanges.cxx @@ -448,10 +448,6 @@ private: return; } - mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_FIELD_NUMBER, OUString::number(rEntry.nField - nFieldStart)); - if (bCaseSens) - mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_CASE_SENSITIVE, XML_TRUE); - if (rItems.size() == 1) { // Single item condition. @@ -463,6 +459,22 @@ private: mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DATA_TYPE, XML_TEXT); mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_VALUE, rItem.maString.getString()); } + else if (rItem.meType == ScQueryEntry::ByTextColor + || rItem.meType == ScQueryEntry::ByBackgroundColor) + { + if (mrExport.getSaneDefaultVersion() & SvtSaveOptions::ODFSVER_EXTENDED) + { + if (rItem.meType == ScQueryEntry::ByTextColor) + mrExport.AddAttribute(XML_NAMESPACE_LO_EXT, XML_DATA_TYPE, XML_TEXT_COLOR); + else + mrExport.AddAttribute(XML_NAMESPACE_LO_EXT, XML_DATA_TYPE, + XML_BACKGROUND_COLOR); + } + + OUStringBuffer buffer; + sax::Converter::convertColor(buffer, rItem.maColor); + mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_VALUE, buffer.makeStringAndClear()); + } else { mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DATA_TYPE, XML_NUMBER); @@ -472,6 +484,9 @@ private: } mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_OPERATOR, getOperatorXML(rEntry, eSearchType)); + mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_FIELD_NUMBER, OUString::number(rEntry.nField - nFieldStart)); + if (bCaseSens) + mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_CASE_SENSITIVE, XML_TRUE); SvXMLElementExport aElemC(mrExport, XML_NAMESPACE_TABLE, XML_FILTER_CONDITION, true, true); } else @@ -495,6 +510,9 @@ private: mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_VALUE, rItem.maString.getString()); } mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_OPERATOR, OUString("=")); + mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_FIELD_NUMBER, OUString::number(rEntry.nField - nFieldStart)); + if (bCaseSens) + mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_CASE_SENSITIVE, XML_TRUE); SvXMLElementExport aElemC(mrExport, XML_NAMESPACE_TABLE, XML_FILTER_CONDITION, true, true); std::for_each(rItems.begin(), rItems.end(), WriteSetItem(mrExport, mpDoc)); diff --git a/sc/source/filter/xml/xmlfilti.cxx b/sc/source/filter/xml/xmlfilti.cxx index 7e22395a90d9..3990849cf6a4 100644 --- a/sc/source/filter/xml/xmlfilti.cxx +++ b/sc/source/filter/xml/xmlfilti.cxx @@ -26,6 +26,7 @@ #include #include +#include #include #include #include @@ -304,6 +305,7 @@ ScXMLConditionContext::ScXMLConditionContext( } break; case XML_ELEMENT( TABLE, XML_DATA_TYPE ): + case XML_ELEMENT( LO_EXT, XML_DATA_TYPE ): { sDataType = aIter.toString(); } @@ -425,6 +427,13 @@ void SAL_CALL ScXMLConditionContext::endFastElement( sal_Int32 /*nElement*/ ) rItem.mfVal = sConditionValue.toDouble(); rItem.meType = ScQueryEntry::ByValue; } + else if (IsXMLToken(sDataType, XML_TEXT_COLOR) + || IsXMLToken(sDataType, XML_BACKGROUND_COLOR)) + { + rItem.meType = IsXMLToken(sDataType, XML_TEXT_COLOR) ? ScQueryEntry::ByTextColor + : ScQueryEntry::ByBackgroundColor; + sax::Converter::convertColor(rItem.maColor, sConditionValue); + } else { svl::SharedStringPool& rPool = GetScImport().GetDocument()->GetSharedStringPool(); diff --git a/schema/libreoffice/OpenDocument-schema-v1.3+libreoffice.rng b/schema/libreoffice/OpenDocument-schema-v1.3+libreoffice.rng index 8907ac4eb3b2..7e0dfbb07b6c 100644 --- a/schema/libreoffice/OpenDocument-schema-v1.3+libreoffice.rng +++ b/schema/libreoffice/OpenDocument-schema-v1.3+libreoffice.rng @@ -2639,4 +2639,16 @@ xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1. + + + + + + background-color + text-color + + + + + diff --git a/xmloff/source/core/xmltoken.cxx b/xmloff/source/core/xmltoken.cxx index 0a2f9104d0a7..f557d0e8102b 100644 --- a/xmloff/source/core/xmltoken.cxx +++ b/xmloff/source/core/xmltoken.cxx @@ -1920,6 +1920,7 @@ namespace xmloff::token { TOKEN( "text-background-color", XML_TEXT_BACKGROUND_COLOR ), TOKEN( "text-blinking", XML_TEXT_BLINKING ), TOKEN( "text-box", XML_TEXT_BOX ), + TOKEN( "text-color", XML_TEXT_COLOR ), TOKEN( "text-combine", XML_TEXT_COMBINE ), TOKEN( "text-combine-end-char", XML_TEXT_COMBINE_END_CHAR ), TOKEN( "text-combine-start-char", XML_TEXT_COMBINE_START_CHAR ), diff --git a/xmloff/source/token/tokens.txt b/xmloff/source/token/tokens.txt index 10af0324fee6..53b2f76cbde8 100644 --- a/xmloff/source/token/tokens.txt +++ b/xmloff/source/token/tokens.txt @@ -1827,6 +1827,7 @@ text-autospace text-background-color text-blinking text-box +text-color text-combine text-combine-end-char text-combine-start-char -- cgit