tdf#158597 writerfilter,sw: fix toggle properties in ListAutoFormat

... for DOCX import.

These can be set both via paragraph style and via character style in the
w:pPr/w:rPr, so use the applyToggleAttributes().

Adding a test for this requires adding the "CharStyleName" property to
GetAutoCharStylePropertyMap().

Change-Id: I9701d5ac82ec3e7757650c08861791dc398a1a77
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163386
Tested-by: Jenkins
Reviewed-by: Michael Stahl <michael.stahl@allotropia.de>
This commit is contained in:
Michael Stahl
2024-02-15 17:33:06 +01:00
parent 179991383e
commit ff9be3fd30
5 changed files with 268 additions and 6 deletions
Binary file not shown.
+257
View File
@@ -9,6 +9,7 @@
#include <swmodeltestbase.hxx>
#include <com/sun/star/awt/FontSlant.hpp>
#include <com/sun/star/beans/XPropertyState.hpp>
#include <com/sun/star/text/XDocumentIndex.hpp>
#include <com/sun/star/text/XTextTable.hpp>
@@ -16,6 +17,7 @@
#include <com/sun/star/style/LineSpacingMode.hpp>
#include <comphelper/configuration.hxx>
#include <comphelper/sequenceashashmap.hxx>
#include <officecfg/Office/Common.hxx>
#include <pam.hxx>
@@ -33,6 +35,261 @@ public:
}
};
DECLARE_OOXMLEXPORT_TEST(testTdf158597, "tdf158597.docx")
{
// test with 2 properties: font size, italic (toggle)
{
uno::Reference<text::XTextRange> xParagraph(getParagraph(1));
CPPUNIT_ASSERT_EQUAL(OUString("No style"), xParagraph->getString());
uno::Reference<beans::XPropertySet> xProps(xParagraph, uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(OUString("List Paragraph"),
getProperty<OUString>(xProps, "ParaStyleName"));
uno::Reference<text::XTextRange> xRun(getRun(xParagraph, 1));
CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty<OUString>(xRun, "CharStyleName"));
CPPUNIT_ASSERT_EQUAL(11.f, getProperty<float>(xRun, "CharHeight"));
CPPUNIT_ASSERT_EQUAL(awt::FontSlant_NONE, getProperty<awt::FontSlant>(xRun, "CharPosture"));
CPPUNIT_ASSERT(!xProps->getPropertyValue("ListAutoFormat").hasValue());
}
{
uno::Reference<text::XTextRange> xParagraph(getParagraph(2));
CPPUNIT_ASSERT_EQUAL(OUString("Char style mark"), xParagraph->getString());
uno::Reference<beans::XPropertySet> xProps(xParagraph, uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(OUString("List Paragraph"),
getProperty<OUString>(xProps, "ParaStyleName"));
uno::Reference<text::XTextRange> xRun(getRun(xParagraph, 1));
CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty<OUString>(xRun, "CharStyleName"));
CPPUNIT_ASSERT_EQUAL(11.f, getProperty<float>(xRun, "CharHeight"));
CPPUNIT_ASSERT_EQUAL(awt::FontSlant_NONE, getProperty<awt::FontSlant>(xRun, "CharPosture"));
comphelper::SequenceAsHashMap listAutoFormat(xProps->getPropertyValue("ListAutoFormat"));
CPPUNIT_ASSERT_EQUAL(OUString("Emphasis"), listAutoFormat["CharStyleName"].get<OUString>());
CPPUNIT_ASSERT(!listAutoFormat["CharHeight"].hasValue());
CPPUNIT_ASSERT(!listAutoFormat["CharPosture"].hasValue());
}
{
uno::Reference<text::XTextRange> xParagraph(getParagraph(3));
CPPUNIT_ASSERT_EQUAL(OUString("Char style mark and text"), xParagraph->getString());
uno::Reference<beans::XPropertySet> xProps(xParagraph, uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(OUString("List Paragraph"),
getProperty<OUString>(xProps, "ParaStyleName"));
uno::Reference<text::XTextRange> xRun(getRun(xParagraph, 1));
CPPUNIT_ASSERT_EQUAL(OUString("Emphasis"), getProperty<OUString>(xRun, "CharStyleName"));
CPPUNIT_ASSERT_EQUAL(16.f, getProperty<float>(xRun, "CharHeight"));
CPPUNIT_ASSERT_EQUAL(awt::FontSlant_ITALIC,
getProperty<awt::FontSlant>(xRun, "CharPosture"));
comphelper::SequenceAsHashMap listAutoFormat(xProps->getPropertyValue("ListAutoFormat"));
CPPUNIT_ASSERT_EQUAL(OUString("Emphasis"), listAutoFormat["CharStyleName"].get<OUString>());
CPPUNIT_ASSERT(!listAutoFormat["CharHeight"].hasValue());
CPPUNIT_ASSERT(!listAutoFormat["CharPosture"].hasValue());
}
{
uno::Reference<text::XTextRange> xParagraph(getParagraph(4));
CPPUNIT_ASSERT_EQUAL(OUString("Char style text"), xParagraph->getString());
uno::Reference<beans::XPropertySet> xProps(xParagraph, uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(OUString("List Paragraph"),
getProperty<OUString>(xProps, "ParaStyleName"));
uno::Reference<text::XTextRange> xRun(getRun(xParagraph, 1));
CPPUNIT_ASSERT_EQUAL(OUString("Emphasis"), getProperty<OUString>(xRun, "CharStyleName"));
CPPUNIT_ASSERT_EQUAL(16.f, getProperty<float>(xRun, "CharHeight"));
CPPUNIT_ASSERT_EQUAL(awt::FontSlant_ITALIC,
getProperty<awt::FontSlant>(xRun, "CharPosture"));
CPPUNIT_ASSERT(!xProps->getPropertyValue("ListAutoFormat").hasValue());
}
{
uno::Reference<text::XTextRange> xParagraph(getParagraph(5));
CPPUNIT_ASSERT_EQUAL(OUString("Para style"), xParagraph->getString());
uno::Reference<beans::XPropertySet> xProps(xParagraph, uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(OUString("List Paragraph E"),
getProperty<OUString>(xProps, "ParaStyleName"));
uno::Reference<text::XTextRange> xRun(getRun(xParagraph, 1));
CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty<OUString>(xRun, "CharStyleName"));
CPPUNIT_ASSERT_EQUAL(16.f, getProperty<float>(xRun, "CharHeight"));
CPPUNIT_ASSERT_EQUAL(awt::FontSlant_ITALIC,
getProperty<awt::FontSlant>(xRun, "CharPosture"));
CPPUNIT_ASSERT(!xProps->getPropertyValue("ListAutoFormat").hasValue());
}
{
uno::Reference<text::XTextRange> xParagraph(getParagraph(6));
CPPUNIT_ASSERT_EQUAL(OUString("Para style + Char style mark"), xParagraph->getString());
uno::Reference<beans::XPropertySet> xProps(xParagraph, uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(OUString("List Paragraph E"),
getProperty<OUString>(xProps, "ParaStyleName"));
uno::Reference<text::XTextRange> xRun(getRun(xParagraph, 1));
CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty<OUString>(xRun, "CharStyleName"));
CPPUNIT_ASSERT_EQUAL(16.f, getProperty<float>(xRun, "CharHeight"));
CPPUNIT_ASSERT_EQUAL(awt::FontSlant_ITALIC,
getProperty<awt::FontSlant>(xRun, "CharPosture"));
comphelper::SequenceAsHashMap listAutoFormat(xProps->getPropertyValue("ListAutoFormat"));
CPPUNIT_ASSERT_EQUAL(OUString("Emphasis"), listAutoFormat["CharStyleName"].get<OUString>());
CPPUNIT_ASSERT(!listAutoFormat["CharHeight"].hasValue());
// bug was that here the toggle property was not overwritten
CPPUNIT_ASSERT_EQUAL(awt::FontSlant_NONE,
listAutoFormat["CharPosture"].get<awt::FontSlant>());
}
{
uno::Reference<text::XTextRange> xParagraph(getParagraph(7));
CPPUNIT_ASSERT_EQUAL(OUString("Para style + Char style mark and text"),
xParagraph->getString());
uno::Reference<beans::XPropertySet> xProps(xParagraph, uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(OUString("List Paragraph E"),
getProperty<OUString>(xProps, "ParaStyleName"));
uno::Reference<text::XTextRange> xRun(getRun(xParagraph, 1));
CPPUNIT_ASSERT_EQUAL(OUString("Emphasis"), getProperty<OUString>(xRun, "CharStyleName"));
CPPUNIT_ASSERT_EQUAL(16.f, getProperty<float>(xRun, "CharHeight"));
CPPUNIT_ASSERT_EQUAL(awt::FontSlant_NONE, getProperty<awt::FontSlant>(xRun, "CharPosture"));
comphelper::SequenceAsHashMap listAutoFormat(xProps->getPropertyValue("ListAutoFormat"));
CPPUNIT_ASSERT_EQUAL(OUString("Emphasis"), listAutoFormat["CharStyleName"].get<OUString>());
CPPUNIT_ASSERT(!listAutoFormat["CharHeight"].hasValue());
// bug was that here the toggle property was not overwritten
CPPUNIT_ASSERT_EQUAL(awt::FontSlant_NONE,
listAutoFormat["CharPosture"].get<awt::FontSlant>());
}
{
uno::Reference<text::XTextRange> xParagraph(getParagraph(8));
CPPUNIT_ASSERT_EQUAL(OUString("Para style + Char style text"), xParagraph->getString());
uno::Reference<beans::XPropertySet> xProps(xParagraph, uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(OUString("List Paragraph E"),
getProperty<OUString>(xProps, "ParaStyleName"));
uno::Reference<text::XTextRange> xRun(getRun(xParagraph, 1));
CPPUNIT_ASSERT_EQUAL(OUString("Emphasis"), getProperty<OUString>(xRun, "CharStyleName"));
CPPUNIT_ASSERT_EQUAL(16.f, getProperty<float>(xRun, "CharHeight"));
CPPUNIT_ASSERT_EQUAL(awt::FontSlant_NONE, getProperty<awt::FontSlant>(xRun, "CharPosture"));
CPPUNIT_ASSERT(!xProps->getPropertyValue("ListAutoFormat").hasValue());
}
{
uno::Reference<text::XTextRange> xParagraph(getParagraph(9));
CPPUNIT_ASSERT_EQUAL(OUString("No style + direct mark"), xParagraph->getString());
uno::Reference<beans::XPropertySet> xProps(xParagraph, uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(OUString("List Paragraph"),
getProperty<OUString>(xProps, "ParaStyleName"));
uno::Reference<text::XTextRange> xRun(getRun(xParagraph, 1));
CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty<OUString>(xRun, "CharStyleName"));
CPPUNIT_ASSERT_EQUAL(11.f, getProperty<float>(xRun, "CharHeight"));
CPPUNIT_ASSERT_EQUAL(awt::FontSlant_NONE, getProperty<awt::FontSlant>(xRun, "CharPosture"));
comphelper::SequenceAsHashMap listAutoFormat(xProps->getPropertyValue("ListAutoFormat"));
CPPUNIT_ASSERT(!listAutoFormat["CharStyleName"].hasValue());
CPPUNIT_ASSERT_EQUAL(16.f, listAutoFormat["CharHeight"].get<float>());
CPPUNIT_ASSERT_EQUAL(awt::FontSlant_ITALIC,
listAutoFormat["CharPosture"].get<awt::FontSlant>());
}
{
uno::Reference<text::XTextRange> xParagraph(getParagraph(10));
CPPUNIT_ASSERT_EQUAL(OUString("Char style + direct mark"), xParagraph->getString());
uno::Reference<beans::XPropertySet> xProps(xParagraph, uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(OUString("List Paragraph"),
getProperty<OUString>(xProps, "ParaStyleName"));
uno::Reference<text::XTextRange> xRun(getRun(xParagraph, 1));
CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty<OUString>(xRun, "CharStyleName"));
CPPUNIT_ASSERT_EQUAL(11.f, getProperty<float>(xRun, "CharHeight"));
CPPUNIT_ASSERT_EQUAL(awt::FontSlant_NONE, getProperty<awt::FontSlant>(xRun, "CharPosture"));
comphelper::SequenceAsHashMap listAutoFormat(xProps->getPropertyValue("ListAutoFormat"));
CPPUNIT_ASSERT_EQUAL(OUString("Emphasis"), listAutoFormat["CharStyleName"].get<OUString>());
CPPUNIT_ASSERT_EQUAL(16.f, listAutoFormat["CharHeight"].get<float>());
CPPUNIT_ASSERT_EQUAL(awt::FontSlant_ITALIC,
listAutoFormat["CharPosture"].get<awt::FontSlant>());
}
{
uno::Reference<text::XTextRange> xParagraph(getParagraph(11));
CPPUNIT_ASSERT_EQUAL(OUString("Char style + direct mark and text"),
xParagraph->getString());
uno::Reference<beans::XPropertySet> xProps(xParagraph, uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(OUString("List Paragraph"),
getProperty<OUString>(xProps, "ParaStyleName"));
uno::Reference<text::XTextRange> xRun(getRun(xParagraph, 1));
CPPUNIT_ASSERT_EQUAL(OUString("Emphasis"), getProperty<OUString>(xRun, "CharStyleName"));
CPPUNIT_ASSERT_EQUAL(16.f, getProperty<float>(xRun, "CharHeight"));
CPPUNIT_ASSERT_EQUAL(awt::FontSlant_ITALIC,
getProperty<awt::FontSlant>(xRun, "CharPosture"));
comphelper::SequenceAsHashMap listAutoFormat(xProps->getPropertyValue("ListAutoFormat"));
CPPUNIT_ASSERT_EQUAL(OUString("Emphasis"), listAutoFormat["CharStyleName"].get<OUString>());
CPPUNIT_ASSERT_EQUAL(16.f, listAutoFormat["CharHeight"].get<float>());
CPPUNIT_ASSERT_EQUAL(awt::FontSlant_ITALIC,
listAutoFormat["CharPosture"].get<awt::FontSlant>());
}
{
uno::Reference<text::XTextRange> xParagraph(getParagraph(12));
CPPUNIT_ASSERT_EQUAL(OUString("Char style + direct text"), xParagraph->getString());
uno::Reference<beans::XPropertySet> xProps(xParagraph, uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(OUString("List Paragraph"),
getProperty<OUString>(xProps, "ParaStyleName"));
uno::Reference<text::XTextRange> xRun(getRun(xParagraph, 1));
CPPUNIT_ASSERT_EQUAL(OUString("Emphasis"), getProperty<OUString>(xRun, "CharStyleName"));
CPPUNIT_ASSERT_EQUAL(16.f, getProperty<float>(xRun, "CharHeight"));
CPPUNIT_ASSERT_EQUAL(awt::FontSlant_ITALIC,
getProperty<awt::FontSlant>(xRun, "CharPosture"));
CPPUNIT_ASSERT(!xProps->getPropertyValue("ListAutoFormat").hasValue());
}
{
uno::Reference<text::XTextRange> xParagraph(getParagraph(13));
CPPUNIT_ASSERT_EQUAL(OUString("Para style + direct mark"), xParagraph->getString());
uno::Reference<beans::XPropertySet> xProps(xParagraph, uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(OUString("List Paragraph E"),
getProperty<OUString>(xProps, "ParaStyleName"));
uno::Reference<text::XTextRange> xRun(getRun(xParagraph, 1));
CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty<OUString>(xRun, "CharStyleName"));
CPPUNIT_ASSERT_EQUAL(16.f, getProperty<float>(xRun, "CharHeight"));
CPPUNIT_ASSERT_EQUAL(awt::FontSlant_ITALIC,
getProperty<awt::FontSlant>(xRun, "CharPosture"));
comphelper::SequenceAsHashMap listAutoFormat(xProps->getPropertyValue("ListAutoFormat"));
CPPUNIT_ASSERT(!listAutoFormat["CharStyleName"].hasValue());
CPPUNIT_ASSERT_EQUAL(16.f, listAutoFormat["CharHeight"].get<float>());
CPPUNIT_ASSERT_EQUAL(awt::FontSlant_ITALIC,
listAutoFormat["CharPosture"].get<awt::FontSlant>());
}
{
uno::Reference<text::XTextRange> xParagraph(getParagraph(14));
CPPUNIT_ASSERT_EQUAL(OUString("Para style + Char style + direct mark"),
xParagraph->getString());
uno::Reference<beans::XPropertySet> xProps(xParagraph, uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(OUString("List Paragraph E"),
getProperty<OUString>(xProps, "ParaStyleName"));
uno::Reference<text::XTextRange> xRun(getRun(xParagraph, 1));
CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty<OUString>(xRun, "CharStyleName"));
CPPUNIT_ASSERT_EQUAL(16.f, getProperty<float>(xRun, "CharHeight"));
CPPUNIT_ASSERT_EQUAL(awt::FontSlant_ITALIC,
getProperty<awt::FontSlant>(xRun, "CharPosture"));
comphelper::SequenceAsHashMap listAutoFormat(xProps->getPropertyValue("ListAutoFormat"));
CPPUNIT_ASSERT_EQUAL(OUString("Emphasis"), listAutoFormat["CharStyleName"].get<OUString>());
CPPUNIT_ASSERT_EQUAL(16.f, listAutoFormat["CharHeight"].get<float>());
CPPUNIT_ASSERT_EQUAL(awt::FontSlant_ITALIC,
listAutoFormat["CharPosture"].get<awt::FontSlant>());
}
{
uno::Reference<text::XTextRange> xParagraph(getParagraph(15));
CPPUNIT_ASSERT_EQUAL(OUString("Para style + Char style + direct mark and text"),
xParagraph->getString());
uno::Reference<beans::XPropertySet> xProps(xParagraph, uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(OUString("List Paragraph E"),
getProperty<OUString>(xProps, "ParaStyleName"));
uno::Reference<text::XTextRange> xRun(getRun(xParagraph, 1));
CPPUNIT_ASSERT_EQUAL(OUString("Emphasis"), getProperty<OUString>(xRun, "CharStyleName"));
CPPUNIT_ASSERT_EQUAL(16.f, getProperty<float>(xRun, "CharHeight"));
CPPUNIT_ASSERT_EQUAL(awt::FontSlant_ITALIC,
getProperty<awt::FontSlant>(xRun, "CharPosture"));
comphelper::SequenceAsHashMap listAutoFormat(xProps->getPropertyValue("ListAutoFormat"));
CPPUNIT_ASSERT_EQUAL(OUString("Emphasis"), listAutoFormat["CharStyleName"].get<OUString>());
CPPUNIT_ASSERT_EQUAL(16.f, listAutoFormat["CharHeight"].get<float>());
CPPUNIT_ASSERT_EQUAL(awt::FontSlant_ITALIC,
listAutoFormat["CharPosture"].get<awt::FontSlant>());
}
{
uno::Reference<text::XTextRange> xParagraph(getParagraph(16));
CPPUNIT_ASSERT_EQUAL(OUString("Para style + Char style + direct text"),
xParagraph->getString());
uno::Reference<beans::XPropertySet> xProps(xParagraph, uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(OUString("List Paragraph E"),
getProperty<OUString>(xProps, "ParaStyleName"));
uno::Reference<text::XTextRange> xRun(getRun(xParagraph, 1));
CPPUNIT_ASSERT_EQUAL(OUString("Emphasis"), getProperty<OUString>(xRun, "CharStyleName"));
CPPUNIT_ASSERT_EQUAL(16.f, getProperty<float>(xRun, "CharHeight"));
CPPUNIT_ASSERT_EQUAL(awt::FontSlant_ITALIC,
getProperty<awt::FontSlant>(xRun, "CharPosture"));
CPPUNIT_ASSERT(!xProps->getPropertyValue("ListAutoFormat").hasValue());
}
}
DECLARE_OOXMLEXPORT_TEST(testTdf153909_followTextFlow, "tdf153909_followTextFlow.docx")
{
// Although MSO's UI reports "layoutInCell" for the rectangle, it isn't specified or honored
+1
View File
@@ -307,6 +307,7 @@ std::span<const SfxItemPropertyMapEntry> SwUnoPropertyMapProvider::GetAutoCharS
{ UNO_NAME_CHAR_BORDER_TOP_COMPLEX_COLOR, RES_CHRATR_BOX, cppu::UnoType<css::util::XComplexColor>::get(), PropertyAttribute::MAYBEVOID, MID_BORDER_TOP_COLOR },
{ UNO_NAME_CHAR_BORDER_BOTTOM_COMPLEX_COLOR, RES_CHRATR_BOX, cppu::UnoType<css::util::XComplexColor>::get(), PropertyAttribute::MAYBEVOID, MID_BORDER_BOTTOM_COLOR },
{ UNO_NAME_CHAR_SHADOW_FORMAT, RES_CHRATR_SHADOW, cppu::UnoType<css::table::ShadowFormat>::get(), PROPERTY_NONE, CONVERT_TWIPS},
{ UNO_NAME_CHAR_STYLE_NAME, RES_TXTATR_CHARFMT, cppu::UnoType<OUString>::get(), PropertyAttribute::MAYBEVOID, 0 },
};
return aAutoCharStyleMap;
+8 -6
View File
@@ -539,11 +539,6 @@ SwUnoCursorHelper::SetCursorPropertyValue(
rMap.getByName(prop.Name);
if (!pEntry)
{
if (prop.Name == "CharStyleName")
{
lcl_setCharStyle(rPam.GetDoc(), prop.Value, items);
continue;
}
throw beans::UnknownPropertyException(
"Unknown property: " + prop.Name);
}
@@ -552,7 +547,14 @@ SwUnoCursorHelper::SetCursorPropertyValue(
throw beans::PropertyVetoException(
"Property is read-only: " + prop.Name);
}
rPropSet.setPropertyValue(*pEntry, prop.Value, items);
if (prop.Name == "CharStyleName")
{
lcl_setCharStyle(rPam.GetDoc(), prop.Value, items);
}
else
{
rPropSet.setPropertyValue(*pEntry, prop.Value, items);
}
}
IStyleAccess& rStyleAccess = rPam.GetDoc().GetIStyleAccess();
@@ -2533,6 +2533,7 @@ void DomainMapper_Impl::finishParagraph( const PropertyMapPtr& pPropertyMap, con
lcl_AddRange(pToBeSavedProperties, xTextAppend, rAppendContext);
}
}
applyToggleAttributes(pPropertyMap); // for paragraph marker formatting
std::vector<beans::PropertyValue> aProperties;
if (pPropertyMap)
{
@@ -3011,6 +3012,7 @@ void DomainMapper_Impl::finishParagraph( const PropertyMapPtr& pPropertyMap, con
}
// TODO this does not yet take table styles into account
void DomainMapper_Impl::applyToggleAttributes(const PropertyMapPtr& pPropertyMap)
{
std::optional<PropertyMap::Property> charStyleProperty = pPropertyMap->getProperty(PROP_CHAR_STYLE_NAME);