mirror of
https://github.com/octoleo/plantuml.git
synced 2024-11-29 00:06:34 +00:00
version 1.2017.13
This commit is contained in:
parent
dc9d5327b7
commit
2202502f2f
2
pom.xml
2
pom.xml
@ -35,7 +35,7 @@
|
|||||||
|
|
||||||
<groupId>net.sourceforge.plantuml</groupId>
|
<groupId>net.sourceforge.plantuml</groupId>
|
||||||
<artifactId>plantuml</artifactId>
|
<artifactId>plantuml</artifactId>
|
||||||
<version>1.2017.13-SNAPSHOT</version>
|
<version>1.2017.14-SNAPSHOT</version>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
<name>PlantUML</name>
|
<name>PlantUML</name>
|
||||||
|
@ -126,8 +126,8 @@ public enum ColorParam {
|
|||||||
cloudBorder(HtmlColorUtils.BLACK, ColorType.LINE),
|
cloudBorder(HtmlColorUtils.BLACK, ColorType.LINE),
|
||||||
queueBackground(HtmlColorUtils.MY_YELLOW, true, ColorType.BACK),
|
queueBackground(HtmlColorUtils.MY_YELLOW, true, ColorType.BACK),
|
||||||
queueBorder(HtmlColorUtils.MY_RED, ColorType.LINE),
|
queueBorder(HtmlColorUtils.MY_RED, ColorType.LINE),
|
||||||
pipeBackground(HtmlColorUtils.MY_YELLOW, true, ColorType.BACK),
|
stackBackground(HtmlColorUtils.MY_YELLOW, true, ColorType.BACK),
|
||||||
pipeBorder(HtmlColorUtils.MY_RED, ColorType.LINE),
|
stackBorder(HtmlColorUtils.MY_RED, ColorType.LINE),
|
||||||
databaseBackground(HtmlColorUtils.MY_YELLOW, true, ColorType.BACK),
|
databaseBackground(HtmlColorUtils.MY_YELLOW, true, ColorType.BACK),
|
||||||
databaseBorder(HtmlColorUtils.BLACK, ColorType.LINE),
|
databaseBorder(HtmlColorUtils.BLACK, ColorType.LINE),
|
||||||
folderBackground(HtmlColorUtils.MY_YELLOW, true, ColorType.BACK),
|
folderBackground(HtmlColorUtils.MY_YELLOW, true, ColorType.BACK),
|
||||||
|
@ -79,7 +79,7 @@ public enum FontParam {
|
|||||||
NODE(14, Font.PLAIN), //
|
NODE(14, Font.PLAIN), //
|
||||||
DATABASE(14, Font.PLAIN), //
|
DATABASE(14, Font.PLAIN), //
|
||||||
QUEUE(14, Font.PLAIN), //
|
QUEUE(14, Font.PLAIN), //
|
||||||
PIPE(14, Font.PLAIN), //
|
STACK(14, Font.PLAIN), //
|
||||||
// SEQUENCE_ARROW(13, Font.PLAIN), //
|
// SEQUENCE_ARROW(13, Font.PLAIN), //
|
||||||
SEQUENCE_BOX(13, Font.BOLD), //
|
SEQUENCE_BOX(13, Font.BOLD), //
|
||||||
SEQUENCE_DIVIDER(13, Font.BOLD), //
|
SEQUENCE_DIVIDER(13, Font.BOLD), //
|
||||||
@ -113,7 +113,7 @@ public enum FontParam {
|
|||||||
FRAME_STEREOTYPE(14, Font.ITALIC), //
|
FRAME_STEREOTYPE(14, Font.ITALIC), //
|
||||||
DATABASE_STEREOTYPE(14, Font.ITALIC), //
|
DATABASE_STEREOTYPE(14, Font.ITALIC), //
|
||||||
QUEUE_STEREOTYPE(14, Font.ITALIC), //
|
QUEUE_STEREOTYPE(14, Font.ITALIC), //
|
||||||
PIPE_STEREOTYPE(14, Font.ITALIC), //
|
STACK_STEREOTYPE(14, Font.ITALIC), //
|
||||||
ACTOR_STEREOTYPE(14, Font.ITALIC), //
|
ACTOR_STEREOTYPE(14, Font.ITALIC), //
|
||||||
SEQUENCE_STEREOTYPE(14, Font.ITALIC), //
|
SEQUENCE_STEREOTYPE(14, Font.ITALIC), //
|
||||||
PARTITION(14, Font.PLAIN); //
|
PARTITION(14, Font.PLAIN); //
|
||||||
|
@ -47,6 +47,8 @@ import net.sourceforge.plantuml.ugraphic.ImageBuilder;
|
|||||||
|
|
||||||
public class OptionFlags {
|
public class OptionFlags {
|
||||||
|
|
||||||
|
private static final OptionFlags singleton = new OptionFlags();
|
||||||
|
|
||||||
// static public final boolean PBBACK = false;
|
// static public final boolean PBBACK = false;
|
||||||
// static public boolean GRAPHVIZCACHE = false;
|
// static public boolean GRAPHVIZCACHE = false;
|
||||||
// static public final boolean TRACE_DOT = false;
|
// static public final boolean TRACE_DOT = false;
|
||||||
@ -74,19 +76,23 @@ public class OptionFlags {
|
|||||||
|
|
||||||
public void reset() {
|
public void reset() {
|
||||||
reset(false);
|
reset(false);
|
||||||
|
GraphvizUtils.setDotExecutable(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void setDotExecutable(String dotExecutable) {
|
public final void setDotExecutable(String dotExecutable) {
|
||||||
GraphvizUtils.setDotExecutable(dotExecutable);
|
GraphvizUtils.setDotExecutable(dotExecutable);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private OptionFlags() {
|
||||||
|
reset(true);
|
||||||
|
}
|
||||||
|
|
||||||
private void reset(boolean exit) {
|
private void reset(boolean exit) {
|
||||||
// keepTmpFiles = false;
|
// keepTmpFiles = false;
|
||||||
verbose = false;
|
verbose = false;
|
||||||
extractFromMetadata = false;
|
extractFromMetadata = false;
|
||||||
word = false;
|
word = false;
|
||||||
systemExit = exit;
|
systemExit = exit;
|
||||||
GraphvizUtils.setDotExecutable(null);
|
|
||||||
gui = false;
|
gui = false;
|
||||||
quiet = false;
|
quiet = false;
|
||||||
checkDotError = false;
|
checkDotError = false;
|
||||||
@ -101,8 +107,6 @@ public class OptionFlags {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final OptionFlags singleton = new OptionFlags();
|
|
||||||
|
|
||||||
// private boolean keepTmpFiles;
|
// private boolean keepTmpFiles;
|
||||||
private boolean verbose;
|
private boolean verbose;
|
||||||
private boolean extractFromMetadata;
|
private boolean extractFromMetadata;
|
||||||
@ -123,10 +127,6 @@ public class OptionFlags {
|
|||||||
private long timeoutMs = 15 * 60 * 1000L; // 15 minutes
|
private long timeoutMs = 15 * 60 * 1000L; // 15 minutes
|
||||||
private File logData;
|
private File logData;
|
||||||
|
|
||||||
private OptionFlags() {
|
|
||||||
reset(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static OptionFlags getInstance() {
|
public static OptionFlags getInstance() {
|
||||||
return singleton;
|
return singleton;
|
||||||
}
|
}
|
||||||
|
@ -86,6 +86,7 @@ public class SkinParam implements ISkinParam {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void setDotExecutable(String dotExecutable) {
|
public void setDotExecutable(String dotExecutable) {
|
||||||
|
Log.info("Overwritting dot in skinparam " + dotExecutable);
|
||||||
this.dotExecutable = dotExecutable;
|
this.dotExecutable = dotExecutable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,6 +48,7 @@ import net.sourceforge.plantuml.UmlDiagram;
|
|||||||
import net.sourceforge.plantuml.UmlDiagramType;
|
import net.sourceforge.plantuml.UmlDiagramType;
|
||||||
import net.sourceforge.plantuml.Url;
|
import net.sourceforge.plantuml.Url;
|
||||||
import net.sourceforge.plantuml.activitydiagram3.ftile.BoxStyle;
|
import net.sourceforge.plantuml.activitydiagram3.ftile.BoxStyle;
|
||||||
|
import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane;
|
||||||
import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlanes;
|
import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlanes;
|
||||||
import net.sourceforge.plantuml.command.CommandExecutionResult;
|
import net.sourceforge.plantuml.command.CommandExecutionResult;
|
||||||
import net.sourceforge.plantuml.core.DiagramDescription;
|
import net.sourceforge.plantuml.core.DiagramDescription;
|
||||||
@ -437,7 +438,7 @@ public class ActivityDiagram3 extends UmlDiagram {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public CommandExecutionResult addNote(Display note, NotePosition position, NoteType type, Colors colors) {
|
public CommandExecutionResult addNote(Display note, NotePosition position, NoteType type, Colors colors) {
|
||||||
final boolean ok = current().addNote(note, position, type, colors);
|
final boolean ok = current().addNote(note, position, type, colors, swinlanes.getCurrentSwimlane());
|
||||||
if (ok == false) {
|
if (ok == false) {
|
||||||
return CommandExecutionResult.error("Cannot add note here");
|
return CommandExecutionResult.error("Cannot add note here");
|
||||||
}
|
}
|
||||||
|
@ -90,8 +90,8 @@ public class Branch {
|
|||||||
return list.kill();
|
return list.kill();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean addNote(Display note, NotePosition position, NoteType type, Colors colors) {
|
public boolean addNote(Display note, NotePosition position, NoteType type, Colors colors, Swimlane swimlaneNote) {
|
||||||
return list.addNote(note, position, type, colors);
|
return list.addNote(note, position, type, colors, swimlaneNote);
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void setInlinkRendering(LinkRendering inlinkRendering) {
|
public final void setInlinkRendering(LinkRendering inlinkRendering) {
|
||||||
|
@ -38,6 +38,7 @@ package net.sourceforge.plantuml.activitydiagram3;
|
|||||||
import net.sourceforge.plantuml.activitydiagram3.ftile.Ftile;
|
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.Swimable;
|
import net.sourceforge.plantuml.activitydiagram3.ftile.Swimable;
|
||||||
|
import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane;
|
||||||
import net.sourceforge.plantuml.cucadiagram.Display;
|
import net.sourceforge.plantuml.cucadiagram.Display;
|
||||||
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;
|
||||||
@ -53,6 +54,6 @@ public interface Instruction extends Swimable {
|
|||||||
|
|
||||||
public LinkRendering getInLinkRendering();
|
public LinkRendering getInLinkRendering();
|
||||||
|
|
||||||
public boolean addNote(Display note, NotePosition position, NoteType type, Colors colors);
|
public boolean addNote(Display note, NotePosition position, NoteType type, Colors colors, Swimlane swimlaneNote);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -106,14 +106,14 @@ public class InstructionFork extends WithNote implements Instruction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean addNote(Display note, NotePosition position, NoteType type, Colors colors) {
|
public boolean addNote(Display note, NotePosition position, NoteType type, Colors colors, Swimlane swimlaneNote) {
|
||||||
if (finished) {
|
if (finished) {
|
||||||
return super.addNote(note, position, type, colors);
|
return super.addNote(note, position, type, colors, swimlaneNote);
|
||||||
}
|
}
|
||||||
if (getLastList().getLast() == null) {
|
if (getLastList().getLast() == null) {
|
||||||
return getLastList().addNote(note, position, type, colors);
|
return getLastList().addNote(note, position, type, colors, swimlaneNote);
|
||||||
}
|
}
|
||||||
return getLastList().addNote(note, position, type, colors);
|
return getLastList().addNote(note, position, type, colors, swimlaneNote);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<Swimlane> getSwimlanes() {
|
public Set<Swimlane> getSwimlanes() {
|
||||||
|
@ -35,11 +35,13 @@
|
|||||||
*/
|
*/
|
||||||
package net.sourceforge.plantuml.activitydiagram3;
|
package net.sourceforge.plantuml.activitydiagram3;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import net.sourceforge.plantuml.activitydiagram3.ftile.Ftile;
|
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.vcompact.FtileWithNotes;
|
||||||
import net.sourceforge.plantuml.cucadiagram.Display;
|
import net.sourceforge.plantuml.cucadiagram.Display;
|
||||||
import net.sourceforge.plantuml.graphic.HtmlColor;
|
import net.sourceforge.plantuml.graphic.HtmlColor;
|
||||||
import net.sourceforge.plantuml.graphic.color.Colors;
|
import net.sourceforge.plantuml.graphic.color.Colors;
|
||||||
@ -74,7 +76,11 @@ public class InstructionGroup implements Instruction, InstructionCollection {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Ftile createFtile(FtileFactory factory) {
|
public Ftile createFtile(FtileFactory factory) {
|
||||||
return factory.createGroup(list.createFtile(factory), test, backColor, titleColor, note, borderColor);
|
Ftile tmp = list.createFtile(factory);
|
||||||
|
if (note != null) {
|
||||||
|
tmp = new FtileWithNotes(tmp, Collections.singleton(note), factory.skinParam());
|
||||||
|
}
|
||||||
|
return factory.createGroup(tmp, test, backColor, titleColor, null, borderColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Instruction getParent() {
|
public Instruction getParent() {
|
||||||
@ -89,12 +95,12 @@ public class InstructionGroup implements Instruction, InstructionCollection {
|
|||||||
return linkRendering;
|
return linkRendering;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean addNote(Display note, NotePosition position, NoteType type, Colors colors) {
|
public boolean addNote(Display note, NotePosition position, NoteType type, Colors colors, Swimlane swimlaneNote) {
|
||||||
if (list.isEmpty()) {
|
if (list.isEmpty()) {
|
||||||
this.note = new PositionedNote(note, position, type, colors);
|
this.note = new PositionedNote(note, position, type, colors, swimlaneNote);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return list.addNote(note, position, type, colors);
|
return list.addNote(note, position, type, colors, swimlaneNote);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<Swimlane> getSwimlanes() {
|
public Set<Swimlane> getSwimlanes() {
|
||||||
|
@ -163,11 +163,11 @@ public class InstructionIf extends WithNote implements Instruction, InstructionC
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean addNote(Display note, NotePosition position, NoteType type, Colors colors) {
|
public boolean addNote(Display note, NotePosition position, NoteType type, Colors colors, Swimlane swimlaneNote) {
|
||||||
if (endifCalled || current.isEmpty()) {
|
if (endifCalled || current.isEmpty()) {
|
||||||
return super.addNote(note, position, type, colors);
|
return super.addNote(note, position, type, colors, swimlaneNote);
|
||||||
} else {
|
} else {
|
||||||
return current.addNote(note, position, type, colors);
|
return current.addNote(note, position, type, colors, swimlaneNote);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -128,11 +128,11 @@ public class InstructionList extends WithNote implements Instruction, Instructio
|
|||||||
return all.get(all.size() - 1);
|
return all.get(all.size() - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean addNote(Display note, NotePosition position, NoteType type, Colors colors) {
|
public boolean addNote(Display note, NotePosition position, NoteType type, Colors colors, Swimlane swimlaneNote) {
|
||||||
if (getLast() == null) {
|
if (getLast() == null) {
|
||||||
return super.addNote(note, position, type, colors);
|
return super.addNote(note, position, type, colors, swimlaneNote);
|
||||||
}
|
}
|
||||||
return getLast().addNote(note, position, type, colors);
|
return getLast().addNote(note, position, type, colors, swimlaneNote);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<Swimlane> getSwimlanes() {
|
public Set<Swimlane> getSwimlanes() {
|
||||||
|
@ -86,7 +86,7 @@ public class InstructionPartition implements Instruction {
|
|||||||
return list.getInLinkRendering();
|
return list.getInLinkRendering();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean addNote(Display note, NotePosition position, NoteType type, Colors colors) {
|
public boolean addNote(Display note, NotePosition position, NoteType type, Colors colors, Swimlane swimlaneNote) {
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -133,8 +133,8 @@ public class InstructionRepeat implements Instruction {
|
|||||||
return nextLinkRenderer;
|
return nextLinkRenderer;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean addNote(Display note, NotePosition position, NoteType type, Colors colors) {
|
public boolean addNote(Display note, NotePosition position, NoteType type, Colors colors, Swimlane swimlaneNote) {
|
||||||
return repeatList.addNote(note, position, type, colors);
|
return repeatList.addNote(note, position, type, colors, swimlaneNote);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<Swimlane> getSwimlanes() {
|
public Set<Swimlane> getSwimlanes() {
|
||||||
|
@ -105,8 +105,8 @@ public class InstructionSplit implements Instruction {
|
|||||||
return inlinkRendering;
|
return inlinkRendering;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean addNote(Display note, NotePosition position, NoteType type, Colors colors) {
|
public boolean addNote(Display note, NotePosition position, NoteType type, Colors colors, Swimlane swimlaneNote) {
|
||||||
return getLast().addNote(note, position, type, colors);
|
return getLast().addNote(note, position, type, colors, swimlaneNote);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<Swimlane> getSwimlanes() {
|
public Set<Swimlane> getSwimlanes() {
|
||||||
|
@ -138,11 +138,11 @@ public class InstructionWhile extends WithNote implements Instruction, Instructi
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean addNote(Display note, NotePosition position, NoteType type, Colors colors) {
|
public boolean addNote(Display note, NotePosition position, NoteType type, Colors colors, Swimlane swimlaneNote) {
|
||||||
if (repeatList.isEmpty()) {
|
if (repeatList.isEmpty()) {
|
||||||
return super.addNote(note, position, type, colors);
|
return super.addNote(note, position, type, colors, swimlaneNote);
|
||||||
} else {
|
} else {
|
||||||
return repeatList.addNote(note, position, type, colors);
|
return repeatList.addNote(note, position, type, colors, swimlaneNote);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,6 +35,7 @@
|
|||||||
*/
|
*/
|
||||||
package net.sourceforge.plantuml.activitydiagram3;
|
package net.sourceforge.plantuml.activitydiagram3;
|
||||||
|
|
||||||
|
import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane;
|
||||||
import net.sourceforge.plantuml.cucadiagram.Display;
|
import net.sourceforge.plantuml.cucadiagram.Display;
|
||||||
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;
|
||||||
@ -46,12 +47,14 @@ public class PositionedNote {
|
|||||||
private final NotePosition notePosition;
|
private final NotePosition notePosition;
|
||||||
private final NoteType type;
|
private final NoteType type;
|
||||||
private final Colors colors;
|
private final Colors colors;
|
||||||
|
private final Swimlane swimlaneNote;
|
||||||
|
|
||||||
public PositionedNote(Display display, NotePosition position, NoteType type, Colors colors) {
|
public PositionedNote(Display display, NotePosition position, NoteType type, Colors colors, Swimlane swimlaneNote) {
|
||||||
this.display = display;
|
this.display = display;
|
||||||
this.notePosition = position;
|
this.notePosition = position;
|
||||||
this.type = type;
|
this.type = type;
|
||||||
this.colors = colors;
|
this.colors = colors;
|
||||||
|
this.swimlaneNote = swimlaneNote;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -59,8 +62,8 @@ public class PositionedNote {
|
|||||||
return "type=" + type + " notePosition=" + notePosition + " " + display;
|
return "type=" + type + " notePosition=" + notePosition + " " + display;
|
||||||
}
|
}
|
||||||
|
|
||||||
public PositionedNote(Display note, NotePosition position, NoteType type) {
|
public PositionedNote(Display note, NotePosition position, NoteType type, Swimlane swimlaneNote) {
|
||||||
this(note, position, type, null);
|
this(note, position, type, null, swimlaneNote);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Display getDisplay() {
|
public Display getDisplay() {
|
||||||
@ -79,4 +82,8 @@ public class PositionedNote {
|
|||||||
return colors;
|
return colors;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public final Swimlane getSwimlaneNote() {
|
||||||
|
return swimlaneNote;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -51,8 +51,8 @@ public class WithNote {
|
|||||||
|
|
||||||
private final Collection<PositionedNote> notes = new ArrayList<PositionedNote>();
|
private final Collection<PositionedNote> notes = new ArrayList<PositionedNote>();
|
||||||
|
|
||||||
public boolean addNote(Display note, NotePosition position, NoteType type, Colors colors) {
|
public boolean addNote(Display note, NotePosition position, NoteType type, Colors colors, Swimlane swimlaneNote) {
|
||||||
this.notes.add(new PositionedNote(note, position, type, colors));
|
this.notes.add(new PositionedNote(note, position, type, colors, swimlaneNote));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -185,18 +185,15 @@ public class Snake implements UShape {
|
|||||||
final Point2D pt1 = worm.get(0);
|
final Point2D pt1 = worm.get(0);
|
||||||
final Point2D pt2 = worm.get(1);
|
final Point2D pt2 = worm.get(1);
|
||||||
final Dimension2D dim = textBlock.calculateDimension(stringBounder);
|
final Dimension2D dim = textBlock.calculateDimension(stringBounder);
|
||||||
double x = Math.max(pt1.getX(), pt2.getX());
|
double x = Math.max(pt1.getX(), pt2.getX()) + 4;
|
||||||
if (horizontalAlignment == HorizontalAlignment.CENTER
|
final boolean zigzag = worm.getDirectionsCode().startsWith("DLD") || worm.getDirectionsCode().startsWith("DRD");
|
||||||
&& (worm.getDirectionsCode().startsWith("DLD") || worm.getDirectionsCode().startsWith("DRD"))) {
|
if (horizontalAlignment == HorizontalAlignment.CENTER && zigzag) {
|
||||||
final Point2D pt3 = worm.get(2);
|
final Point2D pt3 = worm.get(2);
|
||||||
x = (pt2.getX() + pt3.getX()) / 2 - dim.getWidth() / 2;
|
x = (pt2.getX() + pt3.getX()) / 2 - dim.getWidth() / 2;
|
||||||
} else {
|
} else if (horizontalAlignment == HorizontalAlignment.RIGHT && zigzag) {
|
||||||
x += 4;
|
// final Point2D pt3 = worm.get(2);
|
||||||
|
x = Math.max(pt1.getX(), pt2.getX()) - dim.getWidth() - 4;
|
||||||
}
|
}
|
||||||
// if (worm.getDirectionsCode().startsWith("LD")) {
|
|
||||||
// final double y = pt1.getY() - dim.getHeight();
|
|
||||||
// return new Point2D.Double(Math.max(pt1.getX(), pt2.getX()) - dim.getWidth(), y);
|
|
||||||
// }
|
|
||||||
final double y = (pt1.getY() + pt2.getY()) / 2 - dim.getHeight() / 2;
|
final double y = (pt1.getY() + pt2.getY()) / 2 - dim.getHeight() / 2;
|
||||||
return new Point2D.Double(x, y);
|
return new Point2D.Double(x, y);
|
||||||
}
|
}
|
||||||
|
@ -523,9 +523,9 @@ class FtileRepeat extends AbstractFtile {
|
|||||||
final Dimension2D dimDiamond2 = diamond2.calculateDimension(stringBounder);
|
final Dimension2D dimDiamond2 = diamond2.calculateDimension(stringBounder);
|
||||||
final Dimension2D dimTotal = calculateDimensionInternal(stringBounder);
|
final Dimension2D dimTotal = calculateDimensionInternal(stringBounder);
|
||||||
final Dimension2D dimRepeat = repeat.calculateDimension(stringBounder);
|
final Dimension2D dimRepeat = repeat.calculateDimension(stringBounder);
|
||||||
final double y = (dimTotal.getHeight() - dimDiamond1.getHeight() - dimDiamond2.getHeight() - dimRepeat
|
final double space = dimTotal.getHeight() - dimDiamond1.getHeight() - dimDiamond2.getHeight()
|
||||||
.getHeight()) / 2;
|
- dimRepeat.getHeight();
|
||||||
|
final double y = dimDiamond1.getHeight() + space / 2;
|
||||||
final double left = getLeft(stringBounder);
|
final double left = getLeft(stringBounder);
|
||||||
return new UTranslate(left - repeat.calculateDimension(stringBounder).getLeft(), y);
|
return new UTranslate(left - repeat.calculateDimension(stringBounder).getLeft(), y);
|
||||||
|
|
||||||
|
@ -39,6 +39,7 @@ import java.awt.geom.Dimension2D;
|
|||||||
import java.awt.geom.Point2D;
|
import java.awt.geom.Point2D;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import net.sourceforge.plantuml.ColorParam;
|
import net.sourceforge.plantuml.ColorParam;
|
||||||
@ -79,8 +80,14 @@ public class FtileWithNoteOpale extends AbstractFtile implements Stencil {
|
|||||||
// private final HtmlColor arrowColor;
|
// private final HtmlColor arrowColor;
|
||||||
private final NotePosition notePosition;
|
private final NotePosition notePosition;
|
||||||
private final double suppSpace = 20;
|
private final double suppSpace = 20;
|
||||||
|
private final Swimlane swimlaneNote;
|
||||||
|
|
||||||
public Set<Swimlane> getSwimlanes() {
|
public Set<Swimlane> getSwimlanes() {
|
||||||
|
if (swimlaneNote != null) {
|
||||||
|
final Set<Swimlane> result = new HashSet<Swimlane>(tile.getSwimlanes());
|
||||||
|
result.add(swimlaneNote);
|
||||||
|
return Collections.unmodifiableSet(result);
|
||||||
|
}
|
||||||
return tile.getSwimlanes();
|
return tile.getSwimlanes();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -109,6 +116,7 @@ public class FtileWithNoteOpale extends AbstractFtile implements Stencil {
|
|||||||
|
|
||||||
private FtileWithNoteOpale(Ftile tile, PositionedNote note, ISkinParam skinParam, boolean withLink) {
|
private FtileWithNoteOpale(Ftile tile, PositionedNote note, ISkinParam skinParam, boolean withLink) {
|
||||||
super(tile.skinParam());
|
super(tile.skinParam());
|
||||||
|
this.swimlaneNote = note.getSwimlaneNote();
|
||||||
if (note.getColors() != null) {
|
if (note.getColors() != null) {
|
||||||
skinParam = note.getColors().mute(skinParam);
|
skinParam = note.getColors().mute(skinParam);
|
||||||
}
|
}
|
||||||
@ -127,7 +135,8 @@ public class FtileWithNoteOpale extends AbstractFtile implements Stencil {
|
|||||||
|
|
||||||
final Sheet sheet = new CreoleParser(fc, skinParam.getDefaultTextAlignment(HorizontalAlignment.LEFT),
|
final Sheet sheet = new CreoleParser(fc, skinParam.getDefaultTextAlignment(HorizontalAlignment.LEFT),
|
||||||
skinParam, CreoleMode.FULL).createSheet(note.getDisplay());
|
skinParam, CreoleMode.FULL).createSheet(note.getDisplay());
|
||||||
final TextBlock text = new SheetBlock2(new SheetBlock1(sheet, LineBreakStrategy.NONE, skinParam.getPadding()), this, new UStroke(1));
|
final TextBlock text = new SheetBlock2(new SheetBlock1(sheet, LineBreakStrategy.NONE, skinParam.getPadding()),
|
||||||
|
this, new UStroke(1));
|
||||||
opale = new Opale(borderColor, noteBackgroundColor, text, skinParam.shadowing(), withLink);
|
opale = new Opale(borderColor, noteBackgroundColor, text, skinParam.shadowing(), withLink);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -163,6 +172,13 @@ public class FtileWithNoteOpale extends AbstractFtile implements Stencil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void drawU(UGraphic ug) {
|
public void drawU(UGraphic ug) {
|
||||||
|
final Swimlane intoSw;
|
||||||
|
if (ug instanceof UGraphicInterceptorOneSwimlane) {
|
||||||
|
intoSw = ((UGraphicInterceptorOneSwimlane) ug).getSwimlane();
|
||||||
|
} else {
|
||||||
|
intoSw = null;
|
||||||
|
}
|
||||||
|
|
||||||
final StringBounder stringBounder = ug.getStringBounder();
|
final StringBounder stringBounder = ug.getStringBounder();
|
||||||
final Dimension2D dimNote = opale.calculateDimension(stringBounder);
|
final Dimension2D dimNote = opale.calculateDimension(stringBounder);
|
||||||
|
|
||||||
@ -177,7 +193,9 @@ public class FtileWithNoteOpale extends AbstractFtile implements Stencil {
|
|||||||
final Point2D pp2 = new Point2D.Double(-suppSpace, dimNote.getHeight() / 2);
|
final Point2D pp2 = new Point2D.Double(-suppSpace, dimNote.getHeight() / 2);
|
||||||
opale.setOpale(strategy, pp1, pp2);
|
opale.setOpale(strategy, pp1, pp2);
|
||||||
}
|
}
|
||||||
opale.drawU(ug.apply(getTranslateForOpale(ug)));
|
if (swimlaneNote == null || intoSw == swimlaneNote) {
|
||||||
|
opale.drawU(ug.apply(getTranslateForOpale(ug)));
|
||||||
|
}
|
||||||
ug.apply(getTranslate(stringBounder)).draw(tile);
|
ug.apply(getTranslate(stringBounder)).draw(tile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,68 @@
|
|||||||
|
/* ========================================================================
|
||||||
|
* PlantUML : a free UML diagram generator
|
||||||
|
* ========================================================================
|
||||||
|
*
|
||||||
|
* (C) Copyright 2009-2017, 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.bpm;
|
||||||
|
|
||||||
|
import java.util.EnumSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
abstract class AbstractConnectorPuzzle implements ConnectorPuzzle {
|
||||||
|
|
||||||
|
private final EnumSet<Where> connections = EnumSet.noneOf(Where.class);
|
||||||
|
|
||||||
|
public final boolean have(Where where) {
|
||||||
|
return connections.contains(where);
|
||||||
|
}
|
||||||
|
|
||||||
|
public final void append(Where where) {
|
||||||
|
this.connections.add(where);
|
||||||
|
}
|
||||||
|
|
||||||
|
public final void remove(Where where) {
|
||||||
|
final boolean ok = connections.remove(where);
|
||||||
|
if (ok == false) {
|
||||||
|
throw new IllegalArgumentException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public final void append(ConnectorPuzzle other) {
|
||||||
|
this.connections.addAll(((AbstractConnectorPuzzle) other).connections);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected final Set<Where> connections() {
|
||||||
|
return connections;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -57,7 +57,8 @@ public class BpmDiagram extends UmlDiagram {
|
|||||||
while (true) {
|
while (true) {
|
||||||
final boolean v1 = new CleanerEmptyLine().clean(grid);
|
final boolean v1 = new CleanerEmptyLine().clean(grid);
|
||||||
final boolean v2 = new CleanerInterleavingLines().clean(grid);
|
final boolean v2 = new CleanerInterleavingLines().clean(grid);
|
||||||
if (v1 == false && v2 == false) {
|
final boolean v3 = new CleanerMoveBlock().clean(grid);
|
||||||
|
if (v1 == false && v2 == false && v3 == false) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -34,8 +34,8 @@
|
|||||||
*/
|
*/
|
||||||
package net.sourceforge.plantuml.bpm;
|
package net.sourceforge.plantuml.bpm;
|
||||||
|
|
||||||
import java.awt.Font;
|
|
||||||
import java.awt.geom.Dimension2D;
|
import java.awt.geom.Dimension2D;
|
||||||
|
import java.awt.geom.Rectangle2D;
|
||||||
|
|
||||||
import net.sourceforge.plantuml.ColorParam;
|
import net.sourceforge.plantuml.ColorParam;
|
||||||
import net.sourceforge.plantuml.ISkinParam;
|
import net.sourceforge.plantuml.ISkinParam;
|
||||||
@ -49,11 +49,16 @@ import net.sourceforge.plantuml.graphic.FontConfiguration;
|
|||||||
import net.sourceforge.plantuml.graphic.HorizontalAlignment;
|
import net.sourceforge.plantuml.graphic.HorizontalAlignment;
|
||||||
import net.sourceforge.plantuml.graphic.HtmlColor;
|
import net.sourceforge.plantuml.graphic.HtmlColor;
|
||||||
import net.sourceforge.plantuml.graphic.HtmlColorUtils;
|
import net.sourceforge.plantuml.graphic.HtmlColorUtils;
|
||||||
|
import net.sourceforge.plantuml.graphic.InnerStrategy;
|
||||||
import net.sourceforge.plantuml.graphic.StringBounder;
|
import net.sourceforge.plantuml.graphic.StringBounder;
|
||||||
import net.sourceforge.plantuml.graphic.TextBlock;
|
import net.sourceforge.plantuml.graphic.TextBlock;
|
||||||
|
import net.sourceforge.plantuml.ugraphic.UChangeColor;
|
||||||
import net.sourceforge.plantuml.ugraphic.UFont;
|
import net.sourceforge.plantuml.ugraphic.UFont;
|
||||||
|
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
||||||
|
import net.sourceforge.plantuml.ugraphic.ULine;
|
||||||
|
import net.sourceforge.plantuml.ugraphic.UTranslate;
|
||||||
|
|
||||||
public class BpmElement implements Placeable {
|
public class BpmElement extends AbstractConnectorPuzzle implements ConnectorPuzzle {
|
||||||
|
|
||||||
private final String id;
|
private final String id;
|
||||||
private final BpmElementType type;
|
private final BpmElementType type;
|
||||||
@ -86,6 +91,47 @@ public class BpmElement implements Placeable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public TextBlock toTextBlock(ISkinParam skinParam) {
|
public TextBlock toTextBlock(ISkinParam skinParam) {
|
||||||
|
final TextBlock raw = toTextBlockInternal(skinParam);
|
||||||
|
return new TextBlock() {
|
||||||
|
|
||||||
|
public void drawU(UGraphic ug) {
|
||||||
|
raw.drawU(ug);
|
||||||
|
ug = ug.apply(new UChangeColor(HtmlColorUtils.RED));
|
||||||
|
for (Where w : Where.values()) {
|
||||||
|
if (have(w)) {
|
||||||
|
drawLine(ug, w, raw.calculateDimension(ug.getStringBounder()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Rectangle2D getInnerPosition(String member, StringBounder stringBounder, InnerStrategy strategy) {
|
||||||
|
return raw.getInnerPosition(member, stringBounder, strategy);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Dimension2D calculateDimension(StringBounder stringBounder) {
|
||||||
|
return raw.calculateDimension(stringBounder);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private void drawLine(UGraphic ug, Where w, Dimension2D total) {
|
||||||
|
final double width = total.getWidth();
|
||||||
|
final double height = total.getHeight();
|
||||||
|
if (w == Where.WEST) {
|
||||||
|
ug.apply(new UTranslate(-10, height / 2)).draw(new ULine(10, 0));
|
||||||
|
}
|
||||||
|
if (w == Where.EAST) {
|
||||||
|
ug.apply(new UTranslate(width, height / 2)).draw(new ULine(10, 0));
|
||||||
|
}
|
||||||
|
if (w == Where.NORTH) {
|
||||||
|
ug.apply(new UTranslate(width / 2, -10)).draw(new ULine(0, 10));
|
||||||
|
}
|
||||||
|
if (w == Where.SOUTH) {
|
||||||
|
ug.apply(new UTranslate(width / 2, height)).draw(new ULine(0, 10));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public TextBlock toTextBlockInternal(ISkinParam skinParam) {
|
||||||
if (type == BpmElementType.START) {
|
if (type == BpmElementType.START) {
|
||||||
return new FtileCircleStart(skinParam, HtmlColorUtils.BLACK, null);
|
return new FtileCircleStart(skinParam, HtmlColorUtils.BLACK, null);
|
||||||
}
|
}
|
||||||
@ -118,4 +164,5 @@ public class BpmElement implements Placeable {
|
|||||||
public final String getId() {
|
public final String getId() {
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -55,6 +55,14 @@ public class ChainImpl<O> implements Chain<O> {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ChainImpl<O> cloneMe() {
|
||||||
|
final ChainImpl<O> result = new ChainImpl<O>();
|
||||||
|
result.currentVersion = this.currentVersion;
|
||||||
|
result.positive.addAll(this.positive);
|
||||||
|
result.negative.addAll(this.negative);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
public int compare(O a, O b) {
|
public int compare(O a, O b) {
|
||||||
if (a.equals(b)) {
|
if (a.equals(b)) {
|
||||||
return 0;
|
return 0;
|
||||||
@ -93,6 +101,9 @@ public class ChainImpl<O> implements Chain<O> {
|
|||||||
return Collections.unmodifiableList(result);
|
return Collections.unmodifiableList(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private ChainImpl() {
|
||||||
|
}
|
||||||
|
|
||||||
public ChainImpl(O root) {
|
public ChainImpl(O root) {
|
||||||
if (root == null) {
|
if (root == null) {
|
||||||
throw new IllegalArgumentException();
|
throw new IllegalArgumentException();
|
||||||
|
@ -35,26 +35,24 @@
|
|||||||
*/
|
*/
|
||||||
package net.sourceforge.plantuml.bpm;
|
package net.sourceforge.plantuml.bpm;
|
||||||
|
|
||||||
|
import net.sourceforge.plantuml.bpm.ConnectorPuzzle.Where;
|
||||||
|
|
||||||
public class CleanerInterleavingLines implements GridCleaner {
|
public class CleanerInterleavingLines implements GridCleaner {
|
||||||
|
|
||||||
public boolean clean(Grid grid) {
|
public boolean clean(Grid grid) {
|
||||||
System.err.println("running CleanerInterleavingLines");
|
// System.err.println("running CleanerInterleavingLines");
|
||||||
boolean result = false;
|
boolean result = false;
|
||||||
Line previous = null;
|
Line previous = null;
|
||||||
// int i = 0;
|
|
||||||
for (Line line : grid.lines().toList()) {
|
for (Line line : grid.lines().toList()) {
|
||||||
// System.err.println("--------- LINE i=" + i);
|
|
||||||
// i++;
|
|
||||||
if (previous != null) {
|
if (previous != null) {
|
||||||
if (mergeable(grid, previous, line)) {
|
if (mergeable(grid, previous, line)) {
|
||||||
System.err.println("MERGEABLE! " + previous + " " + line);
|
// System.err.println("MERGEABLE! " + previous + " " + line);
|
||||||
mergeLines(grid, previous, line);
|
mergeLines(grid, previous, line);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
previous = line;
|
previous = line;
|
||||||
}
|
}
|
||||||
// }
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -96,11 +94,16 @@ public class CleanerInterleavingLines implements GridCleaner {
|
|||||||
return data1;
|
return data1;
|
||||||
}
|
}
|
||||||
if (data2 instanceof BpmElement) {
|
if (data2 instanceof BpmElement) {
|
||||||
|
final ConnectorPuzzleEmpty puz1 = (ConnectorPuzzleEmpty) data1;
|
||||||
|
if (puz1.checkDirections("SW")) {
|
||||||
|
((BpmElement) data2).remove(Where.NORTH);
|
||||||
|
((BpmElement) data2).append(Where.WEST);
|
||||||
|
}
|
||||||
return data2;
|
return data2;
|
||||||
}
|
}
|
||||||
assert data1 instanceof ConnectorPuzzle && data2 instanceof ConnectorPuzzle;
|
assert data1 instanceof ConnectorPuzzleEmpty && data2 instanceof ConnectorPuzzleEmpty;
|
||||||
final ConnectorPuzzle puz1 = (ConnectorPuzzle) data1;
|
final ConnectorPuzzleEmpty puz1 = (ConnectorPuzzleEmpty) data1;
|
||||||
final ConnectorPuzzle puz2 = (ConnectorPuzzle) data2;
|
final ConnectorPuzzleEmpty puz2 = (ConnectorPuzzleEmpty) data2;
|
||||||
return puz2;
|
return puz2;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -109,43 +112,47 @@ public class CleanerInterleavingLines implements GridCleaner {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
assert data1 != null && data2 != null;
|
assert data1 != null && data2 != null;
|
||||||
if (data1 instanceof ConnectorPuzzle && data2 instanceof ConnectorPuzzle) {
|
if (data1 instanceof ConnectorPuzzleEmpty && data2 instanceof ConnectorPuzzleEmpty) {
|
||||||
return mergeableCC((ConnectorPuzzle) data1, (ConnectorPuzzle) data2);
|
return mergeableCC((ConnectorPuzzleEmpty) data1, (ConnectorPuzzleEmpty) data2);
|
||||||
}
|
}
|
||||||
if (data1 instanceof ConnectorPuzzle && data2 instanceof BpmElement) {
|
if (data1 instanceof ConnectorPuzzleEmpty && data2 instanceof BpmElement) {
|
||||||
final boolean result = mergeablePuzzleSingle((ConnectorPuzzle) data1);
|
final boolean result = mergeablePuzzleSingle((ConnectorPuzzleEmpty) data1, (BpmElement) data2);
|
||||||
System.err.println("OTHER2=" + data2 + " " + data1 + " " + result);
|
// System.err.println("OTHER2=" + data2 + " " + data1 + " " + result);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
if (data2 instanceof ConnectorPuzzle && data1 instanceof BpmElement) {
|
if (data2 instanceof ConnectorPuzzleEmpty && data1 instanceof BpmElement) {
|
||||||
final boolean result = mergeablePuzzleSingle((ConnectorPuzzle) data2);
|
final boolean result = mergeablePuzzleSingle((BpmElement) data1, (ConnectorPuzzleEmpty) data2);
|
||||||
System.err.println("OTHER1=" + data1 + " " + data2 + " " + result);
|
// System.err.println("OTHER1=" + data1 + " " + data2 + " " + result);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean mergeablePuzzleSingle(ConnectorPuzzle puz) {
|
private boolean mergeablePuzzleSingle(ConnectorPuzzleEmpty data1, BpmElement data2) {
|
||||||
if (puz == ConnectorPuzzle.get("NS")) {
|
if (data1.checkDirections("NS")) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (puz == ConnectorPuzzle.get("NE")) {
|
if (data1.checkDirections("SW")) {
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (puz == ConnectorPuzzle.get("NW")) {
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean mergeableCC(ConnectorPuzzle puz1, ConnectorPuzzle puz2) {
|
private boolean mergeablePuzzleSingle(BpmElement data1, ConnectorPuzzleEmpty data2) {
|
||||||
if (puz1 == ConnectorPuzzle.get("NS") && puz2 == ConnectorPuzzle.get("NS")) {
|
if (data2.checkDirections("NS")) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (puz1 == ConnectorPuzzle.get("NS") && puz2 == ConnectorPuzzle.get("NE")) {
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean mergeableCC(ConnectorPuzzleEmpty puz1, ConnectorPuzzleEmpty puz2) {
|
||||||
|
if (puz1.checkDirections("NS") && puz2.checkDirections("NS")) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (puz1 == ConnectorPuzzle.get("NS") && puz2 == ConnectorPuzzle.get("NW")) {
|
if (puz1.checkDirections("NS") && puz2.checkDirections("NE")) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (puz1.checkDirections("NS") && puz2.checkDirections("NW")) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
94
src/net/sourceforge/plantuml/bpm/CleanerMoveBlock.java
Normal file
94
src/net/sourceforge/plantuml/bpm/CleanerMoveBlock.java
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
/* ========================================================================
|
||||||
|
* PlantUML : a free UML diagram generator
|
||||||
|
* ========================================================================
|
||||||
|
*
|
||||||
|
* (C) Copyright 2009-2017, 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.bpm;
|
||||||
|
|
||||||
|
|
||||||
|
public class CleanerMoveBlock implements GridCleaner {
|
||||||
|
|
||||||
|
public boolean clean(Grid grid) {
|
||||||
|
System.err.println("CleanerMoveBlock");
|
||||||
|
for (Line line : grid.lines().toList()) {
|
||||||
|
tryGrid(grid, line);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void tryGrid(Grid grid, Line line) {
|
||||||
|
// System.err.println("TRYING LINE " + line);
|
||||||
|
for (Col col1 : grid.cols().toList()) {
|
||||||
|
final Placeable cell1 = grid.getCell(line, col1).getData();
|
||||||
|
if (cell1 instanceof ConnectorPuzzleEmpty == false) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
final ConnectorPuzzleEmpty puzzle1 = (ConnectorPuzzleEmpty) cell1;
|
||||||
|
if (puzzle1.checkDirections("NS") == false) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
final Navigator<Col> it2 = grid.cols().navigator(col1);
|
||||||
|
int cpt = 0;
|
||||||
|
while (true) {
|
||||||
|
final Col col2 = it2.next();
|
||||||
|
cpt++;
|
||||||
|
if (col2 == null) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (col1 == col2) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
final Placeable cell2 = grid.getCell(line, col2).getData();
|
||||||
|
if (cell2 == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (cell2 instanceof ConnectorPuzzleEmpty == false) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
final ConnectorPuzzleEmpty puzzle2 = (ConnectorPuzzleEmpty) cell2;
|
||||||
|
if (puzzle2.checkDirections("NS") == false) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (cpt > 1) {
|
||||||
|
tryBridge(line, col1, col2);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void tryBridge(Line line, Col col1, final Col col2) {
|
||||||
|
System.err.println("LINE=" + line + " " + col1 + " " + col2 + " ");
|
||||||
|
}
|
||||||
|
}
|
@ -35,21 +35,7 @@
|
|||||||
*/
|
*/
|
||||||
package net.sourceforge.plantuml.bpm;
|
package net.sourceforge.plantuml.bpm;
|
||||||
|
|
||||||
import java.awt.geom.Dimension2D;
|
public interface ConnectorPuzzle extends Placeable {
|
||||||
import java.awt.geom.Rectangle2D;
|
|
||||||
|
|
||||||
import net.sourceforge.plantuml.Dimension2DDouble;
|
|
||||||
import net.sourceforge.plantuml.ISkinParam;
|
|
||||||
import net.sourceforge.plantuml.graphic.HtmlColorUtils;
|
|
||||||
import net.sourceforge.plantuml.graphic.InnerStrategy;
|
|
||||||
import net.sourceforge.plantuml.graphic.StringBounder;
|
|
||||||
import net.sourceforge.plantuml.graphic.TextBlock;
|
|
||||||
import net.sourceforge.plantuml.ugraphic.UChangeColor;
|
|
||||||
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
|
||||||
import net.sourceforge.plantuml.ugraphic.ULine;
|
|
||||||
import net.sourceforge.plantuml.ugraphic.UTranslate;
|
|
||||||
|
|
||||||
public class ConnectorPuzzle implements Placeable, TextBlock {
|
|
||||||
|
|
||||||
public static enum Where {
|
public static enum Where {
|
||||||
NORTH(1), EAST(2), SOUTH(4), WEST(8);
|
NORTH(1), EAST(2), SOUTH(4), WEST(8);
|
||||||
@ -63,98 +49,16 @@ public class ConnectorPuzzle implements Placeable, TextBlock {
|
|||||||
String toShortString() {
|
String toShortString() {
|
||||||
return name().substring(0, 1);
|
return name().substring(0, 1);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
private static final ConnectorPuzzle all[] = new ConnectorPuzzle[16];
|
int getCoding() {
|
||||||
private final int type;
|
return coding;
|
||||||
|
|
||||||
static {
|
|
||||||
for (int i = 0; i < all.length; i++) {
|
|
||||||
all[i] = new ConnectorPuzzle(i);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public ConnectorPuzzle append(ConnectorPuzzle before) {
|
public void append(Where where);
|
||||||
return all[this.type | before.type];
|
|
||||||
}
|
|
||||||
|
|
||||||
public static ConnectorPuzzle get(String value) {
|
public void remove(Where where);
|
||||||
int num = 0;
|
|
||||||
for (Where w : Where.values()) {
|
|
||||||
if (value.contains(w.toShortString())) {
|
|
||||||
num += w.coding;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return all[num];
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean have(Where where) {
|
public boolean have(Where where);
|
||||||
return (type & where.coding) != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
final StringBuilder sb = new StringBuilder();
|
|
||||||
for (Where w : Where.values()) {
|
|
||||||
if (have(w)) {
|
|
||||||
sb.append(w.toShortString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (sb.length() == 0) {
|
|
||||||
sb.append("NONE");
|
|
||||||
}
|
|
||||||
|
|
||||||
return sb.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
private ConnectorPuzzle(int type) {
|
|
||||||
this.type = type;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Dimension2D getDimension(StringBounder stringBounder, ISkinParam skinParam) {
|
|
||||||
return new Dimension2DDouble(20, 20);
|
|
||||||
}
|
|
||||||
|
|
||||||
public TextBlock toTextBlock(ISkinParam skinParam) {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getId() {
|
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void drawU(UGraphic ug) {
|
|
||||||
// System.err.println("DRAWING " + toString());
|
|
||||||
ug = ug.apply(new UChangeColor(HtmlColorUtils.BLUE));
|
|
||||||
for (Where w : Where.values()) {
|
|
||||||
if (have(w)) {
|
|
||||||
drawLine(ug, w);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private void drawLine(UGraphic ug, Where w) {
|
|
||||||
if (w == Where.WEST) {
|
|
||||||
ug.apply(new UTranslate(0, 10)).draw(new ULine(10, 0));
|
|
||||||
}
|
|
||||||
if (w == Where.EAST) {
|
|
||||||
ug.apply(new UTranslate(10, 10)).draw(new ULine(10, 0));
|
|
||||||
}
|
|
||||||
if (w == Where.NORTH) {
|
|
||||||
ug.apply(new UTranslate(10, 0)).draw(new ULine(0, 10));
|
|
||||||
}
|
|
||||||
if (w == Where.SOUTH) {
|
|
||||||
ug.apply(new UTranslate(10, 10)).draw(new ULine(0, 10));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Dimension2D calculateDimension(StringBounder stringBounder) {
|
|
||||||
return new Dimension2DDouble(20, 20);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Rectangle2D getInnerPosition(String member, StringBounder stringBounder, InnerStrategy strategy) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
123
src/net/sourceforge/plantuml/bpm/ConnectorPuzzleEmpty.java
Normal file
123
src/net/sourceforge/plantuml/bpm/ConnectorPuzzleEmpty.java
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
/* ========================================================================
|
||||||
|
* PlantUML : a free UML diagram generator
|
||||||
|
* ========================================================================
|
||||||
|
*
|
||||||
|
* (C) Copyright 2009-2017, 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.bpm;
|
||||||
|
|
||||||
|
import java.awt.geom.Dimension2D;
|
||||||
|
import java.awt.geom.Rectangle2D;
|
||||||
|
|
||||||
|
import net.sourceforge.plantuml.Dimension2DDouble;
|
||||||
|
import net.sourceforge.plantuml.ISkinParam;
|
||||||
|
import net.sourceforge.plantuml.graphic.HtmlColorUtils;
|
||||||
|
import net.sourceforge.plantuml.graphic.InnerStrategy;
|
||||||
|
import net.sourceforge.plantuml.graphic.StringBounder;
|
||||||
|
import net.sourceforge.plantuml.graphic.TextBlock;
|
||||||
|
import net.sourceforge.plantuml.ugraphic.UChangeColor;
|
||||||
|
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
||||||
|
import net.sourceforge.plantuml.ugraphic.ULine;
|
||||||
|
import net.sourceforge.plantuml.ugraphic.UTranslate;
|
||||||
|
|
||||||
|
public class ConnectorPuzzleEmpty extends AbstractConnectorPuzzle implements Placeable, TextBlock, ConnectorPuzzle {
|
||||||
|
|
||||||
|
public static ConnectorPuzzleEmpty get(String value) {
|
||||||
|
final ConnectorPuzzleEmpty result = new ConnectorPuzzleEmpty();
|
||||||
|
for (Where w : Where.values()) {
|
||||||
|
if (value.contains(w.toShortString())) {
|
||||||
|
result.append(w);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean checkDirections(String directions) {
|
||||||
|
return connections().equals(get(directions).connections());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
if (connections().size() == 0) {
|
||||||
|
return "NONE";
|
||||||
|
|
||||||
|
}
|
||||||
|
return connections().toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Dimension2D getDimension(StringBounder stringBounder, ISkinParam skinParam) {
|
||||||
|
return new Dimension2DDouble(20, 20);
|
||||||
|
}
|
||||||
|
|
||||||
|
public TextBlock toTextBlock(ISkinParam skinParam) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getId() {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void drawU(UGraphic ug) {
|
||||||
|
// System.err.println("DRAWING " + toString());
|
||||||
|
ug = ug.apply(new UChangeColor(HtmlColorUtils.BLUE));
|
||||||
|
for (Where w : Where.values()) {
|
||||||
|
if (have(w)) {
|
||||||
|
drawLine(ug, w);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void drawLine(UGraphic ug, Where w) {
|
||||||
|
if (w == Where.WEST) {
|
||||||
|
ug.apply(new UTranslate(0, 10)).draw(new ULine(10, 0));
|
||||||
|
}
|
||||||
|
if (w == Where.EAST) {
|
||||||
|
ug.apply(new UTranslate(10, 10)).draw(new ULine(10, 0));
|
||||||
|
}
|
||||||
|
if (w == Where.NORTH) {
|
||||||
|
ug.apply(new UTranslate(10, 0)).draw(new ULine(0, 10));
|
||||||
|
}
|
||||||
|
if (w == Where.SOUTH) {
|
||||||
|
ug.apply(new UTranslate(10, 10)).draw(new ULine(0, 10));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Dimension2D calculateDimension(StringBounder stringBounder) {
|
||||||
|
return new Dimension2DDouble(20, 20);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Rectangle2D getInnerPosition(String member, StringBounder stringBounder, InnerStrategy strategy) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
45
src/net/sourceforge/plantuml/bpm/FootPrint.java
Normal file
45
src/net/sourceforge/plantuml/bpm/FootPrint.java
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
/* ========================================================================
|
||||||
|
* PlantUML : a free UML diagram generator
|
||||||
|
* ========================================================================
|
||||||
|
*
|
||||||
|
* (C) Copyright 2009-2017, 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.bpm;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public class FootPrint {
|
||||||
|
|
||||||
|
private final Set<Coord> cells = new HashSet<Coord>();
|
||||||
|
|
||||||
|
}
|
@ -44,6 +44,7 @@ import java.util.Map;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import net.sourceforge.plantuml.ISkinParam;
|
import net.sourceforge.plantuml.ISkinParam;
|
||||||
|
import net.sourceforge.plantuml.bpm.ConnectorPuzzle.Where;
|
||||||
|
|
||||||
public class Grid {
|
public class Grid {
|
||||||
|
|
||||||
@ -59,6 +60,17 @@ public class Grid {
|
|||||||
this.cells.put(root, new Cell());
|
this.cells.put(root, new Cell());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Grid(Grid other) {
|
||||||
|
this.lines = ((ChainImpl<Line>) other.lines).cloneMe();
|
||||||
|
this.cols = ((ChainImpl<Col>) other.cols).cloneMe();
|
||||||
|
this.root = other.root;
|
||||||
|
this.cells.putAll(other.cells);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Grid cloneMe() {
|
||||||
|
return new Grid(this);
|
||||||
|
}
|
||||||
|
|
||||||
public Cell getCell(Coord coord) {
|
public Cell getCell(Coord coord) {
|
||||||
return getCell(coord.getLine(), coord.getCol());
|
return getCell(coord.getLine(), coord.getCol());
|
||||||
}
|
}
|
||||||
@ -256,7 +268,6 @@ public class Grid {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void removeLine(Line line) {
|
public void removeLine(Line line) {
|
||||||
System.err.println("REMOVING " + line);
|
|
||||||
assert usedColsOf(line).isEmpty();
|
assert usedColsOf(line).isEmpty();
|
||||||
for (final Iterator<Map.Entry<Coord, Cell>> it = cells.entrySet().iterator(); it.hasNext();) {
|
for (final Iterator<Map.Entry<Coord, Cell>> it = cells.entrySet().iterator(); it.hasNext();) {
|
||||||
final Map.Entry<Coord, Cell> ent = it.next();
|
final Map.Entry<Coord, Cell> ent = it.next();
|
||||||
@ -308,15 +319,25 @@ public class Grid {
|
|||||||
final boolean startHorizontal = i == 0;
|
final boolean startHorizontal = i == 0;
|
||||||
if (startHorizontal) {
|
if (startHorizontal) {
|
||||||
// System.err.println("DrawingHorizontal " + ent.getValue() + " --> " + dests.get(i) + " " + i);
|
// System.err.println("DrawingHorizontal " + ent.getValue() + " --> " + dests.get(i) + " " + i);
|
||||||
drawHorizontal(src, dest);
|
drawStartHorizontal(src, dest);
|
||||||
} else {
|
} else {
|
||||||
drawVertical(src, dest);
|
drawStartVertical(src, dest);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void drawVertical(final Coord src, final Coord dest) {
|
private void drawStartVertical(final Coord src, final Coord dest) {
|
||||||
|
if (src.getLine() == dest.getLine() && src.getCol() == dest.getCol()) {
|
||||||
|
throw new IllegalStateException();
|
||||||
|
}
|
||||||
|
final BpmElement start = (BpmElement) getCell(src).getData();
|
||||||
|
final int compare = lines.compare(src.getLine(), dest.getLine());
|
||||||
|
if (compare == 0) {
|
||||||
|
throw new IllegalStateException();
|
||||||
|
}
|
||||||
|
start.append(compare < 0 ? Where.SOUTH : Where.NORTH);
|
||||||
|
|
||||||
for (Navigator<Line> itLine = Navigators.iterate(lines, src.getLine(), dest.getLine()); itLine.get() != dest
|
for (Navigator<Line> itLine = Navigators.iterate(lines, src.getLine(), dest.getLine()); itLine.get() != dest
|
||||||
.getLine();) {
|
.getLine();) {
|
||||||
final Line cur = itLine.next();
|
final Line cur = itLine.next();
|
||||||
@ -330,6 +351,10 @@ public class Grid {
|
|||||||
addPuzzle(dest.getLine(), cur, "EW");
|
addPuzzle(dest.getLine(), cur, "EW");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
final BpmElement end = (BpmElement) getCell(dest).getData();
|
||||||
|
if (src.getLine() == dest.getLine()) {
|
||||||
|
end.append(compare < 0 ? Where.NORTH : Where.SOUTH);
|
||||||
|
}
|
||||||
if (src.getLine() != dest.getLine() && src.getCol() != dest.getCol()) {
|
if (src.getLine() != dest.getLine() && src.getCol() != dest.getCol()) {
|
||||||
if (lines.compare(dest.getLine(), src.getLine()) > 0) {
|
if (lines.compare(dest.getLine(), src.getLine()) > 0) {
|
||||||
addPuzzle(dest.getLine(), src.getCol(), "N");
|
addPuzzle(dest.getLine(), src.getCol(), "N");
|
||||||
@ -341,11 +366,22 @@ public class Grid {
|
|||||||
} else {
|
} else {
|
||||||
addPuzzle(dest.getLine(), src.getCol(), "W");
|
addPuzzle(dest.getLine(), src.getCol(), "W");
|
||||||
}
|
}
|
||||||
|
end.append(cols.compare(src.getCol(), dest.getCol()) > 0 ? Where.EAST : Where.WEST);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void drawHorizontal(final Coord src, final Coord dest) {
|
private void drawStartHorizontal(final Coord src, final Coord dest) {
|
||||||
|
if (src.getLine() == dest.getLine() && src.getCol() == dest.getCol()) {
|
||||||
|
throw new IllegalStateException();
|
||||||
|
}
|
||||||
|
final BpmElement start = (BpmElement) getCell(src).getData();
|
||||||
|
final int compare = cols.compare(src.getCol(), dest.getCol());
|
||||||
|
if (compare == 0) {
|
||||||
|
throw new IllegalStateException();
|
||||||
|
}
|
||||||
|
start.append(compare < 0 ? Where.EAST : Where.WEST);
|
||||||
|
|
||||||
for (Navigator<Col> itCol = Navigators.iterate(cols, src.getCol(), dest.getCol()); itCol.get() != dest.getCol();) {
|
for (Navigator<Col> itCol = Navigators.iterate(cols, src.getCol(), dest.getCol()); itCol.get() != dest.getCol();) {
|
||||||
final Col cur = itCol.next();
|
final Col cur = itCol.next();
|
||||||
if (cur != dest.getCol()) {
|
if (cur != dest.getCol()) {
|
||||||
@ -359,6 +395,10 @@ public class Grid {
|
|||||||
addPuzzle(cur, dest.getCol(), "NS");
|
addPuzzle(cur, dest.getCol(), "NS");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
final BpmElement end = (BpmElement) getCell(dest).getData();
|
||||||
|
if (src.getLine() == dest.getLine()) {
|
||||||
|
end.append(compare < 0 ? Where.WEST : Where.EAST);
|
||||||
|
}
|
||||||
if (src.getLine() != dest.getLine() && src.getCol() != dest.getCol()) {
|
if (src.getLine() != dest.getLine() && src.getCol() != dest.getCol()) {
|
||||||
if (cols.compare(dest.getCol(), src.getCol()) > 0) {
|
if (cols.compare(dest.getCol(), src.getCol()) > 0) {
|
||||||
addPuzzle(src.getLine(), dest.getCol(), "W");
|
addPuzzle(src.getLine(), dest.getCol(), "W");
|
||||||
@ -370,17 +410,18 @@ public class Grid {
|
|||||||
} else {
|
} else {
|
||||||
addPuzzle(src.getLine(), dest.getCol(), "N");
|
addPuzzle(src.getLine(), dest.getCol(), "N");
|
||||||
}
|
}
|
||||||
|
end.append(lines.compare(src.getLine(), dest.getLine()) > 0 ? Where.SOUTH : Where.NORTH);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addPuzzle(Line line, Col col, String direction) {
|
private void addPuzzle(Line line, Col col, String direction) {
|
||||||
final Cell cell = getCell(line, col);
|
final Cell cell = getCell(line, col);
|
||||||
ConnectorPuzzle after = ConnectorPuzzle.get(direction);
|
ConnectorPuzzleEmpty connector = (ConnectorPuzzleEmpty) cell.getData();
|
||||||
final ConnectorPuzzle before = (ConnectorPuzzle) cell.getData();
|
if (connector == null) {
|
||||||
if (before != null) {
|
connector = new ConnectorPuzzleEmpty();
|
||||||
after = after.append(before);
|
cell.setData(connector);
|
||||||
}
|
}
|
||||||
cell.setData(after);
|
connector.append(ConnectorPuzzleEmpty.get(direction));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -61,7 +61,7 @@ import net.sourceforge.plantuml.graphic.color.Colors;
|
|||||||
|
|
||||||
public class CommandCreateElementFull extends SingleLineCommand2<DescriptionDiagram> {
|
public class CommandCreateElementFull extends SingleLineCommand2<DescriptionDiagram> {
|
||||||
|
|
||||||
public static final String ALL_TYPES = "artifact|actor|folder|card|file|package|rectangle|node|frame|cloud|database|queue|pipe|storage|agent|usecase|component|boundary|control|entity|interface";
|
public static final String ALL_TYPES = "artifact|actor|folder|card|file|package|rectangle|node|frame|cloud|database|queue|stack|storage|agent|usecase|component|boundary|control|entity|interface";
|
||||||
|
|
||||||
public CommandCreateElementFull() {
|
public CommandCreateElementFull() {
|
||||||
super(getRegexConcat());
|
super(getRegexConcat());
|
||||||
|
@ -64,18 +64,18 @@ import net.sourceforge.plantuml.version.PSystemVersion;
|
|||||||
|
|
||||||
public class PSystemDonors extends AbstractPSystem {
|
public class PSystemDonors extends AbstractPSystem {
|
||||||
|
|
||||||
public static final String DONORS = "UDfbL4jksp0GtSyfk1RIGoXsxDI_17QQ0jcDfR75c29TKd8ghOAUeK3NlKABB8eMsVG2oeqwSYkJIWaO"
|
public static final String DONORS = "UDfbL4jksp0GtSyfk1RIGoXsujI_17QQ0jcDvR75c29Tad8ghuBUe421hdk3eaKMHOjiUW7bHXsvbKcb"
|
||||||
+ "CCNXp7lptZ1MqRz55gwf82jYNHWjCO4RYlmoESoCtre7SNSLrp2s_eWgMD4QNI5HYuN9DCGwDLQC3HKr"
|
+ "10oOudpUctapgKh-7R9mHPwiIBKtMc86rvI4OmeOct2r3jBM5HSmiE69AfZJ0fsNgCNKv1fIlJHM30pv"
|
||||||
+ "jNyt6uxemb7338D2ke2Xx3PIGUnJcmEiIW-XWh6C-aiRc7GeImUhWlOPQJ4mPi_yXbqTSZ3DNrqr5WP6"
|
+ "FJL_LoksQCrHmnYZHDf3NxONgI0DeSqEvcM0KC509jsZ3GnRbAM3kQTjJbhqZDaoltwRXnoCYXUknaBF"
|
||||||
+ "IIsMfdG4a_BLUNHlc4YtsKkO1wWn3xTSAbRq4NNAxHnaahDkqLRCT7cYhRUm2D4NDLmfUU0BGvdi6Fdf"
|
+ "AAd5p9IEO5Y-U4_k31DfBri9amWr5l6LKwMAtgDUSZbxkUIeQxGLCvqTQUirJ6FqVW-NIkxOeI-p3IC_"
|
||||||
+ "H6guSAVKEW0HqG66TIuBMuaPPYP5cBHDlykGqmTn4Ial5wzTnMtIM70SusDSax_WQTTZfLFUseHxCiAr"
|
+ "laWDP-uOMaSW4jf1Vrz8Roinnjmi4OPDqMzpvF2HNK8gj8lFfk8oQVHin_WOr_0lUDfqMEabNst6DJd7"
|
||||||
+ "hNRcmUqa9r9yxSeMiePB7vqQcCia8oNEKQegPA3g48npC27KRoQOV2Z9YM6vjiXQAi_trjmNb6HYQj6X"
|
+ "XQqsvjvj90TIx7PflTp3HR1U6fZ8B2SbJb6gAcQWzZ4Ovs18g5yDCNjNaXFzSc6HUwa2tnjpvodBnSYY"
|
||||||
+ "XxGbjcYWs4FhB0uHKtEGeL6ELddd2Kk4PM3UjaJ8Cxhds_l0LcRNTkRSMDIezcVYZWeqUmTB9eWs5LFP"
|
+ "mm1fJIpHg6FtZRBOH8pCJiP2EKZbJI0i4MQHU9iKCS_aZhstaQpCfgdCgR6eKMrFn2rvD5i7CoQ8TYb6"
|
||||||
+ "IWiZPMpRx_dlNqeTHVU6K84vsKwpavqiTjrkLS_wZ1nSOsUFfUm1ZfKKAyIKHyTkIRmdlILx9kRnpTjL"
|
+ "icajd2jZctfFVlzIwj3q80WLYPFbD3xAoM9RxQRhUPUHWojivJ6J7S2facAEkEJHiMiIRqcloPw8INhz"
|
||||||
+ "xAqT6GrZwerCo5mdR95St3Bg8PjswYCjjShoiCo8uE8GEl-0iF19AEz0HW6DSIdP5sLEOcHAAdn_4mUZ"
|
+ "Ufu6QIT6mu0w8nCprnbBf10tZBhFeXq5IqjDPtbOnaHmjekLlqEOXY1Kj22JYCQWbAoBiY1nRahoeRwP"
|
||||||
+ "K9aZ5-y6NOTjOxWBkMKFhMJkHv01yIHlsauZJtK0Eb8Aci_DKv2-UMf-m23hZNR5WrUkZm-1rJmBbwO7"
|
+ "W_EuCmSkGGrw7vUDuKxbcZKqbqKOGGR4axngAeqyrH7eH2ceFzMFKVZwiVu1lRmpsXKFNhauB0AhUHOk"
|
||||||
+ "Pqncix5KYONCMRW9_l-gB763IimhftX6cg_DqyjZyxqj9PelpNFpitb--SI_H_xq3IuirMAAAkV9kWor"
|
+ "J0VEWCngPQaIKrbmuuRu_rQPuGgLc5HEyOpKN-h7vuVwUvDAr9_hf_fd_VJyWNyF_EaRd5dQYn6gWYVh"
|
||||||
+ "RkrAxDTpKksX3cJZAZ9u5QE87ya-2pROBRr-bA9ImH_rNe_d";
|
+ "8kvr8rTYlPwIQXvrr3RE8gEjc2Iy9BiiM60tz78f9QNYlT5IyJ0_17GUwe_rrsD961Zy0II4d1O0";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
final protected ImageData exportDiagramNow(OutputStream os, int num, FileFormatOption fileFormat, long seed)
|
final protected ImageData exportDiagramNow(OutputStream os, int num, FileFormatOption fileFormat, long seed)
|
||||||
|
@ -232,7 +232,7 @@ public class QuoteUtils {
|
|||||||
"V'z fbeel, ner lbh sebz gur cnfg ?", "Unir lbh gevrq gheavat vg bss naq ba ntnva ?",
|
"V'z fbeel, ner lbh sebz gur cnfg ?", "Unir lbh gevrq gheavat vg bss naq ba ntnva ?",
|
||||||
"Vs lbh qba'g xabj jurer lbh ner tbvat nal ebnq pna gnxr lbh gurer",
|
"Vs lbh qba'g xabj jurer lbh ner tbvat nal ebnq pna gnxr lbh gurer",
|
||||||
"Ortva ng gur ortvaavat, naq tb ba gvyy lbh pbzr gb gur raq: gura fgbc",
|
"Ortva ng gur ortvaavat, naq tb ba gvyy lbh pbzr gb gur raq: gura fgbc",
|
||||||
"Xrrc pnyz naq cerff Pgey-Nyg-Qry");
|
"Xrrc pnyz naq cerff Pgey-Nyg-Qry", "Vs lbh glcr Tbbtyr vagb Tbbtyr, lbh pna oernx gur Vagrearg.");
|
||||||
|
|
||||||
private QuoteUtils() {
|
private QuoteUtils() {
|
||||||
}
|
}
|
||||||
|
@ -62,8 +62,8 @@ public class SkinParameter {
|
|||||||
public static final SkinParameter QUEUE = new SkinParameter("QUEUE", ColorParam.queueBackground,
|
public static final SkinParameter QUEUE = new SkinParameter("QUEUE", ColorParam.queueBackground,
|
||||||
ColorParam.queueBorder, FontParam.QUEUE, FontParam.QUEUE_STEREOTYPE);
|
ColorParam.queueBorder, FontParam.QUEUE, FontParam.QUEUE_STEREOTYPE);
|
||||||
|
|
||||||
public static final SkinParameter PIPE = new SkinParameter("PIPE", ColorParam.pipeBackground,
|
public static final SkinParameter STACK = new SkinParameter("STACK", ColorParam.stackBackground,
|
||||||
ColorParam.pipeBorder, FontParam.PIPE, FontParam.PIPE_STEREOTYPE);
|
ColorParam.stackBorder, FontParam.STACK, FontParam.STACK_STEREOTYPE);
|
||||||
|
|
||||||
public static final SkinParameter CLOUD = new SkinParameter("CLOUD", ColorParam.cloudBackground,
|
public static final SkinParameter CLOUD = new SkinParameter("CLOUD", ColorParam.cloudBackground,
|
||||||
ColorParam.cloudBorder, FontParam.CLOUD, FontParam.CLOUD_STEREOTYPE);
|
ColorParam.cloudBorder, FontParam.CLOUD, FontParam.CLOUD_STEREOTYPE);
|
||||||
|
@ -74,7 +74,7 @@ public abstract class USymbol {
|
|||||||
public final static USymbol CONTROL = record("CONTROL", SkinParameter.CONTROL, new USymbolControl(2));
|
public final static USymbol CONTROL = record("CONTROL", SkinParameter.CONTROL, new USymbolControl(2));
|
||||||
public final static USymbol INTERFACE = record("INTERFACE", SkinParameter.INTERFACE, new USymbolInterface());
|
public final static USymbol INTERFACE = record("INTERFACE", SkinParameter.INTERFACE, new USymbolInterface());
|
||||||
public final static USymbol QUEUE = record("QUEUE", SkinParameter.QUEUE, new USymbolQueue());
|
public final static USymbol QUEUE = record("QUEUE", SkinParameter.QUEUE, new USymbolQueue());
|
||||||
public final static USymbol PIPE = record("PIPE", SkinParameter.PIPE, new USymbolPipe());
|
public final static USymbol STACK = record("STACK", SkinParameter.STACK, new USymbolStack());
|
||||||
public final static USymbol TOGETHER = record("TOGETHER", SkinParameter.QUEUE, new USymbolTogether());
|
public final static USymbol TOGETHER = record("TOGETHER", SkinParameter.QUEUE, new USymbolTogether());
|
||||||
|
|
||||||
abstract public SkinParameter getSkinParameter();
|
abstract public SkinParameter getSkinParameter();
|
||||||
@ -109,6 +109,9 @@ public abstract class USymbol {
|
|||||||
if (s.equalsIgnoreCase("component")) {
|
if (s.equalsIgnoreCase("component")) {
|
||||||
return COMPONENT2;
|
return COMPONENT2;
|
||||||
}
|
}
|
||||||
|
if (s.equalsIgnoreCase("entity")) {
|
||||||
|
return ENTITY_DOMAIN;
|
||||||
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
@ -204,8 +207,8 @@ public abstract class USymbol {
|
|||||||
usymbol = USymbol.DATABASE;
|
usymbol = USymbol.DATABASE;
|
||||||
} else if (symbol.equalsIgnoreCase("queue")) {
|
} else if (symbol.equalsIgnoreCase("queue")) {
|
||||||
usymbol = USymbol.QUEUE;
|
usymbol = USymbol.QUEUE;
|
||||||
} else if (symbol.equalsIgnoreCase("pipe")) {
|
} else if (symbol.equalsIgnoreCase("stack")) {
|
||||||
usymbol = USymbol.PIPE;
|
usymbol = USymbol.STACK;
|
||||||
} else if (symbol.equalsIgnoreCase("storage")) {
|
} else if (symbol.equalsIgnoreCase("storage")) {
|
||||||
usymbol = USymbol.STORAGE;
|
usymbol = USymbol.STORAGE;
|
||||||
} else if (symbol.equalsIgnoreCase("agent")) {
|
} else if (symbol.equalsIgnoreCase("agent")) {
|
||||||
|
@ -1,181 +0,0 @@
|
|||||||
/* ========================================================================
|
|
||||||
* PlantUML : a free UML diagram generator
|
|
||||||
* ========================================================================
|
|
||||||
*
|
|
||||||
* (C) Copyright 2009-2017, 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.graphic;
|
|
||||||
|
|
||||||
import java.awt.geom.Dimension2D;
|
|
||||||
|
|
||||||
import net.sourceforge.plantuml.Dimension2DDouble;
|
|
||||||
import net.sourceforge.plantuml.creole.Stencil;
|
|
||||||
import net.sourceforge.plantuml.ugraphic.AbstractUGraphicHorizontalLine;
|
|
||||||
import net.sourceforge.plantuml.ugraphic.UChangeBackColor;
|
|
||||||
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
|
||||||
import net.sourceforge.plantuml.ugraphic.UHorizontalLine;
|
|
||||||
import net.sourceforge.plantuml.ugraphic.UPath;
|
|
||||||
import net.sourceforge.plantuml.ugraphic.UTranslate;
|
|
||||||
|
|
||||||
class USymbolPipe extends USymbol {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public SkinParameter getSkinParameter() {
|
|
||||||
return SkinParameter.PIPE;
|
|
||||||
}
|
|
||||||
|
|
||||||
private final double dx = 5;
|
|
||||||
|
|
||||||
private void drawQueue(UGraphic ug, double width, double height, boolean shadowing) {
|
|
||||||
final UPath shape = new UPath();
|
|
||||||
if (shadowing) {
|
|
||||||
shape.setDeltaShadow(3.0);
|
|
||||||
}
|
|
||||||
shape.moveTo(dx, 0);
|
|
||||||
shape.lineTo(width - dx, 0);
|
|
||||||
shape.cubicTo(width, 0, width, height / 2, width, height / 2);
|
|
||||||
shape.cubicTo(width, height / 2, width, height, width - dx, height);
|
|
||||||
shape.lineTo(dx, height);
|
|
||||||
|
|
||||||
shape.cubicTo(0, height, 0, height / 2, 0, height / 2);
|
|
||||||
shape.cubicTo(0, height / 2, 0, 0, dx, 0);
|
|
||||||
|
|
||||||
ug.draw(shape);
|
|
||||||
|
|
||||||
final UPath closing = getClosingPath(width, height);
|
|
||||||
ug.apply(new UChangeBackColor(null)).draw(closing);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private UPath getClosingPath(double width, double height) {
|
|
||||||
final UPath closing = new UPath();
|
|
||||||
closing.moveTo(width - dx, 0);
|
|
||||||
closing.cubicTo(width - dx * 2, 0, width - dx * 2, height / 2, width - dx * 2, height / 2);
|
|
||||||
closing.cubicTo(width - dx * 2, height, width - dx, height, width - dx, height);
|
|
||||||
return closing;
|
|
||||||
}
|
|
||||||
|
|
||||||
class MyUGraphicQueue extends AbstractUGraphicHorizontalLine implements Stencil {
|
|
||||||
|
|
||||||
private final double x1;
|
|
||||||
private final double x2;
|
|
||||||
private final double fullHeight;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected AbstractUGraphicHorizontalLine copy(UGraphic ug) {
|
|
||||||
return new MyUGraphicQueue(ug, x1, x2, fullHeight);
|
|
||||||
}
|
|
||||||
|
|
||||||
public MyUGraphicQueue(UGraphic ug, double x1, double x2, double fullHeight) {
|
|
||||||
super(ug);
|
|
||||||
this.x1 = x1;
|
|
||||||
this.x2 = x2;
|
|
||||||
this.fullHeight = fullHeight;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void drawHline(UGraphic ug, UHorizontalLine line, UTranslate translate) {
|
|
||||||
line.drawLineInternal(ug, this, translate.getDy(), line.getStroke());
|
|
||||||
}
|
|
||||||
|
|
||||||
public double getStartingX(StringBounder stringBounder, double y) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public double getEndingX(StringBounder stringBounder, double y) {
|
|
||||||
final double factor2;
|
|
||||||
final double halfHeight = fullHeight / 2;
|
|
||||||
if (y <= halfHeight) {
|
|
||||||
factor2 = 1 - (y / halfHeight);
|
|
||||||
} else {
|
|
||||||
factor2 = (y - halfHeight) / halfHeight;
|
|
||||||
}
|
|
||||||
return (x2 - x1) * factor2 + x1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private Margin getMargin() {
|
|
||||||
return new Margin(5, 15, 5, 5);
|
|
||||||
}
|
|
||||||
|
|
||||||
public TextBlock asSmall(TextBlock name, final TextBlock label, final TextBlock stereotype,
|
|
||||||
final SymbolContext symbolContext) {
|
|
||||||
return new AbstractTextBlock() {
|
|
||||||
|
|
||||||
public void drawU(UGraphic ug) {
|
|
||||||
final Dimension2D dim = calculateDimension(ug.getStringBounder());
|
|
||||||
ug = symbolContext.apply(ug);
|
|
||||||
drawQueue(ug, dim.getWidth(), dim.getHeight(), symbolContext.isShadowing());
|
|
||||||
final Margin margin = getMargin();
|
|
||||||
final TextBlock tb = TextBlockUtils.mergeTB(stereotype, label, HorizontalAlignment.CENTER);
|
|
||||||
final UGraphic ug2 = new MyUGraphicQueue(ug, dim.getWidth() - 2 * dx, dim.getWidth() - dx,
|
|
||||||
dim.getHeight());
|
|
||||||
tb.drawU(ug2.apply(new UTranslate(margin.getX1(), margin.getY1())));
|
|
||||||
}
|
|
||||||
|
|
||||||
public Dimension2D calculateDimension(StringBounder stringBounder) {
|
|
||||||
final Dimension2D dimLabel = label.calculateDimension(stringBounder);
|
|
||||||
final Dimension2D dimStereo = stereotype.calculateDimension(stringBounder);
|
|
||||||
return getMargin().addDimension(Dimension2DDouble.mergeTB(dimStereo, dimLabel));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public TextBlock asBig(final TextBlock title, final TextBlock stereotype, final double width, final double height,
|
|
||||||
final SymbolContext symbolContext) {
|
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
// return new TextBlock() {
|
|
||||||
//
|
|
||||||
// public void drawU(UGraphic ug) {
|
|
||||||
// final Dimension2D dim = calculateDimension(ug.getStringBounder());
|
|
||||||
// ug = symbolContext.apply(ug);
|
|
||||||
// drawDatabase(ug, dim.getWidth(), dim.getHeight(), symbolContext.isShadowing());
|
|
||||||
// final Dimension2D dimStereo = stereotype.calculateDimension(ug.getStringBounder());
|
|
||||||
// final double posStereo = (width - dimStereo.getWidth()) / 2;
|
|
||||||
// stereotype.drawU(ug.apply(new UTranslate(posStereo, 0)));
|
|
||||||
//
|
|
||||||
// final Dimension2D dimTitle = title.calculateDimension(ug.getStringBounder());
|
|
||||||
// final double posTitle = (width - dimTitle.getWidth()) / 2;
|
|
||||||
// title.drawU(ug.apply(new UTranslate(posTitle, 21)));
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public Dimension2D calculateDimension(StringBounder stringBounder) {
|
|
||||||
// return new Dimension2DDouble(width, height);
|
|
||||||
// }
|
|
||||||
// };
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean manageHorizontalLine() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -38,13 +38,12 @@ package net.sourceforge.plantuml.graphic;
|
|||||||
import java.awt.geom.Dimension2D;
|
import java.awt.geom.Dimension2D;
|
||||||
|
|
||||||
import net.sourceforge.plantuml.Dimension2DDouble;
|
import net.sourceforge.plantuml.Dimension2DDouble;
|
||||||
|
import net.sourceforge.plantuml.creole.Stencil;
|
||||||
|
import net.sourceforge.plantuml.ugraphic.AbstractUGraphicHorizontalLine;
|
||||||
import net.sourceforge.plantuml.ugraphic.UChangeBackColor;
|
import net.sourceforge.plantuml.ugraphic.UChangeBackColor;
|
||||||
import net.sourceforge.plantuml.ugraphic.UChangeColor;
|
|
||||||
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
||||||
import net.sourceforge.plantuml.ugraphic.UGraphicStencil;
|
import net.sourceforge.plantuml.ugraphic.UHorizontalLine;
|
||||||
import net.sourceforge.plantuml.ugraphic.UPath;
|
import net.sourceforge.plantuml.ugraphic.UPath;
|
||||||
import net.sourceforge.plantuml.ugraphic.URectangle;
|
|
||||||
import net.sourceforge.plantuml.ugraphic.UStroke;
|
|
||||||
import net.sourceforge.plantuml.ugraphic.UTranslate;
|
import net.sourceforge.plantuml.ugraphic.UTranslate;
|
||||||
|
|
||||||
class USymbolQueue extends USymbol {
|
class USymbolQueue extends USymbol {
|
||||||
@ -54,25 +53,78 @@ class USymbolQueue extends USymbol {
|
|||||||
return SkinParameter.QUEUE;
|
return SkinParameter.QUEUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void drawQueue(UGraphic ug, double width, double height, boolean shadowing, double roundCorner) {
|
private final double dx = 5;
|
||||||
final double border = 15;
|
|
||||||
final URectangle rect = new URectangle(width - 2 * border, height, roundCorner, roundCorner);
|
private void drawQueue(UGraphic ug, double width, double height, boolean shadowing) {
|
||||||
|
final UPath shape = new UPath();
|
||||||
if (shadowing) {
|
if (shadowing) {
|
||||||
rect.setDeltaShadow(3.0);
|
shape.setDeltaShadow(3.0);
|
||||||
|
}
|
||||||
|
shape.moveTo(dx, 0);
|
||||||
|
shape.lineTo(width - dx, 0);
|
||||||
|
shape.cubicTo(width, 0, width, height / 2, width, height / 2);
|
||||||
|
shape.cubicTo(width, height / 2, width, height, width - dx, height);
|
||||||
|
shape.lineTo(dx, height);
|
||||||
|
|
||||||
|
shape.cubicTo(0, height, 0, height / 2, 0, height / 2);
|
||||||
|
shape.cubicTo(0, height / 2, 0, 0, dx, 0);
|
||||||
|
|
||||||
|
ug.draw(shape);
|
||||||
|
|
||||||
|
final UPath closing = getClosingPath(width, height);
|
||||||
|
ug.apply(new UChangeBackColor(null)).draw(closing);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private UPath getClosingPath(double width, double height) {
|
||||||
|
final UPath closing = new UPath();
|
||||||
|
closing.moveTo(width - dx, 0);
|
||||||
|
closing.cubicTo(width - dx * 2, 0, width - dx * 2, height / 2, width - dx * 2, height / 2);
|
||||||
|
closing.cubicTo(width - dx * 2, height, width - dx, height, width - dx, height);
|
||||||
|
return closing;
|
||||||
|
}
|
||||||
|
|
||||||
|
class MyUGraphicQueue extends AbstractUGraphicHorizontalLine implements Stencil {
|
||||||
|
|
||||||
|
private final double x1;
|
||||||
|
private final double x2;
|
||||||
|
private final double fullHeight;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected AbstractUGraphicHorizontalLine copy(UGraphic ug) {
|
||||||
|
return new MyUGraphicQueue(ug, x1, x2, fullHeight);
|
||||||
|
}
|
||||||
|
|
||||||
|
public MyUGraphicQueue(UGraphic ug, double x1, double x2, double fullHeight) {
|
||||||
|
super(ug);
|
||||||
|
this.x1 = x1;
|
||||||
|
this.x2 = x2;
|
||||||
|
this.fullHeight = fullHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void drawHline(UGraphic ug, UHorizontalLine line, UTranslate translate) {
|
||||||
|
line.drawLineInternal(ug, this, translate.getDy(), line.getStroke());
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getStartingX(StringBounder stringBounder, double y) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getEndingX(StringBounder stringBounder, double y) {
|
||||||
|
final double factor2;
|
||||||
|
final double halfHeight = fullHeight / 2;
|
||||||
|
if (y <= halfHeight) {
|
||||||
|
factor2 = 1 - (y / halfHeight);
|
||||||
|
} else {
|
||||||
|
factor2 = (y - halfHeight) / halfHeight;
|
||||||
|
}
|
||||||
|
return (x2 - x1) * factor2 + x1;
|
||||||
}
|
}
|
||||||
ug.apply(new UChangeColor(null)).apply(new UTranslate(border, 0)).draw(rect);
|
|
||||||
final UPath path = new UPath();
|
|
||||||
path.moveTo(0, 0);
|
|
||||||
path.lineTo(border, 0);
|
|
||||||
path.lineTo(border, height);
|
|
||||||
path.lineTo(width - border, height);
|
|
||||||
path.lineTo(width - border, 0);
|
|
||||||
path.lineTo(width, 0);
|
|
||||||
ug.apply(new UChangeBackColor(null)).draw(path);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Margin getMargin() {
|
private Margin getMargin() {
|
||||||
return new Margin(25, 25, 10, 10);
|
return new Margin(5, 15, 5, 5);
|
||||||
}
|
}
|
||||||
|
|
||||||
public TextBlock asSmall(TextBlock name, final TextBlock label, final TextBlock stereotype,
|
public TextBlock asSmall(TextBlock name, final TextBlock label, final TextBlock stereotype,
|
||||||
@ -81,13 +133,13 @@ class USymbolQueue extends USymbol {
|
|||||||
|
|
||||||
public void drawU(UGraphic ug) {
|
public void drawU(UGraphic ug) {
|
||||||
final Dimension2D dim = calculateDimension(ug.getStringBounder());
|
final Dimension2D dim = calculateDimension(ug.getStringBounder());
|
||||||
ug = UGraphicStencil.create(ug, getRectangleStencil(dim), new UStroke());
|
|
||||||
ug = symbolContext.apply(ug);
|
ug = symbolContext.apply(ug);
|
||||||
drawQueue(ug, dim.getWidth(), dim.getHeight(), symbolContext.isShadowing(),
|
drawQueue(ug, dim.getWidth(), dim.getHeight(), symbolContext.isShadowing());
|
||||||
symbolContext.getRoundCorner());
|
|
||||||
final Margin margin = getMargin();
|
final Margin margin = getMargin();
|
||||||
final TextBlock tb = TextBlockUtils.mergeTB(stereotype, label, HorizontalAlignment.CENTER);
|
final TextBlock tb = TextBlockUtils.mergeTB(stereotype, label, HorizontalAlignment.CENTER);
|
||||||
tb.drawU(ug.apply(new UTranslate(margin.getX1(), margin.getY1())));
|
final UGraphic ug2 = new MyUGraphicQueue(ug, dim.getWidth() - 2 * dx, dim.getWidth() - dx,
|
||||||
|
dim.getHeight());
|
||||||
|
tb.drawU(ug2.apply(new UTranslate(margin.getX1(), margin.getY1())));
|
||||||
}
|
}
|
||||||
|
|
||||||
public Dimension2D calculateDimension(StringBounder stringBounder) {
|
public Dimension2D calculateDimension(StringBounder stringBounder) {
|
||||||
@ -101,9 +153,27 @@ class USymbolQueue extends USymbol {
|
|||||||
public TextBlock asBig(final TextBlock title, final TextBlock stereotype, final double width, final double height,
|
public TextBlock asBig(final TextBlock title, final TextBlock stereotype, final double width, final double height,
|
||||||
final SymbolContext symbolContext) {
|
final SymbolContext symbolContext) {
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
|
// return new TextBlock() {
|
||||||
|
//
|
||||||
|
// public void drawU(UGraphic ug) {
|
||||||
|
// final Dimension2D dim = calculateDimension(ug.getStringBounder());
|
||||||
|
// ug = symbolContext.apply(ug);
|
||||||
|
// drawDatabase(ug, dim.getWidth(), dim.getHeight(), symbolContext.isShadowing());
|
||||||
|
// final Dimension2D dimStereo = stereotype.calculateDimension(ug.getStringBounder());
|
||||||
|
// final double posStereo = (width - dimStereo.getWidth()) / 2;
|
||||||
|
// stereotype.drawU(ug.apply(new UTranslate(posStereo, 0)));
|
||||||
|
//
|
||||||
|
// final Dimension2D dimTitle = title.calculateDimension(ug.getStringBounder());
|
||||||
|
// final double posTitle = (width - dimTitle.getWidth()) / 2;
|
||||||
|
// title.drawU(ug.apply(new UTranslate(posTitle, 21)));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// public Dimension2D calculateDimension(StringBounder stringBounder) {
|
||||||
|
// return new Dimension2DDouble(width, height);
|
||||||
|
// }
|
||||||
|
// };
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean manageHorizontalLine() {
|
public boolean manageHorizontalLine() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
111
src/net/sourceforge/plantuml/graphic/USymbolStack.java
Normal file
111
src/net/sourceforge/plantuml/graphic/USymbolStack.java
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
/* ========================================================================
|
||||||
|
* PlantUML : a free UML diagram generator
|
||||||
|
* ========================================================================
|
||||||
|
*
|
||||||
|
* (C) Copyright 2009-2017, 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.graphic;
|
||||||
|
|
||||||
|
import java.awt.geom.Dimension2D;
|
||||||
|
|
||||||
|
import net.sourceforge.plantuml.Dimension2DDouble;
|
||||||
|
import net.sourceforge.plantuml.ugraphic.UChangeBackColor;
|
||||||
|
import net.sourceforge.plantuml.ugraphic.UChangeColor;
|
||||||
|
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
||||||
|
import net.sourceforge.plantuml.ugraphic.UGraphicStencil;
|
||||||
|
import net.sourceforge.plantuml.ugraphic.UPath;
|
||||||
|
import net.sourceforge.plantuml.ugraphic.URectangle;
|
||||||
|
import net.sourceforge.plantuml.ugraphic.UStroke;
|
||||||
|
import net.sourceforge.plantuml.ugraphic.UTranslate;
|
||||||
|
|
||||||
|
class USymbolStack extends USymbol {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SkinParameter getSkinParameter() {
|
||||||
|
return SkinParameter.STACK;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void drawQueue(UGraphic ug, double width, double height, boolean shadowing, double roundCorner) {
|
||||||
|
final double border = 15;
|
||||||
|
final URectangle rect = new URectangle(width - 2 * border, height, roundCorner, roundCorner);
|
||||||
|
if (shadowing) {
|
||||||
|
rect.setDeltaShadow(3.0);
|
||||||
|
}
|
||||||
|
ug.apply(new UChangeColor(null)).apply(new UTranslate(border, 0)).draw(rect);
|
||||||
|
final UPath path = new UPath();
|
||||||
|
path.moveTo(0, 0);
|
||||||
|
path.lineTo(border, 0);
|
||||||
|
path.lineTo(border, height);
|
||||||
|
path.lineTo(width - border, height);
|
||||||
|
path.lineTo(width - border, 0);
|
||||||
|
path.lineTo(width, 0);
|
||||||
|
ug.apply(new UChangeBackColor(null)).draw(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Margin getMargin() {
|
||||||
|
return new Margin(25, 25, 10, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
public TextBlock asSmall(TextBlock name, final TextBlock label, final TextBlock stereotype,
|
||||||
|
final SymbolContext symbolContext) {
|
||||||
|
return new AbstractTextBlock() {
|
||||||
|
|
||||||
|
public void drawU(UGraphic ug) {
|
||||||
|
final Dimension2D dim = calculateDimension(ug.getStringBounder());
|
||||||
|
ug = UGraphicStencil.create(ug, getRectangleStencil(dim), new UStroke());
|
||||||
|
ug = symbolContext.apply(ug);
|
||||||
|
drawQueue(ug, dim.getWidth(), dim.getHeight(), symbolContext.isShadowing(),
|
||||||
|
symbolContext.getRoundCorner());
|
||||||
|
final Margin margin = getMargin();
|
||||||
|
final TextBlock tb = TextBlockUtils.mergeTB(stereotype, label, HorizontalAlignment.CENTER);
|
||||||
|
tb.drawU(ug.apply(new UTranslate(margin.getX1(), margin.getY1())));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Dimension2D calculateDimension(StringBounder stringBounder) {
|
||||||
|
final Dimension2D dimLabel = label.calculateDimension(stringBounder);
|
||||||
|
final Dimension2D dimStereo = stereotype.calculateDimension(stringBounder);
|
||||||
|
return getMargin().addDimension(Dimension2DDouble.mergeTB(dimStereo, dimLabel));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public TextBlock asBig(final TextBlock title, final TextBlock stereotype, final double width, final double height,
|
||||||
|
final SymbolContext symbolContext) {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean manageHorizontalLine() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -163,7 +163,7 @@ public class CucaDiagramFileMakerHectorB1 implements CucaDiagramFileMaker {
|
|||||||
|
|
||||||
private IEntityImage computeImage(final ILeaf leaf) {
|
private IEntityImage computeImage(final ILeaf leaf) {
|
||||||
final IEntityImage image = DotDataImageBuilder.createEntityImageBlock(leaf, diagram.getSkinParam(),
|
final IEntityImage image = DotDataImageBuilder.createEntityImageBlock(leaf, diagram.getSkinParam(),
|
||||||
false, diagram, null, null, null);
|
false, diagram, null, null, null, diagram.getLinks());
|
||||||
return image;
|
return image;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -60,7 +60,7 @@ public class Foo1 {
|
|||||||
|
|
||||||
private static IEntityImage computeImage(final ILeaf leaf, CucaDiagram diagram) {
|
private static IEntityImage computeImage(final ILeaf leaf, CucaDiagram diagram) {
|
||||||
final IEntityImage image = DotDataImageBuilder.createEntityImageBlock(leaf, diagram.getSkinParam(),
|
final IEntityImage image = DotDataImageBuilder.createEntityImageBlock(leaf, diagram.getSkinParam(),
|
||||||
false, diagram, null, null, null);
|
false, diagram, null, null, null, diagram.getLinks());
|
||||||
return image;
|
return image;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -101,7 +101,7 @@ public class Foo2 extends AbstractTextBlock implements TextBlock {
|
|||||||
|
|
||||||
private IEntityImage computeImage(final ILeaf leaf) {
|
private IEntityImage computeImage(final ILeaf leaf) {
|
||||||
final IEntityImage image = DotDataImageBuilder.createEntityImageBlock(leaf, diagram.getSkinParam(),
|
final IEntityImage image = DotDataImageBuilder.createEntityImageBlock(leaf, diagram.getSkinParam(),
|
||||||
false, diagram, null, null, null);
|
false, diagram, null, null, null, diagram.getLinks());
|
||||||
return image;
|
return image;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -592,7 +592,7 @@ public class CucaDiagramFileMakerJDot implements CucaDiagramFileMaker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return DotDataImageBuilder.createEntityImageBlock(ent, skinParam, diagram.isHideEmptyDescriptionForState(),
|
return DotDataImageBuilder.createEntityImageBlock(ent, skinParam, diagram.isHideEmptyDescriptionForState(),
|
||||||
diagram, getBibliotekon(), null, diagram.getUmlDiagramType());
|
diagram, getBibliotekon(), null, diagram.getUmlDiagramType(), diagram.getLinks());
|
||||||
}
|
}
|
||||||
return ent.getSvekImage();
|
return ent.getSvekImage();
|
||||||
}
|
}
|
||||||
|
@ -38,6 +38,7 @@ package net.sourceforge.plantuml.preproc;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@ -53,6 +54,7 @@ import net.sourceforge.plantuml.utils.StartUtils;
|
|||||||
|
|
||||||
public class Preprocessor implements ReadLine {
|
public class Preprocessor implements ReadLine {
|
||||||
|
|
||||||
|
private static final String END_DEFINE_LONG = "!enddefinelong";
|
||||||
private static final String ID = "[A-Za-z_][A-Za-z_0-9]*";
|
private static final String ID = "[A-Za-z_][A-Za-z_0-9]*";
|
||||||
private static final String ID_ARG = "\\s*[A-Za-z_][A-Za-z_0-9]*\\s*(?:=\\s*(?:\"[^\"]*\"|'[^']*')\\s*)?";
|
private static final String ID_ARG = "\\s*[A-Za-z_][A-Za-z_0-9]*\\s*(?:=\\s*(?:\"[^\"]*\"|'[^']*')\\s*)?";
|
||||||
private static final String ARG = "(?:\\(" + ID_ARG + "(?:," + ID_ARG + ")*?\\))?";
|
private static final String ARG = "(?:\\(" + ID_ARG + "(?:," + ID_ARG + ")*?\\))?";
|
||||||
@ -60,7 +62,7 @@ public class Preprocessor implements ReadLine {
|
|||||||
+ "(?:[%s]+(.*))?$");
|
+ "(?:[%s]+(.*))?$");
|
||||||
private static final Pattern2 undefPattern = MyPattern.cmpile("^[%s]*!undef[%s]+(" + ID + ")$");
|
private static final Pattern2 undefPattern = MyPattern.cmpile("^[%s]*!undef[%s]+(" + ID + ")$");
|
||||||
private static final Pattern2 definelongPattern = MyPattern.cmpile("^[%s]*!definelong[%s]+(" + ID + ARG + ")");
|
private static final Pattern2 definelongPattern = MyPattern.cmpile("^[%s]*!definelong[%s]+(" + ID + ARG + ")");
|
||||||
private static final Pattern2 enddefinelongPattern = MyPattern.cmpile("^[%s]*!enddefinelong[%s]*$");
|
private static final Pattern2 enddefinelongPattern = MyPattern.cmpile("^[%s]*" + END_DEFINE_LONG + "[%s]*$");
|
||||||
|
|
||||||
private final Defines defines;
|
private final Defines defines;
|
||||||
private final PreprocessorInclude rawSource;
|
private final PreprocessorInclude rawSource;
|
||||||
@ -105,8 +107,15 @@ public class Preprocessor implements ReadLine {
|
|||||||
|
|
||||||
final List<String> result = defines.applyDefines(s.toString2());
|
final List<String> result = defines.applyDefines(s.toString2());
|
||||||
if (result.size() > 1) {
|
if (result.size() > 1) {
|
||||||
ignoreDefineDuringSeveralLines = result.size() - 2;
|
final String last = result.get(result.size() - 1);
|
||||||
source.insert(result.subList(1, result.size() - 1), s.getLocation());
|
final List<String> inserted = result.subList(1, result.size() - 1);
|
||||||
|
assert last.startsWith(END_DEFINE_LONG);
|
||||||
|
ignoreDefineDuringSeveralLines = inserted.size();
|
||||||
|
source.insert(inserted, s.getLocation());
|
||||||
|
if (last.length() > END_DEFINE_LONG.length()) {
|
||||||
|
source.insert(last.substring(END_DEFINE_LONG.length()), s.getLocation());
|
||||||
|
ignoreDefineDuringSeveralLines++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return new CharSequence2Impl(result.get(0), s.getLocation(), s.getPreprocessorError());
|
return new CharSequence2Impl(result.get(0), s.getLocation(), s.getPreprocessorError());
|
||||||
}
|
}
|
||||||
|
@ -69,8 +69,12 @@ class ReadLineInsertable implements ReadLine {
|
|||||||
|
|
||||||
public void insert(List<? extends CharSequence> data, LineLocation location) {
|
public void insert(List<? extends CharSequence> data, LineLocation location) {
|
||||||
for (CharSequence s : data) {
|
for (CharSequence s : data) {
|
||||||
inserted.add(new CharSequence2Impl(s, location));
|
insert(s, location);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void insert(CharSequence s, LineLocation location) {
|
||||||
|
inserted.add(new CharSequence2Impl(s, location));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -48,6 +48,7 @@ import net.sourceforge.plantuml.skin.ComponentType;
|
|||||||
import net.sourceforge.plantuml.skin.Context2D;
|
import net.sourceforge.plantuml.skin.Context2D;
|
||||||
import net.sourceforge.plantuml.skin.Skin;
|
import net.sourceforge.plantuml.skin.Skin;
|
||||||
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
||||||
|
import net.sourceforge.plantuml.ugraphic.UTranslate;
|
||||||
|
|
||||||
public class DividerTile implements Tile {
|
public class DividerTile implements Tile {
|
||||||
|
|
||||||
@ -78,9 +79,10 @@ public class DividerTile implements Tile {
|
|||||||
final StringBounder stringBounder = ug.getStringBounder();
|
final StringBounder stringBounder = ug.getStringBounder();
|
||||||
final Component comp = getComponent(stringBounder);
|
final Component comp = getComponent(stringBounder);
|
||||||
final Dimension2D dim = comp.getPreferredDimension(stringBounder);
|
final Dimension2D dim = comp.getPreferredDimension(stringBounder);
|
||||||
final Area area = new Area(tileArguments.getBorder2() - origin.getCurrentValue(), dim.getHeight());
|
final Area area = new Area(tileArguments.getBorder2() - tileArguments.getBorder1() - origin.getCurrentValue(),
|
||||||
|
dim.getHeight());
|
||||||
|
|
||||||
// ug = ug.apply(new UTranslate(x, 0));
|
ug = ug.apply(new UTranslate(tileArguments.getBorder1(), 0));
|
||||||
comp.drawU(ug, area, (Context2D) ug);
|
comp.drawU(ug, area, (Context2D) ug);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -149,11 +149,21 @@ public class NoteTile implements Tile {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Real getMinX(StringBounder stringBounder) {
|
public Real getMinX(StringBounder stringBounder) {
|
||||||
return getX(stringBounder);
|
final Real result = getX(stringBounder);
|
||||||
|
if (note.getPosition() == NotePosition.OVER_SEVERAL) {
|
||||||
|
final Real x1 = livingSpace1.getPosB();
|
||||||
|
return RealUtils.min(result, x1);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Real getMaxX(StringBounder stringBounder) {
|
public Real getMaxX(StringBounder stringBounder) {
|
||||||
return getX(stringBounder).addFixed(getUsedWidth(stringBounder));
|
final Real result = getX(stringBounder).addFixed(getUsedWidth(stringBounder));
|
||||||
|
if (note.getPosition() == NotePosition.OVER_SEVERAL) {
|
||||||
|
final Real x2 = livingSpace2.getPosD(stringBounder);
|
||||||
|
return RealUtils.max(result, x2);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -299,7 +299,7 @@ public final class DotDataImageBuilder {
|
|||||||
|
|
||||||
return createEntityImageBlock(ent, skinParam, dotData.isHideEmptyDescriptionForState(), dotData,
|
return createEntityImageBlock(ent, skinParam, dotData.isHideEmptyDescriptionForState(), dotData,
|
||||||
dotStringFactory.getBibliotekon(), dotStringFactory.getGraphvizVersion(),
|
dotStringFactory.getBibliotekon(), dotStringFactory.getGraphvizVersion(),
|
||||||
dotData.getUmlDiagramType());
|
dotData.getUmlDiagramType(), dotData.getLinks());
|
||||||
}
|
}
|
||||||
return ent.getSvekImage();
|
return ent.getSvekImage();
|
||||||
}
|
}
|
||||||
@ -322,7 +322,7 @@ public final class DotDataImageBuilder {
|
|||||||
|
|
||||||
public static IEntityImage createEntityImageBlock(ILeaf leaf, ISkinParam skinParam,
|
public static IEntityImage createEntityImageBlock(ILeaf leaf, ISkinParam skinParam,
|
||||||
boolean isHideEmptyDescriptionForState, PortionShower portionShower, Bibliotekon bibliotekon,
|
boolean isHideEmptyDescriptionForState, PortionShower portionShower, Bibliotekon bibliotekon,
|
||||||
GraphvizVersion graphvizVersion, UmlDiagramType umlDiagramType) {
|
GraphvizVersion graphvizVersion, UmlDiagramType umlDiagramType, Collection<Link> links) {
|
||||||
if (leaf.isRemoved()) {
|
if (leaf.isRemoved()) {
|
||||||
throw new IllegalStateException();
|
throw new IllegalStateException();
|
||||||
}
|
}
|
||||||
@ -376,7 +376,7 @@ public final class DotDataImageBuilder {
|
|||||||
return new EntityImageLollipopInterface(leaf, skinParam);
|
return new EntityImageLollipopInterface(leaf, skinParam);
|
||||||
}
|
}
|
||||||
if (leaf.getLeafType() == LeafType.CIRCLE) {
|
if (leaf.getLeafType() == LeafType.CIRCLE) {
|
||||||
return new EntityImageDescription(leaf, skinParam, portionShower);
|
return new EntityImageDescription(leaf, skinParam, portionShower, links);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (leaf.getLeafType() == LeafType.DESCRIPTION) {
|
if (leaf.getLeafType() == LeafType.DESCRIPTION) {
|
||||||
@ -385,7 +385,7 @@ public final class DotDataImageBuilder {
|
|||||||
} else if (OptionFlags.USE_INTERFACE_EYE2 && leaf.getUSymbol() instanceof USymbolInterface) {
|
} else if (OptionFlags.USE_INTERFACE_EYE2 && leaf.getUSymbol() instanceof USymbolInterface) {
|
||||||
return new EntityImageLollipopInterfaceEye2(leaf, skinParam, portionShower);
|
return new EntityImageLollipopInterfaceEye2(leaf, skinParam, portionShower);
|
||||||
} else {
|
} else {
|
||||||
return new EntityImageDescription(leaf, skinParam, portionShower);
|
return new EntityImageDescription(leaf, skinParam, portionShower, links);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (leaf.getLeafType() == LeafType.USECASE) {
|
if (leaf.getLeafType() == LeafType.USECASE) {
|
||||||
@ -412,7 +412,7 @@ public final class DotDataImageBuilder {
|
|||||||
if (leaf.getLeafType() == LeafType.EMPTY_PACKAGE) {
|
if (leaf.getLeafType() == LeafType.EMPTY_PACKAGE) {
|
||||||
if (leaf.getUSymbol() != null) {
|
if (leaf.getUSymbol() != null) {
|
||||||
return new EntityImageDescription(leaf, new SkinParamForecolored(skinParam, HtmlColorUtils.BLACK),
|
return new EntityImageDescription(leaf, new SkinParamForecolored(skinParam, HtmlColorUtils.BLACK),
|
||||||
portionShower);
|
portionShower, links);
|
||||||
}
|
}
|
||||||
return new EntityImageEmptyPackage(leaf, skinParam, portionShower);
|
return new EntityImageEmptyPackage(leaf, skinParam, portionShower);
|
||||||
}
|
}
|
||||||
|
@ -48,6 +48,11 @@ public class Margins {
|
|||||||
return new Margins(value, value, value, value);
|
return new Margins(value, value, value, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "MARGIN[" + x1 + "," + x2 + "," + y1 + "," + y2 + "]";
|
||||||
|
}
|
||||||
|
|
||||||
public Margins(double x1, double x2, double y1, double y2) {
|
public Margins(double x1, double x2, double y1, double y2) {
|
||||||
this.x1 = x1;
|
this.x1 = x1;
|
||||||
this.x2 = x2;
|
this.x2 = x2;
|
||||||
|
@ -37,6 +37,7 @@
|
|||||||
package net.sourceforge.plantuml.svek.image;
|
package net.sourceforge.plantuml.svek.image;
|
||||||
|
|
||||||
import java.awt.geom.Dimension2D;
|
import java.awt.geom.Dimension2D;
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
import net.sourceforge.plantuml.Dimension2DDouble;
|
import net.sourceforge.plantuml.Dimension2DDouble;
|
||||||
import net.sourceforge.plantuml.ISkinParam;
|
import net.sourceforge.plantuml.ISkinParam;
|
||||||
@ -46,6 +47,7 @@ import net.sourceforge.plantuml.cucadiagram.BodyEnhanced;
|
|||||||
import net.sourceforge.plantuml.cucadiagram.Display;
|
import net.sourceforge.plantuml.cucadiagram.Display;
|
||||||
import net.sourceforge.plantuml.cucadiagram.EntityPortion;
|
import net.sourceforge.plantuml.cucadiagram.EntityPortion;
|
||||||
import net.sourceforge.plantuml.cucadiagram.ILeaf;
|
import net.sourceforge.plantuml.cucadiagram.ILeaf;
|
||||||
|
import net.sourceforge.plantuml.cucadiagram.Link;
|
||||||
import net.sourceforge.plantuml.cucadiagram.PortionShower;
|
import net.sourceforge.plantuml.cucadiagram.PortionShower;
|
||||||
import net.sourceforge.plantuml.cucadiagram.Stereotype;
|
import net.sourceforge.plantuml.cucadiagram.Stereotype;
|
||||||
import net.sourceforge.plantuml.graphic.FontConfiguration;
|
import net.sourceforge.plantuml.graphic.FontConfiguration;
|
||||||
@ -59,6 +61,7 @@ import net.sourceforge.plantuml.graphic.USymbol;
|
|||||||
import net.sourceforge.plantuml.graphic.USymbolFolder;
|
import net.sourceforge.plantuml.graphic.USymbolFolder;
|
||||||
import net.sourceforge.plantuml.graphic.color.ColorType;
|
import net.sourceforge.plantuml.graphic.color.ColorType;
|
||||||
import net.sourceforge.plantuml.svek.AbstractEntityImage;
|
import net.sourceforge.plantuml.svek.AbstractEntityImage;
|
||||||
|
import net.sourceforge.plantuml.svek.Bibliotekon;
|
||||||
import net.sourceforge.plantuml.svek.Margins;
|
import net.sourceforge.plantuml.svek.Margins;
|
||||||
import net.sourceforge.plantuml.svek.ShapeType;
|
import net.sourceforge.plantuml.svek.ShapeType;
|
||||||
import net.sourceforge.plantuml.ugraphic.UComment;
|
import net.sourceforge.plantuml.ugraphic.UComment;
|
||||||
@ -81,9 +84,12 @@ public class EntityImageDescription extends AbstractEntityImage {
|
|||||||
private TextBlock stereo;
|
private TextBlock stereo;
|
||||||
|
|
||||||
private final boolean hideText;
|
private final boolean hideText;
|
||||||
|
private final Collection<Link> links;
|
||||||
|
|
||||||
public EntityImageDescription(ILeaf entity, ISkinParam skinParam, PortionShower portionShower) {
|
public EntityImageDescription(ILeaf entity, ISkinParam skinParam, PortionShower portionShower,
|
||||||
|
Collection<Link> links) {
|
||||||
super(entity, entity.getColors(skinParam).mute(skinParam));
|
super(entity, entity.getColors(skinParam).mute(skinParam));
|
||||||
|
this.links = links;
|
||||||
final Stereotype stereotype = entity.getStereotype();
|
final Stereotype stereotype = entity.getStereotype();
|
||||||
USymbol symbol = getUSymbol(entity);
|
USymbol symbol = getUSymbol(entity);
|
||||||
this.shapeType = symbol == USymbol.FOLDER ? ShapeType.FOLDER : ShapeType.RECTANGLE;
|
this.shapeType = symbol == USymbol.FOLDER ? ShapeType.FOLDER : ShapeType.RECTANGLE;
|
||||||
@ -155,7 +161,7 @@ public class EntityImageDescription extends AbstractEntityImage {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Margins getShield(StringBounder stringBounder) {
|
public Margins getShield(StringBounder stringBounder) {
|
||||||
if (hideText) {
|
if (hideText && hasSomeHorizontalLink((ILeaf) getEntity(), links) == false) {
|
||||||
final Dimension2D dimStereo = stereo.calculateDimension(stringBounder);
|
final Dimension2D dimStereo = stereo.calculateDimension(stringBounder);
|
||||||
final Dimension2D dimDesc = desc.calculateDimension(stringBounder);
|
final Dimension2D dimDesc = desc.calculateDimension(stringBounder);
|
||||||
final Dimension2D dimSmall = asSmall.calculateDimension(stringBounder);
|
final Dimension2D dimSmall = asSmall.calculateDimension(stringBounder);
|
||||||
@ -166,11 +172,21 @@ public class EntityImageDescription extends AbstractEntityImage {
|
|||||||
}
|
}
|
||||||
final double y = MathUtils.max(1, dimDesc.getHeight(), dimStereo.getHeight());
|
final double y = MathUtils.max(1, dimDesc.getHeight(), dimStereo.getHeight());
|
||||||
return new Margins(suppX / 2, suppX / 2, y, y);
|
return new Margins(suppX / 2, suppX / 2, y, y);
|
||||||
|
|
||||||
}
|
}
|
||||||
return Margins.NONE;
|
return Margins.NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean hasSomeHorizontalLink(ILeaf leaf, Collection<Link> links) {
|
||||||
|
for (Link link : links) {
|
||||||
|
if (link.getLength() == 1 && link.contains(leaf)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
final public void drawU(UGraphic ug) {
|
final public void drawU(UGraphic ug) {
|
||||||
ug.draw(new UComment("entity " + getEntity().getCode().getFullName()));
|
ug.draw(new UComment("entity " + getEntity().getCode().getFullName()));
|
||||||
if (url != null) {
|
if (url != null) {
|
||||||
|
@ -70,7 +70,7 @@ public class LanguageDescriptor {
|
|||||||
type.add("database");
|
type.add("database");
|
||||||
type.add("storage");
|
type.add("storage");
|
||||||
type.add("agent");
|
type.add("agent");
|
||||||
type.add("pipe");
|
type.add("stack");
|
||||||
type.add("boundary");
|
type.add("boundary");
|
||||||
type.add("control");
|
type.add("control");
|
||||||
type.add("entity");
|
type.add("entity");
|
||||||
|
@ -43,7 +43,7 @@ public class Version {
|
|||||||
private static final int MAJOR_SEPARATOR = 1000000;
|
private static final int MAJOR_SEPARATOR = 1000000;
|
||||||
|
|
||||||
public static int version() {
|
public static int version() {
|
||||||
return 1201712;
|
return 1201713;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String versionString() {
|
public static String versionString() {
|
||||||
@ -81,7 +81,7 @@ public class Version {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static long compileTime() {
|
public static long compileTime() {
|
||||||
return 1493222796077L;
|
return 1494435153042L;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String compileTimeString() {
|
public static String compileTimeString() {
|
||||||
|
Loading…
Reference in New Issue
Block a user