summaryrefslogtreecommitdiff
path: root/src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/ParallelBuilderSplit.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/ParallelBuilderSplit.java')
-rw-r--r--src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/ParallelBuilderSplit.java354
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);
}
+
}
}