Fix sd encoded table style name handling

Found this while looking into improving insertion of pages
with tables, as SdDrawDocument::InsertBookmarkAsPage uses "_"
as the rename suffix for styles with identical names but a
different content.

This commit fixes two issues:

- For import, cell styles with encoded names couldn't be found
by table styles. The reason is that styles are referenced in
ODF by encoded names, but at runtime by display names. Yet we
were searching the cell style family by encoded names. This was
already handled for sw in insertTabletemplate(), and now do the
same for sd.

- For export, table template names were encoded, but then
referenced by tables using their non-encoded names. This is
unlike the sw code that doesn't encode them, and therefore
doesn't have this problem. Looking at the schema, both
table:name attribute of a table template, and table:template-name
attribute of a table are of type "string", which suggests that
there is indeed no need to encode those names. This aligns with
the fact that table templates don't have a display-name attribute.

Change-Id: Ie61b6a1c95b033404ee98f3fc40d8e82434a6a6c
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/143839
Tested-by: Jenkins
Reviewed-by: Maxim Monastirsky <momonasmon@gmail.com>
This commit is contained in:
Maxim Monastirsky
2022-12-07 15:51:01 +02:00
parent 15e94efb87
commit 8bd31225d7
3 changed files with 55 additions and 3 deletions

View File

@@ -24,6 +24,7 @@
#include <com/sun/star/container/XIndexAccess.hpp>
#include <com/sun/star/table/XTable.hpp>
#include <com/sun/star/table/XMergeableCellRange.hpp>
#include <com/sun/star/lang/XSingleServiceFactory.hpp>
#include <DrawDocShell.hxx>
#include <drawdoc.hxx>
@@ -80,6 +81,7 @@ public:
void testTdf131033();
void testTdf129898LayerDrawnInSlideshow();
void testTdf136956();
void testEncodedTableStyles();
CPPUNIT_TEST_SUITE(SdMiscTest);
CPPUNIT_TEST(testTdf99396);
@@ -101,6 +103,7 @@ public:
CPPUNIT_TEST(testTdf131033);
CPPUNIT_TEST(testTdf129898LayerDrawnInSlideshow);
CPPUNIT_TEST(testTdf136956);
CPPUNIT_TEST(testEncodedTableStyles);
CPPUNIT_TEST_SUITE_END();
virtual void registerNamespaces(xmlXPathContextPtr& pXmlXPathCtx) override
@@ -891,6 +894,55 @@ void SdMiscTest::testTdf136956()
CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTable->getRowCount());
}
void SdMiscTest::testEncodedTableStyles()
{
// Silence unrelated failure:
// Error: element "table:table-template" is missing "first-row-start-column" attribute
skipValidation();
createSdDrawDoc();
{
uno::Reference<style::XStyleFamiliesSupplier> xStyleFamiliesSupplier(mxComponent,
uno::UNO_QUERY_THROW);
uno::Reference<css::lang::XSingleServiceFactory> xTableStyleFamily(
xStyleFamiliesSupplier->getStyleFamilies()->getByName("table"), uno::UNO_QUERY_THROW);
uno::Reference<css::lang::XSingleServiceFactory> xCellStyleFamily(
xStyleFamiliesSupplier->getStyleFamilies()->getByName("cell"), uno::UNO_QUERY_THROW);
uno::Reference<style::XStyle> xTableStyle(xTableStyleFamily->createInstance(),
uno::UNO_QUERY_THROW);
uno::Reference<style::XStyle> xCellStyle(xCellStyleFamily->createInstance(),
uno::UNO_QUERY_THROW);
uno::Reference<container::XNameContainer>(xTableStyleFamily, uno::UNO_QUERY_THROW)
->insertByName("table_1", uno::Any(xTableStyle));
uno::Reference<container::XNameContainer>(xCellStyleFamily, uno::UNO_QUERY_THROW)
->insertByName("table-body_1", uno::Any(xCellStyle));
uno::Reference<container::XNameReplace>(xTableStyle, uno::UNO_QUERY_THROW)
->replaceByName("body", uno::Any(xCellStyle));
}
saveAndReload("draw8");
{
uno::Reference<style::XStyleFamiliesSupplier> xStyleFamiliesSupplier(mxComponent,
uno::UNO_QUERY_THROW);
uno::Reference<container::XNameAccess> xTableStyleFamily(
xStyleFamiliesSupplier->getStyleFamilies()->getByName("table"), uno::UNO_QUERY_THROW);
// Such style used to be exported as "table_5f_1" instead.
CPPUNIT_ASSERT(xTableStyleFamily->hasByName("table_1"));
uno::Reference<container::XNameAccess> xTableStyle(xTableStyleFamily->getByName("table_1"),
uno::UNO_QUERY_THROW);
uno::Reference<style::XStyle> xCellStyle(xTableStyle->getByName("body"), uno::UNO_QUERY);
// Such style used to not be found by the table style, as it was
// searching for "table-body_5f_1" instead of "table-body_1".
CPPUNIT_ASSERT(xCellStyle.is());
CPPUNIT_ASSERT_EQUAL(OUString("table-body_1"), xCellStyle->getName());
}
}
CPPUNIT_TEST_SUITE_REGISTRATION(SdMiscTest);
CPPUNIT_PLUGIN_IMPLEMENT();

View File

@@ -640,9 +640,9 @@ void XMLTableExport::exportTableTemplates()
// tdf#106780 historically this wrong attribute was used
// for the name; write it if extended because LO < 5.3 can
// read only text:style-name, not the correct table:name
mrExport.AddAttribute(XML_NAMESPACE_TEXT, XML_STYLE_NAME, GetExport().EncodeStyleName( xTableStyle->getName() ) );
mrExport.AddAttribute(XML_NAMESPACE_TEXT, XML_STYLE_NAME, xTableStyle->getName());
}
mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_NAME, GetExport().EncodeStyleName(xTableStyle->getName()));
mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_NAME, xTableStyle->getName());
}
SvXMLElementExport tableTemplate( mrExport, XML_NAMESPACE_TABLE, XML_TABLE_TEMPLATE, true, true );

View File

@@ -376,7 +376,7 @@ void XMLTableImport::finishStyles()
for( const auto& rStyle : *xT ) try
{
const OUString sPropName( rStyle.first );
const OUString sStyleName( rStyle.second );
const OUString sStyleName( mrImport.GetStyleDisplayName(XmlStyleFamily::TABLE_CELL, rStyle.second) );
xTemplate->replaceByName( sPropName, xCellFamily->getByName( sStyleName ) );
}
catch( Exception& )