diff options
author | Michael Stahl <michael.stahl@allotropia.de> | 2023-09-26 15:03:58 +0200 |
---|---|---|
committer | Thorsten Behrens <thorsten.behrens@allotropia.de> | 2023-09-28 22:52:50 +0200 |
commit | 7cf5faec6fdbc27dd77d2d36fb2ff205322cba0d (patch) | |
tree | 072bc085ef97d52428e85bfacce2483c098cef91 /xmloff | |
parent | 65efbf64cfa30ba96bc9f0ba539eb1414b861c49 (diff) |
tdf#156146 xmloff: ODF import: add backward compatibility hack
As a follow-up to ade0a153f453500f15343380ac937252992733e0 "tdf#114287
xmloff: ODF import: fix text:list override of list style", add some ugly
compatibility hack to preserve the visual layout of documents produced
by LO versions before 7.6.
Override the left/first-line margin of the applied numbering rules with
what is in the paragraph or paragraph style, and try to do this only in
the specific situation where the list style is the same.
Change-Id: I1f4520c9bf9d2257d2e3864e4ddb2d28451bbd2f
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/157284
Tested-by: Jenkins
Tested-by: Gabor Kelemen <kelemeng@ubuntu.com>
Reviewed-by: Thorsten Behrens <thorsten.behrens@allotropia.de>
Diffstat (limited to 'xmloff')
-rw-r--r-- | xmloff/source/core/xmlimp.cxx | 9 | ||||
-rw-r--r-- | xmloff/source/text/txtimp.cxx | 65 |
2 files changed, 68 insertions, 6 deletions
diff --git a/xmloff/source/core/xmlimp.cxx b/xmloff/source/core/xmlimp.cxx index 24264a77460b..209c141fb0d4 100644 --- a/xmloff/source/core/xmlimp.cxx +++ b/xmloff/source/core/xmlimp.cxx @@ -219,7 +219,14 @@ public: } else if ('7' == loVersion[0]) { - mnGeneratorVersion = SvXMLImport::LO_7x; + if (loVersion.getLength() > 2 && loVersion[2] == '6') + { + mnGeneratorVersion = SvXMLImport::LO_76; // 7.6 + } + else + { + mnGeneratorVersion = SvXMLImport::LO_7x; + } } else { diff --git a/xmloff/source/text/txtimp.cxx b/xmloff/source/text/txtimp.cxx index fa43e44e2b22..647d6943a856 100644 --- a/xmloff/source/text/txtimp.cxx +++ b/xmloff/source/text/txtimp.cxx @@ -1003,8 +1003,40 @@ static bool lcl_HasListStyle( const OUString& sStyleName, return bRet; } + +namespace { + +auto IsPropertySet(uno::Reference<container::XNameContainer> const& rxParaStyles, + uno::Reference<beans::XPropertySet> const& rxPropSet, + OUString const& rProperty) +{ + uno::Reference<beans::XPropertyState> const xPropState(rxPropSet, uno::UNO_QUERY); + // note: this is true only if it is set in automatic style + if (xPropState->getPropertyState(rProperty) == beans::PropertyState_DIRECT_VALUE) + { + return true; + } + // check if it is set by any parent common style + OUString style; + rxPropSet->getPropertyValue("ParaStyleName") >>= style; + while (!style.isEmpty() && rxParaStyles.is() && rxParaStyles->hasByName(style)) + { + uno::Reference<style::XStyle> const xStyle(rxParaStyles->getByName(style), uno::UNO_QUERY); + assert(xStyle.is()); + uno::Reference<beans::XPropertyState> const xStyleProps(xStyle, uno::UNO_QUERY); + if (xStyleProps->getPropertyState(rProperty) == beans::PropertyState_DIRECT_VALUE) + { + return true; + } + style = xStyle->getParentStyle(); + } + return false; +}; + +} // namespace + OUString XMLTextImportHelper::SetStyleAndAttrs( - SvXMLImport const & rImport, + SvXMLImport & rImport, const Reference < XTextCursor >& rCursor, const OUString& rStyleName, bool bPara, @@ -1086,13 +1118,16 @@ OUString XMLTextImportHelper::SetStyleAndAttrs( bool bNumberingIsNumber(true); // Assure that list style of automatic paragraph style is applied at paragraph. (#i101349#) bool bApplyNumRules(pStyle && pStyle->IsListStyleSet()); + bool bApplyNumRulesFix(false); if (pListBlock) { // the xNumRules is always created, even without a list-style-name - if (pListBlock->HasListStyleName() - || (pListItem != nullptr && pListItem->HasNumRulesOverride())) + if (!bApplyNumRules + && (pListBlock->HasListStyleName() + || (pListItem != nullptr && pListItem->HasNumRulesOverride()))) { bApplyNumRules = true; // tdf#114287 + bApplyNumRulesFix = rImport.isGeneratorVersionOlderThan(SvXMLImport::AOO_4x, SvXMLImport::LO_76); } if (!pListItem) { @@ -1125,7 +1160,7 @@ OUString XMLTextImportHelper::SetStyleAndAttrs( if (pListBlock || pNumberedParagraph) { - if ( !bApplyNumRules ) + if (!bApplyNumRules || bApplyNumRulesFix) { bool bSameNumRules = xNewNumRules == xNumRules; if( !bSameNumRules && xNewNumRules.is() && xNumRules.is() ) @@ -1149,7 +1184,14 @@ OUString XMLTextImportHelper::SetStyleAndAttrs( } } } - bApplyNumRules = !bSameNumRules; + if (!bApplyNumRules) + { + bApplyNumRules = !bSameNumRules; + } + if (!bSameNumRules) + { + bApplyNumRulesFix = false; + } } if ( bApplyNumRules ) @@ -1163,6 +1205,19 @@ OUString XMLTextImportHelper::SetStyleAndAttrs( { xPropSet->setPropertyValue( s_NumberingRules, Any(xNewNumRules) ); + if (bApplyNumRulesFix) + { // tdf#156146 override list margins for bug compatibility + if (IsPropertySet(m_xImpl->m_xParaStyles, xPropSet, "ParaLeftMargin")) + { + uno::Any const left(xPropSet->getPropertyValue("ParaLeftMargin")); + xPropSet->setPropertyValue("ParaLeftMargin", left); + } + if (IsPropertySet(m_xImpl->m_xParaStyles, xPropSet, "ParaFirstLineIndent")) + { + uno::Any const first(xPropSet->getPropertyValue("ParaFirstLineIndent")); + xPropSet->setPropertyValue("ParaFirstLineIndent", first); + } + } } catch(const Exception&) { |