tdf#98882 DOCX import: set default para properties on the Standard para style
That's what the DOC import does, and that's the reason e.g. the strange
unwanted crop of the as-char anchored picture doesn't happen there.
This also needs the "reset all existing style properties back to
default" logic to be adapted: the Standard style has to be reset before
the default are set, and later it should be left alone, otherwise the
defaults are lost.
Change-Id: Ie422a0b64b80a826fa4f469145a26283fb32d734
Reviewed-on: https://gerrit.libreoffice.org/23593
Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
Tested-by: Jenkins <ci@libreoffice.org>
diff --git a/sw/qa/extras/ooxmlimport/data/tdf98882.docx b/sw/qa/extras/ooxmlimport/data/tdf98882.docx
new file mode 100644
index 0000000..53c1098
--- /dev/null
+++ b/sw/qa/extras/ooxmlimport/data/tdf98882.docx
Binary files differ
diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
index 46a4386..39b5efb 100644
--- a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
+++ b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
@@ -3208,6 +3208,14 @@ DECLARE_SW_IMPORT_TEST(testHFLinkToPrev, "headerfooter-link-to-prev.docx",
OUString("Odd page footer for sections 2 and 3 only"));
}
DECLARE_OOXMLIMPORT_TEST(testTdf98882, "tdf98882.docx")
{
sal_Int32 nFlyHeight = parseDump("//fly/infos/bounds", "height").toInt32();
sal_Int32 nContentHeight = parseDump("//notxt/infos/bounds", "height").toInt32();
// The content height was 600, not 360, so the frame and the content height did not match.
CPPUNIT_ASSERT_EQUAL(nFlyHeight, nContentHeight);
}
CPPUNIT_PLUGIN_IMPLEMENT();
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/StyleSheetTable.cxx b/writerfilter/source/dmapper/StyleSheetTable.cxx
index 8a6aca5..3f29ecb 100644
--- a/writerfilter/source/dmapper/StyleSheetTable.cxx
+++ b/writerfilter/source/dmapper/StyleSheetTable.cxx
@@ -275,6 +275,8 @@ struct StyleSheetTable_Impl
/// Appends the given key-value pair to the list of latent style properties of the current entry.
void AppendLatentStyleProperty(const OUString& aName, Value& rValue);
/// Sets all properties of xStyle back to default.
void SetPropertiesToDefault(const uno::Reference<style::XStyle>& xStyle);
};
@@ -349,6 +351,35 @@ void StyleSheetTable_Impl::AppendLatentStyleProperty(const OUString& aName, Valu
m_pCurrentEntry->aLatentStyles.push_back(aValue);
}
void StyleSheetTable_Impl::SetPropertiesToDefault(const uno::Reference<style::XStyle>& xStyle)
{
// See if the existing style has any non-default properties. If so, reset them back to default.
uno::Reference<beans::XPropertySet> xPropertySet(xStyle, uno::UNO_QUERY);
uno::Reference<beans::XPropertySetInfo> xPropertySetInfo = xPropertySet->getPropertySetInfo();
uno::Sequence<beans::Property> aProperties = xPropertySetInfo->getProperties();
std::vector<OUString> aPropertyNames;
for (sal_Int32 i = 0; i < aProperties.getLength(); ++i)
{
aPropertyNames.push_back(aProperties[i].Name);
}
uno::Reference<beans::XPropertyState> xPropertyState(xStyle, uno::UNO_QUERY);
uno::Sequence<beans::PropertyState> aStates = xPropertyState->getPropertyStates(comphelper::containerToSequence(aPropertyNames));
for (sal_Int32 i = 0; i < aStates.getLength(); ++i)
{
if (aStates[i] == beans::PropertyState_DIRECT_VALUE)
{
try
{
xPropertyState->setPropertyToDefault(aPropertyNames[i]);
}
catch(const uno::Exception& rException)
{
SAL_INFO("writerfilter", "setPropertyToDefault(" << aPropertyNames[i] << ") failed: " << rException.Message);
}
}
}
}
StyleSheetTable::StyleSheetTable(DomainMapper& rDMapper,
uno::Reference< text::XTextDocument> const& xTextDocument,
@@ -909,32 +940,9 @@ void StyleSheetTable::ApplyStyleSheets( FontTablePtr rFontTable )
}
xStyles->getByName( sConvertedStyleName ) >>= xStyle;
// See if the existing style has any non-default properties. If so, reset them back to default.
uno::Reference<beans::XPropertySet> xPropertySet(xStyle, uno::UNO_QUERY);
uno::Reference<beans::XPropertySetInfo> xPropertySetInfo = xPropertySet->getPropertySetInfo();
uno::Sequence<beans::Property> aProperties = xPropertySetInfo->getProperties();
std::vector<OUString> aPropertyNames;
for (sal_Int32 i = 0; i < aProperties.getLength(); ++i)
{
aPropertyNames.push_back(aProperties[i].Name);
}
uno::Reference<beans::XPropertyState> xPropertyState(xStyle, uno::UNO_QUERY);
uno::Sequence<beans::PropertyState> aStates = xPropertyState->getPropertyStates(comphelper::containerToSequence(aPropertyNames));
for (sal_Int32 i = 0; i < aStates.getLength(); ++i)
{
if (aStates[i] == beans::PropertyState_DIRECT_VALUE)
{
try
{
xPropertyState->setPropertyToDefault(aPropertyNames[i]);
}
catch(const uno::Exception& rException)
{
SAL_INFO("writerfilter", "setPropertyToDefault(" << aPropertyNames[i] << ") failed: " << rException.Message);
}
}
}
// Standard is handled already in applyDefaults().
if (sConvertedStyleName != "Standard")
m_pImpl->SetPropertiesToDefault(xStyle);
}
else
{
@@ -1462,12 +1470,22 @@ void StyleSheetTable::applyDefaults(bool bParaProperties)
}
if( bParaProperties && m_pImpl->m_pDefaultParaProps.get())
{
uno::Reference<style::XStyleFamiliesSupplier> xStylesSupplier(m_pImpl->m_xTextDocument, uno::UNO_QUERY);
uno::Reference<container::XNameAccess> xStyleFamilies = xStylesSupplier->getStyleFamilies();
uno::Reference<container::XNameAccess> xParagraphStyles;
xStyleFamilies->getByName("ParagraphStyles") >>= xParagraphStyles;
uno::Reference<beans::XPropertySet> xStandard;
xParagraphStyles->getByName("Standard") >>= xStandard;
uno::Reference<style::XStyle> xStyle(xStandard, uno::UNO_QUERY);
m_pImpl->SetPropertiesToDefault(xStyle);
uno::Sequence< beans::PropertyValue > aPropValues = m_pImpl->m_pDefaultParaProps->GetPropertyValues();
for( sal_Int32 i = 0; i < aPropValues.getLength(); ++i )
{
try
{
m_pImpl->m_xTextDefaults->setPropertyValue( aPropValues[i].Name, aPropValues[i].Value );
xStandard->setPropertyValue(aPropValues[i].Name, aPropValues[i].Value);
}
catch( const uno::Exception& )
{