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 9001db35e92c..4293f1deb695 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport3.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport3.cxx
@@ -1061,6 +1061,16 @@ DECLARE_OOXMLEXPORT_TEST(testFontTypes, "tdf120344_FontTypes.docx")
assertXPath(qXmlDocument, "/w:numbering/w:abstractNum[1]/w:lvl[1]/w:rPr/w:rFonts [@w:ascii='Arial Black']", 1);
}
+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 33c22e357110..b3348099cfaf 100644
--- a/writerfilter/source/dmapper/StyleSheetTable.cxx
+++ b/writerfilter/source/dmapper/StyleSheetTable.cxx
@@ -886,6 +886,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
@@ -1043,13 +1049,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 );
@@ -1063,15 +1095,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 ));