diff options
author | Miklos Vajna <vmiklos@collabora.com> | 2019-10-03 17:24:21 +0200 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.com> | 2019-10-03 18:16:26 +0200 |
commit | c424a1f509205cfbaa3421bddfd6514b340a798a (patch) | |
tree | 8eaa8bfec060d256d46a8d4b534244d6bbdb0f89 /sw/source | |
parent | 1b5dae25b0252ddf6021553f78b79115652c3b6b (diff) |
DOCX import: fix interaction of table and paragraph style in table cells
Both table and paragraph styles can define paragraph properties for the
content of table cells, e.g. line spacing. The intended behavior is that
direct formatting has priority, then paragraph style, then the table
styles.
But in practice table style had priority: table style is turned into a
set of property name-value pairs by writerfilter/ code, then this is
applied to the content of a cell using SwXCell::setPropertyValue(). To
make sure that direct-format-from-table-style doesn't override
direct-format, there was already a check to not replace properties which
are set directly.
The problem is that in case the property value comes from a paragraph
style, that's not direct and still should have priority over
direct-format-from-table-style.
Fix this by checking for custom values not only in the paragraph's item
set, but also in its parents. Unless the parent would be the default
style, which doesn't count. Or in case the paragraph is numbered, which
complicates the situation, so leave that case unchanged.
Change-Id: Ib554247cdc51fee0d9a6c7a26aecd38442dfa692
Reviewed-on: https://gerrit.libreoffice.org/80146
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Tested-by: Jenkins
Diffstat (limited to 'sw/source')
-rw-r--r-- | sw/source/core/unocore/unotbl.cxx | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/sw/source/core/unocore/unotbl.cxx b/sw/source/core/unocore/unotbl.cxx index 8cdddc8d72d2..1ad6dc454657 100644 --- a/sw/source/core/unocore/unotbl.cxx +++ b/sw/source/core/unocore/unotbl.cxx @@ -115,6 +115,7 @@ #include <docsh.hxx> #include <fesh.hxx> #include <itabenum.hxx> +#include <poolfmt.hxx> using namespace ::com::sun::star; using ::editeng::SvxBorderLine; @@ -1030,8 +1031,16 @@ void SwXCell::setPropertyValue(const OUString& rPropertyName, const uno::Any& aV const bool bHasAttrSet = pNd->HasSwAttrSet(); const SfxItemSet& aSet = pNd->GetSwAttrSet(); // isPARATR: replace DEFAULT_VALUE properties only + // Require that the property is default in the paragraph style as well, + // unless the style is the default style. // isCHRATR: change the base/auto SwAttr property, but don't remove the DIRECT hints - if ( !bHasAttrSet || SfxItemState::DEFAULT == aSet.GetItemState(pEntry->nWID, /*bSrchInParent=*/false) ) + bool bCustomParent = false; + if (const SwFormatColl* pFormatColl = pNd->GetFormatColl()) + { + bCustomParent = pFormatColl->GetPoolFormatId() != RES_POOLCOLL_STANDARD; + } + bool bSearchInParent = bCustomParent && !pNd->GetNumRule(); + if ( !bHasAttrSet || SfxItemState::DEFAULT == aSet.GetItemState(pEntry->nWID, bSearchInParent) ) SwUnoCursorHelper::SetPropertyValue(aPaM, rParaPropSet, rPropertyName, aValue, SetAttrMode::DONTREPLACE); } ++aIdx; |