1
0
mirror of https://github.com/octoleo/plantuml.git synced 2024-12-22 10:59:01 +00:00

version 8057

This commit is contained in:
Arnaud Roques 2017-02-26 17:26:11 +01:00
parent c7252cdf63
commit 73307b6df5
80 changed files with 1063 additions and 176 deletions

View File

@ -6,12 +6,14 @@ Generate UML diagram from textual description
PlantUML is a component that allows to quickly write : PlantUML is a component that allows to quickly write :
* [Sequence diagram](http://plantuml.com/sequence.html), * [Sequence diagram](http://plantuml.com/sequence-diagram),
* [Use case diagram](http://plantuml.com/usecase.html), * [Use case diagram](http://plantuml.com/use-case-diagram),
* [Class diagram](http://plantuml.com/classes.html), * [Class diagram](http://plantuml.com/class-diagram),
* [Activity diagram](http://plantuml.com/activity2.html), * [Activity diagram](http://plantuml.com/activity-diagram-beta),
* [Component diagram](http://plantuml.com/component.html), * [Component diagram](http://plantuml.com/component-diagram),
* [State diagram](http://plantuml.com/state.html), * [State diagram](http://plantuml.com/state-diagram),
* [Object diagram](http://plantuml.com/objects.html) * [Object diagram](http://plantuml.com/object-diagram),
* [Deployment diagram](http://plantuml.com/deployment-diagram),
* [Timing diagram](http://plantuml.com/timing-diagram)
To know more about PlantUML, please visit http://plantuml.com/ To know more about PlantUML, please visit http://plantuml.com/

View File

@ -64,7 +64,6 @@
<jar jarfile="plantuml.jar" basedir="build"> <jar jarfile="plantuml.jar" basedir="build">
<manifest> <manifest>
<attribute name="Main-Class" value="net.sourceforge.plantuml.Run" /> <attribute name="Main-Class" value="net.sourceforge.plantuml.Run" />
<attribute name="SplashScreen-Image" value="net/sourceforge/plantuml/version/logo.png" />
<attribute name="Class-Path" value="batik-all-1.7.jar jlatexmath-minimal-1.0.3.jar jlm_cyrillic.jar jlm_greek.jar vizjs.jar j2v8_win32_x86_64-3.1.6.jar j2v8_linux_x86_64-3.1.6.jar j2v8_macosx_x86_64-3.1.6.jar" /> <attribute name="Class-Path" value="batik-all-1.7.jar jlatexmath-minimal-1.0.3.jar jlm_cyrillic.jar jlm_greek.jar vizjs.jar j2v8_win32_x86_64-3.1.6.jar j2v8_linux_x86_64-3.1.6.jar j2v8_macosx_x86_64-3.1.6.jar" />
</manifest> </manifest>
</jar> </jar>

View File

@ -35,7 +35,7 @@
<groupId>net.sourceforge.plantuml</groupId> <groupId>net.sourceforge.plantuml</groupId>
<artifactId>plantuml</artifactId> <artifactId>plantuml</artifactId>
<version>8057-SNAPSHOT</version> <version>8058-SNAPSHOT</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>PlantUML</name> <name>PlantUML</name>

View File

@ -96,7 +96,7 @@ public interface ISkinParam extends ISkinSimple {
public double getRoundCorner(String param, Stereotype stereotype); public double getRoundCorner(String param, Stereotype stereotype);
public double maxMessageSize(); public LineBreakStrategy maxMessageSize();
public boolean strictUmlStyle(); public boolean strictUmlStyle();
@ -129,10 +129,11 @@ public interface ISkinParam extends ISkinSimple {
public SplitParam getSplitParam(); public SplitParam getSplitParam();
public int swimlaneWidth(); public int swimlaneWidth();
public UmlDiagramType getUmlDiagramType(); public UmlDiagramType getUmlDiagramType();
public HtmlColor getHoverPathColor(); public HtmlColor getHoverPathColor();
public double getPadding(PaddingParam param);
} }

View File

@ -0,0 +1,50 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2017, Arnaud Roques
*
* Project Info: http://plantuml.com
*
* This file is part of PlantUML.
*
* PlantUML is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* PlantUML distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
* License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
*
* Original Author: Arnaud Roques
*
*
*/
package net.sourceforge.plantuml;
public class LineBreakStrategy {
public static final LineBreakStrategy NONE = new LineBreakStrategy(null);
private final String value;
public LineBreakStrategy(String value) {
this.value = value;
}
public double getMathWidth() {
if (value != null && value.matches("-?\\d+")) {
return Double.parseDouble(value);
}
return 0;
}
}

View File

@ -0,0 +1,41 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2017, Arnaud Roques
*
* Project Info: http://plantuml.com
*
* This file is part of PlantUML.
*
* PlantUML is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* PlantUML distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
* License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
*
* Original Author: Arnaud Roques
*
*
*/
package net.sourceforge.plantuml;
public enum PaddingParam {
PARTICIPANT, BOX;
public String getSkinName() {
return StringUtils.goLowerCase(name()) + "Padding";
}
}

View File

@ -130,7 +130,7 @@ public class Run {
} }
new MainWindow2(option, dir); new MainWindow2(option, dir);
} else if (option.isPipe() || option.isPipeMap() || option.isSyntax()) { } else if (option.isPipe() || option.isPipeMap() || option.isSyntax()) {
managePipe(option); error = managePipe(option);
forceQuit = true; forceQuit = true;
} else if (option.isFailfast2()) { } else if (option.isFailfast2()) {
final long start2 = System.currentTimeMillis(); final long start2 = System.currentTimeMillis();
@ -256,7 +256,7 @@ public class Run {
} }
} }
private static void managePipe(Option option) throws IOException { private static boolean managePipe(Option option) throws IOException {
final String charset = option.getCharset(); final String charset = option.getCharset();
final BufferedReader br; final BufferedReader br;
if (charset == null) { if (charset == null) {
@ -264,10 +264,11 @@ public class Run {
} else { } else {
br = new BufferedReader(new InputStreamReader(System.in, charset)); br = new BufferedReader(new InputStreamReader(System.in, charset));
} }
managePipe(option, br, System.out); return managePipe(option, br, System.out);
} }
public static void managePipe(Option option, final BufferedReader br, final PrintStream ps) throws IOException { static public boolean managePipe(Option option, final BufferedReader br, final PrintStream ps) throws IOException {
boolean error = false;
final StringBuilder sb = new StringBuilder(); final StringBuilder sb = new StringBuilder();
String s = null; String s = null;
while ((s = br.readLine()) != null) { while ((s = br.readLine()) != null) {
@ -286,6 +287,7 @@ public class Run {
ps.println(((UmlDiagram) system).getUmlDiagramType().name()); ps.println(((UmlDiagram) system).getUmlDiagramType().name());
ps.println(system.getDescription()); ps.println(system.getDescription());
} else if (system instanceof PSystemError) { } else if (system instanceof PSystemError) {
error = true;
ps.println("ERROR"); ps.println("ERROR");
final PSystemError sys = (PSystemError) system; final PSystemError sys = (PSystemError) system;
ps.println(sys.getHigherErrorPosition()); ps.println(sys.getHigherErrorPosition());
@ -302,6 +304,7 @@ public class Run {
} else if (option.isPipe()) { } else if (option.isPipe()) {
final String result = sourceStringReader.generateImage(ps, 0, option.getFileFormatOption()); final String result = sourceStringReader.generateImage(ps, 0, option.getFileFormatOption());
if ("(error)".equalsIgnoreCase(result)) { if ("(error)".equalsIgnoreCase(result)) {
error = true;
System.err.println("ERROR"); System.err.println("ERROR");
final Diagram system = sourceStringReader.getBlocks().get(0).getDiagram(); final Diagram system = sourceStringReader.getBlocks().get(0).getDiagram();
final PSystemError sys = (PSystemError) system; final PSystemError sys = (PSystemError) system;
@ -311,6 +314,7 @@ public class Run {
} }
} }
} }
return error;
} }
private static boolean manageAllFiles(Option option) throws IOException, InterruptedException { private static boolean manageAllFiles(Option option) throws IOException, InterruptedException {

View File

@ -641,12 +641,8 @@ public class SkinParam implements ISkinParam {
return null; return null;
} }
public double maxMessageSize() { public LineBreakStrategy maxMessageSize() {
final String value = getValue("maxmessagesize"); return new LineBreakStrategy(getValue("maxmessagesize"));
if (value != null && value.matches("-?\\d+")) {
return Double.parseDouble(value);
}
return 0;
} }
public boolean strictUmlStyle() { public boolean strictUmlStyle() {
@ -726,14 +722,6 @@ public class SkinParam implements ISkinParam {
return true; return true;
} }
public double getPadding() {
final String value = getValue("padding");
if (value != null && value.matches("\\d+(\\.\\d+)?")) {
return Double.parseDouble(value);
}
return 0;
}
public int groupInheritance() { public int groupInheritance() {
final String value = getValue("groupinheritance"); final String value = getValue("groupinheritance");
int result = Integer.MAX_VALUE; int result = Integer.MAX_VALUE;
@ -839,4 +827,20 @@ public class SkinParam implements ISkinParam {
return getIHtmlColorSet().getColorIfValid(value, false); return getIHtmlColorSet().getColorIfValid(value, false);
} }
public double getPadding() {
final String value = getValue("padding");
if (value != null && value.matches("\\d+(\\.\\d+)?")) {
return Double.parseDouble(value);
}
return 0;
}
public double getPadding(PaddingParam param) {
final String value = getValue(param.getSkinName());
if (value != null && value.matches("\\d+(\\.\\d+)?")) {
return Double.parseDouble(value);
}
return 0;
}
} }

View File

@ -150,7 +150,7 @@ public class SkinParamDelegator implements ISkinParam {
return skinParam.getThickness(param, stereotype); return skinParam.getThickness(param, stereotype);
} }
public double maxMessageSize() { public LineBreakStrategy maxMessageSize() {
return skinParam.maxMessageSize(); return skinParam.maxMessageSize();
} }
@ -254,4 +254,8 @@ public class SkinParamDelegator implements ISkinParam {
return skinParam.getHoverPathColor(); return skinParam.getHoverPathColor();
} }
public double getPadding(PaddingParam param) {
return skinParam.getPadding(param);
}
} }

View File

@ -35,6 +35,7 @@ import java.awt.geom.Dimension2D;
import net.sourceforge.plantuml.ColorParam; import net.sourceforge.plantuml.ColorParam;
import net.sourceforge.plantuml.FontParam; import net.sourceforge.plantuml.FontParam;
import net.sourceforge.plantuml.ISkinParam; import net.sourceforge.plantuml.ISkinParam;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.creole.CreoleMode; import net.sourceforge.plantuml.creole.CreoleMode;
import net.sourceforge.plantuml.creole.CreoleParser; import net.sourceforge.plantuml.creole.CreoleParser;
import net.sourceforge.plantuml.creole.Sheet; import net.sourceforge.plantuml.creole.Sheet;
@ -68,7 +69,7 @@ public class FloatingNote extends AbstractTextBlock implements Stencil, TextBloc
final Sheet sheet = new CreoleParser(fc, skinParam.getDefaultTextAlignment(HorizontalAlignment.LEFT), final Sheet sheet = new CreoleParser(fc, skinParam.getDefaultTextAlignment(HorizontalAlignment.LEFT),
skinParam, CreoleMode.FULL).createSheet(note); skinParam, CreoleMode.FULL).createSheet(note);
final SheetBlock2 sheetBlock2 = new SheetBlock2(new SheetBlock1(sheet, 0, skinParam.getPadding()), this, final SheetBlock2 sheetBlock2 = new SheetBlock2(new SheetBlock1(sheet, LineBreakStrategy.NONE, skinParam.getPadding()), this,
new UStroke(1)); new UStroke(1));
this.opale = new Opale(borderColor, noteBackgroundColor, sheetBlock2, skinParam.shadowing(), false); this.opale = new Opale(borderColor, noteBackgroundColor, sheetBlock2, skinParam.shadowing(), false);

View File

@ -40,6 +40,7 @@ import java.util.Set;
import net.sourceforge.plantuml.FontParam; import net.sourceforge.plantuml.FontParam;
import net.sourceforge.plantuml.ISkinParam; import net.sourceforge.plantuml.ISkinParam;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.activitydiagram3.Branch; import net.sourceforge.plantuml.activitydiagram3.Branch;
import net.sourceforge.plantuml.activitydiagram3.ftile.AbstractConnection; import net.sourceforge.plantuml.activitydiagram3.ftile.AbstractConnection;
import net.sourceforge.plantuml.activitydiagram3.ftile.AbstractFtile; import net.sourceforge.plantuml.activitydiagram3.ftile.AbstractFtile;
@ -125,7 +126,7 @@ class FtileIfAndStop extends AbstractFtile {
final Sheet sheet = new CreoleParser(fcTest, skinParam.getDefaultTextAlignment(HorizontalAlignment.LEFT), final Sheet sheet = new CreoleParser(fcTest, skinParam.getDefaultTextAlignment(HorizontalAlignment.LEFT),
skinParam, CreoleMode.FULL).createSheet(labelTest); skinParam, CreoleMode.FULL).createSheet(labelTest);
final SheetBlock1 sheetBlock1 = new SheetBlock1(sheet, 0, skinParam.getPadding()); final SheetBlock1 sheetBlock1 = new SheetBlock1(sheet, LineBreakStrategy.NONE, skinParam.getPadding());
final TextBlock tbTest = new SheetBlock2(sheetBlock1, Diamond.asStencil(sheetBlock1), final TextBlock tbTest = new SheetBlock2(sheetBlock1, Diamond.asStencil(sheetBlock1),
tileNonStop.getThickness()); tileNonStop.getThickness());

View File

@ -38,6 +38,7 @@ import java.util.Set;
import net.sourceforge.plantuml.ColorParam; import net.sourceforge.plantuml.ColorParam;
import net.sourceforge.plantuml.FontParam; import net.sourceforge.plantuml.FontParam;
import net.sourceforge.plantuml.ISkinParam; import net.sourceforge.plantuml.ISkinParam;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.activitydiagram3.ftile.AbstractFtile; import net.sourceforge.plantuml.activitydiagram3.ftile.AbstractFtile;
import net.sourceforge.plantuml.activitydiagram3.ftile.Ftile; import net.sourceforge.plantuml.activitydiagram3.ftile.Ftile;
import net.sourceforge.plantuml.activitydiagram3.ftile.FtileGeometry; import net.sourceforge.plantuml.activitydiagram3.ftile.FtileGeometry;
@ -98,7 +99,7 @@ public class FtileNoteAlone extends AbstractFtile implements Stencil {
final Sheet sheet = new CreoleParser(fc, skinParam.getDefaultTextAlignment(HorizontalAlignment.LEFT), final Sheet sheet = new CreoleParser(fc, skinParam.getDefaultTextAlignment(HorizontalAlignment.LEFT),
skinParam, CreoleMode.FULL).createSheet(note); skinParam, CreoleMode.FULL).createSheet(note);
final TextBlock text = new SheetBlock2(new SheetBlock1(sheet, 0, skinParam.getPadding()), this, new UStroke(1)); final TextBlock text = new SheetBlock2(new SheetBlock1(sheet, LineBreakStrategy.NONE, skinParam.getPadding()), this, new UStroke(1));
opale = new Opale(borderColor, noteBackgroundColor, text, skinParam.shadowing(), false); opale = new Opale(borderColor, noteBackgroundColor, text, skinParam.shadowing(), false);
} }

View File

@ -41,6 +41,7 @@ import net.sourceforge.plantuml.Dimension2DDouble;
import net.sourceforge.plantuml.Direction; import net.sourceforge.plantuml.Direction;
import net.sourceforge.plantuml.FontParam; import net.sourceforge.plantuml.FontParam;
import net.sourceforge.plantuml.ISkinParam; import net.sourceforge.plantuml.ISkinParam;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.activitydiagram3.PositionedNote; import net.sourceforge.plantuml.activitydiagram3.PositionedNote;
import net.sourceforge.plantuml.activitydiagram3.ftile.AbstractFtile; import net.sourceforge.plantuml.activitydiagram3.ftile.AbstractFtile;
import net.sourceforge.plantuml.activitydiagram3.ftile.Ftile; import net.sourceforge.plantuml.activitydiagram3.ftile.Ftile;
@ -121,7 +122,7 @@ public class FtileWithNoteOpale extends AbstractFtile implements Stencil {
final Sheet sheet = new CreoleParser(fc, skinParam.getDefaultTextAlignment(HorizontalAlignment.LEFT), final Sheet sheet = new CreoleParser(fc, skinParam.getDefaultTextAlignment(HorizontalAlignment.LEFT),
skinParam, CreoleMode.FULL).createSheet(note.getDisplay()); skinParam, CreoleMode.FULL).createSheet(note.getDisplay());
final TextBlock text = new SheetBlock2(new SheetBlock1(sheet, 0, skinParam.getPadding()), this, new UStroke(1)); final TextBlock text = new SheetBlock2(new SheetBlock1(sheet, LineBreakStrategy.NONE, skinParam.getPadding()), this, new UStroke(1));
opale = new Opale(borderColor, noteBackgroundColor, text, skinParam.shadowing(), withLink); opale = new Opale(borderColor, noteBackgroundColor, text, skinParam.shadowing(), withLink);
} }

View File

@ -38,6 +38,7 @@ import net.sourceforge.plantuml.ColorParam;
import net.sourceforge.plantuml.Dimension2DDouble; import net.sourceforge.plantuml.Dimension2DDouble;
import net.sourceforge.plantuml.FontParam; import net.sourceforge.plantuml.FontParam;
import net.sourceforge.plantuml.ISkinParam; import net.sourceforge.plantuml.ISkinParam;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.activitydiagram3.PositionedNote; import net.sourceforge.plantuml.activitydiagram3.PositionedNote;
import net.sourceforge.plantuml.activitydiagram3.ftile.AbstractFtile; import net.sourceforge.plantuml.activitydiagram3.ftile.AbstractFtile;
import net.sourceforge.plantuml.activitydiagram3.ftile.Ftile; import net.sourceforge.plantuml.activitydiagram3.ftile.Ftile;
@ -98,7 +99,7 @@ public class FtileWithNotes extends AbstractFtile {
for (PositionedNote note : notes) { for (PositionedNote note : notes) {
final Sheet sheet = new CreoleParser(fc, skinParam.getDefaultTextAlignment(HorizontalAlignment.LEFT), final Sheet sheet = new CreoleParser(fc, skinParam.getDefaultTextAlignment(HorizontalAlignment.LEFT),
skinParam, CreoleMode.FULL).createSheet(note.getDisplay()); skinParam, CreoleMode.FULL).createSheet(note.getDisplay());
final SheetBlock1 sheet1 = new SheetBlock1(sheet, 0, skinParam.getPadding()); final SheetBlock1 sheet1 = new SheetBlock1(sheet, LineBreakStrategy.NONE, skinParam.getPadding());
final SheetBlock2 sheet2 = new SheetBlock2(sheet1, new Stencil() { final SheetBlock2 sheet2 = new SheetBlock2(sheet1, new Stencil() {
// -6 and 15 value comes from Opale: this is very ugly! // -6 and 15 value comes from Opale: this is very ugly!
public double getStartingX(StringBounder stringBounder, double y) { public double getStartingX(StringBounder stringBounder, double y) {

View File

@ -33,6 +33,7 @@ package net.sourceforge.plantuml.activitydiagram3.ftile.vcompact.cond;
import java.awt.geom.Dimension2D; import java.awt.geom.Dimension2D;
import net.sourceforge.plantuml.ISkinParam; import net.sourceforge.plantuml.ISkinParam;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.activitydiagram3.Branch; import net.sourceforge.plantuml.activitydiagram3.Branch;
import net.sourceforge.plantuml.activitydiagram3.ftile.Diamond; import net.sourceforge.plantuml.activitydiagram3.ftile.Diamond;
import net.sourceforge.plantuml.activitydiagram3.ftile.Ftile; import net.sourceforge.plantuml.activitydiagram3.ftile.Ftile;
@ -193,7 +194,7 @@ public class ConditionalBuilder {
final Sheet sheet = new CreoleParser(fontTest, skinParam.getDefaultTextAlignment(HorizontalAlignment.LEFT), final Sheet sheet = new CreoleParser(fontTest, skinParam.getDefaultTextAlignment(HorizontalAlignment.LEFT),
skinParam, CreoleMode.FULL).createSheet(labelTest); skinParam, CreoleMode.FULL).createSheet(labelTest);
final SheetBlock1 sheetBlock1 = new SheetBlock1(sheet, 0, skinParam.getPadding()); final SheetBlock1 sheetBlock1 = new SheetBlock1(sheet, LineBreakStrategy.NONE, skinParam.getPadding());
final TextBlock tbTest = new SheetBlock2(sheetBlock1, Diamond.asStencil(sheetBlock1), tile1.getThickness()); final TextBlock tbTest = new SheetBlock2(sheetBlock1, Diamond.asStencil(sheetBlock1), tile1.getThickness());
final Ftile diamond1; final Ftile diamond1;

View File

@ -39,6 +39,7 @@ import net.sourceforge.plantuml.ColorParam;
import net.sourceforge.plantuml.Dimension2DDouble; import net.sourceforge.plantuml.Dimension2DDouble;
import net.sourceforge.plantuml.FontParam; import net.sourceforge.plantuml.FontParam;
import net.sourceforge.plantuml.ISkinParam; import net.sourceforge.plantuml.ISkinParam;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.SkinParamUtils; import net.sourceforge.plantuml.SkinParamUtils;
import net.sourceforge.plantuml.activitydiagram3.LinkRendering; import net.sourceforge.plantuml.activitydiagram3.LinkRendering;
import net.sourceforge.plantuml.activitydiagram3.ftile.AbstractFtile; import net.sourceforge.plantuml.activitydiagram3.ftile.AbstractFtile;
@ -119,7 +120,7 @@ public class FtileBox extends AbstractFtile {
final FontConfiguration fc = new FontConfiguration(skinParam, FontParam.ACTIVITY, null); final FontConfiguration fc = new FontConfiguration(skinParam, FontParam.ACTIVITY, null);
final Sheet sheet = new CreoleParser(fc, skinParam.getDefaultTextAlignment(HorizontalAlignment.LEFT), final Sheet sheet = new CreoleParser(fc, skinParam.getDefaultTextAlignment(HorizontalAlignment.LEFT),
skinParam, CreoleMode.FULL).createSheet(label); skinParam, CreoleMode.FULL).createSheet(label);
this.tb = new SheetBlock2(new SheetBlock1(sheet, 0, skinParam.getPadding()), new MyStencil(), new UStroke(1)); this.tb = new SheetBlock2(new SheetBlock1(sheet, LineBreakStrategy.NONE, skinParam.getPadding()), new MyStencil(), new UStroke(1));
this.print = label.toString(); this.print = label.toString();
} }

View File

@ -38,6 +38,7 @@ import java.util.List;
import java.util.StringTokenizer; import java.util.StringTokenizer;
import net.sourceforge.plantuml.Dimension2DDouble; import net.sourceforge.plantuml.Dimension2DDouble;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.Log; import net.sourceforge.plantuml.Log;
import net.sourceforge.plantuml.StringUtils; import net.sourceforge.plantuml.StringUtils;
import net.sourceforge.plantuml.Url; import net.sourceforge.plantuml.Url;
@ -227,7 +228,8 @@ public class AtomText implements Atom {
return x; return x;
} }
public List<AtomText> getSplitted(StringBounder stringBounder, double maxWidth) { public List<AtomText> getSplitted(StringBounder stringBounder, LineBreakStrategy maxWidthAsString) {
final double maxWidth = maxWidthAsString.getMathWidth();
final List<AtomText> result = new ArrayList<AtomText>(); final List<AtomText> result = new ArrayList<AtomText>();
final StringTokenizer st = new StringTokenizer(text, " ", true); final StringTokenizer st = new StringTokenizer(text, " ", true);
final StringBuilder currentLine = new StringBuilder(); final StringBuilder currentLine = new StringBuilder();

View File

@ -34,6 +34,7 @@ import java.awt.geom.Dimension2D;
import net.sourceforge.plantuml.Dimension2DDouble; import net.sourceforge.plantuml.Dimension2DDouble;
import net.sourceforge.plantuml.ISkinSimple; import net.sourceforge.plantuml.ISkinSimple;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.FontConfiguration;
import net.sourceforge.plantuml.graphic.HorizontalAlignment; import net.sourceforge.plantuml.graphic.HorizontalAlignment;
@ -77,7 +78,7 @@ public class CreoleHorizontalLine implements Atom {
} }
final CreoleParser parser = new CreoleParser(fontConfiguration, HorizontalAlignment.LEFT, skinParam, CreoleMode.FULL); final CreoleParser parser = new CreoleParser(fontConfiguration, HorizontalAlignment.LEFT, skinParam, CreoleMode.FULL);
final Sheet sheet = parser.createSheet(Display.getWithNewlines(line)); final Sheet sheet = parser.createSheet(Display.getWithNewlines(line));
final TextBlock tb = new SheetBlock1(sheet, 0, skinParam.getPadding()); final TextBlock tb = new SheetBlock1(sheet, LineBreakStrategy.NONE, skinParam.getPadding());
return tb; return tb;
} }

View File

@ -36,32 +36,37 @@ import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.StringBounder;
public class Fission { public class Fission {
private final Stripe stripe; private final Stripe stripe;
private final double maxWidth; private final LineBreakStrategy maxWidth;
public Fission(Stripe stripe, double maxWidth) { public Fission(Stripe stripe, LineBreakStrategy maxWidth) {
this.stripe = stripe; this.stripe = stripe;
this.maxWidth = maxWidth; this.maxWidth = maxWidth;
if (maxWidth == null) {
throw new IllegalArgumentException();
}
} }
public List<Stripe> getSplitted(StringBounder stringBounder) { public List<Stripe> getSplitted(StringBounder stringBounder) {
if (maxWidth == 0) { final double valueMaxWidth = maxWidth.getMathWidth();
if (valueMaxWidth == 0) {
return Arrays.asList(stripe); return Arrays.asList(stripe);
} }
final List<Stripe> result = new ArrayList<Stripe>(); final List<Stripe> result = new ArrayList<Stripe>();
StripeSimple current = new StripeSimple(); StripeSimple current = new StripeSimple();
for (Atom a1 : stripe.getAtoms()) { for (Atom atom : stripe.getAtoms()) {
for (Atom atom : getSplitted(stringBounder, a1)) { for (Atom atomSplitted : getSplitted(stringBounder, atom)) {
final double width = atom.calculateDimension(stringBounder).getWidth(); final double width = atomSplitted.calculateDimension(stringBounder).getWidth();
if (current.totalWidth + width > maxWidth) { if (current.totalWidth + width > valueMaxWidth) {
result.add(current); result.add(current);
current = new StripeSimple(); current = new StripeSimple();
} }
current.addAtom(atom, width); current.addAtom(atomSplitted, width);
} }
} }
if (current.totalWidth > 0) { if (current.totalWidth > 0) {

View File

@ -38,6 +38,7 @@ import java.util.List;
import net.sourceforge.plantuml.AbstractPSystem; import net.sourceforge.plantuml.AbstractPSystem;
import net.sourceforge.plantuml.FileFormatOption; import net.sourceforge.plantuml.FileFormatOption;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.core.DiagramDescription; import net.sourceforge.plantuml.core.DiagramDescription;
import net.sourceforge.plantuml.core.DiagramDescriptionImpl; import net.sourceforge.plantuml.core.DiagramDescriptionImpl;
import net.sourceforge.plantuml.core.ImageData; import net.sourceforge.plantuml.core.ImageData;
@ -71,7 +72,7 @@ public class PSystemCreole extends AbstractPSystem {
final FontConfiguration fontConfiguration = FontConfiguration.blackBlueTrue(font); final FontConfiguration fontConfiguration = FontConfiguration.blackBlueTrue(font);
final Sheet sheet = new CreoleParser(fontConfiguration, HorizontalAlignment.LEFT, null, CreoleMode.FULL) final Sheet sheet = new CreoleParser(fontConfiguration, HorizontalAlignment.LEFT, null, CreoleMode.FULL)
.createSheet(display); .createSheet(display);
final SheetBlock1 sheetBlock = new SheetBlock1(sheet, 0, 0); final SheetBlock1 sheetBlock = new SheetBlock1(sheet, LineBreakStrategy.NONE, 0);
final ImageBuilder builder = new ImageBuilder(new ColorMapperIdentity(), 1.0, null, null, null, 0, 0, null, final ImageBuilder builder = new ImageBuilder(new ColorMapperIdentity(), 1.0, null, null, null, 0, 0, null,
false); false);

View File

@ -38,6 +38,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import net.sourceforge.plantuml.Dimension2DDouble; import net.sourceforge.plantuml.Dimension2DDouble;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.graphic.AbstractTextBlock; import net.sourceforge.plantuml.graphic.AbstractTextBlock;
import net.sourceforge.plantuml.graphic.HorizontalAlignment; import net.sourceforge.plantuml.graphic.HorizontalAlignment;
import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.StringBounder;
@ -54,13 +55,16 @@ public class SheetBlock1 extends AbstractTextBlock implements TextBlock, Atom, S
private Map<Stripe, Double> widths; private Map<Stripe, Double> widths;
private Map<Atom, Position> positions; private Map<Atom, Position> positions;
private MinMax minMax; private MinMax minMax;
private final double maxWidth; private final LineBreakStrategy maxWidth;
private final double padding; private final double padding;
public SheetBlock1(Sheet sheet, double maxWidth, double padding) { public SheetBlock1(Sheet sheet, LineBreakStrategy maxWidth, double padding) {
this.sheet = sheet; this.sheet = sheet;
this.maxWidth = maxWidth; this.maxWidth = maxWidth;
this.padding = padding; this.padding = padding;
if (maxWidth == null) {
throw new IllegalArgumentException();
}
} }
@Override @Override

View File

@ -36,6 +36,7 @@ import java.util.List;
import java.util.StringTokenizer; import java.util.StringTokenizer;
import net.sourceforge.plantuml.ISkinSimple; import net.sourceforge.plantuml.ISkinSimple;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.FontConfiguration;
import net.sourceforge.plantuml.graphic.HorizontalAlignment; import net.sourceforge.plantuml.graphic.HorizontalAlignment;
import net.sourceforge.plantuml.graphic.HtmlColor; import net.sourceforge.plantuml.graphic.HtmlColor;
@ -69,7 +70,7 @@ public class StripeTable implements Stripe {
for (StripeSimple cell : cells) { for (StripeSimple cell : cells) {
sheet.add(cell); sheet.add(cell);
} }
return new SheetBlock1(sheet, 0, padding); return new SheetBlock1(sheet, LineBreakStrategy.NONE, padding);
} }
private HtmlColor getBackColor(String line) { private HtmlColor getBackColor(String line) {

View File

@ -41,6 +41,7 @@ import net.sourceforge.plantuml.CharSequence2;
import net.sourceforge.plantuml.CharSequence2Impl; import net.sourceforge.plantuml.CharSequence2Impl;
import net.sourceforge.plantuml.EmbededDiagram; import net.sourceforge.plantuml.EmbededDiagram;
import net.sourceforge.plantuml.ISkinSimple; import net.sourceforge.plantuml.ISkinSimple;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.LineLocationImpl; import net.sourceforge.plantuml.LineLocationImpl;
import net.sourceforge.plantuml.SpriteContainer; import net.sourceforge.plantuml.SpriteContainer;
import net.sourceforge.plantuml.StringUtils; import net.sourceforge.plantuml.StringUtils;
@ -371,12 +372,21 @@ public class Display implements Iterable<CharSequence> {
public TextBlock create(FontConfiguration fontConfiguration, HorizontalAlignment horizontalAlignment, public TextBlock create(FontConfiguration fontConfiguration, HorizontalAlignment horizontalAlignment,
ISkinSimple spriteContainer, CreoleMode modeSimpleLine) { ISkinSimple spriteContainer, CreoleMode modeSimpleLine) {
return create(fontConfiguration, horizontalAlignment, spriteContainer, 0, modeSimpleLine, null, null); return create(fontConfiguration, horizontalAlignment, spriteContainer, LineBreakStrategy.NONE, modeSimpleLine, null, null);
} }
public TextBlock create(FontConfiguration fontConfiguration, HorizontalAlignment horizontalAlignment, public TextBlock create(FontConfiguration fontConfiguration, HorizontalAlignment horizontalAlignment,
ISkinSimple spriteContainer, double maxMessageSize, CreoleMode modeSimpleLine, UFont fontForStereotype, ISkinSimple spriteContainer, LineBreakStrategy maxMessageSize) {
HtmlColor htmlColorForStereotype) { return create(fontConfiguration, horizontalAlignment, spriteContainer, maxMessageSize, defaultCreoleMode, null,
null);
}
public TextBlock create(FontConfiguration fontConfiguration, HorizontalAlignment horizontalAlignment,
ISkinSimple spriteContainer, LineBreakStrategy maxMessageSize, CreoleMode modeSimpleLine,
UFont fontForStereotype, HtmlColor htmlColorForStereotype) {
if (maxMessageSize == null) {
throw new IllegalArgumentException();
}
if (getNaturalHorizontalAlignment() != null) { if (getNaturalHorizontalAlignment() != null) {
horizontalAlignment = getNaturalHorizontalAlignment(); horizontalAlignment = getNaturalHorizontalAlignment();
} }
@ -398,7 +408,7 @@ public class Display implements Iterable<CharSequence> {
} }
private TextBlock getCreole(FontConfiguration fontConfiguration, HorizontalAlignment horizontalAlignment, private TextBlock getCreole(FontConfiguration fontConfiguration, HorizontalAlignment horizontalAlignment,
ISkinSimple spriteContainer, double maxMessageSize, CreoleMode modeSimpleLine) { ISkinSimple spriteContainer, LineBreakStrategy maxMessageSize, CreoleMode modeSimpleLine) {
final Sheet sheet = new CreoleParser(fontConfiguration, horizontalAlignment, spriteContainer, modeSimpleLine) final Sheet sheet = new CreoleParser(fontConfiguration, horizontalAlignment, spriteContainer, modeSimpleLine)
.createSheet(this); .createSheet(this);
final SheetBlock1 sheetBlock1 = new SheetBlock1(sheet, maxMessageSize, spriteContainer == null ? 0 final SheetBlock1 sheetBlock1 = new SheetBlock1(sheet, maxMessageSize, spriteContainer == null ? 0
@ -407,7 +417,7 @@ public class Display implements Iterable<CharSequence> {
} }
private TextBlock createMessageNumber(FontConfiguration fontConfiguration, HorizontalAlignment horizontalAlignment, private TextBlock createMessageNumber(FontConfiguration fontConfiguration, HorizontalAlignment horizontalAlignment,
ISkinSimple spriteContainer, double maxMessageSize) { ISkinSimple spriteContainer, LineBreakStrategy maxMessageSize) {
TextBlock tb1 = subList(0, 1).getCreole(fontConfiguration, horizontalAlignment, spriteContainer, TextBlock tb1 = subList(0, 1).getCreole(fontConfiguration, horizontalAlignment, spriteContainer,
maxMessageSize, CreoleMode.FULL); maxMessageSize, CreoleMode.FULL);
tb1 = TextBlockUtils.withMargin(tb1, 0, 4, 0, 0); tb1 = TextBlockUtils.withMargin(tb1, 0, 4, 0, 0);

View File

@ -60,7 +60,7 @@ import net.sourceforge.plantuml.version.PSystemVersion;
public class PSystemDonors extends AbstractPSystem { public class PSystemDonors extends AbstractPSystem {
public static final String DONORS = "UDfbL4josp0CtUCKN6lIGoXsx5J-96EdwKnsi0HRZ2d29IMdyZbwbImwqrqlu2CLSYkJIhaIXW3utiE3KfFyE-JWaMfoAhKrMuqvF54I3bSmvn0w3sbVYXkOkd15BQnfWxxMQDMIImkfBTYfALDzekvpkvMCFXqjp35woDOmrdsW3QIXDHzXtGG8BKnrCZoM8UjHDXxMDHrAich4V11-u_uTyZ2hFfIoWn4RRTMA6q-GDH_karSM8drmqB28K6CLX_9KQkWxsaBa79LQkkxGjS9qTQLjTx2CqTSdU33wA0LZdUy5-VL6MxZprzOs0f7G4SQdIjUkLNCikK38Ej5VIfJsKLv29enBphuLcIpMaYVu15Vs5ppj1wni8Q7BHPC9RboxvpU_rzB8IDc3g_K9xaDsmR3GUKb6tQ8sRSp0d68mtaD6Q3zbc7zhoAjnit4eipI1xpE_rfINQkRGOu2q8x5eDB6tpbcIecPyrB5HBbRv4WXhX5Latkw9c6VoAjM7o5QyxvIvPOSMpU56lL2DVF2m4eBe2ZNJtMXXOjXrUYz-_pBcClHW21EPK-mqlzh9OQzsD_LooCZ38_RsMEa1uDHejKOiP7NSZjHNiZjoDsgHFdrUfy7Q2LkOqc1bOkOs5ujKwbbGZyMqiv3fg9kiBCkS2EwEiVEF2ClGXAeUP1BHc3PQVD5Kf2RSK1tqpJrCuibSk0Gts5Cicy1TwfruQAshi882I3PvsocDijKHwCGOEFyulqVjp-_ddp0g1wlTok8rcykFm5dPXNiUm9aIRxUEMhNKbGmkm___Ady0ufjPnG00"; public static final String DONORS = "UDfbL4josp0CtUCKN6lIGoXsx5J-96EdwKnsi0HRZ2d29IMdyZbwbImwqrqlu2CLSYkJIhaoJ01y3tXFgKd-7NBmI3KvbTgQhSOSdYW9XokOSmYTXxGlnGrCNRYY5jQqGLzhj6h9fONK5kpKbAa-KVTpkvMCFXqjp35woDOmrdsW3QIXDHzXtGG8BKnrCZoM8UjHDXxMDHrAich4V11-u_uTyZ2hFfIoWn4RRTMA6q-GDH_karSM8drmqB28K6CLX_9KQkWxsaB6EIgrTDsXQuNfwahRxc0PewzFy63qKGh6EjyBykkDjd3dhwrj12AX8unFbQvTg-POSe6GTKD_AL7QHta9cR0kEVjMncInbZp19xYol-1fFs1b2mbTBZEPuCQrUtxpUosDZ9Gzk5gVu3va5mmBdPTar2rgqyOCp2a6upraXFPJXlctXhmQDnk7iaiJ-3xpQqrvgMOEFGP8EnA9HXjxwvGbAMh6HnqBvIALBu6mHbX5uksUY7achr9zY6J5-suoj-pGeZdSg1UgaGyULa8GNQ5ckbijJ0oxRjwBtx-CkImz2C94uXGvpQzoSjXFkzjwEMJauH5xUQpq071gj5eZ5c8TjoFrbUoEt8rQf4-VrscGTi8MfZImJCpSvYAHIZqBwh68TXOo7NMR5RFCYU3k62l_YB0CJQZgGIOHZMcZHHTDHMh23TLXlhc7IRoP2vUW1dkAnoPmbted6bhhAbXG08cJjzsaKLmTWKwCWVEFytlK_ln-_WcZSc3jLepNR2uV0cV52_SyW3CbtcuTjMgfArbSXlz_LLRN_yGZVm26X5oY";
@Override @Override
final protected ImageData exportDiagramNow(OutputStream os, int num, FileFormatOption fileFormat) final protected ImageData exportDiagramNow(OutputStream os, int num, FileFormatOption fileFormat)

View File

@ -30,7 +30,6 @@
*/ */
package net.sourceforge.plantuml.graphic; package net.sourceforge.plantuml.graphic;
public class HtmlColorUtils { public class HtmlColorUtils {
public static final HtmlColor BLACK; public static final HtmlColor BLACK;
@ -66,7 +65,6 @@ public class HtmlColorUtils {
public static final HtmlColor COL_D7E0F2; public static final HtmlColor COL_D7E0F2;
public static final HtmlColor COL_989898; public static final HtmlColor COL_989898;
public static final HtmlColor COL_BBBBBB; public static final HtmlColor COL_BBBBBB;
static { static {
@ -108,4 +106,11 @@ public class HtmlColorUtils {
} }
public static HtmlColor noGradient(HtmlColor color) {
if (color instanceof HtmlColorGradient) {
return ((HtmlColorGradient) color).getColor1();
}
return color;
}
} }

View File

@ -203,7 +203,8 @@ public class QuoteUtils {
"Ab WninFpevcg senzrjbexf jrer perngrq qhevat gur jevgvat bs guvf zrffntr.", "Ab WninFpevcg senzrjbexf jrer perngrq qhevat gur jevgvat bs guvf zrffntr.",
"P'rfg cerffr-cherr dhv g'nf vagreebtr ?", "P'rfg cerffr-cherr dhv g'nf vagreebtr ?",
"Ybbx, nygreangvir snpgf ner abg snpgf. Gurl'er snyfrubbqf", "Ybbx, nygreangvir snpgf ner abg snpgf. Gurl'er snyfrubbqf",
"Guvf vf abg n penfu, guvf vf zber bs na nygreangvir erfhyg."); "Guvf vf abg n penfu, guvf vf zber bs na nygreangvir erfhyg.",
"Lbh yrnearq gb cebtenz va SBEGENA qvqa'g lbh?");
private QuoteUtils() { private QuoteUtils() {
} }

View File

@ -35,6 +35,7 @@ import java.awt.geom.Rectangle2D;
import net.sourceforge.plantuml.Dimension2DDouble; import net.sourceforge.plantuml.Dimension2DDouble;
import net.sourceforge.plantuml.ISkinSimple; import net.sourceforge.plantuml.ISkinSimple;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.creole.CreoleMode; import net.sourceforge.plantuml.creole.CreoleMode;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.ugraphic.UGraphic; import net.sourceforge.plantuml.ugraphic.UGraphic;
@ -50,8 +51,8 @@ public class TextBlockTitle implements TextBlock {
if (stringsToDisplay.size() == 1 && stringsToDisplay.get(0).length() == 0) { if (stringsToDisplay.size() == 1 && stringsToDisplay.get(0).length() == 0) {
throw new IllegalArgumentException(); throw new IllegalArgumentException();
} }
textBlock = stringsToDisplay.create(font, HorizontalAlignment.CENTER, spriteContainer, 0, CreoleMode.FULL, textBlock = stringsToDisplay.create(font, HorizontalAlignment.CENTER, spriteContainer, LineBreakStrategy.NONE,
null, null); CreoleMode.FULL, null, null);
} }
public final void drawU(UGraphic ug) { public final void drawU(UGraphic ug) {

View File

@ -34,6 +34,7 @@ import java.awt.geom.Dimension2D;
import java.util.Arrays; import java.util.Arrays;
import net.sourceforge.plantuml.FontParam; import net.sourceforge.plantuml.FontParam;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.SkinParam; import net.sourceforge.plantuml.SkinParam;
import net.sourceforge.plantuml.creole.CreoleMode; import net.sourceforge.plantuml.creole.CreoleMode;
import net.sourceforge.plantuml.creole.CreoleParser; import net.sourceforge.plantuml.creole.CreoleParser;
@ -76,7 +77,7 @@ public class GTileNode extends AbstractTextBlock implements GTile {
final Sheet sheet9 = new CreoleParser(fc, HorizontalAlignment.LEFT, skinParam, CreoleMode.FULL) final Sheet sheet9 = new CreoleParser(fc, HorizontalAlignment.LEFT, skinParam, CreoleMode.FULL)
.createSheet(display); .createSheet(display);
final SheetBlock1 sheetBlock1 = new SheetBlock1(sheet9, 0, 0); final SheetBlock1 sheetBlock1 = new SheetBlock1(sheet9, LineBreakStrategy.NONE, 0);
return sheetBlock1; return sheetBlock1;
} }

View File

@ -44,7 +44,10 @@ public class ComplementBeforeOrAfterOrAtTaskStartOrEnd implements ComplementPatt
public Complement getComplement(GanttDiagram system, RegexResult arg, String suffix) { public Complement getComplement(GanttDiagram system, RegexResult arg, String suffix) {
final String code = arg.get("COMPLEMENT" + suffix, 2); final String code = arg.get("COMPLEMENT" + suffix, 2);
final String position = arg.get("COMPLEMENT" + suffix, 3); final String position = arg.get("COMPLEMENT" + suffix, 3);
final Task task = system.getTask(new TaskCode(code)); final Task task = system.getExistingTask(code);
if (task == null) {
throw new IllegalStateException();
}
final String days = arg.get("COMPLEMENT" + suffix, 0); final String days = arg.get("COMPLEMENT" + suffix, 0);
TaskInstant result = new TaskInstant(task, TaskAttribute.fromString(position)); TaskInstant result = new TaskInstant(task, TaskAttribute.fromString(position));
if (days != null) { if (days != null) {

View File

@ -0,0 +1,86 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2017, Arnaud Roques
*
* Project Info: http://plantuml.com
*
* This file is part of PlantUML.
*
* PlantUML is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* PlantUML distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
* License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
*
* Original Author: Arnaud Roques
*
*
*/
package net.sourceforge.plantuml.project3;
import net.sourceforge.plantuml.command.regex.IRegex;
import net.sourceforge.plantuml.command.regex.RegexConcat;
import net.sourceforge.plantuml.command.regex.RegexLeaf;
import net.sourceforge.plantuml.command.regex.RegexOr;
import net.sourceforge.plantuml.command.regex.RegexResult;
public class ComplementDate implements ComplementPattern {
public IRegex toRegex(String suffix) {
return new RegexOr(toRegexA(suffix), toRegexB(suffix));
}
private IRegex toRegexA(String suffix) {
return new RegexConcat( //
new RegexLeaf("ADAY" + suffix, "([\\d]+)"), //
new RegexLeaf("[\\w ]*?"), //
new RegexLeaf("AMONTH" + suffix, "(" + Month.getRegexString() + ")"), //
new RegexLeaf("[\\w ]*?"), //
new RegexLeaf("AYEAR" + suffix, "([\\d]+)"));
}
private IRegex toRegexB(String suffix) {
return new RegexConcat( //
new RegexLeaf("BYEAR" + suffix, "([\\d]{4})"), //
new RegexLeaf("\\D"), //
new RegexLeaf("BMONTH" + suffix, "([\\d]{1,2})"), //
new RegexLeaf("\\D"), //
new RegexLeaf("BDAY" + suffix, "([\\d]{1,2})"));
}
public Complement getComplement(GanttDiagram system, RegexResult arg, String suffix) {
if (arg.get("ADAY" + suffix, 0) != null) {
return resultA(arg, suffix);
}
if (arg.get("BDAY" + suffix, 0) != null) {
return resultB(arg, suffix);
}
throw new IllegalStateException();
}
private Complement resultA(RegexResult arg, String suffix) {
final int day = Integer.parseInt(arg.get("ADAY" + suffix, 0));
final String month = arg.get("AMONTH" + suffix, 0);
final int year = Integer.parseInt(arg.get("AYEAR" + suffix, 0));
return DayAsDate.create(year, month, day);
}
private Complement resultB(RegexResult arg, String suffix) {
final int day = Integer.parseInt(arg.get("BDAY" + suffix, 0));
final int month = Integer.parseInt(arg.get("BMONTH" + suffix, 0));
final int year = Integer.parseInt(arg.get("BYEAR" + suffix, 0));
return DayAsDate.create(year, month, day);
}
}

View File

@ -0,0 +1,92 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2017, Arnaud Roques
*
* Project Info: http://plantuml.com
*
* This file is part of PlantUML.
*
* PlantUML is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* PlantUML distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
* License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
*
* Original Author: Arnaud Roques
*
*
*/
package net.sourceforge.plantuml.project3;
public class DayAsDate implements Complement {
private final int year;
private final int dayOfMonth;
private final Month month;
public static DayAsDate create(int year, String month, int dayOfMonth) {
return new DayAsDate(year, Month.fromString(month), dayOfMonth);
}
public static DayAsDate create(int year, int month, int dayOfMonth) {
return new DayAsDate(year, Month.values()[month - 1], dayOfMonth);
}
private DayAsDate(int year, Month month, int dayOfMonth) {
this.year = year;
this.dayOfMonth = dayOfMonth;
this.month = month;
}
@Override
public String toString() {
return "" + year + "/" + month + "/" + dayOfMonth;
}
public final int getDayOfMonth() {
return dayOfMonth;
}
private int daysPerMonth() {
return month.getDaysPerMonth(year);
}
public DayAsDate next() {
int newDayOfMonth = dayOfMonth + 1;
if (newDayOfMonth <= daysPerMonth()) {
return new DayAsDate(year, month, newDayOfMonth);
}
assert newDayOfMonth > daysPerMonth();
newDayOfMonth = 1;
final Month newMonth = month.next();
final int newYear = newMonth == Month.JANUARY ? year + 1 : year;
return new DayAsDate(newYear, newMonth, newDayOfMonth);
}
public Month getMonth() {
return month;
}
// https://en.wikipedia.org/wiki/Zeller%27s_congruence
public DayOfWeek getDayOfWeek() {
final int q = dayOfMonth;
final int m = month.m();
final int y = m >= 13 ? year - 1 : year;
final int k = y % 100;
final int j = y / 100;
final int h = ((q + 13 * (m + 1) / 5) + k + k / 4 + j / 4 + 5 * j) % 7;
return DayOfWeek.fromH(h);
}
}

View File

@ -0,0 +1,50 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2017, Arnaud Roques
*
* Project Info: http://plantuml.com
*
* This file is part of PlantUML.
*
* PlantUML is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* PlantUML distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
* License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
*
* Original Author: Arnaud Roques
*
*
*/
package net.sourceforge.plantuml.project3;
import net.sourceforge.plantuml.StringUtils;
public enum DayOfWeek {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
public DayOfWeek next() {
return DayOfWeek.values()[(ordinal() + 1) % 7];
}
public static DayOfWeek fromH(int h) {
return DayOfWeek.values()[(h + 5) % 7];
}
public String shortName() {
return StringUtils.capitalize(name().substring(0, 2));
}
}

View File

@ -0,0 +1,39 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2017, Arnaud Roques
*
* Project Info: http://plantuml.com
*
* This file is part of PlantUML.
*
* PlantUML is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* PlantUML distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
* License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
*
* Original Author: Arnaud Roques
*
*
*/
package net.sourceforge.plantuml.project3;
public interface GCalendar {
// public DayAsDate next(DayAsDate day);
public DayAsDate toDayAsDate(InstantDay day);
}

View File

@ -0,0 +1,49 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2017, Arnaud Roques
*
* Project Info: http://plantuml.com
*
* This file is part of PlantUML.
*
* PlantUML is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* PlantUML distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
* License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
*
* Original Author: Arnaud Roques
*
*
*/
package net.sourceforge.plantuml.project3;
public class GCalendarSimple implements GCalendar {
private final DayAsDate start;
public GCalendarSimple(DayAsDate start) {
this.start = start;
}
public DayAsDate toDayAsDate(InstantDay day) {
DayAsDate result = start;
for (int i = 0; i < day.getNumDay(); i++) {
result = result.next();
}
return result;
}
}

View File

@ -36,6 +36,7 @@ import java.io.OutputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -49,7 +50,6 @@ import net.sourceforge.plantuml.core.ImageData;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.FontConfiguration;
import net.sourceforge.plantuml.graphic.HorizontalAlignment; import net.sourceforge.plantuml.graphic.HorizontalAlignment;
import net.sourceforge.plantuml.graphic.HtmlColor;
import net.sourceforge.plantuml.graphic.HtmlColorSetSimple; import net.sourceforge.plantuml.graphic.HtmlColorSetSimple;
import net.sourceforge.plantuml.graphic.HtmlColorUtils; import net.sourceforge.plantuml.graphic.HtmlColorUtils;
import net.sourceforge.plantuml.graphic.IHtmlColorSet; import net.sourceforge.plantuml.graphic.IHtmlColorSet;
@ -63,10 +63,16 @@ import net.sourceforge.plantuml.ugraphic.UGraphic;
import net.sourceforge.plantuml.ugraphic.ULine; import net.sourceforge.plantuml.ugraphic.ULine;
import net.sourceforge.plantuml.ugraphic.UTranslate; import net.sourceforge.plantuml.ugraphic.UTranslate;
public class GanttDiagram extends AbstractPSystem { public class GanttDiagram extends AbstractPSystem implements Subject {
private final Map<TaskCode, Task> tasks = new LinkedHashMap<TaskCode, Task>(); private final Map<TaskCode, Task> tasks = new LinkedHashMap<TaskCode, Task>();
private final Map<String, Task> byShortName = new HashMap<String, Task>();
private final List<GanttConstraint> constraints = new ArrayList<GanttConstraint>(); private final List<GanttConstraint> constraints = new ArrayList<GanttConstraint>();
private final IHtmlColorSet colorSet = new HtmlColorSetSimple();
private GCalendar calendar;
private Instant min;
private Instant max;
public DiagramDescription getDescription() { public DiagramDescription getDescription() {
return new DiagramDescriptionImpl("(Project)", getClass()); return new DiagramDescriptionImpl("(Project)", getClass());
@ -91,7 +97,6 @@ public class GanttDiagram extends AbstractPSystem {
} }
private void sortTasks() { private void sortTasks() {
System.err.println("SORTING TASKS!");
final TaskCodeSimpleOrder order = getCanonicalOrder(1); final TaskCodeSimpleOrder order = getCanonicalOrder(1);
final List<Task> list = new ArrayList<Task>(tasks.values()); final List<Task> list = new ArrayList<Task>(tasks.values());
Collections.sort(list, new Comparator<Task>() { Collections.sort(list, new Comparator<Task>() {
@ -108,8 +113,10 @@ public class GanttDiagram extends AbstractPSystem {
private UDrawable getUDrawable() { private UDrawable getUDrawable() {
return new UDrawable() { return new UDrawable() {
public void drawU(UGraphic ug) { public void drawU(UGraphic ug) {
initMinMax();
final TimeScale timeScale = new TimeScale(); final TimeScale timeScale = new TimeScale();
drawInternal(ug, timeScale); drawTimeHeader(ug, timeScale);
drawTasks(ug, timeScale);
drawConstraints(ug, timeScale); drawConstraints(ug, timeScale);
} }
}; };
@ -122,42 +129,66 @@ public class GanttDiagram extends AbstractPSystem {
} }
private void drawInternal(final UGraphic ug, TimeScale timeScale) { private void drawTimeHeader(final UGraphic ug, TimeScale timeScale) {
// System.err.println("=============="); final double yTotal = initTaskDraws(timeScale);
// for (Task task : tasks.values()) {
// System.err.println("task=" + task + " " + ((TaskImpl) task).debug());
// }
// System.err.println("==============");
Instant min = tasks.values().iterator().next().getStart();
Instant max = tasks.values().iterator().next().getEnd();
for (Task task : tasks.values()) {
final Instant start = task.getStart();
final Instant end = task.getEnd();
if (min.compareTo(start) > 0) {
min = start;
}
if (max.compareTo(end) < 0) {
max = end;
}
}
final double header = 16;
double y = header;
for (Task task : tasks.values()) {
final TaskDraw draw = new TaskDraw(task, timeScale, y);
task.setTaskDraw(draw);
y += draw.getHeight();
}
ULine vbar = new ULine(0, y);
final double xmin = timeScale.getPixel(min); final double xmin = timeScale.getPixel(min);
final double xmax = timeScale.getPixel(max.increment()); final double xmax = timeScale.getPixel(max.increment());
ug.apply(new UChangeColor(HtmlColorUtils.LIGHT_GRAY)).draw(new ULine(xmax - xmin, 0)); ug.apply(new UChangeColor(HtmlColorUtils.LIGHT_GRAY)).draw(new ULine(xmax - xmin, 0));
ug.apply(new UChangeColor(HtmlColorUtils.LIGHT_GRAY)).apply(new UTranslate(0, header - 3)) ug.apply(new UChangeColor(HtmlColorUtils.LIGHT_GRAY)).apply(new UTranslate(0, getHeaderHeight() - 3))
.draw(new ULine(xmax - xmin, 0)); .draw(new ULine(xmax - xmin, 0));
if (calendar == null) {
drawSimpleDayCounter(ug, timeScale, yTotal);
} else {
drawCalendar(ug, timeScale, yTotal);
}
}
private void drawCalendar(final UGraphic ug, TimeScale timeScale, final double yTotal) {
final int magic = 12;
final ULine vbar = new ULine(0, yTotal - magic);
Month lastMonth = null;
for (Instant i = min; i.compareTo(max.increment()) <= 0; i = i.increment()) {
final DayAsDate day = calendar.toDayAsDate((InstantDay) i);
final String d1 = "" + day.getDayOfMonth();
final TextBlock num = Display.getWithNewlines(d1).create(getFontConfiguration(), HorizontalAlignment.LEFT,
new SpriteContainerEmpty());
final double x1 = timeScale.getPixel(i);
final double x2 = timeScale.getPixel(i.increment());
if (i.compareTo(max.increment()) < 0) {
final TextBlock weekDay = Display.getWithNewlines(day.getDayOfWeek().shortName()).create(
getFontConfiguration(), HorizontalAlignment.LEFT, new SpriteContainerEmpty());
drawCenter(ug.apply(new UTranslate(0, magic * 2)), num, x1, x2);
drawCenter(ug.apply(new UTranslate(0, magic)), weekDay, x1, x2);
if (lastMonth != day.getMonth()) {
final TextBlock month = Display.getWithNewlines(day.getMonth().name()).create(
getFontConfiguration(), HorizontalAlignment.LEFT, new SpriteContainerEmpty());
month.drawU(ug.apply(new UTranslate(x1, 0)));
}
lastMonth = day.getMonth();
}
ug.apply(new UChangeColor(HtmlColorUtils.LIGHT_GRAY)).apply(new UTranslate(x1, magic)).draw(vbar);
}
}
private double getHeaderHeight() {
if (calendar != null) {
return 40;
}
return 16;
}
private void drawCenter(final UGraphic ug, final TextBlock text, final double x1, final double x2) {
final double width = text.calculateDimension(ug.getStringBounder()).getWidth();
final double delta = (x2 - x1) - width;
text.drawU(ug.apply(new UTranslate(x1 + delta / 2, 0)));
}
private void drawSimpleDayCounter(final UGraphic ug, TimeScale timeScale, final double yTotal) {
final ULine vbar = new ULine(0, yTotal);
for (Instant i = min; i.compareTo(max.increment()) <= 0; i = i.increment()) { for (Instant i = min; i.compareTo(max.increment()) <= 0; i = i.increment()) {
final TextBlock num = Display.getWithNewlines(i.toShortString()).create(getFontConfiguration(), final TextBlock num = Display.getWithNewlines(i.toShortString()).create(getFontConfiguration(),
HorizontalAlignment.LEFT, new SpriteContainerEmpty()); HorizontalAlignment.LEFT, new SpriteContainerEmpty());
@ -170,14 +201,40 @@ public class GanttDiagram extends AbstractPSystem {
} }
ug.apply(new UChangeColor(HtmlColorUtils.LIGHT_GRAY)).apply(new UTranslate(x1, 0)).draw(vbar); ug.apply(new UChangeColor(HtmlColorUtils.LIGHT_GRAY)).apply(new UTranslate(x1, 0)).draw(vbar);
} }
}
private double initTaskDraws(TimeScale timeScale) {
double y = getHeaderHeight();
for (Task task : tasks.values()) {
final TaskDraw draw = new TaskDraw(task, timeScale, y);
task.setTaskDraw(draw);
y += draw.getHeight();
}
return y;
}
private void initMinMax() {
min = tasks.values().iterator().next().getStart();
max = tasks.values().iterator().next().getEnd();
for (Task task : tasks.values()) {
final Instant start = task.getStart();
final Instant end = task.getEnd();
if (min.compareTo(start) > 0) {
min = start;
}
if (max.compareTo(end) < 0) {
max = end;
}
}
}
private void drawTasks(final UGraphic ug, TimeScale timeScale) {
for (Task task : tasks.values()) { for (Task task : tasks.values()) {
final TaskDraw draw = task.getTaskDraw(); final TaskDraw draw = task.getTaskDraw();
draw.drawU(ug.apply(new UTranslate(0, draw.getY()))); draw.drawU(ug.apply(new UTranslate(0, draw.getY())));
draw.getTitle().drawU( draw.getTitle().drawU(
ug.apply(new UTranslate(timeScale.getPixel(task.getStart().increment()), draw.getY()))); ug.apply(new UTranslate(timeScale.getPixel(task.getStart().increment()), draw.getY())));
} }
} }
private FontConfiguration getFontConfiguration() { private FontConfiguration getFontConfiguration() {
@ -185,11 +242,38 @@ public class GanttDiagram extends AbstractPSystem {
return new FontConfiguration(font, HtmlColorUtils.LIGHT_GRAY, HtmlColorUtils.LIGHT_GRAY, false); return new FontConfiguration(font, HtmlColorUtils.LIGHT_GRAY, HtmlColorUtils.LIGHT_GRAY, false);
} }
public Task getTask(TaskCode code) { public Task getExistingTask(String id) {
Task result = tasks.get(code); if (id == null) {
throw new IllegalArgumentException();
}
Task result = byShortName.get(id);
if (result != null) {
return result;
}
final TaskCode code = new TaskCode(id);
return tasks.get(code);
}
public Task getOrCreateTask(String codeOrShortName, String shortName) {
if (codeOrShortName == null) {
throw new IllegalArgumentException();
}
Task result = shortName == null ? null : byShortName.get(shortName);
if (result != null) {
return result;
}
result = byShortName.get(codeOrShortName);
if (result != null) {
return result;
}
final TaskCode code = new TaskCode(codeOrShortName);
result = tasks.get(code);
if (result == null) { if (result == null) {
result = new TaskImpl(code); result = new TaskImpl(code);
tasks.put(code, result); tasks.put(code, result);
if (byShortName != null) {
byShortName.put(shortName, result);
}
} }
return result; return result;
} }
@ -216,10 +300,12 @@ public class GanttDiagram extends AbstractPSystem {
constraints.add(constraint); constraints.add(constraint);
} }
private final IHtmlColorSet colorSet = new HtmlColorSetSimple();
public IHtmlColorSet getIHtmlColorSet() { public IHtmlColorSet getIHtmlColorSet() {
return colorSet; return colorSet;
} }
public void setStartingDate(DayAsDate start) {
this.calendar = new GCalendarSimple(start);
}
} }

View File

@ -46,7 +46,7 @@ import net.sourceforge.plantuml.core.DiagramType;
public class GanttDiagramFactory extends UmlDiagramFactory { public class GanttDiagramFactory extends UmlDiagramFactory {
private List<SubjectPattern> subjects() { private List<SubjectPattern> subjects() {
return Arrays.<SubjectPattern> asList(new SubjectTask()); return Arrays.<SubjectPattern> asList(new SubjectTask(), new SubjectProject());
} }
public GanttDiagramFactory() { public GanttDiagramFactory() {

View File

@ -0,0 +1,81 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2017, Arnaud Roques
*
* Project Info: http://plantuml.com
*
* This file is part of PlantUML.
*
* PlantUML is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* PlantUML distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
* License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
*
* Original Author: Arnaud Roques
*
*
*/
package net.sourceforge.plantuml.project3;
import net.sourceforge.plantuml.StringUtils;
public enum Month {
JANUARY(31), FEBRUARY(28), MARCH(31), APRIL(30), MAY(31), JUNE(30), //
JULY(31), AUGUST(31), SEPTEMBER(30), OCTOBER(31), NOVEMBER(30), DECEMBER(31);
private final int daysPerMonth;
private Month(int daysPerMonth) {
this.daysPerMonth = daysPerMonth;
}
static public String getRegexString() {
final StringBuilder sb = new StringBuilder();
for (Month month : Month.values()) {
if (sb.length() > 0) {
sb.append("|");
}
sb.append(month.name().substring(0, 3) + "[a-z]*");
}
return sb.toString();
}
public static Month fromString(String value) {
value = StringUtils.goUpperCase(value).substring(0, 3);
for (Month m : Month.values()) {
if (m.name().startsWith(value)) {
return m;
}
}
throw new IllegalArgumentException();
}
public final int getDaysPerMonth(int year) {
if (this == FEBRUARY && year % 4 == 0) {
return 29;
}
return daysPerMonth;
}
public Month next() {
return Month.values()[(this.ordinal() + 1) % 12];
}
public int m() {
return 3 + (ordinal() + 10) % 12;
}
}

View File

@ -60,6 +60,9 @@ public class NaturalCommand extends SingleLineCommand2<GanttDiagram> {
final Subject subject = subjectPattern.getSubject(system, arg); final Subject subject = subjectPattern.getSubject(system, arg);
final Verb verb = verbPattern.getVerb(system, arg); final Verb verb = verbPattern.getVerb(system, arg);
final Complement complement = complementPattern.getComplement(system, arg, "0"); final Complement complement = complementPattern.getComplement(system, arg, "0");
if (complement == null) {
throw new IllegalStateException();
}
return verb.execute(subject, complement); return verb.execute(subject, complement);
} }

View File

@ -0,0 +1,54 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2017, Arnaud Roques
*
* Project Info: http://plantuml.com
*
* This file is part of PlantUML.
*
* PlantUML is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* PlantUML distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
* License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
*
* Original Author: Arnaud Roques
*
*
*/
package net.sourceforge.plantuml.project3;
import java.util.Arrays;
import java.util.Collection;
import net.sourceforge.plantuml.command.regex.IRegex;
import net.sourceforge.plantuml.command.regex.RegexLeaf;
import net.sourceforge.plantuml.command.regex.RegexResult;
public class SubjectProject implements SubjectPattern {
public Collection<VerbPattern> getVerbs() {
return Arrays.<VerbPattern> asList(new VerbProjectStarts());
}
public IRegex toRegex() {
return new RegexLeaf("SUBJECT", "project");
}
public Subject getSubject(GanttDiagram project, RegexResult arg) {
return project;
}
}

View File

@ -45,12 +45,17 @@ public class SubjectTask implements SubjectPattern {
} }
public IRegex toRegex() { public IRegex toRegex() {
return new RegexLeaf("SUBJECT", "\\[([^\\[\\]]+?)\\]"); return new RegexLeaf("SUBJECT", "\\[([^\\[\\]]+?)\\](?:[%s]+as[%s]+\\[([^\\[\\]]+?)\\])?");
} }
public Subject getSubject(GanttDiagram project, RegexResult arg) { public Subject getSubject(GanttDiagram project, RegexResult arg) {
final String s = arg.get("SUBJECT", 0); final String s = arg.get("SUBJECT", 0);
return project.getTask(new TaskCode(s)); final String shortName = arg.get("SUBJECT", 1);
final Task result = project.getOrCreateTask(s, shortName);
if (result == null) {
throw new IllegalStateException();
}
return result;
} }
} }

View File

@ -36,7 +36,6 @@ import net.sourceforge.plantuml.Direction;
import net.sourceforge.plantuml.SpriteContainerEmpty; import net.sourceforge.plantuml.SpriteContainerEmpty;
import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.FontConfiguration;
import net.sourceforge.plantuml.graphic.HorizontalAlignment; import net.sourceforge.plantuml.graphic.HorizontalAlignment;
import net.sourceforge.plantuml.graphic.HtmlColor;
import net.sourceforge.plantuml.graphic.HtmlColorUtils; import net.sourceforge.plantuml.graphic.HtmlColorUtils;
import net.sourceforge.plantuml.graphic.TextBlock; import net.sourceforge.plantuml.graphic.TextBlock;
import net.sourceforge.plantuml.graphic.UDrawable; import net.sourceforge.plantuml.graphic.UDrawable;

View File

@ -0,0 +1,62 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2017, Arnaud Roques
*
* Project Info: http://plantuml.com
*
* This file is part of PlantUML.
*
* PlantUML is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* PlantUML distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
* License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
*
* Original Author: Arnaud Roques
*
*
*/
package net.sourceforge.plantuml.project3;
import java.util.Arrays;
import java.util.Collection;
import net.sourceforge.plantuml.command.CommandExecutionResult;
import net.sourceforge.plantuml.command.regex.IRegex;
import net.sourceforge.plantuml.command.regex.RegexLeaf;
import net.sourceforge.plantuml.command.regex.RegexResult;
public class VerbProjectStarts implements VerbPattern {
public Collection<ComplementPattern> getComplements() {
return Arrays.<ComplementPattern> asList(new ComplementDate());
}
public IRegex toRegex() {
return new RegexLeaf("starts[%s]*(the[%s]*|on[%s]*)*");
}
public Verb getVerb(final GanttDiagram project, RegexResult arg) {
return new Verb() {
public CommandExecutionResult execute(Subject subject, Complement complement) {
final DayAsDate start = (DayAsDate) complement;
assert project == subject;
project.setStartingDate(start);
return CommandExecutionResult.ok();
}
};
}
}

View File

@ -36,6 +36,7 @@ import java.util.List;
import net.sourceforge.plantuml.Dimension2DDouble; import net.sourceforge.plantuml.Dimension2DDouble;
import net.sourceforge.plantuml.ISkinParam; import net.sourceforge.plantuml.ISkinParam;
import net.sourceforge.plantuml.OptionFlags; import net.sourceforge.plantuml.OptionFlags;
import net.sourceforge.plantuml.PaddingParam;
import net.sourceforge.plantuml.SkinParamBackcolored; import net.sourceforge.plantuml.SkinParamBackcolored;
import net.sourceforge.plantuml.SkinParamBackcoloredReference; import net.sourceforge.plantuml.SkinParamBackcoloredReference;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
@ -191,8 +192,9 @@ class DrawableSetInitializer {
} }
} }
takeParticipantEngloberPadding(stringBounder);
constraintSet.takeConstraintIntoAccount(stringBounder); constraintSet.takeConstraintIntoAccount(stringBounder);
takeParticipantEngloberTitleWidth3(stringBounder); takeParticipantEngloberTitleWidth(stringBounder);
prepareMissingSpace(stringBounder); prepareMissingSpace(stringBounder);
@ -201,7 +203,22 @@ class DrawableSetInitializer {
return drawableSet; return drawableSet;
} }
private void takeParticipantEngloberTitleWidth3(StringBounder stringBounder) { private void takeParticipantEngloberPadding(StringBounder stringBounder) {
final double padding = drawableSet.getSkinParam().getPadding(PaddingParam.BOX);
if (padding == 0) {
return;
}
for (Englober pe : drawableSet.getExistingParticipantEnglober(stringBounder)) {
final ParticipantBox first = drawableSet.getLivingParticipantBox(pe.getFirst2TOBEPRIVATE())
.getParticipantBox();
final ParticipantBox last = drawableSet.getLivingParticipantBox(pe.getLast2TOBEPRIVATE())
.getParticipantBox();
constraintSet.pushToLeftParticipantBox(padding, first, true);
constraintSet.pushToLeftParticipantBox(padding, last, false);
}
}
private void takeParticipantEngloberTitleWidth(StringBounder stringBounder) {
for (Englober pe : drawableSet.getExistingParticipantEnglober(stringBounder)) { for (Englober pe : drawableSet.getExistingParticipantEnglober(stringBounder)) {
final double preferredWidth = drawableSet.getEngloberPreferedWidth(stringBounder, final double preferredWidth = drawableSet.getEngloberPreferedWidth(stringBounder,
pe.getParticipantEnglober()); pe.getParticipantEnglober());

View File

@ -34,6 +34,7 @@ import java.awt.geom.Dimension2D;
import net.sourceforge.plantuml.FontParam; import net.sourceforge.plantuml.FontParam;
import net.sourceforge.plantuml.ISkinSimple; import net.sourceforge.plantuml.ISkinSimple;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.creole.CreoleMode; import net.sourceforge.plantuml.creole.CreoleMode;
import net.sourceforge.plantuml.cucadiagram.BodyEnhanced2; import net.sourceforge.plantuml.cucadiagram.BodyEnhanced2;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
@ -58,16 +59,16 @@ public abstract class AbstractTextualComponent extends AbstractComponent {
private final UFont font; private final UFont font;
private final HtmlColor fontColor; private final HtmlColor fontColor;
public AbstractTextualComponent(CharSequence label, FontConfiguration font, public AbstractTextualComponent(LineBreakStrategy maxMessageSize, CharSequence label,
HorizontalAlignment horizontalAlignment, int marginX1, int marginX2, int marginY, FontConfiguration font, HorizontalAlignment horizontalAlignment, int marginX1, int marginX2,
ISkinSimple spriteContainer, double maxMessageSize, UFont fontForStereotype, int marginY, ISkinSimple spriteContainer, UFont fontForStereotype,
HtmlColor htmlColorForStereotype) { HtmlColor htmlColorForStereotype) {
this(Display.getWithNewlines(label == null ? "" : label.toString()), font, horizontalAlignment, marginX1, this(maxMessageSize, Display.getWithNewlines(label == null ? "" : label.toString()), font, horizontalAlignment,
marginX2, marginY, spriteContainer, maxMessageSize, false, fontForStereotype, htmlColorForStereotype); marginX1, marginX2, marginY, spriteContainer, false, fontForStereotype, htmlColorForStereotype);
} }
public AbstractTextualComponent(Display strings, FontConfiguration font, HorizontalAlignment horizontalAlignment, public AbstractTextualComponent(LineBreakStrategy maxMessageSize, Display strings, FontConfiguration font,
int marginX1, int marginX2, int marginY, ISkinSimple spriteContainer, double maxMessageSize, HorizontalAlignment horizontalAlignment, int marginX1, int marginX2, int marginY, ISkinSimple spriteContainer,
boolean enhanced, UFont fontForStereotype, HtmlColor htmlColorForStereotype) { boolean enhanced, UFont fontForStereotype, HtmlColor htmlColorForStereotype) {
this.font = font.getFont(); this.font = font.getFont();
this.fontColor = font.getColor(); this.fontColor = font.getColor();

View File

@ -31,6 +31,7 @@
package net.sourceforge.plantuml.skin.bluemodern; package net.sourceforge.plantuml.skin.bluemodern;
import net.sourceforge.plantuml.ISkinSimple; import net.sourceforge.plantuml.ISkinSimple;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.FontConfiguration;
import net.sourceforge.plantuml.graphic.HorizontalAlignment; import net.sourceforge.plantuml.graphic.HorizontalAlignment;
@ -50,8 +51,8 @@ public abstract class AbstractComponentBlueModernArrow extends AbstractTextualCo
private final HtmlColor foregroundColor; private final HtmlColor foregroundColor;
public AbstractComponentBlueModernArrow(HtmlColor foregroundColor, FontConfiguration font, Display stringsToDisplay, ArrowConfiguration arrowConfiguration, ISkinSimple spriteContainer) { public AbstractComponentBlueModernArrow(HtmlColor foregroundColor, FontConfiguration font, Display stringsToDisplay, ArrowConfiguration arrowConfiguration, ISkinSimple spriteContainer) {
super(stringsToDisplay, font, HorizontalAlignment.LEFT, 17, 17, 2, super(LineBreakStrategy.NONE, stringsToDisplay, font, HorizontalAlignment.LEFT, 17, 17,
spriteContainer, 0, false, null, null); 2, spriteContainer, false, null, null);
this.arrowConfiguration = arrowConfiguration; this.arrowConfiguration = arrowConfiguration;
this.foregroundColor = foregroundColor; this.foregroundColor = foregroundColor;
} }

View File

@ -31,6 +31,7 @@
package net.sourceforge.plantuml.skin.bluemodern; package net.sourceforge.plantuml.skin.bluemodern;
import net.sourceforge.plantuml.ISkinSimple; import net.sourceforge.plantuml.ISkinSimple;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.FontConfiguration;
import net.sourceforge.plantuml.graphic.HorizontalAlignment; import net.sourceforge.plantuml.graphic.HorizontalAlignment;
@ -51,8 +52,8 @@ public class ComponentBlueModernActor extends AbstractTextualComponent {
public ComponentBlueModernActor(HtmlColor backgroundColor, HtmlColor foregroundColor, FontConfiguration font, public ComponentBlueModernActor(HtmlColor backgroundColor, HtmlColor foregroundColor, FontConfiguration font,
Display stringsToDisplay, boolean head, ISkinSimple spriteContainer) { Display stringsToDisplay, boolean head, ISkinSimple spriteContainer) {
super(stringsToDisplay, font, HorizontalAlignment.CENTER, 3, 3, 0, super(LineBreakStrategy.NONE, stringsToDisplay, font, HorizontalAlignment.CENTER, 3, 3,
spriteContainer, 0, false, null, null); 0, spriteContainer, false, null, null);
this.head = head; this.head = head;
stickman = new StickMan(backgroundColor, foregroundColor); stickman = new StickMan(backgroundColor, foregroundColor);
} }

View File

@ -33,6 +33,7 @@ package net.sourceforge.plantuml.skin.bluemodern;
import java.awt.geom.Dimension2D; import java.awt.geom.Dimension2D;
import net.sourceforge.plantuml.ISkinSimple; import net.sourceforge.plantuml.ISkinSimple;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.FontConfiguration;
import net.sourceforge.plantuml.graphic.HorizontalAlignment; import net.sourceforge.plantuml.graphic.HorizontalAlignment;
@ -47,8 +48,8 @@ public class ComponentBlueModernDelayText extends AbstractTextualComponent {
public ComponentBlueModernDelayText(FontConfiguration font, Display stringsToDisplay, public ComponentBlueModernDelayText(FontConfiguration font, Display stringsToDisplay,
ISkinSimple spriteContainer) { ISkinSimple spriteContainer) {
super(stringsToDisplay, font, HorizontalAlignment.CENTER, 4, 4, 4, super(LineBreakStrategy.NONE, stringsToDisplay, font, HorizontalAlignment.CENTER, 4, 4,
spriteContainer, 0, false, null, null); 4, spriteContainer, false, null, null);
} }
@Override @Override

View File

@ -33,6 +33,7 @@ package net.sourceforge.plantuml.skin.bluemodern;
import java.awt.geom.Dimension2D; import java.awt.geom.Dimension2D;
import net.sourceforge.plantuml.ISkinSimple; import net.sourceforge.plantuml.ISkinSimple;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.FontConfiguration;
import net.sourceforge.plantuml.graphic.HorizontalAlignment; import net.sourceforge.plantuml.graphic.HorizontalAlignment;
@ -58,8 +59,8 @@ public class ComponentBlueModernDivider extends AbstractTextualComponent {
public ComponentBlueModernDivider(FontConfiguration font, HtmlColor background1, HtmlColor background2, public ComponentBlueModernDivider(FontConfiguration font, HtmlColor background1, HtmlColor background2,
HtmlColor borderColor, Display stringsToDisplay, ISkinSimple spriteContainer) { HtmlColor borderColor, Display stringsToDisplay, ISkinSimple spriteContainer) {
super(stringsToDisplay, font, HorizontalAlignment.CENTER, 4, 4, 4, super(LineBreakStrategy.NONE, stringsToDisplay, font, HorizontalAlignment.CENTER, 4, 4,
spriteContainer, 0, false, null, null); 4, spriteContainer, false, null, null);
this.background1 = background1; this.background1 = background1;
this.background2 = background2; this.background2 = background2;
this.borderColor = borderColor; this.borderColor = borderColor;

View File

@ -33,6 +33,7 @@ package net.sourceforge.plantuml.skin.bluemodern;
import java.awt.geom.Dimension2D; import java.awt.geom.Dimension2D;
import net.sourceforge.plantuml.ISkinSimple; import net.sourceforge.plantuml.ISkinSimple;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.FontConfiguration;
import net.sourceforge.plantuml.graphic.HorizontalAlignment; import net.sourceforge.plantuml.graphic.HorizontalAlignment;
@ -54,7 +55,7 @@ public class ComponentBlueModernEnglober extends AbstractTextualComponent {
public ComponentBlueModernEnglober(HtmlColor borderColor, HtmlColor backColor, Display strings, public ComponentBlueModernEnglober(HtmlColor borderColor, HtmlColor backColor, Display strings,
FontConfiguration font, ISkinSimple spriteContainer) { FontConfiguration font, ISkinSimple spriteContainer) {
super(strings, font, HorizontalAlignment.CENTER, 4, 4, 1, spriteContainer, 0, false, super(LineBreakStrategy.NONE, strings, font, HorizontalAlignment.CENTER, 4, 4, 1, spriteContainer, false,
null, null); null, null);
this.borderColor = borderColor; this.borderColor = borderColor;
this.backColor = backColor; this.backColor = backColor;

View File

@ -33,6 +33,7 @@ package net.sourceforge.plantuml.skin.bluemodern;
import java.awt.geom.Dimension2D; import java.awt.geom.Dimension2D;
import net.sourceforge.plantuml.ISkinSimple; import net.sourceforge.plantuml.ISkinSimple;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.FontConfiguration;
import net.sourceforge.plantuml.graphic.HorizontalAlignment; import net.sourceforge.plantuml.graphic.HorizontalAlignment;
@ -65,7 +66,7 @@ public class ComponentBlueModernGroupingHeader extends AbstractTextualComponent
public ComponentBlueModernGroupingHeader(HtmlColor headerBackgroundColor, HtmlColor generalBackgroundColor, public ComponentBlueModernGroupingHeader(HtmlColor headerBackgroundColor, HtmlColor generalBackgroundColor,
HtmlColor borderColor, HtmlColor fontColor2, FontConfiguration bigFont, UFont smallFont, Display strings, HtmlColor borderColor, HtmlColor fontColor2, FontConfiguration bigFont, UFont smallFont, Display strings,
ISkinSimple spriteContainer) { ISkinSimple spriteContainer) {
super(strings.get(0), bigFont, HorizontalAlignment.LEFT, 15, 30, 1, spriteContainer, 0, null, null); super(LineBreakStrategy.NONE, strings.get(0), bigFont, HorizontalAlignment.LEFT, 15, 30, 1, spriteContainer, null, null);
this.headerBackgroundColor = headerBackgroundColor; this.headerBackgroundColor = headerBackgroundColor;
this.generalBackgroundColor = generalBackgroundColor; this.generalBackgroundColor = generalBackgroundColor;
this.borderColor = borderColor; this.borderColor = borderColor;

View File

@ -31,6 +31,7 @@
package net.sourceforge.plantuml.skin.bluemodern; package net.sourceforge.plantuml.skin.bluemodern;
import net.sourceforge.plantuml.ISkinSimple; import net.sourceforge.plantuml.ISkinSimple;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.FontConfiguration;
import net.sourceforge.plantuml.graphic.HorizontalAlignment; import net.sourceforge.plantuml.graphic.HorizontalAlignment;
@ -54,7 +55,7 @@ final public class ComponentBlueModernNote extends AbstractTextualComponent {
public ComponentBlueModernNote(HtmlColor back, HtmlColor foregroundColor, FontConfiguration font, public ComponentBlueModernNote(HtmlColor back, HtmlColor foregroundColor, FontConfiguration font,
Display strings, ISkinSimple spriteContainer) { Display strings, ISkinSimple spriteContainer) {
super(strings, font, HorizontalAlignment.LEFT, 6, 15, 5, spriteContainer, 0, false, super(LineBreakStrategy.NONE, strings, font, HorizontalAlignment.LEFT, 6, 15, 5, spriteContainer, false,
null, null); null, null);
this.back = back; this.back = back;
this.foregroundColor = foregroundColor; this.foregroundColor = foregroundColor;

View File

@ -31,6 +31,7 @@
package net.sourceforge.plantuml.skin.bluemodern; package net.sourceforge.plantuml.skin.bluemodern;
import net.sourceforge.plantuml.ISkinSimple; import net.sourceforge.plantuml.ISkinSimple;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.FontConfiguration;
import net.sourceforge.plantuml.graphic.HorizontalAlignment; import net.sourceforge.plantuml.graphic.HorizontalAlignment;
@ -50,8 +51,8 @@ public class ComponentBlueModernParticipant extends AbstractTextualComponent {
public ComponentBlueModernParticipant(HtmlColor blue1, HtmlColor blue2, FontConfiguration font, public ComponentBlueModernParticipant(HtmlColor blue1, HtmlColor blue2, FontConfiguration font,
Display stringsToDisplay, ISkinSimple spriteContainer) { Display stringsToDisplay, ISkinSimple spriteContainer) {
super(stringsToDisplay, font, HorizontalAlignment.CENTER, 7, 7, 7, super(LineBreakStrategy.NONE, stringsToDisplay, font, HorizontalAlignment.CENTER, 7, 7,
spriteContainer, 0, false, null, null); 7, spriteContainer, false, null, null);
this.blue1 = blue1; this.blue1 = blue1;
this.blue2 = blue2; this.blue2 = blue2;
} }

View File

@ -31,6 +31,7 @@
package net.sourceforge.plantuml.skin.rose; package net.sourceforge.plantuml.skin.rose;
import net.sourceforge.plantuml.ISkinSimple; import net.sourceforge.plantuml.ISkinSimple;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.FontConfiguration;
import net.sourceforge.plantuml.graphic.HorizontalAlignment; import net.sourceforge.plantuml.graphic.HorizontalAlignment;
@ -48,9 +49,9 @@ public abstract class AbstractComponentRoseArrow extends AbstractTextualComponen
public AbstractComponentRoseArrow(HtmlColor foregroundColor, FontConfiguration font, Display stringsToDisplay, public AbstractComponentRoseArrow(HtmlColor foregroundColor, FontConfiguration font, Display stringsToDisplay,
ArrowConfiguration arrowConfiguration, ISkinSimple spriteContainer, HorizontalAlignment textHorizontalAlignment, ArrowConfiguration arrowConfiguration, ISkinSimple spriteContainer, HorizontalAlignment textHorizontalAlignment,
double maxMessageSize) { LineBreakStrategy maxMessageSize) {
super(stringsToDisplay, font, textHorizontalAlignment, 7, 7, 1, spriteContainer, super(maxMessageSize, stringsToDisplay, font, textHorizontalAlignment, 7, 7, 1,
maxMessageSize, false, null, null); spriteContainer, false, null, null);
this.arrowConfiguration = arrowConfiguration; this.arrowConfiguration = arrowConfiguration;
this.foregroundColor = foregroundColor; this.foregroundColor = foregroundColor;
} }

View File

@ -33,6 +33,7 @@ package net.sourceforge.plantuml.skin.rose;
import java.awt.geom.Dimension2D; import java.awt.geom.Dimension2D;
import net.sourceforge.plantuml.ISkinSimple; import net.sourceforge.plantuml.ISkinSimple;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.FontConfiguration;
import net.sourceforge.plantuml.graphic.HorizontalAlignment; import net.sourceforge.plantuml.graphic.HorizontalAlignment;
@ -54,7 +55,7 @@ public class ComponentRoseActor extends AbstractTextualComponent {
public ComponentRoseActor(SymbolContext biColor, FontConfiguration font, Display stringsToDisplay, boolean head, public ComponentRoseActor(SymbolContext biColor, FontConfiguration font, Display stringsToDisplay, boolean head,
ISkinSimple spriteContainer, UFont fontForStereotype, HtmlColor htmlColorForStereotype) { ISkinSimple spriteContainer, UFont fontForStereotype, HtmlColor htmlColorForStereotype) {
super(stringsToDisplay, font, HorizontalAlignment.CENTER, 3, 3, 0, spriteContainer, 0, false, super(LineBreakStrategy.NONE, stringsToDisplay, font, HorizontalAlignment.CENTER, 3, 3, 0, spriteContainer, false,
fontForStereotype, htmlColorForStereotype); fontForStereotype, htmlColorForStereotype);
this.head = head; this.head = head;
this.stickman = new StickMan(biColor); this.stickman = new StickMan(biColor);

View File

@ -34,6 +34,7 @@ import java.awt.geom.Dimension2D;
import java.awt.geom.Point2D; import java.awt.geom.Point2D;
import net.sourceforge.plantuml.ISkinSimple; import net.sourceforge.plantuml.ISkinSimple;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.FontConfiguration;
import net.sourceforge.plantuml.graphic.HorizontalAlignment; import net.sourceforge.plantuml.graphic.HorizontalAlignment;
@ -62,7 +63,7 @@ public class ComponentRoseArrow extends AbstractComponentRoseArrow {
public ComponentRoseArrow(HtmlColor foregroundColor, FontConfiguration font, Display stringsToDisplay, public ComponentRoseArrow(HtmlColor foregroundColor, FontConfiguration font, Display stringsToDisplay,
ArrowConfiguration arrowConfiguration, HorizontalAlignment messagePosition, ISkinSimple spriteContainer, ArrowConfiguration arrowConfiguration, HorizontalAlignment messagePosition, ISkinSimple spriteContainer,
HorizontalAlignment textHorizontalAlignment, double maxMessageSize, boolean niceArrow) { HorizontalAlignment textHorizontalAlignment, LineBreakStrategy maxMessageSize, boolean niceArrow) {
super(foregroundColor, font, stringsToDisplay, arrowConfiguration, spriteContainer, textHorizontalAlignment, super(foregroundColor, font, stringsToDisplay, arrowConfiguration, spriteContainer, textHorizontalAlignment,
maxMessageSize); maxMessageSize);
this.messagePosition = messagePosition; this.messagePosition = messagePosition;

View File

@ -33,6 +33,7 @@ package net.sourceforge.plantuml.skin.rose;
import java.awt.geom.Dimension2D; import java.awt.geom.Dimension2D;
import net.sourceforge.plantuml.ISkinSimple; import net.sourceforge.plantuml.ISkinSimple;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.FontConfiguration;
import net.sourceforge.plantuml.graphic.HorizontalAlignment; import net.sourceforge.plantuml.graphic.HorizontalAlignment;
@ -54,7 +55,7 @@ public class ComponentRoseBoundary extends AbstractTextualComponent {
public ComponentRoseBoundary(SymbolContext biColor, FontConfiguration font, Display stringsToDisplay, boolean head, public ComponentRoseBoundary(SymbolContext biColor, FontConfiguration font, Display stringsToDisplay, boolean head,
ISkinSimple spriteContainer, UFont fontForStereotype, HtmlColor htmlColorForStereotype) { ISkinSimple spriteContainer, UFont fontForStereotype, HtmlColor htmlColorForStereotype) {
super(stringsToDisplay, font, HorizontalAlignment.CENTER, 3, 3, 0, spriteContainer, 0, false, super(LineBreakStrategy.NONE, stringsToDisplay, font, HorizontalAlignment.CENTER, 3, 3, 0, spriteContainer, false,
fontForStereotype, htmlColorForStereotype); fontForStereotype, htmlColorForStereotype);
this.head = head; this.head = head;
this.stickman = new Boundary(biColor); this.stickman = new Boundary(biColor);

View File

@ -33,6 +33,7 @@ package net.sourceforge.plantuml.skin.rose;
import java.awt.geom.Dimension2D; import java.awt.geom.Dimension2D;
import net.sourceforge.plantuml.ISkinSimple; import net.sourceforge.plantuml.ISkinSimple;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.FontConfiguration;
import net.sourceforge.plantuml.graphic.HorizontalAlignment; import net.sourceforge.plantuml.graphic.HorizontalAlignment;
@ -54,7 +55,7 @@ public class ComponentRoseControl extends AbstractTextualComponent {
public ComponentRoseControl(SymbolContext biColor, FontConfiguration font, Display stringsToDisplay, boolean head, public ComponentRoseControl(SymbolContext biColor, FontConfiguration font, Display stringsToDisplay, boolean head,
ISkinSimple spriteContainer, UFont fontForStereotype, HtmlColor htmlColorForStereotype) { ISkinSimple spriteContainer, UFont fontForStereotype, HtmlColor htmlColorForStereotype) {
super(stringsToDisplay, font, HorizontalAlignment.CENTER, 3, 3, 0, spriteContainer, 0, false, super(LineBreakStrategy.NONE, stringsToDisplay, font, HorizontalAlignment.CENTER, 3, 3, 0, spriteContainer, false,
fontForStereotype, htmlColorForStereotype); fontForStereotype, htmlColorForStereotype);
this.head = head; this.head = head;
this.stickman = new Control(biColor); this.stickman = new Control(biColor);

View File

@ -33,6 +33,7 @@ package net.sourceforge.plantuml.skin.rose;
import java.awt.geom.Dimension2D; import java.awt.geom.Dimension2D;
import net.sourceforge.plantuml.ISkinSimple; import net.sourceforge.plantuml.ISkinSimple;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.FontConfiguration;
import net.sourceforge.plantuml.graphic.HorizontalAlignment; import net.sourceforge.plantuml.graphic.HorizontalAlignment;
@ -56,7 +57,7 @@ public class ComponentRoseDatabase extends AbstractTextualComponent {
public ComponentRoseDatabase(SymbolContext biColor, FontConfiguration font, Display stringsToDisplay, boolean head, public ComponentRoseDatabase(SymbolContext biColor, FontConfiguration font, Display stringsToDisplay, boolean head,
ISkinSimple spriteContainer, UFont fontForStereotype, HtmlColor htmlColorForStereotype) { ISkinSimple spriteContainer, UFont fontForStereotype, HtmlColor htmlColorForStereotype) {
super(stringsToDisplay, font, HorizontalAlignment.CENTER, 3, 3, 0, spriteContainer, 0, false, super(LineBreakStrategy.NONE, stringsToDisplay, font, HorizontalAlignment.CENTER, 3, 3, 0, spriteContainer, false,
fontForStereotype, htmlColorForStereotype); fontForStereotype, htmlColorForStereotype);
this.head = head; this.head = head;

View File

@ -33,6 +33,7 @@ package net.sourceforge.plantuml.skin.rose;
import java.awt.geom.Dimension2D; import java.awt.geom.Dimension2D;
import net.sourceforge.plantuml.ISkinSimple; import net.sourceforge.plantuml.ISkinSimple;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.FontConfiguration;
import net.sourceforge.plantuml.graphic.HorizontalAlignment; import net.sourceforge.plantuml.graphic.HorizontalAlignment;
@ -46,8 +47,8 @@ import net.sourceforge.plantuml.ugraphic.UTranslate;
public class ComponentRoseDelayText extends AbstractTextualComponent { public class ComponentRoseDelayText extends AbstractTextualComponent {
public ComponentRoseDelayText(FontConfiguration font, Display stringsToDisplay, ISkinSimple spriteContainer) { public ComponentRoseDelayText(FontConfiguration font, Display stringsToDisplay, ISkinSimple spriteContainer) {
super(stringsToDisplay, font, HorizontalAlignment.CENTER, 0, 0, 4, super(LineBreakStrategy.NONE, stringsToDisplay, font, HorizontalAlignment.CENTER, 0, 0,
spriteContainer, 0, false, null, null); 4, spriteContainer, false, null, null);
} }
@Override @Override

View File

@ -33,6 +33,7 @@ package net.sourceforge.plantuml.skin.rose;
import java.awt.geom.Dimension2D; import java.awt.geom.Dimension2D;
import net.sourceforge.plantuml.ISkinSimple; import net.sourceforge.plantuml.ISkinSimple;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.FontConfiguration;
import net.sourceforge.plantuml.graphic.HorizontalAlignment; import net.sourceforge.plantuml.graphic.HorizontalAlignment;
@ -60,7 +61,7 @@ public class ComponentRoseDivider extends AbstractTextualComponent {
public ComponentRoseDivider(FontConfiguration font, HtmlColor background, Display stringsToDisplay, public ComponentRoseDivider(FontConfiguration font, HtmlColor background, Display stringsToDisplay,
ISkinSimple spriteContainer, boolean withShadow, UStroke stroke, HtmlColor borderColor) { ISkinSimple spriteContainer, boolean withShadow, UStroke stroke, HtmlColor borderColor) {
super(stringsToDisplay, font, HorizontalAlignment.CENTER, 4, 4, 4, spriteContainer, 0, false, null, null); super(LineBreakStrategy.NONE, stringsToDisplay, font, HorizontalAlignment.CENTER, 4, 4, 4, spriteContainer, false, null, null);
this.background = background; this.background = background;
this.borderColor = borderColor; this.borderColor = borderColor;
this.empty = stringsToDisplay.get(0).length() == 0; this.empty = stringsToDisplay.get(0).length() == 0;

View File

@ -33,6 +33,7 @@ package net.sourceforge.plantuml.skin.rose;
import java.awt.geom.Dimension2D; import java.awt.geom.Dimension2D;
import net.sourceforge.plantuml.ISkinSimple; import net.sourceforge.plantuml.ISkinSimple;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.FontConfiguration;
import net.sourceforge.plantuml.graphic.HorizontalAlignment; import net.sourceforge.plantuml.graphic.HorizontalAlignment;
@ -49,7 +50,7 @@ public class ComponentRoseEnglober extends AbstractTextualComponent {
private final SymbolContext symbolContext; private final SymbolContext symbolContext;
public ComponentRoseEnglober(SymbolContext symbolContext, Display strings, FontConfiguration font, ISkinSimple spriteContainer) { public ComponentRoseEnglober(SymbolContext symbolContext, Display strings, FontConfiguration font, ISkinSimple spriteContainer) {
super(strings, font, HorizontalAlignment.CENTER, 3, 3, 1, spriteContainer, 0, false, null, null); super(LineBreakStrategy.NONE, strings, font, HorizontalAlignment.CENTER, 3, 3, 1, spriteContainer, false, null, null);
this.symbolContext = symbolContext; this.symbolContext = symbolContext;
} }

View File

@ -33,6 +33,7 @@ package net.sourceforge.plantuml.skin.rose;
import java.awt.geom.Dimension2D; import java.awt.geom.Dimension2D;
import net.sourceforge.plantuml.ISkinSimple; import net.sourceforge.plantuml.ISkinSimple;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.FontConfiguration;
import net.sourceforge.plantuml.graphic.HorizontalAlignment; import net.sourceforge.plantuml.graphic.HorizontalAlignment;
@ -54,7 +55,7 @@ public class ComponentRoseEntity extends AbstractTextualComponent {
public ComponentRoseEntity(SymbolContext biColor, FontConfiguration font, Display stringsToDisplay, boolean head, public ComponentRoseEntity(SymbolContext biColor, FontConfiguration font, Display stringsToDisplay, boolean head,
ISkinSimple spriteContainer, UFont fontForStereotype, HtmlColor htmlColorForStereotype) { ISkinSimple spriteContainer, UFont fontForStereotype, HtmlColor htmlColorForStereotype) {
super(stringsToDisplay, font, HorizontalAlignment.CENTER, 3, 3, 0, spriteContainer, 0, false, super(LineBreakStrategy.NONE, stringsToDisplay, font, HorizontalAlignment.CENTER, 3, 3, 0, spriteContainer, false,
fontForStereotype, htmlColorForStereotype); fontForStereotype, htmlColorForStereotype);
this.head = head; this.head = head;
this.stickman = new EntityDomain(biColor); this.stickman = new EntityDomain(biColor);

View File

@ -33,6 +33,7 @@ package net.sourceforge.plantuml.skin.rose;
import java.awt.geom.Dimension2D; import java.awt.geom.Dimension2D;
import net.sourceforge.plantuml.ISkinSimple; import net.sourceforge.plantuml.ISkinSimple;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.FontConfiguration;
import net.sourceforge.plantuml.graphic.HorizontalAlignment; import net.sourceforge.plantuml.graphic.HorizontalAlignment;
import net.sourceforge.plantuml.graphic.HtmlColor; import net.sourceforge.plantuml.graphic.HtmlColor;
@ -57,8 +58,8 @@ public class ComponentRoseGroupingElse extends AbstractTextualComponent {
public ComponentRoseGroupingElse(HtmlColor groupBorder, FontConfiguration smallFont, CharSequence comment, public ComponentRoseGroupingElse(HtmlColor groupBorder, FontConfiguration smallFont, CharSequence comment,
ISkinSimple spriteContainer, HtmlColor backgroundColor) { ISkinSimple spriteContainer, HtmlColor backgroundColor) {
super(comment == null ? null : "[" + comment + "]", smallFont, HorizontalAlignment.LEFT, 5, 5, 1, super(LineBreakStrategy.NONE, comment == null ? null : "[" + comment + "]", smallFont, HorizontalAlignment.LEFT, 5, 5,
spriteContainer, 0, null, null); 1, spriteContainer, null, null);
this.groupBorder = groupBorder; this.groupBorder = groupBorder;
this.backgroundColor = backgroundColor; this.backgroundColor = backgroundColor;
// this.stroke = stroke; // this.stroke = stroke;

View File

@ -33,6 +33,7 @@ package net.sourceforge.plantuml.skin.rose;
import java.awt.geom.Dimension2D; import java.awt.geom.Dimension2D;
import net.sourceforge.plantuml.ISkinSimple; import net.sourceforge.plantuml.ISkinSimple;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.FontConfiguration;
import net.sourceforge.plantuml.graphic.HorizontalAlignment; import net.sourceforge.plantuml.graphic.HorizontalAlignment;
@ -62,7 +63,7 @@ public class ComponentRoseGroupingHeader extends AbstractTextualComponent {
public ComponentRoseGroupingHeader(HtmlColor background, SymbolContext symbolContext, FontConfiguration bigFont, public ComponentRoseGroupingHeader(HtmlColor background, SymbolContext symbolContext, FontConfiguration bigFont,
FontConfiguration smallFont2, Display strings, ISkinSimple spriteContainer) { FontConfiguration smallFont2, Display strings, ISkinSimple spriteContainer) {
super(strings.get(0), bigFont, HorizontalAlignment.LEFT, 15, 30, 1, spriteContainer, 0, null, null); super(LineBreakStrategy.NONE, strings.get(0), bigFont, HorizontalAlignment.LEFT, 15, 30, 1, spriteContainer, null, null);
this.symbolContext = symbolContext; this.symbolContext = symbolContext;
this.background = background; this.background = background;
if (strings.size() == 1 || strings.get(1) == null) { if (strings.size() == 1 || strings.get(1) == null) {

View File

@ -31,6 +31,7 @@
package net.sourceforge.plantuml.skin.rose; package net.sourceforge.plantuml.skin.rose;
import net.sourceforge.plantuml.ISkinSimple; import net.sourceforge.plantuml.ISkinSimple;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.creole.Stencil; import net.sourceforge.plantuml.creole.Stencil;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.FontConfiguration;
@ -55,7 +56,7 @@ final public class ComponentRoseNote extends AbstractTextualComponent implements
public ComponentRoseNote(SymbolContext symbolContext, FontConfiguration font, Display strings, double paddingX, double paddingY, public ComponentRoseNote(SymbolContext symbolContext, FontConfiguration font, Display strings, double paddingX, double paddingY,
ISkinSimple spriteContainer) { ISkinSimple spriteContainer) {
super(strings, font, HorizontalAlignment.LEFT, 6, 15, 5, spriteContainer, 0, true, null, null); super(LineBreakStrategy.NONE, strings, font, HorizontalAlignment.LEFT, 6, 15, 5, spriteContainer, true, null, null);
this.paddingX = paddingX; this.paddingX = paddingX;
this.paddingY = paddingY; this.paddingY = paddingY;
this.symbolContext = symbolContext; this.symbolContext = symbolContext;

View File

@ -31,6 +31,7 @@
package net.sourceforge.plantuml.skin.rose; package net.sourceforge.plantuml.skin.rose;
import net.sourceforge.plantuml.ISkinSimple; import net.sourceforge.plantuml.ISkinSimple;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.FontConfiguration;
import net.sourceforge.plantuml.graphic.HorizontalAlignment; import net.sourceforge.plantuml.graphic.HorizontalAlignment;
@ -49,7 +50,7 @@ final public class ComponentRoseNoteBox extends AbstractTextualComponent {
public ComponentRoseNoteBox(SymbolContext symbolContext, FontConfiguration font, Display strings, public ComponentRoseNoteBox(SymbolContext symbolContext, FontConfiguration font, Display strings,
ISkinSimple spriteContainer) { ISkinSimple spriteContainer) {
super(strings, font, HorizontalAlignment.LEFT, 4, 4, 4, spriteContainer, 0, false, null, null); super(LineBreakStrategy.NONE, strings, font, HorizontalAlignment.LEFT, 4, 4, 4, spriteContainer, false, null, null);
this.symbolContext = symbolContext; this.symbolContext = symbolContext;
} }

View File

@ -31,6 +31,7 @@
package net.sourceforge.plantuml.skin.rose; package net.sourceforge.plantuml.skin.rose;
import net.sourceforge.plantuml.ISkinSimple; import net.sourceforge.plantuml.ISkinSimple;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.FontConfiguration;
import net.sourceforge.plantuml.graphic.HorizontalAlignment; import net.sourceforge.plantuml.graphic.HorizontalAlignment;
@ -51,7 +52,7 @@ final public class ComponentRoseNoteHexagonal extends AbstractTextualComponent {
public ComponentRoseNoteHexagonal(SymbolContext symbolContext, FontConfiguration font, Display strings, public ComponentRoseNoteHexagonal(SymbolContext symbolContext, FontConfiguration font, Display strings,
ISkinSimple spriteContainer) { ISkinSimple spriteContainer) {
super(strings, font, HorizontalAlignment.LEFT, 12, 12, 4, spriteContainer, 0, false, null, null); super(LineBreakStrategy.NONE, strings, font, HorizontalAlignment.LEFT, 12, 12, 4, spriteContainer, false, null, null);
this.symbolContext = symbolContext; this.symbolContext = symbolContext;
} }

View File

@ -31,6 +31,7 @@
package net.sourceforge.plantuml.skin.rose; package net.sourceforge.plantuml.skin.rose;
import net.sourceforge.plantuml.ISkinSimple; import net.sourceforge.plantuml.ISkinSimple;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.FontConfiguration;
import net.sourceforge.plantuml.graphic.HorizontalAlignment; import net.sourceforge.plantuml.graphic.HorizontalAlignment;
@ -57,12 +58,14 @@ public class ComponentRoseParticipant extends AbstractTextualComponent {
private final UStroke stroke; private final UStroke stroke;
private final double minWidth; private final double minWidth;
private final boolean collections; private final boolean collections;
private final double padding;
public ComponentRoseParticipant(SymbolContext biColor, FontConfiguration font, Display stringsToDisplay, public ComponentRoseParticipant(SymbolContext biColor, FontConfiguration font, Display stringsToDisplay,
ISkinSimple spriteContainer, double roundCorner, UFont fontForStereotype, HtmlColor htmlColorForStereotype, ISkinSimple spriteContainer, double roundCorner, UFont fontForStereotype, HtmlColor htmlColorForStereotype,
double minWidth, boolean collections) { double minWidth, boolean collections, double padding) {
super(stringsToDisplay, font, HorizontalAlignment.CENTER, 7, 7, 7, spriteContainer, 0, false, super(LineBreakStrategy.NONE, stringsToDisplay, font, HorizontalAlignment.CENTER, 7, 7, 7, spriteContainer, false,
fontForStereotype, htmlColorForStereotype); fontForStereotype, htmlColorForStereotype);
this.padding = padding;
this.minWidth = minWidth; this.minWidth = minWidth;
this.collections = collections; this.collections = collections;
this.back = biColor.getBackColor(); this.back = biColor.getBackColor();
@ -75,6 +78,7 @@ public class ComponentRoseParticipant extends AbstractTextualComponent {
@Override @Override
protected void drawInternalU(UGraphic ug, Area area) { protected void drawInternalU(UGraphic ug, Area area) {
final StringBounder stringBounder = ug.getStringBounder(); final StringBounder stringBounder = ug.getStringBounder();
ug = ug.apply(new UTranslate(padding, 0));
ug = ug.apply(new UChangeBackColor(back)).apply(new UChangeColor(foregroundColor)); ug = ug.apply(new UChangeBackColor(back)).apply(new UChangeColor(foregroundColor));
ug = ug.apply(stroke); ug = ug.apply(stroke);
final URectangle rect = new URectangle(getTextWidth(stringBounder), getTextHeight(stringBounder), roundCorner, final URectangle rect = new URectangle(getTextWidth(stringBounder), getTextHeight(stringBounder), roundCorner,
@ -104,7 +108,7 @@ public class ComponentRoseParticipant extends AbstractTextualComponent {
@Override @Override
public double getPreferredWidth(StringBounder stringBounder) { public double getPreferredWidth(StringBounder stringBounder) {
return getTextWidth(stringBounder) + deltaShadow + getDeltaCollection(); return getTextWidth(stringBounder) + deltaShadow + getDeltaCollection() + 2 * padding;
} }
@Override @Override

View File

@ -33,6 +33,7 @@ package net.sourceforge.plantuml.skin.rose;
import java.awt.geom.Dimension2D; import java.awt.geom.Dimension2D;
import net.sourceforge.plantuml.ISkinSimple; import net.sourceforge.plantuml.ISkinSimple;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.FontConfiguration;
import net.sourceforge.plantuml.graphic.HorizontalAlignment; import net.sourceforge.plantuml.graphic.HorizontalAlignment;
@ -60,8 +61,8 @@ public class ComponentRoseReference extends AbstractTextualComponent {
public ComponentRoseReference(FontConfiguration font, SymbolContext symbolContext, FontConfiguration header, public ComponentRoseReference(FontConfiguration font, SymbolContext symbolContext, FontConfiguration header,
Display stringsToDisplay, HorizontalAlignment position, ISkinSimple spriteContainer, HtmlColor background) { Display stringsToDisplay, HorizontalAlignment position, ISkinSimple spriteContainer, HtmlColor background) {
super(stringsToDisplay.subList(1, stringsToDisplay.size()), font, HorizontalAlignment.LEFT, 4, 4, 4, super(LineBreakStrategy.NONE, stringsToDisplay.subList(1, stringsToDisplay.size()), font, HorizontalAlignment.LEFT, 4, 4,
spriteContainer, 0, false, null, null); 4, spriteContainer, false, null, null);
this.position = position; this.position = position;
this.symbolContext = symbolContext; this.symbolContext = symbolContext;
this.background = background; this.background = background;

View File

@ -34,6 +34,7 @@ import java.awt.geom.Dimension2D;
import java.awt.geom.Point2D; import java.awt.geom.Point2D;
import net.sourceforge.plantuml.ISkinSimple; import net.sourceforge.plantuml.ISkinSimple;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.FontConfiguration;
import net.sourceforge.plantuml.graphic.HorizontalAlignment; import net.sourceforge.plantuml.graphic.HorizontalAlignment;
@ -59,7 +60,7 @@ public class ComponentRoseSelfArrow extends AbstractComponentRoseArrow {
private final boolean niceArrow; private final boolean niceArrow;
public ComponentRoseSelfArrow(HtmlColor foregroundColor, FontConfiguration font, Display stringsToDisplay, public ComponentRoseSelfArrow(HtmlColor foregroundColor, FontConfiguration font, Display stringsToDisplay,
ArrowConfiguration arrowConfiguration, ISkinSimple spriteContainer, double maxMessageSize, boolean niceArrow) { ArrowConfiguration arrowConfiguration, ISkinSimple spriteContainer, LineBreakStrategy maxMessageSize, boolean niceArrow) {
super(foregroundColor, font, stringsToDisplay, arrowConfiguration, spriteContainer, HorizontalAlignment.LEFT, super(foregroundColor, font, stringsToDisplay, arrowConfiguration, spriteContainer, HorizontalAlignment.LEFT,
maxMessageSize); maxMessageSize);
this.niceArrow = niceArrow; this.niceArrow = niceArrow;

View File

@ -35,6 +35,7 @@ import net.sourceforge.plantuml.ColorParam;
import net.sourceforge.plantuml.FontParam; import net.sourceforge.plantuml.FontParam;
import net.sourceforge.plantuml.ISkinParam; import net.sourceforge.plantuml.ISkinParam;
import net.sourceforge.plantuml.LineParam; import net.sourceforge.plantuml.LineParam;
import net.sourceforge.plantuml.PaddingParam;
import net.sourceforge.plantuml.SkinParamUtils; import net.sourceforge.plantuml.SkinParamUtils;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.cucadiagram.Stereotype; import net.sourceforge.plantuml.cucadiagram.Stereotype;
@ -100,25 +101,26 @@ public class Rose implements Skin {
config, messageHorizontalAlignment, param, textHorizontalAlignment, param.maxMessageSize(), config, messageHorizontalAlignment, param, textHorizontalAlignment, param.maxMessageSize(),
param.strictUmlStyle() == false); param.strictUmlStyle() == false);
} }
final double padding = param.getPadding(PaddingParam.PARTICIPANT);
if (type == ComponentType.PARTICIPANT_HEAD) { if (type == ComponentType.PARTICIPANT_HEAD) {
return new ComponentRoseParticipant(getSymbolContext(param, ColorParam.participantBorder), getUFont2(param, return new ComponentRoseParticipant(getSymbolContext(param, ColorParam.participantBorder), getUFont2(param,
FontParam.PARTICIPANT), stringsToDisplay, param, param.getRoundCorner("", null), newFontForStereotype, FontParam.PARTICIPANT), stringsToDisplay, param, param.getRoundCorner("", null), newFontForStereotype,
getFontColor(param, FontParam.SEQUENCE_STEREOTYPE), param.minClassWidth(), false); getFontColor(param, FontParam.SEQUENCE_STEREOTYPE), param.minClassWidth(), false, padding);
} }
if (type == ComponentType.PARTICIPANT_TAIL) { if (type == ComponentType.PARTICIPANT_TAIL) {
return new ComponentRoseParticipant(getSymbolContext(param, ColorParam.participantBorder), getUFont2(param, return new ComponentRoseParticipant(getSymbolContext(param, ColorParam.participantBorder), getUFont2(param,
FontParam.PARTICIPANT), stringsToDisplay, param, param.getRoundCorner("", null), newFontForStereotype, FontParam.PARTICIPANT), stringsToDisplay, param, param.getRoundCorner("", null), newFontForStereotype,
getFontColor(param, FontParam.SEQUENCE_STEREOTYPE), param.minClassWidth(), false); getFontColor(param, FontParam.SEQUENCE_STEREOTYPE), param.minClassWidth(), false, padding);
} }
if (type == ComponentType.COLLECTIONS_HEAD) { if (type == ComponentType.COLLECTIONS_HEAD) {
return new ComponentRoseParticipant(getSymbolContext(param, ColorParam.participantBorder), getUFont2(param, return new ComponentRoseParticipant(getSymbolContext(param, ColorParam.participantBorder), getUFont2(param,
FontParam.PARTICIPANT), stringsToDisplay, param, param.getRoundCorner("", null), newFontForStereotype, FontParam.PARTICIPANT), stringsToDisplay, param, param.getRoundCorner("", null), newFontForStereotype,
getFontColor(param, FontParam.SEQUENCE_STEREOTYPE), param.minClassWidth(), true); getFontColor(param, FontParam.SEQUENCE_STEREOTYPE), param.minClassWidth(), true, padding);
} }
if (type == ComponentType.COLLECTIONS_TAIL) { if (type == ComponentType.COLLECTIONS_TAIL) {
return new ComponentRoseParticipant(getSymbolContext(param, ColorParam.participantBorder), getUFont2(param, return new ComponentRoseParticipant(getSymbolContext(param, ColorParam.participantBorder), getUFont2(param,
FontParam.PARTICIPANT), stringsToDisplay, param, param.getRoundCorner("", null), newFontForStereotype, FontParam.PARTICIPANT), stringsToDisplay, param, param.getRoundCorner("", null), newFontForStereotype,
getFontColor(param, FontParam.SEQUENCE_STEREOTYPE), param.minClassWidth(), true); getFontColor(param, FontParam.SEQUENCE_STEREOTYPE), param.minClassWidth(), true, padding);
} }
if (type == ComponentType.PARTICIPANT_LINE) { if (type == ComponentType.PARTICIPANT_LINE) {
final HtmlColor borderColor = getHtmlColor(param, ColorParam.sequenceLifeLineBorder); final HtmlColor borderColor = getHtmlColor(param, ColorParam.sequenceLifeLineBorder);

View File

@ -249,7 +249,7 @@ public class Line implements Moveable, Hideable {
final double marginLabel = startUid.equalsId(endUid) ? 6 : 1; final double marginLabel = startUid.equalsId(endUid) ? 6 : 1;
final TextBlock label = TextBlockUtils.withMargin( final TextBlock label = TextBlockUtils.withMargin(
link.getLabel().create(labelFont, skinParam.getDefaultTextAlignment(HorizontalAlignment.CENTER), link.getLabel().create(labelFont, skinParam.getDefaultTextAlignment(HorizontalAlignment.CENTER),
skinParam), marginLabel, marginLabel); skinParam, skinParam.maxMessageSize()), marginLabel, marginLabel);
if (getLinkArrow() == LinkArrow.NONE) { if (getLinkArrow() == LinkArrow.NONE) {
labelOnly = label; labelOnly = label;
} else { } else {

View File

@ -37,6 +37,7 @@ import net.sourceforge.plantuml.UmlDiagramType;
import net.sourceforge.plantuml.cucadiagram.dot.DotData; import net.sourceforge.plantuml.cucadiagram.dot.DotData;
import net.sourceforge.plantuml.graphic.AbstractTextBlock; import net.sourceforge.plantuml.graphic.AbstractTextBlock;
import net.sourceforge.plantuml.graphic.HtmlColor; import net.sourceforge.plantuml.graphic.HtmlColor;
import net.sourceforge.plantuml.graphic.HtmlColorUtils;
import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.StringBounder;
import net.sourceforge.plantuml.posimo.Moveable; import net.sourceforge.plantuml.posimo.Moveable;
import net.sourceforge.plantuml.skin.rose.Rose; import net.sourceforge.plantuml.skin.rose.Rose;
@ -66,8 +67,9 @@ public final class SvekResult extends AbstractTextBlock implements IEntityImage,
cluster.drawU(ug, new UStroke(1.5), dotData.getUmlDiagramType(), dotData.getSkinParam()); cluster.drawU(ug, new UStroke(1.5), dotData.getUmlDiagramType(), dotData.getSkinParam());
} }
final HtmlColor color = rose.getHtmlColor(dotData.getSkinParam(), getArrowColorParam(), null); final HtmlColor color = HtmlColorUtils.noGradient(rose.getHtmlColor(dotData.getSkinParam(),
getArrowColorParam(), null));
for (Shape shape : dotStringFactory.getBibliotekon().allShapes()) { for (Shape shape : dotStringFactory.getBibliotekon().allShapes()) {
final double minX = shape.getMinX(); final double minX = shape.getMinX();
final double minY = shape.getMinY(); final double minY = shape.getMinY();

View File

@ -37,6 +37,7 @@ import java.util.Map;
import net.sourceforge.plantuml.ColorParam; import net.sourceforge.plantuml.ColorParam;
import net.sourceforge.plantuml.Dimension2DDouble; import net.sourceforge.plantuml.Dimension2DDouble;
import net.sourceforge.plantuml.Direction;
import net.sourceforge.plantuml.FontParam; import net.sourceforge.plantuml.FontParam;
import net.sourceforge.plantuml.ISkinParam; import net.sourceforge.plantuml.ISkinParam;
import net.sourceforge.plantuml.command.Position; import net.sourceforge.plantuml.command.Position;
@ -122,6 +123,7 @@ public class EntityImageTips extends AbstractEntityImage {
final Point2D positionOther = shapeOther.getPosition(); final Point2D positionOther = shapeOther.getPosition();
bibliotekon.getShape(getEntity()); bibliotekon.getShape(getEntity());
final Position position = getPosition(); final Position position = getPosition();
Direction direction = position.reverseDirection();
double height = 0; double height = 0;
for (Map.Entry<String, Display> ent : getEntity().getTips().entrySet()) { for (Map.Entry<String, Display> ent : getEntity().getTips().entrySet()) {
final Display display = ent.getValue(); final Display display = ent.getValue();
@ -133,14 +135,17 @@ public class EntityImageTips extends AbstractEntityImage {
final Dimension2D dim = opale.calculateDimension(stringBounder); final Dimension2D dim = opale.calculateDimension(stringBounder);
final Point2D pp1 = new Point2D.Double(0, dim.getHeight() / 2); final Point2D pp1 = new Point2D.Double(0, dim.getHeight() / 2);
double x = positionOther.getX() - positionMe.getX(); double x = positionOther.getX() - positionMe.getX();
if (position == Position.RIGHT) { if (direction == Direction.RIGHT && x < 0) {
direction = direction.getInv();
}
if (direction == Direction.LEFT) {
x += memberPosition.getMaxX(); x += memberPosition.getMaxX();
} else { } else {
x += 4; x += 4;
} }
final double y = positionOther.getY() - positionMe.getY() - height + memberPosition.getCenterY(); final double y = positionOther.getY() - positionMe.getY() - height + memberPosition.getCenterY();
final Point2D pp2 = new Point2D.Double(x, y); final Point2D pp2 = new Point2D.Double(x, y);
opale.setOpale(position.reverseDirection(), pp1, pp2); opale.setOpale(direction, pp1, pp2);
opale.drawU(ug); opale.drawU(ug);
ug = ug.apply(new UTranslate(0, dim.getHeight() + ySpacing)); ug = ug.apply(new UTranslate(0, dim.getHeight() + ySpacing));
height += dim.getHeight(); height += dim.getHeight();

View File

@ -288,6 +288,62 @@ public class TikzGraphics {
cmd.add(sb.toString()); cmd.add(sb.toString());
} }
private void round(double r, double[] points) {
final StringBuilder sb = new StringBuilder("\\draw[");
if (color != null) {
sb.append("color=" + getColorName(color) + ",");
}
if (fillcolor != null) {
sb.append("fill=" + getColorName(fillcolor) + ",");
}
sb.append("line width=" + thickness + "pt]");
sb.append(" ");
int i = 0;
sb.append(couple(points[i++], points[i++]));
sb.append(" arc (180:270:" + format(r) + "pt) -- ");
sb.append(couple(points[i++], points[i++]));
sb.append(" -- ");
sb.append(couple(points[i++], points[i++]));
sb.append(" arc (270:360:" + format(r) + "pt) -- ");
sb.append(couple(points[i++], points[i++]));
sb.append(" -- ");
sb.append(couple(points[i++], points[i++]));
sb.append(" arc (0:90:" + format(r) + "pt) -- ");
sb.append(couple(points[i++], points[i++]));
sb.append(" -- ");
sb.append(couple(points[i++], points[i++]));
sb.append(" arc (90:180:" + format(r) + "pt) -- ");
sb.append(couple(points[i++], points[i++]));
sb.append(" -- ");
sb.append("cycle;");
cmd.add(sb.toString());
}
public void rectangleRound(double x, double y, double width, double height, double r) {
double[] points = new double[8 * 2];
points[0] = x;
points[1] = y + r;
points[2] = x + r;
points[3] = y;
points[4] = x + width - r;
points[5] = y;
points[6] = x + width;
points[7] = y + r;
points[8] = x + width;
points[9] = y + height - r;
points[10] = x + width - r;
points[11] = y + height;
points[12] = x + r;
points[13] = y + height;
points[14] = x;
points[15] = y + height - r;
round(r, points);
}
public void upath(double x, double y, UPath path) { public void upath(double x, double y, UPath path) {
final StringBuilder sb = new StringBuilder("\\draw[color=" + getColorName(color) + ",line width=" + thickness final StringBuilder sb = new StringBuilder("\\draw[color=" + getColorName(color) + ",line width=" + thickness
+ "pt] "); + "pt] ");

View File

@ -189,11 +189,11 @@ public class Histogram implements TimeDrawing {
final UTranslate deltaY = new UTranslate(0, getFullDeltaY()); final UTranslate deltaY = new UTranslate(0, getFullDeltaY());
final UTranslate pos = new UTranslate(pt).compose(deltaY); final UTranslate pos = new UTranslate(pt).compose(deltaY);
ug = ug.apply(pos); ug = ug.apply(pos);
final SymbolContext context = getContext(); // final SymbolContext context = getContext();
final double height = -pt.getY(); // final double height = -pt.getY();
if (height > 0) { // if (height > 0) {
context.withForeColor(context.getBackColor()).apply(ug).draw(new URectangle(len, height)); // context.withForeColor(context.getBackColor()).apply(ug).draw(new URectangle(len, height));
} // }
ug.draw(new ULine(len, 0)); ug.draw(new ULine(len, 0));
} }

View File

@ -35,6 +35,7 @@ import net.sourceforge.plantuml.ugraphic.UDriver;
import net.sourceforge.plantuml.ugraphic.UParam; import net.sourceforge.plantuml.ugraphic.UParam;
import net.sourceforge.plantuml.ugraphic.URectangle; import net.sourceforge.plantuml.ugraphic.URectangle;
import net.sourceforge.plantuml.ugraphic.UShape; import net.sourceforge.plantuml.ugraphic.UShape;
import net.sourceforge.plantuml.utils.MathUtils;
public class DriverRectangleTikz implements UDriver<TikzGraphics> { public class DriverRectangleTikz implements UDriver<TikzGraphics> {
@ -43,11 +44,16 @@ public class DriverRectangleTikz implements UDriver<TikzGraphics> {
final double width = rect.getWidth(); final double width = rect.getWidth();
final double height = rect.getHeight(); final double height = rect.getHeight();
final double r = MathUtils.min(rect.getRx(), rect.getRy(), width / 2, height / 2);
tikz.setFillColor(mapper.getMappedColor(param.getBackcolor())); tikz.setFillColor(mapper.getMappedColor(param.getBackcolor()));
tikz.setStrokeColor(mapper.getMappedColor(param.getColor())); tikz.setStrokeColor(mapper.getMappedColor(param.getColor()));
tikz.setStrokeWidth(param.getStroke().getThickness(), param.getStroke().getDashTikz()); tikz.setStrokeWidth(param.getStroke().getThickness(), param.getStroke().getDashTikz());
tikz.rectangle(x, y, width, height); if (r == 0) {
tikz.rectangle(x, y, width, height);
} else {
tikz.rectangleRound(x, y, width, height, r);
}
} }
} }

View File

@ -48,6 +48,22 @@ public class MathUtils {
return max(max(a, b, c), max(d, e)); return max(max(a, b, c), max(d, e));
} }
public static double min(double a, double b) {
return Math.min(a, b);
}
public static double min(double a, double b, double c) {
return min(min(a, b), c);
}
public static double min(double a, double b, double c, double d) {
return min(min(a, b), min(c, d));
}
public static double min(double a, double b, double c, double d, double e) {
return min(min(a, b, c), min(d, e));
}
public static double limitation(double v, double min, double max) { public static double limitation(double v, double min, double max) {
if (min >= max) { if (min >= max) {
// assert false : "min="+min+" max="+max+" v="+v; // assert false : "min="+min+" max="+max+" v="+v;

View File

@ -80,7 +80,7 @@ public class PSystemVersion extends AbstractPSystem {
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
return null; return new BufferedImage(10, 10, BufferedImage.TYPE_INT_ARGB);
} }
public static BufferedImage getCharlieImage() { public static BufferedImage getCharlieImage() {
@ -92,7 +92,7 @@ public class PSystemVersion extends AbstractPSystem {
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
return null; return new BufferedImage(10, 10, BufferedImage.TYPE_INT_ARGB);
} }
public static BufferedImage getPlantumlSmallIcon() { public static BufferedImage getPlantumlSmallIcon() {
@ -104,7 +104,7 @@ public class PSystemVersion extends AbstractPSystem {
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
return null; return new BufferedImage(10, 10, BufferedImage.TYPE_INT_ARGB);
} }
private static BufferedImage transparentIcon; private static BufferedImage transparentIcon;
@ -115,7 +115,7 @@ public class PSystemVersion extends AbstractPSystem {
} }
final BufferedImage ico = getPlantumlSmallIcon(); final BufferedImage ico = getPlantumlSmallIcon();
if (ico == null) { if (ico == null) {
return null; return new BufferedImage(10, 10, BufferedImage.TYPE_INT_ARGB);
} }
transparentIcon = new BufferedImage(ico.getWidth(), ico.getHeight(), BufferedImage.TYPE_INT_ARGB_PRE); transparentIcon = new BufferedImage(ico.getWidth(), ico.getHeight(), BufferedImage.TYPE_INT_ARGB_PRE);
for (int i = 0; i < ico.getWidth(); i++) { for (int i = 0; i < ico.getWidth(); i++) {

View File

@ -36,7 +36,7 @@ import java.util.Date;
public class Version { public class Version {
public static int version() { public static int version() {
return 8056; return 8057;
} }
public static String versionString() { public static String versionString() {
@ -68,7 +68,7 @@ public class Version {
} }
public static long compileTime() { public static long compileTime() {
return 1487187608733L; return 1488106743921L;
} }
public static String compileTimeString() { public static String compileTimeString() {