sw/qa/core/objectpositioning/objectpositioning.cxx | 48 ++++++++++++ sw/source/core/objectpositioning/anchoredobjectposition.cxx | 5 + 2 files changed, 52 insertions(+), 1 deletion(-)
New commits: commit 7f790600a530f7ca7c1e7de0abc0a5bf2f6b3023 Author: Miklos Vajna <vmik...@collabora.com> AuthorDate: Tue Apr 30 08:22:03 2024 +0200 Commit: Caolán McNamara <caolan.mcnam...@collabora.com> CommitDate: Thu May 2 14:26:20 2024 +0200 tdf#160833 sw DoNotMirrorRtlDrawObjs: add layout In case this flag is active (intended for DOCX files), then don't automatically mirror the position of drawing objects, just because they are anchored in an RTL text node. (cherry picked from commit 016b2f2f9194a4a1997d0e7bb51bbd1b10bc27ec) Change-Id: Ie743d94ecb511d7de89e8e1e8303896370ce58c8 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/167013 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Tested-by: Caolán McNamara <caolan.mcnam...@collabora.com> Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com> diff --git a/sw/qa/core/objectpositioning/objectpositioning.cxx b/sw/qa/core/objectpositioning/objectpositioning.cxx index bf560cbdaf90..a1805bf4508e 100644 --- a/sw/qa/core/objectpositioning/objectpositioning.cxx +++ b/sw/qa/core/objectpositioning/objectpositioning.cxx @@ -24,6 +24,10 @@ #include <anchoredobject.hxx> #include <flyfrm.hxx> #include <frmatr.hxx> +#include <IDocumentSettingAccess.hxx> +#include <view.hxx> +#include <fmtanchr.hxx> +#include <fmtfsize.hxx> namespace { @@ -404,6 +408,50 @@ CPPUNIT_TEST_FIXTURE(Test, testFloatingTableOverlapCell) CPPUNIT_ASSERT(pPage1); CPPUNIT_ASSERT(!pPage1->GetNext()); } + +CPPUNIT_TEST_FIXTURE(Test, testDoNotMirrorRtlDrawObjsLayout) +{ + // Given a document with an RTL paragraph, Word-style compat flag is enabled: + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + auto& rIDSA = pDoc->getIDocumentSettingAccess(); + rIDSA.set(DocumentSettingId::DO_NOT_MIRROR_RTL_DRAW_OBJS, true); + SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell(); + SwView& rView = pWrtShell->GetView(); + SfxItemSetFixed<RES_FRMATR_BEGIN, RES_FRMATR_END> aSet(rView.GetPool()); + SvxFrameDirectionItem aDirection(SvxFrameDirection::Horizontal_RL_TB, RES_FRAMEDIR); + aSet.Put(aDirection); + pWrtShell->SetAttrSet(aSet, SetAttrMode::DEFAULT, nullptr, /*bParagraphSetting=*/true); + SwRootFrame* pLayout = pDoc->getIDocumentLayoutAccess().GetCurrentLayout(); + auto pPageFrame = pLayout->Lower()->DynCastPageFrame(); + SwFrame* pBodyFrame = pPageFrame->GetLower(); + + // When inserting a graphic on the middle of the right margin: + SfxItemSet aFrameSet(pDoc->GetAttrPool(), svl::Items<RES_FRMATR_BEGIN, RES_FRMATR_END - 1>); + SwFormatAnchor aAnchor(RndStdIds::FLY_AT_CHAR); + aFrameSet.Put(aAnchor); + // Default margin is 1440, this is 1440/2. + SwFormatFrameSize aSize(SwFrameSize::Fixed, 720, 720); + aFrameSet.Put(aSize); + // This is 1440/4. + SwFormatHoriOrient aOrient(pBodyFrame->getFrameArea().Right() + 360); + aFrameSet.Put(aOrient); + Graphic aGrf; + pWrtShell->SwFEShell::Insert(OUString(), OUString(), &aGrf, &aFrameSet); + + // Then make sure that the image is on the right margin: + SwTwips nBodyRight = pBodyFrame->getFrameArea().Right(); + CPPUNIT_ASSERT(pPageFrame->GetSortedObjs()); + const SwSortedObjs& rPageObjs = *pPageFrame->GetSortedObjs(); + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), rPageObjs.size()); + const SwAnchoredObject* pAnchored = rPageObjs[0]; + Point aAnchoredCenter = pAnchored->GetDrawObj()->GetLastBoundRect().Center(); + // Without the accompanying fix in place, this test would have failed with: + // - Expected greater than: 11389 + // - Actual : 643 + // i.e. the graphic was on the left margin, not on the right margin. + CPPUNIT_ASSERT_GREATER(nBodyRight, aAnchoredCenter.getX()); +} } CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sw/source/core/objectpositioning/anchoredobjectposition.cxx b/sw/source/core/objectpositioning/anchoredobjectposition.cxx index ab35ae7af738..4af3af542b27 100644 --- a/sw/source/core/objectpositioning/anchoredobjectposition.cxx +++ b/sw/source/core/objectpositioning/anchoredobjectposition.cxx @@ -852,7 +852,10 @@ SwTwips SwAnchoredObjectPosition::CalcRelPosX( if ( _rHoriOrient.GetHoriOrient() == text::HoriOrientation::NONE ) { // 'manual' horizontal position - const bool bR2L = rAnchorFrame.IsRightToLeft(); + const IDocumentSettingAccess& rIDSA = mpFrameFormat->getIDocumentSettingAccess(); + // If compat flag is active, then disable automatic mirroring for RTL. + bool bMirrorRtlDrawObjs = !rIDSA.get(DocumentSettingId::DO_NOT_MIRROR_RTL_DRAW_OBJS); + const bool bR2L = rAnchorFrame.IsRightToLeft() && bMirrorRtlDrawObjs; if( IsAnchoredToChar() && text::RelOrientation::CHAR == eRelOrient ) { if( bR2L )