diff --git a/pom.xml b/pom.xml index 14bf8d890..b03353925 100644 --- a/pom.xml +++ b/pom.xml @@ -36,7 +36,7 @@ net.sourceforge.plantuml plantuml - 6210-SNAPSHOT + 6242-SNAPSHOT jar PlantUML diff --git a/src/net/sourceforge/plantuml/BlockUmlBuilder.java b/src/net/sourceforge/plantuml/BlockUmlBuilder.java index aeea7aa84..864890432 100644 --- a/src/net/sourceforge/plantuml/BlockUmlBuilder.java +++ b/src/net/sourceforge/plantuml/BlockUmlBuilder.java @@ -69,12 +69,6 @@ final public class BlockUmlBuilder { return s.equals("@enduml") || s.startsWith("@enduml "); } - private boolean isIgnoredLine(final String s) { - // return s.length() == 0 || s.startsWith("#") || s.startsWith("'"); - // return s.length() == 0 || s.startsWith("'"); - return s.startsWith("'"); - } - public static boolean isArobaseStartuml(String s) { s = s.trim(); return s.equals("@startuml") || s.startsWith("@startuml "); @@ -87,7 +81,7 @@ final public class BlockUmlBuilder { if (isArobaseStartuml(s)) { current = new ArrayList(); } - if (current != null && isIgnoredLine(s.trim()) == false) { + if (current != null) { current.add(s); } if (isArobaseEnduml(s) && current != null) { diff --git a/src/net/sourceforge/plantuml/EmptyDiagramFactory.java b/src/net/sourceforge/plantuml/EmptyDiagramFactory.java new file mode 100644 index 000000000..845f7556f --- /dev/null +++ b/src/net/sourceforge/plantuml/EmptyDiagramFactory.java @@ -0,0 +1,58 @@ +/* ======================================================================== + * 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: 5890 $ + * + */ +package net.sourceforge.plantuml; + +import net.sourceforge.plantuml.command.AbstractUmlSystemCommandFactory; +import net.sourceforge.plantuml.command.CommandComment; +import net.sourceforge.plantuml.command.CommandMultilinesComment; +import net.sourceforge.plantuml.command.CommandNope; + +public class EmptyDiagramFactory extends AbstractUmlSystemCommandFactory { + + private PSystemError system; + + public PSystemError getSystem() { + return system; + } + + @Override + protected void initCommands() { + // system = new PSystemError(); + + addCommand(new CommandNope(null)); + addCommand(new CommandComment(null)); + addCommand(new CommandMultilinesComment(null)); + } + +} diff --git a/src/net/sourceforge/plantuml/ISkinParam.java b/src/net/sourceforge/plantuml/ISkinParam.java index 8410f6364..e2552dec2 100644 --- a/src/net/sourceforge/plantuml/ISkinParam.java +++ b/src/net/sourceforge/plantuml/ISkinParam.java @@ -35,6 +35,8 @@ package net.sourceforge.plantuml; import java.awt.Font; +import net.sourceforge.plantuml.cucadiagram.dot.DotSplines; +import net.sourceforge.plantuml.cucadiagram.dot.GraphvizLayoutStrategy; import net.sourceforge.plantuml.graphic.HtmlColor; public interface ISkinParam { @@ -66,5 +68,9 @@ public interface ISkinParam { public int getDpi(); public boolean useOctagonForActivity(); + + public DotSplines getDotSplines(); + + public GraphvizLayoutStrategy getStrategy(); } \ No newline at end of file diff --git a/src/net/sourceforge/plantuml/Run.java b/src/net/sourceforge/plantuml/Run.java index a0e6f777e..6279210bb 100644 --- a/src/net/sourceforge/plantuml/Run.java +++ b/src/net/sourceforge/plantuml/Run.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 6188 $ + * Revision $Revision: 6234 $ * */ package net.sourceforge.plantuml; @@ -39,34 +39,23 @@ import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; -import java.util.ArrayList; import java.util.List; import javax.swing.UIManager; import net.sourceforge.plantuml.activitydiagram.ActivityDiagramFactory; -import net.sourceforge.plantuml.activitydiagram2.ActivityDiagramFactory2; import net.sourceforge.plantuml.classdiagram.ClassDiagramFactory; import net.sourceforge.plantuml.code.Transcoder; import net.sourceforge.plantuml.code.TranscoderUtil; import net.sourceforge.plantuml.command.AbstractUmlSystemCommandFactory; import net.sourceforge.plantuml.componentdiagram.ComponentDiagramFactory; -import net.sourceforge.plantuml.compositediagram.CompositeDiagramFactory; -import net.sourceforge.plantuml.eggs.PSystemEggFactory; -import net.sourceforge.plantuml.eggs.PSystemLostFactory; -import net.sourceforge.plantuml.eggs.PSystemPathFactory; -import net.sourceforge.plantuml.eggs.PSystemRIPFactory; import net.sourceforge.plantuml.objectdiagram.ObjectDiagramFactory; -import net.sourceforge.plantuml.oregon.PSystemOregonFactory; import net.sourceforge.plantuml.png.MetadataTag; import net.sourceforge.plantuml.preproc.Defines; -import net.sourceforge.plantuml.printskin.PrintSkinFactory; import net.sourceforge.plantuml.sequencediagram.SequenceDiagramFactory; import net.sourceforge.plantuml.statediagram.StateDiagramFactory; -import net.sourceforge.plantuml.sudoku.PSystemSudokuFactory; import net.sourceforge.plantuml.swing.MainWindow; import net.sourceforge.plantuml.usecasediagram.UsecaseDiagramFactory; -import net.sourceforge.plantuml.version.PSystemVersionFactory; public class Run { diff --git a/src/net/sourceforge/plantuml/SkinParam.java b/src/net/sourceforge/plantuml/SkinParam.java index ea78f0129..3b9b243f5 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: 6141 $ + * Revision $Revision: 6228 $ * */ package net.sourceforge.plantuml; @@ -44,6 +44,8 @@ import java.util.TreeSet; import java.util.regex.Matcher; import java.util.regex.Pattern; +import net.sourceforge.plantuml.cucadiagram.dot.DotSplines; +import net.sourceforge.plantuml.cucadiagram.dot.GraphvizLayoutStrategy; import net.sourceforge.plantuml.graphic.HtmlColor; public class SkinParam implements ISkinParam { @@ -264,12 +266,44 @@ public class SkinParam implements ISkinParam { } public boolean useOctagonForActivity() { - // activityShape roundedbox final String value = getValue("activityshape"); if ("roundedbox".equalsIgnoreCase(value)) { return false; } - return true; + if ("octagon".equalsIgnoreCase(value)) { + return true; + } + return false; } + public DotSplines getDotSplines() { + final String value = getValue("linetype"); + if ("polyline".equalsIgnoreCase(value)) { + return DotSplines.POLYLINE; + } + if ("ortho".equalsIgnoreCase(value)) { + return DotSplines.ORTHO; + } + return DotSplines.SPLINES; + } + + + public GraphvizLayoutStrategy getStrategy() { + final String value = getValue("layout"); + if ("neato".equalsIgnoreCase(value)) { + return GraphvizLayoutStrategy.NEATO; + } + if ("circo".equalsIgnoreCase(value)) { + return GraphvizLayoutStrategy.CIRCO; + } + if ("fdp".equalsIgnoreCase(value)) { + return GraphvizLayoutStrategy.FDP; + } + if ("twopi".equalsIgnoreCase(value)) { + return GraphvizLayoutStrategy.TWOPI; + } + return GraphvizLayoutStrategy.DOT; + } + + } diff --git a/src/net/sourceforge/plantuml/SkinParamBackcolored.java b/src/net/sourceforge/plantuml/SkinParamBackcolored.java index c455503aa..bb077968e 100644 --- a/src/net/sourceforge/plantuml/SkinParamBackcolored.java +++ b/src/net/sourceforge/plantuml/SkinParamBackcolored.java @@ -35,6 +35,8 @@ package net.sourceforge.plantuml; import java.awt.Font; +import net.sourceforge.plantuml.cucadiagram.dot.DotSplines; +import net.sourceforge.plantuml.cucadiagram.dot.GraphvizLayoutStrategy; import net.sourceforge.plantuml.graphic.HtmlColor; public class SkinParamBackcolored implements ISkinParam { @@ -115,4 +117,12 @@ public class SkinParamBackcolored implements ISkinParam { public boolean useOctagonForActivity() { return skinParam.useOctagonForActivity(); } + + public DotSplines getDotSplines() { + return skinParam.getDotSplines(); + } + + public GraphvizLayoutStrategy getStrategy() { + return skinParam.getStrategy(); + } } diff --git a/src/net/sourceforge/plantuml/UmlSource.java b/src/net/sourceforge/plantuml/UmlSource.java index 1c422c688..535f52e96 100644 --- a/src/net/sourceforge/plantuml/UmlSource.java +++ b/src/net/sourceforge/plantuml/UmlSource.java @@ -33,6 +33,7 @@ */ package net.sourceforge.plantuml; +import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -88,6 +89,9 @@ final public class UmlSource { if (BlockUmlBuilder.isArobaseEnduml(s)) { continue; } + if (s.matches("\\s*'.*")) { + continue; + } if (s.trim().length() != 0) { return false; } diff --git a/src/net/sourceforge/plantuml/command/AbstractUmlSystemCommandFactory.java b/src/net/sourceforge/plantuml/command/AbstractUmlSystemCommandFactory.java index e95823323..6e61fba1f 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: 6191 $ + * Revision $Revision: 6214 $ * */ package net.sourceforge.plantuml.command; @@ -84,6 +84,7 @@ public abstract class AbstractUmlSystemCommandFactory implements PSystemCommandF final protected void addCommonCommands(UmlDiagram system) { addCommand(new CommandNope(system)); + addCommand(new CommandComment(system)); addCommand(new CommandMultilinesComment(system)); addCommand(new CommandPragma(system)); addCommand(new CommandTitle(system)); diff --git a/src/net/sourceforge/plantuml/command/CommandComment.java b/src/net/sourceforge/plantuml/command/CommandComment.java new file mode 100644 index 000000000..7588bc48f --- /dev/null +++ b/src/net/sourceforge/plantuml/command/CommandComment.java @@ -0,0 +1,51 @@ +/* ======================================================================== + * 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.command; + +import java.util.List; + +import net.sourceforge.plantuml.UmlDiagram; + +public class CommandComment extends SingleLineCommand { + + public CommandComment(UmlDiagram diagram) { + super(diagram, "(?i)^\\s*('.*||/'.*'/\\s*)$"); + } + + @Override + protected CommandExecutionResult executeArg(List arg) { + return CommandExecutionResult.ok(); + } + +} diff --git a/src/net/sourceforge/plantuml/command/CommandMultilines2.java b/src/net/sourceforge/plantuml/command/CommandMultilines2.java index 11799034d..deb795142 100644 --- a/src/net/sourceforge/plantuml/command/CommandMultilines2.java +++ b/src/net/sourceforge/plantuml/command/CommandMultilines2.java @@ -75,7 +75,7 @@ public abstract class CommandMultilines2 implements Command { return CommandControl.OK_PARTIAL; } - Matcher m1 = ending.matcher(lines.get(lines.size() - 1).trim()); + final Matcher m1 = ending.matcher(lines.get(lines.size() - 1).trim()); if (m1.matches() == false) { return CommandControl.OK_PARTIAL; } diff --git a/src/net/sourceforge/plantuml/command/CommandMultilinesComment.java b/src/net/sourceforge/plantuml/command/CommandMultilinesComment.java index 32ad7ea8a..0b9c2eacc 100644 --- a/src/net/sourceforge/plantuml/command/CommandMultilinesComment.java +++ b/src/net/sourceforge/plantuml/command/CommandMultilinesComment.java @@ -44,7 +44,6 @@ public class CommandMultilinesComment extends CommandMultilines { } public CommandExecutionResult execute(List lines) { - System.err.println(lines); return CommandExecutionResult.ok(); } diff --git a/src/net/sourceforge/plantuml/cucadiagram/CucaDiagram.java b/src/net/sourceforge/plantuml/cucadiagram/CucaDiagram.java index a321f0d9b..a050ebabb 100644 --- a/src/net/sourceforge/plantuml/cucadiagram/CucaDiagram.java +++ b/src/net/sourceforge/plantuml/cucadiagram/CucaDiagram.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 6199 $ + * Revision $Revision: 6229 $ * */ package net.sourceforge.plantuml.cucadiagram; @@ -59,7 +59,6 @@ import net.sourceforge.plantuml.cucadiagram.dot.CucaDiagramFileMaker; import net.sourceforge.plantuml.cucadiagram.dot.CucaDiagramFileMakerBeta; import net.sourceforge.plantuml.cucadiagram.dot.CucaDiagramPngMaker3; import net.sourceforge.plantuml.cucadiagram.dot.CucaDiagramTxtMaker; -import net.sourceforge.plantuml.cucadiagram.dot.GraphvizLayoutStrategy; import net.sourceforge.plantuml.skin.VisibilityModifier; import net.sourceforge.plantuml.xmi.CucaDiagramXmiMaker; @@ -514,15 +513,4 @@ public abstract class CucaDiagram extends UmlDiagram implements GroupHierarchy, public final Set getHides() { return Collections.unmodifiableSet(hides); } - - private GraphvizLayoutStrategy strategy = GraphvizLayoutStrategy.DOT; - - public void setStrategy(GraphvizLayoutStrategy strategy) { - this.strategy = strategy; - } - - public GraphvizLayoutStrategy getStrategy() { - return strategy; - } - } diff --git a/src/net/sourceforge/plantuml/cucadiagram/dot/CucaDiagramFileMaker.java b/src/net/sourceforge/plantuml/cucadiagram/dot/CucaDiagramFileMaker.java index fe9564ac1..ac13ac999 100644 --- a/src/net/sourceforge/plantuml/cucadiagram/dot/CucaDiagramFileMaker.java +++ b/src/net/sourceforge/plantuml/cucadiagram/dot/CucaDiagramFileMaker.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 6197 $ + * Revision $Revision: 6241 $ * */ package net.sourceforge.plantuml.cucadiagram.dot; @@ -57,8 +57,6 @@ import java.util.regex.Pattern; import javax.imageio.ImageIO; -import com.sun.org.apache.bcel.internal.generic.GETSTATIC; - import net.sourceforge.plantuml.ColorParam; import net.sourceforge.plantuml.Dimension2DDouble; import net.sourceforge.plantuml.EmptyImageBuilder; @@ -82,6 +80,7 @@ import net.sourceforge.plantuml.cucadiagram.Imaged; import net.sourceforge.plantuml.cucadiagram.Link; import net.sourceforge.plantuml.cucadiagram.Stereotype; import net.sourceforge.plantuml.eps.EpsStrategy; +import net.sourceforge.plantuml.eps.EpsTitler; import net.sourceforge.plantuml.eps.SvgToEpsConverter; import net.sourceforge.plantuml.graphic.CircledCharacter; import net.sourceforge.plantuml.graphic.GraphicStrings; @@ -102,6 +101,7 @@ import net.sourceforge.plantuml.skin.ComponentType; import net.sourceforge.plantuml.skin.SimpleContext2D; import net.sourceforge.plantuml.skin.StickMan; import net.sourceforge.plantuml.skin.rose.Rose; +import net.sourceforge.plantuml.statediagram.StateDiagram; import net.sourceforge.plantuml.svg.SvgTitler; import net.sourceforge.plantuml.ugraphic.eps.UGraphicEps; import net.sourceforge.plantuml.ugraphic.g2d.UGraphicG2d; @@ -586,6 +586,38 @@ public final class CucaDiagramFileMaker { return svgTitler.addTitleSvg(svg, width, height); } + private String addTitleEps(String eps) throws IOException { + final Color titleColor = diagram.getSkinParam().getFontHtmlColor(FontParam.TITLE, null).getColor(); + final String fontFamily = getSkinParam().getFontFamily(FontParam.TITLE, null); + final int fontSize = getSkinParam().getFontSize(FontParam.TITLE, null); + + final EpsTitler epsTitler = new EpsTitler(titleColor, diagram.getTitle(), fontSize, fontFamily, + HorizontalAlignement.CENTER, VerticalPosition.TOP, 3); + this.deltaY += epsTitler.getHeight(); + return epsTitler.addTitleEps(eps); + } + + private String addFooterEps(String eps) throws IOException { + final Color titleColor = diagram.getSkinParam().getFontHtmlColor(FontParam.FOOTER, null).getColor(); + final String fontFamily = getSkinParam().getFontFamily(FontParam.FOOTER, null); + final int fontSize = getSkinParam().getFontSize(FontParam.FOOTER, null); + final EpsTitler epsTitler = new EpsTitler(titleColor, diagram.getFooter(), fontSize, fontFamily, diagram + .getFooterAlignement(), VerticalPosition.BOTTOM, 3); + return epsTitler.addTitleEps(eps); + } + + private String addHeaderEps(String eps) throws IOException { + final Color titleColor = diagram.getSkinParam().getFontHtmlColor(FontParam.HEADER, null).getColor(); + final String fontFamily = getSkinParam().getFontFamily(FontParam.HEADER, null); + final int fontSize = getSkinParam().getFontSize(FontParam.HEADER, null); + final EpsTitler epsTitler = new EpsTitler(titleColor, diagram.getHeader(), fontSize, fontFamily, diagram + .getHeaderAlignement(), VerticalPosition.TOP, 3); + this.deltaY += epsTitler.getHeight(); + return epsTitler.addTitleEps(eps); + } + + + private String addHeaderSvg(String svg, double width, double height) throws IOException { final Color titleColor = diagram.getSkinParam().getFontHtmlColor(FontParam.HEADER, null).getColor(); final String fontFamily = getSkinParam().getFontFamily(FontParam.HEADER, null); @@ -891,6 +923,18 @@ public final class CucaDiagramFileMaker { if (isUnderline) { eps = new UnderlineTrickEps(eps).getString(); } + + if (diagram.getTitle() != null) { + eps = addTitleEps(eps); + } + if (diagram.getFooter() != null) { + eps = addFooterEps(eps); + } + if (diagram.getHeader() != null) { + eps = addHeaderEps(eps); + } + + os.write(eps.getBytes("UTF-8")); // final Dimension2D dim = getDimensionSvg(svg); // @@ -931,7 +975,6 @@ public final class CucaDiagramFileMaker { // mImage.appendTail(sb); // svg = sb.toString(); - os.write(eps.getBytes("UTF-8")); } finally { // cleanTemporaryFiles(diagram.entities().values()); @@ -963,13 +1006,16 @@ public final class CucaDiagramFileMaker { if (diagram.getUmlDiagramType() == UmlDiagramType.CLASS || diagram.getUmlDiagramType() == UmlDiagramType.OBJECT) { dotData.setStaticImagesMap(staticFilesMap); - if (diagram.isVisibilityModifierPresent()) { dotData.setVisibilityModifierPresent(true); } } - - return diagram.getStrategy().getGraphvizMaker(dotData, dotStrings, fileFormat); + + if (diagram.getUmlDiagramType() == UmlDiagramType.STATE) { + dotData.setHideEmptyDescription(((StateDiagram) diagram).isHideEmptyDescription()); + } + + return diagram.getSkinParam().getStrategy().getGraphvizMaker(dotData, dotStrings, fileFormat); // return new DotMaker(dotData, dotStrings, fileFormat); } diff --git a/src/net/sourceforge/plantuml/cucadiagram/dot/DotData.java b/src/net/sourceforge/plantuml/cucadiagram/dot/DotData.java index 4ddc60518..b4cd9d912 100644 --- a/src/net/sourceforge/plantuml/cucadiagram/dot/DotData.java +++ b/src/net/sourceforge/plantuml/cucadiagram/dot/DotData.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5813 $ + * Revision $Revision: 6222 $ * */ package net.sourceforge.plantuml.cucadiagram.dot; @@ -262,5 +262,17 @@ final public class DotData implements PortionShower { public final void setDpi(int dpi) { this.dpi = dpi; } + + private boolean hideEmptyDescription = false; + + public final void setHideEmptyDescription(boolean hideEmptyDescription) { + this.hideEmptyDescription = hideEmptyDescription; + } + + public final boolean isHideEmptyDescription() { + return hideEmptyDescription; + } + + } diff --git a/src/net/sourceforge/plantuml/cucadiagram/dot/DotMaker.java b/src/net/sourceforge/plantuml/cucadiagram/dot/DotMaker.java index ee7246472..418e4a478 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: 6195 $ + * Revision $Revision: 6230 $ * */ package net.sourceforge.plantuml.cucadiagram.dot; @@ -168,6 +168,24 @@ final public class DotMaker implements GraphvizMaker { } // sb.append("ordering=out;"); sb.append("compound=true;"); + final DotSplines dotSplines = data.getSkinParam().getDotSplines(); + final GraphvizLayoutStrategy strategy = data.getSkinParam().getStrategy(); + if (dotSplines == DotSplines.ORTHO) { + sb.append("splines=ortho;"); + } else if (dotSplines == DotSplines.POLYLINE) { + sb.append("splines=polyline;"); + } else if (strategy != GraphvizLayoutStrategy.DOT) { + sb.append("splines=true;"); + } + +// if (strategy == GraphvizLayoutStrategy.NEATO) { +// sb.append("overlap=false;"); +// } + if (strategy != GraphvizLayoutStrategy.DOT) { + sb.append("layout=" + strategy.name().toLowerCase() + ";"); + sb.append("overlap=false;"); + } + sb.append("remincross=true;"); sb.append("searchsize=500;"); if (data.getRankdir() == Rankdir.LEFT_TO_RIGHT) { @@ -1051,7 +1069,7 @@ final public class DotMaker implements GraphvizMaker { sb.append(""); } - if (entity.getFieldsToDisplay().size() == 0 && cFile == null) { + if (data.isHideEmptyDescription() == false && entity.getFieldsToDisplay().size() == 0 && cFile == null) { sb.append("|"); } diff --git a/src/net/sourceforge/plantuml/cucadiagram/dot/DotSplines.java b/src/net/sourceforge/plantuml/cucadiagram/dot/DotSplines.java new file mode 100644 index 000000000..3422ec97d --- /dev/null +++ b/src/net/sourceforge/plantuml/cucadiagram/dot/DotSplines.java @@ -0,0 +1,39 @@ +/* ======================================================================== + * 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: 6222 $ + * + */ +package net.sourceforge.plantuml.cucadiagram.dot; + +public enum DotSplines { + POLYLINE, ORTHO, SPLINES + +} diff --git a/src/net/sourceforge/plantuml/cucadiagram/dot/GraphvizLayoutStrategy.java b/src/net/sourceforge/plantuml/cucadiagram/dot/GraphvizLayoutStrategy.java index cc3da797c..e072c8b16 100644 --- a/src/net/sourceforge/plantuml/cucadiagram/dot/GraphvizLayoutStrategy.java +++ b/src/net/sourceforge/plantuml/cucadiagram/dot/GraphvizLayoutStrategy.java @@ -40,21 +40,21 @@ import net.sourceforge.plantuml.FileFormat; import net.sourceforge.plantuml.OptionFlags; public enum GraphvizLayoutStrategy { - DOT, NEATO; + DOT, NEATO, FDP, TWOPI, CIRCO; public GraphvizMaker getGraphvizMaker(DotData data, List dotStrings, FileFormat fileFormat) { - if (this == DOT) { +// if (this == DOT) { return new DotMaker(data, dotStrings, fileFormat); - } - throw new UnsupportedOperationException(this.toString()); +// } +// throw new UnsupportedOperationException(this.toString()); } public File getSystemForcedExecutable() { - if (this == DOT) { +// if (this == DOT) { return getSystemForcedDot(); - } - throw new UnsupportedOperationException(this.toString()); +// } +// throw new UnsupportedOperationException(this.toString()); } private File getSystemForcedDot() { diff --git a/src/net/sourceforge/plantuml/cucadiagram/dot/GroupPngMaker.java b/src/net/sourceforge/plantuml/cucadiagram/dot/GroupPngMaker.java index be12ae745..f576bcc3d 100644 --- a/src/net/sourceforge/plantuml/cucadiagram/dot/GroupPngMaker.java +++ b/src/net/sourceforge/plantuml/cucadiagram/dot/GroupPngMaker.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 6197 $ + * Revision $Revision: 6228 $ * */ package net.sourceforge.plantuml.cucadiagram.dot; @@ -217,7 +217,7 @@ public final class GroupPngMaker { // dotData.putAllImagesLink(imagesLink); // return new DotMaker(dotData, dotStrings, fileFormat); - return diagram.getStrategy().getGraphvizMaker(dotData, dotStrings, fileFormat); + return diagram.getSkinParam().getStrategy().getGraphvizMaker(dotData, dotStrings, fileFormat); } private List getPureInnerLinks() { diff --git a/src/net/sourceforge/plantuml/eps/EpsGraphics.java b/src/net/sourceforge/plantuml/eps/EpsGraphics.java index 3ccefaf77..a289e47ae 100644 --- a/src/net/sourceforge/plantuml/eps/EpsGraphics.java +++ b/src/net/sourceforge/plantuml/eps/EpsGraphics.java @@ -38,6 +38,7 @@ import java.awt.geom.PathIterator; import java.awt.image.BufferedImage; import java.util.Date; import java.util.Locale; +import java.util.StringTokenizer; import net.sourceforge.plantuml.ugraphic.UGradient; @@ -66,25 +67,26 @@ public class EpsGraphics { header.append("%%Creator: PlantUML\n"); header.append("%%Title: noTitle\n"); header.append("%%CreationDate: " + new Date() + "\n"); - setcolorgradient.add(new PostScriptCommandRaw("3 index 7 index sub 1 index mul 7 index add")); - setcolorgradient.add(new PostScriptCommandRaw("3 index 7 index sub 2 index mul 7 index add")); - setcolorgradient.add(new PostScriptCommandRaw("3 index 7 index sub 3 index mul 7 index add")); - setcolorgradient.add(new PostScriptCommandRaw("setrgbcolor")); + setcolorgradient.add(new PostScriptCommandRaw("3 index 7 index sub 1 index mul 7 index add", true)); + setcolorgradient.add(new PostScriptCommandRaw("3 index 7 index sub 2 index mul 7 index add", true)); + setcolorgradient.add(new PostScriptCommandRaw("3 index 7 index sub 3 index mul 7 index add", true)); + setcolorgradient.add(new PostScriptCommandRaw("setrgbcolor", true)); // setcolorgradient.add(new PostScriptCommandRaw("0 7 1 {pop} for")); - setcolorgradient.add(new PostScriptCommandRaw("pop pop pop pop pop pop pop ")); + setcolorgradient.add(new PostScriptCommandRaw("pop pop pop pop pop pop pop ", true)); - simplerect.add(new PostScriptCommandRaw("newpath moveto 1 index 0 rlineto")); - simplerect.add(new PostScriptCommandRaw("0 exch rlineto")); - simplerect.add(new PostScriptCommandRaw("neg 0 rlineto")); + simplerect.add(new PostScriptCommandRaw("newpath moveto 1 index 0 rlineto", true)); + simplerect.add(new PostScriptCommandRaw("0 exch rlineto", true)); + simplerect.add(new PostScriptCommandRaw("neg 0 rlineto", true)); - roundrect.add(new PostScriptCommandRaw("newpath")); - roundrect.add(new PostScriptCommandRaw("dup 3 index add 2 index 2 index add 2 index 180 270 arc")); - roundrect - .add(new PostScriptCommandRaw("2 index 5 index add 1 index sub 2 index 2 index add 2 index 270 0 arc")); + roundrect.add(new PostScriptCommandRaw("newpath", true)); + roundrect.add(new PostScriptCommandRaw("dup 3 index add 2 index 2 index add 2 index 180 270 arc", true)); + roundrect.add(new PostScriptCommandRaw("2 index 5 index add 1 index sub 2 index 2 index add 2 index 270 0 arc", + true)); roundrect.add(new PostScriptCommandRaw( - "2 index 5 index add 1 index sub 2 index 5 index add 2 index sub 2 index 0 90 arc")); - roundrect.add(new PostScriptCommandRaw("dup 3 index add 2 index 5 index add 2 index sub 2 index 90 180 arc")); - roundrect.add(new PostScriptCommandRaw("pop pop pop pop pop ")); + "2 index 5 index add 1 index sub 2 index 5 index add 2 index sub 2 index 0 90 arc", true)); + roundrect.add(new PostScriptCommandRaw("dup 3 index add 2 index 5 index add 2 index sub 2 index 90 180 arc", + true)); + roundrect.add(new PostScriptCommandRaw("pop pop pop pop pop ", true)); } private boolean closeDone = false; @@ -127,13 +129,13 @@ public class EpsGraphics { header.append(roundrect.getPostStringDefinition()); } - append("grestore"); + append("grestore", true); // if(isClipSet()) // writer.write("grestore\n"); - append("showpage"); - append("%%EOF"); + append("showpage", true); + append("%%EOF", true); closeDone = true; } @@ -174,18 +176,18 @@ public class EpsGraphics { ensureVisible(x1, y1); ensureVisible(x2, y2); if (strokeDasharray != null) { - append("[" + strokeDasharray + "] 0 setdash"); + append("[" + strokeDasharray + "] 0 setdash", true); } checkCloseDone(); - append(strokeWidth + " setlinewidth"); + append(strokeWidth + " setlinewidth", true); appendColor(color); - append("newpath"); - append(format(x1) + " " + format(y1) + " moveto"); - append(format(x2 - x1) + " " + format(y2 - y1) + " rlineto"); - append("closepath stroke"); + append("newpath", true); + append(format(x1) + " " + format(y1) + " moveto", true); + append(format(x2 - x1) + " " + format(y2 - y1) + " rlineto", true); + append("closepath stroke", true); ensureVisible(Math.max(x1, x2), Math.max(y1, y2)); if (strokeDasharray != null) { - append("[] 0 setdash"); + append("[] 0 setdash", true); } } @@ -195,37 +197,37 @@ public class EpsGraphics { double lastY = 0; if (fillcolor != null) { appendColor(fillcolor); - append("newpath"); + append("newpath", true); for (int i = 0; i < points.length; i += 2) { ensureVisible(points[i], points[i + 1]); if (i == 0) { - append(format(points[i]) + " " + format(points[i + 1]) + " moveto"); + append(format(points[i]) + " " + format(points[i + 1]) + " moveto", true); } else { - append(format(points[i] - lastX) + " " + format(points[i + 1] - lastY) + " rlineto"); + append(format(points[i] - lastX) + " " + format(points[i + 1] - lastY) + " rlineto", true); } lastX = points[i]; lastY = points[i + 1]; } - append(format(points[0]) + " " + format(points[1]) + " lineto"); - append("closepath eofill"); + append(format(points[0]) + " " + format(points[1]) + " lineto", true); + append("closepath eofill", true); } if (color != null) { - append(strokeWidth + " setlinewidth"); + append(strokeWidth + " setlinewidth", true); appendColor(color); - append("newpath"); + append("newpath", true); for (int i = 0; i < points.length; i += 2) { ensureVisible(points[i], points[i + 1]); if (i == 0) { - append(format(points[i]) + " " + format(points[i + 1]) + " moveto"); + append(format(points[i]) + " " + format(points[i + 1]) + " moveto", true); } else { - append(format(points[i] - lastX) + " " + format(points[i + 1] - lastY) + " rlineto"); + append(format(points[i] - lastX) + " " + format(points[i + 1] - lastY) + " rlineto", true); } lastX = points[i]; lastY = points[i + 1]; } - append(format(points[0]) + " " + format(points[1]) + " lineto"); - append("closepath stroke"); + append(format(points[0]) + " " + format(points[1]) + " lineto", true); + append("closepath stroke", true); } } @@ -237,14 +239,14 @@ public class EpsGraphics { if (fillcolor != null) { appendColor(fillcolor); epsRectangleInternal(x, y, width, height, rx, ry); - append("closepath eofill"); + append("closepath eofill", true); } if (color != null) { - append(strokeWidth + " setlinewidth"); + append(strokeWidth + " setlinewidth", true); appendColor(color); epsRectangleInternal(x, y, width, height, rx, ry); - append("closepath stroke"); + append("closepath stroke", true); } } @@ -258,49 +260,49 @@ public class EpsGraphics { simplerectUsed = true; appendColorShort(gr.getColor1()); appendColorShort(gr.getColor2()); - append(format(width) + " " + format(height) + " " + format(x) + " " + format(y)); - append("100 -1 1 {"); - append("100 div"); - append("newpath"); - append("2 index 2 index moveto"); - append("dup 5 index mul 2 mul dup 0 rlineto"); - append("neg 4 index 2 index mul 2 mul rlineto"); - append("closepath eoclip"); - append("10 index 10 index 10 index"); - append("10 index 10 index 10 index"); - append("6 index setcolorgradient"); - append("4 index 4 index 4 index 4 index simplerect"); - append("closepath eofill"); - append("pop"); - append("} for"); - append("pop pop pop pop"); - append("pop pop pop"); - append("pop pop pop"); - append("initclip"); + append(format(width) + " " + format(height) + " " + format(x) + " " + format(y), true); + append("100 -1 1 {", true); + append("100 div", true); + append("newpath", true); + append("2 index 2 index moveto", true); + append("dup 5 index mul 2 mul dup 0 rlineto", true); + append("neg 4 index 2 index mul 2 mul rlineto", true); + append("closepath eoclip", true); + append("10 index 10 index 10 index", true); + append("10 index 10 index 10 index", true); + append("6 index setcolorgradient", true); + append("4 index 4 index 4 index 4 index simplerect", true); + append("closepath eofill", true); + append("pop", true); + append("} for", true); + append("pop pop pop pop", true); + append("pop pop pop", true); + append("pop pop pop", true); + append("initclip", true); } else { roundrectUsed = true; appendColorShort(gr.getColor1()); appendColorShort(gr.getColor2()); append(format(width) + " " + format(height) + " " + format(x) + " " + format(y) + " " - + format((rx + ry) / 2)); - append("100 -1 1 {"); - append("100 div"); - append("newpath"); - append("3 index 3 index moveto"); - append("dup 6 index mul 2 mul dup 0 rlineto"); - append("neg 5 index 2 index mul 2 mul rlineto"); - append("closepath eoclip"); - append("11 index 11 index 11 index"); - append("11 index 11 index 11 index"); - append("6 index setcolorgradient"); - append("5 index 5 index 5 index 5 index 5 index roundrect"); - append("closepath eofill"); - append("pop"); - append("} for"); - append("pop pop pop pop pop"); - append("pop pop pop"); - append("pop pop pop"); - append("initclip"); + + format((rx + ry) / 2), true); + append("100 -1 1 {", true); + append("100 div", true); + append("newpath", true); + append("3 index 3 index moveto", true); + append("dup 6 index mul 2 mul dup 0 rlineto", true); + append("neg 5 index 2 index mul 2 mul rlineto", true); + append("closepath eoclip", true); + append("11 index 11 index 11 index", true); + append("11 index 11 index 11 index", true); + append("6 index setcolorgradient", true); + append("5 index 5 index 5 index 5 index 5 index roundrect", true); + append("closepath eofill", true); + append("pop", true); + append("} for", true); + append("pop pop pop pop pop", true); + append("pop pop pop", true); + append("pop pop pop", true); + append("initclip", true); } } @@ -314,12 +316,12 @@ public class EpsGraphics { private void roundRectangle(double x, double y, double width, double height, double rx, double ry) { append(format(width) + " " + format(height) + " " + format(x) + " " + format(y) + " " + format((rx + ry) / 2) - + " roundrect"); + + " roundrect", true); roundrectUsed = true; } private void simpleRectangle(double x, double y, double width, double height) { - append(format(width) + " " + format(height) + " " + format(x) + " " + format(y) + " simplerect"); + append(format(width) + " " + format(height) + " " + format(x) + " " + format(y) + " simplerect", true); simplerectUsed = true; } @@ -331,17 +333,17 @@ public class EpsGraphics { } if (fillcolor != null) { appendColor(fillcolor); - append("newpath"); - append(format(x) + " " + format(y) + " " + format(xRadius) + " 0 360 arc"); - append("closepath eofill"); + append("newpath", true); + append(format(x) + " " + format(y) + " " + format(xRadius) + " 0 360 arc", true); + append("closepath eofill", true); } if (color != null) { - append(strokeWidth + " setlinewidth"); + append(strokeWidth + " setlinewidth", true); appendColor(color); - append("newpath"); - append(format(x) + " " + format(y) + " " + format(xRadius) + " 0 360 arc"); - append("closepath stroke"); + append("newpath", true); + append(format(x) + " " + format(y) + " " + format(xRadius) + " 0 360 arc", true); + append("closepath stroke", true); } } @@ -349,14 +351,14 @@ public class EpsGraphics { final double r = c.getRed() / 255.0; final double g = c.getGreen() / 255.0; final double b = c.getBlue() / 255.0; - append(format(r) + " " + format(g) + " " + format(b) + " setrgbcolor"); + append(format(r) + " " + format(g) + " " + format(b) + " setrgbcolor", true); } protected void appendColorShort(Color c) { final double r = c.getRed() / 255.0; final double g = c.getGreen() / 255.0; final double b = c.getBlue() / 255.0; - append(format(r) + " " + format(g) + " " + format(b)); + append(format(r) + " " + format(g) + " " + format(b), true); } public static String format(double x) { @@ -371,8 +373,8 @@ public class EpsGraphics { return s; } - protected void append(String s) { - if (s.indexOf(" ") != -1) { + protected void append(String s, boolean checkConsistence) { + if (checkConsistence && s.indexOf(" ") != -1) { throw new IllegalArgumentException(s); } body.append(s + "\n"); @@ -380,18 +382,18 @@ public class EpsGraphics { // FONT public void moveto(double x1, double y1) { - append(format(x1) + " " + format(y1) + " moveto"); + append(format(x1) + " " + format(y1) + " moveto", true); ensureVisible(x1, y1); } public void lineto(double x1, double y1) { - append(format(x1) + " " + format(y1) + " lineto"); + append(format(x1) + " " + format(y1) + " lineto", true); ensureVisible(x1, y1); } public void curveto(double x1, double y1, double x2, double y2, double x3, double y3) { append(format(x1) + " " + format(y1) + " " + format(x2) + " " + format(y2) + " " + format(x3) + " " - + format(y3) + " curveto"); + + format(y3) + " curveto", true); ensureVisible(x1, y1); ensureVisible(x2, y2); ensureVisible(x3, y3); @@ -399,40 +401,40 @@ public class EpsGraphics { public void quadto(double x1, double y1, double x2, double y2) { append(format(x1) + " " + format(y1) + " " + format(x1) + " " + format(y1) + " " + format(x2) + " " - + format(y2) + " curveto"); + + format(y2) + " curveto", true); ensureVisible(x1, y1); ensureVisible(x2, y2); } public void newpath() { - append("0 setlinewidth"); - append("[] 0 setdash"); + append("0 setlinewidth", true); + append("[] 0 setdash", true); appendColor(color); - append("newpath"); + append("newpath", true); } public void closepath() { - append("closepath"); + append("closepath", true); } public void fill(int windingRule) { - append("%fill"); + append("%fill", true); if (windingRule == PathIterator.WIND_EVEN_ODD) { - append("eofill"); + append("eofill", true); } else if (windingRule == PathIterator.WIND_NON_ZERO) { - append("fill"); + append("fill", true); } } public void drawImage(BufferedImage image, double x, double y) { final int width = image.getWidth(); final int height = image.getHeight(); - append("gsave"); - append(format(x) + " " + format(y) + " translate"); - append(format(width) + " " + format(height) + " scale"); - append("" + width + " " + height + " 8 [" + width + " 0 0 -" + height + " 0 " + height + "]"); + append("gsave", true); + append(format(x) + " " + format(y) + " translate", true); + append(format(width) + " " + format(height) + " scale", true); + append("" + width + " " + height + " 8 [" + width + " 0 0 -" + height + " 0 " + height + "]", true); // append("" + width + " " + height + " 8 [0 0 0 0 0 0]"); - append("{<"); + append("{<", true); final StringBuilder sb = new StringBuilder(); for (int j = height - 1; j >= 0; j--) { for (int i = 0; i < width; i++) { @@ -441,11 +443,11 @@ public class EpsGraphics { sb.append(hexString); } } - append(sb.toString()); + append(sb.toString(), true); // append(">} image"); - append(">} false 3 colorimage"); + append(">} false 3 colorimage", true); ensureVisible(x + width, y + height); - append("grestore"); + append("grestore", true); } static String getRgb(int x) { @@ -453,4 +455,28 @@ public class EpsGraphics { return s.substring(s.length() - 6); } + public void drawEps(String eps, double x, double y) { + + final int idx = eps.indexOf("%%BoundingBox:"); + if (idx == -1) { + throw new IllegalArgumentException(); + } + final StringTokenizer st = new StringTokenizer(eps.substring(idx + "%%BoundingBox:".length()), " \n\t\r"); + final int x1 = Integer.parseInt(st.nextToken()); + final int y1 = Integer.parseInt(st.nextToken()); + final int x2 = Integer.parseInt(st.nextToken()); + final int y2 = Integer.parseInt(st.nextToken()); + assert x2 >= x1; + assert y2 >= y1; + + append("gsave", true); + final double dx = x - x1; + final double dy = y + y2; + append(format(dx) + " " + format(dy) + " translate", true); + append("1 -1 scale", true); + append(eps, false); + ensureVisible(x + (x2 - x1), y + (y2 - y1)); + append("grestore", true); + } + } diff --git a/src/net/sourceforge/plantuml/eps/EpsGraphicsMacro.java b/src/net/sourceforge/plantuml/eps/EpsGraphicsMacro.java index 734163d65..f373ca2fb 100644 --- a/src/net/sourceforge/plantuml/eps/EpsGraphicsMacro.java +++ b/src/net/sourceforge/plantuml/eps/EpsGraphicsMacro.java @@ -44,15 +44,15 @@ public class EpsGraphicsMacro extends EpsGraphics { public EpsGraphicsMacro() { super(); - rquadto.add(new PostScriptCommandRaw("3 index 3 index 4 2 roll rcurveto")); + rquadto.add(new PostScriptCommandRaw("3 index 3 index 4 2 roll rcurveto", true)); } @Override - protected void append(String s) { - if (s.indexOf(" ") != -1) { + protected void append(String s, boolean checkConsistence) { + if (checkConsistence && s.indexOf(" ") != -1) { throw new IllegalArgumentException(s); } - data.add(new PostScriptCommandRaw(s)); + data.add(new PostScriptCommandRaw(s, checkConsistence)); } @Override @@ -74,24 +74,24 @@ public class EpsGraphicsMacro extends EpsGraphics { @Override public void newpath() { - append("0 setlinewidth"); - append("[] 0 setdash"); + append("0 setlinewidth", true); + append("[] 0 setdash", true); appendColor(getColor()); - append("newpath"); + append("newpath", true); } @Override public void closepath() { - macroInProgress.add(new PostScriptCommandRaw("closepath")); + macroInProgress.add(new PostScriptCommandRaw("closepath", true)); closeMacro(); } @Override public void fill(int windingRule) { if (windingRule == PathIterator.WIND_EVEN_ODD) { - append("eofill"); + append("eofill", true); } else if (windingRule == PathIterator.WIND_NON_ZERO) { - append("fill"); + append("fill", true); } } @@ -155,10 +155,10 @@ public class EpsGraphicsMacro extends EpsGraphics { final String existingName = macros.get(macroInProgress); if (existingName == null) { macros.put(macroInProgress, macroInProgress.getName()); - append(macroName()); + append(macroName(), true); macroCpt++; } else { - append(existingName); + append(existingName, true); } macroInProgress = null; } diff --git a/src/net/sourceforge/plantuml/eps/EpsTitler.java b/src/net/sourceforge/plantuml/eps/EpsTitler.java new file mode 100644 index 000000000..95f85b8e6 --- /dev/null +++ b/src/net/sourceforge/plantuml/eps/EpsTitler.java @@ -0,0 +1,173 @@ +/* ======================================================================== + * 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: 4173 $ + * + */ +package net.sourceforge.plantuml.eps; + +import java.awt.Color; +import java.awt.Font; +import java.awt.geom.Dimension2D; +import java.io.IOException; +import java.util.List; +import java.util.StringTokenizer; + +import net.sourceforge.plantuml.graphic.FontConfiguration; +import net.sourceforge.plantuml.graphic.HorizontalAlignement; +import net.sourceforge.plantuml.graphic.TextBlock; +import net.sourceforge.plantuml.graphic.TextBlockUtils; +import net.sourceforge.plantuml.graphic.VerticalPosition; +import net.sourceforge.plantuml.ugraphic.eps.UGraphicEps; + +public final class EpsTitler { + + private final Color textColor; + private final List text; + // private final int fontSize; + // private final String fontFamily; + private final HorizontalAlignement horizontalAlignement; + private final VerticalPosition verticalPosition; + private final int margin; + private final TextBlock textBloc; + + public EpsTitler(Color textColor, List text, int fontSize, String fontFamily, + HorizontalAlignement horizontalAlignement, VerticalPosition verticalPosition, int margin) { + this.textColor = textColor; + this.text = text; + // this.fontSize = fontSize; + // this.fontFamily = fontFamily; + this.horizontalAlignement = horizontalAlignement; + this.verticalPosition = verticalPosition; + this.margin = margin; + if (text == null || text.size() == 0) { + textBloc = null; + } else { + final Font normalFont = new Font(fontFamily, Font.PLAIN, fontSize); + textBloc = TextBlockUtils.create(text, new FontConfiguration(normalFont, textColor), + HorizontalAlignement.LEFT); + } + } + + public double getHeight() { + if (textBloc == null) { + return 0; + } + return textBloc.calculateDimension(new UGraphicEps(EpsStrategy.getDefault()).getStringBounder()).getHeight() + + margin; + } + + public String addTitleEps(String eps) throws IOException { + if (text == null || text.size() == 0) { + return eps; + } + + final int idx = eps.indexOf("%%BoundingBox:"); + if (idx == -1) { + throw new IllegalArgumentException(); + } + final StringTokenizer st = new StringTokenizer(eps.substring(idx + "%%BoundingBox:".length()), " \n\t\r"); + final int x1 = Integer.parseInt(st.nextToken()); + final int y1 = Integer.parseInt(st.nextToken()); + final int x2 = Integer.parseInt(st.nextToken()); + final int y2 = Integer.parseInt(st.nextToken()); + assert x2 >= x1; + assert y2 >= y1; + + final double width = x2 - x1; + final double height = y2 - y1; + + final UGraphicEps uGraphicEps = new UGraphicEps(EpsStrategy.getDefault()); + final Dimension2D dimText = textBloc.calculateDimension(uGraphicEps.getStringBounder()); + final double xpos; + + if (horizontalAlignement == HorizontalAlignement.LEFT) { + xpos = 2; + } else if (horizontalAlignement == HorizontalAlignement.RIGHT) { + xpos = width - dimText.getWidth() - 2; + } else if (horizontalAlignement == HorizontalAlignement.CENTER) { + xpos = (width - dimText.getWidth()) / 2; + } else { + xpos = 0; + assert false; + } + + final double yText; + + if (verticalPosition == VerticalPosition.TOP) { + yText = 0; + } else { + yText = height + margin; + } + + textBloc.drawU(uGraphicEps, xpos, yText); + + final double yImage; + if (verticalPosition == VerticalPosition.TOP) { + yImage = dimText.getHeight(); + } else { + yImage = 0; + } + + uGraphicEps.drawEps(eps, 0, yImage); + + uGraphicEps.close(); + return uGraphicEps.getEPSCode(); + + // String svgTitle = CucaDiagramFileMaker.getSvg(uGraphicSvg); + // svgTitle = svgTitle.replaceFirst("(?i)", ""); + // + // if (verticalPosition == VerticalPosition.TOP) { + // final Pattern p = + // Pattern.compile("(?i)translate\\((\\d+)\\s+(\\d+)"); + // final Matcher m = p.matcher(svg); + // + // final StringBuffer sb = new StringBuffer(); + // while (m.find()) { + // final int tx = Integer.parseInt(m.group(1)); + // final int ty = Integer.parseInt(m.group(2)) + (int) + // (dimText.getHeight()) + margin; + // m.appendReplacement(sb, "translate(" + tx + " " + ty); + // } + // m.appendTail(sb); + // svg = sb.toString(); + // } + // + // final int x = svg.indexOf(" filesUsed; public PreprocessorInclude(ReadLine reader, Set filesUsed) { @@ -84,16 +83,35 @@ class PreprocessorInclude implements ReadLine { } - private String manageInclude(Matcher m) throws IOException, FileNotFoundException { - final String fileName = m.group(1); + private String manageInclude(Matcher m) throws IOException { + String fileName = m.group(1); + final int idx = fileName.lastIndexOf('!'); + String suf = null; + if (idx != -1) { + suf = fileName.substring(idx + 1); + fileName = fileName.substring(0, idx); + } final File f = FileSystem.getInstance().getFile(fileName); if (f.exists()) { filesUsed.add(f); - included = new PreprocessorInclude(new ReadLineReader(new FileReader(f)), filesUsed); + included = new PreprocessorInclude(getReaderInclude(f, suf), filesUsed); + } else { + return "Cannot include " + f.getAbsolutePath(); } return this.readLine(); } + private ReadLine getReaderInclude(final File f, String suf) throws IOException { + if (StartumlExtractReader.containsStartuml(f)) { + int bloc = 0; + if (suf != null && suf.matches("\\d+")) { + bloc = Integer.parseInt(suf); + } + return new StartumlExtractReader(f, bloc); + } + return new ReadLineReader(new FileReader(f)); + } + public int getLineNumber() { return numLine; } diff --git a/src/net/sourceforge/plantuml/preproc/StartumlExtractReader.java b/src/net/sourceforge/plantuml/preproc/StartumlExtractReader.java index 5d3edd9df..cbbfb1a34 100644 --- a/src/net/sourceforge/plantuml/preproc/StartumlExtractReader.java +++ b/src/net/sourceforge/plantuml/preproc/StartumlExtractReader.java @@ -38,21 +38,44 @@ import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; +import net.sourceforge.plantuml.BlockUmlBuilder; + public class StartumlExtractReader implements ReadLine { private final ReadLine raw; + private boolean finished = false; - public StartumlExtractReader(File f, int num) throws FileNotFoundException { + public StartumlExtractReader(File f, int num) throws IOException { if (num < 0) { throw new IllegalArgumentException(); } raw = getReadLine(f); + String s = null; + while ((s = raw.readLine()) != null) { + if (BlockUmlBuilder.isArobaseStartuml(s)) { + if (num == 0) { + return; + } + num--; + } + } + finished = true; + } + + private static ReadLine getReadLine(File f) throws FileNotFoundException { + return new UncommentReadLine(new ReadLineReader(new FileReader(f))); } static public boolean containsStartuml(File f) throws IOException { ReadLine r = null; try { r = getReadLine(f); + String s = null; + while ((s = r.readLine()) != null) { + if (BlockUmlBuilder.isArobaseStartuml(s)) { + return true; + } + } } finally { if (r != null) { r.close(); @@ -61,12 +84,16 @@ public class StartumlExtractReader implements ReadLine { return false; } - private static ReadLine getReadLine(File f) throws FileNotFoundException { - return new UncommentReadLine(new ReadLineReader(new FileReader(f))); - } - public String readLine() throws IOException { - return raw.readLine(); + if (finished) { + return null; + } + final String result = raw.readLine(); + if (result != null && BlockUmlBuilder.isArobaseEnduml(result)) { + finished = true; + return null; + } + return result; } public void close() throws IOException { diff --git a/src/net/sourceforge/plantuml/sequencediagram/graphic/DrawableSetInitializer.java b/src/net/sourceforge/plantuml/sequencediagram/graphic/DrawableSetInitializer.java index d80f566b2..ba60db01c 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: 6198 $ + * Revision $Revision: 6214 $ * */ package net.sourceforge.plantuml.sequencediagram.graphic; @@ -174,7 +174,6 @@ class DrawableSetInitializer { final double x1 = drawableSet.getX1(pe); final double x2 = drawableSet.getX2(stringBounder, pe); final double missing = preferredWidth - (x2 - x1); - System.err.println("x1=" + x1 + " x2=" + x2 + " preferredWidth=" + preferredWidth + " missing=" + missing); if (missing>0) { constraintSet .pushToLeftParticipantBox(missing / 2, first, true); diff --git a/src/net/sourceforge/plantuml/skin/bluemodern/ComponentBlueModernSelfArrow.java b/src/net/sourceforge/plantuml/skin/bluemodern/ComponentBlueModernSelfArrow.java index f069222d5..3c3dce6df 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: 5977 $ + * Revision $Revision: 6242 $ * */ package net.sourceforge.plantuml.skin.bluemodern; @@ -62,7 +62,7 @@ public class ComponentBlueModernSelfArrow extends AbstractComponentBlueModernArr ug.getParam().setBackcolor(getForegroundColor()); ug.getParam().setColor(getForegroundColor()); - final int x2 = (int) arrowWidth; + final double x2 = arrowWidth - 3; if (getArrowConfiguration().isDotted()) { stroke(ug, 5, 2); diff --git a/src/net/sourceforge/plantuml/skin/rose/ComponentRoseSelfArrow.java b/src/net/sourceforge/plantuml/skin/rose/ComponentRoseSelfArrow.java index a7f4d71d9..975746124 100644 --- a/src/net/sourceforge/plantuml/skin/rose/ComponentRoseSelfArrow.java +++ b/src/net/sourceforge/plantuml/skin/rose/ComponentRoseSelfArrow.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5937 $ + * Revision $Revision: 6242 $ * */ package net.sourceforge.plantuml.skin.rose; @@ -62,7 +62,7 @@ public class ComponentRoseSelfArrow extends AbstractComponentRoseArrow { final double textHeight = getTextHeight(stringBounder); ug.getParam().setColor(getForegroundColor()); - final double x2 = arrowWidth; + final double x2 = arrowWidth - 3; if (getArrowConfiguration().isDotted()) { stroke(ug, 2, 2); diff --git a/src/net/sourceforge/plantuml/statediagram/StateDiagram.java b/src/net/sourceforge/plantuml/statediagram/StateDiagram.java index 6ddba18d5..7ec96c3cf 100644 --- a/src/net/sourceforge/plantuml/statediagram/StateDiagram.java +++ b/src/net/sourceforge/plantuml/statediagram/StateDiagram.java @@ -28,14 +28,11 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 6095 $ + * Revision $Revision: 6221 $ * */ package net.sourceforge.plantuml.statediagram; -import java.util.Arrays; -import java.util.List; - import net.sourceforge.plantuml.UmlDiagramType; import net.sourceforge.plantuml.UniqueSequence; import net.sourceforge.plantuml.classdiagram.AbstractEntityDiagram; @@ -106,6 +103,16 @@ public class StateDiagram extends AbstractEntityDiagram { return UmlDiagramType.STATE; } + private boolean hideEmptyDescription = false; + + public final void setHideEmptyDescription(boolean hideEmptyDescription) { + this.hideEmptyDescription = hideEmptyDescription; + } + + public final boolean isHideEmptyDescription() { + return hideEmptyDescription; + } + // @Override // final protected List getDotStrings() { // return Arrays.asList("nodesep=1.95;", "ranksep=1.8;", "edge [fontsize=11,labelfontsize=11];", diff --git a/src/net/sourceforge/plantuml/statediagram/StateDiagramFactory.java b/src/net/sourceforge/plantuml/statediagram/StateDiagramFactory.java index 4d24a0e67..bc07691e6 100644 --- a/src/net/sourceforge/plantuml/statediagram/StateDiagramFactory.java +++ b/src/net/sourceforge/plantuml/statediagram/StateDiagramFactory.java @@ -28,7 +28,7 @@ * * Original Author: Arnaud Roques * - * Revision $Revision: 5493 $ + * Revision $Revision: 6221 $ * */ package net.sourceforge.plantuml.statediagram; @@ -43,6 +43,7 @@ import net.sourceforge.plantuml.statediagram.command.CommandCreatePackageState2; import net.sourceforge.plantuml.statediagram.command.CommandCreateState; import net.sourceforge.plantuml.statediagram.command.CommandCreateState2; import net.sourceforge.plantuml.statediagram.command.CommandEndState; +import net.sourceforge.plantuml.statediagram.command.CommandHideEmptyDescription; import net.sourceforge.plantuml.statediagram.command.CommandLinkState2; import net.sourceforge.plantuml.usecasediagram.command.CommandRankDirUsecase; @@ -69,6 +70,7 @@ public class StateDiagramFactory extends AbstractUmlSystemCommandFactory { addCommand(new CommandAddField(system)); addCommand(new CommandConcurrentState(system)); addCommand(new CommandMultilinesClassNote(system)); + addCommand(new CommandHideEmptyDescription(system)); addCommand(new CommandNoteEntity(system)); addCommonCommands(system); diff --git a/src/net/sourceforge/plantuml/usecasediagram/command/CommandSetStrategy.java b/src/net/sourceforge/plantuml/statediagram/command/CommandHideEmptyDescription.java similarity index 77% rename from src/net/sourceforge/plantuml/usecasediagram/command/CommandSetStrategy.java rename to src/net/sourceforge/plantuml/statediagram/command/CommandHideEmptyDescription.java index 917162f7e..b39d2860a 100644 --- a/src/net/sourceforge/plantuml/usecasediagram/command/CommandSetStrategy.java +++ b/src/net/sourceforge/plantuml/statediagram/command/CommandHideEmptyDescription.java @@ -27,28 +27,27 @@ * in the United States and other countries.] * * Original Author: Arnaud Roques + * + * Revision $Revision: 4762 $ * */ -package net.sourceforge.plantuml.usecasediagram.command; +package net.sourceforge.plantuml.statediagram.command; import java.util.List; import net.sourceforge.plantuml.command.CommandExecutionResult; import net.sourceforge.plantuml.command.SingleLineCommand; -import net.sourceforge.plantuml.cucadiagram.CucaDiagram; -import net.sourceforge.plantuml.cucadiagram.dot.GraphvizLayoutStrategy; +import net.sourceforge.plantuml.statediagram.StateDiagram; -public class CommandSetStrategy extends SingleLineCommand { +public class CommandHideEmptyDescription extends SingleLineCommand { - public CommandSetStrategy(CucaDiagram diagram) { - super( - diagram, - "(?i)^layout with neato$"); + public CommandHideEmptyDescription(StateDiagram diagram) { + super(diagram, "(?i)^(hide|show)\\s+empty\\s+description$"); } @Override protected CommandExecutionResult executeArg(List arg) { - getSystem().setStrategy(GraphvizLayoutStrategy.NEATO); + getSystem().setHideEmptyDescription(arg.get(0).equalsIgnoreCase("hide")); return CommandExecutionResult.ok(); } diff --git a/src/net/sourceforge/plantuml/ugraphic/eps/UGraphicEps.java b/src/net/sourceforge/plantuml/ugraphic/eps/UGraphicEps.java index 281a8a571..e33579d31 100644 --- a/src/net/sourceforge/plantuml/ugraphic/eps/UGraphicEps.java +++ b/src/net/sourceforge/plantuml/ugraphic/eps/UGraphicEps.java @@ -93,6 +93,10 @@ public class UGraphicEps extends AbstractUGraphic implements ClipCo public StringBounder getStringBounder() { return stringBounder; } + + public void drawEps(String eps, double x, double y) { + this.getGraphicObject().drawEps(eps, x, y); + } public void setClip(UClip clip) { this.clip = clip; diff --git a/src/net/sourceforge/plantuml/usecasediagram/UsecaseDiagramFactory.java b/src/net/sourceforge/plantuml/usecasediagram/UsecaseDiagramFactory.java index 97f5f9df7..d916c02f7 100644 --- a/src/net/sourceforge/plantuml/usecasediagram/UsecaseDiagramFactory.java +++ b/src/net/sourceforge/plantuml/usecasediagram/UsecaseDiagramFactory.java @@ -45,7 +45,6 @@ import net.sourceforge.plantuml.usecasediagram.command.CommandCreateUsecase2; import net.sourceforge.plantuml.usecasediagram.command.CommandLinkUsecase2; import net.sourceforge.plantuml.usecasediagram.command.CommandMultilinesUsecaseNoteEntity; import net.sourceforge.plantuml.usecasediagram.command.CommandRankDirUsecase; -import net.sourceforge.plantuml.usecasediagram.command.CommandSetStrategy; public class UsecaseDiagramFactory extends AbstractUmlSystemCommandFactory { @@ -63,7 +62,7 @@ public class UsecaseDiagramFactory extends AbstractUmlSystemCommandFactory { addCommonCommands(system); addCommand(new CommandPage(system)); - //addCommand(new CommandLinkUsecase(system)); + // addCommand(new CommandLinkUsecase(system)); addCommand(new CommandLinkUsecase2(system)); addCommand(new CommandPackage(system)); @@ -78,7 +77,5 @@ public class UsecaseDiagramFactory extends AbstractUmlSystemCommandFactory { addCommand(new CommandMultilinesUsecaseNoteEntity(system)); addCommand(new CommandMultilinesStandaloneNote(system)); - - addCommand(new CommandSetStrategy(system)); -} + } } diff --git a/src/net/sourceforge/plantuml/version/Version.java b/src/net/sourceforge/plantuml/version/Version.java index 0a0b922a6..15e7779c8 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: 6211 $ + * Revision $Revision: 6243 $ * */ package net.sourceforge.plantuml.version; @@ -36,11 +36,11 @@ package net.sourceforge.plantuml.version; public class Version { public static int version() { - return 6210; + return 6242; } public static long compileTime() { - return 1300656476468L; + return 1301142337781L; } }