diff --git a/src/net/sourceforge/plantuml/classdiagram/command/CommandCreateClass.java b/src/net/sourceforge/plantuml/classdiagram/command/CommandCreateClass.java index 31f8a7c8d..01d8baf3b 100644 --- a/src/net/sourceforge/plantuml/classdiagram/command/CommandCreateClass.java +++ b/src/net/sourceforge/plantuml/classdiagram/command/CommandCreateClass.java @@ -133,7 +133,7 @@ public class CommandCreateClass extends SingleLineCommand2 { final String genericOption = arg.getLazzy("DISPLAY", 1); final String generic = genericOption != null ? genericOption : arg.get("GENERIC", 0); - final String stereotype = arg.get("STEREO", 0); + final String stereo = arg.get("STEREO", 0); final ILeaf entity; final Ident idNewLong = diagram.buildLeafIdent(idShort); if (diagram.V1972()) { @@ -156,10 +156,11 @@ public class CommandCreateClass extends SingleLineCommand2 { entity = diagram.createLeaf(idNewLong, code, Display.getWithNewlines(display), type, null); } } - if (stereotype != null) { - entity.setStereotype(Stereotype.build(stereotype, diagram.getSkinParam().getCircledCharacterRadius(), + if (stereo != null) { + entity.setStereotype(Stereotype.build(stereo, diagram.getSkinParam().getCircledCharacterRadius(), diagram.getSkinParam().getFont(null, false, FontParam.CIRCLED_CHARACTER), diagram.getSkinParam().getIHtmlColorSet())); + entity.setStereostyle(stereo); } if (generic != null) { entity.setGeneric(generic); diff --git a/src/net/sourceforge/plantuml/creole/command/CommandCreoleColorChange.java b/src/net/sourceforge/plantuml/creole/command/CommandCreoleColorChange.java index f4830fd29..43b09ff9e 100644 --- a/src/net/sourceforge/plantuml/creole/command/CommandCreoleColorChange.java +++ b/src/net/sourceforge/plantuml/creole/command/CommandCreoleColorChange.java @@ -49,8 +49,7 @@ import net.sourceforge.plantuml.ugraphic.color.NoSuchColorRuntimeException; public class CommandCreoleColorChange implements Command { - private static final Pattern2 pattern = MyPattern - .cmpile("^(" + Splitter.fontColorPattern2 + "(.*?)\\)"); + private static final Pattern2 pattern = MyPattern.cmpile("^(" + Splitter.fontColorPattern2 + "(.*?)\\)"); private static final Pattern2 patternEol = MyPattern.cmpile("^(" + Splitter.fontColorPattern2 + "(.*)$)"); @@ -90,12 +89,13 @@ public class CommandCreoleColorChange implements Command { final HColor color = HColorSet.instance().getColor(themeStyle, s); final FontConfiguration fc2 = fc1.changeColor(color); stripe.setActualFontConfiguration(fc2); - stripe.analyzeAndAdd(m.group(3)); - stripe.setActualFontConfiguration(fc1); - return line.substring(m.group(1).length()); } catch (NoSuchColorException e) { - throw new NoSuchColorRuntimeException(); + // Too late for parsing error + // So we just ignore } + stripe.analyzeAndAdd(m.group(3)); + stripe.setActualFontConfiguration(fc1); + return line.substring(m.group(1).length()); } } diff --git a/src/net/sourceforge/plantuml/cucadiagram/GroupRoot.java b/src/net/sourceforge/plantuml/cucadiagram/GroupRoot.java index 56cdad0f9..714358510 100644 --- a/src/net/sourceforge/plantuml/cucadiagram/GroupRoot.java +++ b/src/net/sourceforge/plantuml/cucadiagram/GroupRoot.java @@ -66,6 +66,7 @@ public class GroupRoot implements IGroup { this.entityFactory = entityFactory; } + @Override public Collection getLeafsDirect() { final List result = new ArrayList<>(); for (ILeaf ent : entityFactory.leafs()) { @@ -82,71 +83,79 @@ public class GroupRoot implements IGroup { return "ROOT"; } + @Override public boolean isGroup() { return true; } + @Override public Display getDisplay() { throw new UnsupportedOperationException(); } + @Override public void setDisplay(Display display) { throw new UnsupportedOperationException(); } + @Override public LeafType getLeafType() { throw new UnsupportedOperationException(); } + @Override public String getUid() { throw new UnsupportedOperationException(); } + @Override public Url getUrl99() { return null; } + @Override public Stereotype getStereotype() { throw new UnsupportedOperationException(); } + @Override public void setStereotype(Stereotype stereotype) { throw new UnsupportedOperationException(); - - } - - public TextBlock getBody(PortionShower portionShower, FontParam fontParam, ISkinParam skinParam) { - throw new UnsupportedOperationException(); - } + @Override public Code getCode() { return CodeImpl.of("__ROOT__"); } + @Override public String getCodeGetName() { return getCode().getName(); } + @Override public void addUrl(Url url) { throw new UnsupportedOperationException(); } + @Override public IGroup getParentContainer() { return null; } + @Override public boolean containsLeafRecurse(ILeaf entity) { throw new UnsupportedOperationException(); } + @Override public Collection getChildren() { final List result = new ArrayList<>(); if (entityFactory.namespaceSeparator.V1972()) { @@ -166,93 +175,105 @@ public class GroupRoot implements IGroup { return Collections.unmodifiableCollection(result); } + @Override public void moveEntitiesTo(IGroup dest) { throw new UnsupportedOperationException(); } + @Override public int size() { throw new UnsupportedOperationException(); } + @Override public GroupType getGroupType() { return null; } + @Override public Code getNamespace() { throw new UnsupportedOperationException(); } + @Override public PackageStyle getPackageStyle() { throw new UnsupportedOperationException(); } + @Override public void overrideImage(IEntityImage img, LeafType state) { throw new UnsupportedOperationException(); } + @Override public boolean isHidden() { return false; } + @Override public USymbol getUSymbol() { return null; // throw new UnsupportedOperationException(); } + @Override public void setUSymbol(USymbol symbol) { throw new UnsupportedOperationException(); } + @Override public SingleStrategy getSingleStrategy() { return SingleStrategy.SQUARE; } + @Override public boolean isRemoved() { return false; } + @Override public boolean hasUrl() { return false; } - public int getHectorLayer() { - throw new UnsupportedOperationException(); - } - - public void setHectorLayer(int layer) { - throw new UnsupportedOperationException(); - } - + @Override public int getRawLayout() { throw new UnsupportedOperationException(); } + @Override public char getConcurrentSeparator() { throw new UnsupportedOperationException(); } + @Override public void setConcurrentSeparator(char separator) { // throw new UnsupportedOperationException(); } + @Override public void putTip(String member, Display display) { throw new UnsupportedOperationException(); } + @Override public Map getTips() { throw new UnsupportedOperationException(); } + @Override public Bodier getBodier() { throw new UnsupportedOperationException(); } + @Override public Colors getColors(ISkinParam skinParam) { return Colors.empty(); } + @Override public void setColors(Colors colors) { throw new UnsupportedOperationException(); } @@ -277,31 +298,48 @@ public class GroupRoot implements IGroup { throw new UnsupportedOperationException(); } + @Override public void setLegend(DisplayPositionned legend) { throw new UnsupportedOperationException(); } + @Override public DisplayPositionned getLegend() { throw new UnsupportedOperationException(); } + @Override public Ident getIdent() { return Ident.empty(); } + @Override public boolean isAloneAndUnlinked() { throw new UnsupportedOperationException(); } + @Override public void setThisIsTogether() { throw new UnsupportedOperationException(); } + @Override public String getCodeLine() { throw new UnsupportedOperationException(); } + @Override public void setCodeLine(LineLocation codeLine) { throw new UnsupportedOperationException(); } + + @Override + public void setStereostyle(String stereo) { + throw new UnsupportedOperationException(); + } + + @Override + public Stereostyles getStereostyles() { + throw new UnsupportedOperationException(); + } } diff --git a/src/net/sourceforge/plantuml/cucadiagram/IEntity.java b/src/net/sourceforge/plantuml/cucadiagram/IEntity.java index d2a15f430..383211eef 100644 --- a/src/net/sourceforge/plantuml/cucadiagram/IEntity.java +++ b/src/net/sourceforge/plantuml/cucadiagram/IEntity.java @@ -82,10 +82,6 @@ public interface IEntity extends SpecificBackcolorable, Hideable, Removeable, Li public boolean hasUrl(); - public int getHectorLayer(); - - public void setHectorLayer(int layer); - public int getRawLayout(); public void putTip(String member, Display display); @@ -104,4 +100,8 @@ public interface IEntity extends SpecificBackcolorable, Hideable, Removeable, Li public void setCodeLine(LineLocation codeLine); + public void setStereostyle(String stereo); + + public Stereostyles getStereostyles(); + } diff --git a/src/net/sourceforge/plantuml/cucadiagram/Stereostyles.java b/src/net/sourceforge/plantuml/cucadiagram/Stereostyles.java new file mode 100644 index 000000000..fc93e86b1 --- /dev/null +++ b/src/net/sourceforge/plantuml/cucadiagram/Stereostyles.java @@ -0,0 +1,74 @@ +/* ======================================================================== + * PlantUML : a free UML diagram generator + * ======================================================================== + * + * (C) Copyright 2009-2020, Arnaud Roques + * + * Project Info: http://plantuml.com + * + * If you like this project or if you find it useful, you can support us at: + * + * http://plantuml.com/patreon (only 1$ per month!) + * http://plantuml.com/paypal + * + * This file is part of PlantUML. + * + * PlantUML is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * PlantUML distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + * License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + * + * + * Original Author: Arnaud Roques + * + * + */ +package net.sourceforge.plantuml.cucadiagram; + +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedHashSet; +import java.util.Set; + +import net.sourceforge.plantuml.command.regex.Matcher2; +import net.sourceforge.plantuml.command.regex.MyPattern; +import net.sourceforge.plantuml.command.regex.Pattern2; + +public class Stereostyles { + + public static final Stereostyles NONE = new Stereostyles(); + + private final Set names = new LinkedHashSet(); + + private Stereostyles() { + } + + public boolean isEmpty() { + return names.isEmpty(); + } + + public static Stereostyles build(String label) { + final Stereostyles result = new Stereostyles(); + final Pattern2 p = MyPattern.cmpile("\\<{3}(.*?)\\>{3}"); + final Matcher2 m = p.matcher(label); + while (m.find()) { + result.names.add(m.group(1)); + } + return result; + } + + public Collection getStyleNames() { + return Collections.unmodifiableCollection(names); + } + +} diff --git a/src/net/sourceforge/plantuml/cucadiagram/entity/EntityImpl.java b/src/net/sourceforge/plantuml/cucadiagram/entity/EntityImpl.java index 5287c573b..0bb0b2d43 100644 --- a/src/net/sourceforge/plantuml/cucadiagram/entity/EntityImpl.java +++ b/src/net/sourceforge/plantuml/cucadiagram/entity/EntityImpl.java @@ -66,6 +66,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.Stereostyles; import net.sourceforge.plantuml.cucadiagram.Stereotag; import net.sourceforge.plantuml.cucadiagram.Stereotype; import net.sourceforge.plantuml.cucadiagram.dot.Neighborhood; @@ -98,6 +99,7 @@ final public class EntityImpl implements ILeaf, IGroup { private LeafType leafType; private Stereotype stereotype; + private Stereostyles stereostyles = Stereostyles.NONE; private String generic; private IGroup parentContainer; @@ -662,19 +664,6 @@ final public class EntityImpl implements ILeaf, IGroup { return true; } - private int layer; - - public int getHectorLayer() { - return layer; - } - - public void setHectorLayer(int layer) { - this.layer = layer; - if (layer > 1000) { - throw new IllegalArgumentException(); - } - } - private FontParam getTitleFontParam() { if (symbol != null) { return symbol.getFontParam(); @@ -804,4 +793,14 @@ final public class EntityImpl implements ILeaf, IGroup { this.codeLine = codeLine; } + @Override + public void setStereostyle(String stereo) { + this.stereostyles = Stereostyles.build(stereo); + } + + @Override + public Stereostyles getStereostyles() { + return stereostyles; + } + } diff --git a/src/net/sourceforge/plantuml/nwdiag/next/NBox.java b/src/net/sourceforge/plantuml/nwdiag/next/NBox.java index acf8bf988..028c08696 100644 --- a/src/net/sourceforge/plantuml/nwdiag/next/NBox.java +++ b/src/net/sourceforge/plantuml/nwdiag/next/NBox.java @@ -45,7 +45,7 @@ public class NBox implements Staged { public void add(NBar bar) { if (this.bars.contains(bar)) { - throw new IllegalStateException(); + return; } this.bars.add(bar); this.tetris.add(bar); diff --git a/src/net/sourceforge/plantuml/sequencediagram/Participant.java b/src/net/sourceforge/plantuml/sequencediagram/Participant.java index ab9199a55..1f153022d 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/Participant.java +++ b/src/net/sourceforge/plantuml/sequencediagram/Participant.java @@ -83,7 +83,7 @@ public class Participant implements SpecificBackcolorable, WithStyle { final StyleSignature signature = getDefaultStyleDefinition().with(stereotype); Style tmp = signature.getMergedStyle(styleBuilder); tmp = tmp.eventuallyOverride(getColors(null)); - Style stereo = getDefaultStyleDefinition().withStereotype(stereotype).getMergedStyle(styleBuilder); + Style stereo = getDefaultStyleDefinition().forStereotypeItself(stereotype).getMergedStyle(styleBuilder); if (tmp != null) { stereo = tmp.mergeWith(stereo); } diff --git a/src/net/sourceforge/plantuml/statediagram/StateDiagramFactory.java b/src/net/sourceforge/plantuml/statediagram/StateDiagramFactory.java index 1b9e6be58..7d6aacfa4 100644 --- a/src/net/sourceforge/plantuml/statediagram/StateDiagramFactory.java +++ b/src/net/sourceforge/plantuml/statediagram/StateDiagramFactory.java @@ -59,6 +59,7 @@ import net.sourceforge.plantuml.statediagram.command.CommandCreatePackageState; import net.sourceforge.plantuml.statediagram.command.CommandCreateState; import net.sourceforge.plantuml.statediagram.command.CommandEndState; import net.sourceforge.plantuml.statediagram.command.CommandLinkState; +import net.sourceforge.plantuml.statediagram.command.CommandLinkStateReverse; public class StateDiagramFactory extends PSystemCommandFactory { @@ -75,6 +76,7 @@ public class StateDiagramFactory extends PSystemCommandFactory { cmds.add(new CommandRemoveRestore()); cmds.add(new CommandCreateState()); cmds.add(new CommandLinkState()); + cmds.add(new CommandLinkStateReverse()); cmds.add(new CommandCreatePackageState()); cmds.add(new CommandEndState()); cmds.add(new CommandAddField()); diff --git a/src/net/sourceforge/plantuml/statediagram/command/CommandLinkState.java b/src/net/sourceforge/plantuml/statediagram/command/CommandLinkState.java index d9f19b2f2..7fe82df64 100644 --- a/src/net/sourceforge/plantuml/statediagram/command/CommandLinkState.java +++ b/src/net/sourceforge/plantuml/statediagram/command/CommandLinkState.java @@ -36,31 +36,12 @@ */ package net.sourceforge.plantuml.statediagram.command; -import net.sourceforge.plantuml.Direction; -import net.sourceforge.plantuml.LineLocation; -import net.sourceforge.plantuml.StringUtils; -import net.sourceforge.plantuml.UmlDiagramType; -import net.sourceforge.plantuml.command.CommandExecutionResult; -import net.sourceforge.plantuml.command.SingleLineCommand2; 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.cucadiagram.Code; -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.Link; -import net.sourceforge.plantuml.cucadiagram.LinkDecor; -import net.sourceforge.plantuml.cucadiagram.LinkType; -import net.sourceforge.plantuml.cucadiagram.Stereotype; import net.sourceforge.plantuml.descdiagram.command.CommandLinkElement; -import net.sourceforge.plantuml.graphic.color.ColorType; -import net.sourceforge.plantuml.statediagram.StateDiagram; -import net.sourceforge.plantuml.ugraphic.color.NoSuchColorException; -public class CommandLinkState extends SingleLineCommand2 { +public class CommandLinkState extends CommandLinkStateCommon { public CommandLinkState() { super(getRegex()); @@ -91,128 +72,4 @@ public class CommandLinkState extends SingleLineCommand2 { )), RegexLeaf.end()); } - private static RegexLeaf getStatePattern(String name) { - return new RegexLeaf(name, - "([%pLN_.:]+|[%pLN_.:]+\\[H\\*?\\]|\\[\\*\\]|\\[H\\*?\\]|(?:==+)(?:[%pLN_.:]+)(?:==+))[%s]*(\\<\\<.*\\>\\>)?[%s]*(#\\w+)?"); - } - - @Override - protected CommandExecutionResult executeArg(StateDiagram diagram, LineLocation location, RegexResult arg) - throws NoSuchColorException { - final String ent1 = arg.get("ENT1", 0); - final String ent2 = arg.get("ENT2", 0); - - final IEntity cl1 = getEntityStart(diagram, ent1); - if (cl1 == null) { - return CommandExecutionResult - .error("The state " + ent1 + " has been created in a concurrent state : it cannot be used here."); - } - final IEntity cl2 = getEntityEnd(diagram, ent2); - if (cl2 == null) { - return CommandExecutionResult - .error("The state " + ent2 + " has been created in a concurrent state : it cannot be used here."); - } - - if (arg.get("ENT1", 1) != null) { - cl1.setStereotype(Stereotype.build(arg.get("ENT1", 1))); - } - if (arg.get("ENT1", 2) != null) { - final String s = arg.get("ENT1", 2); - cl1.setSpecificColorTOBEREMOVED(ColorType.BACK, - diagram.getSkinParam().getIHtmlColorSet().getColor(diagram.getSkinParam().getThemeStyle(), s)); - } - if (arg.get("ENT2", 1) != null) { - cl2.setStereotype(Stereotype.build(arg.get("ENT2", 1))); - } - if (arg.get("ENT2", 2) != null) { - final String s = arg.get("ENT2", 2); - cl2.setSpecificColorTOBEREMOVED(ColorType.BACK, - diagram.getSkinParam().getIHtmlColorSet().getColor(diagram.getSkinParam().getThemeStyle(), s)); - } - - String queue = arg.get("ARROW_BODY1", 0) + arg.get("ARROW_BODY2", 0); - final Direction dir = getDirection(arg); - - if (dir == Direction.LEFT || dir == Direction.RIGHT) { - queue = "-"; - } - - final int lenght = queue.length(); - - final boolean crossStart = arg.get("ARROW_CROSS_START", 0) != null; - final boolean circleEnd = arg.get("ARROW_CIRCLE_END", 0) != null; - final LinkType linkType = new LinkType(circleEnd ? LinkDecor.ARROW_AND_CIRCLE : LinkDecor.ARROW, - crossStart ? LinkDecor.CIRCLE_CROSS : LinkDecor.NONE); - - final Display label = Display.getWithNewlines(arg.get("LABEL", 0)); - Link link = new Link(cl1, cl2, linkType, label, lenght, diagram.getSkinParam().getCurrentStyleBuilder()); - if (dir == Direction.LEFT || dir == Direction.UP) { - link = link.getInv(); - } - link.applyStyle(diagram.getSkinParam().getThemeStyle(), arg.getLazzy("ARROW_STYLE", 0)); - link.setUmlDiagramType(UmlDiagramType.STATE); - diagram.addLink(link); - - return CommandExecutionResult.ok(); - } - - private Direction getDirection(RegexResult arg) { - final String arrowDirection = arg.get("ARROW_DIRECTION", 0); - if (arrowDirection != null) { - return StringUtils.getQueueDirection(arrowDirection); - } - return null; - } - - private IEntity getEntityStart(StateDiagram diagram, final String codeString) { - if (codeString.startsWith("[*]")) { - return diagram.getStart(); - } - return getFoo1(diagram, codeString); - } - - private IEntity getEntityEnd(StateDiagram diagram, final String codeString) { - if (codeString.startsWith("[*]")) { - return diagram.getEnd(); - } - return getFoo1(diagram, codeString); - } - - private IEntity getFoo1(StateDiagram diagram, final String codeString) { - if (codeString.equalsIgnoreCase("[H]")) { - return diagram.getHistorical(); - } - if (codeString.endsWith("[H]")) { - return diagram.getHistorical(codeString.substring(0, codeString.length() - 3)); - } - if (codeString.equalsIgnoreCase("[H*]")) { - return diagram.getDeepHistory(); - } - if (codeString.endsWith("[H*]")) { - return diagram.getDeepHistory(codeString.substring(0, codeString.length() - 4)); - } - if (codeString.startsWith("=") && codeString.endsWith("=")) { - final String codeString1 = removeEquals(codeString); - final Ident ident1 = diagram.buildLeafIdent(codeString1); - final Code code1 = diagram.V1972() ? ident1 : diagram.buildCode(codeString1); - return diagram.getOrCreateLeaf(ident1, code1, LeafType.SYNCHRO_BAR, null); - } - final Ident ident = diagram.buildLeafIdent(codeString); - final Code code = diagram.V1972() ? ident : diagram.buildCode(codeString); - if (diagram.checkConcurrentStateOk(ident, code) == false) { - return null; - } - return diagram.getOrCreateLeaf(ident, code, null, null); - } - - private String removeEquals(String code) { - while (code.startsWith("=")) { - code = code.substring(1); - } - while (code.endsWith("=")) { - code = code.substring(0, code.length() - 1); - } - return code; - } - } diff --git a/src/net/sourceforge/plantuml/statediagram/command/CommandLinkStateCommon.java b/src/net/sourceforge/plantuml/statediagram/command/CommandLinkStateCommon.java new file mode 100644 index 000000000..fe5af562d --- /dev/null +++ b/src/net/sourceforge/plantuml/statediagram/command/CommandLinkStateCommon.java @@ -0,0 +1,195 @@ +/* ======================================================================== + * PlantUML : a free UML diagram generator + * ======================================================================== + * + * (C) Copyright 2009-2020, Arnaud Roques + * + * Project Info: http://plantuml.com + * + * If you like this project or if you find it useful, you can support us at: + * + * http://plantuml.com/patreon (only 1$ per month!) + * http://plantuml.com/paypal + * + * This file is part of PlantUML. + * + * PlantUML is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * PlantUML distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + * License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + * + * + * Original Author: Arnaud Roques + * Contribution : Serge Wenger + * + * + */ +package net.sourceforge.plantuml.statediagram.command; + +import net.sourceforge.plantuml.Direction; +import net.sourceforge.plantuml.LineLocation; +import net.sourceforge.plantuml.StringUtils; +import net.sourceforge.plantuml.UmlDiagramType; +import net.sourceforge.plantuml.command.CommandExecutionResult; +import net.sourceforge.plantuml.command.SingleLineCommand2; +import net.sourceforge.plantuml.command.regex.IRegex; +import net.sourceforge.plantuml.command.regex.RegexLeaf; +import net.sourceforge.plantuml.command.regex.RegexResult; +import net.sourceforge.plantuml.cucadiagram.Code; +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.Link; +import net.sourceforge.plantuml.cucadiagram.LinkDecor; +import net.sourceforge.plantuml.cucadiagram.LinkType; +import net.sourceforge.plantuml.cucadiagram.Stereotype; +import net.sourceforge.plantuml.graphic.color.ColorType; +import net.sourceforge.plantuml.statediagram.StateDiagram; +import net.sourceforge.plantuml.ugraphic.color.NoSuchColorException; + +abstract class CommandLinkStateCommon extends SingleLineCommand2 { + + CommandLinkStateCommon(IRegex pattern) { + super(pattern); + } + + protected static RegexLeaf getStatePattern(String name) { + return new RegexLeaf(name, + "([%pLN_.:]+|[%pLN_.:]+\\[H\\*?\\]|\\[\\*\\]|\\[H\\*?\\]|(?:==+)(?:[%pLN_.:]+)(?:==+))[%s]*(\\<\\<.*\\>\\>)?[%s]*(#\\w+)?"); + } + + @Override + protected CommandExecutionResult executeArg(StateDiagram diagram, LineLocation location, RegexResult arg) + throws NoSuchColorException { + final String ent1 = arg.get("ENT1", 0); + final String ent2 = arg.get("ENT2", 0); + + final IEntity cl1 = getEntityStart(diagram, ent1); + if (cl1 == null) { + return CommandExecutionResult + .error("The state " + ent1 + " has been created in a concurrent state : it cannot be used here."); + } + final IEntity cl2 = getEntityEnd(diagram, ent2); + if (cl2 == null) { + return CommandExecutionResult + .error("The state " + ent2 + " has been created in a concurrent state : it cannot be used here."); + } + + if (arg.get("ENT1", 1) != null) { + cl1.setStereotype(Stereotype.build(arg.get("ENT1", 1))); + } + if (arg.get("ENT1", 2) != null) { + final String s = arg.get("ENT1", 2); + cl1.setSpecificColorTOBEREMOVED(ColorType.BACK, + diagram.getSkinParam().getIHtmlColorSet().getColor(diagram.getSkinParam().getThemeStyle(), s)); + } + if (arg.get("ENT2", 1) != null) { + cl2.setStereotype(Stereotype.build(arg.get("ENT2", 1))); + } + if (arg.get("ENT2", 2) != null) { + final String s = arg.get("ENT2", 2); + cl2.setSpecificColorTOBEREMOVED(ColorType.BACK, + diagram.getSkinParam().getIHtmlColorSet().getColor(diagram.getSkinParam().getThemeStyle(), s)); + } + + String queue = arg.get("ARROW_BODY1", 0) + arg.get("ARROW_BODY2", 0); + final Direction dir = getDirection(arg); + + if (dir == Direction.LEFT || dir == Direction.RIGHT) { + queue = "-"; + } + + final int lenght = queue.length(); + + final boolean crossStart = arg.get("ARROW_CROSS_START", 0) != null; + final boolean circleEnd = arg.get("ARROW_CIRCLE_END", 0) != null; + final LinkType linkType = new LinkType(circleEnd ? LinkDecor.ARROW_AND_CIRCLE : LinkDecor.ARROW, + crossStart ? LinkDecor.CIRCLE_CROSS : LinkDecor.NONE); + + final Display label = Display.getWithNewlines(arg.get("LABEL", 0)); + Link link = new Link(cl1, cl2, linkType, label, lenght, diagram.getSkinParam().getCurrentStyleBuilder()); + if (dir == Direction.LEFT || dir == Direction.UP) { + link = link.getInv(); + } + link.applyStyle(diagram.getSkinParam().getThemeStyle(), arg.getLazzy("ARROW_STYLE", 0)); + link.setUmlDiagramType(UmlDiagramType.STATE); + diagram.addLink(link); + + return CommandExecutionResult.ok(); + } + + private Direction getDirection(RegexResult arg) { + final String arrowDirection = arg.get("ARROW_DIRECTION", 0); + if (arrowDirection != null) { + return StringUtils.getQueueDirection(arrowDirection); + } + return getDefaultDirection(); + } + + protected Direction getDefaultDirection() { + return null; + } + + private IEntity getEntityStart(StateDiagram diagram, final String codeString) { + if (codeString.startsWith("[*]")) { + return diagram.getStart(); + } + return getFoo1(diagram, codeString); + } + + private IEntity getEntityEnd(StateDiagram diagram, final String codeString) { + if (codeString.startsWith("[*]")) { + return diagram.getEnd(); + } + return getFoo1(diagram, codeString); + } + + private IEntity getFoo1(StateDiagram diagram, final String codeString) { + if (codeString.equalsIgnoreCase("[H]")) { + return diagram.getHistorical(); + } + if (codeString.endsWith("[H]")) { + return diagram.getHistorical(codeString.substring(0, codeString.length() - 3)); + } + if (codeString.equalsIgnoreCase("[H*]")) { + return diagram.getDeepHistory(); + } + if (codeString.endsWith("[H*]")) { + return diagram.getDeepHistory(codeString.substring(0, codeString.length() - 4)); + } + if (codeString.startsWith("=") && codeString.endsWith("=")) { + final String codeString1 = removeEquals(codeString); + final Ident ident1 = diagram.buildLeafIdent(codeString1); + final Code code1 = diagram.V1972() ? ident1 : diagram.buildCode(codeString1); + return diagram.getOrCreateLeaf(ident1, code1, LeafType.SYNCHRO_BAR, null); + } + final Ident ident = diagram.buildLeafIdent(codeString); + final Code code = diagram.V1972() ? ident : diagram.buildCode(codeString); + if (diagram.checkConcurrentStateOk(ident, code) == false) { + return null; + } + return diagram.getOrCreateLeaf(ident, code, null, null); + } + + private String removeEquals(String code) { + while (code.startsWith("=")) { + code = code.substring(1); + } + while (code.endsWith("=")) { + code = code.substring(0, code.length() - 1); + } + return code; + } + +} diff --git a/src/net/sourceforge/plantuml/statediagram/command/CommandLinkStateReverse.java b/src/net/sourceforge/plantuml/statediagram/command/CommandLinkStateReverse.java new file mode 100644 index 000000000..847106001 --- /dev/null +++ b/src/net/sourceforge/plantuml/statediagram/command/CommandLinkStateReverse.java @@ -0,0 +1,81 @@ +/* ======================================================================== + * PlantUML : a free UML diagram generator + * ======================================================================== + * + * (C) Copyright 2009-2020, Arnaud Roques + * + * Project Info: http://plantuml.com + * + * If you like this project or if you find it useful, you can support us at: + * + * http://plantuml.com/patreon (only 1$ per month!) + * http://plantuml.com/paypal + * + * This file is part of PlantUML. + * + * PlantUML is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * PlantUML distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + * License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + * + * + * Original Author: Arnaud Roques + * Contribution : Serge Wenger + * + * + */ +package net.sourceforge.plantuml.statediagram.command; + +import net.sourceforge.plantuml.Direction; +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.descdiagram.command.CommandLinkElement; + +public class CommandLinkStateReverse extends CommandLinkStateCommon { + + public CommandLinkStateReverse() { + super(getRegex()); + } + + static RegexConcat getRegex() { + return RegexConcat.build(CommandLinkStateReverse.class.getName(), RegexLeaf.start(), // + getStatePattern("ENT2"), // + RegexLeaf.spaceZeroOrMore(), // + new RegexConcat( + // + new RegexLeaf("ARROW_CIRCLE_END", "(o[%s]+)?"), // + new RegexLeaf("\\<"), // + new RegexLeaf("ARROW_BODY2", "(-*)"), // + new RegexLeaf("ARROW_STYLE2", "(?:\\[(" + CommandLinkElement.LINE_STYLE + ")\\])?"), // + new RegexLeaf("ARROW_DIRECTION", "(left|right|up|down|le?|ri?|up?|do?)?"), // + new RegexLeaf("ARROW_STYLE1", "(?:\\[(" + CommandLinkElement.LINE_STYLE + ")\\])?"), // + new RegexLeaf("ARROW_BODY1", "(-+)"), // + new RegexLeaf("ARROW_CROSS_START", "(x)?")), // + RegexLeaf.spaceZeroOrMore(), // + getStatePattern("ENT1"), // + RegexLeaf.spaceZeroOrMore(), // + new RegexOptional( // + new RegexConcat( // + new RegexLeaf(":"), // + RegexLeaf.spaceZeroOrMore(), // + new RegexLeaf("LABEL", "(.+)") // + )), RegexLeaf.end()); + } + + @Override + protected Direction getDefaultDirection() { + return Direction.LEFT; + } + +} diff --git a/src/net/sourceforge/plantuml/style/StyleSignature.java b/src/net/sourceforge/plantuml/style/StyleSignature.java index e166e21fa..acf89b407 100644 --- a/src/net/sourceforge/plantuml/style/StyleSignature.java +++ b/src/net/sourceforge/plantuml/style/StyleSignature.java @@ -43,6 +43,7 @@ import java.util.List; import java.util.Set; import net.sourceforge.plantuml.Url; +import net.sourceforge.plantuml.cucadiagram.Stereostyles; import net.sourceforge.plantuml.cucadiagram.Stereotype; public class StyleSignature { @@ -153,7 +154,7 @@ public class StyleSignature { return new StyleSignature(result); } - public StyleSignature withStereotype(Stereotype stereotype) { + public StyleSignature forStereotypeItself(Stereotype stereotype) { final List result = new ArrayList<>(names); if (stereotype != null) { for (String name : stereotype.getStyleNames()) { @@ -174,6 +175,16 @@ public class StyleSignature { return new StyleSignature(result); } + public StyleSignature with(Stereostyles stereostyles) { + if (stereostyles.isEmpty()) + return this; + final List result = new ArrayList<>(names); + for (String name : stereostyles.getStyleNames()) { + result.add(clean(name)); + } + return new StyleSignature(result); + } + private String clean(String name) { return name.toLowerCase().replace("_", ""); } diff --git a/src/net/sourceforge/plantuml/svek/Cluster.java b/src/net/sourceforge/plantuml/svek/Cluster.java index b6c282307..5d324f662 100644 --- a/src/net/sourceforge/plantuml/svek/Cluster.java +++ b/src/net/sourceforge/plantuml/svek/Cluster.java @@ -317,13 +317,26 @@ public class Cluster implements Moveable { } HColor borderColor; Style style = null; + final double rounded; + final double shadowing; if (UseStyle.useBetaStyle()) { style = getDefaultStyleDefinition(umlDiagramType.getStyleName()) .getMergedStyle(skinParam.getCurrentStyleBuilder()); + shadowing = style.value(PName.Shadowing).asDouble(); borderColor = style.value(PName.LineColor).asColor(skinParam2.getThemeStyle(), skinParam2.getIHtmlColorSet()); + if (umlDiagramType == UmlDiagramType.STATE) + rounded = style.value(PName.RoundCorner).asDouble(); + else + rounded = IEntityImage.CORNER; } else { + if (group.getUSymbol() == null) { + shadowing = skinParam2.shadowing2(group.getStereotype(), USymbol.PACKAGE.getSkinParameter()) ? 3 : 0; + } else { + shadowing = skinParam2.shadowing2(group.getStereotype(), group.getUSymbol().getSkinParameter()) ? 3 : 0; + } + rounded = IEntityImage.CORNER; if (umlDiagramType == UmlDiagramType.STATE) { borderColor = getColor(ColorParam.stateBorder, skinParam, group.getStereotype()); } else if (umlDiagramType == UmlDiagramType.ACTIVITY) { @@ -353,7 +366,7 @@ public class Cluster implements Moveable { if (group.getColors(skinParam).getColor(ColorType.LINE) != null) { borderColor = group.getColors(skinParam).getColor(ColorType.LINE); } - drawUState(ug, borderColor, skinParam2, strokeForState, umlDiagramType); + drawUState(ug, borderColor, skinParam2, strokeForState, umlDiagramType, rounded, shadowing); return; } PackageStyle packageStyle = group.getPackageStyle(); @@ -367,19 +380,10 @@ public class Cluster implements Moveable { } } - final double shadowing; final UStroke stroke; if (UseStyle.useBetaStyle()) { - shadowing = style.value(PName.Shadowing).asDouble(); stroke = style.getStroke(); } else { - if (group.getUSymbol() == null) { - shadowing = skinParam2.shadowing2(group.getStereotype(), USymbol.PACKAGE.getSkinParameter()) ? 3 - : 0; - } else { - shadowing = skinParam2.shadowing2(group.getStereotype(), group.getUSymbol().getSkinParameter()) ? 3 - : 0; - } stroke = getStrokeInternal(group, skinParam2); } HColor backColor = getBackColor(umlDiagramType, style); @@ -463,7 +467,7 @@ public class Cluster implements Moveable { } private void drawUState(UGraphic ug, HColor borderColor, ISkinParam skinParam2, UStroke stroke, - UmlDiagramType umlDiagramType) { + UmlDiagramType umlDiagramType, double rounded, double shadowing) { final Dimension2D total = new Dimension2DDouble(maxX - minX, maxY - minY); final double suppY; if (ztitle == null) { @@ -492,8 +496,8 @@ public class Cluster implements Moveable { } final RoundedContainer r = new RoundedContainer(total, suppY, attributeHeight + (attributeHeight > 0 ? IEntityImage.MARGIN : 0), borderColor, stateBack, background, - stroke); - r.drawU(ug.apply(new UTranslate(minX, minY)), skinParam2.shadowing(group.getStereotype())); + stroke, rounded, shadowing); + r.drawU(ug.apply(new UTranslate(minX, minY))); if (ztitle != null) { ztitle.drawU(ug.apply(new UTranslate(xTitle, yTitle))); diff --git a/src/net/sourceforge/plantuml/svek/GeneralImageBuilder.java b/src/net/sourceforge/plantuml/svek/GeneralImageBuilder.java index f398b89bf..193dbb441 100644 --- a/src/net/sourceforge/plantuml/svek/GeneralImageBuilder.java +++ b/src/net/sourceforge/plantuml/svek/GeneralImageBuilder.java @@ -643,7 +643,7 @@ public final class GeneralImageBuilder { final TextBlock stereoAndTitle = TextBlockUtils.mergeTB(stereo, title, HorizontalAlignment.CENTER); final Dimension2D dimLabel = stereoAndTitle.calculateDimension(stringBounder); if (dimLabel.getWidth() > 0) { - final Dimension2D dimAttribute = stateHeader((IEntity) g, getStyle(FontParam.STATE_ATTRIBUTE), + final Dimension2D dimAttribute = stateHeader((IEntity) g, getStyleState(FontParam.STATE_ATTRIBUTE), dotData.getSkinParam()).calculateDimension(stringBounder); final double attributeHeight = dimAttribute.getHeight(); final double attributeWidth = dimAttribute.getWidth(); @@ -690,7 +690,7 @@ public final class GeneralImageBuilder { } - private Style getStyle(FontParam fontParam) { + private Style getStyleState(FontParam fontParam) { return fontParam.getStyleDefinition(SName.stateDiagram) .getMergedStyle(dotData.getSkinParam().getCurrentStyleBuilder()); } @@ -700,10 +700,19 @@ public final class GeneralImageBuilder { if (label == null) { return TextBlockUtils.empty(0, 0); } - final ISkinParam skinParam = dotData.getSkinParam(); - final FontConfiguration fontConfiguration = g.getFontConfigurationForTitle(skinParam); - return label.create(fontConfiguration, HorizontalAlignment.CENTER, skinParam); + final FontConfiguration fontConfiguration; + if (UseStyle.useBetaStyle()) { + final SName sname = dotData.getUmlDiagramType().getStyleName(); + final Style style = StyleSignature.of(SName.root, SName.element, sname, SName.title) // + .with(g.getStereotype()) // + .with(g.getStereostyles()) // + .getMergedStyle(skinParam.getCurrentStyleBuilder()); + fontConfiguration = style.getFontConfiguration(skinParam.getThemeStyle(), skinParam.getIHtmlColorSet()); + } else + fontConfiguration = g.getFontConfigurationForTitle(skinParam); + final HorizontalAlignment alignment = HorizontalAlignment.CENTER; + return label.create(fontConfiguration, alignment, dotData.getSkinParam()); } private TextBlock addLegend(TextBlock original, DisplayPositionned legend) { diff --git a/src/net/sourceforge/plantuml/svek/GroupPngMakerState.java b/src/net/sourceforge/plantuml/svek/GroupPngMakerState.java index c477eb521..9d2465665 100644 --- a/src/net/sourceforge/plantuml/svek/GroupPngMakerState.java +++ b/src/net/sourceforge/plantuml/svek/GroupPngMakerState.java @@ -123,12 +123,12 @@ public final class GroupPngMakerState { return result; } - private Style getStyleHeader() { + private Style getStyleStateHeader() { return StyleSignature.of(SName.root, SName.element, SName.stateDiagram, SName.state, SName.header) .with(group.getStereotype()).getMergedStyle(diagram.getSkinParam().getCurrentStyleBuilder()); } - private Style getStyle() { + private Style getStyleState() { return StyleSignature.of(SName.root, SName.element, SName.stateDiagram, SName.state).with(group.getStereotype()) .getMergedStyle(diagram.getSkinParam().getCurrentStyleBuilder()); } @@ -138,11 +138,20 @@ public final class GroupPngMakerState { final ISkinParam skinParam = diagram.getSkinParam(); final FontConfiguration fontConfiguration; - if (UseStyle.useBetaStyle()) - fontConfiguration = getStyleHeader().getFontConfiguration(skinParam.getThemeStyle(), + final double rounded; + double shadowing = 0; + + if (UseStyle.useBetaStyle()) { + rounded = getStyleState().value(PName.RoundCorner).asDouble(); + shadowing = getStyleState().value(PName.Shadowing).asDouble(); + fontConfiguration = getStyleStateHeader().getFontConfiguration(skinParam.getThemeStyle(), skinParam.getIHtmlColorSet()); - else + } else { + rounded = IEntityImage.CORNER; fontConfiguration = new FontConfiguration(skinParam, FontParam.STATE, group.getStereotype()); + if (skinParam.shadowing(group.getStereotype())) + shadowing = 3.0; + } final TextBlock title = display.create(fontConfiguration, HorizontalAlignment.CENTER, diagram.getSkinParam()); @@ -171,7 +180,7 @@ public final class GroupPngMakerState { HColor borderColor = group.getColors(skinParam).getColor(ColorType.LINE); if (borderColor == null) { if (UseStyle.useBetaStyle()) - borderColor = getStyle().value(PName.LineColor).asColor(skinParam.getThemeStyle(), + borderColor = getStyleState().value(PName.LineColor).asColor(skinParam.getThemeStyle(), skinParam.getIHtmlColorSet()); else borderColor = getColor(ColorParam.stateBorder, group.getStereotype()); @@ -181,8 +190,10 @@ public final class GroupPngMakerState { final HColor backColor; if (tmp == null) if (UseStyle.useBetaStyle()) - backColor = getStyle().value(PName.BackGroundColor).asColor(skinParam.getThemeStyle(), - skinParam.getIHtmlColorSet()); + backColor = + + getStyleState().value(PName.BackGroundColor).asColor(skinParam.getThemeStyle(), + skinParam.getIHtmlColorSet()); else backColor = getColor(ColorParam.stateBackground, stereo); else @@ -200,8 +211,8 @@ public final class GroupPngMakerState { if (stroke == null) { stroke = new UStroke(1.5); } - return new InnerStateAutonom(image, title, attribute, borderColor, backColor, - skinParam.shadowing(group.getStereotype()), group.getUrl99(), withSymbol, stroke); + return new InnerStateAutonom(image, title, attribute, borderColor, backColor, group.getUrl99(), withSymbol, + stroke, rounded, shadowing); } diff --git a/src/net/sourceforge/plantuml/svek/InnerStateAutonom.java b/src/net/sourceforge/plantuml/svek/InnerStateAutonom.java index ce53c7577..0a02a5f5e 100644 --- a/src/net/sourceforge/plantuml/svek/InnerStateAutonom.java +++ b/src/net/sourceforge/plantuml/svek/InnerStateAutonom.java @@ -55,13 +55,14 @@ public final class InnerStateAutonom extends AbstractTextBlock implements IEntit private final TextBlock attribute; private final HColor borderColor; private final HColor backColor; - private final boolean shadowing; private final Url url; private final boolean withSymbol; private final UStroke stroke; + private final double rounded; + private final double shadowing; - public InnerStateAutonom(final IEntityImage im, final TextBlock title, TextBlock attribute, HColor borderColor, - HColor backColor, boolean shadowing, Url url, boolean withSymbol, UStroke stroke) { + public InnerStateAutonom(IEntityImage im, TextBlock title, TextBlock attribute, HColor borderColor, + HColor backColor, Url url, boolean withSymbol, UStroke stroke, double rounded, double shadowing) { this.im = im; this.withSymbol = withSymbol; this.title = title; @@ -71,6 +72,7 @@ public final class InnerStateAutonom extends AbstractTextBlock implements IEntit this.attribute = attribute; this.url = url; this.stroke = stroke; + this.rounded = rounded; } public void drawU(UGraphic ug) { @@ -81,13 +83,13 @@ public final class InnerStateAutonom extends AbstractTextBlock implements IEntit final double titreHeight = IEntityImage.MARGIN + text.getHeight() + IEntityImage.MARGIN_LINE; final RoundedContainer r = new RoundedContainer(total, titreHeight, attr.getHeight() + marginForFields, - borderColor, backColor, im.getBackcolor(), stroke); + borderColor, backColor, im.getBackcolor(), stroke, rounded, shadowing); if (url != null) { ug.startUrl(url); } - r.drawU(ug, shadowing); + r.drawU(ug); title.drawU(ug.apply(new UTranslate((total.getWidth() - text.getWidth()) / 2, IEntityImage.MARGIN))); attribute.drawU(ug.apply( new UTranslate(0 + IEntityImage.MARGIN, IEntityImage.MARGIN + text.getHeight() + IEntityImage.MARGIN))); diff --git a/src/net/sourceforge/plantuml/svek/RoundedContainer.java b/src/net/sourceforge/plantuml/svek/RoundedContainer.java index 8c87e5c29..dc9644a7a 100644 --- a/src/net/sourceforge/plantuml/svek/RoundedContainer.java +++ b/src/net/sourceforge/plantuml/svek/RoundedContainer.java @@ -53,12 +53,15 @@ public final class RoundedContainer { private final HColor backColor; private final HColor imgBackcolor; private final UStroke stroke; + private final double rounded; + private final double shadowing; public RoundedContainer(Dimension2D dim, double titleHeight, double attributeHeight, HColor borderColor, - HColor backColor, HColor imgBackcolor, UStroke stroke) { + HColor backColor, HColor imgBackcolor, UStroke stroke, double rounded, double shadowing) { if (dim.getWidth() == 0) { throw new IllegalArgumentException(); } + this.rounded = rounded; this.dim = dim; this.imgBackcolor = imgBackcolor; this.titleHeight = titleHeight; @@ -66,15 +69,13 @@ public final class RoundedContainer { this.backColor = backColor; this.attributeHeight = attributeHeight; this.stroke = stroke; + this.shadowing = shadowing; } - public void drawU(UGraphic ug, boolean shadowing) { - + public void drawU(UGraphic ug) { ug = ug.apply(backColor.bg()).apply(borderColor); - final URectangle rect = new URectangle(dim.getWidth(), dim.getHeight()).rounded(IEntityImage.CORNER); - if (shadowing) { - rect.setDeltaShadow(3.0); - } + final URectangle rect = new URectangle(dim.getWidth(), dim.getHeight()).rounded(rounded); + rect.setDeltaShadow(shadowing); ug.apply(stroke).draw(rect); final double yLine = titleHeight + attributeHeight; @@ -84,9 +85,8 @@ public final class RoundedContainer { final double thickness = stroke.getThickness(); final URectangle inner = new URectangle(dim.getWidth() - 4 * thickness, - dim.getHeight() - titleHeight - 4 * thickness - attributeHeight).rounded(IEntityImage.CORNER); - ug.apply(imgBackcolor).apply(new UTranslate(2 * thickness, yLine + 2 * thickness)) - .draw(inner); + dim.getHeight() - titleHeight - 4 * thickness - attributeHeight).rounded(rounded); + ug.apply(imgBackcolor).apply(new UTranslate(2 * thickness, yLine + 2 * thickness)).draw(inner); if (titleHeight > 0) { ug.apply(stroke).apply(UTranslate.dy(yLine)).draw(ULine.hline(dim.getWidth())); diff --git a/src/net/sourceforge/plantuml/svek/image/EntityImageClass.java b/src/net/sourceforge/plantuml/svek/image/EntityImageClass.java index a4719d27a..d56107446 100644 --- a/src/net/sourceforge/plantuml/svek/image/EntityImageClass.java +++ b/src/net/sourceforge/plantuml/svek/image/EntityImageClass.java @@ -93,7 +93,10 @@ public class EntityImageClass extends AbstractEntityImage implements Stencil, Wi super(entity, entity.getColors(skinParam).mute(skinParam)); this.leafType = entity.getLeafType(); this.lineConfig = entity; - this.roundCorner = getSkinParam().getRoundCorner(CornerParam.DEFAULT, null); + if (UseStyle.useBetaStyle()) + this.roundCorner = getStyle().value(PName.RoundCorner).asDouble(); + else + this.roundCorner = getSkinParam().getRoundCorner(CornerParam.DEFAULT, null); this.shield = version != null && version.useShield() && entity.hasNearDecoration() ? Margins.uniform(16) : Margins.NONE; final boolean showMethods = portionShower.showPortion(EntityPortion.METHOD, entity); @@ -101,7 +104,7 @@ public class EntityImageClass extends AbstractEntityImage implements Stencil, Wi this.body = entity.getBodier().getBody(FontParam.CLASS_ATTRIBUTE, getSkinParam(), showMethods, showFields, entity.getStereotype(), getStyle()); - header = new EntityImageClassHeader(entity, getSkinParam(), portionShower); + this.header = new EntityImageClassHeader(entity, getSkinParam(), portionShower); this.url = entity.getUrl99(); } @@ -143,8 +146,10 @@ public class EntityImageClass extends AbstractEntityImage implements Stencil, Wi } private Style getStyle() { - return StyleSignature.of(SName.root, SName.element, SName.classDiagram, SName.class_) - .with(getEntity().getStereotype()).getMergedStyle(getSkinParam().getCurrentStyleBuilder()); + return StyleSignature.of(SName.root, SName.element, SName.classDiagram, SName.class_) // + .with(getEntity().getStereotype()) // + .with(getEntity().getStereostyles()) // + .getMergedStyle(getSkinParam().getCurrentStyleBuilder()); } private void drawInternal(UGraphic ug) { diff --git a/src/net/sourceforge/plantuml/svek/image/EntityImageClassHeader.java b/src/net/sourceforge/plantuml/svek/image/EntityImageClassHeader.java index c9583be94..7ffa4a4d8 100644 --- a/src/net/sourceforge/plantuml/svek/image/EntityImageClassHeader.java +++ b/src/net/sourceforge/plantuml/svek/image/EntityImageClassHeader.java @@ -86,7 +86,9 @@ public class EntityImageClassHeader extends AbstractEntityImage { if (UseStyle.useBetaStyle()) { final Style style = StyleSignature - .of(SName.root, SName.element, SName.classDiagram, SName.class_, SName.header).with(stereotype) + .of(SName.root, SName.element, SName.classDiagram, SName.class_, SName.header) // + .with(stereotype) // + .with(entity.getStereostyles()) // .getMergedStyle(skinParam.getCurrentStyleBuilder()); fontConfigurationName = new FontConfiguration(skinParam, style); } else { diff --git a/src/net/sourceforge/plantuml/svek/image/EntityImageDescription.java b/src/net/sourceforge/plantuml/svek/image/EntityImageDescription.java index ab09592a8..33c8ebe76 100644 --- a/src/net/sourceforge/plantuml/svek/image/EntityImageDescription.java +++ b/src/net/sourceforge/plantuml/svek/image/EntityImageDescription.java @@ -146,7 +146,7 @@ public class EntityImageDescription extends AbstractEntityImage { symbol.getSkinParameter().getStyleName()); style = tmp.with(stereotype).getMergedStyle(getSkinParam().getCurrentStyleBuilder()); style = style.eventuallyOverride(colors); - final Style styleStereo = tmp.withStereotype(stereotype) + final Style styleStereo = tmp.forStereotypeItself(stereotype) .getMergedStyle(getSkinParam().getCurrentStyleBuilder()); forecolor = style.value(PName.LineColor).asColor(getSkinParam().getThemeStyle(), getSkinParam().getIHtmlColorSet()); diff --git a/src/net/sourceforge/plantuml/svek/image/EntityImageState.java b/src/net/sourceforge/plantuml/svek/image/EntityImageState.java index 328193103..ee6e27d32 100644 --- a/src/net/sourceforge/plantuml/svek/image/EntityImageState.java +++ b/src/net/sourceforge/plantuml/svek/image/EntityImageState.java @@ -83,7 +83,7 @@ public class EntityImageState extends EntityImageStateCommon { final FontConfiguration fontConfiguration; if (UseStyle.useBetaStyle()) - fontConfiguration = getStyleMember().getFontConfiguration(getSkinParam().getThemeStyle(), + fontConfiguration = getStyleState().getFontConfiguration(getSkinParam().getThemeStyle(), getSkinParam().getIHtmlColorSet()); else fontConfiguration = new FontConfiguration(getSkinParam(), FontParam.STATE_ATTRIBUTE, stereotype); diff --git a/src/net/sourceforge/plantuml/svek/image/EntityImageStateCommon.java b/src/net/sourceforge/plantuml/svek/image/EntityImageStateCommon.java index b0598a3c4..2cc1e4b7e 100644 --- a/src/net/sourceforge/plantuml/svek/image/EntityImageStateCommon.java +++ b/src/net/sourceforge/plantuml/svek/image/EntityImageStateCommon.java @@ -78,7 +78,7 @@ public abstract class EntityImageStateCommon extends AbstractEntityImage { final FontConfiguration fontConfiguration; if (UseStyle.useBetaStyle()) - fontConfiguration = getStyleHeader().getFontConfiguration(getSkinParam().getThemeStyle(), + fontConfiguration = getStyleStateHeader().getFontConfiguration(getSkinParam().getThemeStyle(), getSkinParam().getIHtmlColorSet()); else fontConfiguration = new FontConfiguration(getSkinParam(), FontParam.STATE, stereotype); @@ -89,12 +89,12 @@ public abstract class EntityImageStateCommon extends AbstractEntityImage { } - final protected Style getStyleHeader() { + private Style getStyleStateHeader() { return StyleSignature.of(SName.root, SName.element, SName.stateDiagram, SName.state, SName.header) .with(getEntity().getStereotype()).getMergedStyle(getSkinParam().getCurrentStyleBuilder()); } - final protected Style getStyleMember() { + final protected Style getStyleState() { return StyleSignature.of(SName.root, SName.element, SName.stateDiagram, SName.state) .with(getEntity().getStereotype()).getMergedStyle(getSkinParam().getCurrentStyleBuilder()); } @@ -112,10 +112,19 @@ public abstract class EntityImageStateCommon extends AbstractEntityImage { } final protected URectangle getShape(final Dimension2D dimTotal) { - final URectangle rect = new URectangle(dimTotal).rounded(CORNER); - if (getSkinParam().shadowing(getEntity().getStereotype())) { - rect.setDeltaShadow(4); + double deltaShadow = 0; + final double corner; + if (UseStyle.useBetaStyle()) { + corner = getStyleState().value(PName.RoundCorner).asDouble(); + deltaShadow = getStyleState().value(PName.Shadowing).asDouble(); + } else { + corner = CORNER; + if (getSkinParam().shadowing(getEntity().getStereotype())) + deltaShadow = 4; } + + final URectangle rect = new URectangle(dimTotal).rounded(corner); + rect.setDeltaShadow(deltaShadow); return rect; } @@ -124,7 +133,7 @@ public abstract class EntityImageStateCommon extends AbstractEntityImage { HColor classBorder = lineConfig.getColors(getSkinParam()).getColor(ColorType.LINE); if (classBorder == null) { if (UseStyle.useBetaStyle()) - classBorder = getStyleMember().value(PName.LineColor).asColor(getSkinParam().getThemeStyle(), + classBorder = getStyleState().value(PName.LineColor).asColor(getSkinParam().getThemeStyle(), getSkinParam().getIHtmlColorSet()); else classBorder = SkinParamUtils.getColor(getSkinParam(), getStereo(), ColorParam.stateBorder); @@ -133,7 +142,7 @@ public abstract class EntityImageStateCommon extends AbstractEntityImage { HColor backcolor = getEntity().getColors(getSkinParam()).getColor(ColorType.BACK); if (backcolor == null) { if (UseStyle.useBetaStyle()) - backcolor = getStyleMember().value(PName.BackGroundColor).asColor(getSkinParam().getThemeStyle(), + backcolor = getStyleState().value(PName.BackGroundColor).asColor(getSkinParam().getThemeStyle(), getSkinParam().getIHtmlColorSet()); else backcolor = SkinParamUtils.getColor(getSkinParam(), getStereo(), ColorParam.stateBackground); diff --git a/src/net/sourceforge/plantuml/version/Version.java b/src/net/sourceforge/plantuml/version/Version.java index af994b4a6..fa207b62b 100644 --- a/src/net/sourceforge/plantuml/version/Version.java +++ b/src/net/sourceforge/plantuml/version/Version.java @@ -80,7 +80,7 @@ public class Version { } public static int beta() { - final int beta = 0; + final int beta = 3; return beta; }