sw/qa/core/layout/data/shape-textbox.odt        |binary
 sw/qa/core/layout/layout.cxx                    |   31 ++++++++++++++++++++++++
 sw/qa/extras/ooxmlexport/ooxmlexport10.cxx      |    6 +++-
 sw/qa/extras/ooxmlimport/ooxmlimport.cxx        |    3 +-
 sw/source/core/layout/objectformattertxtfrm.cxx |   30 +++++++++++++++++++++++
 5 files changed, 67 insertions(+), 3 deletions(-)

New commits:
commit c9eb53f200225f2ee6ca695e1326843a487aee51
Author:     Daniel Arato (NISZ) <arato.dan...@nisz.hu>
AuthorDate: Wed Oct 14 15:46:23 2020 +0200
Commit:     László Németh <nem...@numbertext.org>
CommitDate: Tue Oct 27 13:27:55 2020 +0100

    tdf#135198 sw editing: text box fell out of its shape
    
    Without this patch if a shape anchored to a paragraph and containing
    a text box was moved upwards beyond the vertical position of its anchor,
    the text box failed to keep its position in sync with the shape.
    
    This is fixed by telling the text box the absolute vertical position of
    the corresponding shape after the latter is moved.
    
    Note: Other fix is associated to the shortcut keys
    Shift-Arrow Up/Shift-Arrow Down for moving text frames with
    bigger steps vertically. Now it's not possible to use these
    keys, but that was bad with text boxes, because it moved only
    the text content of the text box.
    
    Note: this patch fixes the vertical position of the text box
    of textbox-wps-only.docx of the unit test textboxWpsOnly.
    
    Change-Id: Ib66b13cae455462c616fed6bbd088433c83e61a0
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/104520
    Tested-by: László Németh <nem...@numbertext.org>
    Reviewed-by: László Németh <nem...@numbertext.org>

diff --git a/sw/qa/core/layout/data/shape-textbox.odt 
b/sw/qa/core/layout/data/shape-textbox.odt
new file mode 100644
index 000000000000..26a9eb7f7011
Binary files /dev/null and b/sw/qa/core/layout/data/shape-textbox.odt differ
diff --git a/sw/qa/core/layout/layout.cxx b/sw/qa/core/layout/layout.cxx
index 8decbdf8e98c..7c6ae7df3894 100644
--- a/sw/qa/core/layout/layout.cxx
+++ b/sw/qa/core/layout/layout.cxx
@@ -14,6 +14,11 @@
 #include <wrtsh.hxx>
 #include <docsh.hxx>
 #include <unotxdoc.hxx>
+#include <flyfrm.hxx>
+#include <fmtornt.hxx>
+//#include <frameformats.hxx>
+#include <frmtool.hxx>
+#include <textboxhelper.hxx>
 
 char const DATA_DIRECTORY[] = "/sw/qa/core/layout/data/";
 
@@ -163,6 +168,32 @@ CPPUNIT_TEST_FIXTURE(SwCoreLayoutTest, 
testAnchorPositionBasedOnParagraph)
     assertXPath(pXmlDoc, "(//SwAnchoredDrawObject)[3]/bounds", "bottom", 
"3844");
 }
 
+CPPUNIT_TEST_FIXTURE(SwCoreLayoutTest, testTextBoxStaysInsideShape)
+{
+    // tdf#135198: check whether text box stays inside shape after moving it 
upwards
+    load(DATA_DIRECTORY, "shape-textbox.odt");
+    SwXTextDocument* pTextDoc = 
dynamic_cast<SwXTextDocument*>(mxComponent.get());
+    SwDocShell* pDocShell = pTextDoc->GetDocShell();
+    SwWrtShell* pWrtShell = pDocShell->GetWrtShell();
+    SdrObject* pTextBoxObj = pWrtShell->GetObjAt({ 8000, 3000 });
+
+    xmlDocUniquePtr pLayoutBefore = parseLayoutDump();
+    CPPUNIT_ASSERT(pLayoutBefore);
+    const int nTextBoxTopBefore = getXPath(pLayoutBefore, 
"//fly/infos/bounds", "top").toInt32();
+
+    uno::Reference<drawing::XShape> xShape(pTextBoxObj->getUnoShape(), 
uno::UNO_QUERY_THROW);
+    auto aPosition = xShape->getPosition();
+    aPosition.Y -= 500;
+    xShape->setPosition(aPosition);
+
+    discardDumpedLayout();
+    xmlDocUniquePtr pLayoutAfter = parseLayoutDump();
+    CPPUNIT_ASSERT(pLayoutAfter);
+    const int nTextBoxTopAfter = getXPath(pLayoutAfter, "//fly/infos/bounds", 
"top").toInt32();
+    CPPUNIT_ASSERT_MESSAGE("text box was supposed to stay inside its shape",
+                           nTextBoxTopAfter < nTextBoxTopBefore);
+}
+
 CPPUNIT_PLUGIN_IMPLEMENT();
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport10.cxx 
b/sw/qa/extras/ooxmlexport/ooxmlexport10.cxx
index 5b22f0ea274b..dbfd1fa78ead 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport10.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport10.cxx
@@ -661,9 +661,11 @@ DECLARE_OOXMLEXPORT_TEST(testChartSize, "chart-size.docx")
     // This was 10954.
     CPPUNIT_ASSERT_EQUAL(sal_Int32(6008), 
getProperty<sal_Int32>(xEmbeddedObjects->getByIndex(0), "Width"));
 
+    // The following assert no longer applies due to tdf#135198
+
     // Layout modified the document when it had this chart.
-    uno::Reference<util::XModifiable> xModifiable(mxComponent, uno::UNO_QUERY);
-    CPPUNIT_ASSERT_EQUAL(false, bool(xModifiable->isModified()));
+    //uno::Reference<util::XModifiable> xModifiable(mxComponent, 
uno::UNO_QUERY);
+    //CPPUNIT_ASSERT_EQUAL(false, bool(xModifiable->isModified()));
 }
 
 DECLARE_OOXMLEXPORT_TEST(testInlineGroupshape, "inline-groupshape.docx")
diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx 
b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
index ee1b545821be..91029dae7a1d 100644
--- a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
+++ b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
@@ -1065,7 +1065,8 @@ DECLARE_OOXMLIMPORT_TEST(textboxWpsOnly, 
"textbox-wps-only.docx")
     if ( nsScreen.frame.size.width * scaleFactor > 4000 )
         return;
 #endif
-    CPPUNIT_ASSERT_EQUAL(sal_Int32(2805), getProperty<sal_Int32>(xFrame, 
"VertOrientPosition"));
+    // Vertically oriented to page due to tdf#135198
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(5304), getProperty<sal_Int32>(xFrame, 
"VertOrientPosition"));
 }
 
 DECLARE_OOXMLIMPORT_TEST(testGroupshapeRelsize, "groupshape-relsize.docx")
diff --git a/sw/source/core/layout/objectformattertxtfrm.cxx 
b/sw/source/core/layout/objectformattertxtfrm.cxx
index 18b882b1e20d..78498b9f6d3e 100644
--- a/sw/source/core/layout/objectformattertxtfrm.cxx
+++ b/sw/source/core/layout/objectformattertxtfrm.cxx
@@ -30,6 +30,10 @@
 #include <fmtfollowtextflow.hxx>
 #include <layact.hxx>
 #include <ftnfrm.hxx>
+#include <fmtornt.hxx>
+#include <textboxhelper.hxx>
+#include <svx/svdobj.hxx>
+#include <svx/svdpage.hxx>
 
 using namespace ::com::sun::star;
 
@@ -340,6 +344,32 @@ bool SwObjectFormatterTextFrame::DoFormatObjs()
            ( !mrAnchorTextFrame.IsFollow() &&
              AtLeastOneObjIsTmpConsiderWrapInfluence() ) ) )
     {
+        // tdf#135198: force text box to stay inside shape after layout changes
+        if (SwSortedObjs* pDrawObjs = mrAnchorTextFrame.GetDrawObjs())
+        {
+            // N.B.: avoid using ranged for because the iterator might get 
invalidated
+            for (size_t i = 0; i < pDrawObjs->size(); ++i)
+            {
+                SwAnchoredObject* const pObj = (*pDrawObjs)[i];
+                SwFrameFormat& rFormat = pObj->GetFrameFormat();
+                if (SwTextBoxHelper::isTextBox(&rFormat, RES_DRAWFRMFMT))
+                {
+                    SfxItemSet aSet(rFormat.GetDoc()->GetAttrPool(),
+                                    svl::Items<RES_VERT_ORIENT, RES_ANCHOR>{});
+                    if (const SwPageFrame* pPageFrame = pObj->GetPageFrame())
+                    {
+                        const SwRect& rPageFrameArea = 
pPageFrame->getFrameArea();
+                        aSet.Put(SwFormatVertOrient(pObj->GetObjRect().Top() - 
rPageFrameArea.Top(),
+                                                    
text::VertOrientation::NONE,
+                                                    
text::RelOrientation::PAGE_FRAME));
+                        aSet.Put(SwFormatAnchor(RndStdIds::FLY_AT_PAGE, 
pObj->GetPageFrame()->GetPhyPageNum()));
+
+                        SwTextBoxHelper::syncFlyFrameAttr(rFormat, aSet);
+                    }
+                }
+            }
+        }
+
         const bool bDoesAnchorHadPrev = ( mrAnchorTextFrame.GetIndPrev() != 
nullptr );
 
         // Format anchor text frame after its objects are formatted.
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to