summaryrefslogtreecommitdiff
path: root/oox
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.com>2018-11-27 17:41:05 +0100
committerMiklos Vajna <vmiklos@collabora.com>2018-12-17 13:35:08 +0100
commit467a2ab7e52be376ee7f0dee9bd44f7a4ed38267 (patch)
treef035cd77c43034c6c343067180974e9e0bcac5b2 /oox
parent1571c42e1fe64c6146161b08585737d3ba288629 (diff)
oox smartart, accent process: handle followSib axis of forEach
Currently the accept process document creates 0 connectors. Instead, it creates empty custom shapes: this commit fixes the loop, so that only one of them is created. The whole purpose of the follow sibling axis is that N - 1 connectors are created for N shapes, not N connectors. Change-Id: I54244c7615b83f607ef53a4ff8d01d3c9594856e Reviewed-on: https://gerrit.libreoffice.org/64122 Reviewed-by: Miklos Vajna <vmiklos@collabora.com> Tested-by: Jenkins (cherry picked from commit aedc5427e4b6645ff3257e523c33190cf5e1934d) Reviewed-on: https://gerrit.libreoffice.org/65250
Diffstat (limited to 'oox')
-rw-r--r--oox/source/drawingml/diagram/layoutatomvisitors.cxx14
-rw-r--r--oox/source/drawingml/diagram/layoutatomvisitors.hxx2
2 files changed, 16 insertions, 0 deletions
diff --git a/oox/source/drawingml/diagram/layoutatomvisitors.cxx b/oox/source/drawingml/diagram/layoutatomvisitors.cxx
index 700b48080bc6..ced94784aff4 100644
--- a/oox/source/drawingml/diagram/layoutatomvisitors.cxx
+++ b/oox/source/drawingml/diagram/layoutatomvisitors.cxx
@@ -48,6 +48,14 @@ void ShapeCreationVisitor::visit(AlgAtom& rAtom)
void ShapeCreationVisitor::visit(ForEachAtom& rAtom)
{
+ if (rAtom.iterator().mnAxis == XML_followSib)
+ {
+ // If the axis is the follow sibling, then the last atom should not be
+ // visited.
+ if (mnCurrIdx + mnCurrStep >= mnCurrCnt)
+ return;
+ }
+
const std::vector<LayoutAtomPtr>& rChildren=rAtom.getChildren();
sal_Int32 nChildren=1;
@@ -67,7 +75,11 @@ void ShapeCreationVisitor::visit(ForEachAtom& rAtom)
rAtom.iterator().mnCnt==-1 ? nChildren : rAtom.iterator().mnCnt);
const sal_Int32 nOldIdx=mnCurrIdx;
+ const sal_Int32 nOldStep = mnCurrStep;
+ const sal_Int32 nOldCnt = mnCurrCnt;
const sal_Int32 nStep=rAtom.iterator().mnStep;
+ mnCurrStep = nStep;
+ mnCurrCnt = nCnt;
for( mnCurrIdx=0; mnCurrIdx<nCnt && nStep>0; mnCurrIdx+=nStep )
{
// TODO there is likely some conditions
@@ -77,6 +89,8 @@ void ShapeCreationVisitor::visit(ForEachAtom& rAtom)
// and restore idx
mnCurrIdx = nOldIdx;
+ mnCurrStep = nOldStep;
+ mnCurrCnt = nOldCnt;
}
void ShapeCreationVisitor::visit(ConditionAtom& rAtom)
diff --git a/oox/source/drawingml/diagram/layoutatomvisitors.hxx b/oox/source/drawingml/diagram/layoutatomvisitors.hxx
index 299739186315..f395f6a68668 100644
--- a/oox/source/drawingml/diagram/layoutatomvisitors.hxx
+++ b/oox/source/drawingml/diagram/layoutatomvisitors.hxx
@@ -33,6 +33,8 @@ class ShapeCreationVisitor : public LayoutAtomVisitor
ShapePtr mpParentShape;
const Diagram& mrDgm;
sal_Int32 mnCurrIdx;
+ sal_Int32 mnCurrStep = 0;
+ sal_Int32 mnCurrCnt = 0;
const dgm::Point* mpCurrentNode;
void defaultVisit(LayoutAtom const & rAtom);