summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sw/qa/extras/ooxmlexport/data/tdf95495.docxbin0 -> 102240 bytes
-rw-r--r--sw/qa/extras/ooxmlexport/ooxmlexport3.cxx10
-rw-r--r--writerfilter/source/dmapper/StyleSheetTable.cxx44
3 files changed, 44 insertions, 10 deletions
diff --git a/sw/qa/extras/ooxmlexport/data/tdf95495.docx b/sw/qa/extras/ooxmlexport/data/tdf95495.docx
new file mode 100644
index 000000000000..21f534b11223
--- /dev/null
+++ b/sw/qa/extras/ooxmlexport/data/tdf95495.docx
Binary files differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport3.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport3.cxx
index a87a0b2919f3..c85b8a7f932f 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport3.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport3.cxx
@@ -1061,6 +1061,16 @@ DECLARE_OOXMLEXPORT_TEST(testBottomBorders, "tdf129452_BottomBorders.docx")
assertXPath(pXmlDocument, "/w:document/w:body/w:tbl/w:tr[4]/w:tc[2]/w:tcPr/w:tcBorders/w:bottom [@w:val = 'nil']", 0);
}
+DECLARE_OOXMLEXPORT_TEST(testNumberingLevels, "tdf95495.docx")
+{
+ xmlDocPtr pXmlDocument = parseExport("word/document.xml");
+ if (!pXmlDocument)
+ return;
+
+ // tdf#95495: set list level of the custom style based on the setting of the parent style
+ assertXPath(pXmlDocument, "/w:document/w:body/w:p[2]/w:pPr/w:numPr/w:ilvl [@w:val = '1']", 1);
+}
+
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 08881a93a9fe..e4f970dbcd0e 100644
--- a/writerfilter/source/dmapper/StyleSheetTable.cxx
+++ b/writerfilter/source/dmapper/StyleSheetTable.cxx
@@ -892,6 +892,12 @@ uno::Sequence< OUString > PropValVector::getNames()
return comphelper::containerToSequence(aRet);
}
+static bool lcl_IsOutLineStyle(const OUString& sPrefix, const OUString& sStyleName)
+{
+ OUString sSuffix;
+ return sStyleName.getLength() == (sPrefix.getLength() + 2) && sStyleName.startsWith(sPrefix + " ", &sSuffix) && sSuffix.toInt32() > 0;
+}
+
void StyleSheetTable::ApplyStyleSheets( const FontTablePtr& rFontTable )
{
try
@@ -1049,13 +1055,39 @@ void StyleSheetTable::ApplyStyleSheets( const FontTablePtr& rFontTable )
}
// Set the outline levels
- const StyleSheetPropertyMap* pStyleSheetProperties = dynamic_cast<const StyleSheetPropertyMap*>(pEntry ? pEntry->pProperties.get() : nullptr);
+ StyleSheetPropertyMap* pStyleSheetProperties = dynamic_cast<StyleSheetPropertyMap*>(pEntry ? pEntry->pProperties.get() : nullptr);
+
if ( pStyleSheetProperties )
{
beans::PropertyValue aLvlVal( getPropertyName( PROP_OUTLINE_LEVEL ), 0,
uno::makeAny( sal_Int16( pStyleSheetProperties->GetOutlineLevel( ) + 1 ) ),
beans::PropertyState_DIRECT_VALUE );
aPropValues.push_back(aLvlVal);
+
+ // tdf#95495 missing list level settings in custom styles in old DOCX: apply settings of the parent style
+ if (pStyleSheetProperties->GetListLevel() == -1 && pStyleSheetProperties->GetOutlineLevel() == -1)
+ {
+ const beans::PropertyValues aPropGrabBag = pEntry->GetInteropGrabBagSeq();
+ for (const auto& rVal : aPropGrabBag)
+ {
+ if (rVal.Name == "customStyle" && rVal.Value == true)
+ {
+ OUString sBaseId = pEntry->sBaseStyleIdentifier;
+ for (const auto& aSheetProps : m_pImpl->m_aStyleSheetEntries)
+ {
+ if (aSheetProps->sStyleIdentifierD == sBaseId)
+ {
+ StyleSheetPropertyMap* aStyleSheetProps
+ = dynamic_cast<StyleSheetPropertyMap*>(aSheetProps->pProperties.get());
+ pStyleSheetProperties->SetListLevel(aStyleSheetProps->GetListLevel());
+ pStyleSheetProperties->SetOutlineLevel(aStyleSheetProps->GetOutlineLevel());
+ pStyleSheetProperties->SetNumId(aStyleSheetProps->GetNumId());
+ break;
+ }
+ }
+ }
+ }
+ }
}
uno::Reference< beans::XPropertyState >xState( xStyle, uno::UNO_QUERY_THROW );
@@ -1069,15 +1101,7 @@ void StyleSheetTable::ApplyStyleSheets( const FontTablePtr& rFontTable )
}
else if ( sConvertedStyleName == "Text body" )
xState->setPropertyToDefault(getPropertyName( PROP_PARA_BOTTOM_MARGIN ));
- else if( sConvertedStyleName == "Heading 1" ||
- sConvertedStyleName == "Heading 2" ||
- sConvertedStyleName == "Heading 3" ||
- sConvertedStyleName == "Heading 4" ||
- sConvertedStyleName == "Heading 5" ||
- sConvertedStyleName == "Heading 6" ||
- sConvertedStyleName == "Heading 7" ||
- sConvertedStyleName == "Heading 8" ||
- sConvertedStyleName == "Heading 9" )
+ else if( lcl_IsOutLineStyle("Heading", sConvertedStyleName) )
{
xState->setPropertyToDefault(getPropertyName( PROP_CHAR_WEIGHT ));
xState->setPropertyToDefault(getPropertyName( PROP_CHAR_WEIGHT_ASIAN ));