[Libreoffice-commits] core.git: sw/inc sw/qa sw/source
Attila Bakos (NISZ) (via logerrit)
logerrit at kemper.freedesktop.org
Wed Oct 14 06:56:44 UTC 2020
sw/inc/textboxhelper.hxx | 6 ++
sw/qa/extras/layout/data/tdf137025.docx |binary
sw/qa/extras/layout/layout.cxx | 67 ++++++++++++++++++++++++++++++++
sw/source/core/doc/textboxhelper.cxx | 34 ++++++++++++++++
sw/source/uibase/shells/drawdlg.cxx | 8 +++
5 files changed, 115 insertions(+)
New commits:
commit 726c911b90b9a3170fa6b3a34bb952a8d2dbe148
Author: Attila Bakos (NISZ) <bakos.attilakaroly at nisz.hu>
AuthorDate: Wed Sep 30 11:24:14 2020 +0200
Commit: László Németh <nemeth at numbertext.org>
CommitDate: Wed Oct 14 08:56:02 2020 +0200
tdf#137025 sw: apply textbox padding set in Text
dialog window using Spacing to Borders in
Format->Text Box and Shape->Text attributes...
on the selected text box.
There are two types of text boxes in sw, the
older editeng one, what worked fine, and
the newer one, the shape + text frame one,
where modifying Spacing to Borders had no
effect. This has been fixed by copying the
modified shape attributes to the associated
text frame.
Change-Id: I8da0b414fd4771fa86851d9a6affbd9502894ebf
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/103674
Tested-by: László Németh <nemeth at numbertext.org>
Reviewed-by: László Németh <nemeth at numbertext.org>
diff --git a/sw/inc/textboxhelper.hxx b/sw/inc/textboxhelper.hxx
index 5d58305406c2..1c4a723cc07b 100644
--- a/sw/inc/textboxhelper.hxx
+++ b/sw/inc/textboxhelper.hxx
@@ -69,6 +69,9 @@ public:
/// Similar to syncProperty(), but used by the internal API (e.g. for UI purposes).
static void syncFlyFrameAttr(SwFrameFormat& rShape, SfxItemSet const& rSet);
+ /// Copy shape attributes to the text frame
+ static void updateTextBoxMargin(SdrObject* pObj);
+
/**
* If we have an associated TextFrame, then return that.
*
@@ -95,6 +98,9 @@ public:
*/
static bool isTextBox(const SwFrameFormat* pFormat, sal_uInt16 nType);
+ /// Returns true if the SdrObject has a SwTextFrame otherwise false
+ static bool hasTextFrame(const SdrObject* pObj);
+
/// Count number of shapes in the document, excluding TextBoxes.
static sal_Int32 getCount(const SwDoc& rDoc);
/// Count number of shapes on the page, excluding TextBoxes.
diff --git a/sw/qa/extras/layout/data/tdf137025.docx b/sw/qa/extras/layout/data/tdf137025.docx
new file mode 100755
index 000000000000..89f33a911ebe
Binary files /dev/null and b/sw/qa/extras/layout/data/tdf137025.docx differ
diff --git a/sw/qa/extras/layout/layout.cxx b/sw/qa/extras/layout/layout.cxx
index 98ee25b5a134..428878d8e85b 100644
--- a/sw/qa/extras/layout/layout.cxx
+++ b/sw/qa/extras/layout/layout.cxx
@@ -42,6 +42,8 @@
#include <rootfrm.hxx>
#include <docsh.hxx>
#include <IDocumentLayoutAccess.hxx>
+#include <textboxhelper.hxx>
+#include <unoframe.hxx>
char const DATA_DIRECTORY[] = "/sw/qa/extras/layout/data/";
@@ -813,6 +815,71 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testRedlineFlysInHeader)
}
}
+CPPUNIT_TEST_FIXTURE(SwLayoutWriter, TestTdf137025)
+{
+ // Check the padding of the textbox
+ SwDoc* pDoc = createDoc("tdf137025.docx");
+ CPPUNIT_ASSERT(pDoc);
+ xmlDocUniquePtr pXmlDoc = parseLayoutDump();
+ CPPUNIT_ASSERT(pXmlDoc);
+
+ // Check the layout xml
+ assertXPath(pXmlDoc,
+ "/root/page/body/txt/anchored/SwAnchoredDrawObject/SdrObject"
+ "/DefaultProperties/SfxItemSet/SfxInt32Item[3]",
+ "value", "567");
+ assertXPath(pXmlDoc,
+ "/root/page/body/txt/anchored/SwAnchoredDrawObject/SdrObject"
+ "/DefaultProperties/SfxItemSet/SfxInt32Item[4]",
+ "value", "1134");
+ assertXPath(pXmlDoc,
+ "/root/page/body/txt/anchored/SwAnchoredDrawObject/SdrObject"
+ "/DefaultProperties/SfxItemSet/SfxInt32Item[5]",
+ "value", "1701");
+ assertXPath(pXmlDoc,
+ "/root/page/body/txt/anchored/SwAnchoredDrawObject/SdrObject"
+ "/DefaultProperties/SfxItemSet/SfxInt32Item[6]",
+ "value", "2268");
+
+ // Check the textbox-shape import too
+ auto xShp = getShape(1);
+ CPPUNIT_ASSERT(xShp);
+
+ uno::Reference<beans::XPropertySet> xShapeProps(xShp, uno::UNO_QUERY);
+
+ SwFrameFormat* pFrameFormat = SwTextBoxHelper::getOtherTextBoxFormat(xShp);
+ CPPUNIT_ASSERT(pFrameFormat);
+
+ // The shape has these values to copy to the associated text frame after modification::
+ const long nLPaddng = xShapeProps->getPropertyValue("TextLeftDistance").get<long>();
+ const long nRPaddng = xShapeProps->getPropertyValue("TextRightDistance").get<long>();
+ const long nTPaddng = xShapeProps->getPropertyValue("TextUpperDistance").get<long>();
+ const long nBPaddng = xShapeProps->getPropertyValue("TextLowerDistance").get<long>();
+
+ CPPUNIT_ASSERT_EQUAL(long(1000), nLPaddng);
+ CPPUNIT_ASSERT_EQUAL(long(2000), nRPaddng);
+ CPPUNIT_ASSERT_EQUAL(long(3000), nTPaddng);
+ CPPUNIT_ASSERT_EQUAL(long(4001), nBPaddng);
+
+ // TODO: modify shape distance via UNO with text frame synchronization
+ // Check the textbox as well:
+ auto xTxFrm = SwXTextFrame::CreateXTextFrame(*pFrameFormat->GetDoc(), pFrameFormat);
+ CPPUNIT_ASSERT(xTxFrm);
+ uno::Reference<beans::XPropertySet> xFrameProps(xTxFrm, uno::UNO_QUERY);
+
+ const long nFrameLeftPaddng = xFrameProps->getPropertyValue("LeftBorderDistance").get<long>();
+ const long nFrameRightPaddng = xFrameProps->getPropertyValue("RightBorderDistance").get<long>();
+ const long nFrameTopPaddng = xFrameProps->getPropertyValue("TopBorderDistance").get<long>();
+ const long nFrameBottomPaddng
+ = xFrameProps->getPropertyValue("BottomBorderDistance").get<long>();
+
+ // Check if the shape and frame have different setting
+ CPPUNIT_ASSERT_EQUAL(nLPaddng, nFrameLeftPaddng);
+ CPPUNIT_ASSERT_EQUAL(nRPaddng, nFrameRightPaddng);
+ CPPUNIT_ASSERT_EQUAL(nTPaddng, nFrameTopPaddng);
+ CPPUNIT_ASSERT_EQUAL(nBPaddng, nFrameBottomPaddng);
+}
+
CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testRedlineFlysInFootnote)
{
loadURL("private:factory/swriter", nullptr);
diff --git a/sw/source/core/doc/textboxhelper.cxx b/sw/source/core/doc/textboxhelper.cxx
index 15d80ea1ca93..94f43c61af02 100644
--- a/sw/source/core/doc/textboxhelper.cxx
+++ b/sw/source/core/doc/textboxhelper.cxx
@@ -210,6 +210,17 @@ bool SwTextBoxHelper::isTextBox(const SwFrameFormat* pFormat, sal_uInt16 nType)
return pOtherFormat->GetAttrSet().HasItem(RES_CNTNT) && pOtherFormat->GetContent() == rContent;
}
+bool SwTextBoxHelper::hasTextFrame(const SdrObject* pObj)
+{
+ if (!pObj)
+ return false;
+
+ uno::Reference<drawing::XShape> xShape(pObj->getWeakUnoShape(), uno::UNO_QUERY);
+ if (!xShape)
+ return false;
+ return SwTextBoxHelper::getOtherTextBoxFormat(xShape);
+}
+
sal_Int32 SwTextBoxHelper::getCount(SdrPage const* pPage)
{
sal_Int32 nRet = 0;
@@ -809,4 +820,27 @@ void SwTextBoxHelper::syncFlyFrameAttr(SwFrameFormat& rShape, SfxItemSet const&
pFormat->GetDoc()->SetFlyFrameAttr(*pFormat, aTextBoxSet);
}
+void SwTextBoxHelper::updateTextBoxMargin(SdrObject* pObj)
+{
+ if (!pObj)
+ return;
+ uno::Reference<drawing::XShape> xShape(pObj->getUnoShape(), uno::UNO_QUERY);
+ if (!xShape)
+ return;
+ uno::Reference<beans::XPropertySet> const xPropertySet(xShape, uno::UNO_QUERY);
+
+ auto pParentFormat = getOtherTextBoxFormat(getOtherTextBoxFormat(xShape), RES_FLYFRMFMT);
+ if (!pParentFormat)
+ return;
+
+ syncProperty(pParentFormat, UNO_NAME_TEXT_LEFTDIST,
+ xPropertySet->getPropertyValue(UNO_NAME_TEXT_LEFTDIST));
+ syncProperty(pParentFormat, UNO_NAME_TEXT_RIGHTDIST,
+ xPropertySet->getPropertyValue(UNO_NAME_TEXT_RIGHTDIST));
+ syncProperty(pParentFormat, UNO_NAME_TEXT_UPPERDIST,
+ xPropertySet->getPropertyValue(UNO_NAME_TEXT_UPPERDIST));
+ syncProperty(pParentFormat, UNO_NAME_TEXT_LOWERDIST,
+ xPropertySet->getPropertyValue(UNO_NAME_TEXT_LOWERDIST));
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/uibase/shells/drawdlg.cxx b/sw/source/uibase/shells/drawdlg.cxx
index b08cde80068d..114b7f33b055 100644
--- a/sw/source/uibase/shells/drawdlg.cxx
+++ b/sw/source/uibase/shells/drawdlg.cxx
@@ -39,6 +39,7 @@
#include <svx/xflftrit.hxx>
#include <svx/xfltrit.hxx>
#include <comphelper/lok.hxx>
+#include <textboxhelper.hxx>
using namespace com::sun::star::drawing;
@@ -69,6 +70,13 @@ void SwDrawShell::ExecDrawDlg(SfxRequest& rReq)
{
pSh->StartAction();
pView->SetAttributes(*pDlg->GetOutputItemSet());
+ auto vMarkedObjs = pView->GetMarkedObjects();
+ for (auto pObj : vMarkedObjs)
+ {
+ // If the shape has textframe, set its params as well.
+ if (SwTextBoxHelper::hasTextFrame(pObj))
+ SwTextBoxHelper::updateTextBoxMargin(pObj);
+ }
rReq.Done(*(pDlg->GetOutputItemSet()));
pSh->EndAction();
}
More information about the Libreoffice-commits
mailing list