diff --git a/src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/FtileIfDown.java b/src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/FtileIfDown.java index 46b4d2072..74a7ef07b 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/FtileIfDown.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/FtileIfDown.java @@ -78,9 +78,9 @@ public class FtileIfDown extends AbstractFtile { @Override public Collection getMyChildren() { - if (optionalStop == null) { + if (optionalStop == null) return Arrays.asList(thenBlock, diamond1, diamond2); - } + return Arrays.asList(thenBlock, diamond1, diamond2, optionalStop); } @@ -95,9 +95,9 @@ public class FtileIfDown extends AbstractFtile { } public Swimlane getSwimlaneOut() { - if (optionalStop == null) { + if (optionalStop == null) return getSwimlaneIn(); - } + return thenBlock.getSwimlaneOut(); } @@ -163,8 +163,7 @@ public class FtileIfDown extends AbstractFtile { private XPoint2D getP1(StringBounder stringBounder) { final FtileGeometry dimDiamond1 = getFtile1().calculateDimension(stringBounder); - final XPoint2D p = new XPoint2D(dimDiamond1.getWidth(), - (dimDiamond1.getInY() + dimDiamond1.getOutY()) / 2); + final XPoint2D p = new XPoint2D(dimDiamond1.getWidth(), (dimDiamond1.getInY() + dimDiamond1.getOutY()) / 2); return getTranslateDiamond1(stringBounder).getTranslated(p); } @@ -244,8 +243,7 @@ public class FtileIfDown extends AbstractFtile { final FtileGeometry dimDiamond2 = getFtile2().calculateDimension(stringBounder); final double x = dimDiamond2.getWidth(); final double half = (dimDiamond2.getOutY() - dimDiamond2.getInY()) / 2; - return getTranslateDiamond2(stringBounder) - .getTranslated(new XPoint2D(x, dimDiamond2.getInY() + half)); + return getTranslateDiamond2(stringBounder).getTranslated(new XPoint2D(x, dimDiamond2.getInY() + half)); } public void drawU(UGraphic ug) { @@ -258,11 +256,10 @@ public class FtileIfDown extends AbstractFtile { final Snake snake = Snake.create(skinParam(), arrowColor, Arrows.asToDown()); snake.addPoint(getP1(stringBounder)); - if (conditionEndStyle == ConditionEndStyle.DIAMOND) { + if (conditionEndStyle == ConditionEndStyle.DIAMOND) snake.addPoint(getP2(stringBounder)); - } else if (conditionEndStyle == ConditionEndStyle.HLINE) { + else if (conditionEndStyle == ConditionEndStyle.HLINE) snake.addPoint(getP2hline(stringBounder)); - } ug.draw(snake); } @@ -270,9 +267,8 @@ public class FtileIfDown extends AbstractFtile { @Override public void drawTranslate(UGraphic ug, UTranslate translate1, UTranslate translate2) { - if (getFtile1().calculateDimension(ug.getStringBounder()).hasPointOut() == false) { + if (getFtile1().calculateDimension(ug.getStringBounder()).hasPointOut() == false) return; - } final StringBounder stringBounder = ug.getStringBounder(); final XPoint2D p1 = getP1(stringBounder); @@ -301,25 +297,23 @@ public class FtileIfDown extends AbstractFtile { final FtileGeometry dimDiamond1 = diamond1.calculateDimension(stringBounder); final double x = dimDiamond1.getWidth(); final double half = (dimDiamond1.getOutY() - dimDiamond1.getInY()) / 2; - return getTranslateDiamond1(stringBounder) - .getTranslated(new XPoint2D(x, dimDiamond1.getInY() + half)); + return getTranslateDiamond1(stringBounder).getTranslated(new XPoint2D(x, dimDiamond1.getInY() + half)); } protected XPoint2D getP2(final StringBounder stringBounder) { final FtileGeometry dimDiamond2 = diamond2.calculateDimension(stringBounder); final double x = dimDiamond2.getWidth(); final double half = (dimDiamond2.getOutY() - dimDiamond2.getInY()) / 2; - return getTranslateDiamond2(stringBounder) - .getTranslated(new XPoint2D(x, dimDiamond2.getInY() + half)); + return getTranslateDiamond2(stringBounder).getTranslated(new XPoint2D(x, dimDiamond2.getInY() + half)); } public void drawU(UGraphic ug) { final StringBounder stringBounder = ug.getStringBounder(); final XPoint2D p1 = getP1(stringBounder); - if (calculateDimension(stringBounder).hasPointOut() == false) { + if (calculateDimension(stringBounder).hasPointOut() == false) return; - } + final XPoint2D p2 = getP2(stringBounder); final double x1 = p1.getX(); @@ -331,7 +325,8 @@ public class FtileIfDown extends AbstractFtile { final double xmax = Math.max(x1 + Hexagon.hexagonHalfSize, getTranslateForThen(stringBounder).getDx() + thenGeom.getWidth()); - final Snake snake = Snake.create(skinParam(), endInlinkColor, Arrows.asToLeft()).emphasizeDirection(Direction.DOWN); + final Snake snake = Snake.create(skinParam(), endInlinkColor, Arrows.asToLeft()) + .emphasizeDirection(Direction.DOWN); snake.addPoint(x1, y1); snake.addPoint(xmax, y1); snake.addPoint(xmax, y2); @@ -420,16 +415,14 @@ public class FtileIfDown extends AbstractFtile { final FtileGeometry dimDiamond1 = diamond1.calculateDimension(stringBounder); final double x = dimDiamond1.getWidth(); final double half = (dimDiamond1.getOutY() - dimDiamond1.getInY()) / 2; - return getTranslateDiamond1(stringBounder) - .getTranslated(new XPoint2D(x, dimDiamond1.getInY() + half)); + return getTranslateDiamond1(stringBounder).getTranslated(new XPoint2D(x, dimDiamond1.getInY() + half)); } protected XPoint2D getP2(final StringBounder stringBounder) { final FtileGeometry dimDiamond2 = diamond2.calculateDimension(stringBounder); final double x = dimDiamond2.getWidth(); final double half = (dimDiamond2.getOutY() - dimDiamond2.getInY()) / 2; - return getTranslateDiamond2(stringBounder) - .getTranslated(new XPoint2D(x, dimDiamond2.getInY() + half)); + return getTranslateDiamond2(stringBounder).getTranslated(new XPoint2D(x, dimDiamond2.getInY() + half)); } // the bottom or south point of the diamond that we omitted @@ -477,11 +470,11 @@ public class FtileIfDown extends AbstractFtile { final StringBounder stringBounder = ug.getStringBounder(); ug.apply(getTranslateForThen(stringBounder)).draw(thenBlock); ug.apply(getTranslateDiamond1(stringBounder)).draw(diamond1); - if (optionalStop == null) { + if (optionalStop == null) ug.apply(getTranslateDiamond2(stringBounder)).draw(diamond2); - } else { + else ug.apply(getTranslateOptionalStop(stringBounder)).draw(optionalStop); - } + } @Override @@ -493,13 +486,13 @@ public class FtileIfDown extends AbstractFtile { final double height = geo.getHeight() + 3 * Hexagon.hexagonHalfSize + Math.max(Hexagon.hexagonHalfSize * 1, getSouthLabelHeight(stringBounder)); double width = geo.getWidth() + Hexagon.hexagonHalfSize; - if (optionalStop != null) { + if (optionalStop != null) width += optionalStop.calculateDimension(stringBounder).getWidth() + getAdditionalWidth(stringBounder); - } + final FtileGeometry result = new FtileGeometry(width, height, geo.getLeft(), geoDiamond1.getInY(), height); - if (geoThen.hasPointOut() == false && optionalStop != null) { + if (geoThen.hasPointOut() == false && optionalStop != null) return result.withoutPointOut(); - } + return result; } @@ -512,39 +505,39 @@ public class FtileIfDown extends AbstractFtile { } private double getSouthLabelHeight(StringBounder stringBounder) { - if (diamond1 instanceof FtileDiamondInside) { + if (diamond1 instanceof FtileDiamondInside) return ((FtileDiamondInside) diamond1).getSouthLabelHeight(stringBounder); - } - if (diamond1 instanceof FtileDiamond) { + + if (diamond1 instanceof FtileDiamond) return ((FtileDiamond) diamond1).getSouthLabelHeight(stringBounder); - } + return 0; } private double getEastLabelWidth(StringBounder stringBounder) { - if (diamond1 instanceof FtileDiamondInside) { + if (diamond1 instanceof FtileDiamondInside) return ((FtileDiamondInside) diamond1).getEastLabelWidth(stringBounder); - } - if (diamond1 instanceof FtileDiamond) { + + if (diamond1 instanceof FtileDiamond) return ((FtileDiamond) diamond1).getEastLabelWidth(stringBounder); - } + return 0; } @Override public UTranslate getTranslateFor(Ftile child, StringBounder stringBounder) { - if (child == thenBlock) { + if (child == thenBlock) return getTranslateForThen(stringBounder); - } - if (child == diamond1) { + + if (child == diamond1) return getTranslateDiamond1(stringBounder); - } - if (child == optionalStop) { + + if (child == optionalStop) return getTranslateOptionalStop(stringBounder); - } - if (child == diamond2) { + + if (child == diamond2) return getTranslateDiamond2(stringBounder); - } + throw new UnsupportedOperationException(); } diff --git a/src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/cond/ConditionalBuilder.java b/src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/cond/ConditionalBuilder.java index a76b6203b..05e825c73 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/cond/ConditionalBuilder.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/cond/ConditionalBuilder.java @@ -145,18 +145,18 @@ public class ConditionalBuilder { final ConditionalBuilder builder = new ConditionalBuilder(swimlane, borderColor, backColor, arrowColor, ftileFactory, conditionStyle, conditionEndStyle, branch1, branch2, skinParam, stringBounder, fcArrow, fcTest, url); - if (isEmptyOrOnlySingleStopOrSpot(branch2) && isEmptyOrOnlySingleStopOrSpot(branch1) == false) { + if (isEmptyOrOnlySingleStopOrSpot(branch2) && isEmptyOrOnlySingleStopOrSpot(branch1) == false) return builder.createDown(builder.branch1, builder.branch2); - } - if (branch1.isEmpty() && branch2.isOnlySingleStopOrSpot()) { + + if (branch1.isEmpty() && branch2.isOnlySingleStopOrSpot()) return builder.createDown(builder.branch1, builder.branch2); - } - if (isEmptyOrOnlySingleStopOrSpot(branch1) && isEmptyOrOnlySingleStopOrSpot(branch2) == false) { + + if (isEmptyOrOnlySingleStopOrSpot(branch1) && isEmptyOrOnlySingleStopOrSpot(branch2) == false) return builder.createDown(builder.branch2, builder.branch1); - } - if (branch2.isEmpty() && branch1.isOnlySingleStopOrSpot()) { + + if (branch2.isEmpty() && branch1.isOnlySingleStopOrSpot()) return builder.createDown(builder.branch2, builder.branch1); - } + return builder.createWithLinks(); // return builder.createWithDiamonds(); // return builder.createNude(); @@ -173,18 +173,18 @@ public class ConditionalBuilder { final TextBlock tb2 = getLabelPositive(branch2); final Ftile diamond1 = getShape1(false, tb1, tb2); final Ftile diamond2 = getShape2(branch1, branch2, true); - if (branch2.isOnlySingleStopOrSpot()) { + if (branch2.isOnlySingleStopOrSpot()) return FtileIfDown.create(diamond1, diamond2, swimlane, FtileUtils.addHorizontalMargin(tile1, 10), arrowColor, conditionEndStyle, ftileFactory, branch2.getFtile(), branch2.getOut()); - } - if (branch1.isOnlySingleStopOrSpot()) { + + if (branch1.isOnlySingleStopOrSpot()) return FtileIfDown.create(diamond1, diamond2, swimlane, FtileUtils.addHorizontalMargin(tile2, 10), arrowColor, conditionEndStyle, ftileFactory, branch1.getFtile(), branch1.getOut()); - } - if (branch1.isEmpty()) { + + if (branch1.isEmpty()) return FtileIfDown.create(diamond1, diamond2, swimlane, FtileUtils.addHorizontalMargin(tile2, 10), arrowColor, conditionEndStyle, ftileFactory, null, null); - } + return FtileIfDown.create(diamond1, diamond2, swimlane, FtileUtils.addHorizontalMargin(tile1, 10), arrowColor, conditionEndStyle, ftileFactory, null, branch2.getOut()); } @@ -211,9 +211,9 @@ public class ConditionalBuilder { private Ftile createWithLinks() { Ftile diamond1 = getDiamond1(true); - if (url != null) { + if (url != null) diamond1 = new FtileWithUrl(diamond1, url); - } + final Ftile diamond2 = getShape2(branch1, branch2, false); final Ftile tmp1 = FtileUtils.addHorizontalMargin(tile1, 10); final Ftile tmp2 = FtileUtils.addHorizontalMargin(tile2, 10); @@ -247,29 +247,28 @@ public class ConditionalBuilder { final Ftile shape1; if (conditionStyle == ConditionStyle.INSIDE_HEXAGON) { - if (eastWest) { + if (eastWest) shape1 = new FtileDiamondInside(tbTest, tile1.skinParam(), backColor, borderColor, swimlane) .withWestAndEast(tb1, tb2); - } else { + else shape1 = new FtileDiamondInside(tbTest, tile1.skinParam(), backColor, borderColor, swimlane) .withSouth(tb1).withEast(tb2); - } + } else if (conditionStyle == ConditionStyle.EMPTY_DIAMOND) { - if (eastWest) { + if (eastWest) shape1 = new FtileDiamond(tile1.skinParam(), backColor, borderColor, swimlane).withNorth(tbTest) .withWestAndEast(tb1, tb2); - } else { + else shape1 = new FtileDiamond(tile1.skinParam(), backColor, borderColor, swimlane).withNorth(tbTest) .withSouth(tb1).withEast(tb2); - } + } else if (conditionStyle == ConditionStyle.INSIDE_DIAMOND) { - if (eastWest) { + if (eastWest) shape1 = new FtileDiamondSquare(tbTest, tile1.skinParam(), backColor, borderColor, swimlane) .withWestAndEast(tb1, tb2); - } else { + else shape1 = new FtileDiamondSquare(tbTest, tile1.skinParam(), backColor, borderColor, swimlane) .withSouth(tb1).withEast(tb2); - } } else { throw new IllegalStateException(); } @@ -283,9 +282,9 @@ public class ConditionalBuilder { private Ftile getShape2(Branch branch1, Branch branch2, boolean useNorth) { final Ftile shape2; - if (conditionEndStyle == ConditionEndStyle.HLINE) { + if (conditionEndStyle == ConditionEndStyle.HLINE) return new FtileEmpty(tile1.skinParam(), 0, Hexagon.hexagonHalfSize, swimlane); - } + // else use default ConditionEndStyle.DIAMOND if (hasTwoBranches()) { final Display out1 = branch1.getFtile().getOutLinkRendering().getDisplay(); diff --git a/src/net/sourceforge/plantuml/classdiagram/command/CommandCreateClass.java b/src/net/sourceforge/plantuml/classdiagram/command/CommandCreateClass.java index cb6908833..e52cffc37 100644 --- a/src/net/sourceforge/plantuml/classdiagram/command/CommandCreateClass.java +++ b/src/net/sourceforge/plantuml/classdiagram/command/CommandCreateClass.java @@ -100,9 +100,11 @@ public class CommandCreateClass extends SingleLineCommand2 { new RegexOptional(new RegexConcat(RegexLeaf.spaceZeroOrMore(), new RegexLeaf("GENERIC", "\\<(" + GenericRegexProducer.PATTERN + ")\\>"))), // RegexLeaf.spaceZeroOrMore(), // + new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), // + RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("STEREO", "(\\<{2}.*\\>{2})?"), // RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("TAGS", Stereotag.pattern() + "?"), // + new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), // RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("URL", "(" + UrlBuilder.getRegexp() + ")?"), // RegexLeaf.spaceZeroOrMore(), // @@ -189,7 +191,7 @@ public class CommandCreateClass extends SingleLineCommand2 { CommandCreateClassMultilines.manageExtends("EXTENDS", diagram, arg, entity); CommandCreateClassMultilines.manageExtends("IMPLEMENTS", diagram, arg, entity); - CommandCreateClassMultilines.addTags(entity, arg.get("TAGS", 0)); + CommandCreateClassMultilines.addTags(entity, arg.getLazzy("TAGS", 0)); if (typeString.contains("STATIC")) entity.setStatic(true); diff --git a/src/net/sourceforge/plantuml/classdiagram/command/CommandCreateClassMultilines.java b/src/net/sourceforge/plantuml/classdiagram/command/CommandCreateClassMultilines.java index 0bd8c2407..d2ffdb75c 100644 --- a/src/net/sourceforge/plantuml/classdiagram/command/CommandCreateClassMultilines.java +++ b/src/net/sourceforge/plantuml/classdiagram/command/CommandCreateClassMultilines.java @@ -115,9 +115,11 @@ public class CommandCreateClassMultilines extends CommandMultilines2"))), // RegexLeaf.spaceZeroOrMore(), // + new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), // + RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("STEREO", "(\\<\\<.+\\>\\>)?"), // RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("TAGS", Stereotag.pattern() + "?"), // + new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), // RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("URL", "(" + UrlBuilder.getRegexp() + ")?"), // RegexLeaf.spaceZeroOrMore(), // @@ -180,7 +182,7 @@ public class CommandCreateClassMultilines extends CommandMultilines2 RegexLeaf.spaceOneOrMore(), // new RegexLeaf("CODE2", CommandCreateElementFull.CODE)) // ), // - new RegexOptional( // - new RegexConcat( // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREOTYPE", "(\\<\\<.+\\>\\>)")// - )), // RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("TAGS", Stereotag.pattern() + "?"), // + new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), // + RegexLeaf.spaceZeroOrMore(), // + new RegexLeaf("STEREOTYPE", "(\\<\\<.+\\>\\>)?"), // + RegexLeaf.spaceZeroOrMore(), // + new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), // RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("URL", "(" + UrlBuilder.getRegexp() + ")?"), // RegexLeaf.spaceZeroOrMore(), // @@ -130,13 +129,12 @@ public class CommandCreateElementFull2 extends SingleLineCommand2 RegexLeaf.spaceOneOrMore(), // new RegexLeaf("CODE2", CommandCreateElementFull.CODE)) // ), // - new RegexOptional( // - new RegexConcat( // - RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("STEREOTYPE", "(\\<\\<.+\\>\\>)")// - )), // RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("TAGS", Stereotag.pattern() + "?"), // + new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), // + RegexLeaf.spaceZeroOrMore(), // + new RegexLeaf("STEREOTYPE", "(\\<\\<.+\\>\\>)?"), // + RegexLeaf.spaceZeroOrMore(), // + new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), // RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("URL", "(" + UrlBuilder.getRegexp() + ")?"), // RegexLeaf.spaceZeroOrMore(), // @@ -224,7 +222,7 @@ public class CommandCreateElementFull2 extends SingleLineCommand2 diagram.getSkinParam().getFont(null, false, FontParam.CIRCLED_CHARACTER), diagram.getSkinParam().getIHtmlColorSet())); - CommandCreateClassMultilines.addTags(entity, arg.get("TAGS", 0)); + CommandCreateClassMultilines.addTags(entity, arg.getLazzy("TAGS", 0)); final String urlString = arg.get("URL", 0); if (urlString != null) { @@ -234,8 +232,8 @@ public class CommandCreateElementFull2 extends SingleLineCommand2 } final String s = arg.get("COLOR", 0); - entity.setSpecificColorTOBEREMOVED(ColorType.BACK, s == null ? null - : diagram.getSkinParam().getIHtmlColorSet().getColor(s)); + entity.setSpecificColorTOBEREMOVED(ColorType.BACK, + s == null ? null : diagram.getSkinParam().getIHtmlColorSet().getColor(s)); return CommandExecutionResult.ok(); } diff --git a/src/net/sourceforge/plantuml/command/CommandPackage.java b/src/net/sourceforge/plantuml/command/CommandPackage.java index 44b701827..cc6fa6da6 100644 --- a/src/net/sourceforge/plantuml/command/CommandPackage.java +++ b/src/net/sourceforge/plantuml/command/CommandPackage.java @@ -82,9 +82,11 @@ public class CommandPackage extends SingleLineCommand2 { new RegexLeaf("AS", "([%pLN_.]+)") // )), // RegexLeaf.spaceZeroOrMore(), // + new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), // + RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("STEREOTYPE", "(\\<\\<.*\\>\\>)?"), // RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("TAGS", Stereotag.pattern() + "?"), // + new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), // RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("URL", "(" + UrlBuilder.getRegexp() + ")?"), // RegexLeaf.spaceZeroOrMore(), // @@ -146,7 +148,7 @@ public class CommandPackage extends SingleLineCommand2 { p.setUSymbol(usymbol); } } - CommandCreateClassMultilines.addTags(p, arg.get("TAGS", 0)); + CommandCreateClassMultilines.addTags(p, arg.getLazzy("TAGS", 0)); final String urlString = arg.get("URL", 0); if (urlString != null) { diff --git a/src/net/sourceforge/plantuml/command/note/CommandFactoryNoteOnEntity.java b/src/net/sourceforge/plantuml/command/note/CommandFactoryNoteOnEntity.java index 3a5623e06..636e42325 100644 --- a/src/net/sourceforge/plantuml/command/note/CommandFactoryNoteOnEntity.java +++ b/src/net/sourceforge/plantuml/command/note/CommandFactoryNoteOnEntity.java @@ -92,9 +92,11 @@ public final class CommandFactoryNoteOnEntity implements SingleMultiFactoryComma RegexLeaf.spaceOneOrMore(), partialPattern), // new RegexLeaf("")), // RegexLeaf.spaceZeroOrMore(), // + new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), // + RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("STEREO", "(\\<{2}.*\\>{2})?"), // RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("TAGS", Stereotag.pattern() + "?"), // + new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), // RegexLeaf.spaceZeroOrMore(), // color().getRegex(), // RegexLeaf.spaceZeroOrMore(), // @@ -125,9 +127,11 @@ public final class CommandFactoryNoteOnEntity implements SingleMultiFactoryComma partialPattern), // new RegexLeaf("")), // RegexLeaf.spaceZeroOrMore(), // + new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), // + RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("STEREO", "(\\<{2}.*\\>{2})?"), // RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("TAGS", Stereotag.pattern() + "?"), // + new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), // RegexLeaf.spaceZeroOrMore(), // color().getRegex(), // RegexLeaf.spaceZeroOrMore(), // @@ -149,9 +153,11 @@ public final class CommandFactoryNoteOnEntity implements SingleMultiFactoryComma partialPattern), // new RegexLeaf("")), // RegexLeaf.spaceZeroOrMore(), // + new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), // + RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("STEREO", "(\\<{2}.*\\>{2})?"), // RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("TAGS", Stereotag.pattern() + "?"), // + new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), // RegexLeaf.spaceZeroOrMore(), // color().getRegex(), // RegexLeaf.spaceZeroOrMore(), // @@ -260,7 +266,7 @@ public final class CommandFactoryNoteOnEntity implements SingleMultiFactoryComma if (url != null) note.addUrl(url); - CommandCreateClassMultilines.addTags(note, line0.get("TAGS", 0)); + CommandCreateClassMultilines.addTags(note, line0.getLazzy("TAGS", 0)); final Link link; diff --git a/src/net/sourceforge/plantuml/cucadiagram/dot/GraphvizVersionFinder.java b/src/net/sourceforge/plantuml/cucadiagram/dot/GraphvizVersionFinder.java index fccf9982d..c3dfde9b8 100644 --- a/src/net/sourceforge/plantuml/cucadiagram/dot/GraphvizVersionFinder.java +++ b/src/net/sourceforge/plantuml/cucadiagram/dot/GraphvizVersionFinder.java @@ -75,9 +75,9 @@ public class GraphvizVersionFinder { final Pattern p = Pattern.compile("(\\d)\\.(\\d\\d?)"); final Matcher m = p.matcher(dotVersion); final boolean find = m.find(); - if (find == false) { + if (find == false) return DEFAULT; - } + final int major = Integer.parseInt(m.group(1)); final int minor = Integer.parseInt(m.group(2)); final int v = 100 * major + minor; @@ -117,17 +117,17 @@ public class GraphvizVersionFinder { final ProcessRunner p = new ProcessRunner(cmd); final ProcessState state = p.run(null, null); - if (state.differs(ProcessState.TERMINATED_OK())) { + if (state.differs(ProcessState.TERMINATED_OK())) return "?"; - } + final StringBuilder sb = new StringBuilder(); - if (StringUtils.isNotEmpty(p.getOut())) { + if (StringUtils.isNotEmpty(p.getOut())) sb.append(p.getOut()); - } + if (StringUtils.isNotEmpty(p.getError())) { - if (sb.length() > 0) { + if (sb.length() > 0) sb.append(' '); - } + sb.append(p.getError()); } return StringUtils.trin(sb.toString().replace('\n', ' ')); diff --git a/src/net/sourceforge/plantuml/cucadiagram/entity/EntityFactory.java b/src/net/sourceforge/plantuml/cucadiagram/entity/EntityFactory.java index 1e81fc8c4..962cce1cc 100644 --- a/src/net/sourceforge/plantuml/cucadiagram/entity/EntityFactory.java +++ b/src/net/sourceforge/plantuml/cucadiagram/entity/EntityFactory.java @@ -65,6 +65,7 @@ import net.sourceforge.plantuml.cucadiagram.ILeaf; import net.sourceforge.plantuml.cucadiagram.Ident; import net.sourceforge.plantuml.cucadiagram.LeafType; import net.sourceforge.plantuml.cucadiagram.Link; +import net.sourceforge.plantuml.cucadiagram.Stereotag; import net.sourceforge.plantuml.cucadiagram.SuperGroup; import net.sourceforge.plantuml.graphic.USymbol; import net.sourceforge.plantuml.skin.VisibilityModifier; @@ -124,6 +125,8 @@ public final class EntityFactory { folder.setColors(g.getColors()); if (g.getUrl99() != null) folder.addUrl(g.getUrl99()); + for (Stereotag tag : g.stereotags()) + folder.addStereotag(tag); // if (UseStyle.useBetaStyle()) { // // System.err.println("Backcolor ?"); @@ -193,6 +196,10 @@ public final class EntityFactory { } public boolean isHidden(ILeaf leaf) { + final IEntity other = isNoteWithSingleLinkAttachedTo(leaf); + if (other instanceof ILeaf) + return isHidden((ILeaf) other); + boolean hidden = false; for (HideOrShow2 hide : hides2) hidden = hide.apply(hidden, leaf); @@ -201,6 +208,10 @@ public final class EntityFactory { } public boolean isRemoved(ILeaf leaf) { + final IEntity other = isNoteWithSingleLinkAttachedTo(leaf); + if (other instanceof ILeaf) + return isRemoved((ILeaf) other); + boolean result = false; for (HideOrShow2 hide : removed) result = hide.apply(result, leaf); @@ -208,6 +219,23 @@ public final class EntityFactory { return result; } + private IEntity isNoteWithSingleLinkAttachedTo(ILeaf leaf) { + if (leaf.getLeafType() != LeafType.NOTE) + return null; + IEntity result = null; + for (Link link : this.getLinks()) { + if (link.getType().isInvisible()) + continue; + if (link.contains(leaf)) { + if (result != null) + return result; + result = link.getOther(leaf); + } + } + return result; + + } + public boolean isRemovedIgnoreUnlinked(ILeaf leaf) { boolean result = false; for (HideOrShow2 hide : removed) @@ -217,12 +245,6 @@ public final class EntityFactory { return result; } - public void thisIsGoingToBeALeaf(Ident ident) { - } - - public void thisIsNotArealGroup(Ident ident) { - } - public ILeaf createLeaf(Ident ident, Code code, Display display, LeafType entityType, IGroup parentContainer, Set hides, String namespaceSeparator) { final Bodier bodier; diff --git a/src/net/sourceforge/plantuml/descdiagram/command/CommandCreateElementFull.java b/src/net/sourceforge/plantuml/descdiagram/command/CommandCreateElementFull.java index a4f7bf733..87d58ccc9 100644 --- a/src/net/sourceforge/plantuml/descdiagram/command/CommandCreateElementFull.java +++ b/src/net/sourceforge/plantuml/descdiagram/command/CommandCreateElementFull.java @@ -119,13 +119,12 @@ public class CommandCreateElementFull extends SingleLineCommand2\\>)") // - )), // RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("TAGS", Stereotag.pattern() + "?"), // + new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), // + RegexLeaf.spaceZeroOrMore(), // + new RegexLeaf("STEREOTYPE", "(\\<\\<.+\\>\\>)?"), // + RegexLeaf.spaceZeroOrMore(), // + new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), // RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("URL", "(" + UrlBuilder.getRegexp() + ")?"), // RegexLeaf.spaceZeroOrMore(), // @@ -258,7 +257,7 @@ public class CommandCreateElementFull extends SingleLineCommand2\\>)?"), // RegexLeaf.spaceZeroOrMore(), // - new RegexLeaf("TAGS", Stereotag.pattern() + "?"), // + new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), // RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("URL", "(" + UrlBuilder.getRegexp() + ")?"), // RegexLeaf.spaceZeroOrMore(), // @@ -144,11 +146,11 @@ public class CommandPackageWithUSymbol extends SingleLineCommand2 )), // new RegexLeaf("CODE2", "([%pLN_.]+)"))), // RegexLeaf.spaceZeroOrMore(), // + new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), // + RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("STEREOTYPE", "(\\<\\<.*\\>\\>)?"), // RegexLeaf.spaceZeroOrMore(), // + new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), // + RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("URL", "(" + UrlBuilder.getRegexp() + ")?"), // RegexLeaf.spaceZeroOrMore(), // color().getRegex(), // @@ -135,8 +141,7 @@ public class CommandCreatePackageState extends SingleLineCommand2 Colors colors = color().getColor(arg, diagram.getSkinParam().getIHtmlColorSet()); final String s = arg.get("LINECOLOR", 1); - final HColor lineColor = s == null ? null - : diagram.getSkinParam().getIHtmlColorSet().getColor(s); + final HColor lineColor = s == null ? null : diagram.getSkinParam().getIHtmlColorSet().getColor(s); if (lineColor != null) colors = colors.add(ColorType.LINE, lineColor); @@ -144,6 +149,9 @@ public class CommandCreatePackageState extends SingleLineCommand2 colors = colors.addLegacyStroke(arg.get("LINECOLOR", 0)); p.setColors(colors); + + CommandCreateClassMultilines.addTags(p, arg.getLazzy("TAGS", 0)); + return CommandExecutionResult.ok(); } diff --git a/src/net/sourceforge/plantuml/statediagram/command/CommandCreateState.java b/src/net/sourceforge/plantuml/statediagram/command/CommandCreateState.java index 444e5f59b..2f5c8b112 100644 --- a/src/net/sourceforge/plantuml/statediagram/command/CommandCreateState.java +++ b/src/net/sourceforge/plantuml/statediagram/command/CommandCreateState.java @@ -39,6 +39,7 @@ import net.sourceforge.plantuml.LineLocation; import net.sourceforge.plantuml.Url; import net.sourceforge.plantuml.UrlBuilder; import net.sourceforge.plantuml.UrlMode; +import net.sourceforge.plantuml.classdiagram.command.CommandCreateClassMultilines; import net.sourceforge.plantuml.command.CommandExecutionResult; import net.sourceforge.plantuml.command.SingleLineCommand2; import net.sourceforge.plantuml.command.regex.IRegex; @@ -52,6 +53,7 @@ import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.IEntity; import net.sourceforge.plantuml.cucadiagram.Ident; import net.sourceforge.plantuml.cucadiagram.LeafType; +import net.sourceforge.plantuml.cucadiagram.Stereotag; import net.sourceforge.plantuml.cucadiagram.Stereotype; import net.sourceforge.plantuml.graphic.color.ColorParser; import net.sourceforge.plantuml.graphic.color.ColorType; @@ -83,8 +85,12 @@ public class CommandCreateState extends SingleLineCommand2 { new RegexLeaf("CODE3", "([%pLN_.]+)"), // new RegexLeaf("CODE4", "[%g]([^%g]+)[%g]")), // RegexLeaf.spaceZeroOrMore(), // + new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), // + RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("STEREOTYPE", "(\\<\\<.*\\>\\>)?"), // RegexLeaf.spaceZeroOrMore(), // + new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), // + RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("URL", "(" + UrlBuilder.getRegexp() + ")?"), // RegexLeaf.spaceZeroOrMore(), // color().getRegex(), // @@ -110,21 +116,21 @@ public class CommandCreateState extends SingleLineCommand2 { final Ident ident = diagram.buildLeafIdent(idShort); final Code code = diagram.V1972() ? ident : diagram.buildCode(idShort); String display = arg.getLazzy("DISPLAY", 0); - if (display == null) { + if (display == null) display = code.getName(); - } + final String stereotype = arg.get("STEREOTYPE", 0); final LeafType type = getTypeFromStereotype(stereotype); - if (diagram.checkConcurrentStateOk(ident, code) == false) { + if (diagram.checkConcurrentStateOk(ident, code) == false) return CommandExecutionResult.error("The state " + code.getName() + " has been created in a concurrent state : it cannot be used here."); - } + final IEntity ent = diagram.getOrCreateLeaf(diagram.buildLeafIdent(idShort), code, type, null); ent.setDisplay(Display.getWithNewlines(display)); - if (stereotype != null) { + if (stereotype != null) ent.setStereotype(Stereotype.build(stereotype)); - } + final String urlString = arg.get("URL", 0); if (urlString != null) { final UrlBuilder urlBuilder = new UrlBuilder(diagram.getSkinParam().getValue("topurl"), UrlMode.STRICT); @@ -137,12 +143,12 @@ public class CommandCreateState extends SingleLineCommand2 { final HColor lineColor = s == null ? null : diagram.getSkinParam().getIHtmlColorSet().getColor(s); - if (lineColor != null) { + if (lineColor != null) colors = colors.add(ColorType.LINE, lineColor); - } - if (arg.get("LINECOLOR", 0) != null) { + + if (arg.get("LINECOLOR", 0) != null) colors = colors.addLegacyStroke(arg.get("LINECOLOR", 0)); - } + ent.setColors(colors); // ent.setSpecificColorTOBEREMOVED(ColorType.BACK, @@ -154,28 +160,36 @@ public class CommandCreateState extends SingleLineCommand2 { // ent.applyStroke(arg.get("LINECOLOR", 0)); final String addFields = arg.get("ADDFIELD", 0); - if (addFields != null) { + if (addFields != null) ent.getBodier().addFieldOrMethod(addFields); - } + + CommandCreateClassMultilines.addTags(ent, arg.getLazzy("TAGS", 0)); + return CommandExecutionResult.ok(); } private LeafType getTypeFromStereotype(String stereotype) { - if ("<>".equalsIgnoreCase(stereotype)) { + if ("<>".equalsIgnoreCase(stereotype)) return LeafType.STATE_CHOICE; - } - if ("<>".equalsIgnoreCase(stereotype)) { + + if ("<>".equalsIgnoreCase(stereotype)) return LeafType.STATE_FORK_JOIN; - } - if ("<>".equalsIgnoreCase(stereotype)) { + + if ("<>".equalsIgnoreCase(stereotype)) return LeafType.STATE_FORK_JOIN; - } - if ("<>".equalsIgnoreCase(stereotype)) { + + if ("<>".equalsIgnoreCase(stereotype)) return LeafType.CIRCLE_START; - } - if ("<>".equalsIgnoreCase(stereotype)) { + + if ("<>".equalsIgnoreCase(stereotype)) return LeafType.CIRCLE_END; - } + + if ("<>".equalsIgnoreCase(stereotype)) + return LeafType.PSEUDO_STATE; + + if ("<>".equalsIgnoreCase(stereotype)) + return LeafType.DEEP_HISTORY; + return null; } diff --git a/src/net/sourceforge/plantuml/svek/GeneralImageBuilder.java b/src/net/sourceforge/plantuml/svek/GeneralImageBuilder.java index bf3b68f60..818110bf7 100644 --- a/src/net/sourceforge/plantuml/svek/GeneralImageBuilder.java +++ b/src/net/sourceforge/plantuml/svek/GeneralImageBuilder.java @@ -586,7 +586,6 @@ public final class GeneralImageBuilder { if (dotData.isEmpty(g) && g.getGroupType() == GroupType.PACKAGE) { final ISkinParam skinParam = dotData.getSkinParam(); - entityFactory.thisIsGoingToBeALeaf(g.getIdent()); final ILeaf folder = entityFactory.createLeafForEmptyGroup(g, skinParam); printEntity(dotStringFactory, folder); } else { diff --git a/src/net/sourceforge/plantuml/svek/SvekLine.java b/src/net/sourceforge/plantuml/svek/SvekLine.java index 75835fa0f..6e8e36eff 100644 --- a/src/net/sourceforge/plantuml/svek/SvekLine.java +++ b/src/net/sourceforge/plantuml/svek/SvekLine.java @@ -77,6 +77,7 @@ import net.sourceforge.plantuml.cucadiagram.entity.EntityImpl; import net.sourceforge.plantuml.descdiagram.command.StringWithArrow; import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.HorizontalAlignment; +import net.sourceforge.plantuml.graphic.Rainbow; import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.TextBlock; import net.sourceforge.plantuml.graphic.TextBlockUtils; @@ -94,6 +95,7 @@ import net.sourceforge.plantuml.skin.VisibilityModifier; import net.sourceforge.plantuml.skin.rose.Rose; import net.sourceforge.plantuml.style.StyleBuilder; import net.sourceforge.plantuml.svek.extremity.Extremity; +import net.sourceforge.plantuml.svek.extremity.ExtremityArrow; import net.sourceforge.plantuml.svek.extremity.ExtremityFactory; import net.sourceforge.plantuml.svek.extremity.ExtremityFactoryExtends; import net.sourceforge.plantuml.svek.extremity.ExtremityOther; @@ -642,7 +644,7 @@ public class SvekLine implements Moveable, Hideable, GuideLine { } - public void drawU(UGraphic ug, UStroke suggestedStroke, HColor color, Set ids) { + public void drawU(UGraphic ug, Set ids, UStroke suggestedStroke, Rainbow rainbow) { if (opale) return; @@ -677,12 +679,19 @@ public class SvekLine implements Moveable, Hideable, GuideLine { x += dx; y += dy; + HColor arrowHeadColor = rainbow.getArrowHeadColor(); + HColor color = rainbow.getColor(); + if (this.link.getColors() != null) { final HColor newColor = this.link.getColors().getColor(ColorType.ARROW, ColorType.LINE); - if (newColor != null) + if (newColor != null) { color = newColor; - } else if (this.link.getSpecificColor() != null) + arrowHeadColor = color; + } + } else if (this.link.getSpecificColor() != null) { color = this.link.getSpecificColor(); + arrowHeadColor = color; + } ug = ug.apply(HColors.none().bg()).apply(color); final LinkType linkType = link.getType(); @@ -727,7 +736,8 @@ public class SvekLine implements Moveable, Hideable, GuideLine { final String tmp = uniq(ids, comment); todraw.setCommentAndCodeLine(tmp, link.getCodeLine()); - drawRainbow(ug.apply(new UTranslate(x, y)), color, todraw, link.getSupplementaryColors(), stroke); + drawRainbow(ug.apply(new UTranslate(x, y)), color, arrowHeadColor, todraw, link.getSupplementaryColors(), + stroke); ug = ug.apply(new UStroke()).apply(color); @@ -820,31 +830,39 @@ public class SvekLine implements Moveable, Hideable, GuideLine { } } - private void drawRainbow(UGraphic ug, HColor color, DotPath todraw, List supplementaryColors, - UStroke stroke) { + private void drawRainbow(UGraphic ug, HColor color, HColor headColor, DotPath todraw, + List supplementaryColors, UStroke stroke) { ug.draw(todraw); final LinkType linkType = link.getType(); - if (this.extremity2 != null) { - UGraphic ug2 = ug.apply(color).apply(stroke.onlyThickness()); - if (linkType.getDecor1().isFill()) - ug2 = ug2.apply(color.bg()); - else - ug2 = ug2.apply(HColors.none().bg()); - - // System.err.println("Line::draw EXTREMITY1"); - this.extremity2.drawU(ug2); - } - if (this.extremity1 != null) { - UGraphic ug2 = ug.apply(color).apply(stroke.onlyThickness()); + if (headColor.isTransparent()) { + if (this.extremity1 instanceof ExtremityArrow) { + final UGraphic ugHead = ug.apply(color).apply(stroke.onlyThickness()); + ((ExtremityArrow) this.extremity1).drawLineIfTransparent(ugHead); + } + } else if (this.extremity1 != null) { + UGraphic ugHead = ug.apply(headColor).apply(stroke.onlyThickness()); if (linkType.getDecor2().isFill()) - ug2 = ug2.apply(color.bg()); + ugHead = ugHead.apply(color.bg()); else - ug2 = ug2.apply(HColors.none().bg()); - - // System.err.println("Line::draw EXTREMITY2"); - this.extremity1.drawU(ug2); + ugHead = ugHead.apply(HColors.none().bg()); + this.extremity1.drawU(ugHead); } + + if (headColor.isTransparent()) { + if (this.extremity2 instanceof ExtremityArrow) { + final UGraphic ugHead = ug.apply(color).apply(stroke.onlyThickness()); + ((ExtremityArrow) this.extremity2).drawLineIfTransparent(ugHead); + } + } else if (this.extremity2 != null) { + UGraphic ugHead = ug.apply(headColor).apply(stroke.onlyThickness()); + if (linkType.getDecor1().isFill()) + ugHead = ugHead.apply(color.bg()); + else + ugHead = ugHead.apply(HColors.none().bg()); + this.extremity2.drawU(ugHead); + } + int i = 0; for (Colors colors : supplementaryColors) { ug.apply(new UTranslate(2 * (i + 1), 2 * (i + 1))).apply(colors.getColor(ColorType.LINE)).draw(todraw); diff --git a/src/net/sourceforge/plantuml/svek/SvekResult.java b/src/net/sourceforge/plantuml/svek/SvekResult.java index a14c44c60..a26d770c6 100644 --- a/src/net/sourceforge/plantuml/svek/SvekResult.java +++ b/src/net/sourceforge/plantuml/svek/SvekResult.java @@ -42,6 +42,7 @@ import net.sourceforge.plantuml.awt.geom.XDimension2D; import net.sourceforge.plantuml.cucadiagram.Stereotype; import net.sourceforge.plantuml.cucadiagram.dot.DotData; import net.sourceforge.plantuml.graphic.AbstractTextBlock; +import net.sourceforge.plantuml.graphic.Rainbow; import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.TextBlockUtils; import net.sourceforge.plantuml.style.PName; @@ -75,8 +76,8 @@ public final class SvekResult extends AbstractTextBlock implements IEntityImage final Style style2 = getDefaultStyleDefinition(null) .getMergedStyle(dotData.getSkinParam().getCurrentStyleBuilder()); - HColor color = style2.value(PName.LineColor).asColor(dotData.getSkinParam().getIHtmlColorSet()); - color = HColors.noGradient(color); + final HColor borderColor = HColors + .noGradient(style2.value(PName.LineColor).asColor(dotData.getSkinParam().getIHtmlColorSet())); for (SvekNode node : dotStringFactory.getBibliotekon().allNodes()) { final double minX = node.getMinX(); @@ -85,7 +86,7 @@ public final class SvekResult extends AbstractTextBlock implements IEntityImage final IEntityImage image = node.getImage(); image.drawU(ug2.apply(new UTranslate(minX, minY))); if (image instanceof Untranslated) - ((Untranslated) image).drawUntranslated(ug.apply(color), minX, minY); + ((Untranslated) image).drawUntranslated(ug.apply(borderColor), minX, minY); } @@ -98,10 +99,10 @@ public final class SvekResult extends AbstractTextBlock implements IEntityImage final StyleBuilder currentStyleBuilder = line.getCurrentStyleBuilder(); final Style styleLine = getDefaultStyleDefinition(line.getStereotype()).getMergedStyle(currentStyleBuilder); - color = styleLine.value(PName.LineColor).asColor(dotData.getSkinParam().getIHtmlColorSet()); - color = HColors.noGradient(color); - line.drawU(ug2, styleLine.getStroke(), color, ids); + final Rainbow rainbow = Rainbow.build(styleLine, dotData.getSkinParam().getIHtmlColorSet()); + + line.drawU(ug2, ids, styleLine.getStroke(), rainbow); } for (SvekNode node : dotStringFactory.getBibliotekon().allNodes()) diff --git a/src/net/sourceforge/plantuml/svek/extremity/ExtremityArrow.java b/src/net/sourceforge/plantuml/svek/extremity/ExtremityArrow.java index c2cfa362f..49f48f727 100644 --- a/src/net/sourceforge/plantuml/svek/extremity/ExtremityArrow.java +++ b/src/net/sourceforge/plantuml/svek/extremity/ExtremityArrow.java @@ -36,6 +36,7 @@ package net.sourceforge.plantuml.svek.extremity; import net.sourceforge.plantuml.awt.geom.XPoint2D; +import net.sourceforge.plantuml.graphic.UDrawable; import net.sourceforge.plantuml.ugraphic.UGraphic; import net.sourceforge.plantuml.ugraphic.ULine; import net.sourceforge.plantuml.ugraphic.UPolygon; @@ -43,7 +44,7 @@ import net.sourceforge.plantuml.ugraphic.UTranslate; import net.sourceforge.plantuml.ugraphic.color.HColor; import net.sourceforge.plantuml.ugraphic.color.HColors; -class ExtremityArrow extends Extremity { +public class ExtremityArrow extends Extremity { private UPolygon polygon = new UPolygon(); private final ULine line; @@ -87,15 +88,23 @@ class ExtremityArrow extends Extremity { public void drawU(UGraphic ug) { final HColor color = ug.getParam().getColor(); - if (color == null) { + if (color == null) ug = ug.apply(HColors.none().bg()); - } else { + else ug = ug.apply(color.bg()); - } + ug.draw(polygon); - if (line != null && line.getLength() > 2) { + if (line != null && line.getLength() > 2) ug.apply(new UTranslate(contact)).draw(line); - } + + } + + public void drawLineIfTransparent(UGraphic ug) { + final XPoint2D pt1 = polygon.getPoint(0); + final XPoint2D pt2 = polygon.getPoint(2); + final ULine line = new ULine(pt1, pt2); + ug.apply(new UTranslate(pt1)).draw(line); + } } diff --git a/src/net/sourceforge/plantuml/svek/image/EntityImageCircleEnd.java b/src/net/sourceforge/plantuml/svek/image/EntityImageCircleEnd.java index f291fa843..2c5b9a3b6 100644 --- a/src/net/sourceforge/plantuml/svek/image/EntityImageCircleEnd.java +++ b/src/net/sourceforge/plantuml/svek/image/EntityImageCircleEnd.java @@ -39,6 +39,7 @@ import net.sourceforge.plantuml.ISkinParam; import net.sourceforge.plantuml.awt.geom.XDimension2D; import net.sourceforge.plantuml.cucadiagram.ILeaf; import net.sourceforge.plantuml.graphic.StringBounder; +import net.sourceforge.plantuml.graphic.color.ColorType; import net.sourceforge.plantuml.style.PName; import net.sourceforge.plantuml.style.SName; import net.sourceforge.plantuml.style.Style; @@ -72,7 +73,9 @@ public class EntityImageCircleEnd extends AbstractEntityImage { final UEllipse circle = new UEllipse(SIZE, SIZE); final Style style = getDefaultStyleDefinitionCircle().getMergedStyle(getSkinParam().getCurrentStyleBuilder()); - final HColor color = style.value(PName.LineColor).asColor(getSkinParam().getIHtmlColorSet()); + HColor color = getEntity().getColors().getColor(ColorType.BACK); + if (color == null) + color = style.value(PName.LineColor).asColor(getSkinParam().getIHtmlColorSet()); final double shadowing = style.value(PName.Shadowing).asDouble(); circle.setDeltaShadow(shadowing); diff --git a/src/net/sourceforge/plantuml/svek/image/EntityImageCircleStart.java b/src/net/sourceforge/plantuml/svek/image/EntityImageCircleStart.java index 216733749..6fd2d1dfa 100644 --- a/src/net/sourceforge/plantuml/svek/image/EntityImageCircleStart.java +++ b/src/net/sourceforge/plantuml/svek/image/EntityImageCircleStart.java @@ -39,6 +39,7 @@ import net.sourceforge.plantuml.ISkinParam; import net.sourceforge.plantuml.awt.geom.XDimension2D; import net.sourceforge.plantuml.cucadiagram.ILeaf; import net.sourceforge.plantuml.graphic.StringBounder; +import net.sourceforge.plantuml.graphic.color.ColorType; import net.sourceforge.plantuml.style.PName; import net.sourceforge.plantuml.style.SName; import net.sourceforge.plantuml.style.Style; @@ -70,7 +71,10 @@ public class EntityImageCircleStart extends AbstractEntityImage { final UEllipse circle = new UEllipse(SIZE, SIZE); final Style style = getDefaultStyleDefinitionCircle().getMergedStyle(getSkinParam().getCurrentStyleBuilder()); - final HColor color = style.value(PName.LineColor).asColor(getSkinParam().getIHtmlColorSet()); + HColor color = getEntity().getColors().getColor(ColorType.BACK); + if (color == null) + color = style.value(PName.LineColor).asColor(getSkinParam().getIHtmlColorSet()); + final double shadowing = style.value(PName.Shadowing).asDouble(); circle.setDeltaShadow(shadowing); diff --git a/src/net/sourceforge/plantuml/timingdiagram/Player.java b/src/net/sourceforge/plantuml/timingdiagram/Player.java index b4ed0ba9b..aa3317654 100644 --- a/src/net/sourceforge/plantuml/timingdiagram/Player.java +++ b/src/net/sourceforge/plantuml/timingdiagram/Player.java @@ -45,6 +45,7 @@ import net.sourceforge.plantuml.graphic.SymbolContext; import net.sourceforge.plantuml.graphic.TextBlock; import net.sourceforge.plantuml.graphic.UDrawable; import net.sourceforge.plantuml.graphic.color.Colors; +import net.sourceforge.plantuml.skin.ArrowConfiguration; import net.sourceforge.plantuml.style.PName; import net.sourceforge.plantuml.style.SName; import net.sourceforge.plantuml.style.Style; @@ -109,7 +110,7 @@ public abstract class Player implements TimeProjected { public abstract void setState(TimeTick now, String comment, Colors color, String... states); - public abstract void createConstraint(TimeTick tick1, TimeTick tick2, String message); + public abstract void createConstraint(TimeTick tick1, TimeTick tick2, String message, ArrowConfiguration config); public abstract TextBlock getPart1(double fullAvailableWidth, double specialVSpace); diff --git a/src/net/sourceforge/plantuml/timingdiagram/PlayerAnalog.java b/src/net/sourceforge/plantuml/timingdiagram/PlayerAnalog.java index 60628b3c9..569e2e4ac 100644 --- a/src/net/sourceforge/plantuml/timingdiagram/PlayerAnalog.java +++ b/src/net/sourceforge/plantuml/timingdiagram/PlayerAnalog.java @@ -54,6 +54,7 @@ import net.sourceforge.plantuml.graphic.TextBlock; import net.sourceforge.plantuml.graphic.UDrawable; import net.sourceforge.plantuml.graphic.color.Colors; import net.sourceforge.plantuml.log.Logme; +import net.sourceforge.plantuml.skin.ArrowConfiguration; import net.sourceforge.plantuml.style.SName; import net.sourceforge.plantuml.style.StyleSignature; import net.sourceforge.plantuml.style.StyleSignatureBasic; @@ -83,7 +84,14 @@ public class PlayerAnalog extends Player { if (start != null) return start; - return 0; + double min = 0; + for (Double val : values.values()) + min = Math.min(min, val); + + if (min == 0) + return 10; + + return min; } private double getMax() { @@ -164,8 +172,8 @@ public class PlayerAnalog extends Player { } @Override - public void createConstraint(TimeTick tick1, TimeTick tick2, String message) { - this.constraints.add(new TimeConstraint(tick1, tick2, message, skinParam)); + public void createConstraint(TimeTick tick1, TimeTick tick2, String message, ArrowConfiguration config) { + this.constraints.add(new TimeConstraint(tick1, tick2, message, skinParam, config)); } private double getYpos(StringBounder stringBounder, double value) { diff --git a/src/net/sourceforge/plantuml/timingdiagram/PlayerBinary.java b/src/net/sourceforge/plantuml/timingdiagram/PlayerBinary.java index 8bc682ba0..396869e79 100644 --- a/src/net/sourceforge/plantuml/timingdiagram/PlayerBinary.java +++ b/src/net/sourceforge/plantuml/timingdiagram/PlayerBinary.java @@ -54,6 +54,7 @@ import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.TextBlock; import net.sourceforge.plantuml.graphic.UDrawable; import net.sourceforge.plantuml.graphic.color.Colors; +import net.sourceforge.plantuml.skin.ArrowConfiguration; import net.sourceforge.plantuml.style.SName; import net.sourceforge.plantuml.style.StyleSignature; import net.sourceforge.plantuml.style.StyleSignatureBasic; @@ -126,8 +127,8 @@ public class PlayerBinary extends Player { } @Override - public void createConstraint(TimeTick tick1, TimeTick tick2, String message) { - this.constraints.add(new TimeConstraint(tick1, tick2, message, skinParam)); + public void createConstraint(TimeTick tick1, TimeTick tick2, String message, ArrowConfiguration config) { + this.constraints.add(new TimeConstraint(tick1, tick2, message, skinParam, config)); } private final double ymargin = 8; diff --git a/src/net/sourceforge/plantuml/timingdiagram/PlayerClock.java b/src/net/sourceforge/plantuml/timingdiagram/PlayerClock.java index ffd4e4279..9751e5b8c 100644 --- a/src/net/sourceforge/plantuml/timingdiagram/PlayerClock.java +++ b/src/net/sourceforge/plantuml/timingdiagram/PlayerClock.java @@ -46,6 +46,7 @@ import net.sourceforge.plantuml.graphic.TextBlock; import net.sourceforge.plantuml.graphic.TextBlockUtils; import net.sourceforge.plantuml.graphic.UDrawable; import net.sourceforge.plantuml.graphic.color.Colors; +import net.sourceforge.plantuml.skin.ArrowConfiguration; import net.sourceforge.plantuml.style.SName; import net.sourceforge.plantuml.style.StyleSignatureBasic; import net.sourceforge.plantuml.timingdiagram.graphic.IntricatedPoint; @@ -107,7 +108,7 @@ public class PlayerClock extends Player { } @Override - public void createConstraint(TimeTick tick1, TimeTick tick2, String message) { + public void createConstraint(TimeTick tick1, TimeTick tick2, String message, ArrowConfiguration config) { throw new UnsupportedOperationException(); } diff --git a/src/net/sourceforge/plantuml/timingdiagram/PlayerRobustConcise.java b/src/net/sourceforge/plantuml/timingdiagram/PlayerRobustConcise.java index 0f0a19c62..e42f6ef0e 100644 --- a/src/net/sourceforge/plantuml/timingdiagram/PlayerRobustConcise.java +++ b/src/net/sourceforge/plantuml/timingdiagram/PlayerRobustConcise.java @@ -51,6 +51,7 @@ import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.TextBlock; import net.sourceforge.plantuml.graphic.UDrawable; import net.sourceforge.plantuml.graphic.color.Colors; +import net.sourceforge.plantuml.skin.ArrowConfiguration; import net.sourceforge.plantuml.style.SName; import net.sourceforge.plantuml.style.Style; import net.sourceforge.plantuml.style.StyleSignature; @@ -204,8 +205,9 @@ public final class PlayerRobustConcise extends Player { return point.translated(translation); } - public final void createConstraint(TimeTick tick1, TimeTick tick2, String message) { - this.constraints.add(new TimeConstraint(tick1, tick2, message, skinParam)); + @Override + public final void createConstraint(TimeTick tick1, TimeTick tick2, String message, ArrowConfiguration config) { + this.constraints.add(new TimeConstraint(tick1, tick2, message, skinParam, config)); } public final void addNote(TimeTick now, Display note, Position position) { diff --git a/src/net/sourceforge/plantuml/timingdiagram/TimeConstraint.java b/src/net/sourceforge/plantuml/timingdiagram/TimeConstraint.java index 457fc0722..69d7710e2 100644 --- a/src/net/sourceforge/plantuml/timingdiagram/TimeConstraint.java +++ b/src/net/sourceforge/plantuml/timingdiagram/TimeConstraint.java @@ -45,6 +45,7 @@ import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.HorizontalAlignment; import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.TextBlock; +import net.sourceforge.plantuml.skin.ArrowConfiguration; import net.sourceforge.plantuml.style.PName; import net.sourceforge.plantuml.style.SName; import net.sourceforge.plantuml.style.Style; @@ -65,13 +66,16 @@ public class TimeConstraint { private final Display label; private final ISkinParam skinParam; private final StyleBuilder styleBuilder; + private final ArrowConfiguration config; - public TimeConstraint(TimeTick tick1, TimeTick tick2, String label, ISkinParam skinParam) { + public TimeConstraint(TimeTick tick1, TimeTick tick2, String label, ISkinParam skinParam, + ArrowConfiguration config) { this.tick1 = Objects.requireNonNull(tick1); this.tick2 = Objects.requireNonNull(tick2); this.label = Display.getWithNewlines(label); this.skinParam = skinParam; this.styleBuilder = skinParam.getCurrentStyleBuilder(); + this.config = config; } public final boolean containsStrict(TimeTick other) { @@ -116,6 +120,9 @@ public class TimeConstraint { } private HColor getArrowColor() { + final HColor configColor = config.getColor(); + if (configColor != null) + return configColor; return getStyle().value(PName.LineColor).asColor(skinParam.getIHtmlColorSet()); } diff --git a/src/net/sourceforge/plantuml/timingdiagram/command/CommandAtTime.java b/src/net/sourceforge/plantuml/timingdiagram/command/CommandAtTime.java index 7affc5bc4..f773c46d5 100644 --- a/src/net/sourceforge/plantuml/timingdiagram/command/CommandAtTime.java +++ b/src/net/sourceforge/plantuml/timingdiagram/command/CommandAtTime.java @@ -69,9 +69,9 @@ public class CommandAtTime extends SingleLineCommand2 { @Override final protected CommandExecutionResult executeArg(TimingDiagram diagram, LineLocation location, RegexResult arg) { final TimeTick timeTick = TimeTickBuilder.parseTimeTick("TIME", arg, diagram); - if (timeTick == null) { + if (timeTick == null) return CommandExecutionResult.error("What time?"); - } + final String code = arg.get("CODE", 0); diagram.addTime(timeTick, code); return CommandExecutionResult.ok(); diff --git a/src/net/sourceforge/plantuml/timingdiagram/command/CommandChangeState.java b/src/net/sourceforge/plantuml/timingdiagram/command/CommandChangeState.java index ff4422c01..29c4ec8a6 100644 --- a/src/net/sourceforge/plantuml/timingdiagram/command/CommandChangeState.java +++ b/src/net/sourceforge/plantuml/timingdiagram/command/CommandChangeState.java @@ -55,7 +55,7 @@ abstract class CommandChangeState extends SingleLineCommand2 { super(pattern); } - static final String STATE_CODE = "([%pLN_][%pLN_.]*)"; + static final String STATE_CODE = "([-%pLN_][-%pLN_.]*)"; static ColorParser color() { return ColorParser.simpleColor(ColorType.BACK); diff --git a/src/net/sourceforge/plantuml/timingdiagram/command/CommandConstraint.java b/src/net/sourceforge/plantuml/timingdiagram/command/CommandConstraint.java index 9ab33e334..81fbe34da 100644 --- a/src/net/sourceforge/plantuml/timingdiagram/command/CommandConstraint.java +++ b/src/net/sourceforge/plantuml/timingdiagram/command/CommandConstraint.java @@ -43,9 +43,12 @@ import net.sourceforge.plantuml.command.regex.RegexConcat; import net.sourceforge.plantuml.command.regex.RegexLeaf; import net.sourceforge.plantuml.command.regex.RegexOptional; import net.sourceforge.plantuml.command.regex.RegexResult; +import net.sourceforge.plantuml.sequencediagram.command.CommandArrow; +import net.sourceforge.plantuml.skin.ArrowConfiguration; import net.sourceforge.plantuml.timingdiagram.Player; import net.sourceforge.plantuml.timingdiagram.TimeTick; import net.sourceforge.plantuml.timingdiagram.TimingDiagram; +import net.sourceforge.plantuml.ugraphic.color.NoSuchColorException; public class CommandConstraint extends SingleLineCommand2 { @@ -59,7 +62,9 @@ public class CommandConstraint extends SingleLineCommand2 { TimeTickBuilder.expressionAtWithArobase("TIME1"), // RegexLeaf.spaceZeroOrMore(), // new RegexLeaf("\\<"), // - new RegexLeaf("ARROW", "(-+)"), // + new RegexLeaf("(-+)"), // + new RegexLeaf("ARROW_STYLE1", CommandArrow.getColorOrStylePattern()), // + new RegexLeaf("(-*)"), // new RegexLeaf("\\>"), // RegexLeaf.spaceZeroOrMore(), // TimeTickBuilder.expressionAtWithArobase("TIME2"), // @@ -74,32 +79,36 @@ public class CommandConstraint extends SingleLineCommand2 { } @Override - final protected CommandExecutionResult executeArg(TimingDiagram diagram, LineLocation location, RegexResult arg) { + final protected CommandExecutionResult executeArg(TimingDiagram diagram, LineLocation location, RegexResult arg) + throws NoSuchColorException { final String part1 = arg.get("PART1", 0); final Player player1; if (part1 == null) { player1 = diagram.getLastPlayer(); - if (player1 == null) { + if (player1 == null) return CommandExecutionResult.error("You have to provide a participant"); - } + } else { player1 = diagram.getPlayer(part1); - if (player1 == null) { + if (player1 == null) return CommandExecutionResult.error("No such participant " + part1); - } + } final TimeTick tick1 = TimeTickBuilder.parseTimeTick("TIME1", arg, diagram); - if (tick1 == null) { + if (tick1 == null) return CommandExecutionResult.error("Unknown time label"); - } + final TimeTick restore = diagram.getNow(); diagram.updateNow(tick1); final TimeTick tick2 = TimeTickBuilder.parseTimeTick("TIME2", arg, diagram); diagram.updateNow(restore); - if (tick2 == null) { + if (tick2 == null) return CommandExecutionResult.error("Unknown time label"); - } - player1.createConstraint(tick1, tick2, arg.get("MESSAGE", 0)); + + ArrowConfiguration config = ArrowConfiguration.withDirectionBoth(); + config = CommandArrow.applyStyle(arg.getLazzy("ARROW_STYLE", 0), config); + + player1.createConstraint(tick1, tick2, arg.get("MESSAGE", 0), config); return CommandExecutionResult.ok(); } diff --git a/src/net/sourceforge/plantuml/version/Version.java b/src/net/sourceforge/plantuml/version/Version.java index 3a492a32b..13fdd040d 100644 --- a/src/net/sourceforge/plantuml/version/Version.java +++ b/src/net/sourceforge/plantuml/version/Version.java @@ -81,7 +81,7 @@ public class Version { } public static int beta() { - final int beta = 0; + final int beta = 1; return beta; }