include/oox/drawingml/shape.hxx                     |   14 ++++++++
 oox/source/drawingml/diagram/layoutatomvisitors.cxx |   32 ++++++++++++++++++++
 oox/source/drawingml/diagram/layoutnodecontext.cxx  |    2 +
 oox/source/drawingml/shape.cxx                      |    2 +
 sd/qa/unit/import-tests-smartart.cxx                |    5 +--
 5 files changed, 53 insertions(+), 2 deletions(-)

New commits:
commit cd348a6244a092c251a8e1362cd78de562d7bef6
Author:     Miklos Vajna <vmik...@collabora.com>
AuthorDate: Fri Nov 16 17:34:46 2018 +0100
Commit:     Miklos Vajna <vmik...@collabora.com>
CommitDate: Fri Nov 16 20:43:26 2018 +0100

    oox smartart, accent process: add support for zorder offsets
    
    The oox::drawingml::Shape -> css::drawing::XShape converter doesn't
    support ZOrder, so just give each drawingml::Shape a default ZOrder.
    This way the offsets can be applied, and sorting can move the shapes to
    their correct place.
    
    This makes parent text of the bugdoc readable.
    
    Change-Id: Ib87a096fba66aad4a4f35d19473ea88dab340fd0
    Reviewed-on: https://gerrit.libreoffice.org/63478
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>
    Tested-by: Jenkins

diff --git a/include/oox/drawingml/shape.hxx b/include/oox/drawingml/shape.hxx
index 4940a90c3977..646fe01daa27 100644
--- a/include/oox/drawingml/shape.hxx
+++ b/include/oox/drawingml/shape.hxx
@@ -206,6 +206,14 @@ public:
     const LinkedTxbxAttr&     getLinkedTxbxAttributes() { return 
maLinkedTxbxAttr; };
     bool                isLinkedTxbx() { return mbHasLinkedTxbx; };
 
+    void setZOrder(sal_Int32 nZOrder) { mnZOrder = nZOrder; }
+
+    sal_Int32 getZOrder() const { return mnZOrder; }
+
+    void setZOrderOff(sal_Int32 nZOrderOff) { mnZOrderOff = nZOrderOff; }
+
+    sal_Int32 getZOrderOff() const { return mnZOrderOff; }
+
 protected:
 
     css::uno::Reference< css::drawing::XShape > const &
@@ -319,6 +327,12 @@ private:
     bool                            mbHasLinkedTxbx; // this text box has 
linked text box ?
 
     css::uno::Sequence<css::beans::PropertyValue> maDiagramDoms;
+
+    /// Z-Order.
+    sal_Int32 mnZOrder = 0;
+
+    /// Z-Order offset.
+    sal_Int32 mnZOrderOff = 0;
 };
 
 } }
diff --git a/oox/source/drawingml/diagram/layoutatomvisitors.cxx 
b/oox/source/drawingml/diagram/layoutatomvisitors.cxx
index b85b5228407d..700b48080bc6 100644
--- a/oox/source/drawingml/diagram/layoutatomvisitors.cxx
+++ b/oox/source/drawingml/diagram/layoutatomvisitors.cxx
@@ -168,6 +168,38 @@ void ShapeCreationVisitor::visit(LayoutNode& rAtom)
         std::remove_if(pCurrParent->getChildren().begin(), 
pCurrParent->getChildren().end(),
             [] (const ShapePtr & aChild) { return aChild->getServiceName() == 
"com.sun.star.drawing.GroupShape" && aChild->getChildren().empty(); }),
         pCurrParent->getChildren().end());
+
+    // Offset the children from their default z-order stacking, if necessary.
+    std::vector<ShapePtr>& rChildren = pCurrParent->getChildren();
+    for (size_t i = 0; i < rChildren.size(); ++i)
+        rChildren[i]->setZOrder(i);
+
+    for (size_t i = 0; i < rChildren.size(); ++i)
+    {
+        const ShapePtr& pChild = rChildren[i];
+        sal_Int32 nZOrderOff = pChild->getZOrderOff();
+        if (nZOrderOff <= 0)
+            continue;
+
+        // Increase my ZOrder by nZOrderOff.
+        pChild->setZOrder(pChild->getZOrder() + nZOrderOff);
+        pChild->setZOrderOff(0);
+
+        for (sal_Int32 j = 0; j < nZOrderOff; ++j)
+        {
+            size_t nIndex = i + j + 1;
+            if (nIndex >= rChildren.size())
+                break;
+
+            // Decrease the ZOrder of the next nZOrderOff elements by one.
+            const ShapePtr& pNext = rChildren[nIndex];
+            pNext->setZOrder(pNext->getZOrder() - 1);
+        }
+    }
+
+    // Now that the ZOrders are adjusted, sort the children.
+    std::sort(rChildren.begin(), rChildren.end(),
+              [](const ShapePtr& a, const ShapePtr& b) { return a->getZOrder() 
< b->getZOrder(); });
 }
 
 void ShapeCreationVisitor::visit(ShapeAtom& /*rAtom*/)
diff --git a/oox/source/drawingml/diagram/layoutnodecontext.cxx 
b/oox/source/drawingml/diagram/layoutnodecontext.cxx
index d81cbdf74ae0..2cfeec2e8db6 100644
--- a/oox/source/drawingml/diagram/layoutnodecontext.cxx
+++ b/oox/source/drawingml/diagram/layoutnodecontext.cxx
@@ -210,6 +210,8 @@ LayoutNodeContext::onCreateContext( ::sal_Int32 aElement,
 
         pShape->setDiagramRotation(rAttribs.getInteger(XML_rot, 0) * 
PER_DEGREE);
 
+        pShape->setZOrderOff(rAttribs.getInteger(XML_zOrderOff, 0));
+
         ShapeAtomPtr pAtom( new ShapeAtom(mpNode->getLayoutNode(), pShape) );
         LayoutAtom::connect(mpNode, pAtom);
         return new ShapeContext( *this, ShapePtr(), pShape );
diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx
index 1d1e4d8be5a1..2c3348fcf159 100644
--- a/oox/source/drawingml/shape.cxx
+++ b/oox/source/drawingml/shape.cxx
@@ -175,6 +175,8 @@ Shape::Shape( const ShapePtr& pSourceShape )
 , maLinkedTxbxAttr()
 , mbHasLinkedTxbx(false)
 , maDiagramDoms( pSourceShape->maDiagramDoms )
+, mnZOrder(pSourceShape->mnZOrder)
+, mnZOrderOff(pSourceShape->mnZOrderOff)
 {}
 
 Shape::~Shape()
diff --git a/sd/qa/unit/import-tests-smartart.cxx 
b/sd/qa/unit/import-tests-smartart.cxx
index 898350abfba5..56c504e40b72 100644
--- a/sd/qa/unit/import-tests-smartart.cxx
+++ b/sd/qa/unit/import-tests-smartart.cxx
@@ -462,12 +462,13 @@ void SdImportTestSmartArt::testAccentProcess()
     uno::Reference<drawing::XShape> xGroupShape(xGroup, uno::UNO_QUERY);
     CPPUNIT_ASSERT(xGroupShape.is());
 
-    // The pair if a parent (text + shape) and a child, so 3 shapes in total.
+    // The pair is a parent (shape + text) and a child, so 3 shapes in total.
+    // The order is importent, first is at the back, last is at the front.
     uno::Reference<drawing::XShapes> xFirstPair(xGroup->getByIndex(0), 
uno::UNO_QUERY);
     CPPUNIT_ASSERT(xFirstPair.is());
     CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(3), xFirstPair->getCount());
 
-    uno::Reference<text::XText> xFirstParentText(xFirstPair->getByIndex(0), 
uno::UNO_QUERY);
+    uno::Reference<text::XText> xFirstParentText(xFirstPair->getByIndex(1), 
uno::UNO_QUERY);
     CPPUNIT_ASSERT(xFirstParentText.is());
     CPPUNIT_ASSERT_EQUAL(OUString("a"), xFirstParentText->getString());
     uno::Reference<drawing::XShape> xFirstParent(xFirstParentText, 
uno::UNO_QUERY);
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to