From d0fe54026da6593ffa2b699db8a3836dcfdeff3a Mon Sep 17 00:00:00 2001 From: Arnaud Roques Date: Mon, 20 Sep 2021 18:38:08 +0200 Subject: [PATCH] Fix broken switch/case arrows when using kill/detach --- .../cond/FtileSwitchWithManyLinks.java | 33 ++++++++++++------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/cond/FtileSwitchWithManyLinks.java b/src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/cond/FtileSwitchWithManyLinks.java index 5b34df40421..9b475149a91 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/cond/FtileSwitchWithManyLinks.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/cond/FtileSwitchWithManyLinks.java @@ -280,27 +280,36 @@ public double getYdelta1a(StringBounder stringBounder) { public Ftile addLinks(StringBounder stringBounder) { final List conns = new ArrayList<>(); + addIngoingArrows(conns); + addOutgoingArrows(stringBounder, conns); + return FtileUtils.addConnection(this, conns); + } + + private void addIngoingArrows(final List conns) { conns.add(new ConnectionHorizontalThenVertical(tiles.get(0), branches.get(0))); conns.add(new ConnectionHorizontalThenVertical(tiles.get(tiles.size() - 1), branches.get(tiles.size() - 1))); - - final int first = getFirst(stringBounder); - final int last = getLast(stringBounder); - if (first < tiles.size()) - conns.add(new ConnectionVerticalThenHorizontal(tiles.get(first))); - if (last > 0) - conns.add(new ConnectionVerticalThenHorizontal(tiles.get(last))); - for (int i = first + 1; i < last; i++) { + for (int i = 1; i < tiles.size() - 1; i++) { final Ftile tile = tiles.get(i); conns.add(new ConnectionVerticalTop(tile, branches.get(i))); + } + } + + private void addOutgoingArrows(StringBounder stringBounder, final List conns) { + final int firstOutgoingArrow = getFirstOutgoingArrow(stringBounder); + final int lastOutgoingArrow = getLastOutgoingArrow(stringBounder); + if (firstOutgoingArrow < tiles.size()) + conns.add(new ConnectionVerticalThenHorizontal(tiles.get(firstOutgoingArrow))); + if (lastOutgoingArrow > 0) + conns.add(new ConnectionVerticalThenHorizontal(tiles.get(lastOutgoingArrow))); + for (int i = firstOutgoingArrow + 1; i < lastOutgoingArrow; i++) { + final Ftile tile = tiles.get(i); if (tile.calculateDimension(stringBounder).hasPointOut()) { conns.add(new ConnectionVerticalBottom(tile)); } } - - return FtileUtils.addConnection(this, conns); } - private int getFirst(StringBounder stringBounder) { + private int getFirstOutgoingArrow(StringBounder stringBounder) { for (int i = 0; i < tiles.size() - 1; i++) { final Ftile tile = tiles.get(i); if (tile.calculateDimension(stringBounder).hasPointOut()) { @@ -310,7 +319,7 @@ private int getFirst(StringBounder stringBounder) { return tiles.size(); } - private int getLast(StringBounder stringBounder) { + private int getLastOutgoingArrow(StringBounder stringBounder) { for (int i = tiles.size() - 1; i >= 0; i--) { final Ftile tile = tiles.get(i); if (tile.calculateDimension(stringBounder).hasPointOut()) {