1
0
mirror of https://github.com/octoleo/plantuml.git synced 2024-11-30 00:33:53 +00:00

WIP on gtile

This commit is contained in:
Arnaud Roques 2021-10-29 18:48:50 +02:00
parent 7a30afc9be
commit 5908de8966
22 changed files with 1104 additions and 104 deletions

View File

@ -36,6 +36,7 @@
package net.sourceforge.plantuml; package net.sourceforge.plantuml;
import java.awt.geom.Dimension2D; import java.awt.geom.Dimension2D;
import java.awt.geom.Point2D;
import net.sourceforge.plantuml.utils.MathUtils; import net.sourceforge.plantuml.utils.MathUtils;
@ -52,6 +53,10 @@ public class Dimension2DDouble extends Dimension2D {
this.height = height; this.height = height;
} }
public Dimension2DDouble(Point2D point) {
this(point.getX(), point.getY());
}
@Override @Override
public String toString() { public String toString() {
return "[" + width + "," + height + "]"; return "[" + width + "," + height + "]";

View File

@ -46,12 +46,14 @@ import net.sourceforge.plantuml.activitydiagram3.ftile.Ftile;
import net.sourceforge.plantuml.activitydiagram3.ftile.FtileFactory; import net.sourceforge.plantuml.activitydiagram3.ftile.FtileFactory;
import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane; import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane;
import net.sourceforge.plantuml.activitydiagram3.ftile.WeldingPoint; import net.sourceforge.plantuml.activitydiagram3.ftile.WeldingPoint;
import net.sourceforge.plantuml.activitydiagram3.gtile.Gtile;
import net.sourceforge.plantuml.command.CommandExecutionResult; import net.sourceforge.plantuml.command.CommandExecutionResult;
import net.sourceforge.plantuml.creole.CreoleMode; import net.sourceforge.plantuml.creole.CreoleMode;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.FontConfiguration;
import net.sourceforge.plantuml.graphic.HorizontalAlignment; import net.sourceforge.plantuml.graphic.HorizontalAlignment;
import net.sourceforge.plantuml.graphic.Rainbow; import net.sourceforge.plantuml.graphic.Rainbow;
import net.sourceforge.plantuml.graphic.StringBounder;
import net.sourceforge.plantuml.graphic.TextBlock; import net.sourceforge.plantuml.graphic.TextBlock;
import net.sourceforge.plantuml.graphic.TextBlockUtils; import net.sourceforge.plantuml.graphic.TextBlockUtils;
import net.sourceforge.plantuml.graphic.color.Colors; import net.sourceforge.plantuml.graphic.color.Colors;
@ -78,6 +80,7 @@ public class Branch {
private final HColor color; private final HColor color;
private Ftile ftile; private Ftile ftile;
private Gtile gtile;
public StyleSignature getDefaultStyleDefinitionArrow() { public StyleSignature getDefaultStyleDefinitionArrow() {
return StyleSignature.of(SName.root, SName.element, SName.activityDiagram, SName.arrow); return StyleSignature.of(SName.root, SName.element, SName.activityDiagram, SName.arrow);
@ -134,6 +137,10 @@ public class Branch {
this.ftile = factory.decorateOut(list.createFtile(factory), inlinkRendering); this.ftile = factory.decorateOut(list.createFtile(factory), inlinkRendering);
} }
public void updateGtile(ISkinParam skinParam, StringBounder stringBounder) {
this.gtile = list.createGtile(skinParam, stringBounder);
}
public Collection<? extends Swimlane> getSwimlanes() { public Collection<? extends Swimlane> getSwimlanes() {
return list.getSwimlanes(); return list.getSwimlanes();
} }
@ -186,6 +193,10 @@ public class Branch {
return ftile; return ftile;
} }
public Gtile getGtile() {
return gtile;
}
public ISkinParam skinParam() { public ISkinParam skinParam() {
return ftile.skinParam(); return ftile.skinParam();
} }

View File

@ -50,8 +50,11 @@ import net.sourceforge.plantuml.activitydiagram3.ftile.FtileFactory;
import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane; import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane;
import net.sourceforge.plantuml.activitydiagram3.ftile.WeldingPoint; import net.sourceforge.plantuml.activitydiagram3.ftile.WeldingPoint;
import net.sourceforge.plantuml.activitydiagram3.ftile.vcompact.FtileWithNoteOpale; import net.sourceforge.plantuml.activitydiagram3.ftile.vcompact.FtileWithNoteOpale;
import net.sourceforge.plantuml.activitydiagram3.gtile.Gtile;
import net.sourceforge.plantuml.activitydiagram3.gtile.GtileIfHexagon;
import net.sourceforge.plantuml.command.CommandExecutionResult; import net.sourceforge.plantuml.command.CommandExecutionResult;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.graphic.StringBounder;
import net.sourceforge.plantuml.graphic.color.Colors; import net.sourceforge.plantuml.graphic.color.Colors;
import net.sourceforge.plantuml.sequencediagram.NotePosition; import net.sourceforge.plantuml.sequencediagram.NotePosition;
import net.sourceforge.plantuml.sequencediagram.NoteType; import net.sourceforge.plantuml.sequencediagram.NoteType;
@ -73,6 +76,7 @@ public class InstructionIf extends WithNote implements Instruction, InstructionC
private final Swimlane swimlane; private final Swimlane swimlane;
@Override
public boolean containsBreak() { public boolean containsBreak() {
for (Branch branch : thens) { for (Branch branch : thens) {
if (branch.containsBreak()) { if (branch.containsBreak()) {
@ -97,18 +101,40 @@ public class InstructionIf extends WithNote implements Instruction, InstructionC
this.current = this.thens.get(0); this.current = this.thens.get(0);
} }
@Override
public CommandExecutionResult add(Instruction ins) { public CommandExecutionResult add(Instruction ins) {
return current.add(ins); return current.add(ins);
} }
@Override
public Gtile createGtile(ISkinParam skinParam, StringBounder stringBounder) {
for (Branch branch : thens)
branch.updateGtile(skinParam, stringBounder);
final List<Gtile> gtiles = new ArrayList<>();
final List<Branch> branches = new ArrayList<>();
for (Branch branch : thens) {
gtiles.add(branch.getGtile());
branches.add(branch);
}
if (elseBranch != null && elseBranch.isEmpty() == false) {
elseBranch.updateGtile(skinParam, stringBounder);
gtiles.add(elseBranch.getGtile());
branches.add(elseBranch);
}
return new GtileIfHexagon(swimlane, gtiles, branches);
}
@Override
public Ftile createFtile(FtileFactory factory) { public Ftile createFtile(FtileFactory factory) {
for (Branch branch : thens) { for (Branch branch : thens) {
branch.updateFtile(factory); branch.updateFtile(factory);
} }
if (elseBranch == null) { if (elseBranch == null)
this.elseBranch = new Branch(skinParam.getCurrentStyleBuilder(), swimlane, LinkRendering.none(), this.elseBranch = new Branch(skinParam.getCurrentStyleBuilder(), swimlane, LinkRendering.none(),
Display.NULL, null, LinkRendering.none()); Display.NULL, null, LinkRendering.none());
}
elseBranch.updateFtile(factory); elseBranch.updateFtile(factory);
Ftile result = factory.createIf(swimlane, thens, elseBranch, outColor, topInlinkRendering, url); Ftile result = factory.createIf(swimlane, thens, elseBranch, outColor, topInlinkRendering, url);
if (getPositionedNotes().size() > 0) { if (getPositionedNotes().size() > 0) {
@ -163,6 +189,7 @@ public class InstructionIf extends WithNote implements Instruction, InstructionC
this.current.setInlinkRendering(nextLinkRenderer); this.current.setInlinkRendering(nextLinkRenderer);
} }
@Override
final public boolean kill() { final public boolean kill() {
if (endifCalled) { if (endifCalled) {
for (Branch branch : thens) { for (Branch branch : thens) {
@ -178,6 +205,7 @@ public class InstructionIf extends WithNote implements Instruction, InstructionC
return current.kill(); return current.kill();
} }
@Override
public LinkRendering getInLinkRendering() { public LinkRendering getInLinkRendering() {
return topInlinkRendering; return topInlinkRendering;
} }
@ -191,6 +219,7 @@ public class InstructionIf extends WithNote implements Instruction, InstructionC
} }
} }
@Override
public Set<Swimlane> getSwimlanes() { public Set<Swimlane> getSwimlanes() {
final Set<Swimlane> result = new HashSet<>(); final Set<Swimlane> result = new HashSet<>();
if (swimlane != null) { if (swimlane != null) {
@ -205,14 +234,17 @@ public class InstructionIf extends WithNote implements Instruction, InstructionC
return Collections.unmodifiableSet(result); return Collections.unmodifiableSet(result);
} }
@Override
public Swimlane getSwimlaneIn() { public Swimlane getSwimlaneIn() {
return swimlane; return swimlane;
} }
@Override
public Swimlane getSwimlaneOut() { public Swimlane getSwimlaneOut() {
return swimlane; return swimlane;
} }
@Override
public Instruction getLast() { public Instruction getLast() {
if (elseBranch == null) { if (elseBranch == null) {
return thens.get(thens.size() - 1).getLast(); return thens.get(thens.size() - 1).getLast();

View File

@ -48,8 +48,8 @@ import net.sourceforge.plantuml.activitydiagram3.ftile.FtileEmpty;
import net.sourceforge.plantuml.activitydiagram3.ftile.FtileFactory; import net.sourceforge.plantuml.activitydiagram3.ftile.FtileFactory;
import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane; import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane;
import net.sourceforge.plantuml.activitydiagram3.ftile.WeldingPoint; import net.sourceforge.plantuml.activitydiagram3.ftile.WeldingPoint;
import net.sourceforge.plantuml.activitydiagram3.gtile.GConnectionVerticalDown;
import net.sourceforge.plantuml.activitydiagram3.gtile.Gtile; import net.sourceforge.plantuml.activitydiagram3.gtile.Gtile;
import net.sourceforge.plantuml.activitydiagram3.gtile.GtileAssembly;
import net.sourceforge.plantuml.activitydiagram3.gtile.GtileEmpty; import net.sourceforge.plantuml.activitydiagram3.gtile.GtileEmpty;
import net.sourceforge.plantuml.command.CommandExecutionResult; import net.sourceforge.plantuml.command.CommandExecutionResult;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
@ -113,7 +113,7 @@ public class InstructionList extends WithNote implements Instruction, Instructio
if (result == null) { if (result == null) {
result = cur; result = cur;
} else { } else {
result = new GConnectionVerticalDown(result, cur, ins.getInLinkRendering()); result = new GtileAssembly(result, cur, ins.getInLinkRendering());
} }
} }
return result; return result;

View File

@ -53,12 +53,11 @@ public class TextBlockInterceptorUDrawable extends AbstractTextBlock implements
} }
public void drawU(UGraphic ug) { public void drawU(UGraphic ug) {
textBlock.drawU(new UGraphicInterceptorUDrawable2(ug, new HashMap<String, UTranslate>())); new UGraphicInterceptorUDrawable2(ug, new HashMap<String, UTranslate>()).draw(textBlock);
ug.flushUg(); ug.flushUg();
} }
public Dimension2D calculateDimension(StringBounder stringBounder) { public Dimension2D calculateDimension(StringBounder stringBounder) {
// return TextBlockUtils.getMinMax(this, stringBounder).getDimension();
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }

View File

@ -38,6 +38,7 @@ package net.sourceforge.plantuml.activitydiagram3.ftile;
import java.awt.geom.Point2D; import java.awt.geom.Point2D;
import java.util.Map; import java.util.Map;
import net.sourceforge.plantuml.activitydiagram3.gtile.GConnection;
import net.sourceforge.plantuml.activitydiagram3.gtile.Gtile; import net.sourceforge.plantuml.activitydiagram3.gtile.Gtile;
import net.sourceforge.plantuml.graphic.UDrawable; import net.sourceforge.plantuml.graphic.UDrawable;
import net.sourceforge.plantuml.graphic.UGraphicDelegator; import net.sourceforge.plantuml.graphic.UGraphicDelegator;
@ -63,8 +64,12 @@ public class UGraphicInterceptorUDrawable2 extends UGraphicDelegator {
public void draw(UShape shape) { public void draw(UShape shape) {
if (shape instanceof Gtile) { if (shape instanceof Gtile) {
final Gtile gtile = (Gtile) shape; final Gtile gtile = (Gtile) shape;
System.err.println("gtile=" + gtile); // System.err.println("gtile=" + gtile);
gtile.drawU(this); gtile.drawU(this);
// FtileWithConnection
for (GConnection c : gtile.getInnerConnections()) {
this.draw(c);
}
} else if (shape instanceof Ftile) { } else if (shape instanceof Ftile) {
final Ftile ftile = (Ftile) shape; final Ftile ftile = (Ftile) shape;
// System.err.println("ftile=" + ftile); // System.err.println("ftile=" + ftile);

View File

@ -36,15 +36,16 @@
package net.sourceforge.plantuml.activitydiagram3.gtile; package net.sourceforge.plantuml.activitydiagram3.gtile;
import java.awt.geom.Dimension2D; import java.awt.geom.Dimension2D;
import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.Set; import java.util.Set;
import net.sourceforge.plantuml.ISkinParam; import net.sourceforge.plantuml.ISkinParam;
import net.sourceforge.plantuml.LineParam; import net.sourceforge.plantuml.LineParam;
import net.sourceforge.plantuml.activitydiagram3.ftile.Ftile;
import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane; import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane;
import net.sourceforge.plantuml.graphic.AbstractTextBlock; import net.sourceforge.plantuml.graphic.AbstractTextBlock;
import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.StringBounder;
import net.sourceforge.plantuml.skin.rose.Rose;
import net.sourceforge.plantuml.ugraphic.UStroke; import net.sourceforge.plantuml.ugraphic.UStroke;
import net.sourceforge.plantuml.ugraphic.UTranslate; import net.sourceforge.plantuml.ugraphic.UTranslate;
import net.sourceforge.plantuml.ugraphic.color.HColorSet; import net.sourceforge.plantuml.ugraphic.color.HColorSet;
@ -97,15 +98,18 @@ public abstract class AbstractGtile extends AbstractTextBlock implements Gtile {
return new UTranslate(dim.getWidth() / 2, 0); return new UTranslate(dim.getWidth() / 2, 0);
if (name.equals(GPoint.SOUTH)) if (name.equals(GPoint.SOUTH))
return new UTranslate(dim.getWidth() / 2, dim.getHeight()); return new UTranslate(dim.getWidth() / 2, dim.getHeight());
if (name.equals(GPoint.WEST))
return new UTranslate(0, dim.getHeight() / 2);
if (name.equals(GPoint.EAST))
return new UTranslate(dim.getWidth(), dim.getHeight() / 2);
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
@Override @Override
public GPoint getGPoint(String name) { public GPoint getGPoint(String name) {
if (name.equals(GPoint.NORTH)) if (name.equals(GPoint.NORTH) || name.equals(GPoint.SOUTH) || name.equals(GPoint.WEST)
return new GPoint(this, GPoint.NORTH); || name.equals(GPoint.EAST))
if (name.equals(GPoint.SOUTH)) return new GPoint(this, name);
return new GPoint(this, GPoint.SOUTH);
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
@ -128,11 +132,11 @@ public abstract class AbstractGtile extends AbstractTextBlock implements Gtile {
// public LinkRendering getOutLinkRendering() { // public LinkRendering getOutLinkRendering() {
// return LinkRendering.none(); // return LinkRendering.none();
// } // }
//
// public Collection<Connection> getInnerConnections() { public Collection<GConnection> getInnerConnections() {
// return Collections.emptyList(); return Collections.emptyList();
// } }
//
// public UTranslate getTranslateFor(Ftile child, StringBounder stringBounder) { // public UTranslate getTranslateFor(Ftile child, StringBounder stringBounder) {
// throw new UnsupportedOperationException("" + getClass()); // throw new UnsupportedOperationException("" + getClass());
// } // }
@ -145,17 +149,12 @@ public abstract class AbstractGtile extends AbstractTextBlock implements Gtile {
return thickness; return thickness;
} }
private final Rose rose = new Rose();
final public Ftile getFtile1() { protected final Rose getRose() {
throw new UnsupportedOperationException("WIP1"); return rose;
} }
final public Ftile getFtile2() {
throw new UnsupportedOperationException("WIP2");
}
// public List<WeldingPoint> getWeldingPoints() { // public List<WeldingPoint> getWeldingPoints() {
// return Collections.emptyList(); // return Collections.emptyList();
// } // }

View File

@ -0,0 +1,61 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2020, Arnaud Roques
*
* Project Info: http://plantuml.com
*
* If you like this project or if you find it useful, you can support us at:
*
* http://plantuml.com/patreon (only 1$ per month!)
* http://plantuml.com/paypal
*
* This file is part of PlantUML.
*
* PlantUML is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* PlantUML distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
* License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
*
* Original Author: Arnaud Roques
*
*
*/
package net.sourceforge.plantuml.activitydiagram3.gtile;
import java.util.Arrays;
import java.util.List;
public abstract class GAbstractConnection implements GConnection {
protected final GPoint gpoint1;
protected final GPoint gpoint2;
public GAbstractConnection(GPoint gpoint1, GPoint gpoint2) {
this.gpoint1 = gpoint1;
this.gpoint2 = gpoint2;
}
@Override
public String toString() {
return "[" + gpoint1 + "]->[" + gpoint2 + "]";
}
@Override
final public List<GPoint> getHooks() {
return Arrays.asList(gpoint1, gpoint2);
}
}

View File

@ -37,7 +37,10 @@ package net.sourceforge.plantuml.activitydiagram3.gtile;
import java.util.List; import java.util.List;
public interface GConnection extends Gtile { import net.sourceforge.plantuml.graphic.UDrawable;
import net.sourceforge.plantuml.ugraphic.UShape;
public interface GConnection extends UDrawable, UShape {
public List<GPoint> getHooks(); public List<GPoint> getHooks();

View File

@ -0,0 +1,130 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2020, Arnaud Roques
*
* Project Info: http://plantuml.com
*
* If you like this project or if you find it useful, you can support us at:
*
* http://plantuml.com/patreon (only 1$ per month!)
* http://plantuml.com/paypal
*
* This file is part of PlantUML.
*
* PlantUML is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* PlantUML distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
* License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
*
* Original Author: Arnaud Roques
*
*
*/
package net.sourceforge.plantuml.activitydiagram3.gtile;
import java.awt.geom.Point2D;
import net.sourceforge.plantuml.activitydiagram3.ftile.Arrows;
import net.sourceforge.plantuml.activitydiagram3.ftile.Snake;
import net.sourceforge.plantuml.graphic.HorizontalAlignment;
import net.sourceforge.plantuml.graphic.Rainbow;
import net.sourceforge.plantuml.graphic.TextBlock;
import net.sourceforge.plantuml.ugraphic.UGraphic;
import net.sourceforge.plantuml.ugraphic.UTranslate;
public class GConnectionHorizontalThenVerticalDown extends GAbstractConnection implements GConnectionTranslatable {
private final TextBlock textBlock;
private final UTranslate pos1;
private final UTranslate pos2;
public GConnectionHorizontalThenVerticalDown(UTranslate pos1, GPoint gpoint1, UTranslate pos2, GPoint gpoint2,
TextBlock textBlock) {
super(gpoint1, gpoint2);
this.textBlock = textBlock;
this.pos1 = pos1;
this.pos2 = pos2;
// See FtileFactoryDelegatorAssembly
}
@Override
public void drawTranslate(UGraphic ug, UTranslate translate1, UTranslate translate2) {
throw new UnsupportedOperationException();
}
@Override
public void drawU(UGraphic ug) {
ug.draw(getSimpleSnake());
}
// public double getMaxX(StringBounder stringBounder) {
// return getSimpleSnake().getMaxX(stringBounder);
// }
private Rainbow getInLinkRenderingColor() {
Rainbow color;
color = Rainbow.build(gpoint1.getGtile().skinParam());
// final LinkRendering linkRendering = tile.getInLinkRendering();
// if (linkRendering == null) {
// if (UseStyle.useBetaStyle()) {
// final Style style = getDefaultStyleDefinitionArrow()
// .getMergedStyle(skinParam().getCurrentStyleBuilder());
// return Rainbow.build(style, skinParam().getIHtmlColorSet(), skinParam().getThemeStyle());
// } else {
// color = Rainbow.build(skinParam());
// }
// } else {
// color = linkRendering.getRainbow();
// }
// if (color.size() == 0) {
// if (UseStyle.useBetaStyle()) {
// final Style style = getDefaultStyleDefinitionArrow()
// .getMergedStyle(skinParam().getCurrentStyleBuilder());
// return Rainbow.build(style, skinParam().getIHtmlColorSet(), skinParam().getThemeStyle());
// } else {
// color = Rainbow.build(skinParam());
// }
// }
return color;
}
private Snake getSimpleSnake() {
final Snake snake = Snake.create(getInLinkRenderingColor(), Arrows.asToDown()).withLabel(textBlock,
HorizontalAlignment.LEFT);
final Point2D p1 = pos1.getTranslated(gpoint1.getPoint2D());
final Point2D p2 = pos2.getTranslated(gpoint2.getPoint2D());
snake.addPoint(p1);
snake.addPoint(new Point2D.Double(p2.getX(), p1.getY()));
snake.addPoint(p2);
return snake;
}
// @Override
// public void drawTranslate(UGraphic ug, UTranslate translate1, UTranslate translate2) {
// final Snake snake = Snake.create(color, Arrows.asToDown()).withLabel(textBlock, HorizontalAlignment.LEFT);
// final Point2D mp1a = translate1.getTranslated(p1);
// final Point2D mp2b = translate2.getTranslated(p2);
// final double middle = (mp1a.getY() + mp2b.getY()) / 2.0;
// snake.addPoint(mp1a);
// snake.addPoint(mp1a.getX(), middle);
// snake.addPoint(mp2b.getX(), middle);
// snake.addPoint(mp2b);
// ug.draw(snake);
//
// }
}

View File

@ -0,0 +1,45 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2020, Arnaud Roques
*
* Project Info: http://plantuml.com
*
* If you like this project or if you find it useful, you can support us at:
*
* http://plantuml.com/patreon (only 1$ per month!)
* http://plantuml.com/paypal
*
* This file is part of PlantUML.
*
* PlantUML is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* PlantUML distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
* License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
*
* Original Author: Arnaud Roques
*
*
*/
package net.sourceforge.plantuml.activitydiagram3.gtile;
import net.sourceforge.plantuml.ugraphic.UGraphic;
import net.sourceforge.plantuml.ugraphic.UTranslate;
public interface GConnectionTranslatable extends GConnection {
public void drawTranslate(UGraphic ug, UTranslate translate1, UTranslate translate2);
}

View File

@ -35,79 +35,83 @@
*/ */
package net.sourceforge.plantuml.activitydiagram3.gtile; package net.sourceforge.plantuml.activitydiagram3.gtile;
import net.sourceforge.plantuml.FontParam; import java.awt.geom.Point2D;
import net.sourceforge.plantuml.UseStyle;
import net.sourceforge.plantuml.activitydiagram3.LinkRendering; import net.sourceforge.plantuml.activitydiagram3.ftile.Arrows;
import net.sourceforge.plantuml.activitydiagram3.ftile.ConnectionTranslatable; import net.sourceforge.plantuml.activitydiagram3.ftile.Snake;
import net.sourceforge.plantuml.creole.CreoleMode;
import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.graphic.FontConfiguration;
import net.sourceforge.plantuml.graphic.HorizontalAlignment; import net.sourceforge.plantuml.graphic.HorizontalAlignment;
import net.sourceforge.plantuml.graphic.Rainbow;
import net.sourceforge.plantuml.graphic.TextBlock; import net.sourceforge.plantuml.graphic.TextBlock;
import net.sourceforge.plantuml.graphic.TextBlockUtils;
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.UGraphic;
import net.sourceforge.plantuml.ugraphic.UTranslate; import net.sourceforge.plantuml.ugraphic.UTranslate;
public class GConnectionVerticalDown extends GtileAssemblySimple implements ConnectionTranslatable { public class GConnectionVerticalDown extends GAbstractConnection implements GConnectionTranslatable {
private final TextBlock textBlock; private final TextBlock textBlock;
private final UTranslate pos1;
private final UTranslate pos2;
public GConnectionVerticalDown(Gtile tile1, Gtile tile2, LinkRendering linkRendering) { public GConnectionVerticalDown(UTranslate pos1, GPoint gpoint1, UTranslate pos2, GPoint gpoint2,
super(tile1, tile2); TextBlock textBlock) {
this.textBlock = getTextBlock(linkRendering.getDisplay()); super(gpoint1, gpoint2);
this.textBlock = textBlock;
this.pos1 = pos1;
this.pos2 = pos2;
// See FtileFactoryDelegatorAssembly // See FtileFactoryDelegatorAssembly
} }
@Override
protected UTranslate supplementaryMove() {
final double height = 30 + textBlock.calculateDimension(stringBounder).getHeight();
System.err.println("height=" + height);
return new UTranslate(0, height);
}
final public StyleSignature getDefaultStyleDefinitionArrow() {
return StyleSignature.of(SName.root, SName.element, SName.activityDiagram, SName.arrow);
}
protected final TextBlock getTextBlock(Display display) {
// DUP3945
if (Display.isNull(display)) {
return TextBlockUtils.EMPTY_TEXT_BLOCK;
}
final FontConfiguration fontConfiguration;
if (UseStyle.useBetaStyle()) {
final Style style = getDefaultStyleDefinitionArrow().getMergedStyle(skinParam().getCurrentStyleBuilder());
fontConfiguration = style.getFontConfiguration(skinParam().getThemeStyle(), skinParam().getIHtmlColorSet());
} else {
fontConfiguration = new FontConfiguration(skinParam(), FontParam.ARROW, null);
}
return display.create7(fontConfiguration, HorizontalAlignment.LEFT, skinParam(), CreoleMode.SIMPLE_LINE);
}
@Override @Override
public void drawTranslate(UGraphic ug, UTranslate translate1, UTranslate translate2) { public void drawTranslate(UGraphic ug, UTranslate translate1, UTranslate translate2) {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
// public void drawU(UGraphic ug) { @Override
// ug.draw(getSimpleSnake()); public void drawU(UGraphic ug) {
// } ug.draw(getSimpleSnake());
// }
// public double getMaxX(StringBounder stringBounder) { // public double getMaxX(StringBounder stringBounder) {
// return getSimpleSnake().getMaxX(stringBounder); // return getSimpleSnake().getMaxX(stringBounder);
// } // }
//
// private Snake getSimpleSnake() { private Rainbow getInLinkRenderingColor() {
// final Snake snake = Snake.create(color, Arrows.asToDown()).withLabel(textBlock, HorizontalAlignment.LEFT); Rainbow color;
//// snake.addPoint(p1); color = Rainbow.build(gpoint1.getGtile().skinParam());
//// snake.addPoint(p2); // final LinkRendering linkRendering = tile.getInLinkRendering();
// return snake; // if (linkRendering == null) {
// if (UseStyle.useBetaStyle()) {
// final Style style = getDefaultStyleDefinitionArrow()
// .getMergedStyle(skinParam().getCurrentStyleBuilder());
// return Rainbow.build(style, skinParam().getIHtmlColorSet(), skinParam().getThemeStyle());
// } else {
// color = Rainbow.build(skinParam());
// } // }
// // } else {
// color = linkRendering.getRainbow();
// }
// if (color.size() == 0) {
// if (UseStyle.useBetaStyle()) {
// final Style style = getDefaultStyleDefinitionArrow()
// .getMergedStyle(skinParam().getCurrentStyleBuilder());
// return Rainbow.build(style, skinParam().getIHtmlColorSet(), skinParam().getThemeStyle());
// } else {
// color = Rainbow.build(skinParam());
// }
// }
return color;
}
private Snake getSimpleSnake() {
final Snake snake = Snake.create(getInLinkRenderingColor(), Arrows.asToDown()).withLabel(textBlock,
HorizontalAlignment.LEFT);
final Point2D p1 = pos1.getTranslated(gpoint1.getPoint2D());
final Point2D p2 = pos2.getTranslated(gpoint2.getPoint2D());
snake.addPoint(p1);
snake.addPoint(p2);
return snake;
}
// @Override // @Override
// public void drawTranslate(UGraphic ug, UTranslate translate1, UTranslate translate2) { // public void drawTranslate(UGraphic ug, UTranslate translate1, UTranslate translate2) {
// final Snake snake = Snake.create(color, Arrows.asToDown()).withLabel(textBlock, HorizontalAlignment.LEFT); // final Snake snake = Snake.create(color, Arrows.asToDown()).withLabel(textBlock, HorizontalAlignment.LEFT);

View File

@ -0,0 +1,132 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2020, Arnaud Roques
*
* Project Info: http://plantuml.com
*
* If you like this project or if you find it useful, you can support us at:
*
* http://plantuml.com/patreon (only 1$ per month!)
* http://plantuml.com/paypal
*
* This file is part of PlantUML.
*
* PlantUML is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* PlantUML distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
* License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
*
* Original Author: Arnaud Roques
*
*
*/
package net.sourceforge.plantuml.activitydiagram3.gtile;
import java.awt.geom.Point2D;
import net.sourceforge.plantuml.activitydiagram3.ftile.Arrows;
import net.sourceforge.plantuml.activitydiagram3.ftile.Snake;
import net.sourceforge.plantuml.graphic.HorizontalAlignment;
import net.sourceforge.plantuml.graphic.Rainbow;
import net.sourceforge.plantuml.graphic.TextBlock;
import net.sourceforge.plantuml.ugraphic.UGraphic;
import net.sourceforge.plantuml.ugraphic.UPolygon;
import net.sourceforge.plantuml.ugraphic.UTranslate;
public class GConnectionVerticalDownThenHorizontal extends GAbstractConnection implements GConnectionTranslatable {
private final TextBlock textBlock;
private final UTranslate pos1;
private final UTranslate pos2;
public GConnectionVerticalDownThenHorizontal(UTranslate pos1, GPoint gpoint1, UTranslate pos2, GPoint gpoint2,
TextBlock textBlock) {
super(gpoint1, gpoint2);
this.textBlock = textBlock;
this.pos1 = pos1;
this.pos2 = pos2;
// See FtileFactoryDelegatorAssembly
}
@Override
public void drawTranslate(UGraphic ug, UTranslate translate1, UTranslate translate2) {
throw new UnsupportedOperationException();
}
@Override
public void drawU(UGraphic ug) {
ug.draw(getSimpleSnake());
}
// public double getMaxX(StringBounder stringBounder) {
// return getSimpleSnake().getMaxX(stringBounder);
// }
private Rainbow getInLinkRenderingColor() {
Rainbow color;
color = Rainbow.build(gpoint1.getGtile().skinParam());
// final LinkRendering linkRendering = tile.getInLinkRendering();
// if (linkRendering == null) {
// if (UseStyle.useBetaStyle()) {
// final Style style = getDefaultStyleDefinitionArrow()
// .getMergedStyle(skinParam().getCurrentStyleBuilder());
// return Rainbow.build(style, skinParam().getIHtmlColorSet(), skinParam().getThemeStyle());
// } else {
// color = Rainbow.build(skinParam());
// }
// } else {
// color = linkRendering.getRainbow();
// }
// if (color.size() == 0) {
// if (UseStyle.useBetaStyle()) {
// final Style style = getDefaultStyleDefinitionArrow()
// .getMergedStyle(skinParam().getCurrentStyleBuilder());
// return Rainbow.build(style, skinParam().getIHtmlColorSet(), skinParam().getThemeStyle());
// } else {
// color = Rainbow.build(skinParam());
// }
// }
return color;
}
private Snake getSimpleSnake() {
final Point2D p1 = pos1.getTranslated(gpoint1.getPoint2D());
final Point2D p2 = pos2.getTranslated(gpoint2.getPoint2D());
final UPolygon arrow = p1.getX() < p2.getX() ? Arrows.asToRight() : Arrows.asToLeft();
final Snake snake = Snake.create(getInLinkRenderingColor(), arrow).withLabel(textBlock,
HorizontalAlignment.LEFT);
snake.addPoint(p1);
snake.addPoint(new Point2D.Double(p1.getX(), p2.getY()));
snake.addPoint(p2);
return snake;
}
// @Override
// public void drawTranslate(UGraphic ug, UTranslate translate1, UTranslate translate2) {
// final Snake snake = Snake.create(color, Arrows.asToDown()).withLabel(textBlock, HorizontalAlignment.LEFT);
// final Point2D mp1a = translate1.getTranslated(p1);
// final Point2D mp2b = translate2.getTranslated(p2);
// final double middle = (mp1a.getY() + mp2b.getY()) / 2.0;
// snake.addPoint(mp1a);
// snake.addPoint(mp1a.getX(), middle);
// snake.addPoint(mp2b.getX(), middle);
// snake.addPoint(mp2b);
// ug.draw(snake);
//
// }
}

View File

@ -35,6 +35,8 @@
*/ */
package net.sourceforge.plantuml.activitydiagram3.gtile; package net.sourceforge.plantuml.activitydiagram3.gtile;
import java.awt.geom.Point2D;
import net.sourceforge.plantuml.activitydiagram3.LinkRendering; import net.sourceforge.plantuml.activitydiagram3.LinkRendering;
import net.sourceforge.plantuml.ugraphic.UTranslate; import net.sourceforge.plantuml.ugraphic.UTranslate;
@ -42,6 +44,8 @@ public class GPoint {
public static final String NORTH = "NORTH"; public static final String NORTH = "NORTH";
public static final String SOUTH = "SOUTH"; public static final String SOUTH = "SOUTH";
public static final String WEST = "WEST";
public static final String EAST = "EAST";
private final Gtile gtile; private final Gtile gtile;
private final String name; private final String name;
@ -69,6 +73,10 @@ public class GPoint {
return gtile.getCoord(name); return gtile.getCoord(name);
} }
public Point2D getPoint2D() {
return getCoord().getPosition();
}
public LinkRendering getLinkRendering() { public LinkRendering getLinkRendering() {
return linkRendering; return linkRendering;
} }

View File

@ -35,6 +35,8 @@
*/ */
package net.sourceforge.plantuml.activitydiagram3.gtile; package net.sourceforge.plantuml.activitydiagram3.gtile;
import java.util.Collection;
import net.sourceforge.plantuml.ISkinParam; import net.sourceforge.plantuml.ISkinParam;
import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.StringBounder;
import net.sourceforge.plantuml.graphic.TextBlock; import net.sourceforge.plantuml.graphic.TextBlock;
@ -56,8 +58,8 @@ public interface Gtile extends Swimable2, TextBlock {
public GPoint getGPoint(String name); public GPoint getGPoint(String name);
// public Collection<Connection> getInnerConnections(); public Collection<GConnection> getInnerConnections();
//
// public List<WeldingPoint> getWeldingPoints(); // public List<WeldingPoint> getWeldingPoints();
// //
// public HorizontalAlignment arrowHorizontalAlignment(); // public HorizontalAlignment arrowHorizontalAlignment();

View File

@ -0,0 +1,97 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2020, Arnaud Roques
*
* Project Info: http://plantuml.com
*
* If you like this project or if you find it useful, you can support us at:
*
* http://plantuml.com/patreon (only 1$ per month!)
* http://plantuml.com/paypal
*
* This file is part of PlantUML.
*
* PlantUML is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* PlantUML distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
* License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
*
* Original Author: Arnaud Roques
*
*
*/
package net.sourceforge.plantuml.activitydiagram3.gtile;
import java.util.Collection;
import java.util.Collections;
import net.sourceforge.plantuml.FontParam;
import net.sourceforge.plantuml.UseStyle;
import net.sourceforge.plantuml.activitydiagram3.LinkRendering;
import net.sourceforge.plantuml.creole.CreoleMode;
import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.graphic.FontConfiguration;
import net.sourceforge.plantuml.graphic.HorizontalAlignment;
import net.sourceforge.plantuml.graphic.TextBlock;
import net.sourceforge.plantuml.graphic.TextBlockUtils;
import net.sourceforge.plantuml.style.SName;
import net.sourceforge.plantuml.style.Style;
import net.sourceforge.plantuml.style.StyleSignature;
import net.sourceforge.plantuml.ugraphic.UTranslate;
public class GtileAssembly extends GtileAssemblySimple {
private final TextBlock textBlock;
public GtileAssembly(Gtile tile1, Gtile tile2, LinkRendering linkRendering) {
super(tile1, tile2);
this.textBlock = getTextBlock(linkRendering.getDisplay());
// See FtileFactoryDelegatorAssembly
}
@Override
protected UTranslate supplementaryMove() {
final double height = 30 + textBlock.calculateDimension(stringBounder).getHeight();
return new UTranslate(0, height);
}
final public StyleSignature getDefaultStyleDefinitionArrow() {
return StyleSignature.of(SName.root, SName.element, SName.activityDiagram, SName.arrow);
}
protected final TextBlock getTextBlock(Display display) {
// DUP3945
if (Display.isNull(display)) {
return TextBlockUtils.EMPTY_TEXT_BLOCK;
}
final FontConfiguration fontConfiguration;
if (UseStyle.useBetaStyle()) {
final Style style = getDefaultStyleDefinitionArrow().getMergedStyle(skinParam().getCurrentStyleBuilder());
fontConfiguration = style.getFontConfiguration(skinParam().getThemeStyle(), skinParam().getIHtmlColorSet());
} else {
fontConfiguration = new FontConfiguration(skinParam(), FontParam.ARROW, null);
}
return display.create7(fontConfiguration, HorizontalAlignment.LEFT, skinParam(), CreoleMode.SIMPLE_LINE);
}
@Override
public Collection<GConnection> getInnerConnections() {
final GConnection arrow = new GConnectionVerticalDown(getPos1(), tile1.getGPoint(GPoint.SOUTH), getPos2(),
tile2.getGPoint(GPoint.NORTH), textBlock);
return Collections.singletonList(arrow);
}
}

View File

@ -41,7 +41,6 @@ import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Set; import java.util.Set;
import net.sourceforge.plantuml.Dimension2DDouble; import net.sourceforge.plantuml.Dimension2DDouble;
@ -49,17 +48,18 @@ import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane;
import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.StringBounder;
import net.sourceforge.plantuml.ugraphic.UGraphic; import net.sourceforge.plantuml.ugraphic.UGraphic;
import net.sourceforge.plantuml.ugraphic.UTranslate; import net.sourceforge.plantuml.ugraphic.UTranslate;
import net.sourceforge.plantuml.utils.MathUtils;
public class GtileAssemblySimple extends AbstractGtile implements GConnection { public class GtileAssemblySimple extends AbstractGtile {
protected final Gtile tile1; protected final Gtile tile1;
protected final Gtile tile2; protected final Gtile tile2;
protected final Dimension2D dim1; private final Dimension2D dim1;
protected final Dimension2D dim2; private final Dimension2D dim2;
protected final UTranslate pos1; private final UTranslate pos1;
protected final UTranslate pos2; private final UTranslate pos2;
@Override @Override
public String toString() { public String toString() {
@ -77,20 +77,23 @@ public class GtileAssemblySimple extends AbstractGtile implements GConnection {
final UTranslate vector1 = tile1.getCoord(GPoint.SOUTH); final UTranslate vector1 = tile1.getCoord(GPoint.SOUTH);
final UTranslate vector2 = tile2.getCoord(GPoint.NORTH); final UTranslate vector2 = tile2.getCoord(GPoint.NORTH);
final UTranslate diff = vector1.compose(vector2.reverse()); // final UTranslate diff = vector1.compose(vector2.reverse());
// this.pos1 = diff.getDx() > 0 ? UTranslate.none() : UTranslate.dx(-diff.getDx());
// this.pos2 = diff.compose(this.pos1);
this.pos1 = diff.getDx() > 0 ? UTranslate.none() : UTranslate.dx(-diff.getDx()); final double maxDx = Math.max(vector1.getDx(), vector2.getDx());
this.pos2 = diff.compose(this.pos1); this.pos1 = UTranslate.dx(maxDx - vector1.getDx());
this.pos2 = new UTranslate(maxDx - vector2.getDx(), dim1.getHeight());
} }
protected UTranslate supplementaryMove() { protected UTranslate supplementaryMove() {
return new UTranslate(); return new UTranslate();
} }
@Override // @Override
public List<GPoint> getHooks() { // public List<GPoint> getHooks() {
return Arrays.asList(tile1.getGPoint(GPoint.SOUTH), tile2.getGPoint(GPoint.SOUTH)); // return Arrays.asList(tile1.getGPoint(GPoint.SOUTH), tile2.getGPoint(GPoint.NORTH));
} // }
@Override @Override
public UTranslate getCoord(String name) { public UTranslate getCoord(String name) {
@ -101,11 +104,11 @@ public class GtileAssemblySimple extends AbstractGtile implements GConnection {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
private UTranslate getPos1() { protected UTranslate getPos1() {
return pos1; return pos1;
} }
private UTranslate getPos2() { protected UTranslate getPos2() {
return pos2.compose(supplementaryMove()); return pos2.compose(supplementaryMove());
} }
@ -118,9 +121,7 @@ public class GtileAssemblySimple extends AbstractGtile implements GConnection {
public Dimension2D calculateDimension(StringBounder stringBounder) { public Dimension2D calculateDimension(StringBounder stringBounder) {
final Point2D corner1 = getPos1().getTranslated(dim1); final Point2D corner1 = getPos1().getTranslated(dim1);
final Point2D corner2 = getPos2().getTranslated(dim2); final Point2D corner2 = getPos2().getTranslated(dim2);
final double width = Math.max(corner1.getX(), corner2.getX()); return new Dimension2DDouble(MathUtils.max(corner1, corner2));
final double height = Math.max(corner1.getY(), corner2.getY());
return new Dimension2DDouble(width, height);
} }
public Set<Swimlane> getSwimlanes() { public Set<Swimlane> getSwimlanes() {

View File

@ -0,0 +1,115 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2020, Arnaud Roques
*
* Project Info: http://plantuml.com
*
* If you like this project or if you find it useful, you can support us at:
*
* http://plantuml.com/patreon (only 1$ per month!)
* http://plantuml.com/paypal
*
* This file is part of PlantUML.
*
* PlantUML is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* PlantUML distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
* License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
*
* Original Author: Arnaud Roques
*
*
*/
package net.sourceforge.plantuml.activitydiagram3.gtile;
import java.awt.geom.Dimension2D;
import net.sourceforge.plantuml.Dimension2DDouble;
import net.sourceforge.plantuml.ISkinParam;
import net.sourceforge.plantuml.UseStyle;
import net.sourceforge.plantuml.activitydiagram3.ftile.Hexagon;
import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane;
import net.sourceforge.plantuml.graphic.StringBounder;
import net.sourceforge.plantuml.graphic.TextBlock;
import net.sourceforge.plantuml.style.PName;
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;
import net.sourceforge.plantuml.ugraphic.color.HColor;
public class GtileDiamondInside extends AbstractGtile {
protected final HColor backColor;
protected final HColor borderColor;
protected final TextBlock label;
protected final Dimension2D dimLabel;
protected final double shadowing;
final public StyleSignature getDefaultStyleDefinition() {
return StyleSignature.of(SName.root, SName.element, SName.activityDiagram, SName.activity, SName.diamond);
}
// FtileDiamondInside
public GtileDiamondInside(StringBounder stringBounder, TextBlock label, ISkinParam skinParam, HColor backColor,
HColor borderColor, Swimlane swimlane) {
super(stringBounder, skinParam, swimlane);
if (UseStyle.useBetaStyle()) {
Style style = getDefaultStyleDefinition().getMergedStyle(skinParam.getCurrentStyleBuilder());
this.borderColor = style.value(PName.LineColor).asColor(skinParam.getThemeStyle(), getIHtmlColorSet());
this.backColor = style.value(PName.BackGroundColor).asColor(skinParam.getThemeStyle(), getIHtmlColorSet());
this.shadowing = style.value(PName.Shadowing).asDouble();
} else {
this.backColor = backColor;
this.borderColor = borderColor;
this.shadowing = skinParam().shadowing(null) ? 3 : 0;
}
this.label = label;
this.dimLabel = label.calculateDimension(stringBounder);
}
@Override
public Dimension2D calculateDimension(StringBounder stringBounder) {
final Dimension2D dim;
if (dimLabel.getWidth() == 0 || dimLabel.getHeight() == 0) {
dim = new Dimension2DDouble(Hexagon.hexagonHalfSize * 2, Hexagon.hexagonHalfSize * 2);
} else {
dim = Dimension2DDouble.delta(
Dimension2DDouble.atLeast(dimLabel, Hexagon.hexagonHalfSize * 2, Hexagon.hexagonHalfSize * 2),
Hexagon.hexagonHalfSize * 2, 0);
}
return dim;
}
@Override
public void drawU(UGraphic ug) {
final StringBounder stringBounder = ug.getStringBounder();
final Dimension2D dimTotal = calculateDimension(stringBounder);
ug = ug.apply(borderColor).apply(getThickness()).apply(backColor.bg());
ug.draw(Hexagon.asPolygon(shadowing, dimTotal.getWidth(), dimTotal.getHeight()));
final double lx = (dimTotal.getWidth() - dimLabel.getWidth()) / 2;
final double ly = (dimTotal.getHeight() - dimLabel.getHeight()) / 2;
label.drawU(ug.apply(new UTranslate(lx, ly)));
}
}

View File

@ -0,0 +1,221 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2020, Arnaud Roques
*
* Project Info: http://plantuml.com
*
* If you like this project or if you find it useful, you can support us at:
*
* http://plantuml.com/patreon (only 1$ per month!)
* http://plantuml.com/paypal
*
* This file is part of PlantUML.
*
* PlantUML is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* PlantUML distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
* License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
*
* Original Author: Arnaud Roques
*
*
*/
package net.sourceforge.plantuml.activitydiagram3.gtile;
import java.awt.geom.Dimension2D;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.ListIterator;
import net.sourceforge.plantuml.ColorParam;
import net.sourceforge.plantuml.Dimension2DDouble;
import net.sourceforge.plantuml.FontParam;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.UseStyle;
import net.sourceforge.plantuml.activitydiagram3.Branch;
import net.sourceforge.plantuml.activitydiagram3.ftile.Hexagon;
import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane;
import net.sourceforge.plantuml.creole.CreoleMode;
import net.sourceforge.plantuml.creole.Parser;
import net.sourceforge.plantuml.creole.Sheet;
import net.sourceforge.plantuml.creole.SheetBlock1;
import net.sourceforge.plantuml.creole.SheetBlock2;
import net.sourceforge.plantuml.graphic.FontConfiguration;
import net.sourceforge.plantuml.graphic.HorizontalAlignment;
import net.sourceforge.plantuml.graphic.StringBounder;
import net.sourceforge.plantuml.graphic.TextBlock;
import net.sourceforge.plantuml.graphic.TextBlockUtils;
import net.sourceforge.plantuml.style.PName;
import net.sourceforge.plantuml.style.SName;
import net.sourceforge.plantuml.style.Style;
import net.sourceforge.plantuml.style.StyleSignature;
import net.sourceforge.plantuml.svek.ConditionEndStyle;
import net.sourceforge.plantuml.svek.ConditionStyle;
import net.sourceforge.plantuml.ugraphic.UGraphic;
import net.sourceforge.plantuml.ugraphic.UStroke;
import net.sourceforge.plantuml.ugraphic.UTranslate;
import net.sourceforge.plantuml.ugraphic.color.HColor;
public class GtileIfHexagon extends GtileIfSimple {
private final List<Branch> branches;
private final Gtile shape1;
private final Gtile shape2;
private final UTranslate positionShape1;
private final UTranslate positionShape2;
@Override
public String toString() {
return "GtileIfHexagon " + gtiles;
}
// ConditionalBuilder
// FtileFactoryDelegatorIf
public GtileIfHexagon(Swimlane swimlane, List<Gtile> gtiles, List<Branch> branches) {
super(gtiles);
final ConditionStyle conditionStyle = skinParam().getConditionStyle();
final ConditionEndStyle conditionEndStyle = skinParam().getConditionEndStyle();
this.branches = branches;
final Branch branch0 = branches.get(0);
final HColor borderColor;
final HColor backColor;
final FontConfiguration fcTest;
if (UseStyle.useBetaStyle()) {
final Style styleArrow = getDefaultStyleDefinitionArrow()
.getMergedStyle(skinParam().getCurrentStyleBuilder());
final Style styleDiamond = getDefaultStyleDefinitionDiamond()
.getMergedStyle(skinParam().getCurrentStyleBuilder());
borderColor = styleDiamond.value(PName.LineColor).asColor(skinParam().getThemeStyle(),
skinParam().getIHtmlColorSet());
backColor = branch0.getColor() == null ? styleDiamond.value(PName.BackGroundColor)
.asColor(skinParam().getThemeStyle(), skinParam().getIHtmlColorSet()) : branch0.getColor();
// arrowColor = Rainbow.build(styleArrow, skinParam().getIHtmlColorSet(), skinParam().getThemeStyle());
fcTest = styleDiamond.getFontConfiguration(skinParam().getThemeStyle(), skinParam().getIHtmlColorSet());
// fcArrow = styleArrow.getFontConfiguration(skinParam().getThemeStyle(), skinParam().getIHtmlColorSet());
} else {
final FontParam testParam = conditionStyle == ConditionStyle.INSIDE_HEXAGON ? FontParam.ACTIVITY_DIAMOND
: FontParam.ARROW;
borderColor = getRose().getHtmlColor(skinParam(), ColorParam.activityDiamondBorder);
backColor = branch0.getColor() == null
? getRose().getHtmlColor(skinParam(), ColorParam.activityDiamondBackground)
: branch0.getColor();
// arrowColor = Rainbow.build(skinParam());
fcTest = new FontConfiguration(skinParam(), testParam, null)
.changeColor(fontColor(FontParam.ACTIVITY_DIAMOND));
// fcArrow = new FontConfiguration(skinParam(), FontParam.ARROW, null);
}
final Sheet sheet = Parser.build(fcTest, skinParam().getDefaultTextAlignment(HorizontalAlignment.LEFT),
skinParam(), CreoleMode.FULL).createSheet(branch0.getLabelTest());
final SheetBlock1 sheetBlock1 = new SheetBlock1(sheet, LineBreakStrategy.NONE, skinParam().getPadding());
final TextBlock tbTest = new SheetBlock2(sheetBlock1, Hexagon.asStencil(sheetBlock1), new UStroke());
this.shape1 = new GtileDiamondInside(getStringBounder(), tbTest, skinParam(), backColor, borderColor, swimlane);
this.shape2 = new GtileDiamondInside(getStringBounder(), TextBlockUtils.EMPTY_TEXT_BLOCK, skinParam(),
backColor, borderColor, swimlane);
final double height1 = shape1.calculateDimension(stringBounder).getHeight() + getSuppHeightMargin();
// public GtileDiamondInside(StringBounder stringBounder, TextBlock label, ISkinParam skinParam, HColor backColor,
// HColor borderColor, Swimlane swimlane) {
for (ListIterator<UTranslate> it = positions.listIterator(); it.hasNext();) {
final UTranslate tmp = it.next();
it.set(tmp.compose(UTranslate.dy(height1)));
}
this.positionShape1 = this.getCoord(GPoint.NORTH).compose(shape1.getCoord(GPoint.NORTH).reverse());
this.positionShape2 = this.getCoord(GPoint.SOUTH).compose(shape2.getCoord(GPoint.SOUTH).reverse());
}
private double getSuppHeightMargin() {
if (branches.size() == 1)
return 30;
return 10;
}
@Override
public Dimension2D calculateDimension(StringBounder stringBounder) {
final double height2 = shape2.calculateDimension(stringBounder).getHeight() + getSuppHeightMargin();
final Dimension2D result = super.calculateDimension(stringBounder);
return Dimension2DDouble.delta(result, 0, height2);
}
private HColor fontColor(FontParam param) {
return skinParam().getFontHtmlColor(null, param);
}
final public StyleSignature getDefaultStyleDefinitionActivity() {
return StyleSignature.of(SName.root, SName.element, SName.activityDiagram, SName.activity);
}
final public StyleSignature getDefaultStyleDefinitionDiamond() {
return StyleSignature.of(SName.root, SName.element, SName.activityDiagram, SName.activity, SName.diamond);
}
final public StyleSignature getDefaultStyleDefinitionArrow() {
return StyleSignature.of(SName.root, SName.element, SName.activityDiagram, SName.arrow);
}
@Override
public void drawU(UGraphic ug) {
super.drawU(ug);
shape1.drawU(ug.apply(positionShape1));
shape2.drawU(ug.apply(positionShape2));
}
@Override
public Collection<GConnection> getInnerConnections() {
if (branches.size() == 1) {
final GConnection arrow1 = new GConnectionVerticalDown(positionShape1, shape1.getGPoint(GPoint.SOUTH),
positions.get(0), gtiles.get(0).getGPoint(GPoint.NORTH), TextBlockUtils.EMPTY_TEXT_BLOCK);
final GConnection arrow2 = new GConnectionVerticalDown(positions.get(0),
gtiles.get(0).getGPoint(GPoint.SOUTH), positionShape2, shape2.getGPoint(GPoint.NORTH),
TextBlockUtils.EMPTY_TEXT_BLOCK);
return Arrays.asList(arrow1, arrow2);
} else if (branches.size() == 2) {
final GConnection arrow1 = new GConnectionHorizontalThenVerticalDown(positionShape1,
shape1.getGPoint(GPoint.WEST), positions.get(0), gtiles.get(0).getGPoint(GPoint.NORTH),
TextBlockUtils.EMPTY_TEXT_BLOCK);
final GConnection arrow2 = new GConnectionHorizontalThenVerticalDown(positionShape1,
shape1.getGPoint(GPoint.EAST), positions.get(1), gtiles.get(1).getGPoint(GPoint.NORTH),
TextBlockUtils.EMPTY_TEXT_BLOCK);
final GConnection arrow3 = new GConnectionVerticalDownThenHorizontal(positions.get(0),
gtiles.get(0).getGPoint(GPoint.SOUTH), positionShape2, shape2.getGPoint(GPoint.WEST),
TextBlockUtils.EMPTY_TEXT_BLOCK);
final GConnection arrow4 = new GConnectionVerticalDownThenHorizontal(positions.get(1),
gtiles.get(1).getGPoint(GPoint.SOUTH), positionShape2, shape2.getGPoint(GPoint.EAST),
TextBlockUtils.EMPTY_TEXT_BLOCK);
return Arrays.asList(arrow1, arrow2, arrow3, arrow4);
}
return super.getInnerConnections();
}
}

View File

@ -0,0 +1,114 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2020, Arnaud Roques
*
* Project Info: http://plantuml.com
*
* If you like this project or if you find it useful, you can support us at:
*
* http://plantuml.com/patreon (only 1$ per month!)
* http://plantuml.com/paypal
*
* This file is part of PlantUML.
*
* PlantUML is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* PlantUML distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
* License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
*
* Original Author: Arnaud Roques
*
*
*/
package net.sourceforge.plantuml.activitydiagram3.gtile;
import java.awt.geom.Dimension2D;
import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import net.sourceforge.plantuml.Dimension2DDouble;
import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane;
import net.sourceforge.plantuml.graphic.StringBounder;
import net.sourceforge.plantuml.ugraphic.UGraphic;
import net.sourceforge.plantuml.ugraphic.UTranslate;
import net.sourceforge.plantuml.utils.MathUtils;
public class GtileIfSimple extends AbstractGtile {
protected final List<Gtile> gtiles;
private final List<Dimension2D> dims = new ArrayList<>();
protected final List<UTranslate> positions = new ArrayList<>();
@Override
public String toString() {
return "GtileIfSimple " + gtiles;
}
public GtileIfSimple(List<Gtile> gtiles) {
super(gtiles.get(0).getStringBounder(), gtiles.get(0).skinParam());
this.gtiles = gtiles;
double dx = 0;
for (Gtile tile : gtiles) {
final Dimension2D dim = tile.calculateDimension(getStringBounder());
final UTranslate pos = UTranslate.dx(dx);
dx += dim.getWidth() + getMargin();
dims.add(dim);
positions.add(pos);
}
}
private double getMargin() {
return 20;
}
public void drawU(UGraphic ug) {
for (int i = 0; i < gtiles.size(); i++) {
final Gtile tile = gtiles.get(i);
final UTranslate pos = positions.get(i);
ug.apply(pos).draw(tile);
}
}
@Override
public Dimension2D calculateDimension(StringBounder stringBounder) {
Point2D result = new Point2D.Double();
for (int i = 0; i < dims.size(); i++) {
final Dimension2D dim = dims.get(i);
final UTranslate pos = positions.get(i);
final Point2D corner = pos.getTranslated(dim);
result = MathUtils.max(result, corner);
}
return new Dimension2DDouble(result);
}
public Set<Swimlane> getSwimlanes() {
final Set<Swimlane> result = new HashSet<>();
for (Gtile tile : gtiles)
result.addAll(tile.getSwimlanes());
return Collections.unmodifiableSet(result);
}
public Collection<Gtile> getMyChildren() {
return Collections.unmodifiableCollection(gtiles);
}
}

View File

@ -291,11 +291,13 @@ public final class AtomText extends AbstractAtom implements Atom {
private boolean isSeparator(char ch) { private boolean isSeparator(char ch) {
return Character.isWhitespace(ch) // return Character.isWhitespace(ch) //
|| ch == '\uFF0C' // U+FF0C FULLWIDTH COMMA (,)
|| ch == '\uFF01' // U+FF01 FULLWIDTH EXCLAMATION MARK (!) || ch == '\uFF01' // U+FF01 FULLWIDTH EXCLAMATION MARK (!)
|| ch == '\uFF1F' // U+FF1F FULLWIDTH QUESTION MARK (?) || ch == '\uFF08' // U+FF08 FULLWIDTH LEFT PARENTHESIS
|| ch == '\uFF1B' // U+FF1B FULLWIDTH SEMICOLON (;) || ch == '\uFF09' // U+FF09 FULLWIDTH RIGHT PARENTHESIS
|| ch == '\uFF0C' // U+FF0C FULLWIDTH COMMA
|| ch == '\uFF1A' // U+FF1A FULLWIDTH COLON (:) || ch == '\uFF1A' // U+FF1A FULLWIDTH COLON (:)
|| ch == '\uFF1B' // U+FF1B FULLWIDTH SEMICOLON (;)
|| ch == '\uFF1F' // U+FF1F FULLWIDTH QUESTION MARK (?)
|| ch == '\u3002'; // U+3002 IDEOGRAPHIC FULL STOP (.) || ch == '\u3002'; // U+3002 IDEOGRAPHIC FULL STOP (.)
} }

View File

@ -35,6 +35,11 @@
*/ */
package net.sourceforge.plantuml.utils; package net.sourceforge.plantuml.utils;
import java.awt.geom.Dimension2D;
import java.awt.geom.Point2D;
import net.sourceforge.plantuml.Dimension2DDouble;
public class MathUtils { public class MathUtils {
public static double max(double a, double b) { public static double max(double a, double b) {
@ -84,4 +89,13 @@ public class MathUtils {
return v; return v;
} }
public static Dimension2D max(Dimension2D dim1, Dimension2D dim2) {
return new Dimension2DDouble(Math.max(dim1.getWidth(), dim2.getWidth()),
Math.max(dim1.getHeight(), dim2.getHeight()));
}
public static Point2D max(Point2D pt1, Point2D pt2) {
return new Point2D.Double(Math.max(pt1.getX(), pt2.getX()), Math.max(pt1.getY(), pt2.getY()));
}
} }