diff options
author | Miklos Vajna <vmiklos@collabora.com> | 2021-03-01 10:37:49 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.com> | 2021-03-01 20:56:03 +0100 |
commit | ebceee31d92f04b58e795d02a26f62b717c47737 (patch) | |
tree | 137df2f7e371a7183de62f2b62ecc77462e7dc4e /writerfilter | |
parent | 7def8c3cd8a1d9b4df2478210055b06382e6d493 (diff) |
tdf#140342 sw layout: remove explicit gutter handling when positioning borders
Word has two modes the specify border positions: the distance can be
measured from the edge of the page or from text. Similar to how
documents that have page borders but no gutter, page page border +
gutter documents should be always measured "from text" by the layout.
"From page" should be a concern for Word filters.
"From page" was already working -- fix "from text" by changing the
layout to do "from text" and then extending DOCX import/export to handle
gutter while handling the "from page" page borders.
This also requires allowing nominally negative top margins, because we
want to have the gutter unchanged, but the border might want to be on
the gutter area, which is only possible with a negative top margin.
Change-Id: I7f2c9943357359e76cb554cb2a65b93a492e694b
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/111735
Tested-by: Jenkins
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Diffstat (limited to 'writerfilter')
-rw-r--r-- | writerfilter/source/dmapper/PropertyMap.cxx | 26 | ||||
-rw-r--r-- | writerfilter/source/dmapper/PropertyMap.hxx | 3 |
2 files changed, 25 insertions, 4 deletions
diff --git a/writerfilter/source/dmapper/PropertyMap.cxx b/writerfilter/source/dmapper/PropertyMap.cxx index 50af6463fcf1..f7a8f800d7d0 100644 --- a/writerfilter/source/dmapper/PropertyMap.cxx +++ b/writerfilter/source/dmapper/PropertyMap.cxx @@ -620,10 +620,10 @@ void SectionPropertyMap::ApplyBorderToPageStyles( DomainMapper_Impl& rDM_Impl, nLineWidth = m_oBorderLines[nBorder]->LineWidth; if ( xFirst.is() ) SetBorderDistance( xFirst, aMarginIds[nBorder], aBorderDistanceIds[nBorder], - m_nBorderDistances[nBorder], eOffsetFrom, nLineWidth ); + m_nBorderDistances[nBorder], eOffsetFrom, nLineWidth, rDM_Impl ); if ( xSecond.is() ) SetBorderDistance( xSecond, aMarginIds[nBorder], aBorderDistanceIds[nBorder], - m_nBorderDistances[nBorder], eOffsetFrom, nLineWidth ); + m_nBorderDistances[nBorder], eOffsetFrom, nLineWidth, rDM_Impl ); } } @@ -655,7 +655,8 @@ void SectionPropertyMap::SetBorderDistance( const uno::Reference< beans::XProper PropertyIds eDistId, sal_Int32 nDistance, BorderOffsetFrom eOffsetFrom, - sal_uInt32 nLineWidth ) + sal_uInt32 nLineWidth, + DomainMapper_Impl& rDM_Impl ) { if (!xStyle.is()) return; @@ -667,6 +668,25 @@ void SectionPropertyMap::SetBorderDistance( const uno::Reference< beans::XProper editeng::BorderDistanceFromWord(eOffsetFrom == BorderOffsetFrom::Edge, nMargin, nDistance, nLineWidth); + if (eOffsetFrom == BorderOffsetFrom::Edge) + { + uno::Any aGutterMargin = xStyle->getPropertyValue( "GutterMargin" ); + sal_Int32 nGutterMargin = 0; + aGutterMargin >>= nGutterMargin; + + if (eMarginId == PROP_LEFT_MARGIN && !rDM_Impl.GetSettingsTable()->GetGutterAtTop()) + { + nMargin -= nGutterMargin; + nDistance += nGutterMargin; + } + + if (eMarginId == PROP_TOP_MARGIN && rDM_Impl.GetSettingsTable()->GetGutterAtTop()) + { + nMargin -= nGutterMargin; + nDistance += nGutterMargin; + } + } + // Change the margins with the border distance uno::Reference< beans::XMultiPropertySet > xMultiSet( xStyle, uno::UNO_QUERY_THROW ); uno::Sequence<OUString> aProperties { sMarginName, sBorderDistanceName }; diff --git a/writerfilter/source/dmapper/PropertyMap.hxx b/writerfilter/source/dmapper/PropertyMap.hxx index f8c976abd388..718c946234fd 100644 --- a/writerfilter/source/dmapper/PropertyMap.hxx +++ b/writerfilter/source/dmapper/PropertyMap.hxx @@ -316,7 +316,8 @@ private: PropertyIds eDistId, sal_Int32 nDistance, BorderOffsetFrom eOffsetFrom, - sal_uInt32 nLineWidth ); + sal_uInt32 nLineWidth, + DomainMapper_Impl& rDM_Impl ); // Determines if conversion of a given floating table is wanted or not. bool FloatingTableConversion( const DomainMapper_Impl& rDM_Impl, FloatingTableInfo& rInfo ); |