diff options
Diffstat (limited to 'src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/ParallelBuilderSplit.java')
-rw-r--r-- | src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/ParallelBuilderSplit.java | 354 |
1 files changed, 196 insertions, 158 deletions
diff --git a/src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/ParallelBuilderSplit.java b/src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/ParallelBuilderSplit.java index 4be0c9d..ae15edb 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/ParallelBuilderSplit.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/ParallelBuilderSplit.java @@ -2,7 +2,7 @@ * PlantUML : a free UML diagram generator * ======================================================================== * - * (C) Copyright 2009-2017, Arnaud Roques + * (C) Copyright 2009-2020, Arnaud Roques * * Project Info: http://plantuml.com * @@ -35,243 +35,281 @@ */ package net.sourceforge.plantuml.activitydiagram3.ftile.vcompact; -import java.awt.geom.Dimension2D; +import java.awt.geom.Point2D; import java.util.ArrayList; import java.util.List; import net.sourceforge.plantuml.ISkinParam; +import net.sourceforge.plantuml.SkinParam; +import net.sourceforge.plantuml.activitydiagram3.LinkRendering; import net.sourceforge.plantuml.activitydiagram3.ftile.AbstractConnection; import net.sourceforge.plantuml.activitydiagram3.ftile.Arrows; import net.sourceforge.plantuml.activitydiagram3.ftile.Connection; import net.sourceforge.plantuml.activitydiagram3.ftile.ConnectionTranslatable; import net.sourceforge.plantuml.activitydiagram3.ftile.Ftile; +import net.sourceforge.plantuml.activitydiagram3.ftile.FtileAssemblySimple; import net.sourceforge.plantuml.activitydiagram3.ftile.FtileGeometry; import net.sourceforge.plantuml.activitydiagram3.ftile.FtileKilled; import net.sourceforge.plantuml.activitydiagram3.ftile.FtileUtils; -import net.sourceforge.plantuml.activitydiagram3.ftile.MergeStrategy; import net.sourceforge.plantuml.activitydiagram3.ftile.Snake; import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane; -import net.sourceforge.plantuml.graphic.HtmlColorAndStyle; +import net.sourceforge.plantuml.activitydiagram3.ftile.vertical.FtileThinSplit; +import net.sourceforge.plantuml.cucadiagram.Display; +import net.sourceforge.plantuml.graphic.HtmlColor; import net.sourceforge.plantuml.graphic.Rainbow; import net.sourceforge.plantuml.graphic.StringBounder; -import net.sourceforge.plantuml.graphic.TextBlock; +import net.sourceforge.plantuml.style.SName; +import net.sourceforge.plantuml.style.Style; +import net.sourceforge.plantuml.style.StyleSignature; import net.sourceforge.plantuml.ugraphic.UGraphic; import net.sourceforge.plantuml.ugraphic.UTranslate; -public class ParallelBuilderSplit extends ParallelFtilesBuilder { +public class ParallelBuilderSplit extends AbstractParallelFtilesBuilder { - public ParallelBuilderSplit(ISkinParam skinParam, StringBounder stringBounder, - final List<Ftile> list, Ftile inner, Swimlane swimlane) { - super(skinParam, stringBounder, list, inner, swimlane); + public ParallelBuilderSplit(ISkinParam skinParam, StringBounder stringBounder, final List<Ftile> list, Ftile inner) { + super(skinParam, stringBounder, list, inner); + } + + @Override + public StyleSignature getDefaultStyleDefinition() { + return StyleSignature.of(SName.root, SName.element, SName.activityDiagram, SName.arrow); } @Override protected Ftile doStep1() { Ftile result = getMiddle(); final List<Connection> conns = new ArrayList<Connection>(); - - double x1 = 0; + final Rainbow thinColor; + if (SkinParam.USE_STYLES()) { + Style style = getDefaultStyleDefinition().getMergedStyle(skinParam().getCurrentStyleBuilder()); + thinColor = Rainbow.build(style, skinParam().getIHtmlColorSet()); + } else { + thinColor = result.getInLinkRendering().getRainbow(Rainbow.build(skinParam())); + } + final Ftile thin = new FtileThinSplit(skinParam(), getThin1Color(thinColor), getList().get(0).getSwimlaneIn()); + double x = 0; + double first = 0; + double last = 0; for (Ftile tmp : getList()) { - final Dimension2D dim = tmp.calculateDimension(getStringBounder()); - conns.add(new ConnectionIn(tmp, x1, tmp.getInLinkRendering().getRainbow( - HtmlColorAndStyle.build(skinParam())), getTextBlock(tmp.getInLinkRendering()))); - x1 += dim.getWidth(); + final FtileGeometry dim = tmp.calculateDimension(getStringBounder()); + if (first == 0) { + first = x + dim.getLeft(); + } + last = x + dim.getLeft(); + + final LinkRendering inLinkRendering = tmp.getInLinkRendering(); + final Rainbow rainbow; + if (SkinParam.USE_STYLES()) { + Style style = getDefaultStyleDefinition().getMergedStyle(skinParam().getCurrentStyleBuilder()); + rainbow = inLinkRendering.getRainbow(Rainbow.build(style, skinParam().getIHtmlColorSet())); + } else { + rainbow = inLinkRendering.getRainbow(Rainbow.build(skinParam())); + } + + conns.add(new ConnectionIn(thin, tmp, x, rainbow)); + x += dim.getWidth(); } - final double totalWidth1 = result.calculateDimension(getStringBounder()).getWidth(); - conns.add(new ConnectionHline2(result, HtmlColorAndStyle.build(skinParam()), 0, getList(), totalWidth1)); + result = FtileUtils.addConnection(result, conns); - return result; + final FtileGeometry geom = result.calculateDimension(getStringBounder()); + if (last < geom.getLeft()) { + last = geom.getLeft(); + } + if (first > geom.getLeft()) { + first = geom.getLeft(); + } + ((FtileThinSplit) thin).setGeom(first, last, result.calculateDimension(getStringBounder()).getWidth()); + + return new FtileAssemblySimple(thin, result); } - @Override - protected Ftile doStep2(Ftile result) { - final List<Connection> conns2 = new ArrayList<Connection>(); - double x2 = 0; - boolean hasOut = false; + private HtmlColor getThin1Color(final Rainbow thinColor) { for (Ftile tmp : getList()) { - final Dimension2D dim = tmp.calculateDimension(getStringBounder()); - final boolean hasOutTmp = tmp.calculateDimension(getStringBounder()).hasPointOut(); - if (hasOutTmp) { - conns2.add(new ConnectionOut(tmp, x2, tmp.getOutLinkRendering().getRainbow( - HtmlColorAndStyle.build(skinParam())), getHeightOfMiddle(), getTextBlock(tmp - .getOutLinkRendering()))); - hasOut = true; + final Rainbow rainbow; + final LinkRendering inLinkRendering = tmp.getInLinkRendering(); + if (SkinParam.USE_STYLES()) { + Style style = getDefaultStyleDefinition().getMergedStyle(skinParam().getCurrentStyleBuilder()); + rainbow = inLinkRendering.getRainbow(Rainbow.build(style, skinParam().getIHtmlColorSet())); + } else { + rainbow = inLinkRendering.getRainbow(Rainbow.build(skinParam())); + } + if (rainbow.isInvisible() == false) { + return thinColor.getColor(); } - x2 += dim.getWidth(); } + return null; + } - if (hasOut) { - final double totalWidth2 = result.calculateDimension(getStringBounder()).getWidth(); - conns2.add(new ConnectionHline2(result, HtmlColorAndStyle.build(skinParam()), getHeightOfMiddle(), - getList(), totalWidth2)); - result = FtileUtils.addConnection(result, conns2); - } else { - result = new FtileKilled(result); + private boolean hasOut() { + for (Ftile tmp : getList()) { + final boolean hasOutTmp = tmp.calculateDimension(getStringBounder()).hasPointOut(); + if (hasOutTmp) { + return true; + } } - return result; + return false; } - static class ConnectionHline2 extends AbstractConnection { + @Override + protected Ftile doStep2(Ftile result) { - private final Ftile inner; - private final double y; - private final Rainbow arrowColor; - private final List<Ftile> list; - private final double totalWidth; + final FtileGeometry geom = result.calculateDimension(getStringBounder()); + if (hasOut() == false) { + return new FtileKilled(result); + } - public ConnectionHline2(Ftile inner, Rainbow arrowColor, double y, List<Ftile> list, double totalWidth) { - super(null, null); - this.inner = inner; - this.y = y; - this.arrowColor = arrowColor; - this.list = list; - this.totalWidth = totalWidth; + final Rainbow thinColor; + final LinkRendering inLinkRendering = result.getInLinkRendering(); + if (SkinParam.USE_STYLES()) { + Style style = getDefaultStyleDefinition().getMergedStyle(skinParam().getCurrentStyleBuilder()); + thinColor = inLinkRendering.getRainbow(Rainbow.build(style, skinParam().getIHtmlColorSet())); + } else { + thinColor = inLinkRendering.getRainbow(Rainbow.build(skinParam())); } - public void drawU(UGraphic ug) { - double minX = Double.MAX_VALUE; - double maxX = 0; - if (y == 0 && ug instanceof UGraphicInterceptorOneSwimlane) { - final Swimlane intoSw = ((UGraphicInterceptorOneSwimlane) ug).getSwimlane(); - boolean found = false; - for (Ftile tmp : list) { - if (tmp.getSwimlaneIn() == intoSw) { - found = true; - } - } - if (found == false) { - return; - } - } - final StringBounder stringBounder = ug.getStringBounder(); - for (Ftile tmp : list) { - if (y > 0 && tmp.calculateDimension(stringBounder).hasPointOut() == false) { - continue; - } - final UTranslate ut = inner.getTranslateFor(tmp, stringBounder); - if (ut == null) { - continue; + final Ftile out = new FtileThinSplit(skinParam(), thinColor.getColor(), swimlaneOutForStep2()); + result = new FtileAssemblySimple(result, out); + final List<Connection> conns = new ArrayList<Connection>(); + double x = 0; + double first = 0; + double last = 0; + for (Ftile tmp : getList()) { + final UTranslate translate0 = new UTranslate(0, 1.5); + final FtileGeometry dim = tmp.calculateDimension(getStringBounder()); + if (dim.hasPointOut()) { + if (first == 0) { + first = x + dim.getLeft(); } - final double middle = tmp.calculateDimension(stringBounder).translate(ut).getLeft(); - minX = Math.min(minX, middle); - maxX = Math.max(maxX, middle); - } - if (minX > totalWidth / 2) { - minX = totalWidth / 2; + last = x + dim.getLeft(); } - if (maxX < totalWidth / 2) { - maxX = totalWidth / 2; + + final Rainbow rainbow; + final LinkRendering outLinkRendering = tmp.getOutLinkRendering(); + if (SkinParam.USE_STYLES()) { + Style style = getDefaultStyleDefinition().getMergedStyle(skinParam().getCurrentStyleBuilder()); + rainbow = outLinkRendering.getRainbow(Rainbow.build(style, skinParam().getIHtmlColorSet())); + } else { + rainbow = outLinkRendering.getRainbow(Rainbow.build(skinParam())); } - final Snake s = new Snake(arrowHorizontalAlignment(), arrowColor); - s.goUnmergeable(MergeStrategy.NONE); - s.addPoint(minX, y); - s.addPoint(maxX, y); - ug.draw(s); + conns.add(new ConnectionOut(translate0, tmp, out, x, rainbow, getHeightOfMiddle())); + x += dim.getWidth(); } - } - - static class ConnectionHline3 extends AbstractConnection implements ConnectionTranslatable { - - private final Ftile inner; - private final double y; - private final Rainbow arrowColor; - private final List<Ftile> list; - private final double totalWidth; - - public ConnectionHline3(Ftile inner, Rainbow arrowColor, double y, List<Ftile> list, double totalWidth) { - super(null, null); - this.inner = inner; - this.y = y; - this.arrowColor = arrowColor; - this.list = list; - this.totalWidth = totalWidth; + if (last < geom.getLeft()) { + last = geom.getLeft(); } - - public void drawU(UGraphic ug) { - throw new UnsupportedOperationException(); - } - - public void drawTranslate(UGraphic ug, UTranslate translate1, UTranslate translate2) { - final StringBounder stringBounder = ug.getStringBounder(); - final UTranslate left = inner.getSwimlaneIn().getTranslate(); - double minX = inner.calculateDimension(stringBounder).getLeft() + left.getDx(); - double maxX = minX; - - for (Ftile tmp : list) { - final FtileGeometry tmpGeom = tmp.calculateDimension(stringBounder); - final UTranslate tpos = inner.getTranslateFor(tmp, stringBounder); - for (Swimlane sw : tmp.getSwimlanes()) { - final double x = tmpGeom.translate(sw.getTranslate().compose(tpos)).getLeft(); - minX = Math.min(minX, x); - maxX = Math.max(maxX, x); - } - } - final Dimension2D dimInner = inner.calculateDimension(stringBounder); - - final Snake s = new Snake(arrowHorizontalAlignment(), arrowColor); - // final Snake s = new Snake(HtmlColorUtils.GREEN); - s.goUnmergeable(MergeStrategy.LIMITED); - s.addPoint(minX, y); - s.addPoint(maxX, y); - ug.draw(s); + if (first > geom.getLeft()) { + first = geom.getLeft(); } + ((FtileThinSplit) out).setGeom(first, last, geom.getWidth()); + result = FtileUtils.addConnection(result, conns); + return result; } - static class ConnectionIn extends AbstractConnection { + class ConnectionIn extends AbstractConnection implements ConnectionTranslatable { private final double x; private final Rainbow arrowColor; - private final TextBlock text; + private final Display label; - public ConnectionIn(Ftile tmp, double x, Rainbow arrowColor, TextBlock text) { - super(null, tmp); + public ConnectionIn(Ftile ftile1, Ftile ftile2, double x, Rainbow arrowColor) { + super(ftile1, ftile2); + label = ftile2.getInLinkRendering().getDisplay(); this.x = x; this.arrowColor = arrowColor; - this.text = text; } public void drawU(UGraphic ug) { ug = ug.apply(new UTranslate(x, 0)); - final FtileGeometry geo = getFtile2().calculateDimension(ug.getStringBounder()); - final double left = geo.getLeft(); - final Snake s = new Snake(arrowHorizontalAlignment(), arrowColor, Arrows.asToDown()); - s.setLabel(text); - s.addPoint(left, 0); - s.addPoint(left, geo.getInY()); - ug.draw(s); + final FtileGeometry geo = getFtile2().calculateDimension(getStringBounder()); + final Snake snake = new Snake(arrowHorizontalAlignment(), arrowColor, Arrows.asToDown()); + if (Display.isNull(label) == false) { + snake.setLabel(getTextBlock(label)); + } + snake.addPoint(geo.getLeft(), 0); + snake.addPoint(geo.getLeft(), geo.getInY()); + ug.draw(snake); + } + + public void drawTranslate(UGraphic ug, UTranslate translate1, UTranslate translate2) { + ug = ug.apply(new UTranslate(x, 0)); + final FtileGeometry geo = getFtile2().calculateDimension(getStringBounder()); + final Point2D p1 = new Point2D.Double(geo.getLeft(), 0); + final Point2D p2 = new Point2D.Double(geo.getLeft(), geo.getInY()); + + final Snake snake = new Snake(arrowHorizontalAlignment(), arrowColor, Arrows.asToDown()); + if (Display.isNull(label) == false) { + snake.setLabel(getTextBlock(label)); + } + final Point2D mp1a = translate1.getTranslated(p1); + final Point2D mp2b = translate2.getTranslated(p2); + final double middle = mp1a.getY() + 4; + snake.addPoint(mp1a); + snake.addPoint(mp1a.getX(), middle); + snake.addPoint(mp2b.getX(), middle); + snake.addPoint(mp2b); + ug.draw(snake); } } - static class ConnectionOut extends AbstractConnection { + class ConnectionOut extends AbstractConnection implements ConnectionTranslatable { private final double x; private final Rainbow arrowColor; private final double height; - private final TextBlock text; + private final Display label; + private final UTranslate translate0; - public ConnectionOut(Ftile tmp, double x, Rainbow arrowColor, double height, TextBlock text) { - super(tmp, null); + public ConnectionOut(UTranslate translate0, Ftile ftile1, Ftile ftile2, double x, Rainbow arrowColor, + double height) { + super(ftile1, ftile2); + this.translate0 = translate0; + this.label = ftile1.getOutLinkRendering().getDisplay(); this.x = x; this.arrowColor = arrowColor; this.height = height; - this.text = text; } public void drawU(UGraphic ug) { ug = ug.apply(new UTranslate(x, 0)); - final FtileGeometry geo = getFtile1().calculateDimension(ug.getStringBounder()); + final FtileGeometry geo = getFtile1().calculateDimension(getStringBounder()); + if (geo.hasPointOut() == false) { + return; + } + final Snake snake = new Snake(arrowHorizontalAlignment(), arrowColor, Arrows.asToDown()); + if (Display.isNull(label) == false) { + snake.setLabel(getTextBlock(label)); + } + final Point2D p1 = translate0.getTranslated(new Point2D.Double(geo.getLeft(), geo.getOutY())); + final Point2D p2 = translate0.getTranslated(new Point2D.Double(geo.getLeft(), height)); + snake.addPoint(p1); + snake.addPoint(p2); + ug.draw(snake); + } + + public void drawTranslate(UGraphic ug, UTranslate translate1, UTranslate translate2) { + ug = ug.apply(new UTranslate(x, 0)); + final FtileGeometry geo = getFtile1().calculateDimension(getStringBounder()); if (geo.hasPointOut() == false) { - assert false; return; } - final Snake s = new Snake(arrowHorizontalAlignment(), arrowColor, Arrows.asToDown()); - s.setLabel(text); - s.goUnmergeable(MergeStrategy.NONE); - s.addPoint(geo.getLeft(), geo.getOutY()); - s.addPoint(geo.getLeft(), height); - ug.draw(s); + final Point2D p1 = translate0.getTranslated(new Point2D.Double(geo.getLeft(), geo.getOutY())); + final Point2D p2 = translate0.getTranslated(new Point2D.Double(geo.getLeft(), height)); + + final Snake snake = new Snake(arrowHorizontalAlignment(), arrowColor, Arrows.asToDown()); + if (Display.isNull(label) == false) { + snake.setLabel(getTextBlock(label)); + } + final Point2D mp1a = translate1.getTranslated(p1); + final Point2D mp2b = translate2.getTranslated(p2); + final double middle = mp2b.getY() - 14; + snake.addPoint(mp1a); + snake.addPoint(mp1a.getX(), middle); + snake.addPoint(mp2b.getX(), middle); + snake.addPoint(mp2b); + ug.draw(snake); } + } } |