diff --git a/pom.xml b/pom.xml new file mode 100644 index 000000000..df51959cf --- /dev/null +++ b/pom.xml @@ -0,0 +1,187 @@ + + + + 4.0.0 + + net.sourceforge.plantuml + plantuml + 1.0.6035-SNAPSHOT + jar + + PlantUML + + PlantUML is a component that allows to quickly write : + * sequence diagram, + * use case diagram, + * class diagram, + * activity diagram, + * component diagram, + * state diagram + * object diagram + + http://plantuml.sourceforge.net + + + org.sonatype.oss + oss-parent + 5 + + + + + org.apache.ant + ant + 1.8.1 + provided + + + + + + The GNU General Public License + http://www.gnu.org/licenses/gpl.txt + repo + + + + + http://plantuml.svn.sourceforge.net/viewvc/plantuml + https://plantuml.svn.sourceforge.net/svnroot/plantuml + + + + Sourceforge + http://sourceforge.net/tracker/?group_id=259736 + + + + + arnaud.roques + Arnaud Roques + plantuml@gmail.com + + + + + ${project.basedir}/src + + + ${project.basedir}/src + + net/sourceforge/plantuml/version/logo.png + + + + + + maven-compiler-plugin + 2.3.2 + + 1.5 + 1.5 + false + + + + maven-source-plugin + + + attach-sources + + jar + + + + + + maven-javadoc-plugin + + + attach-javadocs + + jar + + + + + + maven-jar-plugin + + + + net.sourceforge.plantuml.Run + + + + + + maven-release-plugin + 2.1 + + forked-path + + + + + + + + release-sign-artifacts + + + performRelease + true + + + + + + maven-gpg-plugin + 1.1 + + + sign-artifacts + verify + + sign + + + + + + + + + + diff --git a/src/net/sourceforge/plantuml/AbstractPSystem.java b/src/net/sourceforge/plantuml/AbstractPSystem.java index 0ebf56725..270a4d5d2 100644 --- a/src/net/sourceforge/plantuml/AbstractPSystem.java +++ b/src/net/sourceforge/plantuml/AbstractPSystem.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5520 $ + * Revision $Revision: 6002 $ * */ package net.sourceforge.plantuml; @@ -77,5 +77,5 @@ public abstract class AbstractPSystem implements PSystem { public int getNbImages() { return 1; } - + } diff --git a/src/net/sourceforge/plantuml/ErrorUml.java b/src/net/sourceforge/plantuml/ErrorUml.java index d93f1a6dd..951ad25d9 100644 --- a/src/net/sourceforge/plantuml/ErrorUml.java +++ b/src/net/sourceforge/plantuml/ErrorUml.java @@ -60,12 +60,12 @@ class ErrorUml { @Override public int hashCode() { - return error.hashCode() + type.hashCode() + position; + return error.hashCode() + type.hashCode() + position + (suggest == null ? 0 : suggest.hashCode()); } @Override public String toString() { - return type.toString() + " " + position + " " + error; + return type.toString() + " " + position + " " + error + " " + suggest; } public final String getError() { diff --git a/src/net/sourceforge/plantuml/OptionFlags.java b/src/net/sourceforge/plantuml/OptionFlags.java index 73917cf88..00d43a03e 100644 --- a/src/net/sourceforge/plantuml/OptionFlags.java +++ b/src/net/sourceforge/plantuml/OptionFlags.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5974 $ + * Revision $Revision: 5977 $ * */ package net.sourceforge.plantuml; @@ -36,7 +36,7 @@ package net.sourceforge.plantuml; public class OptionFlags { static public final boolean PBBACK = false; - static public final boolean SUGGEST = false; + static public final boolean SUGGEST = true; void reset() { keepTmpFiles = false; diff --git a/src/net/sourceforge/plantuml/OptionPrint.java b/src/net/sourceforge/plantuml/OptionPrint.java index 00b4c66f0..37d1dab4f 100644 --- a/src/net/sourceforge/plantuml/OptionPrint.java +++ b/src/net/sourceforge/plantuml/OptionPrint.java @@ -28,17 +28,14 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5211 $ + * Revision $Revision: 6007 $ * */ package net.sourceforge.plantuml; import java.io.File; import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.Collections; import java.util.Date; -import java.util.List; import java.util.Properties; import net.sourceforge.plantuml.cucadiagram.dot.GraphvizUtils; @@ -47,53 +44,12 @@ import net.sourceforge.plantuml.version.Version; public class OptionPrint { static public void printTestDot() throws InterruptedException { - for (String s : getTestDotStrings()) { + for (String s : GraphvizUtils.getTestDotStrings(false)) { System.err.println(s); } exit(); } - static public List getTestDotStrings() { - final List result = new ArrayList(); - final String ent = GraphvizUtils.getenvGraphvizDot(); - if (ent == null) { - result.add("The environment variable GRAPHVIZ_DOT has not been set"); - } else { - result.add("The environment variable GRAPHVIZ_DOT has been set to " + ent); - } - final File dotExe = GraphvizUtils.getDotExe(); - result.add("Dot executable is " + dotExe); - - boolean ok = true; - if (dotExe == null) { - result.add("Error: No dot executable found"); - ok = false; - } else if (dotExe.exists() == false) { - result.add("Error: file does not exist"); - ok = false; - } else if (dotExe.isFile() == false) { - result.add("Error: not a valid file"); - ok = false; - } else if (dotExe.canRead() == false) { - result.add("Error: cannot be read"); - ok = false; - } - - if (ok) { - try { - final String version = GraphvizUtils.dotVersion(); - result.add("Dot version: " + version); - result.add("Installation seems OK"); - } catch (Exception e) { - e.printStackTrace(); - } - } else { - result.add("Error: only sequence diagrams will be generated"); - } - - return Collections.unmodifiableList(result); - } - static public void printHelp() throws InterruptedException { final String charset = Charset.defaultCharset().displayName(); diff --git a/src/net/sourceforge/plantuml/PSystemError.java b/src/net/sourceforge/plantuml/PSystemError.java index 830bacb9e..ab0a57252 100644 --- a/src/net/sourceforge/plantuml/PSystemError.java +++ b/src/net/sourceforge/plantuml/PSystemError.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5971 $ + * Revision $Revision: 5999 $ */ package net.sourceforge.plantuml; @@ -132,9 +132,13 @@ public class PSystemError extends AbstractPSystem { underscore.append("^"); } plainStrings.add(underscore.toString()); + final Collection textErrors = new LinkedHashSet(); for (ErrorUml er : printedErrors) { - htmlStrings.add(" " + er.getError()); - plainStrings.add(" " + er.getError()); + textErrors.add(er.getError()); + } + for (String er : textErrors) { + htmlStrings.add(" " + er); + plainStrings.add(" " + er); } boolean suggested = false; for (ErrorUml er : printedErrors) { diff --git a/src/net/sourceforge/plantuml/PSystemSingleBuilder.java b/src/net/sourceforge/plantuml/PSystemSingleBuilder.java index c228387ec..621f12d01 100644 --- a/src/net/sourceforge/plantuml/PSystemSingleBuilder.java +++ b/src/net/sourceforge/plantuml/PSystemSingleBuilder.java @@ -39,6 +39,7 @@ import java.util.Arrays; import java.util.Iterator; import java.util.List; +import net.sourceforge.plantuml.command.AbstractUmlSystemCommandFactory; import net.sourceforge.plantuml.command.Command; import net.sourceforge.plantuml.command.CommandControl; import net.sourceforge.plantuml.command.CommandExecutionResult; @@ -76,7 +77,9 @@ final public class PSystemSingleBuilder { throw new UnsupportedOperationException(); } - if (systemFactory instanceof PSystemCommandFactory) { + if (s.isEmpty()) { + sys = buildEmptyError(); + } else if (systemFactory instanceof PSystemCommandFactory) { executeUmlCommand((PSystemCommandFactory) systemFactory); } else if (systemFactory instanceof PSystemBasicFactory) { executeUmlBasic((PSystemBasicFactory) systemFactory); @@ -89,7 +92,8 @@ final public class PSystemSingleBuilder { final String s = next(); if (BlockUmlBuilder.isArobaseEnduml(s)) { if (source.getSize() == 2) { - sys = buildEmptyError(source); + assert false; + sys = buildEmptyError(); } else { sys = (AbstractPSystem) systemFactory.getSystem(); } @@ -109,9 +113,16 @@ final public class PSystemSingleBuilder { sys.setSource(source); } - private PSystemError buildEmptyError(UmlSource source) { + private PSystemError buildEmptyError() { final PSystemError result = new PSystemError(source, new ErrorUml(ErrorUmlType.SYNTAX_ERROR, "Empty description", 1)); + result.setSource(source); + return result; + } + + private PSystemError buildEmptyError(String err) { + final PSystemError result = new PSystemError(source, new ErrorUml(ErrorUmlType.EXECUTION_ERROR, err, 1)); + result.setSource(source); return result; } @@ -120,8 +131,13 @@ final public class PSystemSingleBuilder { while (hasNext()) { final String s = next(); if (BlockUmlBuilder.isArobaseEnduml(s)) { + final String err = ((AbstractUmlSystemCommandFactory) systemFactory).checkFinalError(); + if (err != null) { + sys = buildEmptyError(err); + } if (source.getSize() == 2) { - sys = buildEmptyError(source); + assert false; + sys = buildEmptyError(); } else { sys = (AbstractPSystem) systemFactory.getSystem(); } diff --git a/src/net/sourceforge/plantuml/SkinParam.java b/src/net/sourceforge/plantuml/SkinParam.java index 26171e852..3be8dd19a 100644 --- a/src/net/sourceforge/plantuml/SkinParam.java +++ b/src/net/sourceforge/plantuml/SkinParam.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5845 $ + * Revision $Revision: 5983 $ * */ package net.sourceforge.plantuml; @@ -72,7 +72,7 @@ public class SkinParam implements ISkinParam { public HtmlColor getBackgroundColor() { final HtmlColor result = getHtmlColor(ColorParam.background, null); if (result == null) { - return new HtmlColor("white"); + return HtmlColor.getColorIfValid("white"); } return result; } @@ -101,14 +101,14 @@ public class SkinParam implements ISkinParam { checkStereotype(stereotype); final String value2 = getValue(param.name() + "color" + stereotype); if (value2 != null && HtmlColor.isValid(value2)) { - return new HtmlColor(value2); + return HtmlColor.getColorIfValid(value2); } } final String value = getValue(param.name() + "color"); if (value == null || HtmlColor.isValid(value) == false) { return null; } - return new HtmlColor(value); + return HtmlColor.getColorIfValid(value); } private void checkStereotype(String stereotype) { @@ -172,7 +172,7 @@ public class SkinParam implements ISkinParam { if (value == null || HtmlColor.isValid(value) == false) { value = param.getDefaultColor(); } - return new HtmlColor(value); + return HtmlColor.getColorIfValid(value); } public int getFontStyle(FontParam param, String stereotype) { diff --git a/src/net/sourceforge/plantuml/UmlSource.java b/src/net/sourceforge/plantuml/UmlSource.java index d1e3f779f..1c422c688 100644 --- a/src/net/sourceforge/plantuml/UmlSource.java +++ b/src/net/sourceforge/plantuml/UmlSource.java @@ -80,4 +80,19 @@ final public class UmlSource { return source.size(); } + public boolean isEmpty() { + for (String s : source) { + if (BlockUmlBuilder.isArobaseStartuml(s)) { + continue; + } + if (BlockUmlBuilder.isArobaseEnduml(s)) { + continue; + } + if (s.trim().length() != 0) { + return false; + } + } + return true; + } + } diff --git a/src/net/sourceforge/plantuml/activitydiagram/command/CommandEndif.java b/src/net/sourceforge/plantuml/activitydiagram/command/CommandEndif.java index 7b0b7acdd..ae51eec5b 100644 --- a/src/net/sourceforge/plantuml/activitydiagram/command/CommandEndif.java +++ b/src/net/sourceforge/plantuml/activitydiagram/command/CommandEndif.java @@ -42,7 +42,7 @@ import net.sourceforge.plantuml.command.SingleLineCommand; public class CommandEndif extends SingleLineCommand { public CommandEndif(ActivityDiagram diagram) { - super(diagram, "(?i)^endif$"); + super(diagram, "(?i)^end ?if$"); } @Override diff --git a/src/net/sourceforge/plantuml/activitydiagram/command/CommandPartition.java b/src/net/sourceforge/plantuml/activitydiagram/command/CommandPartition.java index f2379baea..0cee587aa 100644 --- a/src/net/sourceforge/plantuml/activitydiagram/command/CommandPartition.java +++ b/src/net/sourceforge/plantuml/activitydiagram/command/CommandPartition.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5048 $ + * Revision $Revision: 5983 $ * */ package net.sourceforge.plantuml.activitydiagram.command; @@ -57,7 +57,7 @@ public class CommandPartition extends SingleLineCommand { p.setBold(true); final String color = arg.get(1); if (color != null) { - p.setBackColor(new HtmlColor(color)); + p.setBackColor(HtmlColor.getColorIfValid(color)); } return CommandExecutionResult.ok(); } diff --git a/src/net/sourceforge/plantuml/activitydiagram2/ActivityDiagram2.java b/src/net/sourceforge/plantuml/activitydiagram2/ActivityDiagram2.java index 7a7b315ad..b251d32f3 100644 --- a/src/net/sourceforge/plantuml/activitydiagram2/ActivityDiagram2.java +++ b/src/net/sourceforge/plantuml/activitydiagram2/ActivityDiagram2.java @@ -36,7 +36,11 @@ package net.sourceforge.plantuml.activitydiagram2; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; import java.util.List; +import java.util.Map; import net.sourceforge.plantuml.Direction; import net.sourceforge.plantuml.UmlDiagramType; @@ -51,10 +55,13 @@ import net.sourceforge.plantuml.cucadiagram.LinkType; public class ActivityDiagram2 extends CucaDiagram { - private Collection last2 = new ArrayList(); + private Collection waitings = new ArrayList(); private ConditionalContext2 currentContext; private int futureLength = 2; + private final Collection pendingLabels = new HashSet(); + private final Map labels = new HashMap(); + final protected List getDotStrings() { return Arrays.asList("nodesep=.20;", "ranksep=0.4;", "edge [fontsize=11,labelfontsize=11];", "node [fontsize=11];"); @@ -69,16 +76,26 @@ public class ActivityDiagram2 extends CucaDiagram { return UmlDiagramType.ACTIVITY; } + public boolean isReachable() { + return waitings.size() > 0; + } + public void newActivity(String display) { - if (last2.size() == 0) { + if (waitings.size() == 0) { throw new IllegalStateException(); } final Entity act = createEntity(getAutoCode(), display, EntityType.ACTIVITY); - for (IEntity last : this.last2) { + for (IEntity last : this.waitings) { this.addLink(new Link(last, act, new LinkType(LinkDecor.ARROW, LinkDecor.NONE), null, futureLength)); } - this.last2.clear(); - this.last2.add(act); + + for (String p : pendingLabels) { + labels.put(p, act); + } + pendingLabels.clear(); + + this.waitings.clear(); + this.waitings.add(act); this.futureLength = 2; } @@ -88,36 +105,61 @@ public class ActivityDiagram2 extends CucaDiagram { } public void start() { - if (last2.size() != 0) { + if (waitings.size() != 0) { throw new IllegalStateException(); } - this.last2.add(createEntity("start", "start", EntityType.CIRCLE_START)); + this.waitings.add(createEntity("start", "start", EntityType.CIRCLE_START)); } public void startIf(String test) { final IEntity br = createEntity(getAutoCode(), "", EntityType.BRANCH); currentContext = new ConditionalContext2(currentContext, br, Direction.DOWN); - for (IEntity last : this.last2) { + for (IEntity last : this.waitings) { this.addLink(new Link(last, br, new LinkType(LinkDecor.ARROW, LinkDecor.NONE), null, futureLength)); } - this.last2.clear(); - this.last2.add(br); - this.futureLength = 1; + this.waitings.clear(); + this.waitings.add(br); + this.futureLength = 2; } public Collection getLastEntityConsulted2() { - return this.last2; + return this.waitings; } public void endif() { - this.last2.add(currentContext.getPending()); + this.waitings.add(currentContext.getPending()); currentContext = currentContext.getParent(); } public void else2() { - this.currentContext.setPending(this.last2.iterator().next()); - this.last2.clear(); - this.last2.add(currentContext.getBranch()); + this.currentContext.setPending(this.waitings.iterator().next()); + this.waitings.clear(); + this.waitings.add(currentContext.getBranch()); } + public void label(String label) { + pendingLabels.add(label); + for (final Iterator it = pendingLinks.iterator(); it.hasNext();) { + final PendingLink pending = it.next(); + if (pending.getLabel().equals(label)) { + waitings.add(pending.getEntityFrom()); + it.remove(); + } + } + } + + private final Collection pendingLinks = new ArrayList(); + + public void callGoto(String label) { + final IEntity dest = labels.get(label); + for (IEntity last : this.waitings) { + if (dest == null) { + this.pendingLinks.add(new PendingLink(last, label)); + + } else { + this.addLink(new Link(last, dest, new LinkType(LinkDecor.ARROW, LinkDecor.NONE), null, futureLength)); + } + } + this.waitings.clear(); + } } diff --git a/src/net/sourceforge/plantuml/activitydiagram2/ActivityDiagramFactory2.java b/src/net/sourceforge/plantuml/activitydiagram2/ActivityDiagramFactory2.java index bdedc8fac..97df5c28a 100644 --- a/src/net/sourceforge/plantuml/activitydiagram2/ActivityDiagramFactory2.java +++ b/src/net/sourceforge/plantuml/activitydiagram2/ActivityDiagramFactory2.java @@ -35,9 +35,11 @@ package net.sourceforge.plantuml.activitydiagram2; import net.sourceforge.plantuml.activitydiagram2.command.CommandElse2; import net.sourceforge.plantuml.activitydiagram2.command.CommandEndif2; +import net.sourceforge.plantuml.activitydiagram2.command.CommandGoto2; import net.sourceforge.plantuml.activitydiagram2.command.CommandIf2; -import net.sourceforge.plantuml.activitydiagram2.command.CommandNewActivity; -import net.sourceforge.plantuml.activitydiagram2.command.CommandStart; +import net.sourceforge.plantuml.activitydiagram2.command.CommandLabel2; +import net.sourceforge.plantuml.activitydiagram2.command.CommandNewActivity2; +import net.sourceforge.plantuml.activitydiagram2.command.CommandStart2; import net.sourceforge.plantuml.command.AbstractUmlSystemCommandFactory; public class ActivityDiagramFactory2 extends AbstractUmlSystemCommandFactory { @@ -53,11 +55,13 @@ public class ActivityDiagramFactory2 extends AbstractUmlSystemCommandFactory { system = new ActivityDiagram2(); addCommonCommands(system); - addCommand(new CommandStart(system)); - addCommand(new CommandNewActivity(system)); + addCommand(new CommandStart2(system)); + addCommand(new CommandNewActivity2(system)); addCommand(new CommandIf2(system)); addCommand(new CommandEndif2(system)); addCommand(new CommandElse2(system)); + addCommand(new CommandLabel2(system)); + addCommand(new CommandGoto2(system)); // addCommand(new CommandLinkActivity(system)); // addCommand(new CommandPartition(system)); diff --git a/src/net/sourceforge/plantuml/activitydiagram2/ConditionalContext2.java b/src/net/sourceforge/plantuml/activitydiagram2/ConditionalContext2.java index 2da4e4837..904c6791f 100644 --- a/src/net/sourceforge/plantuml/activitydiagram2/ConditionalContext2.java +++ b/src/net/sourceforge/plantuml/activitydiagram2/ConditionalContext2.java @@ -33,10 +33,6 @@ */ package net.sourceforge.plantuml.activitydiagram2; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; - import net.sourceforge.plantuml.Direction; import net.sourceforge.plantuml.cucadiagram.EntityType; import net.sourceforge.plantuml.cucadiagram.IEntity; @@ -47,7 +43,7 @@ public class ConditionalContext2 { private final IEntity branch; private final Direction direction; private final ConditionalContext2 parent; - + public ConditionalContext2(ConditionalContext2 parent, IEntity branch, Direction direction) { if (branch.getType() != EntityType.BRANCH) { throw new IllegalArgumentException(); diff --git a/src/net/sourceforge/plantuml/activitydiagram2/PendingLink.java b/src/net/sourceforge/plantuml/activitydiagram2/PendingLink.java new file mode 100644 index 000000000..1ec02098f --- /dev/null +++ b/src/net/sourceforge/plantuml/activitydiagram2/PendingLink.java @@ -0,0 +1,56 @@ +/* ======================================================================== + * PlantUML : a free UML diagram generator + * ======================================================================== + * + * (C) Copyright 2009, Arnaud Roques + * + * Project Info: http://plantuml.sourceforge.net + * + * 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 Lesser 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. + * + * [Java is a trademark or registered trademark of Sun Microsystems, Inc. + * in the United States and other countries.] + * + * Original Author: Arnaud Roques + * + * Revision $Revision: 5721 $ + * + */ +package net.sourceforge.plantuml.activitydiagram2; + +import net.sourceforge.plantuml.cucadiagram.IEntity; + +public class PendingLink { + + private final IEntity entityFrom; + private final String label; + + public PendingLink(IEntity entityFrom, String label) { + this.entityFrom = entityFrom; + this.label = label; + } + + public final IEntity getEntityFrom() { + return entityFrom; + } + + public final String getLabel() { + return label; + } + +} diff --git a/src/net/sourceforge/plantuml/activitydiagram2/command/CommandGoto2.java b/src/net/sourceforge/plantuml/activitydiagram2/command/CommandGoto2.java new file mode 100644 index 000000000..e9cee3f9b --- /dev/null +++ b/src/net/sourceforge/plantuml/activitydiagram2/command/CommandGoto2.java @@ -0,0 +1,65 @@ +/* ======================================================================== + * PlantUML : a free UML diagram generator + * ======================================================================== + * + * (C) Copyright 2009, Arnaud Roques + * + * Project Info: http://plantuml.sourceforge.net + * + * 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 Lesser 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. + * + * [Java is a trademark or registered trademark of Sun Microsystems, Inc. + * in the United States and other countries.] + * + * Original Author: Arnaud Roques + * + * Revision $Revision: 4762 $ + * + */ +package net.sourceforge.plantuml.activitydiagram2.command; + +import java.util.Map; + +import net.sourceforge.plantuml.activitydiagram2.ActivityDiagram2; +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.RegexPartialMatch; + +public class CommandGoto2 extends SingleLineCommand2 { + + public CommandGoto2(ActivityDiagram2 diagram) { + super(diagram, getRegexConcat()); + } + + static RegexConcat getRegexConcat() { + return new RegexConcat(new RegexLeaf("^"), // + new RegexLeaf("goto\\s+"), // + new RegexLeaf("LABEL", "([\\p{L}0-9_.]+)"), // + new RegexLeaf(":?"), // + new RegexLeaf("$")); + } + + @Override + protected CommandExecutionResult executeArg(Map arg) { + getSystem().callGoto(arg.get("LABEL").get(0)); + return CommandExecutionResult.ok(); + } + +} diff --git a/src/net/sourceforge/plantuml/activitydiagram2/command/CommandIf2.java b/src/net/sourceforge/plantuml/activitydiagram2/command/CommandIf2.java index 0b1e3c95b..a8f01a794 100644 --- a/src/net/sourceforge/plantuml/activitydiagram2/command/CommandIf2.java +++ b/src/net/sourceforge/plantuml/activitydiagram2/command/CommandIf2.java @@ -52,7 +52,7 @@ public class CommandIf2 extends SingleLineCommand2 { return new RegexConcat(new RegexLeaf("^"), new RegexLeaf("if"), new RegexLeaf("\\s*"), - new RegexLeaf("TEST", "\"([^\"]+)\""), + new RegexLeaf("TEST", "[\"(](.+)[\")]"), new RegexLeaf("\\s*"), new RegexLeaf("(then)?"), new RegexLeaf("$")); diff --git a/src/net/sourceforge/plantuml/activitydiagram2/command/CommandLabel2.java b/src/net/sourceforge/plantuml/activitydiagram2/command/CommandLabel2.java new file mode 100644 index 000000000..afd4d92fd --- /dev/null +++ b/src/net/sourceforge/plantuml/activitydiagram2/command/CommandLabel2.java @@ -0,0 +1,65 @@ +/* ======================================================================== + * PlantUML : a free UML diagram generator + * ======================================================================== + * + * (C) Copyright 2009, Arnaud Roques + * + * Project Info: http://plantuml.sourceforge.net + * + * 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 Lesser 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. + * + * [Java is a trademark or registered trademark of Sun Microsystems, Inc. + * in the United States and other countries.] + * + * Original Author: Arnaud Roques + * + * Revision $Revision: 4762 $ + * + */ +package net.sourceforge.plantuml.activitydiagram2.command; + +import java.util.Map; + +import net.sourceforge.plantuml.activitydiagram2.ActivityDiagram2; +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.RegexPartialMatch; + +public class CommandLabel2 extends SingleLineCommand2 { + + public CommandLabel2(ActivityDiagram2 diagram) { + super(diagram, getRegexConcat()); + } + + static RegexConcat getRegexConcat() { + return new RegexConcat(new RegexLeaf("^"), + new RegexLeaf("LABEL", "([\\p{L}0-9_.]+)"), + new RegexLeaf(":"), + new RegexLeaf("$")); + } + + + @Override + protected CommandExecutionResult executeArg(Map arg) { + getSystem().label(arg.get("LABEL").get(0)); + return CommandExecutionResult.ok(); + } + +} diff --git a/src/net/sourceforge/plantuml/activitydiagram2/command/CommandNewActivity.java b/src/net/sourceforge/plantuml/activitydiagram2/command/CommandNewActivity2.java similarity index 86% rename from src/net/sourceforge/plantuml/activitydiagram2/command/CommandNewActivity.java rename to src/net/sourceforge/plantuml/activitydiagram2/command/CommandNewActivity2.java index b05d11e8f..29acecf2a 100644 --- a/src/net/sourceforge/plantuml/activitydiagram2/command/CommandNewActivity.java +++ b/src/net/sourceforge/plantuml/activitydiagram2/command/CommandNewActivity2.java @@ -39,10 +39,10 @@ import net.sourceforge.plantuml.activitydiagram2.ActivityDiagram2; import net.sourceforge.plantuml.command.CommandExecutionResult; import net.sourceforge.plantuml.command.SingleLineCommand; -public class CommandNewActivity extends SingleLineCommand { +public class CommandNewActivity2 extends SingleLineCommand { - public CommandNewActivity(ActivityDiagram2 diagram) { - super(diagram, "(?i)^\"([^\"]+)\"$"); + public CommandNewActivity2(ActivityDiagram2 diagram) { + super(diagram, "(?i)^[\"<](.+)[\">]$"); } @Override @@ -50,6 +50,11 @@ public class CommandNewActivity extends SingleLineCommand { if (getSystem().entities().size() == 0) { return CommandExecutionResult.error("Missing start keyword"); } + + if (getSystem().isReachable() == false) { + return CommandExecutionResult.error("Unreachable statement"); + } + getSystem().newActivity(arg.get(0)); return CommandExecutionResult.ok(); } diff --git a/src/net/sourceforge/plantuml/activitydiagram2/command/CommandStart.java b/src/net/sourceforge/plantuml/activitydiagram2/command/CommandStart2.java similarity index 93% rename from src/net/sourceforge/plantuml/activitydiagram2/command/CommandStart.java rename to src/net/sourceforge/plantuml/activitydiagram2/command/CommandStart2.java index 59ee8f750..803130cc4 100644 --- a/src/net/sourceforge/plantuml/activitydiagram2/command/CommandStart.java +++ b/src/net/sourceforge/plantuml/activitydiagram2/command/CommandStart2.java @@ -39,9 +39,9 @@ import net.sourceforge.plantuml.activitydiagram2.ActivityDiagram2; import net.sourceforge.plantuml.command.CommandExecutionResult; import net.sourceforge.plantuml.command.SingleLineCommand; -public class CommandStart extends SingleLineCommand { +public class CommandStart2 extends SingleLineCommand { - public CommandStart(ActivityDiagram2 diagram) { + public CommandStart2(ActivityDiagram2 diagram) { super(diagram, "(?i)^start$"); } diff --git a/src/net/sourceforge/plantuml/asciiart/TextSkin.java b/src/net/sourceforge/plantuml/asciiart/TextSkin.java index cb5b82f1c..1facd04d4 100644 --- a/src/net/sourceforge/plantuml/asciiart/TextSkin.java +++ b/src/net/sourceforge/plantuml/asciiart/TextSkin.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5941 $ + * Revision $Revision: 6008 $ * */ package net.sourceforge.plantuml.asciiart; @@ -64,7 +64,10 @@ public class TextSkin implements Skin { if (type.isArrow() && type.getArrowConfiguration().isSelfArrow()) { return new ComponentTextSelfArrow(type, stringsToDisplay, fileFormat); } - if (type == ComponentType.PARTICIPANT_LINE || type == ComponentType.ACTOR_LINE) { + if (type == ComponentType.PARTICIPANT_LINE) { + return new ComponentTextLine(fileFormat); + } + if (type == ComponentType.CONTINUE_LINE) { return new ComponentTextLine(fileFormat); } if (type == ComponentType.DELAY_LINE) { diff --git a/src/net/sourceforge/plantuml/classdiagram/command/CommandLinkClass2.java b/src/net/sourceforge/plantuml/classdiagram/command/CommandLinkClass2.java index b3b207fc7..2d938f2aa 100644 --- a/src/net/sourceforge/plantuml/classdiagram/command/CommandLinkClass2.java +++ b/src/net/sourceforge/plantuml/classdiagram/command/CommandLinkClass2.java @@ -39,7 +39,6 @@ import net.sourceforge.plantuml.Direction; import net.sourceforge.plantuml.FontParam; import net.sourceforge.plantuml.StringUtils; import net.sourceforge.plantuml.UmlDiagramType; -import net.sourceforge.plantuml.UniqueSequence; import net.sourceforge.plantuml.command.CommandExecutionResult; import net.sourceforge.plantuml.command.SingleLineCommand2; import net.sourceforge.plantuml.command.regex.RegexConcat; diff --git a/src/net/sourceforge/plantuml/classdiagram/command/CommandNamespace.java b/src/net/sourceforge/plantuml/classdiagram/command/CommandNamespace.java index 302e446e0..8abad3ac6 100644 --- a/src/net/sourceforge/plantuml/classdiagram/command/CommandNamespace.java +++ b/src/net/sourceforge/plantuml/classdiagram/command/CommandNamespace.java @@ -56,7 +56,7 @@ public class CommandNamespace extends SingleLineCommand { p.setBold(true); final String color = arg.get(1); if (color != null) { - p.setBackColor(new HtmlColor(color)); + p.setBackColor(HtmlColor.getColorIfValid(color)); } return CommandExecutionResult.ok(); } diff --git a/src/net/sourceforge/plantuml/code/ArobaseStringCompressor.java b/src/net/sourceforge/plantuml/code/ArobaseStringCompressor.java index ced002ccd..702734f16 100644 --- a/src/net/sourceforge/plantuml/code/ArobaseStringCompressor.java +++ b/src/net/sourceforge/plantuml/code/ArobaseStringCompressor.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 3827 $ + * Revision $Revision: 5980 $ * */ package net.sourceforge.plantuml.code; @@ -44,13 +44,31 @@ public class ArobaseStringCompressor implements StringCompressor { public String compress(String s) throws IOException { final Matcher m = p.matcher(s); if (m.find()) { - return m.group(2); + return clean(m.group(2)); } return ""; } - public String decompress(String stringAnnoted) throws IOException { - return stringAnnoted; + public String decompress(String s) throws IOException { + return clean(s); } + private String clean(String s) { + s = s.trim(); + s = clean1(s); + s = s.replaceAll("@enduml[^\\n\\r]*", ""); + s = s.replaceAll("@startuml[^\\n\\r]*", ""); + s = s.trim(); + return s; + } + + private String clean1(String s) { + final Matcher m = p.matcher(s); + if (m.matches()) { + return m.group(2); + } + return s; + } + + } \ No newline at end of file diff --git a/src/net/sourceforge/plantuml/command/AbstractUmlSystemCommandFactory.java b/src/net/sourceforge/plantuml/command/AbstractUmlSystemCommandFactory.java index 50a165eae..b2e069784 100644 --- a/src/net/sourceforge/plantuml/command/AbstractUmlSystemCommandFactory.java +++ b/src/net/sourceforge/plantuml/command/AbstractUmlSystemCommandFactory.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5764 $ + * Revision $Revision: 6002 $ * */ package net.sourceforge.plantuml.command; @@ -44,6 +44,10 @@ public abstract class AbstractUmlSystemCommandFactory implements PSystemCommandF reset(); } + public String checkFinalError() { + return null; + } + private List cmds = new ArrayList(); final public CommandControl isValid(List lines) { diff --git a/src/net/sourceforge/plantuml/command/CommandPackage.java b/src/net/sourceforge/plantuml/command/CommandPackage.java index 5d9bae12c..72ead852f 100644 --- a/src/net/sourceforge/plantuml/command/CommandPackage.java +++ b/src/net/sourceforge/plantuml/command/CommandPackage.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5536 $ + * Revision $Revision: 5983 $ * */ package net.sourceforge.plantuml.command; @@ -67,7 +67,7 @@ public class CommandPackage extends SingleLineCommand { p.setBold(true); final String color = arg.get(2); if (color != null) { - p.setBackColor(new HtmlColor(color)); + p.setBackColor(HtmlColor.getColorIfValid(color)); } return CommandExecutionResult.ok(); } diff --git a/src/net/sourceforge/plantuml/command/PSystemCommandFactory.java b/src/net/sourceforge/plantuml/command/PSystemCommandFactory.java index 7d1f56fc3..5de1a78ee 100644 --- a/src/net/sourceforge/plantuml/command/PSystemCommandFactory.java +++ b/src/net/sourceforge/plantuml/command/PSystemCommandFactory.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 3828 $ + * Revision $Revision: 6002 $ * */ package net.sourceforge.plantuml.command; @@ -42,4 +42,5 @@ public interface PSystemCommandFactory extends PSystemFactory { CommandControl isValid(List lines); Command createCommand(List lines); + } diff --git a/src/net/sourceforge/plantuml/cucadiagram/Link.java b/src/net/sourceforge/plantuml/cucadiagram/Link.java index 2a58ec3e0..8a1a15e86 100644 --- a/src/net/sourceforge/plantuml/cucadiagram/Link.java +++ b/src/net/sourceforge/plantuml/cucadiagram/Link.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5908 $ + * Revision $Revision: 6009 $ * */ package net.sourceforge.plantuml.cucadiagram; @@ -40,6 +40,7 @@ import java.util.Arrays; import net.sourceforge.plantuml.UniqueSequence; import net.sourceforge.plantuml.cucadiagram.dot.DrawFile; +import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.HorizontalAlignement; import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.TextBlock; @@ -272,8 +273,8 @@ public class Link implements Imaged { private double getQualifierMargin(StringBounder stringBounder, Font fontQualif, String qualif) { if (qualif != null) { - final TextBlock b = TextBlockUtils.create(Arrays.asList(qualif), fontQualif, Color.BLACK, - HorizontalAlignement.LEFT); + final TextBlock b = TextBlockUtils.create(Arrays.asList(qualif), new FontConfiguration(fontQualif, + Color.BLACK), HorizontalAlignement.LEFT); final Dimension2D dim = b.calculateDimension(stringBounder); return Math.max(dim.getWidth(), dim.getHeight()); } diff --git a/src/net/sourceforge/plantuml/cucadiagram/Stereotype.java b/src/net/sourceforge/plantuml/cucadiagram/Stereotype.java index 07542b6b5..8be7fab3f 100644 --- a/src/net/sourceforge/plantuml/cucadiagram/Stereotype.java +++ b/src/net/sourceforge/plantuml/cucadiagram/Stereotype.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5771 $ + * Revision $Revision: 5982 $ * */ package net.sourceforge.plantuml.cucadiagram; @@ -68,7 +68,8 @@ public class Stereotype implements CharSequence { } else { this.label = null; } - this.htmlColor = new HtmlColor(m.group(2)); + final String colName = m.group(2); + this.htmlColor = HtmlColor.getColorIfValid(colName); this.character = m.group(1).charAt(0); } else { this.label = label; diff --git a/src/net/sourceforge/plantuml/cucadiagram/dot/AbstractGraphviz.java b/src/net/sourceforge/plantuml/cucadiagram/dot/AbstractGraphviz.java index 1623ae88b..9da246209 100644 --- a/src/net/sourceforge/plantuml/cucadiagram/dot/AbstractGraphviz.java +++ b/src/net/sourceforge/plantuml/cucadiagram/dot/AbstractGraphviz.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5794 $ + * Revision $Revision: 6005 $ * */ package net.sourceforge.plantuml.cucadiagram.dot; @@ -148,7 +148,15 @@ abstract class AbstractGraphviz implements Graphviz { msg.add("File cannot be read"); } } - msg.add("Cannot find Graphviz: try 'java -jar plantuml.jar -testdot'"); + msg.add("Cannot find Graphviz. You should try"); + msg.add(" "); + msg.add("@startuml"); + msg.add("testdot"); + msg.add("@enduml"); + msg.add(" "); + msg.add(" or "); + msg.add(" "); + msg.add("java -jar plantuml.jar -testdot"); final GraphicStrings errorResult = new GraphicStrings(msg); errorResult.writeImage(os, format); } diff --git a/src/net/sourceforge/plantuml/cucadiagram/dot/DotMaker.java b/src/net/sourceforge/plantuml/cucadiagram/dot/DotMaker.java index aa65a19d2..9ab2fa30f 100644 --- a/src/net/sourceforge/plantuml/cucadiagram/dot/DotMaker.java +++ b/src/net/sourceforge/plantuml/cucadiagram/dot/DotMaker.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5972 $ + * Revision $Revision: 6035 $ * */ package net.sourceforge.plantuml.cucadiagram.dot; @@ -63,9 +63,11 @@ import net.sourceforge.plantuml.cucadiagram.Group; import net.sourceforge.plantuml.cucadiagram.GroupType; import net.sourceforge.plantuml.cucadiagram.IEntity; import net.sourceforge.plantuml.cucadiagram.Link; +import net.sourceforge.plantuml.cucadiagram.LinkType; import net.sourceforge.plantuml.cucadiagram.Member; import net.sourceforge.plantuml.cucadiagram.Rankdir; import net.sourceforge.plantuml.cucadiagram.Stereotype; +import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.HorizontalAlignement; import net.sourceforge.plantuml.graphic.HtmlColor; import net.sourceforge.plantuml.graphic.TextBlock; @@ -92,6 +94,11 @@ final public class DotMaker implements GraphvizMaker { private final boolean isVisibilityModifierPresent; + // http://www.graphviz.org/bugs/b2114.html + private static final boolean TURN_AROUND_B2114 = false; + + private final Set hasAlreadyOneIncommingArrowLenghtOne; + public static void goJunit() { isJunit = true; } @@ -105,6 +112,7 @@ final public class DotMaker implements GraphvizMaker { } else { this.isVisibilityModifierPresent = false; } + this.hasAlreadyOneIncommingArrowLenghtOne = TURN_AROUND_B2114 ? new HashSet() : null; } public String createDotString() throws IOException { @@ -130,10 +138,10 @@ final public class DotMaker implements GraphvizMaker { final boolean huge = data.getEntities().size() > 800; sb.append("digraph unix {"); - //if (isJunit == false) { - for (String s : dotStrings) { - sb.append(s); - } + // if (isJunit == false) { + for (String s : dotStrings) { + sb.append(s); + } // } sb.append("bgcolor=\"" + data.getSkinParam().getBackgroundColor().getAsHtml() + "\";"); if (huge) { @@ -142,6 +150,7 @@ final public class DotMaker implements GraphvizMaker { sb.append("ratio=auto;"); // sb.append("concentrate=true;"); } + // sb.append("ordering=out;"); sb.append("compound=true;"); sb.append("remincross=true;"); sb.append("searchsize=500;"); @@ -500,11 +509,15 @@ final public class DotMaker implements GraphvizMaker { final DrawFile noteLink = link.getImageFile(); + boolean hasLabel = false; + if (link.getLabel() != null) { decoration.append("label=<" + manageHtmlIB(link.getLabel(), getArrowFontParam(), null) + ">,"); + hasLabel = true; } else if (noteLink != null) { decoration .append("label=<" + getHtmlForLinkNote(noteLink.getPngOrEps(fileFormat == FileFormat.EPS)) + ">,"); + hasLabel = true; } if (link.getQualifier1() != null) { @@ -513,16 +526,26 @@ final public class DotMaker implements GraphvizMaker { if (link.getQualifier2() != null) { decoration.append("headlabel=<" + manageHtmlIB(link.getQualifier2(), getArrowFontParam(), null) + ">,"); } - decoration.append(link.getType().getSpecificDecoration()); + final int len = link.getLength(); + String uid1 = link.getEntity1().getUid(); + String uid2 = link.getEntity2().getUid(); + LinkType typeToDraw = link.getType(); + if (TURN_AROUND_B2114 && len == 1 && hasAlreadyOneIncommingArrowLenghtOne.contains(uid2) && hasLabel) { + typeToDraw = typeToDraw.getInv(); + } + if (TURN_AROUND_B2114 && len == 1) { + hasAlreadyOneIncommingArrowLenghtOne.add(uid2); + } + decoration.append(typeToDraw.getSpecificDecoration()); if (link.isInvis()) { decoration.append(",style=invis"); } - final int len = link.getLength(); + // if (len == 1) { + // decoration.append(",constraint=false"); + // } final String lenString = len >= 3 ? ",minlen=" + (len - 1) : ""; - String uid1 = link.getEntity1().getUid(); - String uid2 = link.getEntity2().getUid(); if (link.getEntity1().getType() == EntityType.GROUP) { uid1 = getHiddenNodeUid(link.getEntity1().getParent(), link); decoration.append(",ltail=" + link.getEntity1().getParent().getUid() + "v"); @@ -594,7 +617,7 @@ final public class DotMaker implements GraphvizMaker { if (noteLink == null) { continue; } - final Link phantom = new Link(link.getEntity1(), link.getEntity2(), link.getType(), "", link.getLength()); + final Link phantom = new Link(link.getEntity1(), link.getEntity2(), link.getType(), null, link.getLength()); phantom.setInvis(true); result.add(phantom); } @@ -657,10 +680,6 @@ final public class DotMaker implements GraphvizMaker { } private void eventuallySameRank(StringBuilder sb, Group entityPackage, Link link) { - // if (workAroundDotBug()) { - // throw new UnsupportedOperationException("workAroundDotBug"); - // // return; - // } final int len = link.getLength(); if (len == 1 && link.getEntity1().getParent() == entityPackage && link.getEntity2().getParent() == entityPackage) { @@ -1258,7 +1277,8 @@ final public class DotMaker implements GraphvizMaker { } final Font font = data.getSkinParam().getFont(FontParam.CLASS_ATTRIBUTE, null); final Color color = getFontHtmlColor(FontParam.CLASS_ATTRIBUTE, null).getColor(); - final TextBlock text = TextBlockUtils.create(texts, font, color, HorizontalAlignement.LEFT); + final TextBlock text = TextBlockUtils.create(texts, new FontConfiguration(font, color), + HorizontalAlignement.LEFT); final File feps = FileUtils.createTempFile("member", ".eps"); UGraphicEps.copyEpsToFile(new UDrawable() { public void drawU(UGraphic ug) { @@ -1542,8 +1562,8 @@ final public class DotMaker implements GraphvizMaker { } private String manageSpace(int size) { - final DotExpression dotExpression = new DotExpression(" ", size, new HtmlColor("white"), null, Font.PLAIN, - fileFormat); + final DotExpression dotExpression = new DotExpression(" ", size, HtmlColor.getColorIfValid("white"), null, + Font.PLAIN, fileFormat); final String result = dotExpression.getDotHtml(); return result; } diff --git a/src/net/sourceforge/plantuml/cucadiagram/dot/GraphvizUtils.java b/src/net/sourceforge/plantuml/cucadiagram/dot/GraphvizUtils.java index 0cccf627e..e044ba344 100644 --- a/src/net/sourceforge/plantuml/cucadiagram/dot/GraphvizUtils.java +++ b/src/net/sourceforge/plantuml/cucadiagram/dot/GraphvizUtils.java @@ -28,16 +28,25 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 4826 $ + * Revision $Revision: 6007 $ * */ package net.sourceforge.plantuml.cucadiagram.dot; import java.io.File; import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import net.sourceforge.plantuml.StringUtils; public class GraphvizUtils { + private static int DOT_VERSION_LIMIT = 226; + private static boolean isWindows() { return File.separatorChar == '\\'; } @@ -55,7 +64,7 @@ public class GraphvizUtils { public static String getenvGraphvizDot() { final String env = System.getProperty("GRAPHVIZ_DOT"); - if (env != null) { + if (StringUtils.isNotEmpty(env)) { return env; } return System.getenv("GRAPHVIZ_DOT"); @@ -79,4 +88,78 @@ public class GraphvizUtils { } return dotVersion; } + + static int retrieveVersion(String s) { + if (s == null) { + return -1; + } + final Pattern p = Pattern.compile("\\s([12].\\d\\d)\\D"); + final Matcher m = p.matcher(s); + if (m.find() == false) { + return -1; + } + return Integer.parseInt(m.group(1).replaceAll("\\.", "")); + } + + public static int getDotVersion() throws IOException, InterruptedException { + return retrieveVersion(dotVersion()); + } + + static public List getTestDotStrings(boolean withRichText) { + String red = ""; + String bold = ""; + if (withRichText) { + red = ""; + bold = ""; + } + final List result = new ArrayList(); + final String ent = GraphvizUtils.getenvGraphvizDot(); + if (ent == null) { + result.add("The environment variable GRAPHVIZ_DOT has not been set"); + } else { + result.add("The environment variable GRAPHVIZ_DOT has been set to " + ent); + } + final File dotExe = GraphvizUtils.getDotExe(); + result.add("Dot executable is " + dotExe); + + boolean ok = true; + if (dotExe == null) { + result.add(red + "Error: No dot executable found"); + ok = false; + } else if (dotExe.exists() == false) { + result.add(red + "Error: file does not exist"); + ok = false; + } else if (dotExe.isFile() == false) { + result.add(red + "Error: not a valid file"); + ok = false; + } else if (dotExe.canRead() == false) { + result.add(red + "Error: cannot be read"); + ok = false; + } + + if (ok) { + try { + final String version = GraphvizUtils.dotVersion(); + result.add("Dot version: " + version); + final int v = GraphvizUtils.getDotVersion(); + if (v == -1) { + result.add("Warning : cannot determine dot version"); + } else { + if (v < DOT_VERSION_LIMIT) { + result.add(bold + "Warning : Your dot installation seems old"); + result.add(bold + "Some diagrams may have issues"); + } else { + result.add(bold + "Installation seems OK"); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } else { + result.add("Error: only sequence diagrams will be generated"); + } + + return Collections.unmodifiableList(result); + } + } diff --git a/src/net/sourceforge/plantuml/cucadiagram/dot/PlayField.java b/src/net/sourceforge/plantuml/cucadiagram/dot/PlayField.java index aee1c53da..004ba1c8c 100644 --- a/src/net/sourceforge/plantuml/cucadiagram/dot/PlayField.java +++ b/src/net/sourceforge/plantuml/cucadiagram/dot/PlayField.java @@ -57,6 +57,7 @@ import net.sourceforge.plantuml.cucadiagram.Group; import net.sourceforge.plantuml.cucadiagram.IEntity; import net.sourceforge.plantuml.cucadiagram.Link; import net.sourceforge.plantuml.cucadiagram.LinkType; +import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.HorizontalAlignement; import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.TextBlock; @@ -144,7 +145,8 @@ public final class PlayField { // entityImageBlock.getDimension(stringBounder); // final Block b = new Block(uid++, d.getWidth() + 2 * // marginDecorator, d.getHeight() + 2 * marginDecorator); - final MargedBlock b = new MargedBlock(stringBounder, entityImageBlock, getMargin(stringBounder, ent, links), parentCluster); + final MargedBlock b = new MargedBlock(stringBounder, entityImageBlock, + getMargin(stringBounder, ent, links), parentCluster); blocks.put(ent, b); // images.put(ent, entityImageBlock); @@ -258,16 +260,16 @@ public final class PlayField { final String qual1 = link.getQualifier1(); if (qual1 != null) { - final TextBlock b = TextBlockUtils.create(Arrays.asList(qual1), fontQualif, - skinParam.getFontHtmlColor(FontParam.CLASS_ARROW, null).getColor(), HorizontalAlignement.LEFT); + final TextBlock b = TextBlockUtils.create(Arrays.asList(qual1), new FontConfiguration(fontQualif, + skinParam.getFontHtmlColor(FontParam.CLASS_ARROW, null).getColor()), HorizontalAlignement.LEFT); final Point2D pos = p.getDotPath().getStartPoint(); b.drawU(ug, pos.getX(), pos.getY()); } final String qual2 = link.getQualifier2(); if (qual2 != null) { - final TextBlock b = TextBlockUtils.create(Arrays.asList(qual2), fontQualif, - skinParam.getFontHtmlColor(FontParam.CLASS_ARROW, null).getColor(), HorizontalAlignement.LEFT); + final TextBlock b = TextBlockUtils.create(Arrays.asList(qual2), new FontConfiguration(fontQualif, + skinParam.getFontHtmlColor(FontParam.CLASS_ARROW, null).getColor()), HorizontalAlignement.LEFT); final Point2D pos = p.getDotPath().getEndPoint(); b.drawU(ug, pos.getX(), pos.getY()); } diff --git a/src/net/sourceforge/plantuml/graph/Elastane.java b/src/net/sourceforge/plantuml/graph/Elastane.java index 3cb835eda..3cc93d6d8 100644 --- a/src/net/sourceforge/plantuml/graph/Elastane.java +++ b/src/net/sourceforge/plantuml/graph/Elastane.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 4626 $ + * Revision $Revision: 6009 $ * */ package net.sourceforge.plantuml.graph; @@ -57,6 +57,7 @@ import net.sourceforge.plantuml.geom.CollectionUtils; import net.sourceforge.plantuml.geom.Point2DInt; import net.sourceforge.plantuml.geom.PolylineBreakeable; import net.sourceforge.plantuml.geom.XMoveable; +import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.HorizontalAlignement; import net.sourceforge.plantuml.graphic.StringBounderUtils; import net.sourceforge.plantuml.graphic.TextBlock; @@ -264,10 +265,11 @@ public class Elastane { final String label = l.getLabel(); if (label != null) { final Point2DInt center = polyline.getFirst().getCenter(); - final TextBlock textBlock = TextBlockUtils.create(Arrays.asList(label), g2d.getFont(), Color.BLACK, - HorizontalAlignement.LEFT); + final TextBlock textBlock = TextBlockUtils.create(Arrays.asList(label), + new FontConfiguration(g2d.getFont(), Color.BLACK), HorizontalAlignement.LEFT); final Dimension2D dim = textBlock.calculateDimension(StringBounderUtils.asStringBounder(g2d)); - textBlock.drawTOBEREMOVED(g2d, center.getXint() - dim.getWidth() / 2, center.getYint() - dim.getHeight() / 2); + textBlock.drawTOBEREMOVED(g2d, center.getXint() - dim.getWidth() / 2, + center.getYint() - dim.getHeight() / 2); } g2d.setColor(red); diff --git a/src/net/sourceforge/plantuml/graph/EntityImageActivity.java b/src/net/sourceforge/plantuml/graph/EntityImageActivity.java index 91bb80c46..611f574d9 100644 --- a/src/net/sourceforge/plantuml/graph/EntityImageActivity.java +++ b/src/net/sourceforge/plantuml/graph/EntityImageActivity.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 4959 $ + * Revision $Revision: 6009 $ * */ package net.sourceforge.plantuml.graph; @@ -41,6 +41,7 @@ import java.awt.geom.Dimension2D; import net.sourceforge.plantuml.Dimension2DDouble; import net.sourceforge.plantuml.StringUtils; import net.sourceforge.plantuml.cucadiagram.Entity; +import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.HorizontalAlignement; import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.StringBounderUtils; @@ -56,14 +57,14 @@ class EntityImageActivity extends AbstractEntityImage { public EntityImageActivity(Entity entity) { super(entity); - this.text = TextBlockUtils.create(StringUtils.getWithNewlines(entity.getDisplay()), getFont14(), Color.BLACK, - HorizontalAlignement.CENTER); + this.text = TextBlockUtils.create(StringUtils.getWithNewlines(entity.getDisplay()), new FontConfiguration( + getFont14(), Color.BLACK), HorizontalAlignement.CENTER); } @Override public Dimension2D getDimension(StringBounder stringBounder) { final Dimension2D dim = text.calculateDimension(stringBounder); - return Dimension2DDouble.delta(dim, 2*xMargin, 2*yMargin); + return Dimension2DDouble.delta(dim, 2 * xMargin, 2 * yMargin); } @Override diff --git a/src/net/sourceforge/plantuml/graph/EntityImageActor.java b/src/net/sourceforge/plantuml/graph/EntityImageActor.java index 318f14b17..bbf4b4987 100644 --- a/src/net/sourceforge/plantuml/graph/EntityImageActor.java +++ b/src/net/sourceforge/plantuml/graph/EntityImageActor.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 4189 $ + * Revision $Revision: 6009 $ * */ package net.sourceforge.plantuml.graph; @@ -41,6 +41,7 @@ import java.awt.geom.Rectangle2D; import net.sourceforge.plantuml.Dimension2DDouble; import net.sourceforge.plantuml.StringUtils; import net.sourceforge.plantuml.cucadiagram.Entity; +import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.HorizontalAlignement; import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.StringBounderUtils; @@ -55,8 +56,8 @@ class EntityImageActor extends AbstractEntityImage { public EntityImageActor(Entity entity) { super(entity); - this.name = TextBlockUtils.create(StringUtils.getWithNewlines(entity.getDisplay()), getFont14(), Color.BLACK, - HorizontalAlignement.CENTER); + this.name = TextBlockUtils.create(StringUtils.getWithNewlines(entity.getDisplay()), new FontConfiguration( + getFont14(), Color.BLACK), HorizontalAlignement.CENTER); this.stickman = new StickMan(getYellow(), getRed()); } diff --git a/src/net/sourceforge/plantuml/graph/EntityImageCircleInterface.java b/src/net/sourceforge/plantuml/graph/EntityImageCircleInterface.java index 732218298..8b44f8471 100644 --- a/src/net/sourceforge/plantuml/graph/EntityImageCircleInterface.java +++ b/src/net/sourceforge/plantuml/graph/EntityImageCircleInterface.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5343 $ + * Revision $Revision: 6009 $ * */ package net.sourceforge.plantuml.graph; @@ -40,6 +40,7 @@ import java.awt.geom.Dimension2D; import net.sourceforge.plantuml.Dimension2DDouble; import net.sourceforge.plantuml.StringUtils; import net.sourceforge.plantuml.cucadiagram.Entity; +import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.HorizontalAlignement; import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.TextBlock; @@ -53,8 +54,8 @@ class EntityImageCircleInterface extends AbstractEntityImage { public EntityImageCircleInterface(Entity entity) { super(entity); - this.name = TextBlockUtils.create(StringUtils.getWithNewlines(entity.getDisplay()), getFont14(), Color.BLACK, - HorizontalAlignement.CENTER); + this.name = TextBlockUtils.create(StringUtils.getWithNewlines(entity.getDisplay()), new FontConfiguration( + getFont14(), Color.BLACK), HorizontalAlignement.CENTER); this.circleInterface = new CircleInterface(getYellow(), getRed()); } @@ -69,22 +70,22 @@ class EntityImageCircleInterface extends AbstractEntityImage { @Override public void draw(Graphics2D g2d) { throw new UnsupportedOperationException(); -// final Dimension2D dimTotal = getDimension(StringBounderUtils.asStringBounder(g2d)); -// final Dimension2D nameDim = name.calculateDimension(StringBounderUtils.asStringBounder(g2d)); -// -// final double manWidth = circleInterface.getPreferredWidth(StringBounderUtils.asStringBounder(g2d)); -// final double manHeight = circleInterface.getPreferredHeight(StringBounderUtils.asStringBounder(g2d)); -// -// final double manX = (dimTotal.getWidth() - manWidth) / 2; -// -// g2d.setColor(Color.WHITE); -// g2d.fill(new Rectangle2D.Double(0, 0, dimTotal.getWidth(), dimTotal.getHeight())); -// -// g2d.translate(manX, 0); -// circleInterface.draw(g2d); -// g2d.translate(-manX, 0); -// -// g2d.setColor(Color.BLACK); -// name.drawTOBEREMOVED(g2d, (dimTotal.getWidth() - nameDim.getWidth()) / 2, manHeight); + // final Dimension2D dimTotal = getDimension(StringBounderUtils.asStringBounder(g2d)); + // final Dimension2D nameDim = name.calculateDimension(StringBounderUtils.asStringBounder(g2d)); + // + // final double manWidth = circleInterface.getPreferredWidth(StringBounderUtils.asStringBounder(g2d)); + // final double manHeight = circleInterface.getPreferredHeight(StringBounderUtils.asStringBounder(g2d)); + // + // final double manX = (dimTotal.getWidth() - manWidth) / 2; + // + // g2d.setColor(Color.WHITE); + // g2d.fill(new Rectangle2D.Double(0, 0, dimTotal.getWidth(), dimTotal.getHeight())); + // + // g2d.translate(manX, 0); + // circleInterface.draw(g2d); + // g2d.translate(-manX, 0); + // + // g2d.setColor(Color.BLACK); + // name.drawTOBEREMOVED(g2d, (dimTotal.getWidth() - nameDim.getWidth()) / 2, manHeight); } } diff --git a/src/net/sourceforge/plantuml/graph/EntityImageClass.java b/src/net/sourceforge/plantuml/graph/EntityImageClass.java index 19997a89d..f8cfb47a6 100644 --- a/src/net/sourceforge/plantuml/graph/EntityImageClass.java +++ b/src/net/sourceforge/plantuml/graph/EntityImageClass.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5798 $ + * Revision $Revision: 6009 $ * */ package net.sourceforge.plantuml.graph; @@ -42,6 +42,7 @@ import net.sourceforge.plantuml.StringUtils; import net.sourceforge.plantuml.cucadiagram.Entity; import net.sourceforge.plantuml.cucadiagram.EntityType; import net.sourceforge.plantuml.graphic.CircledCharacter; +import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.HorizontalAlignement; import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.StringBounderUtils; @@ -60,8 +61,8 @@ class EntityImageClass extends AbstractEntityImage { public EntityImageClass(Entity entity) { super(entity); - this.name = TextBlockUtils.create(StringUtils.getWithNewlines(entity.getDisplay()), getFont14(), Color.BLACK, - HorizontalAlignement.CENTER); + this.name = TextBlockUtils.create(StringUtils.getWithNewlines(entity.getDisplay()), new FontConfiguration( + getFont14(), Color.BLACK), HorizontalAlignement.CENTER); this.methods = new MethodsOrFieldsArea(entity.methods2(), getFont14()); this.fields = new MethodsOrFieldsArea(entity.fields2(), getFont14()); diff --git a/src/net/sourceforge/plantuml/graph/EntityImageComponent.java b/src/net/sourceforge/plantuml/graph/EntityImageComponent.java index 68c46fdce..c88faa8c3 100644 --- a/src/net/sourceforge/plantuml/graph/EntityImageComponent.java +++ b/src/net/sourceforge/plantuml/graph/EntityImageComponent.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 4959 $ + * Revision $Revision: 6009 $ * */ package net.sourceforge.plantuml.graph; @@ -43,6 +43,7 @@ import java.awt.geom.Rectangle2D; import net.sourceforge.plantuml.Dimension2DDouble; import net.sourceforge.plantuml.StringUtils; import net.sourceforge.plantuml.cucadiagram.Entity; +import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.HorizontalAlignement; import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.StringBounderUtils; @@ -56,8 +57,8 @@ class EntityImageComponent extends AbstractEntityImage { public EntityImageComponent(Entity entity) { super(entity); - this.name = TextBlockUtils.create(StringUtils.getWithNewlines(entity.getDisplay()), getFont14(), Color.BLACK, - HorizontalAlignement.CENTER); + this.name = TextBlockUtils.create(StringUtils.getWithNewlines(entity.getDisplay()), new FontConfiguration( + getFont14(), Color.BLACK), HorizontalAlignement.CENTER); } @Override diff --git a/src/net/sourceforge/plantuml/graph/EntityImageDefault.java b/src/net/sourceforge/plantuml/graph/EntityImageDefault.java index 3c8456114..88f426c45 100644 --- a/src/net/sourceforge/plantuml/graph/EntityImageDefault.java +++ b/src/net/sourceforge/plantuml/graph/EntityImageDefault.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 4125 $ + * Revision $Revision: 6009 $ * */ package net.sourceforge.plantuml.graph; @@ -40,6 +40,7 @@ import java.util.Arrays; import net.sourceforge.plantuml.Dimension2DDouble; import net.sourceforge.plantuml.cucadiagram.Entity; +import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.HorizontalAlignement; import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.StringBounderUtils; @@ -52,8 +53,8 @@ class EntityImageDefault extends AbstractEntityImage { public EntityImageDefault(Entity entity) { super(entity); - this.textBlock = TextBlockUtils.create(Arrays.asList(entity.getDisplay()), getFont14(), Color.BLACK, - HorizontalAlignement.CENTER); + this.textBlock = TextBlockUtils.create(Arrays.asList(entity.getDisplay()), new FontConfiguration(getFont14(), + Color.BLACK), HorizontalAlignement.CENTER); } @Override diff --git a/src/net/sourceforge/plantuml/graph/EntityImageNote.java b/src/net/sourceforge/plantuml/graph/EntityImageNote.java index 628c3d758..faffe8bd7 100644 --- a/src/net/sourceforge/plantuml/graph/EntityImageNote.java +++ b/src/net/sourceforge/plantuml/graph/EntityImageNote.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 4959 $ + * Revision $Revision: 6009 $ * */ package net.sourceforge.plantuml.graph; @@ -41,6 +41,7 @@ import java.awt.geom.Dimension2D; import net.sourceforge.plantuml.Dimension2DDouble; import net.sourceforge.plantuml.StringUtils; import net.sourceforge.plantuml.cucadiagram.Entity; +import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.HorizontalAlignement; import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.StringBounderUtils; @@ -56,8 +57,8 @@ class EntityImageNote extends AbstractEntityImage { public EntityImageNote(Entity entity) { super(entity); - this.text = TextBlockUtils.create(StringUtils.getWithNewlines(entity.getDisplay()), getFont14(), Color.BLACK, - HorizontalAlignement.CENTER); + this.text = TextBlockUtils.create(StringUtils.getWithNewlines(entity.getDisplay()), new FontConfiguration( + getFont14(), Color.BLACK), HorizontalAlignement.CENTER); } @Override diff --git a/src/net/sourceforge/plantuml/graph/EntityImageUsecase.java b/src/net/sourceforge/plantuml/graph/EntityImageUsecase.java index 7168b9ff5..bc8721496 100644 --- a/src/net/sourceforge/plantuml/graph/EntityImageUsecase.java +++ b/src/net/sourceforge/plantuml/graph/EntityImageUsecase.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 4125 $ + * Revision $Revision: 6009 $ * */ package net.sourceforge.plantuml.graph; @@ -44,6 +44,7 @@ import java.awt.geom.Rectangle2D; import net.sourceforge.plantuml.Dimension2DDouble; import net.sourceforge.plantuml.StringUtils; import net.sourceforge.plantuml.cucadiagram.Entity; +import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.HorizontalAlignement; import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.StringBounderUtils; @@ -56,8 +57,8 @@ class EntityImageUsecase extends AbstractEntityImage { public EntityImageUsecase(Entity entity) { super(entity); - this.name = TextBlockUtils.create(StringUtils.getWithNewlines(entity.getDisplay()), getFont14(), Color.BLACK, - HorizontalAlignement.CENTER); + this.name = TextBlockUtils.create(StringUtils.getWithNewlines(entity.getDisplay()), new FontConfiguration( + getFont14(), Color.BLACK), HorizontalAlignement.CENTER); } @Override diff --git a/src/net/sourceforge/plantuml/graph/MethodsOrFieldsArea.java b/src/net/sourceforge/plantuml/graph/MethodsOrFieldsArea.java index bc8c79c23..4c7151c7c 100644 --- a/src/net/sourceforge/plantuml/graph/MethodsOrFieldsArea.java +++ b/src/net/sourceforge/plantuml/graph/MethodsOrFieldsArea.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5609 $ + * Revision $Revision: 6009 $ * */ package net.sourceforge.plantuml.graph; @@ -43,6 +43,7 @@ import java.util.List; import net.sourceforge.plantuml.Dimension2DDouble; import net.sourceforge.plantuml.cucadiagram.Member; +import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.HorizontalAlignement; import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.StringBounderUtils; @@ -80,7 +81,8 @@ public class MethodsOrFieldsArea { } private TextBlock createTextBlock(String s) { - return TextBlockUtils.create(Arrays.asList(s), font, Color.BLACK, HorizontalAlignement.LEFT); + return TextBlockUtils.create(Arrays.asList(s), new FontConfiguration(font, Color.BLACK), + HorizontalAlignement.LEFT); } public void drawTOBEREMOVED(Graphics2D g2d, double x, double y) { diff --git a/src/net/sourceforge/plantuml/graph/MethodsOrFieldsArea2.java b/src/net/sourceforge/plantuml/graph/MethodsOrFieldsArea2.java index 90f1babf5..331328beb 100644 --- a/src/net/sourceforge/plantuml/graph/MethodsOrFieldsArea2.java +++ b/src/net/sourceforge/plantuml/graph/MethodsOrFieldsArea2.java @@ -45,6 +45,7 @@ import net.sourceforge.plantuml.Dimension2DDouble; import net.sourceforge.plantuml.FontParam; import net.sourceforge.plantuml.ISkinParam; import net.sourceforge.plantuml.cucadiagram.Member; +import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.HorizontalAlignement; import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.TextBlock; @@ -98,7 +99,7 @@ public class MethodsOrFieldsArea2 { } private TextBlock createTextBlock(String s) { - return TextBlockUtils.create(Arrays.asList(s), font, color, HorizontalAlignement.LEFT); + return TextBlockUtils.create(Arrays.asList(s), new FontConfiguration(font, color), HorizontalAlignement.LEFT); } public void drawTOBEREMOVED(Graphics2D g2d, double x, double y) { diff --git a/src/net/sourceforge/plantuml/graphic/ColorAndSizeChange.java b/src/net/sourceforge/plantuml/graphic/ColorAndSizeChange.java index d56c497e7..9ceb5d8a2 100644 --- a/src/net/sourceforge/plantuml/graphic/ColorAndSizeChange.java +++ b/src/net/sourceforge/plantuml/graphic/ColorAndSizeChange.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 3834 $ + * Revision $Revision: 5983 $ * */ package net.sourceforge.plantuml.graphic; @@ -48,7 +48,7 @@ class ColorAndSizeChange implements FontChange { ColorAndSizeChange(String s) { final Matcher matcherColor = colorPattern.matcher(s); if (matcherColor.find()) { - color = new HtmlColor(matcherColor.group(1)); + color = HtmlColor.getColorIfValid(matcherColor.group(1)); } else { color = null; } diff --git a/src/net/sourceforge/plantuml/graphic/ColorChange.java b/src/net/sourceforge/plantuml/graphic/ColorChange.java index 5e63a05d6..c41b088a5 100644 --- a/src/net/sourceforge/plantuml/graphic/ColorChange.java +++ b/src/net/sourceforge/plantuml/graphic/ColorChange.java @@ -47,7 +47,7 @@ class ColorChange implements FontChange { if (matcherColor.find() == false) { throw new IllegalArgumentException(); } - this.color = new HtmlColor(matcherColor.group(1)); + this.color = HtmlColor.getColorIfValid(matcherColor.group(1)); } HtmlColor getColor() { diff --git a/src/net/sourceforge/plantuml/graphic/FontStyle.java b/src/net/sourceforge/plantuml/graphic/FontStyle.java index 106429d9e..1c3d59068 100644 --- a/src/net/sourceforge/plantuml/graphic/FontStyle.java +++ b/src/net/sourceforge/plantuml/graphic/FontStyle.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5507 $ + * Revision $Revision: 6000 $ * */ package net.sourceforge.plantuml.graphic; @@ -40,7 +40,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; public enum FontStyle { - PLAIN, ITALIC, BOLD, UNDERLINE, STRIKE, WAVE; + PLAIN, ITALIC, BOLD, UNDERLINE, STRIKE, WAVE, BACKCOLOR; public Font mutateFont(Font font) { if (this == ITALIC) { @@ -65,6 +65,9 @@ public enum FontStyle { if (this == WAVE) { return "\\<[wW](?::(#[0-9a-fA-F]{6}|\\w+))?\\>"; } + if (this == BACKCOLOR) { + return "\\<[bB][aA][cC][kK](?::(#[0-9a-fA-F]{6}|\\w+))?\\>"; + } if (this == STRIKE) { return "\\<(?:s|S|strike|STRIKE|del|DEL)(?::(#[0-9a-fA-F]{6}|\\w+))?\\>"; } @@ -78,7 +81,7 @@ public enum FontStyle { } final String color = m.group(1); if (color!= null && HtmlColor.isValid(color)) { - return new HtmlColor(color).getColor(); + return HtmlColor.getColorIfValid(color).getColor(); } return null; } @@ -96,6 +99,9 @@ public enum FontStyle { if (this == WAVE) { return "\\"; } + if (this == BACKCOLOR) { + return "\\"; + } if (this == STRIKE) { return "\\"; } diff --git a/src/net/sourceforge/plantuml/graphic/GraphicStrings.java b/src/net/sourceforge/plantuml/graphic/GraphicStrings.java index 365caae55..523a0f5b7 100644 --- a/src/net/sourceforge/plantuml/graphic/GraphicStrings.java +++ b/src/net/sourceforge/plantuml/graphic/GraphicStrings.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5872 $ + * Revision $Revision: 6009 $ * */ package net.sourceforge.plantuml.graphic; @@ -138,7 +138,8 @@ public class GraphicStrings { } public Dimension2D drawU(final UGraphic ug) { - final TextBlock textBlock = TextBlockUtils.create(strings, font, green, HorizontalAlignement.LEFT); + final TextBlock textBlock = TextBlockUtils.create(strings, new FontConfiguration(font, green), + HorizontalAlignement.LEFT); Dimension2D size = textBlock.calculateDimension(ug.getStringBounder()); textBlock.drawU(ug, 0, 0); diff --git a/src/net/sourceforge/plantuml/graphic/HtmlColor.java b/src/net/sourceforge/plantuml/graphic/HtmlColor.java index 6871c69f4..e72f67ce8 100644 --- a/src/net/sourceforge/plantuml/graphic/HtmlColor.java +++ b/src/net/sourceforge/plantuml/graphic/HtmlColor.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5204 $ + * Revision $Revision: 5983 $ * */ package net.sourceforge.plantuml.graphic; @@ -77,6 +77,7 @@ public class HtmlColor { register("DarkCyan", "#008B8B"); register("DarkGoldenRod", "#B8860B"); register("DarkGray", "#A9A9A9"); + register("DarkGrey", "#A9A9A9"); register("DarkGreen", "#006400"); register("DarkKhaki", "#BDB76B"); register("DarkMagenta", "#8B008B"); @@ -88,11 +89,13 @@ public class HtmlColor { register("DarkSeaGreen", "#8FBC8F"); register("DarkSlateBlue", "#483D8B"); register("DarkSlateGray", "#2F4F4F"); + register("DarkSlateGrey", "#2F4F4F"); register("DarkTurquoise", "#00CED1"); register("DarkViolet", "#9400D3"); register("DeepPink", "#FF1493"); register("DeepSkyBlue", "#00BFFF"); register("DimGray", "#696969"); + register("DimGrey", "#696969"); register("DodgerBlue", "#1E90FF"); register("FireBrick", "#B22222"); register("FloralWhite", "#FFFAF0"); @@ -103,6 +106,7 @@ public class HtmlColor { register("Gold", "#FFD700"); register("GoldenRod", "#DAA520"); register("Gray", "#808080"); + register("Grey", "#808080"); register("Green", "#008000"); register("GreenYellow", "#ADFF2F"); register("HoneyDew", "#F0FFF0"); @@ -119,6 +123,7 @@ public class HtmlColor { register("LightCoral", "#F08080"); register("LightCyan", "#E0FFFF"); register("LightGoldenRodYellow", "#FAFAD2"); + register("LightGray", "#D3D3D3"); register("LightGrey", "#D3D3D3"); register("LightGreen", "#90EE90"); register("LightPink", "#FFB6C1"); @@ -126,6 +131,7 @@ public class HtmlColor { register("LightSeaGreen", "#20B2AA"); register("LightSkyBlue", "#87CEFA"); register("LightSlateGray", "#778899"); + register("LightSlateGrey", "#778899"); register("LightSteelBlue", "#B0C4DE"); register("LightYellow", "#FFFFE0"); register("Lime", "#00FF00"); @@ -178,6 +184,7 @@ public class HtmlColor { register("SkyBlue", "#87CEEB"); register("SlateBlue", "#6A5ACD"); register("SlateGray", "#708090"); + register("SlateGrey", "#708090"); register("Snow", "#FFFAFA"); register("SpringGreen", "#00FF7F"); register("SteelBlue", "#4682B4"); @@ -201,7 +208,7 @@ public class HtmlColor { private final Color color; - public HtmlColor(String s) { + private HtmlColor(String s) { if (s.matches("#[0-9A-Fa-f]{6}")) { color = new Color(Integer.parseInt(s.substring(1), 16)); } else { @@ -215,9 +222,9 @@ public class HtmlColor { assert isValid(s); } - private HtmlColor(Color c) { - this.color = c; - } +// private HtmlColor(Color c) { +// this.color = c; +// } static public boolean isValid(String s) { if (s.matches("#[0-9A-Fa-f]{6}")) { diff --git a/src/net/sourceforge/plantuml/graphic/SingleLine.java b/src/net/sourceforge/plantuml/graphic/SingleLine.java index 209f41abb..5bceeb6da 100644 --- a/src/net/sourceforge/plantuml/graphic/SingleLine.java +++ b/src/net/sourceforge/plantuml/graphic/SingleLine.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5741 $ + * Revision $Revision: 6009 $ * */ package net.sourceforge.plantuml.graphic; @@ -48,15 +48,13 @@ class SingleLine implements Line { private final List blocs = new ArrayList(); private final HorizontalAlignement horizontalAlignement; - public SingleLine(String text, Font font, Color paint, HorizontalAlignement horizontalAlignement) { + public SingleLine(String text, FontConfiguration fontConfiguration, HorizontalAlignement horizontalAlignement) { if (text.length() == 0) { text = " "; } this.horizontalAlignement = horizontalAlignement; final Splitter lineSplitter = new Splitter(text); - FontConfiguration fontConfiguration = new FontConfiguration(font, paint); - for (HtmlCommand cmd : lineSplitter.getHtmlCommands(false)) { if (cmd instanceof Text) { final String s = ((Text) cmd).getText(); diff --git a/src/net/sourceforge/plantuml/graphic/TextBlockSimple.java b/src/net/sourceforge/plantuml/graphic/TextBlockSimple.java index a60e9fa41..08899358b 100644 --- a/src/net/sourceforge/plantuml/graphic/TextBlockSimple.java +++ b/src/net/sourceforge/plantuml/graphic/TextBlockSimple.java @@ -28,13 +28,11 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 4125 $ + * Revision $Revision: 6009 $ * */ package net.sourceforge.plantuml.graphic; -import java.awt.Color; -import java.awt.Font; import java.awt.Graphics2D; import java.awt.geom.Dimension2D; import java.util.ArrayList; @@ -48,21 +46,21 @@ class TextBlockSimple implements TextBlock { private final List lines = new ArrayList(); - protected TextBlockSimple(List texts, Font font, Color paint, + protected TextBlockSimple(List texts, FontConfiguration fontConfiguration, HorizontalAlignement horizontalAlignement) { for (CharSequence s : texts) { if (s instanceof Stereotype) { - lines.add(createLineForStereotype(font, paint, (Stereotype) s, horizontalAlignement)); + lines.add(createLineForStereotype(fontConfiguration, (Stereotype) s, horizontalAlignement)); } else { - lines.add(new SingleLine(s.toString(), font, paint, horizontalAlignement)); + lines.add(new SingleLine(s.toString(), fontConfiguration, horizontalAlignement)); } } } - private SingleLine createLineForStereotype(Font font, Color paint, Stereotype s, + private SingleLine createLineForStereotype(FontConfiguration fontConfiguration, Stereotype s, HorizontalAlignement horizontalAlignement) { assert s.getLabel() != null; - return new SingleLine(s.getLabel(), font.deriveFont(Font.ITALIC), paint, horizontalAlignement); + return new SingleLine(s.getLabel(), fontConfiguration.add(FontStyle.ITALIC), horizontalAlignement); } public Dimension2D calculateDimension(StringBounder stringBounder) { @@ -95,7 +93,7 @@ class TextBlockSimple implements TextBlock { y += line.calculateDimension(StringBounderUtils.asStringBounder(g2d)).getHeight(); } } - + public void drawU(UGraphic ug, double x, double y) { final Dimension2D dimText = getTextDimension(ug.getStringBounder()); @@ -103,8 +101,7 @@ class TextBlockSimple implements TextBlock { final HorizontalAlignement lineHorizontalAlignement = line.getHorizontalAlignement(); double deltaX = 0; if (lineHorizontalAlignement == HorizontalAlignement.CENTER) { - final double diff = dimText.getWidth() - - line.calculateDimension(ug.getStringBounder()).getWidth(); + final double diff = dimText.getWidth() - line.calculateDimension(ug.getStringBounder()).getWidth(); deltaX = diff / 2.0; } line.drawU(ug, x + deltaX, y); diff --git a/src/net/sourceforge/plantuml/graphic/TextBlockSpotted.java b/src/net/sourceforge/plantuml/graphic/TextBlockSpotted.java index c7e285f92..12ddd5466 100644 --- a/src/net/sourceforge/plantuml/graphic/TextBlockSpotted.java +++ b/src/net/sourceforge/plantuml/graphic/TextBlockSpotted.java @@ -28,13 +28,11 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 4169 $ + * Revision $Revision: 6009 $ * */ package net.sourceforge.plantuml.graphic; -import java.awt.Color; -import java.awt.Font; import java.awt.Graphics2D; import java.awt.geom.Dimension2D; import java.util.List; @@ -46,9 +44,9 @@ class TextBlockSpotted extends TextBlockSimple { private final CircledCharacter circledCharacter; - public TextBlockSpotted(CircledCharacter circledCharacter, List texts, Font font, - Color paint, HorizontalAlignement horizontalAlignement) { - super(texts, font, paint, horizontalAlignement); + public TextBlockSpotted(CircledCharacter circledCharacter, List texts, + FontConfiguration fontConfiguration, HorizontalAlignement horizontalAlignement) { + super(texts, fontConfiguration, horizontalAlignement); this.circledCharacter = circledCharacter; } @@ -58,8 +56,8 @@ class TextBlockSpotted extends TextBlockSimple { final double heightCircledCharacter = circledCharacter.getPreferredHeight(stringBounder); final Dimension2D dim = super.calculateDimension(stringBounder); - return new Dimension2DDouble(dim.getWidth() + widthCircledCharacter, Math.max(heightCircledCharacter, dim - .getHeight())); + return new Dimension2DDouble(dim.getWidth() + widthCircledCharacter, Math.max(heightCircledCharacter, + dim.getHeight())); } private double getCircledCharacterWithAndMargin(StringBounder stringBounder) { @@ -68,36 +66,36 @@ class TextBlockSpotted extends TextBlockSimple { @Override public void drawTOBEREMOVED(Graphics2D g2d, double x, double y) { -// final AffineTransform at = g2d.getTransform(); -// final StringBounder stringBounder = StringBounderUtils.asStringBounder(g2d); -// -// final double deltaY = calculateDimension(StringBounderUtils.asStringBounder(g2d)).getHeight() -// - circledCharacter.getPreferredHeight(stringBounder); -// -// // g2d.translate(x, y + deltaY / 2.0); -// circledCharacter.draw(g2d, (int) x, (int) (y + deltaY / 2.0)); -// // circledCharacter.draw(g2d); -// -// g2d.setTransform(at); -// final double widthCircledCharacter = getCircledCharacterWithAndMargin(stringBounder); -// g2d.translate(widthCircledCharacter, 0); -// -// super.drawTOBEREMOVED(g2d, x, y); -// -// g2d.setTransform(at); + // final AffineTransform at = g2d.getTransform(); + // final StringBounder stringBounder = StringBounderUtils.asStringBounder(g2d); + // + // final double deltaY = calculateDimension(StringBounderUtils.asStringBounder(g2d)).getHeight() + // - circledCharacter.getPreferredHeight(stringBounder); + // + // // g2d.translate(x, y + deltaY / 2.0); + // circledCharacter.draw(g2d, (int) x, (int) (y + deltaY / 2.0)); + // // circledCharacter.draw(g2d); + // + // g2d.setTransform(at); + // final double widthCircledCharacter = getCircledCharacterWithAndMargin(stringBounder); + // g2d.translate(widthCircledCharacter, 0); + // + // super.drawTOBEREMOVED(g2d, x, y); + // + // g2d.setTransform(at); throw new UnsupportedOperationException(); } - + @Override public void drawU(UGraphic ug, double x, double y) { final double atX = ug.getTranslateX(); final double atY = ug.getTranslateY(); final StringBounder stringBounder = ug.getStringBounder(); -// final double deltaY = calculateDimension(stringBounder).getHeight() -// - circledCharacter.getPreferredHeight(stringBounder); + // final double deltaY = calculateDimension(stringBounder).getHeight() + // - circledCharacter.getPreferredHeight(stringBounder); - //circledCharacter.drawU(ug, (int) x, (int) (y + deltaY / 2.0)); + // circledCharacter.drawU(ug, (int) x, (int) (y + deltaY / 2.0)); circledCharacter.drawU(ug, x, y); ug.setTranslate(atX, atY); diff --git a/src/net/sourceforge/plantuml/graphic/TextBlockUtils.java b/src/net/sourceforge/plantuml/graphic/TextBlockUtils.java index 955f78a70..09dbcb6c6 100644 --- a/src/net/sourceforge/plantuml/graphic/TextBlockUtils.java +++ b/src/net/sourceforge/plantuml/graphic/TextBlockUtils.java @@ -28,13 +28,11 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 4111 $ + * Revision $Revision: 6009 $ * */ package net.sourceforge.plantuml.graphic; -import java.awt.Color; -import java.awt.Font; import java.util.List; import net.sourceforge.plantuml.cucadiagram.Stereotype; @@ -42,38 +40,39 @@ import net.sourceforge.plantuml.sequencediagram.MessageNumber; public class TextBlockUtils { - public static TextBlock create(List texts, Font font, Color paint, + public static TextBlock create(List texts, FontConfiguration fontConfiguration, HorizontalAlignement horizontalAlignement) { if (texts.size() > 0 && texts.get(0) instanceof Stereotype) { - return createStereotype(texts, font, paint, horizontalAlignement); + return createStereotype(texts, fontConfiguration, horizontalAlignement); } if (texts.size() > 0 && texts.get(0) instanceof MessageNumber) { - return createMessageNumber(texts, font, paint, horizontalAlignement); + return createMessageNumber(texts, fontConfiguration, horizontalAlignement); } - return new TextBlockSimple(texts, font, paint, horizontalAlignement); + return new TextBlockSimple(texts, fontConfiguration, horizontalAlignement); } - private static TextBlock createMessageNumber(List texts, Font font, Color paint, - HorizontalAlignement horizontalAlignement) { + private static TextBlock createMessageNumber(List texts, + FontConfiguration fontConfiguration, HorizontalAlignement horizontalAlignement) { final MessageNumber number = (MessageNumber) texts.get(0); - return new TextBlockWithNumber(number.getNumber(), texts.subList(1, texts.size()), font, paint, + return new TextBlockWithNumber(number.getNumber(), texts.subList(1, texts.size()), fontConfiguration, horizontalAlignement); } - private static TextBlock createStereotype(List texts, Font font, Color paint, + private static TextBlock createStereotype(List texts, FontConfiguration fontConfiguration, HorizontalAlignement horizontalAlignement) { final Stereotype stereotype = (Stereotype) texts.get(0); if (stereotype.isSpotted()) { - final CircledCharacter circledCharacter = new CircledCharacter(stereotype.getCharacter(), stereotype - .getRadius(), stereotype.getCircledFont(), stereotype.getColor(), null, paint); + final CircledCharacter circledCharacter = new CircledCharacter(stereotype.getCharacter(), + stereotype.getRadius(), stereotype.getCircledFont(), stereotype.getColor(), null, + fontConfiguration.getColor()); if (stereotype.getLabel() == null) { - return new TextBlockSpotted(circledCharacter, texts.subList(1, texts.size()), font, paint, + return new TextBlockSpotted(circledCharacter, texts.subList(1, texts.size()), fontConfiguration, horizontalAlignement); } - return new TextBlockSpotted(circledCharacter, texts, font, paint, horizontalAlignement); + return new TextBlockSpotted(circledCharacter, texts, fontConfiguration, horizontalAlignement); } - return new TextBlockSimple(texts, font, paint, horizontalAlignement); + return new TextBlockSimple(texts, fontConfiguration, horizontalAlignement); } // static private Font deriveForCircleCharacter(Font font) { diff --git a/src/net/sourceforge/plantuml/graphic/TextBlockWithNumber.java b/src/net/sourceforge/plantuml/graphic/TextBlockWithNumber.java index 7a90c16a9..d915b3d74 100644 --- a/src/net/sourceforge/plantuml/graphic/TextBlockWithNumber.java +++ b/src/net/sourceforge/plantuml/graphic/TextBlockWithNumber.java @@ -28,13 +28,11 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 4125 $ + * Revision $Revision: 6009 $ * */ package net.sourceforge.plantuml.graphic; -import java.awt.Color; -import java.awt.Font; import java.awt.Graphics2D; import java.awt.geom.Dimension2D; import java.util.Arrays; @@ -47,10 +45,10 @@ class TextBlockWithNumber extends TextBlockSimple { private final TextBlock numText; - public TextBlockWithNumber(String number, List texts, Font font, Color paint, + public TextBlockWithNumber(String number, List texts, FontConfiguration fontConfiguration, HorizontalAlignement horizontalAlignement) { - super(texts, font, paint, horizontalAlignement); - this.numText = TextBlockUtils.create(Arrays.asList(number), font, paint, HorizontalAlignement.LEFT); + super(texts, fontConfiguration, horizontalAlignement); + this.numText = TextBlockUtils.create(Arrays.asList(number), fontConfiguration, HorizontalAlignement.LEFT); } @Override @@ -77,7 +75,7 @@ class TextBlockWithNumber extends TextBlockSimple { numText.drawTOBEREMOVED(g2d, x, y + deltaY / 2.0); super.drawTOBEREMOVED(g2d, x + getNumberWithAndMargin(stringBounder), y); } - + @Override public void drawU(UGraphic ug, double x, double y) { final StringBounder stringBounder = ug.getStringBounder(); diff --git a/src/net/sourceforge/plantuml/png/PngTitler.java b/src/net/sourceforge/plantuml/png/PngTitler.java index 353b17818..5bb95d320 100644 --- a/src/net/sourceforge/plantuml/png/PngTitler.java +++ b/src/net/sourceforge/plantuml/png/PngTitler.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5793 $ + * Revision $Revision: 6009 $ * */ package net.sourceforge.plantuml.png; @@ -41,6 +41,7 @@ import java.awt.geom.Dimension2D; import java.awt.image.BufferedImage; import java.util.List; +import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.HorizontalAlignement; import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.StringBounderUtils; @@ -91,7 +92,7 @@ public class PngTitler { return null; } final Font normalFont = new Font(fontFamily, Font.PLAIN, fontSize); - return TextBlockUtils.create(text, normalFont, textColor, horizontalAlignement); + return TextBlockUtils.create(text, new FontConfiguration(normalFont, textColor), horizontalAlignement); } static private BufferedImage addTitle(BufferedImage im, Color background, Color textColor, List text, @@ -100,7 +101,8 @@ public class PngTitler { final Font normalFont = new Font(fontFamily, Font.PLAIN, fontSize); final Graphics2D oldg2d = im.createGraphics(); - final TextBlock textBloc = TextBlockUtils.create(text, normalFont, textColor, horizontalAlignement); + final TextBlock textBloc = TextBlockUtils.create(text, new FontConfiguration(normalFont, textColor), + horizontalAlignement); final Dimension2D dimText = textBloc.calculateDimension(StringBounderUtils.asStringBounder(oldg2d)); oldg2d.dispose(); diff --git a/src/net/sourceforge/plantuml/posimo/EntityImageBlock.java b/src/net/sourceforge/plantuml/posimo/EntityImageBlock.java index 60a7dfcf7..1084c86cf 100644 --- a/src/net/sourceforge/plantuml/posimo/EntityImageBlock.java +++ b/src/net/sourceforge/plantuml/posimo/EntityImageBlock.java @@ -48,6 +48,7 @@ import net.sourceforge.plantuml.cucadiagram.EntityType; import net.sourceforge.plantuml.cucadiagram.IEntity; import net.sourceforge.plantuml.cucadiagram.Link; import net.sourceforge.plantuml.cucadiagram.dot.PlayField; +import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.HorizontalAlignement; import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.TextBlock; @@ -77,8 +78,8 @@ public class EntityImageBlock implements IEntityImageBlock { this.links = links; if (StringUtils.isNotEmpty(entity.getDisplay())) { - this.name = TextBlockUtils.create(StringUtils.getWithNewlines(entity.getDisplay()), - param.getFont(titleParam, null), Color.BLACK, HorizontalAlignement.CENTER); + this.name = TextBlockUtils.create(StringUtils.getWithNewlines(entity.getDisplay()), new FontConfiguration( + param.getFont(titleParam, null), Color.BLACK), HorizontalAlignement.CENTER); } else { this.name = null; } diff --git a/src/net/sourceforge/plantuml/posimo/EntityImageClass2.java b/src/net/sourceforge/plantuml/posimo/EntityImageClass2.java index dba55b780..0f075ddf5 100644 --- a/src/net/sourceforge/plantuml/posimo/EntityImageClass2.java +++ b/src/net/sourceforge/plantuml/posimo/EntityImageClass2.java @@ -49,6 +49,7 @@ import net.sourceforge.plantuml.cucadiagram.Link; import net.sourceforge.plantuml.cucadiagram.Stereotype; import net.sourceforge.plantuml.graph.MethodsOrFieldsArea2; import net.sourceforge.plantuml.graphic.CircledCharacter; +import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.HorizontalAlignement; import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.TextBlock; @@ -70,15 +71,16 @@ public class EntityImageClass2 extends AbstractEntityImage2 { public EntityImageClass2(IEntity entity, ISkinParam skinParam, Collection links) { super(entity, skinParam); - this.name = TextBlockUtils.create(StringUtils.getWithNewlines(entity.getDisplay()), getFont(FontParam.CLASS), - Color.BLACK, HorizontalAlignement.CENTER); + this.name = TextBlockUtils.create(StringUtils.getWithNewlines(entity.getDisplay()), new FontConfiguration( + getFont(FontParam.CLASS), Color.BLACK), HorizontalAlignement.CENTER); final Stereotype stereotype = entity.getStereotype(); if (stereotype == null || stereotype.getLabel() == null) { this.stereo = null; } else { - this.stereo = TextBlockUtils.create(StringUtils.getWithNewlines(stereotype.getLabel()), - getFont(FontParam.CLASS_STEREOTYPE), getFontColor(FontParam.CLASS_STEREOTYPE), - HorizontalAlignement.CENTER); + this.stereo = TextBlockUtils + .create(StringUtils.getWithNewlines(stereotype.getLabel()), new FontConfiguration( + getFont(FontParam.CLASS_STEREOTYPE), getFontColor(FontParam.CLASS_STEREOTYPE)), + HorizontalAlignement.CENTER); } this.methods = new MethodsOrFieldsArea2(entity.methods2(), FontParam.CLASS_ATTRIBUTE, skinParam); this.fields = new MethodsOrFieldsArea2(entity.fields2(), FontParam.CLASS_ATTRIBUTE, skinParam); diff --git a/src/net/sourceforge/plantuml/posimo/Frame.java b/src/net/sourceforge/plantuml/posimo/Frame.java index 5604c0251..6195531cf 100644 --- a/src/net/sourceforge/plantuml/posimo/Frame.java +++ b/src/net/sourceforge/plantuml/posimo/Frame.java @@ -41,6 +41,7 @@ import java.util.List; import net.sourceforge.plantuml.ColorParam; import net.sourceforge.plantuml.FontParam; import net.sourceforge.plantuml.ISkinParam; +import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.HorizontalAlignement; import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.TextBlock; @@ -116,7 +117,8 @@ public class Frame implements Component { private TextBlock createTextBloc() { final Font font = skinParam.getFont(FontParam.PACKAGE, null); final Color textColor = skinParam.getFontHtmlColor(FontParam.PACKAGE, null).getColor(); - final TextBlock bloc = TextBlockUtils.create(name, font, textColor, HorizontalAlignement.LEFT); + final TextBlock bloc = TextBlockUtils.create(name, new FontConfiguration(font, textColor), + HorizontalAlignement.LEFT); return bloc; } diff --git a/src/net/sourceforge/plantuml/posimo/LabelImage.java b/src/net/sourceforge/plantuml/posimo/LabelImage.java index c91066e45..0990209b6 100644 --- a/src/net/sourceforge/plantuml/posimo/LabelImage.java +++ b/src/net/sourceforge/plantuml/posimo/LabelImage.java @@ -40,6 +40,7 @@ import net.sourceforge.plantuml.FontParam; import net.sourceforge.plantuml.ISkinParam; import net.sourceforge.plantuml.StringUtils; import net.sourceforge.plantuml.cucadiagram.Link; +import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.HorizontalAlignement; import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.TextBlock; @@ -61,14 +62,14 @@ public class LabelImage { // this.entity = entity; this.param = param; this.rose = rose; - this.name = TextBlockUtils.create(StringUtils.getWithNewlines(link.getLabel()), param.getFont(FontParam.CLASS, null), - Color.BLACK, HorizontalAlignement.CENTER); + this.name = TextBlockUtils.create(StringUtils.getWithNewlines(link.getLabel()), + new FontConfiguration(param.getFont(FontParam.CLASS, null), Color.BLACK), HorizontalAlignement.CENTER); } public Dimension2D getDimension(StringBounder stringBounder) { final Dimension2D dim = name.calculateDimension(stringBounder); return dim; - //return Dimension2DDouble.delta(dim, 2 * margin); + // return Dimension2DDouble.delta(dim, 2 * margin); } public void drawU(UGraphic ug, double x, double y) { diff --git a/src/net/sourceforge/plantuml/printskin/PrintSkin.java b/src/net/sourceforge/plantuml/printskin/PrintSkin.java index 5b50a3f15..3aa30fd14 100644 --- a/src/net/sourceforge/plantuml/printskin/PrintSkin.java +++ b/src/net/sourceforge/plantuml/printskin/PrintSkin.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5924 $ + * Revision $Revision: 6009 $ * */ package net.sourceforge.plantuml.printskin; @@ -41,7 +41,6 @@ import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.util.Arrays; -import java.util.EnumSet; import java.util.List; import net.sourceforge.plantuml.AbstractPSystem; @@ -49,6 +48,7 @@ import net.sourceforge.plantuml.Dimension2DDouble; import net.sourceforge.plantuml.EmptyImageBuilder; import net.sourceforge.plantuml.FileFormatOption; import net.sourceforge.plantuml.SkinParam; +import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.HorizontalAlignement; import net.sourceforge.plantuml.graphic.TextBlock; import net.sourceforge.plantuml.graphic.TextBlockUtils; @@ -73,7 +73,8 @@ class PrintSkin extends AbstractPSystem { private float ypos = 0; private float maxYpos = 0; - public List createFiles(File suggestedFile, FileFormatOption fileFormat) throws IOException, InterruptedException { + public List createFiles(File suggestedFile, FileFormatOption fileFormat) throws IOException, + InterruptedException { final List result = Arrays.asList(suggestedFile); final BufferedImage im = createImage(); @@ -92,10 +93,10 @@ class PrintSkin extends AbstractPSystem { final BufferedImage im = builder.getBufferedImage(); final Graphics2D g2d = builder.getGraphics2D(); - + ug = new UGraphicG2d(g2d, null, 1.0); - for (ComponentType type : ComponentType.all() ) { + for (ComponentType type : ComponentType.all()) { printComponent(type); ypos += 10; maxYpos = Math.max(maxYpos, ypos); @@ -128,22 +129,22 @@ class PrintSkin extends AbstractPSystem { } ug.getParam().setColor(Color.LIGHT_GRAY); ug.getParam().setBackcolor(Color.LIGHT_GRAY); - ug.draw(xpos-1, ypos-1, new URectangle(width+2, height+2)); - //g2d.drawRect((int) xpos - 1, (int) ypos - 1, (int) width + 2, (int) height + 2); + ug.draw(xpos - 1, ypos - 1, new URectangle(width + 2, height + 2)); + // g2d.drawRect((int) xpos - 1, (int) ypos - 1, (int) width + 2, (int) height + 2); - //final AffineTransform at = g2d.getTransform(); - //g2d.translate(xpos, ypos); + // final AffineTransform at = g2d.getTransform(); + // g2d.translate(xpos, ypos); ug.translate(xpos, ypos); ug.getParam().reset(); comp.drawU(ug, new Dimension2DDouble(width, height), new SimpleContext2D(false)); ug.translate(-xpos, -ypos); - //g2d.setTransform(at); + // g2d.setTransform(at); ypos += height; } private void println(String s) { - final TextBlock textBlock = TextBlockUtils.create(Arrays.asList(s), FONT1, Color.BLACK, + final TextBlock textBlock = TextBlockUtils.create(Arrays.asList(s), new FontConfiguration(FONT1, Color.BLACK), HorizontalAlignement.LEFT); textBlock.drawU(ug, xpos, ypos); ypos += textBlock.calculateDimension(ug.getStringBounder()).getHeight(); diff --git a/src/net/sourceforge/plantuml/sequencediagram/graphic/DrawableSetInitializer.java b/src/net/sourceforge/plantuml/sequencediagram/graphic/DrawableSetInitializer.java index ceec85d30..c52c27747 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/graphic/DrawableSetInitializer.java +++ b/src/net/sourceforge/plantuml/sequencediagram/graphic/DrawableSetInitializer.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5942 $ + * Revision $Revision: 6016 $ * */ package net.sourceforge.plantuml.sequencediagram.graphic; @@ -64,17 +64,15 @@ import net.sourceforge.plantuml.skin.Skin; class DrawableSetInitializer { + private ComponentType defaultLineType; private final DrawableSet drawableSet; private final boolean showTail; private double freeX = 0; private double freeY = 0; - // private final double groupingMargin = 10; private final double autonewpage; - // private int maxGrouping = 0; - private ConstraintSet constraintSet; public DrawableSetInitializer(Skin skin, ISkinParam skinParam, boolean showTail, double autonewpage) { @@ -86,11 +84,22 @@ class DrawableSetInitializer { private double lastFreeY = 0; + private boolean hasDelay() { + for (Event ev : drawableSet.getAllEvents()) { + if (ev instanceof Delay) { + return true; + } + } + return false; + } + public DrawableSet createDrawableSet(StringBounder stringBounder) { if (freeY != 0) { throw new IllegalStateException(); } + this.defaultLineType = hasDelay() ? ComponentType.CONTINUE_LINE : ComponentType.PARTICIPANT_LINE; + for (Participant p : drawableSet.getAllParticipants()) { prepareParticipant(stringBounder, p); } @@ -271,11 +280,11 @@ class DrawableSetInitializer { if (m.getType() != GroupingType.START) { throw new IllegalStateException(); } - final ISkinParam skinParam = new SkinParamBackcolored(drawableSet.getSkinParam(), m.getBackColorElement(), m - .getBackColorGeneral()); + final ISkinParam skinParam = new SkinParamBackcolored(drawableSet.getSkinParam(), m.getBackColorElement(), + m.getBackColorGeneral()); // this.maxGrouping++; - final List strings = m.getTitle().equals("group") ? Arrays.asList(m.getComment()) : Arrays.asList(m - .getTitle(), m.getComment()); + final List strings = m.getTitle().equals("group") ? Arrays.asList(m.getComment()) : Arrays.asList( + m.getTitle(), m.getComment()); final Component header = drawableSet.getSkin().createComponent(ComponentType.GROUPING_HEADER, skinParam, strings); final InGroupableList inGroupableList = new InGroupableList(m, freeY); @@ -387,7 +396,7 @@ class DrawableSetInitializer { p.getDisplay()); final Component tail = drawableSet.getSkin().createComponent(ComponentType.PARTICIPANT_TAIL, skinParam, p.getDisplay()); - final Component line = drawableSet.getSkin().createComponent(ComponentType.PARTICIPANT_LINE, + final Component line = drawableSet.getSkin().createComponent(this.defaultLineType, drawableSet.getSkinParam(), p.getDisplay()); final Component delayLine = drawableSet.getSkin().createComponent(ComponentType.DELAY_LINE, drawableSet.getSkinParam(), p.getDisplay()); @@ -398,7 +407,7 @@ class DrawableSetInitializer { p.getDisplay()); final Component tail = drawableSet.getSkin().createComponent(ComponentType.ACTOR_TAIL, skinParam, p.getDisplay()); - final Component line = drawableSet.getSkin().createComponent(ComponentType.ACTOR_LINE, + final Component line = drawableSet.getSkin().createComponent(this.defaultLineType, drawableSet.getSkinParam(), p.getDisplay()); final Component delayLine = drawableSet.getSkin().createComponent(ComponentType.DELAY_LINE, drawableSet.getSkinParam(), p.getDisplay()); diff --git a/src/net/sourceforge/plantuml/sequencediagram/graphic/LifeLine.java b/src/net/sourceforge/plantuml/sequencediagram/graphic/LifeLine.java index b6f4fa808..61e10ab21 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/graphic/LifeLine.java +++ b/src/net/sourceforge/plantuml/sequencediagram/graphic/LifeLine.java @@ -28,13 +28,14 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5636 $ + * Revision $Revision: 6026 $ * */ package net.sourceforge.plantuml.sequencediagram.graphic; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.List; import net.sourceforge.plantuml.ISkinParam; @@ -167,18 +168,22 @@ class LifeLine { return delta; } - Collection getSegments() { - final Collection result = new ArrayList(); + Collection getSegments() { + final Collection result = new ArrayList(); for (int i = 0; i < events.size(); i++) { - final Segment seg = getSegment(i); + final SegmentColored seg = getSegment(i); if (seg != null) { - result.add(seg); + result.addAll(cutSegmentIfNeed(seg, participant.getDelays())); } } return result; } - private Segment getSegment(int i) { + static Collection cutSegmentIfNeed(SegmentColored seg, Collection delays) { + return Collections.singleton(seg); + } + + private SegmentColored getSegment(int i) { if (events.get(i).type != LifeSegmentVariation.LARGER) { return null; } @@ -190,10 +195,10 @@ class LifeLine { level--; } if (level == 0) { - return new Segment(events.get(i).y, events.get(j).y, events.get(i).backcolor); + return new SegmentColored(events.get(i).y, events.get(j).y, events.get(i).backcolor); } } - return new Segment(events.get(i).y, events.get(events.size() - 1).y, events.get(i).backcolor); + return new SegmentColored(events.get(i).y, events.get(events.size() - 1).y, events.get(i).backcolor); } public void drawU(UGraphic ug, Skin skin, ISkinParam skinParam) { @@ -204,10 +209,10 @@ class LifeLine { ug.translate(getStartingX(stringBounder), 0); - for (Segment seg : getSegments()) { + for (SegmentColored seg : getSegments()) { final ISkinParam skinParam2 = new SkinParamBackcolored(skinParam, seg.getSpecificBackColor()); final Component comp = skin.createComponent(ComponentType.ALIVE_LINE, skinParam2, null); - final int currentLevel = getLevel(seg.getPos1()); + final int currentLevel = getLevel(seg.getSegment().getPos1()); seg.drawU(ug, comp, currentLevel); } diff --git a/src/net/sourceforge/plantuml/sequencediagram/graphic/LivingParticipantBox.java b/src/net/sourceforge/plantuml/sequencediagram/graphic/LivingParticipantBox.java index 8c9a2d33e..f16befe69 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/graphic/LivingParticipantBox.java +++ b/src/net/sourceforge/plantuml/sequencediagram/graphic/LivingParticipantBox.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5870 $ + * Revision $Revision: 6024 $ * */ package net.sourceforge.plantuml.sequencediagram.graphic; @@ -61,14 +61,14 @@ public class LivingParticipantBox implements InGroupable { return lifeLine; } - public Segment getLiveThicknessAt(StringBounder stringBounder, double y) { + public SegmentColored getLiveThicknessAt(StringBounder stringBounder, double y) { final double left = lifeLine.getLeftShift(y); assert left >= 0; final double right = lifeLine.getRightShift(y); assert right >= 0 : "right=" + right; final double centerX = participantBox.getCenterX(stringBounder); // System.err.println("Attention, null for segment"); - return new Segment(centerX - left, centerX + right, null); + return new SegmentColored(centerX - left, centerX + right, null); } public void drawLineU(UGraphic ug, double startingY, double endingY, boolean showTail) { diff --git a/src/net/sourceforge/plantuml/sequencediagram/graphic/MessageArrow.java b/src/net/sourceforge/plantuml/sequencediagram/graphic/MessageArrow.java index 9bae61128..1a477ea10 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/graphic/MessageArrow.java +++ b/src/net/sourceforge/plantuml/sequencediagram/graphic/MessageArrow.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5870 $ + * Revision $Revision: 6026 $ * */ package net.sourceforge.plantuml.sequencediagram.graphic; @@ -71,12 +71,12 @@ class MessageArrow extends Arrow { private double getLeftStartInternal(StringBounder stringBounder) { return getParticipantAt(stringBounder, NotePosition.LEFT).getLiveThicknessAt(stringBounder, - getArrowYStartLevel(stringBounder)).getPos2(); + getArrowYStartLevel(stringBounder)).getSegment().getPos2(); } private double getRightEndInternal(StringBounder stringBounder) { return getParticipantAt(stringBounder, NotePosition.RIGHT).getLiveThicknessAt(stringBounder, - getArrowYStartLevel(stringBounder)).getPos1(); + getArrowYStartLevel(stringBounder)).getSegment().getPos1(); } @Override diff --git a/src/net/sourceforge/plantuml/sequencediagram/graphic/MessageExoArrow.java b/src/net/sourceforge/plantuml/sequencediagram/graphic/MessageExoArrow.java index 97df4f0f6..b25a4bc25 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/graphic/MessageExoArrow.java +++ b/src/net/sourceforge/plantuml/sequencediagram/graphic/MessageExoArrow.java @@ -70,12 +70,12 @@ public class MessageExoArrow extends Arrow { // - getPreferredWidth(stringBounder)); return 0; } - return p.getLiveThicknessAt(stringBounder, getArrowYStartLevel(stringBounder)).getPos2(); + return p.getLiveThicknessAt(stringBounder, getArrowYStartLevel(stringBounder)).getSegment().getPos2(); } private double getRightEndInternal(StringBounder stringBounder, double maxX) { if (type == MessageExoType.FROM_LEFT || type == MessageExoType.TO_LEFT) { - return p.getLiveThicknessAt(stringBounder, getArrowYStartLevel(stringBounder)).getPos1(); + return p.getLiveThicknessAt(stringBounder, getArrowYStartLevel(stringBounder)).getSegment().getPos1(); } return Math.max(maxX, getLeftStartInternal(stringBounder) + getPreferredWidth(stringBounder)); } @@ -159,5 +159,5 @@ public class MessageExoArrow extends Arrow { public double getActualWidth(StringBounder stringBounder) { return getActualWidth(stringBounder, getMaxX()); } - + } diff --git a/src/net/sourceforge/plantuml/sequencediagram/graphic/MessageSelfArrow.java b/src/net/sourceforge/plantuml/sequencediagram/graphic/MessageSelfArrow.java index 803dad82b..1424cf154 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/graphic/MessageSelfArrow.java +++ b/src/net/sourceforge/plantuml/sequencediagram/graphic/MessageSelfArrow.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5870 $ + * Revision $Revision: 6026 $ * */ package net.sourceforge.plantuml.sequencediagram.graphic; @@ -73,7 +73,7 @@ class MessageSelfArrow extends Arrow { @Override public double getStartingX(StringBounder stringBounder) { - return p1.getLiveThicknessAt(stringBounder, getArrowYStartLevel(stringBounder)).getPos2(); + return p1.getLiveThicknessAt(stringBounder, getArrowYStartLevel(stringBounder)).getSegment().getPos2(); } @Override diff --git a/src/net/sourceforge/plantuml/sequencediagram/graphic/NoteBox.java b/src/net/sourceforge/plantuml/sequencediagram/graphic/NoteBox.java index 45dced98d..664445379 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/graphic/NoteBox.java +++ b/src/net/sourceforge/plantuml/sequencediagram/graphic/NoteBox.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5870 $ + * Revision $Revision: 6026 $ * */ package net.sourceforge.plantuml.sequencediagram.graphic; @@ -91,12 +91,12 @@ class NoteBox extends GraphicalElement implements InGroupable { @Override public double getStartingX(StringBounder stringBounder) { - final Segment segment = getSegment(stringBounder); + final SegmentColored segment = getSegment(stringBounder); final int xStart; if (position == NotePosition.LEFT) { - xStart = (int) (segment.getPos1() - getPreferredWidth(stringBounder)); + xStart = (int) (segment.getSegment().getPos1() - getPreferredWidth(stringBounder)); } else if (position == NotePosition.RIGHT) { - xStart = (int) (segment.getPos2()); + xStart = (int) (segment.getSegment().getPos2()); } else if (position == NotePosition.OVER) { xStart = (int) (p1.getParticipantBox().getCenterX(stringBounder) - getPreferredWidth(stringBounder) / 2); } else if (position == NotePosition.OVER_SEVERAL) { @@ -106,15 +106,16 @@ class NoteBox extends GraphicalElement implements InGroupable { } else { throw new IllegalStateException(); } -// if (InGroupableList.NEW_METHOD) { -// System.err.println("GET STARTING X OF " + this + " " + (xStart + delta)); -// } + // if (InGroupableList.NEW_METHOD) { + // System.err.println("GET STARTING X OF " + this + " " + (xStart + + // delta)); + // } return xStart + delta; } - private Segment getSegment(StringBounder stringBounder) { - final Segment segment = p1.getLiveThicknessAt(stringBounder, getStartingY()); - final Segment segment2 = p1.getLiveThicknessAt(stringBounder, getStartingY() + private SegmentColored getSegment(StringBounder stringBounder) { + final SegmentColored segment = p1.getLiveThicknessAt(stringBounder, getStartingY()); + final SegmentColored segment2 = p1.getLiveThicknessAt(stringBounder, getStartingY() + comp.getPreferredHeight(stringBounder)); return segment.merge(segment2); } @@ -135,5 +136,4 @@ class NoteBox extends GraphicalElement implements InGroupable { return toString(); } - } diff --git a/src/net/sourceforge/plantuml/sequencediagram/graphic/ParticipantBox.java b/src/net/sourceforge/plantuml/sequencediagram/graphic/ParticipantBox.java index d9afb7d64..453a0109b 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/graphic/ParticipantBox.java +++ b/src/net/sourceforge/plantuml/sequencediagram/graphic/ParticipantBox.java @@ -28,12 +28,14 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5942 $ + * Revision $Revision: 6016 $ * */ package net.sourceforge.plantuml.sequencediagram.graphic; import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; import java.util.List; import net.sourceforge.plantuml.Dimension2DDouble; @@ -106,8 +108,10 @@ public class ParticipantBox implements Pushable { final double y1 = topStartingY - head.getPreferredHeight(stringBounder) - line.getPreferredHeight(stringBounder) / 2; ug.translate(startingX + outMargin, y1); - head.drawU(ug, new Dimension2DDouble(head.getPreferredWidth(stringBounder), head - .getPreferredHeight(stringBounder)), new SimpleContext2D(false)); + head.drawU( + ug, + new Dimension2DDouble(head.getPreferredWidth(stringBounder), head.getPreferredHeight(stringBounder)), + new SimpleContext2D(false)); ug.setTranslate(atX, atY); } @@ -119,8 +123,10 @@ public class ParticipantBox implements Pushable { // throw new IllegalStateException(); // } ug.translate(startingX + outMargin, positionTail); - tail.drawU(ug, new Dimension2DDouble(tail.getPreferredWidth(stringBounder), tail - .getPreferredHeight(stringBounder)), new SimpleContext2D(false)); + tail.drawU( + ug, + new Dimension2DDouble(tail.getPreferredWidth(stringBounder), tail.getPreferredHeight(stringBounder)), + new SimpleContext2D(false)); ug.setTranslate(atX, atY); } } @@ -128,8 +134,9 @@ public class ParticipantBox implements Pushable { public void drawParticipantHead(UGraphic ug) { ug.translate(outMargin, 0); final StringBounder stringBounder = ug.getStringBounder(); - head.drawU(ug, new Dimension2DDouble(head.getPreferredWidth(stringBounder), head - .getPreferredHeight(stringBounder)), new SimpleContext2D(false)); + head.drawU(ug, + new Dimension2DDouble(head.getPreferredWidth(stringBounder), head.getPreferredHeight(stringBounder)), + new SimpleContext2D(false)); ug.translate(-outMargin, 0); } @@ -175,7 +182,10 @@ public class ParticipantBox implements Pushable { public void addDelay(GraphicalDelayText delay) { this.delays.add(delay); + } + public Collection getDelays() { + return Collections.unmodifiableCollection(delays); } } diff --git a/src/net/sourceforge/plantuml/sequencediagram/graphic/ParticipantBoxSimple.java b/src/net/sourceforge/plantuml/sequencediagram/graphic/ParticipantBoxSimple.java index 593c4e60b..2ff325c03 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/graphic/ParticipantBoxSimple.java +++ b/src/net/sourceforge/plantuml/sequencediagram/graphic/ParticipantBoxSimple.java @@ -28,11 +28,13 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5249 $ + * Revision $Revision: 6016 $ * */ package net.sourceforge.plantuml.sequencediagram.graphic; +import java.util.Collection; + import net.sourceforge.plantuml.graphic.StringBounder; class ParticipantBoxSimple implements Pushable { @@ -66,5 +68,9 @@ class ParticipantBoxSimple implements Pushable { return 0; } + public Collection getDelays() { + return null; + } + } diff --git a/src/net/sourceforge/plantuml/sequencediagram/graphic/Pushable.java b/src/net/sourceforge/plantuml/sequencediagram/graphic/Pushable.java index c06c7d63c..b3ff81d01 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/graphic/Pushable.java +++ b/src/net/sourceforge/plantuml/sequencediagram/graphic/Pushable.java @@ -28,11 +28,13 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5249 $ + * Revision $Revision: 6016 $ * */ package net.sourceforge.plantuml.sequencediagram.graphic; +import java.util.Collection; + import net.sourceforge.plantuml.graphic.StringBounder; interface Pushable { @@ -42,5 +44,8 @@ interface Pushable { double getCenterX(StringBounder stringBounder); void pushToLeft(double deltaX); + + public Collection getDelays(); + } \ No newline at end of file diff --git a/src/net/sourceforge/plantuml/sequencediagram/graphic/Segment.java b/src/net/sourceforge/plantuml/sequencediagram/graphic/Segment.java index 1b1595012..e959ac11d 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/graphic/Segment.java +++ b/src/net/sourceforge/plantuml/sequencediagram/graphic/Segment.java @@ -33,33 +33,25 @@ */ package net.sourceforge.plantuml.sequencediagram.graphic; -import java.awt.geom.Dimension2D; - -import net.sourceforge.plantuml.Dimension2DDouble; -import net.sourceforge.plantuml.graphic.HtmlColor; -import net.sourceforge.plantuml.graphic.StringBounder; -import net.sourceforge.plantuml.skin.Component; -import net.sourceforge.plantuml.skin.SimpleContext2D; -import net.sourceforge.plantuml.ugraphic.UGraphic; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; class Segment { final private double pos1; final private double pos2; - final private HtmlColor backcolor; - Segment(double pos1, double pos2, HtmlColor backcolor) { + Segment(double pos1, double pos2) { this.pos1 = pos1; this.pos2 = pos2; - this.backcolor = backcolor; if (pos2 < pos1) { - throw new IllegalArgumentException("pos1=" + pos1 + " pos2=" + pos2); + throw new IllegalArgumentException(); } } - - public HtmlColor getSpecificBackColor() { - return backcolor; - } @Override public boolean equals(Object obj) { @@ -72,40 +64,53 @@ class Segment { return new Double(pos1).hashCode() + new Double(pos2).hashCode(); } - public boolean contains(double y) { + final public boolean contains(double y) { return y >= pos1 && y <= pos2; } + final public boolean contains(Segment other) { + return contains(other.pos1) && contains(other.pos2); + } + @Override public String toString() { return "" + pos1 + " - " + pos2; } - public void drawU(UGraphic ug, Component comp, int level) { - final double atX = ug.getTranslateX(); - final double atY = ug.getTranslateY(); - - final StringBounder stringBounder = ug.getStringBounder(); - ug.translate((level - 1) * comp.getPreferredWidth(stringBounder) / 2, pos1); - final Dimension2D dim = new Dimension2DDouble(comp.getPreferredWidth(stringBounder), pos2 - pos1); - comp.drawU(ug, dim, new SimpleContext2D(false)); - ug.setTranslate(atX, atY); - } - - public double getLength() { + final public double getLength() { return pos2 - pos1; } - public double getPos1() { + final public double getPos1() { return pos1; } - public double getPos2() { + final public double getPos2() { return pos2; } public Segment merge(Segment this2) { - return new Segment(Math.min(this.pos1, this2.pos1), Math.max(this.pos2, this2.pos2), backcolor); + return new Segment(Math.min(this.pos1, this2.pos1), Math.max(this.pos2, this2.pos2)); + } + + public Collection cutSegmentIfNeed(Collection delays) { + final List result = new ArrayList(delays); + Collections.sort(result, new SortPos1()); + result.add(this); + return Collections.unmodifiableCollection(result); + } + + private Collection cutSegmentIfNeed(Segment other) { + if (this.contains(other) == false) { + throw new IllegalArgumentException(); + } + return Arrays.asList(new Segment(this.pos1, other.pos1), new Segment(this.pos2, other.pos2)); + } + + static class SortPos1 implements Comparator { + public int compare(Segment segA, Segment segB) { + return (int) Math.signum(segB.pos1 - segA.pos1); + } } } diff --git a/src/net/sourceforge/plantuml/sequencediagram/graphic/SegmentColored.java b/src/net/sourceforge/plantuml/sequencediagram/graphic/SegmentColored.java new file mode 100644 index 000000000..5a9fba82b --- /dev/null +++ b/src/net/sourceforge/plantuml/sequencediagram/graphic/SegmentColored.java @@ -0,0 +1,99 @@ +/* ======================================================================== + * PlantUML : a free UML diagram generator + * ======================================================================== + * + * (C) Copyright 2009, Arnaud Roques + * + * Project Info: http://plantuml.sourceforge.net + * + * 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 Lesser 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. + * + * [Java is a trademark or registered trademark of Sun Microsystems, Inc. + * in the United States and other countries.] + * + * Original Author: Arnaud Roques + * + * Revision $Revision: 6026 $ + * + */ +package net.sourceforge.plantuml.sequencediagram.graphic; + +import java.awt.geom.Dimension2D; + +import net.sourceforge.plantuml.Dimension2DDouble; +import net.sourceforge.plantuml.graphic.HtmlColor; +import net.sourceforge.plantuml.graphic.StringBounder; +import net.sourceforge.plantuml.skin.Component; +import net.sourceforge.plantuml.skin.SimpleContext2D; +import net.sourceforge.plantuml.ugraphic.UGraphic; + +class SegmentColored { + + final private Segment segment; + final private HtmlColor backcolor; + + SegmentColored(double pos1, double pos2, HtmlColor backcolor) { + this(new Segment(pos1, pos2), backcolor); + } + + private SegmentColored(Segment segment, HtmlColor backcolor) { + this.segment = segment; + this.backcolor = backcolor; + } + + public HtmlColor getSpecificBackColor() { + return backcolor; + } + + @Override + public boolean equals(Object obj) { + final SegmentColored this2 = (SegmentColored) obj; + return this.segment.equals(this2.segment); + } + + @Override + public int hashCode() { + return this.segment.hashCode(); + } + + @Override + public String toString() { + return this.segment.toString(); + } + + public void drawU(UGraphic ug, Component comp, int level) { + final double atX = ug.getTranslateX(); + final double atY = ug.getTranslateY(); + + final StringBounder stringBounder = ug.getStringBounder(); + ug.translate((level - 1) * comp.getPreferredWidth(stringBounder) / 2, segment.getPos1()); + final Dimension2D dim = new Dimension2DDouble(comp.getPreferredWidth(stringBounder), segment.getPos2() + - segment.getPos1()); + comp.drawU(ug, dim, new SimpleContext2D(false)); + ug.setTranslate(atX, atY); + } + + public SegmentColored merge(SegmentColored this2) { + return new SegmentColored(this.segment.merge(this2.segment), backcolor); + } + + public final Segment getSegment() { + return segment; + } + +} diff --git a/src/net/sourceforge/plantuml/sequencediagram/graphic/Step1Message.java b/src/net/sourceforge/plantuml/sequencediagram/graphic/Step1Message.java index 4d40fd633..d8b148d99 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/graphic/Step1Message.java +++ b/src/net/sourceforge/plantuml/sequencediagram/graphic/Step1Message.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5928 $ + * Revision $Revision: 6026 $ * */ package net.sourceforge.plantuml.sequencediagram.graphic; @@ -90,7 +90,8 @@ class Step1Message extends Step1Abstract { final double length; if (isSelfMessage()) { length = graphic.getArrowOnlyWidth(getStringBounder()) - + getLivingParticipantBox1().getLiveThicknessAt(getStringBounder(), arrowYStartLevel).getLength(); + + getLivingParticipantBox1().getLiveThicknessAt(getStringBounder(), arrowYStartLevel) + .getSegment().getLength(); } else { length = graphic.getArrowOnlyWidth(getStringBounder()) + getLivingParticipantBox(NotePosition.LEFT).getLifeLine().getRightShift(arrowYStartLevel) diff --git a/src/net/sourceforge/plantuml/skin/AbstractTextualComponent.java b/src/net/sourceforge/plantuml/skin/AbstractTextualComponent.java index 20b54c4db..b9bdb19d4 100644 --- a/src/net/sourceforge/plantuml/skin/AbstractTextualComponent.java +++ b/src/net/sourceforge/plantuml/skin/AbstractTextualComponent.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5741 $ + * Revision $Revision: 6009 $ * */ package net.sourceforge.plantuml.skin; @@ -39,6 +39,7 @@ import java.awt.geom.Dimension2D; import java.util.Arrays; import java.util.List; +import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.HorizontalAlignement; import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.TextBlock; @@ -76,7 +77,7 @@ public abstract class AbstractTextualComponent extends AbstractComponent { if (strings.size() == 1 && strings.get(0).length() == 0) { textBlock = new TextBlockEmpty(); } else { - textBlock = TextBlockUtils.create(strings, font, fontColor, horizontalAlignement); + textBlock = TextBlockUtils.create(strings, new FontConfiguration(font, fontColor), horizontalAlignement); } } diff --git a/src/net/sourceforge/plantuml/skin/ComponentType.java b/src/net/sourceforge/plantuml/skin/ComponentType.java index f37582939..eeb1eb3a4 100644 --- a/src/net/sourceforge/plantuml/skin/ComponentType.java +++ b/src/net/sourceforge/plantuml/skin/ComponentType.java @@ -46,15 +46,17 @@ public class ComponentType { private static final List nonArrows = new ArrayList(); static public final ComponentType ACTOR_HEAD = new ComponentType("ACTOR_HEAD"); - static public final ComponentType ACTOR_LINE = new ComponentType("ACTOR_LINE"); static public final ComponentType ACTOR_TAIL = new ComponentType("ACTOR_TAIL"); // static public final ComponentType ALIVE_LINE = new ComponentType("ALIVE_LINE"); - static public final ComponentType DELAY_LINE = new ComponentType("DELAY_LINE"); static public final ComponentType DELAY_TEXT = new ComponentType("DELAY_TEXT"); static public final ComponentType DESTROY = new ComponentType("DESTROY"); + static public final ComponentType DELAY_LINE = new ComponentType("DELAY_LINE"); + static public final ComponentType PARTICIPANT_LINE = new ComponentType("PARTICIPANT_LINE"); + static public final ComponentType CONTINUE_LINE = new ComponentType("CONTINUE_LINE"); + // static public final ComponentType GROUPING_BODY = new ComponentType("GROUPING_BODY"); static public final ComponentType GROUPING_ELSE = new ComponentType("GROUPING_ELSE"); @@ -68,7 +70,6 @@ public class ComponentType { // static public final ComponentType PARTICIPANT_HEAD = new ComponentType("PARTICIPANT_HEAD"); - static public final ComponentType PARTICIPANT_LINE = new ComponentType("PARTICIPANT_LINE"); static public final ComponentType PARTICIPANT_TAIL = new ComponentType("PARTICIPANT_TAIL"); // diff --git a/src/net/sourceforge/plantuml/skin/GrayComponent.java b/src/net/sourceforge/plantuml/skin/GrayComponent.java index 3fa42da79..6123f9ca8 100644 --- a/src/net/sourceforge/plantuml/skin/GrayComponent.java +++ b/src/net/sourceforge/plantuml/skin/GrayComponent.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 4167 $ + * Revision $Revision: 6009 $ * */ package net.sourceforge.plantuml.skin; @@ -39,6 +39,7 @@ import java.awt.geom.Dimension2D; import java.util.ArrayList; import java.util.List; +import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.HorizontalAlignement; import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.TextBlock; @@ -70,7 +71,8 @@ class GrayComponent extends AbstractComponent { strings.add(n.substring(i, Math.min(i + split, n.length()))); } - final TextBlock textBlock = TextBlockUtils.create(strings, NORMAL, Color.BLACK, HorizontalAlignement.LEFT); + final TextBlock textBlock = TextBlockUtils.create(strings, new FontConfiguration(NORMAL, Color.BLACK), + HorizontalAlignement.LEFT); textBlock.drawU(ug, 0, 0); } diff --git a/src/net/sourceforge/plantuml/skin/bluemodern/BlueModern.java b/src/net/sourceforge/plantuml/skin/bluemodern/BlueModern.java index f9bc9e931..723ee6dbd 100644 --- a/src/net/sourceforge/plantuml/skin/bluemodern/BlueModern.java +++ b/src/net/sourceforge/plantuml/skin/bluemodern/BlueModern.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5944 $ + * Revision $Revision: 6008 $ * */ package net.sourceforge.plantuml.skin.bluemodern; @@ -82,15 +82,15 @@ public class BlueModern implements Skin { if (type == ComponentType.PARTICIPANT_LINE) { return new ComponentBlueModernLine(lineColor); } + if (type == ComponentType.CONTINUE_LINE) { + return new ComponentBlueModernLine(lineColor); + } if (type == ComponentType.ACTOR_HEAD) { return new ComponentBlueModernActor(blue2, blue1, blue1, participantFont, stringsToDisplay, true); } if (type == ComponentType.ACTOR_TAIL) { return new ComponentBlueModernActor(blue2, blue1, blue1, participantFont, stringsToDisplay, false); } - if (type == ComponentType.ACTOR_LINE) { - return new ComponentBlueModernLine(lineColor); - } if (type == ComponentType.NOTE) { return new ComponentBlueModernNote(Color.WHITE, Color.BLACK, Color.BLACK, normalFont, stringsToDisplay); } diff --git a/src/net/sourceforge/plantuml/skin/bluemodern/ComponentBlueModernGroupingHeader.java b/src/net/sourceforge/plantuml/skin/bluemodern/ComponentBlueModernGroupingHeader.java index e058374c8..67c6b1668 100644 --- a/src/net/sourceforge/plantuml/skin/bluemodern/ComponentBlueModernGroupingHeader.java +++ b/src/net/sourceforge/plantuml/skin/bluemodern/ComponentBlueModernGroupingHeader.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5889 $ + * Revision $Revision: 6009 $ * */ package net.sourceforge.plantuml.skin.bluemodern; @@ -39,6 +39,7 @@ import java.awt.geom.Dimension2D; import java.util.Arrays; import java.util.List; +import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.HorizontalAlignement; import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.TextBlock; @@ -71,8 +72,8 @@ public class ComponentBlueModernGroupingHeader extends AbstractTextualComponent if (strings.size() == 1 || strings.get(1) == null) { this.commentTextBlock = null; } else { - this.commentTextBlock = TextBlockUtils.create(Arrays.asList("[" + strings.get(1) + "]"), smallFont, - fontColor2, HorizontalAlignement.LEFT); + this.commentTextBlock = TextBlockUtils.create(Arrays.asList("[" + strings.get(1) + "]"), + new FontConfiguration(smallFont, fontColor2), HorizontalAlignement.LEFT); } } @@ -106,7 +107,6 @@ public class ComponentBlueModernGroupingHeader extends AbstractTextualComponent ug.draw(0, 0, new URectangle(dimensionToUse.getWidth(), dimensionToUse.getHeight())); } - @Override protected void drawInternalU(UGraphic ug, Dimension2D dimensionToUse) { final StringBounder stringBounder = ug.getStringBounder(); @@ -128,7 +128,7 @@ public class ComponentBlueModernGroupingHeader extends AbstractTextualComponent ug.getParam().setColor(borderColor); ug.draw(0, 0, polygon); ug.draw(0, 0, new ULine(dimensionToUse.getWidth(), 0)); - + final double heightWithoutPadding = dimensionToUse.getHeight() - getPaddingY(); ug.draw(dimensionToUse.getWidth(), 0, new ULine(0, heightWithoutPadding)); @@ -138,11 +138,11 @@ public class ComponentBlueModernGroupingHeader extends AbstractTextualComponent getTextBlock().drawU(ug, getMarginX1(), getMarginY()); if (commentTextBlock != null) { - //final Dimension2D size = commentTextBlock.calculateDimension(stringBounder); + // final Dimension2D size = commentTextBlock.calculateDimension(stringBounder); ug.getParam().setColor(generalBackgroundColor); final int x1 = getMarginX1() + textWidth; final int y2 = getMarginY() + 1; - //ug.draw(x1, y2, new URectangle(size.getWidth() + 2 * commentMargin, size.getHeight())); + // ug.draw(x1, y2, new URectangle(size.getWidth() + 2 * commentMargin, size.getHeight())); commentTextBlock.drawU(ug, x1 + commentMargin, y2); } diff --git a/src/net/sourceforge/plantuml/skin/bluemodern/ComponentBlueModernSelfArrow.java b/src/net/sourceforge/plantuml/skin/bluemodern/ComponentBlueModernSelfArrow.java index d56c634b1..f069222d5 100644 --- a/src/net/sourceforge/plantuml/skin/bluemodern/ComponentBlueModernSelfArrow.java +++ b/src/net/sourceforge/plantuml/skin/bluemodern/ComponentBlueModernSelfArrow.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5945 $ + * Revision $Revision: 5977 $ * */ package net.sourceforge.plantuml.skin.bluemodern; @@ -107,12 +107,12 @@ public class ComponentBlueModernSelfArrow extends AbstractComponentBlueModernArr polygon.addPoint(getArrowDeltaX(), textHeight - getArrowDeltaY() + delta); polygon.addPoint(0, textHeight + delta); polygon.addPoint(getArrowDeltaX(), textHeight + delta); - } else if (getArrowConfiguration().getPart() == ArrowPart.TOP_PART) { - polygon.addPoint(getArrowDeltaX(), textHeight - getArrowDeltaY() + delta); + } else if (getArrowConfiguration().getPart() == ArrowPart.BOTTOM_PART) { + polygon.addPoint(getArrowDeltaX(), textHeight + delta); polygon.addPoint(0, textHeight + delta); polygon.addPoint(getArrowDeltaX(), textHeight + getArrowDeltaY() + delta); } else { - polygon.addPoint(getArrowDeltaX(), textHeight + delta); + polygon.addPoint(getArrowDeltaX(), textHeight - getArrowDeltaY() + delta); polygon.addPoint(0, textHeight + delta); polygon.addPoint(getArrowDeltaX(), textHeight + getArrowDeltaY() + delta); } diff --git a/src/net/sourceforge/plantuml/skin/rose/ComponentRoseDelayLine.java b/src/net/sourceforge/plantuml/skin/rose/ComponentRoseDelayLine.java index 4981cbf57..0f9b8195e 100644 --- a/src/net/sourceforge/plantuml/skin/rose/ComponentRoseDelayLine.java +++ b/src/net/sourceforge/plantuml/skin/rose/ComponentRoseDelayLine.java @@ -53,10 +53,19 @@ public class ComponentRoseDelayLine extends AbstractComponent { @Override protected void drawInternalU(UGraphic ug, Dimension2D dimensionToUse) { ug.getParam().setColor(color); - //stroke(ug, 0.4, 2.5); - stroke(ug, 0.2, 1.5); + // stroke(ug, 0.4, 2.5); + stroke(ug, 1, 4); final int x = (int) (dimensionToUse.getWidth() / 2); + ug.setAntiAliasing(false); ug.draw(x, 0, new ULine(0, dimensionToUse.getHeight())); + ug.setAntiAliasing(true); + final double dx = 5; + final double dy = 1.5; + final double space = 1.5; + final double middle = dimensionToUse.getHeight() / 2; + ug.getParam().setStroke(new UStroke(1)); +// ug.draw(x - dx, middle + dy - space, new ULine(2 * dx, -2 * dy)); +// ug.draw(x - dx, middle + dy + space, new ULine(2 * dx, -2 * dy)); ug.getParam().setStroke(new UStroke()); } diff --git a/src/net/sourceforge/plantuml/skin/rose/ComponentRoseGroupingHeader.java b/src/net/sourceforge/plantuml/skin/rose/ComponentRoseGroupingHeader.java index 232b65784..b8e501447 100644 --- a/src/net/sourceforge/plantuml/skin/rose/ComponentRoseGroupingHeader.java +++ b/src/net/sourceforge/plantuml/skin/rose/ComponentRoseGroupingHeader.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5889 $ + * Revision $Revision: 6009 $ * */ package net.sourceforge.plantuml.skin.rose; @@ -39,6 +39,7 @@ import java.awt.geom.Dimension2D; import java.util.Arrays; import java.util.List; +import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.HorizontalAlignement; import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.TextBlock; @@ -60,19 +61,16 @@ public class ComponentRoseGroupingHeader extends AbstractTextualComponent { private final Color groupBackground; private final Color background; - public ComponentRoseGroupingHeader(Color fontColor, Color background, - Color groupBackground, Font bigFont, Font smallFont, - List strings) { - super(strings.get(0), fontColor, bigFont, HorizontalAlignement.LEFT, - 15, 30, 1); + public ComponentRoseGroupingHeader(Color fontColor, Color background, Color groupBackground, Font bigFont, + Font smallFont, List strings) { + super(strings.get(0), fontColor, bigFont, HorizontalAlignement.LEFT, 15, 30, 1); this.groupBackground = groupBackground; this.background = background; if (strings.size() == 1 || strings.get(1) == null) { this.commentTextBlock = null; } else { - this.commentTextBlock = TextBlockUtils.create(Arrays.asList("[" - + strings.get(1) + "]"), smallFont, fontColor, - HorizontalAlignement.LEFT); + this.commentTextBlock = TextBlockUtils.create(Arrays.asList("[" + strings.get(1) + "]"), + new FontConfiguration(smallFont, fontColor), HorizontalAlignement.LEFT); } } @@ -87,8 +85,7 @@ public class ComponentRoseGroupingHeader extends AbstractTextualComponent { if (commentTextBlock == null) { sup = commentMargin * 2; } else { - final Dimension2D size = commentTextBlock - .calculateDimension(stringBounder); + final Dimension2D size = commentTextBlock.calculateDimension(stringBounder); sup = getMarginX1() + commentMargin + size.getWidth(); } @@ -101,15 +98,13 @@ public class ComponentRoseGroupingHeader extends AbstractTextualComponent { } @Override - protected void drawBackgroundInternalU(UGraphic ug, - Dimension2D dimensionToUse) { + protected void drawBackgroundInternalU(UGraphic ug, Dimension2D dimensionToUse) { if (this.background == null) { return; } ug.getParam().setColor(null); ug.getParam().setBackcolor(background); - ug.draw(0, 0, new URectangle(dimensionToUse.getWidth(), dimensionToUse - .getHeight())); + ug.draw(0, 0, new URectangle(dimensionToUse.getWidth(), dimensionToUse.getHeight())); } @Override @@ -134,10 +129,10 @@ public class ComponentRoseGroupingHeader extends AbstractTextualComponent { ug.draw(0, 0, polygon); final double heightWithoutPadding = dimensionToUse.getHeight() - getPaddingY(); - + ug.draw(0, 0, new ULine(dimensionToUse.getWidth(), 0)); ug.draw(dimensionToUse.getWidth(), 0, new ULine(0, heightWithoutPadding)); - ug.draw(0, textHeight, new ULine(0, heightWithoutPadding-textHeight)); + ug.draw(0, textHeight, new ULine(0, heightWithoutPadding - textHeight)); ug.getParam().setStroke(new UStroke()); getTextBlock().drawU(ug, getMarginX1(), getMarginY()); diff --git a/src/net/sourceforge/plantuml/skin/rose/ComponentRoseLine.java b/src/net/sourceforge/plantuml/skin/rose/ComponentRoseLine.java index 35a76fd0e..0acc4b341 100644 --- a/src/net/sourceforge/plantuml/skin/rose/ComponentRoseLine.java +++ b/src/net/sourceforge/plantuml/skin/rose/ComponentRoseLine.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5937 $ + * Revision $Revision: 6008 $ * */ package net.sourceforge.plantuml.skin.rose; @@ -45,15 +45,21 @@ import net.sourceforge.plantuml.ugraphic.UStroke; public class ComponentRoseLine extends AbstractComponent { private final Color color; + private final boolean continueLine; - public ComponentRoseLine(Color color) { + public ComponentRoseLine(Color color, boolean continueLine) { this.color = color; + this.continueLine = continueLine; } @Override protected void drawInternalU(UGraphic ug, Dimension2D dimensionToUse) { ug.getParam().setColor(color); - stroke(ug, 5, 5); + if (continueLine) { + ug.getParam().setStroke(new UStroke()); + } else { + stroke(ug, 5, 5); + } final int x = (int) (dimensionToUse.getWidth() / 2); ug.draw(x, 0, new ULine(0, dimensionToUse.getHeight())); ug.getParam().setStroke(new UStroke()); diff --git a/src/net/sourceforge/plantuml/skin/rose/Rose.java b/src/net/sourceforge/plantuml/skin/rose/Rose.java index 1d18cf4f2..9963fec48 100644 --- a/src/net/sourceforge/plantuml/skin/rose/Rose.java +++ b/src/net/sourceforge/plantuml/skin/rose/Rose.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5943 $ + * Revision $Revision: 6008 $ * */ package net.sourceforge.plantuml.skin.rose; @@ -53,72 +53,72 @@ public class Rose implements Skin { private final Map defaultsColor = new EnumMap(ColorParam.class); public Rose() { - defaultsColor.put(ColorParam.background, new HtmlColor("white")); + defaultsColor.put(ColorParam.background, HtmlColor.getColorIfValid("white")); - defaultsColor.put(ColorParam.sequenceArrow, new HtmlColor("#A80036")); - defaultsColor.put(ColorParam.usecaseArrow, new HtmlColor("#A80036")); - defaultsColor.put(ColorParam.classArrow, new HtmlColor("#A80036")); - defaultsColor.put(ColorParam.objectArrow, new HtmlColor("#A80036")); - defaultsColor.put(ColorParam.activityArrow, new HtmlColor("#A80036")); - defaultsColor.put(ColorParam.componentArrow, new HtmlColor("#A80036")); - defaultsColor.put(ColorParam.stateArrow, new HtmlColor("#A80036")); + defaultsColor.put(ColorParam.sequenceArrow, HtmlColor.getColorIfValid("#A80036")); + defaultsColor.put(ColorParam.usecaseArrow, HtmlColor.getColorIfValid("#A80036")); + defaultsColor.put(ColorParam.classArrow, HtmlColor.getColorIfValid("#A80036")); + defaultsColor.put(ColorParam.objectArrow, HtmlColor.getColorIfValid("#A80036")); + defaultsColor.put(ColorParam.activityArrow, HtmlColor.getColorIfValid("#A80036")); + defaultsColor.put(ColorParam.componentArrow, HtmlColor.getColorIfValid("#A80036")); + defaultsColor.put(ColorParam.stateArrow, HtmlColor.getColorIfValid("#A80036")); - defaultsColor.put(ColorParam.sequenceLifeLineBackground, new HtmlColor("white")); - defaultsColor.put(ColorParam.sequenceLifeLineBorder, new HtmlColor("#A80036")); - defaultsColor.put(ColorParam.sequenceGroupBackground, new HtmlColor("#EEEEEE")); - defaultsColor.put(ColorParam.sequenceDividerBackground, new HtmlColor("#EEEEEE")); - defaultsColor.put(ColorParam.sequenceEngloberLine, new HtmlColor("#A80036")); - defaultsColor.put(ColorParam.sequenceEngloberBackground, new HtmlColor("#DDDDDD")); + defaultsColor.put(ColorParam.sequenceLifeLineBackground, HtmlColor.getColorIfValid("white")); + defaultsColor.put(ColorParam.sequenceLifeLineBorder, HtmlColor.getColorIfValid("#A80036")); + defaultsColor.put(ColorParam.sequenceGroupBackground, HtmlColor.getColorIfValid("#EEEEEE")); + defaultsColor.put(ColorParam.sequenceDividerBackground, HtmlColor.getColorIfValid("#EEEEEE")); + defaultsColor.put(ColorParam.sequenceEngloberLine, HtmlColor.getColorIfValid("#A80036")); + defaultsColor.put(ColorParam.sequenceEngloberBackground, HtmlColor.getColorIfValid("#DDDDDD")); - defaultsColor.put(ColorParam.noteBackground, new HtmlColor("#FBFB77")); - defaultsColor.put(ColorParam.noteBorder, new HtmlColor("#A80036")); + defaultsColor.put(ColorParam.noteBackground, HtmlColor.getColorIfValid("#FBFB77")); + defaultsColor.put(ColorParam.noteBorder, HtmlColor.getColorIfValid("#A80036")); - defaultsColor.put(ColorParam.activityBackground, new HtmlColor("#FEFECE")); - defaultsColor.put(ColorParam.activityBorder, new HtmlColor("#A80036")); - defaultsColor.put(ColorParam.activityStart, new HtmlColor("black")); - defaultsColor.put(ColorParam.activityEnd, new HtmlColor("black")); - defaultsColor.put(ColorParam.activityBar, new HtmlColor("black")); + defaultsColor.put(ColorParam.activityBackground, HtmlColor.getColorIfValid("#FEFECE")); + defaultsColor.put(ColorParam.activityBorder, HtmlColor.getColorIfValid("#A80036")); + defaultsColor.put(ColorParam.activityStart, HtmlColor.getColorIfValid("black")); + defaultsColor.put(ColorParam.activityEnd, HtmlColor.getColorIfValid("black")); + defaultsColor.put(ColorParam.activityBar, HtmlColor.getColorIfValid("black")); - defaultsColor.put(ColorParam.stateBackground, new HtmlColor("#FEFECE")); - defaultsColor.put(ColorParam.stateBorder, new HtmlColor("#A80036")); - defaultsColor.put(ColorParam.stateStart, new HtmlColor("black")); - defaultsColor.put(ColorParam.stateEnd, new HtmlColor("black")); + defaultsColor.put(ColorParam.stateBackground, HtmlColor.getColorIfValid("#FEFECE")); + defaultsColor.put(ColorParam.stateBorder, HtmlColor.getColorIfValid("#A80036")); + defaultsColor.put(ColorParam.stateStart, HtmlColor.getColorIfValid("black")); + defaultsColor.put(ColorParam.stateEnd, HtmlColor.getColorIfValid("black")); - defaultsColor.put(ColorParam.usecaseBackground, new HtmlColor("#FEFECE")); - defaultsColor.put(ColorParam.usecaseBorder, new HtmlColor("#A80036")); - defaultsColor.put(ColorParam.componentBackground, new HtmlColor("#FEFECE")); - defaultsColor.put(ColorParam.componentBorder, new HtmlColor("#A80036")); - defaultsColor.put(ColorParam.componentInterfaceBackground, new HtmlColor("#FEFECE")); - defaultsColor.put(ColorParam.componentInterfaceBorder, new HtmlColor("#A80036")); - defaultsColor.put(ColorParam.usecaseActorBackground, new HtmlColor("#FEFECE")); - defaultsColor.put(ColorParam.usecaseActorBorder, new HtmlColor("#A80036")); + defaultsColor.put(ColorParam.usecaseBackground, HtmlColor.getColorIfValid("#FEFECE")); + defaultsColor.put(ColorParam.usecaseBorder, HtmlColor.getColorIfValid("#A80036")); + defaultsColor.put(ColorParam.componentBackground, HtmlColor.getColorIfValid("#FEFECE")); + defaultsColor.put(ColorParam.componentBorder, HtmlColor.getColorIfValid("#A80036")); + defaultsColor.put(ColorParam.componentInterfaceBackground, HtmlColor.getColorIfValid("#FEFECE")); + defaultsColor.put(ColorParam.componentInterfaceBorder, HtmlColor.getColorIfValid("#A80036")); + defaultsColor.put(ColorParam.usecaseActorBackground, HtmlColor.getColorIfValid("#FEFECE")); + defaultsColor.put(ColorParam.usecaseActorBorder, HtmlColor.getColorIfValid("#A80036")); - defaultsColor.put(ColorParam.sequenceActorBackground, new HtmlColor("#FEFECE")); - defaultsColor.put(ColorParam.sequenceActorBorder, new HtmlColor("#A80036")); - defaultsColor.put(ColorParam.sequenceParticipantBackground, new HtmlColor("#FEFECE")); - defaultsColor.put(ColorParam.sequenceParticipantBorder, new HtmlColor("#A80036")); - defaultsColor.put(ColorParam.classBackground, new HtmlColor("#FEFECE")); - defaultsColor.put(ColorParam.classBorder, new HtmlColor("#A80036")); + defaultsColor.put(ColorParam.sequenceActorBackground, HtmlColor.getColorIfValid("#FEFECE")); + defaultsColor.put(ColorParam.sequenceActorBorder, HtmlColor.getColorIfValid("#A80036")); + defaultsColor.put(ColorParam.sequenceParticipantBackground, HtmlColor.getColorIfValid("#FEFECE")); + defaultsColor.put(ColorParam.sequenceParticipantBorder, HtmlColor.getColorIfValid("#A80036")); + defaultsColor.put(ColorParam.classBackground, HtmlColor.getColorIfValid("#FEFECE")); + defaultsColor.put(ColorParam.classBorder, HtmlColor.getColorIfValid("#A80036")); - defaultsColor.put(ColorParam.objectBackground, new HtmlColor("#FEFECE")); - defaultsColor.put(ColorParam.objectBorder, new HtmlColor("#A80036")); + defaultsColor.put(ColorParam.objectBackground, HtmlColor.getColorIfValid("#FEFECE")); + defaultsColor.put(ColorParam.objectBorder, HtmlColor.getColorIfValid("#A80036")); - defaultsColor.put(ColorParam.stereotypeCBackground, new HtmlColor("#ADD1B2")); - defaultsColor.put(ColorParam.stereotypeABackground, new HtmlColor("#A9DCDF")); - defaultsColor.put(ColorParam.stereotypeIBackground, new HtmlColor("#B4A7E5")); - defaultsColor.put(ColorParam.stereotypeEBackground, new HtmlColor("#EB937F")); + defaultsColor.put(ColorParam.stereotypeCBackground, HtmlColor.getColorIfValid("#ADD1B2")); + defaultsColor.put(ColorParam.stereotypeABackground, HtmlColor.getColorIfValid("#A9DCDF")); + defaultsColor.put(ColorParam.stereotypeIBackground, HtmlColor.getColorIfValid("#B4A7E5")); + defaultsColor.put(ColorParam.stereotypeEBackground, HtmlColor.getColorIfValid("#EB937F")); - defaultsColor.put(ColorParam.packageBackground, new HtmlColor("#FEFECE")); - defaultsColor.put(ColorParam.packageBorder, new HtmlColor("black")); + defaultsColor.put(ColorParam.packageBackground, HtmlColor.getColorIfValid("#FEFECE")); + defaultsColor.put(ColorParam.packageBorder, HtmlColor.getColorIfValid("black")); - defaultsColor.put(ColorParam.iconPrivate, new HtmlColor("#C82930")); - defaultsColor.put(ColorParam.iconPrivateBackground, new HtmlColor("#F24D5C")); - defaultsColor.put(ColorParam.iconProtected, new HtmlColor("#B38D22")); - defaultsColor.put(ColorParam.iconProtectedBackground, new HtmlColor("#FFFF44")); - defaultsColor.put(ColorParam.iconPackage, new HtmlColor("#1963A0")); - defaultsColor.put(ColorParam.iconPackageBackground, new HtmlColor("#4177AF")); - defaultsColor.put(ColorParam.iconPublic, new HtmlColor("#038048")); - defaultsColor.put(ColorParam.iconPublicBackground, new HtmlColor("#84BE84")); + defaultsColor.put(ColorParam.iconPrivate, HtmlColor.getColorIfValid("#C82930")); + defaultsColor.put(ColorParam.iconPrivateBackground, HtmlColor.getColorIfValid("#F24D5C")); + defaultsColor.put(ColorParam.iconProtected, HtmlColor.getColorIfValid("#B38D22")); + defaultsColor.put(ColorParam.iconProtectedBackground, HtmlColor.getColorIfValid("#FFFF44")); + defaultsColor.put(ColorParam.iconPackage, HtmlColor.getColorIfValid("#1963A0")); + defaultsColor.put(ColorParam.iconPackageBackground, HtmlColor.getColorIfValid("#4177AF")); + defaultsColor.put(ColorParam.iconPublic, HtmlColor.getColorIfValid("#038048")); + defaultsColor.put(ColorParam.iconPublicBackground, HtmlColor.getColorIfValid("#84BE84")); } public Color getFontColor(ISkinParam skin, FontParam fontParam) { @@ -178,7 +178,11 @@ public class Rose implements Skin { } if (type == ComponentType.PARTICIPANT_LINE) { final Color borderColor = getHtmlColor(param, ColorParam.sequenceLifeLineBorder).getColor(); - return new ComponentRoseLine(borderColor); + return new ComponentRoseLine(borderColor, false); + } + if (type == ComponentType.CONTINUE_LINE) { + final Color borderColor = getHtmlColor(param, ColorParam.sequenceLifeLineBorder).getColor(); + return new ComponentRoseLine(borderColor, true); } if (type == ComponentType.ACTOR_HEAD) { final Color borderColor = getHtmlColor(param, ColorParam.sequenceActorBorder).getColor(); @@ -190,10 +194,6 @@ public class Rose implements Skin { return new ComponentRoseActor(sequenceActorBackground, borderColor, getFontColor(param, FontParam.SEQUENCE_ACTOR), fontActor, stringsToDisplay, false); } - if (type == ComponentType.ACTOR_LINE) { - final Color borderColor = getHtmlColor(param, ColorParam.sequenceLifeLineBorder).getColor(); - return new ComponentRoseLine(borderColor); - } if (type == ComponentType.NOTE) { final Color noteBackgroundColor = getHtmlColor(param, ColorParam.noteBackground).getColor(); final Color borderColor = getHtmlColor(param, ColorParam.noteBorder).getColor(); @@ -221,8 +221,8 @@ public class Rose implements Skin { return new ComponentRoseActiveLine(borderColor, lifeLineBackgroundColor); } if (type == ComponentType.DELAY_LINE) { - // final Color borderColor = getHtmlColor(param, ColorParam.sequenceLifeLineBorder).getColor(); - final Color borderColor = getFontColor(param, FontParam.SEQUENCE_DELAY); + final Color borderColor = getHtmlColor(param, ColorParam.sequenceLifeLineBorder).getColor(); + // final Color borderColor = getFontColor(param, FontParam.SEQUENCE_DELAY); return new ComponentRoseDelayLine(borderColor); } if (type == ComponentType.DELAY_TEXT) { diff --git a/src/net/sourceforge/plantuml/statediagram/command/CommandCreatePackageState.java b/src/net/sourceforge/plantuml/statediagram/command/CommandCreatePackageState.java index 93835e7f6..1fabb47cd 100644 --- a/src/net/sourceforge/plantuml/statediagram/command/CommandCreatePackageState.java +++ b/src/net/sourceforge/plantuml/statediagram/command/CommandCreatePackageState.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5742 $ + * Revision $Revision: 5983 $ * */ package net.sourceforge.plantuml.statediagram.command; @@ -63,7 +63,7 @@ public class CommandCreatePackageState extends SingleLineCommand { p.setStereotype(stereotype); } if (arg.get(3) != null && HtmlColor.isValid(arg.get(3))) { - p.setBackColor(new HtmlColor(arg.get(3))); + p.setBackColor(HtmlColor.getColorIfValid(arg.get(3))); } return CommandExecutionResult.ok(); } diff --git a/src/net/sourceforge/plantuml/statediagram/command/CommandCreatePackageState2.java b/src/net/sourceforge/plantuml/statediagram/command/CommandCreatePackageState2.java index ea1960ec8..b9ff893fd 100644 --- a/src/net/sourceforge/plantuml/statediagram/command/CommandCreatePackageState2.java +++ b/src/net/sourceforge/plantuml/statediagram/command/CommandCreatePackageState2.java @@ -61,7 +61,7 @@ public class CommandCreatePackageState2 extends SingleLineCommand p.setStereotype(stereotype); } if (arg.get(3) != null && HtmlColor.isValid(arg.get(3))) { - p.setBackColor(new HtmlColor(arg.get(3))); + p.setBackColor(HtmlColor.getColorIfValid(arg.get(3))); } return CommandExecutionResult.ok(); } diff --git a/src/net/sourceforge/plantuml/sudoku/GraphicsSudoku.java b/src/net/sourceforge/plantuml/sudoku/GraphicsSudoku.java index bf00aa43f..c8f3e39f3 100644 --- a/src/net/sourceforge/plantuml/sudoku/GraphicsSudoku.java +++ b/src/net/sourceforge/plantuml/sudoku/GraphicsSudoku.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5872 $ + * Revision $Revision: 6009 $ * */ package net.sourceforge.plantuml.sudoku; @@ -44,6 +44,7 @@ import java.util.Arrays; import java.util.List; import net.sourceforge.plantuml.EmptyImageBuilder; +import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.HorizontalAlignement; import net.sourceforge.plantuml.graphic.TextBlock; import net.sourceforge.plantuml.graphic.TextBlockUtils; @@ -90,8 +91,8 @@ public class GraphicsSudoku { for (int y = 0; y < 9; y++) { final int num = sudoku.getGiven(x, y); if (num > 0) { - final TextBlock text = TextBlockUtils.create(Arrays.asList("" + num), numberFont, Color.BLACK, - HorizontalAlignement.CENTER); + final TextBlock text = TextBlockUtils.create(Arrays.asList("" + num), new FontConfiguration( + numberFont, Color.BLACK), HorizontalAlignement.CENTER); text.drawTOBEREMOVED(g2d, numberxOffset + x * cellWidth, numberyOffset + y * cellHeight); } } @@ -113,7 +114,8 @@ public class GraphicsSudoku { texts.add("http://plantuml.sourceforge.net"); texts.add("Seed " + Long.toString(sudoku.getSeed(), 36)); texts.add("Difficulty " + sudoku.getRatting()); - final TextBlock textBlock = TextBlockUtils.create(texts, font, Color.BLACK, HorizontalAlignement.LEFT); + final TextBlock textBlock = TextBlockUtils.create(texts, new FontConfiguration(font, Color.BLACK), + HorizontalAlignement.LEFT); textBlock.drawTOBEREMOVED(g2d, 0, 0); g2d.dispose(); diff --git a/src/net/sourceforge/plantuml/suggest/SuggestEngine.java b/src/net/sourceforge/plantuml/suggest/SuggestEngine.java index 6d82baa53..321749046 100644 --- a/src/net/sourceforge/plantuml/suggest/SuggestEngine.java +++ b/src/net/sourceforge/plantuml/suggest/SuggestEngine.java @@ -36,6 +36,7 @@ package net.sourceforge.plantuml.suggest; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Iterator; import java.util.List; @@ -49,13 +50,13 @@ import net.sourceforge.plantuml.command.ProtectedCommand; final public class SuggestEngine { - // private final UmlSource source; private final PSystemCommandFactory systemFactory; private final Iterator it; - private int nb = 0; + // private int nb = 0; + private String current = ""; + private String previous = ""; public SuggestEngine(UmlSource source, PSystemCommandFactory systemFactory) { - // this.source = source; this.systemFactory = systemFactory; this.it = source.iterator(); if (BlockUmlBuilder.isArobaseStartuml(next()) == false) { @@ -68,8 +69,10 @@ final public class SuggestEngine { } private String next() { - nb++; - return it.next(); + // nb++; + this.previous = this.current; + this.current = it.next(); + return current; } public SuggestEngineResult tryToSuggest() throws IOException { @@ -129,31 +132,46 @@ final public class SuggestEngine { } - SuggestEngineResult checkAndCorrect(String incorrectLine) { - CommandControl commandControl = systemFactory.isValid(Arrays.asList(incorrectLine)); + SuggestEngineResult checkAndCorrect(final String incorrectLine) { + final CommandControl commandControl = systemFactory.isValid(Arrays.asList(incorrectLine)); if (commandControl != CommandControl.NOT_OK) { return SuggestEngineResult.SYNTAX_OK; } - // Remove one - for (int i = 0; i < incorrectLine.length(); i++) { - final String newS = incorrectLine.substring(0, i) + incorrectLine.substring(i + 1); - commandControl = systemFactory.isValid(Arrays.asList(newS)); - if (commandControl != CommandControl.NOT_OK) { - return new SuggestEngineResult(newS, nb); - } + if (incorrectLine.trim().startsWith("{") + && systemFactory.isValid(Arrays.asList(previous + " {")) != CommandControl.NOT_OK) { + return new SuggestEngineResult(previous + " {"); } - // Inverse - for (int i = 0; i < incorrectLine.length() - 1; i++) { - final String newS = incorrectLine.substring(0, i) + incorrectLine.charAt(i + 1) + incorrectLine.charAt(i) - + incorrectLine.substring(i + 2); - commandControl = systemFactory.isValid(Arrays.asList(newS)); - if (commandControl != CommandControl.NOT_OK) { - return new SuggestEngineResult(newS, nb); + final Collection> all = new ArrayList>(); + all.add(new VariatorRemoveOneChar(incorrectLine)); + all.add(new VariatorSwapLetter(incorrectLine)); + // all.add(new VariatorAddOneCharBetweenWords(incorrectLine, ':')); + all.add(new VariatorAddOneCharBetweenWords(incorrectLine, '-')); + all.add(new VariatorAddOneCharBetweenWords(incorrectLine, ' ')); + // all.add(new VariatorAddTwoChar(incorrectLine, '\"')); + + for (Iterator it : all) { + final SuggestEngineResult result = tryThis(it); + if (result != null) { + return result; } } - return SuggestEngineResult.CANNOT_CORRECT; } + + private SuggestEngineResult tryThis(Iterator it) { + while (it.hasNext()) { + final String newS = it.next(); + if (newS.trim().length() == 0) { + continue; + } + final CommandControl commandControl = systemFactory.isValid(Arrays.asList(newS)); + if (commandControl != CommandControl.NOT_OK) { + return new SuggestEngineResult(newS); + } + } + return null; + + } } diff --git a/src/net/sourceforge/plantuml/suggest/SuggestEngineResult.java b/src/net/sourceforge/plantuml/suggest/SuggestEngineResult.java index 16f09a4fe..7b9d3ced8 100644 --- a/src/net/sourceforge/plantuml/suggest/SuggestEngineResult.java +++ b/src/net/sourceforge/plantuml/suggest/SuggestEngineResult.java @@ -33,11 +33,11 @@ */ package net.sourceforge.plantuml.suggest; + public class SuggestEngineResult { private final SuggestEngineStatus status; private final String suggestedLine; - private final int numLine; public static final SuggestEngineResult CANNOT_CORRECT = new SuggestEngineResult(SuggestEngineStatus.CANNOT_CORRECT); public static final SuggestEngineResult SYNTAX_OK = new SuggestEngineResult(SuggestEngineStatus.SYNTAX_OK); @@ -48,13 +48,40 @@ public class SuggestEngineResult { } this.status = status; this.suggestedLine = null; - this.numLine = -1; } - public SuggestEngineResult(String suggestedLine, int numLine) { + @Override + public String toString() { + return status + " " + suggestedLine; + } + + @Override + public int hashCode() { + return status.hashCode() + (suggestedLine == null ? 0 : suggestedLine.hashCode()); + } + + @Override + public boolean equals(Object obj) { + final SuggestEngineResult this2 = (SuggestEngineResult) obj; + return status.equals(this2.status) && sameString(suggestedLine, this2.suggestedLine); + } + + private static boolean sameString(String a, String b) { + if (a == null && b == null) { + return true; + } + if (a != null || b != null) { + return false; + } + return a.equals(b); + } + + public SuggestEngineResult(String suggestedLine) { + if (suggestedLine.trim().length() == 0) { + throw new IllegalArgumentException(); + } this.status = SuggestEngineStatus.ONE_SUGGESTION; this.suggestedLine = suggestedLine; - this.numLine = numLine; } public final SuggestEngineStatus getStatus() { @@ -65,8 +92,4 @@ public class SuggestEngineResult { return suggestedLine; } - public final int getNumLine() { - return numLine; - } - } diff --git a/src/net/sourceforge/plantuml/suggest/Variator.java b/src/net/sourceforge/plantuml/suggest/Variator.java new file mode 100644 index 000000000..56a577989 --- /dev/null +++ b/src/net/sourceforge/plantuml/suggest/Variator.java @@ -0,0 +1,41 @@ +/* ======================================================================== + * PlantUML : a free UML diagram generator + * ======================================================================== + * + * (C) Copyright 2009, Arnaud Roques + * + * Project Info: http://plantuml.sourceforge.net + * + * 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 Lesser 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. + * + * [Java is a trademark or registered trademark of Sun Microsystems, Inc. + * in the United States and other countries.] + * + * Original Author: Arnaud Roques + * + * Revision $Revision: 4975 $ + * + */ +package net.sourceforge.plantuml.suggest; + +public interface Variator { + + String getData(); + void nextStep(); + +} diff --git a/src/net/sourceforge/plantuml/suggest/VariatorAddOneChar.java b/src/net/sourceforge/plantuml/suggest/VariatorAddOneChar.java new file mode 100644 index 000000000..de16b665e --- /dev/null +++ b/src/net/sourceforge/plantuml/suggest/VariatorAddOneChar.java @@ -0,0 +1,62 @@ +/* ======================================================================== + * PlantUML : a free UML diagram generator + * ======================================================================== + * + * (C) Copyright 2009, Arnaud Roques + * + * Project Info: http://plantuml.sourceforge.net + * + * 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 Lesser 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. + * + * [Java is a trademark or registered trademark of Sun Microsystems, Inc. + * in the United States and other countries.] + * + * Original Author: Arnaud Roques + * + * Revision $Revision: 4975 $ + * + */ +package net.sourceforge.plantuml.suggest; + +public class VariatorAddOneChar extends VariatorIteratorAdaptor { + + private final String data; + private final char toAdd; + private int i; + + public VariatorAddOneChar(String data, char toAdd) { + this.data = data; + this.toAdd = toAdd; + } + + @Override + Variator getVariator() { + return new Variator() { + public String getData() { + if (i > data.length()) { + return null; + } + return data.substring(0, i) + toAdd + data.substring(i); + } + + public void nextStep() { + i++; + } + }; + } +} diff --git a/src/net/sourceforge/plantuml/suggest/VariatorAddOneCharBetweenWords.java b/src/net/sourceforge/plantuml/suggest/VariatorAddOneCharBetweenWords.java new file mode 100644 index 000000000..3516bd09c --- /dev/null +++ b/src/net/sourceforge/plantuml/suggest/VariatorAddOneCharBetweenWords.java @@ -0,0 +1,76 @@ +/* ======================================================================== + * PlantUML : a free UML diagram generator + * ======================================================================== + * + * (C) Copyright 2009, Arnaud Roques + * + * Project Info: http://plantuml.sourceforge.net + * + * 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 Lesser 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. + * + * [Java is a trademark or registered trademark of Sun Microsystems, Inc. + * in the United States and other countries.] + * + * Original Author: Arnaud Roques + * + * Revision $Revision: 4975 $ + * + */ +package net.sourceforge.plantuml.suggest; + +public class VariatorAddOneCharBetweenWords extends VariatorIteratorAdaptor { + + private final String data; + private final char toAdd; + private int i; + + public VariatorAddOneCharBetweenWords(String data, char toAdd) { + this.data = data; + this.toAdd = toAdd; + i++; + ensureBetweenWords(); + } + + private void ensureBetweenWords() { + while (i < data.length() && inWord()) { + i++; + } + + } + + private boolean inWord() { + return Character.isLetterOrDigit(data.charAt(i - 1)) && Character.isLetterOrDigit(data.charAt(i)); + } + + @Override + Variator getVariator() { + return new Variator() { + public String getData() { + if (i > data.length() - 1) { + return null; + } + return data.substring(0, i) + toAdd + data.substring(i); + } + + public void nextStep() { + i++; + ensureBetweenWords(); + } + }; + } +} diff --git a/src/net/sourceforge/plantuml/suggest/VariatorAddTwoChar.java b/src/net/sourceforge/plantuml/suggest/VariatorAddTwoChar.java new file mode 100644 index 000000000..8f1e4540b --- /dev/null +++ b/src/net/sourceforge/plantuml/suggest/VariatorAddTwoChar.java @@ -0,0 +1,67 @@ +/* ======================================================================== + * PlantUML : a free UML diagram generator + * ======================================================================== + * + * (C) Copyright 2009, Arnaud Roques + * + * Project Info: http://plantuml.sourceforge.net + * + * 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 Lesser 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. + * + * [Java is a trademark or registered trademark of Sun Microsystems, Inc. + * in the United States and other countries.] + * + * Original Author: Arnaud Roques + * + * Revision $Revision: 4975 $ + * + */ +package net.sourceforge.plantuml.suggest; + +public class VariatorAddTwoChar extends VariatorIteratorAdaptor { + + private final String data; + private final char toAdd; + private int i; + private int j = 1; + + public VariatorAddTwoChar(String data, char toAdd) { + this.data = data; + this.toAdd = toAdd; + } + + @Override + Variator getVariator() { + return new Variator() { + public String getData() { + if (i >= data.length()) { + return null; + } + return data.substring(0, i) + toAdd + data.substring(i, j) + toAdd + data.substring(j); + } + + public void nextStep() { + j++; + if (j > data.length()) { + i++; + j = i + 1; + } + } + }; + } +} diff --git a/src/net/sourceforge/plantuml/suggest/VariatorIteratorAdaptor.java b/src/net/sourceforge/plantuml/suggest/VariatorIteratorAdaptor.java new file mode 100644 index 000000000..a8c23a375 --- /dev/null +++ b/src/net/sourceforge/plantuml/suggest/VariatorIteratorAdaptor.java @@ -0,0 +1,66 @@ +/* ======================================================================== + * PlantUML : a free UML diagram generator + * ======================================================================== + * + * (C) Copyright 2009, Arnaud Roques + * + * Project Info: http://plantuml.sourceforge.net + * + * 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 Lesser 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. + * + * [Java is a trademark or registered trademark of Sun Microsystems, Inc. + * in the United States and other countries.] + * + * Original Author: Arnaud Roques + * + * Revision $Revision: 4975 $ + * + */ +package net.sourceforge.plantuml.suggest; + +import java.util.Iterator; +import java.util.NoSuchElementException; + +public abstract class VariatorIteratorAdaptor implements Iterator { + + private final Variator variator; + + abstract Variator getVariator(); + + public VariatorIteratorAdaptor() { + this.variator = getVariator(); + } + + public boolean hasNext() { + return variator.getData() != null; + } + + public String next() { + final String result = variator.getData(); + if (result == null) { + throw new NoSuchElementException(); + } + this.variator.nextStep(); + return result; + } + + public void remove() { + throw new UnsupportedOperationException(); + } + +} diff --git a/src/net/sourceforge/plantuml/suggest/VariatorRemoveOneChar.java b/src/net/sourceforge/plantuml/suggest/VariatorRemoveOneChar.java new file mode 100644 index 000000000..d88d91ab8 --- /dev/null +++ b/src/net/sourceforge/plantuml/suggest/VariatorRemoveOneChar.java @@ -0,0 +1,60 @@ +/* ======================================================================== + * PlantUML : a free UML diagram generator + * ======================================================================== + * + * (C) Copyright 2009, Arnaud Roques + * + * Project Info: http://plantuml.sourceforge.net + * + * 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 Lesser 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. + * + * [Java is a trademark or registered trademark of Sun Microsystems, Inc. + * in the United States and other countries.] + * + * Original Author: Arnaud Roques + * + * Revision $Revision: 4975 $ + * + */ +package net.sourceforge.plantuml.suggest; + +public class VariatorRemoveOneChar extends VariatorIteratorAdaptor { + + private final String data; + private int i; + + public VariatorRemoveOneChar(String data) { + this.data = data; + } + + @Override + Variator getVariator() { + return new Variator() { + public String getData() { + if (i >= data.length()) { + return null; + } + return data.substring(0, i) + data.substring(i + 1); + } + + public void nextStep() { + i++; + } + }; + } +} diff --git a/src/net/sourceforge/plantuml/suggest/VariatorSwapChar.java b/src/net/sourceforge/plantuml/suggest/VariatorSwapChar.java new file mode 100644 index 000000000..a8fa4ddca --- /dev/null +++ b/src/net/sourceforge/plantuml/suggest/VariatorSwapChar.java @@ -0,0 +1,60 @@ +/* ======================================================================== + * PlantUML : a free UML diagram generator + * ======================================================================== + * + * (C) Copyright 2009, Arnaud Roques + * + * Project Info: http://plantuml.sourceforge.net + * + * 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 Lesser 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. + * + * [Java is a trademark or registered trademark of Sun Microsystems, Inc. + * in the United States and other countries.] + * + * Original Author: Arnaud Roques + * + * Revision $Revision: 4975 $ + * + */ +package net.sourceforge.plantuml.suggest; + +public class VariatorSwapChar extends VariatorIteratorAdaptor { + + private final String data; + private int i; + + public VariatorSwapChar(String data) { + this.data = data; + } + + @Override + Variator getVariator() { + return new Variator() { + public String getData() { + if (i >= data.length() - 1) { + return null; + } + return data.substring(0, i) + data.charAt(i + 1) + data.charAt(i) + data.substring(i + 2); + } + + public void nextStep() { + i++; + } + }; + } +} diff --git a/src/net/sourceforge/plantuml/suggest/VariatorSwapLetter.java b/src/net/sourceforge/plantuml/suggest/VariatorSwapLetter.java new file mode 100644 index 000000000..9777dc683 --- /dev/null +++ b/src/net/sourceforge/plantuml/suggest/VariatorSwapLetter.java @@ -0,0 +1,74 @@ +/* ======================================================================== + * PlantUML : a free UML diagram generator + * ======================================================================== + * + * (C) Copyright 2009, Arnaud Roques + * + * Project Info: http://plantuml.sourceforge.net + * + * 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 Lesser 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. + * + * [Java is a trademark or registered trademark of Sun Microsystems, Inc. + * in the United States and other countries.] + * + * Original Author: Arnaud Roques + * + * Revision $Revision: 4975 $ + * + */ +package net.sourceforge.plantuml.suggest; + +public class VariatorSwapLetter extends VariatorIteratorAdaptor { + + private final String data; + private int i; + + public VariatorSwapLetter(String data) { + this.data = data; + ensureTwoLetters(); + } + + private void ensureTwoLetters() { + while (i < data.length() - 1 && areTwoLetters() == false) { + i++; + } + + } + + private boolean areTwoLetters() { + return Character.isLetter(data.charAt(i)) && Character.isLetter(data.charAt(i + 1)); + + } + + @Override + Variator getVariator() { + return new Variator() { + public String getData() { + if (i >= data.length() - 1) { + return null; + } + return data.substring(0, i) + data.charAt(i + 1) + data.charAt(i) + data.substring(i + 2); + } + + public void nextStep() { + i++; + ensureTwoLetters(); + } + }; + } +} diff --git a/src/net/sourceforge/plantuml/svg/SvgTitler.java b/src/net/sourceforge/plantuml/svg/SvgTitler.java index 0ef78a7c9..fc4316625 100644 --- a/src/net/sourceforge/plantuml/svg/SvgTitler.java +++ b/src/net/sourceforge/plantuml/svg/SvgTitler.java @@ -42,6 +42,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import net.sourceforge.plantuml.cucadiagram.dot.CucaDiagramFileMaker; +import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.HorizontalAlignement; import net.sourceforge.plantuml.graphic.TextBlock; import net.sourceforge.plantuml.graphic.TextBlockUtils; @@ -72,7 +73,8 @@ public final class SvgTitler { textBloc = null; } else { final Font normalFont = new Font(fontFamily, Font.PLAIN, fontSize); - textBloc = TextBlockUtils.create(text, normalFont, textColor, HorizontalAlignement.LEFT); + textBloc = TextBlockUtils.create(text, new FontConfiguration(normalFont, textColor), + HorizontalAlignement.LEFT); } } diff --git a/src/net/sourceforge/plantuml/ugraphic/UGraphic.java b/src/net/sourceforge/plantuml/ugraphic/UGraphic.java index 300677158..25a0c5289 100644 --- a/src/net/sourceforge/plantuml/ugraphic/UGraphic.java +++ b/src/net/sourceforge/plantuml/ugraphic/UGraphic.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 4129 $ + * Revision $Revision: 5988 $ * */ package net.sourceforge.plantuml.ugraphic; @@ -44,9 +44,11 @@ public interface UGraphic { public UParam getParam(); public void draw(double x, double y, UShape shape); + public void centerChar(double x, double y, char c, Font font); public void translate(double dx, double dy); + public void setTranslate(double dx, double dy); public double getTranslateX(); @@ -55,4 +57,6 @@ public interface UGraphic { public void setClip(UClip clip); + public void setAntiAliasing(boolean trueForOn); + } diff --git a/src/net/sourceforge/plantuml/ugraphic/UGraphicUtils.java b/src/net/sourceforge/plantuml/ugraphic/UGraphicUtils.java index 69375e0f4..ca62cfd7b 100644 --- a/src/net/sourceforge/plantuml/ugraphic/UGraphicUtils.java +++ b/src/net/sourceforge/plantuml/ugraphic/UGraphicUtils.java @@ -77,6 +77,10 @@ public abstract class UGraphicUtils { public void translate(double dx, double dy) { g.translate(dx, dy); } + + public void setAntiAliasing(boolean trueForOn) { + g.setAntiAliasing(trueForOn); + } }; } diff --git a/src/net/sourceforge/plantuml/ugraphic/eps/UGraphicEps.java b/src/net/sourceforge/plantuml/ugraphic/eps/UGraphicEps.java index 6684c3dbd..281a8a571 100644 --- a/src/net/sourceforge/plantuml/ugraphic/eps/UGraphicEps.java +++ b/src/net/sourceforge/plantuml/ugraphic/eps/UGraphicEps.java @@ -127,4 +127,7 @@ public class UGraphicEps extends AbstractUGraphic implements ClipCo pw.close(); } + public void setAntiAliasing(boolean trueForOn) { + } + } diff --git a/src/net/sourceforge/plantuml/ugraphic/g2d/DriverTextG2d.java b/src/net/sourceforge/plantuml/ugraphic/g2d/DriverTextG2d.java index d51c89885..e6e4b5dfe 100644 --- a/src/net/sourceforge/plantuml/ugraphic/g2d/DriverTextG2d.java +++ b/src/net/sourceforge/plantuml/ugraphic/g2d/DriverTextG2d.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5735 $ + * Revision $Revision: 6000 $ * */ package net.sourceforge.plantuml.ugraphic.g2d; @@ -40,6 +40,7 @@ import java.awt.FontMetrics; import java.awt.Graphics2D; import java.awt.GraphicsEnvironment; import java.awt.geom.Dimension2D; +import java.awt.geom.Rectangle2D; import net.sourceforge.plantuml.Dimension2DDouble; import net.sourceforge.plantuml.Log; @@ -54,9 +55,9 @@ import net.sourceforge.plantuml.ugraphic.UText; public class DriverTextG2d implements UDriver { -// static { -// printFont(); -// } + // static { + // printFont(); + // } private static void printFont() { final GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); @@ -70,7 +71,18 @@ public class DriverTextG2d implements UDriver { public void draw(UShape ushape, double x, double y, UParam param, Graphics2D g2d) { final UText shape = (UText) ushape; final FontConfiguration fontConfiguration = shape.getFontConfiguration(); + final Font font = fontConfiguration.getFont(); + if (fontConfiguration.containsStyle(FontStyle.BACKCOLOR)) { + final Dimension2D dim = calculateDimension(StringBounderUtils.asStringBounder(g2d), font, shape.getText()); + final Color extended = fontConfiguration.getExtendedColor(); + if (extended != null) { + g2d.setColor(extended); + g2d.setBackground(extended); + g2d.fill(new Rectangle2D.Double(x, y - dim.getHeight() + 1.5, dim.getWidth(), dim.getHeight())); + } + } + g2d.setFont(font); g2d.setColor(fontConfiguration.getColor()); g2d.drawString(shape.getText(), (float) x, (float) y); diff --git a/src/net/sourceforge/plantuml/ugraphic/g2d/UGraphicG2d.java b/src/net/sourceforge/plantuml/ugraphic/g2d/UGraphicG2d.java index 5952942b8..c1674f722 100644 --- a/src/net/sourceforge/plantuml/ugraphic/g2d/UGraphicG2d.java +++ b/src/net/sourceforge/plantuml/ugraphic/g2d/UGraphicG2d.java @@ -28,13 +28,14 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5793 $ + * Revision $Revision: 5988 $ * */ package net.sourceforge.plantuml.ugraphic.g2d; import java.awt.Font; import java.awt.Graphics2D; +import java.awt.RenderingHints; import java.awt.Shape; import java.awt.geom.AffineTransform; import java.awt.geom.Rectangle2D; @@ -122,4 +123,13 @@ public class UGraphicG2d extends AbstractUGraphic { return dpiFactor; } + public void setAntiAliasing(boolean trueForOn) { + if (trueForOn) { + getGraphicObject().setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + } else { + getGraphicObject().setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); + } + + } + } diff --git a/src/net/sourceforge/plantuml/ugraphic/svg/UGraphicSvg.java b/src/net/sourceforge/plantuml/ugraphic/svg/UGraphicSvg.java index 35afcf9ce..158699aed 100644 --- a/src/net/sourceforge/plantuml/ugraphic/svg/UGraphicSvg.java +++ b/src/net/sourceforge/plantuml/ugraphic/svg/UGraphicSvg.java @@ -130,5 +130,9 @@ public class UGraphicSvg extends AbstractUGraphic implements ClipCo DriverTextAsPathSvg.drawPathIterator(getGraphicObject(), xpos + getTranslateX(), ypos + getTranslateY(), t .getOutline(null).getPathIterator(null)); } + + public void setAntiAliasing(boolean trueForOn) { + } + } diff --git a/src/net/sourceforge/plantuml/ugraphic/txt/UGraphicTxt.java b/src/net/sourceforge/plantuml/ugraphic/txt/UGraphicTxt.java index 0d93a01e1..40b5e3284 100644 --- a/src/net/sourceforge/plantuml/ugraphic/txt/UGraphicTxt.java +++ b/src/net/sourceforge/plantuml/ugraphic/txt/UGraphicTxt.java @@ -79,4 +79,7 @@ public class UGraphicTxt extends AbstractCommonUGraphic { return new TranslatedCharArea(charArea, (int) getTranslateX(), (int) getTranslateY()); } + public void setAntiAliasing(boolean trueForOn) { + } + } diff --git a/src/net/sourceforge/plantuml/version/PSystemVersion.java b/src/net/sourceforge/plantuml/version/PSystemVersion.java index df18fd728..5a391cbe6 100644 --- a/src/net/sourceforge/plantuml/version/PSystemVersion.java +++ b/src/net/sourceforge/plantuml/version/PSystemVersion.java @@ -49,7 +49,7 @@ import javax.imageio.ImageIO; import net.sourceforge.plantuml.AbstractPSystem; import net.sourceforge.plantuml.FileFormatOption; -import net.sourceforge.plantuml.OptionPrint; +import net.sourceforge.plantuml.cucadiagram.dot.GraphvizUtils; import net.sourceforge.plantuml.graphic.GraphicPosition; import net.sourceforge.plantuml.graphic.GraphicStrings; @@ -69,7 +69,8 @@ public class PSystemVersion extends AbstractPSystem { } } - public List createFiles(File suggestedFile, FileFormatOption fileFormat) throws IOException, InterruptedException { + public List createFiles(File suggestedFile, FileFormatOption fileFormat) throws IOException, + InterruptedException { OutputStream os = null; try { os = new FileOutputStream(suggestedFile); @@ -91,7 +92,7 @@ public class PSystemVersion extends AbstractPSystem { strings.add("PlantUML version " + Version.version() + " (" + new Date(Version.compileTime()) + ")"); strings.add(" "); - strings.addAll(OptionPrint.getTestDotStrings()); + strings.addAll(GraphvizUtils.getTestDotStrings(true)); strings.add(" "); final Properties p = System.getProperties(); strings.add(p.getProperty("java.runtime.name")); @@ -119,7 +120,7 @@ public class PSystemVersion extends AbstractPSystem { public static PSystemVersion createTestDot() throws IOException { final List strings = new ArrayList(); - strings.addAll(OptionPrint.getTestDotStrings()); + strings.addAll(GraphvizUtils.getTestDotStrings(true)); return new PSystemVersion(false, strings); } diff --git a/src/net/sourceforge/plantuml/version/Version.java b/src/net/sourceforge/plantuml/version/Version.java index a01416c68..f9277db7f 100644 --- a/src/net/sourceforge/plantuml/version/Version.java +++ b/src/net/sourceforge/plantuml/version/Version.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5975 $ + * Revision $Revision: 6036 $ * */ package net.sourceforge.plantuml.version; @@ -36,11 +36,11 @@ package net.sourceforge.plantuml.version; public class Version { public static int version() { - return 5974; + return 6035; } public static long compileTime() { - return 1294953848234L; + return 1295780772390L; } }