1
0
mirror of https://github.com/octoleo/plantuml.git synced 2024-05-28 22:20:49 +00:00

version 1.2019.10

This commit is contained in:
Arnaud Roques 2019-09-14 20:12:04 +02:00
parent 0d43b32af2
commit 90372b993c
105 changed files with 1087 additions and 724 deletions

View File

@ -30,13 +30,12 @@
Script Author: Julien Eluard Script Author: Julien Eluard
--> -->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>net.sourceforge.plantuml</groupId> <groupId>net.sourceforge.plantuml</groupId>
<artifactId>plantuml</artifactId> <artifactId>plantuml</artifactId>
<version>1.2019.9-SNAPSHOT</version> <version>1.2019.11-SNAPSHOT</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>PlantUML</name> <name>PlantUML</name>
@ -125,6 +124,7 @@
<directory>${project.basedir}</directory> <directory>${project.basedir}</directory>
<includes> <includes>
<include>stdlib/**/*.repx</include> <include>stdlib/**/*.repx</include>
<include>skin/**/*.skin</include>
</includes> </includes>
</resource> </resource>
</resources> </resources>

View File

@ -21,8 +21,8 @@ title {
HorizontalAlignment center HorizontalAlignment center
FontSize 14 FontSize 14
FontStyle bold FontStyle bold
Padding 0 Padding 5
Margin 4 Margin 5
LineColor none LineColor none
BackGroundColor none BackGroundColor none
} }
@ -145,21 +145,26 @@ actor {
} }
boundary { boundary {
LineThickness 2.0
} }
control { control {
LineThickness 2.0
} }
entity { entity {
LineThickness 2.0
} }
queue { queue {
LineThickness 2.0
} }
database { database {
} }
collections { collections {
LineThickness 1.5
} }
swimlane { swimlane {

View File

@ -44,7 +44,7 @@ public class AParentFolderRegular implements AParentFolder {
public AParentFolderRegular(File dir) { public AParentFolderRegular(File dir) {
this.dir = dir; this.dir = dir;
Log.info("Creating AParentFolderRegular " + dir); // Log.info("Creating AParentFolderRegular " + dir);
} }
@Override @Override
@ -54,14 +54,14 @@ public class AParentFolderRegular implements AParentFolder {
public AFile getAFile(String nameOrPath) throws IOException { public AFile getAFile(String nameOrPath) throws IOException {
final File filecurrent; final File filecurrent;
Log.info("AParentFolderRegular::looking for " + nameOrPath); // Log.info("AParentFolderRegular::looking for " + nameOrPath);
Log.info("AParentFolderRegular::dir = " + dir); // Log.info("AParentFolderRegular::dir = " + dir);
if (dir == null) { if (dir == null) {
filecurrent = new File(nameOrPath); filecurrent = new File(nameOrPath);
} else { } else {
filecurrent = new File(dir.getAbsoluteFile(), nameOrPath); filecurrent = new File(dir.getAbsoluteFile(), nameOrPath);
} }
Log.info("AParentFolderRegular::Filecurrent " + filecurrent); // Log.info("AParentFolderRegular::Filecurrent " + filecurrent);
if (filecurrent.exists()) { if (filecurrent.exists()) {
return new AFileRegular(filecurrent.getCanonicalFile()); return new AFileRegular(filecurrent.getCanonicalFile());
} }

View File

@ -82,6 +82,7 @@ public final class BlockUmlBuilder implements DefinitionsContainer {
includer.close(); includer.close();
usedFiles = includer.getFilesUsed(); usedFiles = includer.getFilesUsed();
} }
reader.close();
} }
} }

View File

@ -42,10 +42,13 @@ import java.awt.geom.Dimension2D;
import java.awt.geom.Rectangle2D; import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.File; import java.io.File;
import java.io.IOException;
import net.sourceforge.plantuml.braille.BrailleCharFactory; import net.sourceforge.plantuml.braille.BrailleCharFactory;
import net.sourceforge.plantuml.braille.UGraphicBraille; import net.sourceforge.plantuml.braille.UGraphicBraille;
import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.StringBounder;
import net.sourceforge.plantuml.png.MetadataTag;
import net.sourceforge.plantuml.svg.SvgGraphics;
import net.sourceforge.plantuml.ugraphic.UFont; import net.sourceforge.plantuml.ugraphic.UFont;
/** /**
@ -202,4 +205,32 @@ public enum FileFormat {
return name.replaceAll("\\" + getFileSuffix() + "$", return name.replaceAll("\\" + getFileSuffix() + "$",
OptionFlags.getInstance().getFileSeparator() + String.format("%03d", i) + getFileSuffix()); OptionFlags.getInstance().getFileSeparator() + String.format("%03d", i) + getFileSuffix());
} }
public boolean doesSupportMetadata() {
return this == PNG || this == SVG;
}
public boolean equalsMetadata(String currentMetadata, File existingFile) {
try {
if (this == PNG) {
final MetadataTag tag = new MetadataTag(existingFile, "plantuml");
final String previousMetadata = tag.getData();
final boolean sameMetadata = currentMetadata.equals(previousMetadata);
return sameMetadata;
}
if (this == SVG) {
final String svg = FileUtils.readSvg(existingFile);
final String currentSignature = SvgGraphics.getMD5Hex(currentMetadata);
final int idx = svg.lastIndexOf(SvgGraphics.MD5_HEADER);
if (idx != -1) {
final String part = svg.substring(idx + SvgGraphics.MD5_HEADER.length());
return part.startsWith(currentSignature);
}
}
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
} }

View File

@ -97,16 +97,16 @@ public abstract class Log {
} }
public static void println(Object s) { public static void println(Object s) {
if (header2.get() == null) { // if (header2.get() == null) {
System.err.println("L = " + s); // System.err.println("L = " + s);
} else { // } else {
System.err.println(header2.get() + " " + s); // System.err.println(header2.get() + " " + s);
} // }
} }
private static final ThreadLocal<String> header2 = new ThreadLocal<String>(); // private static final ThreadLocal<String> header2 = new ThreadLocal<String>();
//
public static void header(String s) { public static void header(String s) {
header2.set(s); // header2.set(s);
} }
} }

View File

@ -192,12 +192,13 @@ public class OptionPrint {
public static Collection<String> interestingProperties() { public static Collection<String> interestingProperties() {
final Properties p = System.getProperties(); final Properties p = System.getProperties();
final List<String> all = withIp() ? Arrays.asList("java.runtime.name", "Java Runtime", "java.vm.name", "JVM", final List<String> list1 = Arrays.asList("java.runtime.name", "Java Runtime", "java.vm.name", "JVM",
"java.runtime.version", "Java Version", "os.name", "Operating System", "file.encoding", "java.runtime.version", "Java Version", "os.name", "Operating System", "file.encoding",
"Default Encoding", "user.language", "Language", "user.country", "Country") : Arrays.asList( "Default Encoding", "user.language", "Language", "user.country", "Country");
"java.runtime.name", "Java Runtime", "java.vm.name", "JVM", "java.runtime.version", "Java Version", final List<String> list2 = Arrays.asList("java.runtime.name", "Java Runtime", "java.vm.name", "JVM",
"os.name", "Operating System", "os.version", "OS Version", "file.encoding", "Default Encoding", "java.runtime.version", "Java Version", "os.name", "Operating System", /* "os.version", "OS Version", */
"user.language", "Language", "user.country", "Country"); "file.encoding", "Default Encoding", "user.language", "Language", "user.country", "Country");
final List<String> all = withIp() ? list1 : list2;
final List<String> result = new ArrayList<String>(); final List<String> result = new ArrayList<String>();
for (int i = 0; i < all.size(); i += 2) { for (int i = 0; i < all.size(); i += 2) {
result.add(all.get(i + 1) + ": " + p.getProperty(all.get(i))); result.add(all.get(i + 1) + ": " + p.getProperty(all.get(i)));

View File

@ -145,14 +145,13 @@ public class PSystemBuilder {
final List<PSystemFactory> factories = new ArrayList<PSystemFactory>(); final List<PSystemFactory> factories = new ArrayList<PSystemFactory>();
factories.add(new PSystemWelcomeFactory()); factories.add(new PSystemWelcomeFactory());
factories.add(new PSystemColorsFactory()); factories.add(new PSystemColorsFactory());
factories.add(new ListSpriteDiagramFactory(skinParam));
factories.add(new SequenceDiagramFactory(skinParam)); factories.add(new SequenceDiagramFactory(skinParam));
factories.add(new ClassDiagramFactory(skinParam)); factories.add(new ClassDiagramFactory(skinParam));
factories.add(new ActivityDiagramFactory(skinParam)); factories.add(new ActivityDiagramFactory(skinParam));
factories.add(new DescriptionDiagramFactory(skinParam)); factories.add(new DescriptionDiagramFactory(skinParam));
factories.add(new StateDiagramFactory(skinParam)); factories.add(new StateDiagramFactory(skinParam));
factories.add(new ActivityDiagramFactory3(skinParam)); factories.add(new ActivityDiagramFactory3(skinParam));
factories.add(new CompositeDiagramFactory(skinParam)); // factories.add(new CompositeDiagramFactory(skinParam));
factories.add(new BpmDiagramFactory(DiagramType.BPM)); factories.add(new BpmDiagramFactory(DiagramType.BPM));
// factories.add(new PostIdDiagramFactory()); // factories.add(new PostIdDiagramFactory());
factories.add(new PSystemLicenseFactory()); factories.add(new PSystemLicenseFactory());
@ -179,6 +178,7 @@ public class PSystemBuilder {
factories.add(new PSystemSudokuFactory()); factories.add(new PSystemSudokuFactory());
} }
factories.add(new PSystemDefinitionFactory()); factories.add(new PSystemDefinitionFactory());
factories.add(new ListSpriteDiagramFactory(skinParam));
factories.add(new PSystemMathFactory(DiagramType.MATH)); factories.add(new PSystemMathFactory(DiagramType.MATH));
factories.add(new PSystemLatexFactory(DiagramType.LATEX)); factories.add(new PSystemLatexFactory(DiagramType.LATEX));
// factories.add(new PSystemStatsFactory()); // factories.add(new PSystemStatsFactory());

View File

@ -51,7 +51,6 @@ import net.sourceforge.plantuml.core.ImageData;
import net.sourceforge.plantuml.cucadiagram.CucaDiagram; import net.sourceforge.plantuml.cucadiagram.CucaDiagram;
import net.sourceforge.plantuml.graphic.HtmlColorUtils; import net.sourceforge.plantuml.graphic.HtmlColorUtils;
import net.sourceforge.plantuml.html.CucaDiagramHtmlMaker; import net.sourceforge.plantuml.html.CucaDiagramHtmlMaker;
import net.sourceforge.plantuml.png.MetadataTag;
import net.sourceforge.plantuml.png.PngSplitter; import net.sourceforge.plantuml.png.PngSplitter;
import net.sourceforge.plantuml.project3.GanttDiagram; import net.sourceforge.plantuml.project3.GanttDiagram;
import net.sourceforge.plantuml.sequencediagram.SequenceDiagram; import net.sourceforge.plantuml.sequencediagram.SequenceDiagram;
@ -66,19 +65,19 @@ public class PSystemUtils {
public static List<FileImageData> exportDiagrams(Diagram system, SuggestedFile suggestedFile, public static List<FileImageData> exportDiagrams(Diagram system, SuggestedFile suggestedFile,
FileFormatOption fileFormatOption, boolean checkMetadata) throws IOException { FileFormatOption fileFormatOption, boolean checkMetadata) throws IOException {
final File existing = suggestedFile.getFile(0); final File existingFile = suggestedFile.getFile(0);
if (checkMetadata && existing.exists() && system.getNbImages() == 1) { if (checkMetadata && fileFormatOption.getFileFormat().doesSupportMetadata() && existingFile.exists()
final MetadataTag tag = new MetadataTag(existing, "plantuml"); && system.getNbImages() == 1) {
final String previousMetadata = tag.getData();
// final String version = Version.versionString(); // final String version = Version.versionString();
// System.out.println(system.getMetadata()); // System.out.println(system.getMetadata());
// System.out.println(data); // System.out.println(data);
// System.out.println(version); // System.out.println(version);
// System.out.println(data.contains(version)); // System.out.println(data.contains(version));
final boolean sameMetadata = system.getMetadata().equals(previousMetadata); final boolean sameMetadata = fileFormatOption.getFileFormat().equalsMetadata(system.getMetadata(),
existingFile);
if (sameMetadata) { if (sameMetadata) {
Log.info("Skipping " + existing.getAbsolutePath() + " because metadata has not changed."); Log.info("Skipping " + existingFile.getAbsolutePath() + " because metadata has not changed.");
return Arrays.asList(new FileImageData(existing, null)); return Arrays.asList(new FileImageData(existingFile, null));
} }
} }

View File

@ -100,11 +100,13 @@ public class Pipe {
} else if (option.isPipeMap()) { } else if (option.isPipeMap()) {
final String result = sourceStringReader.getCMapData(option.getImageIndex(), final String result = sourceStringReader.getCMapData(option.getImageIndex(),
option.getFileFormatOption()); option.getFileFormatOption());
// https://forum.plantuml.net/10049/2019-pipemap-diagrams-containing-links-give-zero-exit-code
// We don't check errors
error.goOk();
if (result == null) { if (result == null) {
ps.println(); ps.println();
} else { } else {
ps.println(result); ps.println(result);
error.goOk();
} }
} else { } else {
final OutputStream os = noStdErr ? new ByteArrayOutputStream() : ps; final OutputStream os = noStdErr ? new ByteArrayOutputStream() : ps;

View File

@ -52,13 +52,14 @@ import net.sourceforge.plantuml.code.AsciiEncoder;
public class SignatureUtils { public class SignatureUtils {
// private static byte[] salting(String pass, byte[] salt) throws NoSuchAlgorithmException, InvalidKeySpecException, // private static byte[] salting(String pass, byte[] salt) throws NoSuchAlgorithmException, InvalidKeySpecException,
// UnsupportedEncodingException { // UnsupportedEncodingException {
// final byte[] tmp = salting2(pass, salt); // final byte[] tmp = salting2(pass, salt);
// return SignatureUtils.getSHA512raw(tmp); // return SignatureUtils.getSHA512raw(tmp);
// } // }
public static byte[] salting(String pass, byte[] salt) throws NoSuchAlgorithmException, InvalidKeySpecException { public static synchronized byte[] salting(String pass, byte[] salt) throws NoSuchAlgorithmException,
InvalidKeySpecException {
final int iterations = 500; final int iterations = 500;
final int keyLength = 512; final int keyLength = 512;
final SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); final SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
@ -122,7 +123,7 @@ public class SignatureUtils {
} }
} }
public static byte[] getMD5raw(String s) throws NoSuchAlgorithmException, UnsupportedEncodingException { public static synchronized byte[] getMD5raw(String s) throws NoSuchAlgorithmException, UnsupportedEncodingException {
final MessageDigest msgDigest = MessageDigest.getInstance("MD5"); final MessageDigest msgDigest = MessageDigest.getInstance("MD5");
msgDigest.update(s.getBytes("UTF-8")); msgDigest.update(s.getBytes("UTF-8"));
return msgDigest.digest(); return msgDigest.digest();
@ -132,7 +133,8 @@ public class SignatureUtils {
return getSHA512raw(s.getBytes("UTF-8")); return getSHA512raw(s.getBytes("UTF-8"));
} }
public static byte[] getSHA512raw(byte data[]) throws NoSuchAlgorithmException, UnsupportedEncodingException { public static synchronized byte[] getSHA512raw(byte data[]) throws NoSuchAlgorithmException,
UnsupportedEncodingException {
final MessageDigest msgDigest = MessageDigest.getInstance("SHA-512"); final MessageDigest msgDigest = MessageDigest.getInstance("SHA-512");
msgDigest.update(data); msgDigest.update(data);
return msgDigest.digest(); return msgDigest.digest();
@ -147,7 +149,7 @@ public class SignatureUtils {
} }
} }
public static String getSignatureSha512(InputStream is) throws IOException { public static synchronized String getSignatureSha512(InputStream is) throws IOException {
try { try {
final MessageDigest msgDigest = MessageDigest.getInstance("SHA-512"); final MessageDigest msgDigest = MessageDigest.getInstance("SHA-512");
int read = 0; int read = 0;
@ -178,7 +180,7 @@ public class SignatureUtils {
return s; return s;
} }
public static String getSignature(File f) throws IOException { public static synchronized String getSignature(File f) throws IOException {
try { try {
final MessageDigest msgDigest = MessageDigest.getInstance("MD5"); final MessageDigest msgDigest = MessageDigest.getInstance("MD5");
final FileInputStream is = new FileInputStream(f); final FileInputStream is = new FileInputStream(f);

View File

@ -96,12 +96,12 @@ public class SkinParam implements ISkinParam {
if (type == UmlDiagramType.WBS) { if (type == UmlDiagramType.WBS) {
USE_STYLE2.set(true); USE_STYLE2.set(true);
} }
// if (type == UmlDiagramType.SEQUENCE) { // if (type == UmlDiagramType.SEQUENCE) {
// skin = "debug.skin"; // // skin = "debug.skin";
// USE_STYLE2.set(true); // USE_STYLE2.set(true);
// } // }
// if (type == UmlDiagramType.ACTIVITY) { // if (type == UmlDiagramType.ACTIVITY) {
// skin = "debug.skin"; // // skin = "debug.skin";
// USE_STYLE2.set(true); // USE_STYLE2.set(true);
// } // }
} }
@ -177,8 +177,7 @@ public class SkinParam implements ISkinParam {
} }
if (USE_STYLES()) { if (USE_STYLES()) {
final FromSkinparamToStyle convertor = new FromSkinparamToStyle(key2, value, getCurrentStyleBuilder()); final FromSkinparamToStyle convertor = new FromSkinparamToStyle(key2, value, getCurrentStyleBuilder());
final Style style = convertor.getStyle(); for (Style style : convertor.getStyles()) {
if (style != null) {
muteStyle(style); muteStyle(style);
} }
} }

View File

@ -37,6 +37,7 @@ package net.sourceforge.plantuml;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.Reader;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@ -83,7 +84,8 @@ public class SourceFileReader extends SourceFileReaderAbstract implements ISourc
} }
this.outputDirectory = outputDirectory; this.outputDirectory = outputDirectory;
builder = new BlockUmlBuilder(config, charset, defines, getReader(charset), file.getAbsoluteFile() final Reader reader = getReader(charset);
builder = new BlockUmlBuilder(config, charset, defines, reader, file.getAbsoluteFile()
.getParentFile(), FileWithSuffix.getFileName(file)); .getParentFile(), FileWithSuffix.getFileName(file));
} }

View File

@ -147,6 +147,7 @@ public abstract class SourceFileReaderAbstract {
try { try {
system = blockUml.getDiagram(); system = blockUml.getDiagram();
} catch (Throwable t) { } catch (Throwable t) {
t.printStackTrace();
return getCrashedImage(blockUml, t, suggested.getFile(0)); return getCrashedImage(blockUml, t, suggested.getFile(0));
} }

View File

@ -37,7 +37,6 @@ package net.sourceforge.plantuml;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.Collections;
import java.util.List; import java.util.List;
import net.sourceforge.plantuml.preproc.Defines; import net.sourceforge.plantuml.preproc.Defines;

View File

@ -52,6 +52,10 @@ final public class StringLocated {
return s; return s;
} }
public StringLocated append(String endOfLine) {
return new StringLocated(s + endOfLine, location, preprocessorError);
}
public StringLocated(String s, LineLocation location, String preprocessorError) { public StringLocated(String s, LineLocation location, String preprocessorError) {
if (s == null) { if (s == null) {
throw new IllegalArgumentException(); throw new IllegalArgumentException();
@ -131,4 +135,5 @@ final public class StringLocated {
} }
return fox; return fox;
} }
} }

View File

@ -46,7 +46,6 @@ import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.util.List; import java.util.List;
@ -60,7 +59,6 @@ import net.sourceforge.plantuml.api.ImageDataSimple;
import net.sourceforge.plantuml.command.BlocLines; import net.sourceforge.plantuml.command.BlocLines;
import net.sourceforge.plantuml.command.CommandControl; import net.sourceforge.plantuml.command.CommandControl;
import net.sourceforge.plantuml.command.CommandExecutionResult; import net.sourceforge.plantuml.command.CommandExecutionResult;
import net.sourceforge.plantuml.command.CommandSkinParam;
import net.sourceforge.plantuml.command.CommandSkinParamMultilines; import net.sourceforge.plantuml.command.CommandSkinParamMultilines;
import net.sourceforge.plantuml.core.Diagram; import net.sourceforge.plantuml.core.Diagram;
import net.sourceforge.plantuml.core.ImageData; import net.sourceforge.plantuml.core.ImageData;

View File

@ -80,31 +80,33 @@ public class PSystemXearth extends AbstractPSystem {
@Override @Override
final protected ImageData exportDiagramNow(OutputStream os, int num, FileFormatOption fileFormat, long seed) final protected ImageData exportDiagramNow(OutputStream os, int num, FileFormatOption fileFormat, long seed)
throws IOException { throws IOException {
final ACearth earth = new ACearth(markers); synchronized (PSystemXearth.class) {
final ConfigurationACearth conf = earth.getConf(); final ACearth earth = new ACearth(markers);
conf.setInt("imageWidth", width); final ConfigurationACearth conf = earth.getConf();
conf.setInt("imageHeight", height); conf.setInt("imageWidth", width);
conf.setInt("imageHeight", height);
for (Map.Entry<String, String> ent : config.entrySet()) { for (Map.Entry<String, String> ent : config.entrySet()) {
final String key = ent.getKey(); final String key = ent.getKey();
final String value = ent.getValue(); final String value = ent.getValue();
if (key.equalsIgnoreCase("GMT")) { if (key.equalsIgnoreCase("GMT")) {
final Date date = extractGmt(value); final Date date = extractGmt(value);
conf.setInt("fixedTime", (int) (date.getTime() / 1000L)); conf.setInt("fixedTime", (int) (date.getTime() / 1000L));
} else if (enums.contains(key)) { } else if (enums.contains(key)) {
conf.getMOEnum(key).set(value); conf.getMOEnum(key).set(value);
} else if (doubles.contains(key)) { } else if (doubles.contains(key)) {
conf.setDouble(key, Double.parseDouble(value)); conf.setDouble(key, Double.parseDouble(value));
} else if (integers.contains(key)) { } else if (integers.contains(key)) {
conf.setInt(key, Integer.parseInt(value)); conf.setInt(key, Integer.parseInt(value));
} else if (booleans.contains(key)) { } else if (booleans.contains(key)) {
conf.setBoolean(key, value.equalsIgnoreCase("true")); conf.setBoolean(key, value.equalsIgnoreCase("true"));
} else { } else {
throw new UnsupportedOperationException(key); throw new UnsupportedOperationException(key);
}
} }
earth.exportPng(os);
return new ImageDataSimple(width, height);
} }
earth.exportPng(os);
return new ImageDataSimple(width, height);
} }
private Date extractGmt(String s) { private Date extractGmt(String s) {

View File

@ -46,6 +46,9 @@ public class ConditionalContext {
private final ConditionalContext parent; private final ConditionalContext parent;
public ConditionalContext(ConditionalContext parent, IEntity branch, Direction direction) { public ConditionalContext(ConditionalContext parent, IEntity branch, Direction direction) {
if (branch == null) {
throw new IllegalArgumentException("branch is null");
}
if (branch.getLeafType() != LeafType.BRANCH) { if (branch.getLeafType() != LeafType.BRANCH) {
throw new IllegalArgumentException(); throw new IllegalArgumentException();
} }

View File

@ -75,12 +75,11 @@ public class ActivityDiagram3 extends UmlDiagram {
private SwimlaneStrategy swimlaneStrategy; private SwimlaneStrategy swimlaneStrategy;
private final SwimlanesC swinlanes = new SwimlanesC(getSkinParam(), getPragma()); private final SwimlanesC swinlanes = new SwimlanesC(getSkinParam(), getPragma());
public ActivityDiagram3(ISkinSimple skinParam) { public ActivityDiagram3(ISkinSimple skinParam) {
super(skinParam); super(skinParam);
} }
private void manageSwimlaneStrategy() { private void manageSwimlaneStrategy() {
if (swimlaneStrategy == null) { if (swimlaneStrategy == null) {
swimlaneStrategy = SwimlaneStrategy.SWIMLANE_FORBIDDEN; swimlaneStrategy = SwimlaneStrategy.SWIMLANE_FORBIDDEN;
@ -123,8 +122,8 @@ public class ActivityDiagram3 extends UmlDiagram {
} }
} }
public void addSpot(String spot) { public void addSpot(String spot, HtmlColor color) {
final InstructionSpot ins = new InstructionSpot(spot, nextLinkRenderer(), swinlanes.getCurrentSwimlane()); final InstructionSpot ins = new InstructionSpot(spot, color, nextLinkRenderer(), swinlanes.getCurrentSwimlane());
current().add(ins); current().add(ins);
setNextLinkRendererInternal(LinkRendering.none()); setNextLinkRendererInternal(LinkRendering.none());
manageSwimlaneStrategy(); manageSwimlaneStrategy();
@ -238,7 +237,9 @@ public class ActivityDiagram3 extends UmlDiagram {
} }
public void fork() { public void fork() {
final InstructionFork instructionFork = new InstructionFork(current(), nextLinkRenderer(), getSkinParam()); manageSwimlaneStrategy();
final InstructionFork instructionFork = new InstructionFork(current(), nextLinkRenderer(), getSkinParam(),
swinlanes.getCurrentSwimlane());
current().add(instructionFork); current().add(instructionFork);
setNextLinkRendererInternal(LinkRendering.none()); setNextLinkRendererInternal(LinkRendering.none());
setCurrent(instructionFork); setCurrent(instructionFork);
@ -249,7 +250,7 @@ public class ActivityDiagram3 extends UmlDiagram {
final InstructionFork currentFork = (InstructionFork) current(); final InstructionFork currentFork = (InstructionFork) current();
currentFork.manageOutRendering(nextLinkRenderer(), false); currentFork.manageOutRendering(nextLinkRenderer(), false);
setNextLinkRendererInternal(LinkRendering.none()); setNextLinkRendererInternal(LinkRendering.none());
currentFork.forkAgain(); currentFork.forkAgain(swinlanes.getCurrentSwimlane());
return CommandExecutionResult.ok(); return CommandExecutionResult.ok();
} }
return CommandExecutionResult.error("Cannot find fork"); return CommandExecutionResult.error("Cannot find fork");
@ -258,7 +259,7 @@ public class ActivityDiagram3 extends UmlDiagram {
public CommandExecutionResult endFork(ForkStyle forkStyle, String label) { public CommandExecutionResult endFork(ForkStyle forkStyle, String label) {
if (current() instanceof InstructionFork) { if (current() instanceof InstructionFork) {
final InstructionFork currentFork = (InstructionFork) current(); final InstructionFork currentFork = (InstructionFork) current();
currentFork.setStyle(forkStyle, label); currentFork.setStyle(forkStyle, label, swinlanes.getCurrentSwimlane());
currentFork.manageOutRendering(nextLinkRenderer(), true); currentFork.manageOutRendering(nextLinkRenderer(), true);
setNextLinkRendererInternal(LinkRendering.none()); setNextLinkRendererInternal(LinkRendering.none());
setCurrent(currentFork.getParent()); setCurrent(currentFork.getParent());
@ -268,7 +269,8 @@ public class ActivityDiagram3 extends UmlDiagram {
} }
public void split() { public void split() {
final InstructionSplit instructionSplit = new InstructionSplit(current(), nextLinkRenderer(), swinlanes.getCurrentSwimlane()); final InstructionSplit instructionSplit = new InstructionSplit(current(), nextLinkRenderer(),
swinlanes.getCurrentSwimlane());
setNextLinkRendererInternal(LinkRendering.none()); setNextLinkRendererInternal(LinkRendering.none());
current().add(instructionSplit); current().add(instructionSplit);
setCurrent(instructionSplit); setCurrent(instructionSplit);
@ -295,8 +297,8 @@ public class ActivityDiagram3 extends UmlDiagram {
public void startSwitch(Display test, HtmlColor color) { public void startSwitch(Display test, HtmlColor color) {
manageSwimlaneStrategy(); manageSwimlaneStrategy();
final InstructionSwitch instructionSwitch = new InstructionSwitch(swinlanes.getCurrentSwimlane(), current(), test, final InstructionSwitch instructionSwitch = new InstructionSwitch(swinlanes.getCurrentSwimlane(), current(),
nextLinkRenderer(), color, getSkinParam()); test, nextLinkRenderer(), color, getSkinParam());
current().add(instructionSwitch); current().add(instructionSwitch);
setNextLinkRendererInternal(LinkRendering.none()); setNextLinkRendererInternal(LinkRendering.none());
setCurrent(instructionSwitch); setCurrent(instructionSwitch);
@ -310,7 +312,7 @@ public class ActivityDiagram3 extends UmlDiagram {
} }
setNextLinkRendererInternal(LinkRendering.none()); setNextLinkRendererInternal(LinkRendering.none());
return CommandExecutionResult.ok(); return CommandExecutionResult.ok();
} }
return CommandExecutionResult.error("Cannot find switch"); return CommandExecutionResult.error("Cannot find switch");
} }

View File

@ -36,6 +36,7 @@
package net.sourceforge.plantuml.activitydiagram3; package net.sourceforge.plantuml.activitydiagram3;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
@ -55,6 +56,8 @@ public class InstructionFork extends WithNote implements Instruction {
private final Instruction parent; private final Instruction parent;
private final LinkRendering inlinkRendering; private final LinkRendering inlinkRendering;
private final ISkinParam skinParam; private final ISkinParam skinParam;
private final Swimlane swimlaneIn;
private Swimlane swimlaneOut;
private ForkStyle style = ForkStyle.FORK; private ForkStyle style = ForkStyle.FORK;
private String label; private String label;
boolean finished = false; boolean finished = false;
@ -68,10 +71,12 @@ public class InstructionFork extends WithNote implements Instruction {
return false; return false;
} }
public InstructionFork(Instruction parent, LinkRendering inlinkRendering, ISkinParam skinParam) { public InstructionFork(Instruction parent, LinkRendering inlinkRendering, ISkinParam skinParam, Swimlane swimlane) {
this.parent = parent; this.parent = parent;
this.inlinkRendering = inlinkRendering; this.inlinkRendering = inlinkRendering;
this.skinParam = skinParam; this.skinParam = skinParam;
this.swimlaneIn = swimlane;
this.swimlaneOut = swimlane;
this.forks.add(new InstructionList()); this.forks.add(new InstructionList());
if (inlinkRendering == null) { if (inlinkRendering == null) {
throw new IllegalArgumentException(); throw new IllegalArgumentException();
@ -91,7 +96,7 @@ public class InstructionFork extends WithNote implements Instruction {
for (InstructionList list : forks) { for (InstructionList list : forks) {
all.add(list.createFtile(factory)); all.add(list.createFtile(factory));
} }
Ftile result = factory.createParallel(all, style, label); Ftile result = factory.createParallel(all, style, label, swimlaneIn, swimlaneOut);
if (getPositionedNotes().size() > 0) { if (getPositionedNotes().size() > 0) {
result = FtileWithNoteOpale.create(result, getPositionedNotes(), skinParam, false); result = FtileWithNoteOpale.create(result, getPositionedNotes(), skinParam, false);
} }
@ -102,7 +107,8 @@ public class InstructionFork extends WithNote implements Instruction {
return parent; return parent;
} }
public void forkAgain() { public void forkAgain(Swimlane swimlane) {
this.swimlaneOut = swimlane;
this.forks.add(new InstructionList()); this.forks.add(new InstructionList());
} }
@ -126,17 +132,18 @@ public class InstructionFork extends WithNote implements Instruction {
} }
public Set<Swimlane> getSwimlanes() { public Set<Swimlane> getSwimlanes() {
return InstructionList.getSwimlanes2(forks); final Set<Swimlane> result = new HashSet<Swimlane>(InstructionList.getSwimlanes2(forks));
result.add(swimlaneIn);
result.add(swimlaneOut);
return result;
} }
public Swimlane getSwimlaneIn() { public Swimlane getSwimlaneIn() {
// return parent.getSwimlaneOut(); return swimlaneIn;
return forks.get(0).getSwimlaneIn();
} }
public Swimlane getSwimlaneOut() { public Swimlane getSwimlaneOut() {
return forks.get(0).getSwimlaneOut(); return swimlaneOut;
// return getLastList().getSwimlaneOut();
} }
public void manageOutRendering(LinkRendering nextLinkRenderer, boolean endFork) { public void manageOutRendering(LinkRendering nextLinkRenderer, boolean endFork) {
@ -149,9 +156,10 @@ public class InstructionFork extends WithNote implements Instruction {
getLastList().setOutRendering(nextLinkRenderer); getLastList().setOutRendering(nextLinkRenderer);
} }
public void setStyle(ForkStyle style, String label) { public void setStyle(ForkStyle style, String label, Swimlane swimlane) {
this.style = style; this.style = style;
this.label = label; this.label = label;
this.swimlaneOut = swimlane;
} }
} }

View File

@ -88,7 +88,7 @@ public class InstructionSplit implements Instruction {
for (InstructionList list : splits) { for (InstructionList list : splits) {
all.add(list.createFtile(factory)); all.add(list.createFtile(factory));
} }
return factory.createParallel(all, ForkStyle.SPLIT, null); return factory.createParallel(all, ForkStyle.SPLIT, null, swimlaneIn, swimlaneOut);
} }
public Instruction getParent() { public Instruction getParent() {

View File

@ -39,28 +39,31 @@ import net.sourceforge.plantuml.activitydiagram3.ftile.Ftile;
import net.sourceforge.plantuml.activitydiagram3.ftile.FtileFactory; import net.sourceforge.plantuml.activitydiagram3.ftile.FtileFactory;
import net.sourceforge.plantuml.activitydiagram3.ftile.FtileKilled; import net.sourceforge.plantuml.activitydiagram3.ftile.FtileKilled;
import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane; import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane;
import net.sourceforge.plantuml.graphic.HtmlColor;
public class InstructionSpot extends MonoSwimable implements Instruction { public class InstructionSpot extends MonoSwimable implements Instruction {
private boolean killed = false; private boolean killed = false;
private final LinkRendering inlinkRendering; private final LinkRendering inlinkRendering;
private final String spot; private final String spot;
private final HtmlColor color;
public boolean containsBreak() { public boolean containsBreak() {
return false; return false;
} }
public InstructionSpot(String spot, LinkRendering inlinkRendering, Swimlane swimlane) { public InstructionSpot(String spot, HtmlColor color, LinkRendering inlinkRendering, Swimlane swimlane) {
super(swimlane); super(swimlane);
this.spot = spot; this.spot = spot;
this.inlinkRendering = inlinkRendering; this.inlinkRendering = inlinkRendering;
this.color = color;
if (inlinkRendering == null) { if (inlinkRendering == null) {
throw new IllegalArgumentException(); throw new IllegalArgumentException();
} }
} }
public Ftile createFtile(FtileFactory factory) { public Ftile createFtile(FtileFactory factory) {
Ftile result = factory.spot(getSwimlaneIn(), spot); Ftile result = factory.spot(getSwimlaneIn(), spot, color);
result = eventuallyAddNote(factory, result, result.getSwimlaneIn()); result = eventuallyAddNote(factory, result, result.getSwimlaneIn());
if (killed) { if (killed) {
return new FtileKilled(result); return new FtileKilled(result);

View File

@ -56,7 +56,7 @@ import net.sourceforge.plantuml.graphic.color.Colors;
public class CommandActivity3 extends SingleLineCommand2<ActivityDiagram3> { public class CommandActivity3 extends SingleLineCommand2<ActivityDiagram3> {
public static final String ENDING_GROUP = "(;|\\\\\\\\|(?<![/|<>}\\]])(?:[/<}\\]])|(?<!\\</?\\w{1,5})(?<!\\<img[^>]{1,999})(?<!\\<\\$\\w{1,999})(?<!\\>)(?:\\>)|(?<!\\|.{1,999})(?:\\|))"; public static final String ENDING_GROUP = "(;|\\\\\\\\|(?<![/|<>}\\]])(?:[/<}\\]])|(?<!\\</?\\w{1,5})(?<!\\<img[^>]{1,999})(?<!\\<[&$]\\w{1,999})(?<!\\>)(?:\\>)|(?<!\\|.{1,999})(?:\\|))";
public CommandActivity3() { public CommandActivity3() {
super(getRegexConcat()); super(getRegexConcat());

View File

@ -43,6 +43,8 @@ import net.sourceforge.plantuml.command.regex.IRegex;
import net.sourceforge.plantuml.command.regex.RegexConcat; import net.sourceforge.plantuml.command.regex.RegexConcat;
import net.sourceforge.plantuml.command.regex.RegexLeaf; import net.sourceforge.plantuml.command.regex.RegexLeaf;
import net.sourceforge.plantuml.command.regex.RegexResult; import net.sourceforge.plantuml.command.regex.RegexResult;
import net.sourceforge.plantuml.graphic.HtmlColor;
import net.sourceforge.plantuml.graphic.color.ColorParser;
public class CommandCircleSpot3 extends SingleLineCommand2<ActivityDiagram3> { public class CommandCircleSpot3 extends SingleLineCommand2<ActivityDiagram3> {
@ -52,6 +54,7 @@ public class CommandCircleSpot3 extends SingleLineCommand2<ActivityDiagram3> {
static IRegex getRegexConcat() { static IRegex getRegexConcat() {
return RegexConcat.build(CommandCircleSpot3.class.getName(), RegexLeaf.start(), // return RegexConcat.build(CommandCircleSpot3.class.getName(), RegexLeaf.start(), //
ColorParser.exp4(), //
new RegexLeaf("SPOT", "\\((\\S)\\)"), // new RegexLeaf("SPOT", "\\((\\S)\\)"), //
new RegexLeaf(";?"), // new RegexLeaf(";?"), //
RegexLeaf.end()); RegexLeaf.end());
@ -59,7 +62,8 @@ public class CommandCircleSpot3 extends SingleLineCommand2<ActivityDiagram3> {
@Override @Override
protected CommandExecutionResult executeArg(ActivityDiagram3 diagram, LineLocation location, RegexResult arg) { protected CommandExecutionResult executeArg(ActivityDiagram3 diagram, LineLocation location, RegexResult arg) {
diagram.addSpot(arg.get("SPOT", 0)); final HtmlColor color = diagram.getSkinParam().getIHtmlColorSet().getColorIfValid(arg.get("COLOR", 0));
diagram.addSpot(arg.get("SPOT", 0), color);
return CommandExecutionResult.ok(); return CommandExecutionResult.ok();
} }

View File

@ -63,7 +63,7 @@ public interface FtileFactory {
public Ftile end(Swimlane swimlane); public Ftile end(Swimlane swimlane);
public Ftile spot(Swimlane swimlane, String spot); public Ftile spot(Swimlane swimlane, String spot, HtmlColor color);
public Ftile activity(Display label, Swimlane swimlane, BoxStyle style, Colors colors); public Ftile activity(Display label, Swimlane swimlane, BoxStyle style, Colors colors);
@ -90,7 +90,7 @@ public interface FtileFactory {
public Ftile createSwitch(Swimlane swimlane, List<Branch> branches, LinkRendering afterEndwhile, public Ftile createSwitch(Swimlane swimlane, List<Branch> branches, LinkRendering afterEndwhile,
LinkRendering topInlinkRendering, Display labelTest); LinkRendering topInlinkRendering, Display labelTest);
public Ftile createParallel(List<Ftile> all, ForkStyle style, String label); public Ftile createParallel(List<Ftile> all, ForkStyle style, String label, Swimlane in, Swimlane out);
public Ftile createGroup(Ftile list, Display name, HtmlColor backColor, HtmlColor titleColor, PositionedNote note, public Ftile createGroup(Ftile list, Display name, HtmlColor backColor, HtmlColor titleColor, PositionedNote note,
HtmlColor borderColor, USymbol type, double roundCorner); HtmlColor borderColor, USymbol type, double roundCorner);

View File

@ -145,8 +145,8 @@ public class FtileFactoryDelegator implements FtileFactory {
return factory.stop(swimlane); return factory.stop(swimlane);
} }
public Ftile spot(Swimlane swimlane, String spot) { public Ftile spot(Swimlane swimlane, String spot, HtmlColor color) {
return factory.spot(swimlane, spot); return factory.spot(swimlane, spot, color);
} }
public Ftile activity(Display label, Swimlane swimlane, BoxStyle style, Colors colors) { public Ftile activity(Display label, Swimlane swimlane, BoxStyle style, Colors colors) {
@ -201,8 +201,8 @@ public class FtileFactoryDelegator implements FtileFactory {
return factory.createSwitch(swimlane, branches, afterEndwhile, topInlinkRendering, labelTest); return factory.createSwitch(swimlane, branches, afterEndwhile, topInlinkRendering, labelTest);
} }
public Ftile createParallel(List<Ftile> all, ForkStyle style, String label) { public Ftile createParallel(List<Ftile> all, ForkStyle style, String label, Swimlane in, Swimlane out) {
return factory.createParallel(all, style, label); return factory.createParallel(all, style, label, in, out);
} }
public Ftile createGroup(Ftile list, Display name, HtmlColor backColor, HtmlColor titleColor, PositionedNote note, public Ftile createGroup(Ftile list, Display name, HtmlColor backColor, HtmlColor titleColor, PositionedNote note,

View File

@ -140,7 +140,7 @@ public abstract class AbstractParallelFtilesBuilder {
return middleDimension.getHeight(); return middleDimension.getHeight();
} }
protected final Swimlane swimlaneOutForStep2() { protected Swimlane swimlaneOutForStep2() {
return list.get(list.size() - 1).getSwimlaneOut(); return list.get(list.size() - 1).getSwimlaneOut();
} }

View File

@ -61,16 +61,17 @@ public class FtileFactoryDelegatorCreateParallel extends FtileFactoryDelegator {
} }
@Override @Override
public Ftile createParallel(List<Ftile> all, ForkStyle style, String label) { public Ftile createParallel(List<Ftile> all, ForkStyle style, String label, Swimlane in, Swimlane out) {
final Dimension2D dimSuper = super.createParallel(all, style, label).calculateDimension(getStringBounder()); final Dimension2D dimSuper = super.createParallel(all, style, label, in, out).calculateDimension(
getStringBounder());
final double height1 = dimSuper.getHeight() + 2 * spaceArroundBlackBar; final double height1 = dimSuper.getHeight() + 2 * spaceArroundBlackBar;
final List<Ftile> list = new ArrayList<Ftile>(); final List<Ftile> list = new ArrayList<Ftile>();
for (Ftile tmp : all) { for (Ftile tmp : all) {
list.add(new FtileHeightFixed(FtileUtils.addHorizontalMargin(tmp, xMargin), height1)); list.add(new FtileHeightFixed(FtileUtils.addHorizontalMargin(tmp, xMargin), height1));
} }
final Ftile inner = super.createParallel(list, style, label); final Ftile inner = super.createParallel(list, style, label, in, out);
AbstractParallelFtilesBuilder builder; AbstractParallelFtilesBuilder builder;
@ -79,7 +80,7 @@ public class FtileFactoryDelegatorCreateParallel extends FtileFactoryDelegator {
} else if (style == ForkStyle.MERGE) { } else if (style == ForkStyle.MERGE) {
builder = new ParallelBuilderMerge(skinParam(), getStringBounder(), list, inner); builder = new ParallelBuilderMerge(skinParam(), getStringBounder(), list, inner);
} else if (style == ForkStyle.FORK) { } else if (style == ForkStyle.FORK) {
builder = new ParallelBuilderFork(skinParam(), getStringBounder(), list, inner, label); builder = new ParallelBuilderFork(skinParam(), getStringBounder(), list, inner, label, in, out);
} else { } else {
throw new IllegalStateException(); throw new IllegalStateException();
} }

View File

@ -45,6 +45,7 @@ import net.sourceforge.plantuml.activitydiagram3.ftile.FtileFactory;
import net.sourceforge.plantuml.activitydiagram3.ftile.FtileFactoryDelegator; import net.sourceforge.plantuml.activitydiagram3.ftile.FtileFactoryDelegator;
import net.sourceforge.plantuml.activitydiagram3.ftile.FtileHeightFixed; import net.sourceforge.plantuml.activitydiagram3.ftile.FtileHeightFixed;
import net.sourceforge.plantuml.activitydiagram3.ftile.FtileUtils; import net.sourceforge.plantuml.activitydiagram3.ftile.FtileUtils;
import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane;
public class FtileFactoryDelegatorCreateParallelAddingMargin extends FtileFactoryDelegator { public class FtileFactoryDelegatorCreateParallelAddingMargin extends FtileFactoryDelegator {
@ -56,16 +57,17 @@ public class FtileFactoryDelegatorCreateParallelAddingMargin extends FtileFactor
} }
@Override @Override
public Ftile createParallel(List<Ftile> all, ForkStyle style, String label) { public Ftile createParallel(List<Ftile> all, ForkStyle style, String label, Swimlane in, Swimlane out) {
final Dimension2D dimSuper = super.createParallel(all, style, label).calculateDimension(getStringBounder()); final Dimension2D dimSuper = super.createParallel(all, style, label, in, out).calculateDimension(
getStringBounder());
final double height1 = dimSuper.getHeight() + 2 * spaceArroundBlackBar; final double height1 = dimSuper.getHeight() + 2 * spaceArroundBlackBar;
final List<Ftile> list = new ArrayList<Ftile>(); final List<Ftile> list = new ArrayList<Ftile>();
for (Ftile tmp : all) { for (Ftile tmp : all) {
list.add(new FtileHeightFixed(FtileUtils.addHorizontalMargin(tmp, xMargin), height1)); list.add(new FtileHeightFixed(FtileUtils.addHorizontalMargin(tmp, xMargin), height1));
} }
return super.createParallel(list, style, label); return super.createParallel(list, style, label, in, out);
} }
} }

View File

@ -125,7 +125,7 @@ class FtileRepeat extends AbstractFtile {
final TextBlock outTb = out.create(fcArrow, HorizontalAlignment.LEFT, spriteContainer); final TextBlock outTb = out.create(fcArrow, HorizontalAlignment.LEFT, spriteContainer);
final Ftile diamond1; final Ftile diamond1;
assert swimlane == repeat.getSwimlaneIn(); // assert swimlane == repeat.getSwimlaneIn();
if (backStart == null) { if (backStart == null) {
diamond1 = new FtileDiamond(repeat.skinParam(), backColor, borderColor, repeat.getSwimlaneIn()); diamond1 = new FtileDiamond(repeat.skinParam(), backColor, borderColor, repeat.getSwimlaneIn());
} else { } else {

View File

@ -64,19 +64,29 @@ import net.sourceforge.plantuml.ugraphic.UTranslate;
public class ParallelBuilderFork extends AbstractParallelFtilesBuilder { public class ParallelBuilderFork extends AbstractParallelFtilesBuilder {
private final String label; private final String label;
private final Swimlane in;
private final Swimlane out;
public ParallelBuilderFork(ISkinParam skinParam, StringBounder stringBounder, final List<Ftile> list, Ftile inner, public ParallelBuilderFork(ISkinParam skinParam, StringBounder stringBounder, final List<Ftile> list, Ftile inner,
String label) { String label, Swimlane in, Swimlane out) {
super(skinParam, stringBounder, list, inner); super(skinParam, stringBounder, list, inner);
this.label = label; this.label = label;
this.in = in;
this.out = out;
}
@Override
protected Swimlane swimlaneOutForStep2() {
return out;
} }
@Override @Override
protected Ftile doStep1() { protected Ftile doStep1() {
Ftile result = getMiddle(); Ftile result = getMiddle();
final List<Connection> conns = new ArrayList<Connection>(); final List<Connection> conns = new ArrayList<Connection>();
final Swimlane swimlaneBlack = in;
final Ftile black = new FtileBlackBlock(skinParam(), getRose() final Ftile black = new FtileBlackBlock(skinParam(), getRose()
.getHtmlColor(skinParam(), ColorParam.activityBar), getList().get(0).getSwimlaneIn()); .getHtmlColor(skinParam(), ColorParam.activityBar), swimlaneBlack);
double x = 0; double x = 0;
for (Ftile tmp : getList()) { for (Ftile tmp : getList()) {
final Dimension2D dim = tmp.calculateDimension(getStringBounder()); final Dimension2D dim = tmp.calculateDimension(getStringBounder());
@ -101,8 +111,9 @@ public class ParallelBuilderFork extends AbstractParallelFtilesBuilder {
@Override @Override
protected Ftile doStep2(Ftile result) { protected Ftile doStep2(Ftile result) {
final Swimlane swimlaneBlack = out;
final Ftile out = new FtileBlackBlock(skinParam(), getRose().getHtmlColor(skinParam(), ColorParam.activityBar), final Ftile out = new FtileBlackBlock(skinParam(), getRose().getHtmlColor(skinParam(), ColorParam.activityBar),
getList().get(0).getSwimlaneIn()); swimlaneBlack);
((FtileBlackBlock) out).setBlackBlockDimension(result.calculateDimension(getStringBounder()).getWidth(), ((FtileBlackBlock) out).setBlackBlockDimension(result.calculateDimension(getStringBounder()).getWidth(),
barHeight); barHeight);
if (label != null) { if (label != null) {

View File

@ -121,10 +121,10 @@ public class VCompactFactory implements FtileFactory {
return new FtileCircleStop(skinParam(), color, swimlane, style); return new FtileCircleStop(skinParam(), color, swimlane, style);
} }
public Ftile spot(Swimlane swimlane, String spot) { public Ftile spot(Swimlane swimlane, String spot, HtmlColor color) {
// final HtmlColor color = rose.getHtmlColor(skinParam, ColorParam.activityBackground); // final HtmlColor color = rose.getHtmlColor(skinParam, ColorParam.activityBackground);
final UFont font = skinParam.getFont(null, false, FontParam.ACTIVITY); final UFont font = skinParam.getFont(null, false, FontParam.ACTIVITY);
return new FtileCircleSpot(skinParam(), swimlane, spot, font); return new FtileCircleSpot(skinParam(), swimlane, spot, font, color);
} }
public Ftile end(Swimlane swimlane) { public Ftile end(Swimlane swimlane) {
@ -189,7 +189,7 @@ public class VCompactFactory implements FtileFactory {
return new FtileForkInner(ftiles); return new FtileForkInner(ftiles);
} }
public Ftile createParallel(List<Ftile> all, ForkStyle style, String label) { public Ftile createParallel(List<Ftile> all, ForkStyle style, String label, Swimlane in, Swimlane out) {
return new FtileForkInner(all); return new FtileForkInner(all);
} }

View File

@ -65,12 +65,13 @@ public class FtileCircleSpot extends AbstractFtile {
private final Swimlane swimlane; private final Swimlane swimlane;
private final String spot; private final String spot;
private final FontConfiguration fc; private final FontConfiguration fc;
private final HtmlColor backColor;
public FtileCircleSpot(ISkinParam skinParam, Swimlane swimlane, String spot, UFont font) { public FtileCircleSpot(ISkinParam skinParam, Swimlane swimlane, String spot, UFont font, HtmlColor backColor) {
super(skinParam); super(skinParam);
this.spot = spot; this.spot = spot;
this.swimlane = swimlane; this.swimlane = swimlane;
// this.font = font; this.backColor = backColor;
this.fc = new FontConfiguration(skinParam, FontParam.ACTIVITY, null); this.fc = new FontConfiguration(skinParam, FontParam.ACTIVITY, null);
} }
@ -97,7 +98,8 @@ public class FtileCircleSpot extends AbstractFtile {
public void drawU(UGraphic ug) { public void drawU(UGraphic ug) {
final HtmlColor borderColor = SkinParamUtils.getColor(skinParam(), null, ColorParam.activityBorder); final HtmlColor borderColor = SkinParamUtils.getColor(skinParam(), null, ColorParam.activityBorder);
final HtmlColor backColor = SkinParamUtils.getColor(skinParam(), null, ColorParam.activityBackground); final HtmlColor backColor = this.backColor == null ? SkinParamUtils.getColor(skinParam(), null,
ColorParam.activityBackground) : this.backColor;
final UEllipse circle = new UEllipse(SIZE, SIZE); final UEllipse circle = new UEllipse(SIZE, SIZE);
if (skinParam().shadowing(null)) { if (skinParam().shadowing(null)) {

View File

@ -96,7 +96,7 @@ public class BpmDiagram extends UmlDiagram {
cleanGrid(grid); cleanGrid(grid);
final GridArray gridArray = grid.toArray(SkinParam.create(getUmlDiagramType())); final GridArray gridArray = grid.toArray(SkinParam.create(getUmlDiagramType()));
// gridArray.addEdges(edges); // gridArray.addEdges(edges);
System.err.println("gridArray=" + gridArray); // System.err.println("gridArray=" + gridArray);
return gridArray; return gridArray;
} }

View File

@ -39,7 +39,7 @@ package net.sourceforge.plantuml.bpm;
public class CleanerMoveBlock implements GridCleaner { public class CleanerMoveBlock implements GridCleaner {
public boolean clean(Grid grid) { public boolean clean(Grid grid) {
System.err.println("CleanerMoveBlock"); // System.err.println("CleanerMoveBlock");
for (Line line : grid.lines().toList()) { for (Line line : grid.lines().toList()) {
tryGrid(grid, line); tryGrid(grid, line);
} }
@ -89,6 +89,6 @@ public class CleanerMoveBlock implements GridCleaner {
} }
private void tryBridge(Line line, Col col1, final Col col2) { private void tryBridge(Line line, Col col1, final Col col2) {
System.err.println("LINE=" + line + " " + col1 + " " + col2 + " "); // System.err.println("LINE=" + line + " " + col1 + " " + col2 + " ");
} }
} }

View File

@ -60,6 +60,7 @@ import net.sourceforge.plantuml.command.Command;
import net.sourceforge.plantuml.command.CommandEndPackage; import net.sourceforge.plantuml.command.CommandEndPackage;
import net.sourceforge.plantuml.command.CommandFootboxIgnored; import net.sourceforge.plantuml.command.CommandFootboxIgnored;
import net.sourceforge.plantuml.command.CommandNamespace; import net.sourceforge.plantuml.command.CommandNamespace;
import net.sourceforge.plantuml.command.CommandNamespace2;
import net.sourceforge.plantuml.command.CommandPackage; import net.sourceforge.plantuml.command.CommandPackage;
import net.sourceforge.plantuml.command.CommandPackageEmpty; import net.sourceforge.plantuml.command.CommandPackageEmpty;
import net.sourceforge.plantuml.command.CommandPage; import net.sourceforge.plantuml.command.CommandPage;
@ -123,6 +124,7 @@ public class ClassDiagramFactory extends UmlDiagramFactory {
cmds.add(factoryNoteCommand.createSingleLine()); cmds.add(factoryNoteCommand.createSingleLine());
cmds.add(new CommandNamespace()); cmds.add(new CommandNamespace());
cmds.add(new CommandNamespace2());
cmds.add(new CommandStereotype()); cmds.add(new CommandStereotype());
cmds.add(new CommandLinkClass(UmlDiagramType.CLASS)); cmds.add(new CommandLinkClass(UmlDiagramType.CLASS));

View File

@ -35,9 +35,6 @@
*/ */
package net.sourceforge.plantuml.classdiagram.command; package net.sourceforge.plantuml.classdiagram.command;
import java.util.EnumSet;
import java.util.Set;
import net.sourceforge.plantuml.LineLocation; import net.sourceforge.plantuml.LineLocation;
import net.sourceforge.plantuml.StringUtils; import net.sourceforge.plantuml.StringUtils;
import net.sourceforge.plantuml.UmlDiagram; import net.sourceforge.plantuml.UmlDiagram;
@ -61,38 +58,36 @@ import net.sourceforge.plantuml.sequencediagram.SequenceDiagram;
public class CommandHideShowByGender extends SingleLineCommand2<UmlDiagram> { public class CommandHideShowByGender extends SingleLineCommand2<UmlDiagram> {
private static final EnumSet<EntityPortion> PORTION_METHOD = EnumSet.<EntityPortion> of(EntityPortion.METHOD);
private static final EnumSet<EntityPortion> PORTION_MEMBER = EnumSet.<EntityPortion> of(EntityPortion.FIELD,
EntityPortion.METHOD);
private static final EnumSet<EntityPortion> PORTION_FIELD = EnumSet.<EntityPortion> of(EntityPortion.FIELD);
public CommandHideShowByGender() { public CommandHideShowByGender() {
super(getRegexConcat()); super(getRegexConcat());
} }
static IRegex getRegexConcat() { static IRegex getRegexConcat() {
return RegexConcat.build(CommandHideShowByGender.class.getName(), RegexLeaf.start(), // return RegexConcat
new RegexLeaf("COMMAND", "(hide|show)"), // .build(CommandHideShowByGender.class.getName(),
RegexLeaf.spaceOneOrMore(), // RegexLeaf.start(), //
new RegexLeaf("GENDER", new RegexLeaf("COMMAND", "(hide|show)"), //
"(?:(class|object|interface|enum|annotation|abstract|[\\p{L}0-9_.]+|[%g][^%g]+[%g]|\\<\\<.*\\>\\>)[%s]+)*?"), // RegexLeaf.spaceOneOrMore(), //
new RegexOptional( // new RegexLeaf("GENDER",
new RegexConcat( // "(?:(class|object|interface|enum|annotation|abstract|[\\p{L}0-9_.]+|[%g][^%g]+[%g]|\\<\\<.*\\>\\>)[%s]+)*?"), //
new RegexLeaf("EMPTY", "(empty)"), // new RegexOptional( //
RegexLeaf.spaceOneOrMore()) // new RegexConcat( //
), // new RegexLeaf("EMPTY", "(empty)"), //
new RegexLeaf("PORTION", "(members?|attributes?|fields?|methods?|circles?|circled?|stereotypes?)"), // RegexLeaf.spaceOneOrMore()) //
RegexLeaf.end()); ), //
new RegexLeaf("PORTION",
"(members?|attributes?|fields?|methods?|circles?|circled?|stereotypes?)"), //
RegexLeaf.end());
} }
private final EntityGender emptyByGender(Set<EntityPortion> portion) { private final EntityGender emptyByGender(EntityPortion portion) {
if (portion == PORTION_METHOD) { if (portion == EntityPortion.METHOD) {
return EntityGenderUtils.emptyMethods(); return EntityGenderUtils.emptyMethods();
} }
if (portion == PORTION_FIELD) { if (portion == EntityPortion.FIELD) {
return EntityGenderUtils.emptyFields(); return EntityGenderUtils.emptyFields();
} }
if (portion == PORTION_MEMBER) { if (portion == EntityPortion.MEMBER) {
throw new IllegalArgumentException(); throw new IllegalArgumentException();
// return EntityGenderUtils.emptyMembers(); // return EntityGenderUtils.emptyMembers();
} }
@ -115,13 +110,13 @@ public class CommandHideShowByGender extends SingleLineCommand2<UmlDiagram> {
} }
private CommandExecutionResult executeSequenceDiagram(SequenceDiagram diagram, RegexResult arg) { private CommandExecutionResult executeSequenceDiagram(SequenceDiagram diagram, RegexResult arg) {
final Set<EntityPortion> portion = getEntityPortion(arg.get("PORTION", 0)); final EntityPortion portion = getEntityPortion(arg.get("PORTION", 0));
diagram.hideOrShow(portion, arg.get("COMMAND", 0).equalsIgnoreCase("show")); diagram.hideOrShow(portion.asSet(), arg.get("COMMAND", 0).equalsIgnoreCase("show"));
return CommandExecutionResult.ok(); return CommandExecutionResult.ok();
} }
private CommandExecutionResult executeDescriptionDiagram(DescriptionDiagram diagram, RegexResult arg) { private CommandExecutionResult executeDescriptionDiagram(DescriptionDiagram diagram, RegexResult arg) {
final Set<EntityPortion> portion = getEntityPortion(arg.get("PORTION", 0)); final EntityPortion portion = getEntityPortion(arg.get("PORTION", 0));
final EntityGender gender; final EntityGender gender;
final String arg1 = arg.get("GENDER", 0); final String arg1 = arg.get("GENDER", 0);
if (arg1 == null) { if (arg1 == null) {
@ -151,7 +146,7 @@ public class CommandHideShowByGender extends SingleLineCommand2<UmlDiagram> {
private CommandExecutionResult executeClassDiagram(AbstractClassOrObjectDiagram classDiagram, RegexResult arg) { private CommandExecutionResult executeClassDiagram(AbstractClassOrObjectDiagram classDiagram, RegexResult arg) {
final Set<EntityPortion> portion = getEntityPortion(arg.get("PORTION", 0)); final EntityPortion portion = getEntityPortion(arg.get("PORTION", 0));
EntityGender gender = null; EntityGender gender = null;
final String arg1 = arg.get("GENDER", 0); final String arg1 = arg.get("GENDER", 0);
@ -177,7 +172,7 @@ public class CommandHideShowByGender extends SingleLineCommand2<UmlDiagram> {
} }
if (gender != null) { if (gender != null) {
final boolean empty = arg.get("EMPTY", 0) != null; final boolean empty = arg.get("EMPTY", 0) != null;
final boolean emptyMembers = empty && portion == PORTION_MEMBER; final boolean emptyMembers = empty && portion == EntityPortion.MEMBER;
if (empty == true && emptyMembers == false) { if (empty == true && emptyMembers == false) {
gender = EntityGenderUtils.and(gender, emptyByGender(portion)); gender = EntityGenderUtils.and(gender, emptyByGender(portion));
} }
@ -186,9 +181,9 @@ public class CommandHideShowByGender extends SingleLineCommand2<UmlDiagram> {
} }
if (emptyMembers) { if (emptyMembers) {
classDiagram.hideOrShow(EntityGenderUtils.and(gender, emptyByGender(PORTION_FIELD)), PORTION_FIELD, arg classDiagram.hideOrShow(EntityGenderUtils.and(gender, emptyByGender(EntityPortion.FIELD)), EntityPortion.FIELD, arg
.get("COMMAND", 0).equalsIgnoreCase("show")); .get("COMMAND", 0).equalsIgnoreCase("show"));
classDiagram.hideOrShow(EntityGenderUtils.and(gender, emptyByGender(PORTION_METHOD)), PORTION_METHOD, classDiagram.hideOrShow(EntityGenderUtils.and(gender, emptyByGender(EntityPortion.METHOD)), EntityPortion.METHOD,
arg.get("COMMAND", 0).equalsIgnoreCase("show")); arg.get("COMMAND", 0).equalsIgnoreCase("show"));
} else { } else {
classDiagram.hideOrShow(gender, portion, arg.get("COMMAND", 0).equalsIgnoreCase("show")); classDiagram.hideOrShow(gender, portion, arg.get("COMMAND", 0).equalsIgnoreCase("show"));
@ -197,22 +192,22 @@ public class CommandHideShowByGender extends SingleLineCommand2<UmlDiagram> {
return CommandExecutionResult.ok(); return CommandExecutionResult.ok();
} }
private Set<EntityPortion> getEntityPortion(String s) { private EntityPortion getEntityPortion(String s) {
final String sub = StringUtils.goLowerCase(s.substring(0, 3)); final String sub = StringUtils.goLowerCase(s.substring(0, 3));
if (sub.equals("met")) { if (sub.equals("met")) {
return PORTION_METHOD; return EntityPortion.METHOD;
} }
if (sub.equals("mem")) { if (sub.equals("mem")) {
return PORTION_MEMBER; return EntityPortion.MEMBER;
} }
if (sub.equals("att") || sub.equals("fie")) { if (sub.equals("att") || sub.equals("fie")) {
return PORTION_FIELD; return EntityPortion.FIELD;
} }
if (sub.equals("cir")) { if (sub.equals("cir")) {
return EnumSet.<EntityPortion> of(EntityPortion.CIRCLED_CHARACTER); return EntityPortion.CIRCLED_CHARACTER;
} }
if (sub.equals("ste")) { if (sub.equals("ste")) {
return EnumSet.<EntityPortion> of(EntityPortion.STEREOTYPE); return EntityPortion.STEREOTYPE;
} }
throw new IllegalArgumentException(); throw new IllegalArgumentException();
} }

View File

@ -54,11 +54,6 @@ import net.sourceforge.plantuml.skin.VisibilityModifier;
public class CommandHideShowByVisibility extends SingleLineCommand2<UmlDiagram> { public class CommandHideShowByVisibility extends SingleLineCommand2<UmlDiagram> {
private static final EnumSet<EntityPortion> PORTION_METHOD = EnumSet.<EntityPortion> of(EntityPortion.METHOD);
private static final EnumSet<EntityPortion> PORTION_MEMBER = EnumSet.<EntityPortion> of(EntityPortion.FIELD,
EntityPortion.METHOD);
private static final EnumSet<EntityPortion> PORTION_FIELD = EnumSet.<EntityPortion> of(EntityPortion.FIELD);
public CommandHideShowByVisibility() { public CommandHideShowByVisibility() {
super(getRegexConcat()); super(getRegexConcat());
} }
@ -84,7 +79,7 @@ public class CommandHideShowByVisibility extends SingleLineCommand2<UmlDiagram>
private CommandExecutionResult executeArgClass(ClassDiagram classDiagram, RegexResult arg) { private CommandExecutionResult executeArgClass(ClassDiagram classDiagram, RegexResult arg) {
final Set<EntityPortion> portion = getEntityPortion(arg.get("PORTION", 0)); final EntityPortion portion = getEntityPortion(arg.get("PORTION", 0));
final Set<VisibilityModifier> visibilities = EnumSet.<VisibilityModifier> noneOf(VisibilityModifier.class); final Set<VisibilityModifier> visibilities = EnumSet.<VisibilityModifier> noneOf(VisibilityModifier.class);
final StringTokenizer st = new StringTokenizer(StringUtils.goLowerCase(arg.get("VISIBILITY", 0)), " ,"); final StringTokenizer st = new StringTokenizer(StringUtils.goLowerCase(arg.get("VISIBILITY", 0)), " ,");
@ -97,43 +92,43 @@ public class CommandHideShowByVisibility extends SingleLineCommand2<UmlDiagram>
return CommandExecutionResult.ok(); return CommandExecutionResult.ok();
} }
private void addVisibilities(String token, Set<EntityPortion> portion, Set<VisibilityModifier> result) { private void addVisibilities(String token, EntityPortion portion, Set<VisibilityModifier> result) {
if (token.equals("public") && portion.contains(EntityPortion.FIELD)) { if (token.equals("public") && (portion == EntityPortion.MEMBER || portion == EntityPortion.FIELD)) {
result.add(VisibilityModifier.PUBLIC_FIELD); result.add(VisibilityModifier.PUBLIC_FIELD);
} }
if (token.equals("public") && portion.contains(EntityPortion.METHOD)) { if (token.equals("public") && (portion == EntityPortion.MEMBER || portion == EntityPortion.METHOD)) {
result.add(VisibilityModifier.PUBLIC_METHOD); result.add(VisibilityModifier.PUBLIC_METHOD);
} }
if (token.equals("private") && portion.contains(EntityPortion.FIELD)) { if (token.equals("private") && (portion == EntityPortion.MEMBER || portion == EntityPortion.FIELD)) {
result.add(VisibilityModifier.PRIVATE_FIELD); result.add(VisibilityModifier.PRIVATE_FIELD);
} }
if (token.equals("private") && portion.contains(EntityPortion.METHOD)) { if (token.equals("private") && (portion == EntityPortion.MEMBER || portion == EntityPortion.METHOD)) {
result.add(VisibilityModifier.PRIVATE_METHOD); result.add(VisibilityModifier.PRIVATE_METHOD);
} }
if (token.equals("protected") && portion.contains(EntityPortion.FIELD)) { if (token.equals("protected") && (portion == EntityPortion.MEMBER || portion == EntityPortion.FIELD)) {
result.add(VisibilityModifier.PROTECTED_FIELD); result.add(VisibilityModifier.PROTECTED_FIELD);
} }
if (token.equals("protected") && portion.contains(EntityPortion.METHOD)) { if (token.equals("protected") && (portion == EntityPortion.MEMBER || portion == EntityPortion.METHOD)) {
result.add(VisibilityModifier.PROTECTED_METHOD); result.add(VisibilityModifier.PROTECTED_METHOD);
} }
if (token.equals("package") && portion.contains(EntityPortion.FIELD)) { if (token.equals("package") && (portion == EntityPortion.MEMBER || portion == EntityPortion.FIELD)) {
result.add(VisibilityModifier.PACKAGE_PRIVATE_FIELD); result.add(VisibilityModifier.PACKAGE_PRIVATE_FIELD);
} }
if (token.equals("package") && portion.contains(EntityPortion.METHOD)) { if (token.equals("package") && (portion == EntityPortion.MEMBER || portion == EntityPortion.METHOD)) {
result.add(VisibilityModifier.PACKAGE_PRIVATE_METHOD); result.add(VisibilityModifier.PACKAGE_PRIVATE_METHOD);
} }
} }
private Set<EntityPortion> getEntityPortion(String s) { private EntityPortion getEntityPortion(String s) {
final String sub = StringUtils.goLowerCase(s.substring(0, 3)); final String sub = StringUtils.goLowerCase(s.substring(0, 3));
if (sub.equals("met")) { if (sub.equals("met")) {
return PORTION_METHOD; return EntityPortion.METHOD;
} }
if (sub.equals("mem")) { if (sub.equals("mem")) {
return PORTION_MEMBER; return EntityPortion.MEMBER;
} }
if (sub.equals("att") || sub.equals("fie")) { if (sub.equals("att") || sub.equals("fie")) {
return PORTION_FIELD; return EntityPortion.FIELD;
} }
throw new IllegalArgumentException(); throw new IllegalArgumentException();
} }

View File

@ -294,13 +294,29 @@ public class BlocLines implements Iterable<StringLocated> {
final String first = getFirst499().getTrimmed().getString(); final String first = getFirst499().getTrimmed().getString();
final String second = get499(1).getTrimmed().getString(); final String second = get499(1).getTrimmed().getString();
if (first.endsWith("{") == false && second.equals("{")) { if (first.endsWith("{") == false && second.equals("{")) {
final String vline = first + " {"; final StringLocated vline = getFirst499().append(" {");
final List<StringLocated> result = new ArrayList<StringLocated>(); final List<StringLocated> result = new ArrayList<StringLocated>();
result.add(new StringLocated(vline, null)); result.add(vline);
result.addAll(this.lines.subList(2, this.lines.size())); result.addAll(this.lines.subList(2, this.lines.size()));
return new BlocLines(result); return new BlocLines(result);
} }
return this; return this;
} }
public BlocLines eventuallyMoveAllEmptyBracket() {
final List<StringLocated> result = new ArrayList<StringLocated>();
for (StringLocated line : lines) {
if (line.getTrimmed().toString().equals("{")) {
if (result.size() > 0) {
final int pos = result.size() - 1;
StringLocated last = result.get(pos);
result.set(pos, last.append(" {"));
}
} else {
result.add(line);
}
}
return new BlocLines(result);
}
} }

View File

@ -64,7 +64,7 @@ public class CommandNamespace extends SingleLineCommand2<ClassDiagram> {
return RegexConcat.build(CommandNamespace.class.getName(), RegexLeaf.start(), // return RegexConcat.build(CommandNamespace.class.getName(), RegexLeaf.start(), //
new RegexLeaf("namespace"), // new RegexLeaf("namespace"), //
RegexLeaf.spaceOneOrMore(), // RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("NAME", "([\\p{L}0-9_][\\p{L}0-9_.:\\\\]*)"), // new RegexLeaf("NAME", "([\\p{L}0-9_][-\\p{L}0-9_.:\\\\]*)"), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("STEREOTYPE", "(\\<\\<.*\\>\\>)?"), // new RegexLeaf("STEREOTYPE", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
@ -79,8 +79,8 @@ public class CommandNamespace extends SingleLineCommand2<ClassDiagram> {
protected CommandExecutionResult executeArg(ClassDiagram diagram, LineLocation location, RegexResult arg) { protected CommandExecutionResult executeArg(ClassDiagram diagram, LineLocation location, RegexResult arg) {
final Code code = Code.of(arg.get("NAME", 0)); final Code code = Code.of(arg.get("NAME", 0));
final IGroup currentPackage = diagram.getCurrentGroup(); final IGroup currentPackage = diagram.getCurrentGroup();
diagram.gotoGroup2(code, Display.getWithNewlines(code), GroupType.PACKAGE, currentPackage, final Display display = Display.getWithNewlines(code);
NamespaceStrategy.MULTIPLE); diagram.gotoGroup2(code, display, GroupType.PACKAGE, currentPackage, NamespaceStrategy.MULTIPLE);
final IEntity p = diagram.getCurrentGroup(); final IEntity p = diagram.getCurrentGroup();
final String stereotype = arg.get("STEREOTYPE", 0); final String stereotype = arg.get("STEREOTYPE", 0);
if (stereotype != null) { if (stereotype != null) {

View File

@ -0,0 +1,115 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2020, Arnaud Roques
*
* Project Info: http://plantuml.com
*
* If you like this project or if you find it useful, you can support us at:
*
* http://plantuml.com/patreon (only 1$ per month!)
* http://plantuml.com/paypal
*
* This file is part of PlantUML.
*
* PlantUML is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* PlantUML distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
* License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
*
* Original Author: Arnaud Roques
*
*
*/
package net.sourceforge.plantuml.command;
import net.sourceforge.plantuml.LineLocation;
import net.sourceforge.plantuml.Url;
import net.sourceforge.plantuml.UrlBuilder;
import net.sourceforge.plantuml.UrlBuilder.ModeUrl;
import net.sourceforge.plantuml.classdiagram.ClassDiagram;
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.RegexOptional;
import net.sourceforge.plantuml.command.regex.RegexResult;
import net.sourceforge.plantuml.cucadiagram.Code;
import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.cucadiagram.GroupType;
import net.sourceforge.plantuml.cucadiagram.IEntity;
import net.sourceforge.plantuml.cucadiagram.IGroup;
import net.sourceforge.plantuml.cucadiagram.NamespaceStrategy;
import net.sourceforge.plantuml.cucadiagram.Stereotype;
import net.sourceforge.plantuml.graphic.color.ColorParser;
import net.sourceforge.plantuml.graphic.color.ColorType;
public class CommandNamespace2 extends SingleLineCommand2<ClassDiagram> {
public CommandNamespace2() {
super(getRegexConcat());
}
private static IRegex getRegexConcat() {
return RegexConcat.build(CommandNamespace2.class.getName(), RegexLeaf.start(), //
new RegexLeaf("namespace"), //
RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("[%g]"), //
new RegexLeaf("DISPLAY", "([^%g]+)"), //
new RegexLeaf("[%g]"), //
RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("as"), //
RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("NAME", "([\\p{L}0-9_][-\\p{L}0-9_.:\\\\]*)"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("STEREOTYPE", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("URL", "(" + UrlBuilder.getRegexp() + ")?"), //
RegexLeaf.spaceZeroOrMore(), //
ColorParser.exp1(), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("\\{"), RegexLeaf.end());
}
@Override
protected CommandExecutionResult executeArg(ClassDiagram diagram, LineLocation location, RegexResult arg) {
final Code code = Code.of(arg.get("NAME", 0));
final IGroup currentPackage = diagram.getCurrentGroup();
final String disp = arg.getLazzy("DISPLAY", 0);
final Display display = Display.getWithNewlines(disp);
diagram.gotoGroup2(code, display, GroupType.PACKAGE, currentPackage, NamespaceStrategy.MULTIPLE);
final IEntity p = diagram.getCurrentGroup();
final String stereotype = arg.get("STEREOTYPE", 0);
if (stereotype != null) {
p.setStereotype(new Stereotype(stereotype));
}
final String urlString = arg.get("URL", 0);
if (urlString != null) {
final UrlBuilder urlBuilder = new UrlBuilder(diagram.getSkinParam().getValue("topurl"), ModeUrl.STRICT);
final Url url = urlBuilder.getUrl(urlString);
p.addUrl(url);
}
final String color = arg.get("COLOR", 0);
if (color != null) {
p.setSpecificColorTOBEREMOVED(ColorType.BACK,
diagram.getSkinParam().getIHtmlColorSet().getColorIfValid(color));
}
return CommandExecutionResult.ok();
}
}

View File

@ -55,6 +55,7 @@ import net.sourceforge.plantuml.error.PSystemErrorUtils;
import net.sourceforge.plantuml.sequencediagram.command.CommandSkin; import net.sourceforge.plantuml.sequencediagram.command.CommandSkin;
import net.sourceforge.plantuml.sprite.CommandListSprite; import net.sourceforge.plantuml.sprite.CommandListSprite;
import net.sourceforge.plantuml.statediagram.command.CommandHideEmptyDescription; import net.sourceforge.plantuml.statediagram.command.CommandHideEmptyDescription;
import net.sourceforge.plantuml.style.CommandStyleImport;
import net.sourceforge.plantuml.style.CommandStyleMultilinesCSS; import net.sourceforge.plantuml.style.CommandStyleMultilinesCSS;
import net.sourceforge.plantuml.utils.StartUtils; import net.sourceforge.plantuml.utils.StartUtils;
import net.sourceforge.plantuml.version.IteratorCounter2; import net.sourceforge.plantuml.version.IteratorCounter2;
@ -220,7 +221,7 @@ public abstract class UmlDiagramFactory extends PSystemAbstractFactory {
addCommonCommands2(cmds); addCommonCommands2(cmds);
addCommonHides(cmds); addCommonHides(cmds);
cmds.add(new CommandStyleMultilinesCSS()); cmds.add(new CommandStyleMultilinesCSS());
cmds.add(new CommandStyleImport());
} }
final protected void addCommonCommands2(List<Command> cmds) { final protected void addCommonCommands2(List<Command> cmds) {

View File

@ -67,6 +67,7 @@ public final class FactorySequenceNoteOverSeveralCommand implements SingleMultiF
private IRegex getRegexConcatMultiLine() { private IRegex getRegexConcatMultiLine() {
return RegexConcat.build(FactorySequenceNoteOverSeveralCommand.class.getName() + "multi", RegexLeaf.start(), // return RegexConcat.build(FactorySequenceNoteOverSeveralCommand.class.getName() + "multi", RegexLeaf.start(), //
new RegexLeaf("PARALLEL", "(&[%s]*)?"), //
new RegexLeaf("VMERGE", "(/)?"), // new RegexLeaf("VMERGE", "(/)?"), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("STYLE", "(note|hnote|rnote)"), // new RegexLeaf("STYLE", "(note|hnote|rnote)"), //
@ -89,6 +90,7 @@ public final class FactorySequenceNoteOverSeveralCommand implements SingleMultiF
private IRegex getRegexConcatSingleLine() { private IRegex getRegexConcatSingleLine() {
return RegexConcat.build(FactorySequenceNoteOverSeveralCommand.class.getName() + "single", RegexLeaf.start(), // return RegexConcat.build(FactorySequenceNoteOverSeveralCommand.class.getName() + "single", RegexLeaf.start(), //
new RegexLeaf("PARALLEL", "(&[%s]*)?"), //
new RegexLeaf("VMERGE", "(/)?"), // new RegexLeaf("VMERGE", "(/)?"), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("STYLE", "(note|hnote|rnote)"), // new RegexLeaf("STYLE", "(note|hnote|rnote)"), //
@ -157,6 +159,7 @@ public final class FactorySequenceNoteOverSeveralCommand implements SingleMultiF
if (lines.size() > 0) { if (lines.size() > 0) {
final boolean tryMerge = line0.get("VMERGE", 0) != null; final boolean tryMerge = line0.get("VMERGE", 0) != null;
final boolean parallel = line0.get("PARALLEL", 0) != null;
final Display display = diagram.manageVariable(lines.toDisplay()); final Display display = diagram.manageVariable(lines.toDisplay());
final Note note = new Note(p1, p2, display, diagram.getSkinParam().getCurrentStyleBuilder()); final Note note = new Note(p1, p2, display, diagram.getSkinParam().getCurrentStyleBuilder());
Colors colors = color().getColor(line0, diagram.getSkinParam().getIHtmlColorSet()); Colors colors = color().getColor(line0, diagram.getSkinParam().getIHtmlColorSet());
@ -176,6 +179,9 @@ public final class FactorySequenceNoteOverSeveralCommand implements SingleMultiF
final Url urlLink = urlBuilder.getUrl(line0.get("URL", 0)); final Url urlLink = urlBuilder.getUrl(line0.get("URL", 0));
note.setUrl(urlLink); note.setUrl(urlLink);
} }
if (parallel) {
note.goParallel();
}
diagram.addNote(note, tryMerge); diagram.addNote(note, tryMerge);
} }
return CommandExecutionResult.ok(); return CommandExecutionResult.ok();

View File

@ -57,7 +57,8 @@ public class Matcher2 {
final long now = System.currentTimeMillis(); final long now = System.currentTimeMillis();
final String id = pattern.pattern(); final String id = pattern.pattern();
try { try {
return new Matcher2(pattern.matcher(input), id); final Matcher matcher2 = pattern.matcher(input);
return new Matcher2(matcher2, id);
} finally { } finally {
if (INSTRUMENT) { if (INSTRUMENT) {
addTime(id, System.currentTimeMillis() - now); addTime(id, System.currentTimeMillis() - now);

View File

@ -36,11 +36,13 @@
package net.sourceforge.plantuml.command.regex; package net.sourceforge.plantuml.command.regex;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import net.sourceforge.plantuml.StringLocated; import net.sourceforge.plantuml.StringLocated;
@ -48,26 +50,32 @@ import net.sourceforge.plantuml.StringLocated;
public abstract class RegexComposed implements IRegex { public abstract class RegexComposed implements IRegex {
protected static final AtomicInteger nbCreateMatches = new AtomicInteger(); protected static final AtomicInteger nbCreateMatches = new AtomicInteger();
protected final List<IRegex> partials; private final List<IRegex> partials;
protected final List<IRegex> partials() {
return partials;
}
abstract protected String getFullSlow(); abstract protected String getFullSlow();
private Pattern2 fullCached; private final AtomicReference<Pattern2> fullCached = new AtomicReference<Pattern2>();
private synchronized Pattern2 getPattern2() { private Pattern2 getPattern2() {
if (fullCached == null) { Pattern2 result = fullCached.get();
if (result == null) {
final String fullSlow = getFullSlow(); final String fullSlow = getFullSlow();
fullCached = MyPattern.cmpile(fullSlow, Pattern.CASE_INSENSITIVE); result = MyPattern.cmpile(fullSlow, Pattern.CASE_INSENSITIVE);
fullCached.set(result);
} }
return fullCached; return result;
} }
protected boolean isCompiled() { final protected boolean isCompiled() {
return fullCached != null; return fullCached.get() != null;
} }
public RegexComposed(IRegex... partial) { public RegexComposed(IRegex... partial) {
this.partials = Arrays.asList(partial); this.partials = Collections.unmodifiableList(Arrays.asList(partial));
} }
public Map<String, RegexPartialMatch> createPartialMatch(Iterator<String> it) { public Map<String, RegexPartialMatch> createPartialMatch(Iterator<String> it) {

View File

@ -42,13 +42,11 @@ import java.util.concurrent.atomic.AtomicLong;
import net.sourceforge.plantuml.Log; import net.sourceforge.plantuml.Log;
import net.sourceforge.plantuml.StringLocated; import net.sourceforge.plantuml.StringLocated;
public class RegexConcat extends RegexComposed implements IRegex { public final class RegexConcat extends RegexComposed implements IRegex {
private static final ConcurrentMap<Object, RegexConcat> cache = new ConcurrentHashMap<Object, RegexConcat>(); private static final ConcurrentMap<Object, RegexConcat> cache = new ConcurrentHashMap<Object, RegexConcat>();
private final AtomicLong foxRegex = new AtomicLong(-1L); private final AtomicLong foxRegex = new AtomicLong(-1L);
private boolean invoked;
// private static final Set<String> PRINTED2 = new HashSet<String>(); // private static final Set<String> PRINTED2 = new HashSet<String>();
public static void printCacheInfo() { public static void printCacheInfo() {
@ -58,7 +56,7 @@ public class RegexConcat extends RegexComposed implements IRegex {
if (reg.isCompiled()) { if (reg.isCompiled()) {
nbCompiled++; nbCompiled++;
} }
if (reg.invoked) { if (reg.invoked()) {
nbInvoked++; nbInvoked++;
} }
} }
@ -73,8 +71,8 @@ public class RegexConcat extends RegexComposed implements IRegex {
private long foxRegex() { private long foxRegex() {
if (foxRegex.get() == -1L) { if (foxRegex.get() == -1L) {
long tmp = 0L; long tmp = 0L;
for (int i = 1; i < partials.size() - 1; i++) { for (int i = 1; i < partials().size() - 1; i++) {
final IRegex part = partials.get(i); final IRegex part = partials().get(i);
if (part instanceof RegexLeaf) { if (part instanceof RegexLeaf) {
final RegexLeaf leaf = (RegexLeaf) part; final RegexLeaf leaf = (RegexLeaf) part;
tmp = tmp | leaf.getFoxSignature(); tmp = tmp | leaf.getFoxSignature();
@ -109,9 +107,12 @@ public class RegexConcat extends RegexComposed implements IRegex {
return result; return result;
} }
private boolean invoked() {
return foxRegex.get() != -1L;
}
@Override @Override
public boolean match(StringLocated s) { public boolean match(StringLocated s) {
invoked = true;
final long foxRegex = foxRegex(); final long foxRegex = foxRegex();
if (foxRegex != 0L) { if (foxRegex != 0L) {
final long foxLine = s.getFoxSignature(); final long foxLine = s.getFoxSignature();
@ -129,7 +130,7 @@ public class RegexConcat extends RegexComposed implements IRegex {
@Override @Override
protected String getFullSlow() { protected String getFullSlow() {
final StringBuilder sb = new StringBuilder(); final StringBuilder sb = new StringBuilder();
for (IRegex p : partials) { for (IRegex p : partials()) {
sb.append(p.getPattern()); sb.append(p.getPattern());
} }
return sb.toString(); return sb.toString();

View File

@ -46,7 +46,7 @@ public class RegexOptional extends RegexComposed implements IRegex {
@Override @Override
protected String getFullSlow() { protected String getFullSlow() {
final StringBuilder sb = new StringBuilder("(?:"); final StringBuilder sb = new StringBuilder("(?:");
sb.append(partials.get(0).getPattern()); sb.append(partials().get(0).getPattern());
sb.append(")?"); sb.append(")?");
return sb.toString(); return sb.toString();
} }

View File

@ -60,7 +60,7 @@ public class RegexOr extends RegexComposed implements IRegex {
if (name == null) { if (name == null) {
sb.append("?:"); sb.append("?:");
} }
for (IRegex p : partials) { for (IRegex p : partials()) {
sb.append(p.getPattern()); sb.append(p.getPattern());
sb.append("|"); sb.append("|");
} }

View File

@ -37,6 +37,7 @@ package net.sourceforge.plantuml.creole;
import java.awt.geom.Dimension2D; import java.awt.geom.Dimension2D;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -55,6 +56,12 @@ public class AtomTree extends AbstractAtom implements Atom {
private final List<Atom> cells = new ArrayList<Atom>(); private final List<Atom> cells = new ArrayList<Atom>();
private final Map<Atom, Integer> levels = new HashMap<Atom, Integer>(); private final Map<Atom, Integer> levels = new HashMap<Atom, Integer>();
private final double margin = 2; private final double margin = 2;
@Override
public List<Atom> splitInTwo(StringBounder stringBounder, double width) {
return Arrays.asList((Atom) this);
}
public AtomTree(HtmlColor lineColor) { public AtomTree(HtmlColor lineColor) {
this.lineColor = lineColor; this.lineColor = lineColor;

View File

@ -36,6 +36,10 @@
package net.sourceforge.plantuml.creole; package net.sourceforge.plantuml.creole;
import java.awt.geom.Dimension2D; import java.awt.geom.Dimension2D;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import net.sourceforge.plantuml.Dimension2DDouble; import net.sourceforge.plantuml.Dimension2DDouble;
import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.StringBounder;
@ -54,6 +58,24 @@ class AtomWithMargin extends AbstractAtom implements Atom {
this.marginY2 = marginY2; this.marginY2 = marginY2;
} }
@Override
public List<Atom> splitInTwo(StringBounder stringBounder, double width) {
final List<Atom> result = new ArrayList<Atom>();
final List<Atom> list = atom.splitInTwo(stringBounder, width);
for (Atom a : list) {
double y1 = marginY1;
double y2 = marginY2;
if (list.size() == 2 && result.size() == 0) {
y2 = 0;
}
if (list.size() == 2 && result.size() == 1) {
y1 = 0;
}
result.add(new AtomWithMargin(a, y1, y2));
}
return Collections.unmodifiableList(result);
}
public Dimension2D calculateDimension(StringBounder stringBounder) { public Dimension2D calculateDimension(StringBounder stringBounder) {
return Dimension2DDouble.delta(atom.calculateDimension(stringBounder), 0, marginY1 + marginY2); return Dimension2DDouble.delta(atom.calculateDimension(stringBounder), 0, marginY1 + marginY2);
} }
@ -65,5 +87,5 @@ class AtomWithMargin extends AbstractAtom implements Atom {
public void drawU(UGraphic ug) { public void drawU(UGraphic ug) {
atom.drawU(ug.apply(new UTranslate(0, marginY1))); atom.drawU(ug.apply(new UTranslate(0, marginY1)));
} }
} }

View File

@ -563,8 +563,8 @@ public abstract class CucaDiagram extends UmlDiagram implements GroupHierarchy,
return result; return result;
} }
public final void hideOrShow(EntityGender gender, Set<EntityPortion> portions, boolean show) { public final void hideOrShow(EntityGender gender, EntityPortion portions, boolean show) {
for (EntityPortion portion : portions) { for (EntityPortion portion : portions.asSet()) {
this.hideOrShows.add(new HideOrShow(gender, portion, show)); this.hideOrShows.add(new HideOrShow(gender, portion, show));
} }
} }
@ -577,26 +577,6 @@ public abstract class CucaDiagram extends UmlDiagram implements GroupHierarchy,
} }
} }
// public void hideOrShow(IEntity leaf, boolean show) {
// leaf.setRemoved(!show);
// }
// public void hideOrShow(Stereotype stereotype, boolean show) {
// if (show) {
// hiddenStereotype.remove(stereotype.getLabel(Guillemet.DOUBLE_COMPARATOR));
// } else {
// hiddenStereotype.add(stereotype.getLabel(Guillemet.DOUBLE_COMPARATOR));
// }
// }
//
// public void hideOrShow(LeafType leafType, boolean show) {
// if (show) {
// hiddenType.remove(leafType);
// } else {
// hiddenType.add(leafType);
// }
// }
public void hideOrShow2(String what, boolean show) { public void hideOrShow2(String what, boolean show) {
this.hides2.add(new HideOrShow2(what, show)); this.hides2.add(new HideOrShow2(what, show));
} }

View File

@ -115,13 +115,5 @@ public class EntityGenderUtils {
}; };
} }
// static public EntityGender emptyMembers() {
// return new EntityGender() {
// public boolean contains(IEntity test) {
// return test.getBodier().getMethodsToDisplay().size() == 0
// && test.getBodier().getFieldsToDisplay().size() == 0;
// }
// };
// }
} }

View File

@ -35,6 +35,16 @@
*/ */
package net.sourceforge.plantuml.cucadiagram; package net.sourceforge.plantuml.cucadiagram;
import java.util.EnumSet;
import java.util.Set;
public enum EntityPortion { public enum EntityPortion {
FIELD, METHOD, CIRCLED_CHARACTER, STEREOTYPE, LOLLIPOP, ENTIRELY FIELD, METHOD, MEMBER, CIRCLED_CHARACTER, STEREOTYPE;
public Set<EntityPortion> asSet() {
if (this == MEMBER) {
return EnumSet.<EntityPortion> of(FIELD, METHOD);
}
return EnumSet.<EntityPortion> of(this);
}
} }

View File

@ -59,9 +59,9 @@ import net.sourceforge.plantuml.skin.VisibilityModifier;
public class EntityFactory { public class EntityFactory {
private final Map<Code, ILeaf> leafs = new Protect<ILeaf>(new LinkedHashMap<Code, ILeaf>()); private final Map<Code, ILeaf> leafs = new LinkedHashMap<Code, ILeaf>();
private final List<Link> links = new ArrayList<Link>(); private final List<Link> links = new ArrayList<Link>();
private final Map<Code, IGroup> groups = new Protect<IGroup>(new LinkedHashMap<Code, IGroup>()); private final Map<Code, IGroup> groups = new LinkedHashMap<Code, IGroup>();
private int rawLayout; private int rawLayout;
private final IGroup rootGroup = new GroupRoot(this); private final IGroup rootGroup = new GroupRoot(this);
@ -209,75 +209,4 @@ public class EntityFactory {
return result; return result;
} }
static class Protect<O extends Object> implements Map<Code, O> {
private final Map<Code, O> m;
public Protect(Map<Code, O> data) {
this.m = data;
}
public O remove(Object key) {
if (key instanceof Code == false) {
throw new IllegalArgumentException();
}
return m.remove(key);
}
public O get(Object key) {
if (key instanceof Code == false) {
throw new IllegalArgumentException();
}
return m.get(key);
}
public Set<Code> keySet() {
return m.keySet();
}
public void putAll(Map<? extends Code, ? extends O> m) {
this.m.putAll(m);
}
public boolean containsKey(Object key) {
if (key instanceof Code == false) {
throw new IllegalArgumentException();
}
return m.containsKey(key);
}
public boolean isEmpty() {
return m.isEmpty();
}
public O put(Code key, O value) {
if (key instanceof Code == false) {
throw new IllegalArgumentException();
}
return m.put(key, value);
}
public boolean containsValue(Object value) {
return m.containsValue(value);
}
public Set<Map.Entry<Code, O>> entrySet() {
return m.entrySet();
}
public Collection<O> values() {
return m.values();
}
public void clear() {
m.clear();
}
public int size() {
return m.size();
}
}
} }

View File

@ -71,28 +71,28 @@ public class PSystemDonors extends AbstractPSystem {
private static final int COLS = 6; private static final int COLS = 6;
private static final int FREE_LINES = 6; private static final int FREE_LINES = 6;
public static final String DONORS = "6rW902mFR3hSmrTODcikzuop9yl7Q5RohVaQVmG9QrfMG8eAo04YsxAZMAlDIBlv0O82w3Lqz9ZRTthS" public static final String DONORS = "6ty902mFR3fSuLzO9ciEU-UTVLaMenKn_Poll0GDwsu450sG0Q8aQloSnDhywO_J0H90rz3HOsxVwN6_"
+ "RwI_YAvqzqqpecqsfpJFA8e5GUFvDksmpP-zgJAa53AGwKICX-1fynfBhQmb_o3XTFytdKBoK166eTaA" + "aVuYkjAzRveHRVcs-MeT28Jb1yTZxQt2wPrlgWmfGKmLss-PqDxVVbneGbeh65VWfd92vl-cq-9uA8HP"
+ "vwCHQlz096FjZgt6TFUZgBjMNTob2jyADQPJn35S5HhbrGDVMoWP5IxzEdyBcfWL4pb4YgUis68UlQ67" + "cgrmFXgXChPaZuwvpzsFeYvKNLo2gc-56jEfn35S5JQ6wpFKDHonwDhLyQWe6HGZh28bKJUE8C4TDngr"
+ "AxdGEYCBPDR-exu0BLB392Xo2L1iFKcYuwsbdNq7ki-HG8SJboYmcJ479Gxh7MZjt12pn2a23PTcOJGs" + "KJd19r8B_r4BQDAQJKFIAQ1OHefOyxRC-UC0zJTXu4GGKpeS8CAXf2DuWJ54VI618AeODMgZw8pDLCzv"
+ "aRFbYGaC-w05U_WVzKIEMz3AB8Ks9oxNW88zReR3I5gbYYPYTcWpeBX5jEX8O54NnuLmVHmCJSbvq70B" + "ueE955JOWN_af7fl8TkZ31q8OhAXGC9F40HWpzLGuhEvsO3IBRp5l0QRTMfPoMZtDrDIQguqF00wOY9e"
+ "KEnYWL9CQW1v4-iTV9gDV57dqZU12bxr3ecZsHbMLzaXPZutPlJjpqC2ol_-oSmOdotbQa6L9LzdVzHf" + "1Ln1o9kW2tuVRUOIPngxei0RdiHubTi7kSZs0DXU3EZRMHC3vGizEVEKPKPrQo6TKwvp_EfiaEyQChEt"
+ "87S96ZdiZTR6AblWNY_gb31_iK1-0BrK2og9xrat5bg0k9UK5-Jcd3-vZY8mDgK45di8KrgJ7zOLQ6n2" + "cr75E8k9cD_cKXY-k03xcw2NMaF5-9lpp48sXCUKkf2Tv_Bbt8b0M6KfMUGgbgIc_hIBAMrTpFUcBEBT"
+ "bhiP2to4dujDi88jk7BvQj3DjE8vfVE5b9GGlttHgo7zLeWrSRDw-wXtJvbh-V-wQugP53VGIGczJTS2" + "-tLgADimWbTJv80-gfNsXiuNYgk6-kSXZxgEJ-5hqXRYNQBlJiojuk_jRWapJbVGzIPyg6w0A3Lwucgk"
+ "58KnMBKB4nF1ow2tGsu4P0EKXzAjE3I_o5_x0fct9lU0o6tEiLygtb0tEWGn3TPq8OKPmFmkHRbpudO7" + "M5GHk8FesP27WDo1wilaLdbPFYIkvmDIRqiu49aDOYDnpRRYa8j5c0TMTgMA0S0MBj6kt_gTf5zvTK8V"
+ "4Kvh0tgNgImZRUuocrBDr25ZxhfG9p_kcnchue0SyhpmeKvmSyEugZVBkxGVC0jubByiFlsSH_1O1JWF" + "WfLHP8IxVhj9zx1vDioDNYj0Gur1UKDdonSPgxaW3ZDCownPFT1-n564otYGl7hUCxkk0bYJUMzRR8sd"
+ "zzxpmj9SWe5sXZfQ86r6rFSzzKNX9WubikXRxEBakrnFN3nqFVZioQ9TpF_C-4yW7uFAonPAwfiCRn9e" + "Cx2kOSumITCH-JZIbcGSwYWzYxFDcxh4gxcTx3nqEpXFRz49Piuswo5J8FUeUMcfMunxrs38crDPnQxb"
+ "-WwPR4nV-IHlmFyoCCqSZenFCUzV9i_Kn14dJjCnd6ri0B1N5JwnE0Xk1gfkwTbPJ8gORBxwc3aJ_1XV" + "ehq4-kfcFL32Cpu5t6wS3Ada4eAeuKn7I4n09BNEApPOulekgdevEPwQbZ1hjzL1eDhv4Ni3GLMm4suW"
+ "W55P2vuAszdTI-8CQ9JO9-QzCkekldLAFXPG9he8bjA2KZqeAKB7C39YrA3dh3LW-rtC5kYrpsnOKYY-" + "plfUusT4YMBdxVDUcNLNtuUKM1TG8GO48wbGjX5ILCBcL3AizrRFyUZWjL_QT46_ZM-MB0aKtW4HQhv1"
+ "BQ9x6Xi0hLNHJUXxk06U21ML4bwBIS9W_A_nD3qOw-3ZDosr8WwIrIKnSwY0vkW9fwL-sRgaiDwYzrlN" + "qYdC8q_mHirPefHJgv8lUqoCWEzn-GtsnAuES_oEbbOUPv0RWfGxfO3abs15Isst9bXlqVksRNjRDlxy"
+ "zQ9f-FF_oT4CJjMuvgiAeYi8_5-W81nozHvuBIhzz-2J4hSDZ62rdjY9bLT6JpDBI13SibwdRjECz4nK" + "tskod5Cprx7o0Bg0k02rUH4xKHVrF2d_TT0ddUCMCWD6dHpxoXjJhmSO28fcsUvLUp-ZVhcKbzjLEtsK"
+ "b3kGXTfnVAZuJog6mzInmVABPPAYso0dTRs8ErLGzlKlmaaEXSyxHPKTHLoNoZqn8fdO-L6S-TXdJu6R" + "zKEb_qCgGJ2M5oox6AMeZ3ObM6rxgniLYttxZR2NG-FycwYoAJ-uobIhPqHIiSkTEC_ZjOrK8efAESo0"
+ "c-1cwePB1FgU_cwOn45jpHSfDGm7GvwAIAETpri3"; + "jXE2mDblV9P2uoMZZIjWjSC5HJwVPfV3evcMs12Kbf7rm2_T0000";
/* /*
* Special thanks to our sponsors and donors: * Special thanks to our sponsors and donors:
* *
* - Noam Tamim * - Noam Tamim
*/ */
@Override @Override

View File

@ -291,6 +291,8 @@ public class EpsGraphics {
curvetoNoMacro(coord[0] + x, coord[1] + y, coord[2] + x, coord[3] + y, coord[4] + x, coord[5] + y); curvetoNoMacro(coord[0] + x, coord[1] + y, coord[2] + x, coord[3] + y, coord[4] + x, coord[5] + y);
} else if (type == USegmentType.SEG_CLOSE) { } else if (type == USegmentType.SEG_CLOSE) {
// Nothing // Nothing
} else if (type == USegmentType.SEG_ARCTO) {
// Nothing
} else { } else {
Log.println("unknown1 " + seg); Log.println("unknown1 " + seg);
} }
@ -315,6 +317,8 @@ public class EpsGraphics {
curvetoNoMacro(coord[0] + x, coord[1] + y, coord[2] + x, coord[3] + y, coord[4] + x, coord[5] + y); curvetoNoMacro(coord[0] + x, coord[1] + y, coord[2] + x, coord[3] + y, coord[4] + x, coord[5] + y);
} else if (type == USegmentType.SEG_CLOSE) { } else if (type == USegmentType.SEG_CLOSE) {
// Nothing // Nothing
} else if (type == USegmentType.SEG_ARCTO) {
// Nothing
} else { } else {
Log.println("unknown2 " + seg); Log.println("unknown2 " + seg);
} }

View File

@ -208,12 +208,12 @@ public abstract class PSystemError extends AbstractPSystem {
return new ImageDataSimple(1, 1); return new ImageDataSimple(1, 1);
} }
// final boolean useRed = fileFormat.isUseRedForError();
final TextBlockBackcolored result = getGraphicalFormatted(); final TextBlockBackcolored result = getGraphicalFormatted();
TextBlock udrawable; TextBlock udrawable;
final ImageBuilder imageBuilder = new ImageBuilder(new ColorMapperIdentity(), 1.0, result.getBackcolor(), final ImageBuilder imageBuilder = new ImageBuilder(new ColorMapperIdentity(), 1.0, result.getBackcolor(),
getMetadata(), null, 0, 0, null, false); getMetadata(), null, 0, 0, null, false);
imageBuilder.setRandomPixel(true);
if (getSource().getTotalLineCount() < 5) { if (getSource().getTotalLineCount() < 5) {
udrawable = addWelcome(result); udrawable = addWelcome(result);
} else { } else {
@ -242,13 +242,6 @@ public abstract class PSystemError extends AbstractPSystem {
} }
} }
// private String getRed(boolean useRed) {
// if (useRed) {
// return "#CD0A0A";
// }
// return "red";
// }
//
final public DiagramDescription getDescription() { final public DiagramDescription getDescription() {
return new DiagramDescription("(Error)"); return new DiagramDescription("(Error)");
} }

View File

@ -66,6 +66,7 @@ public class GraphicStrings extends AbstractTextBlock implements IEntityImage {
private final List<String> strings; private final List<String> strings;
private final BufferedImage image; private final BufferedImage image;
private final double imagePadding = 30;
private final GraphicPosition position; private final GraphicPosition position;
@ -174,9 +175,9 @@ public class GraphicStrings extends AbstractTextBlock implements IEntityImage {
if (position == GraphicPosition.BOTTOM) { if (position == GraphicPosition.BOTTOM) {
dim = new Dimension2DDouble(dim.getWidth(), dim.getHeight() + image.getHeight()); dim = new Dimension2DDouble(dim.getWidth(), dim.getHeight() + image.getHeight());
} else if (position == GraphicPosition.BACKGROUND_CORNER_BOTTOM_RIGHT) { } else if (position == GraphicPosition.BACKGROUND_CORNER_BOTTOM_RIGHT) {
dim = new Dimension2DDouble(dim.getWidth() + image.getWidth(), dim.getHeight()); dim = new Dimension2DDouble(dim.getWidth() + imagePadding + image.getWidth(), dim.getHeight());
} else if (position == GraphicPosition.BACKGROUND_CORNER_TOP_RIGHT) { } else if (position == GraphicPosition.BACKGROUND_CORNER_TOP_RIGHT) {
dim = new Dimension2DDouble(dim.getWidth() + image.getWidth(), dim.getHeight()); dim = new Dimension2DDouble(dim.getWidth() + imagePadding + image.getWidth(), dim.getHeight());
} }
} }
return dim; return dim;

View File

@ -153,7 +153,11 @@ class USymbolCloud extends USymbol {
private void bubbleLine(Random rnd, List<Point2D> points, Point2D p1, Point2D p2, double bubbleSize) { private void bubbleLine(Random rnd, List<Point2D> points, Point2D p1, Point2D p2, double bubbleSize) {
final CoordinateChange change = new CoordinateChange(p1, p2); final CoordinateChange change = new CoordinateChange(p1, p2);
final double length = change.getLength(); final double length = change.getLength();
final int nb = (int) (length / bubbleSize); int nb = (int) (length / bubbleSize);
if (nb == 0) {
bubbleSize = length / 2;
nb = (int) (length / bubbleSize);
}
for (int i = 0; i < nb; i++) { for (int i = 0; i < nb; i++) {
points.add(rnd(rnd, change.getTrueCoordinate(i * length / nb, 0), bubbleSize * .2)); points.add(rnd(rnd, change.getTrueCoordinate(i * length / nb, 0), bubbleSize * .2));
} }
@ -239,7 +243,8 @@ class USymbolCloud extends USymbol {
@Override @Override
public TextBlock asBig(final TextBlock title, HorizontalAlignment labelAlignment, final TextBlock stereotype, public TextBlock asBig(final TextBlock title, HorizontalAlignment labelAlignment, final TextBlock stereotype,
final double width, final double height, final SymbolContext symbolContext, final HorizontalAlignment stereoAlignment) { final double width, final double height, final SymbolContext symbolContext,
final HorizontalAlignment stereoAlignment) {
return new AbstractTextBlock() { return new AbstractTextBlock() {
public void drawU(UGraphic ug) { public void drawU(UGraphic ug) {

View File

@ -72,6 +72,7 @@ public class FingerImpl implements Finger, UDrawable {
private final Display label; private final Display label;
private final HtmlColor backColor; private final HtmlColor backColor;
private final String stereotype;
private final ISkinParam skinParam; private final ISkinParam skinParam;
private final StyleBuilder styleBuilder; private final StyleBuilder styleBuilder;
private final IdeaShape shape; private final IdeaShape shape;
@ -83,23 +84,25 @@ public class FingerImpl implements Finger, UDrawable {
private final List<FingerImpl> nail = new ArrayList<FingerImpl>(); private final List<FingerImpl> nail = new ArrayList<FingerImpl>();
private Tetris tetris = null; private Tetris tetris = null;
public StyleSignature getDefaultStyleDefinitionNode() { private StyleSignature getDefaultStyleDefinitionNode() {
if (level == 0) { if (level == 0) {
return StyleSignature.of(SName.root, SName.element, SName.mindmapDiagram, SName.node, SName.rootNode); return StyleSignature.of(SName.root, SName.element, SName.mindmapDiagram, SName.node, SName.rootNode).add(
stereotype);
} }
if (nail.size() == 0) { if (nail.size() == 0) {
return StyleSignature.of(SName.root, SName.element, SName.mindmapDiagram, SName.node, SName.leafNode); return StyleSignature.of(SName.root, SName.element, SName.mindmapDiagram, SName.node, SName.leafNode).add(
stereotype);
} }
return StyleSignature.of(SName.root, SName.element, SName.mindmapDiagram, SName.node); return StyleSignature.of(SName.root, SName.element, SName.mindmapDiagram, SName.node).add(stereotype);
} }
public StyleSignature getDefaultStyleDefinitionArrow() { public StyleSignature getDefaultStyleDefinitionArrow() {
return StyleSignature.of(SName.root, SName.element, SName.mindmapDiagram, SName.arrow); return StyleSignature.of(SName.root, SName.element, SName.mindmapDiagram, SName.arrow).add(stereotype);
} }
public static FingerImpl build(Idea idea, ISkinParam skinParam, Direction direction) { public static FingerImpl build(Idea idea, ISkinParam skinParam, Direction direction) {
final FingerImpl result = new FingerImpl(idea.getStyleBuilder(), idea.getBackColor(), idea.getLabel(), final FingerImpl result = new FingerImpl(idea.getStyleBuilder(), idea.getBackColor(), idea.getLabel(),
skinParam, idea.getShape(), direction, idea.getLevel()); skinParam, idea.getShape(), direction, idea.getLevel(), idea.getStereotype());
for (Idea child : idea.getChildren()) { for (Idea child : idea.getChildren()) {
result.addInNail(build(child, skinParam, direction)); result.addInNail(build(child, skinParam, direction));
} }
@ -112,8 +115,9 @@ public class FingerImpl implements Finger, UDrawable {
} }
private FingerImpl(StyleBuilder styleBuilder, HtmlColor backColor, Display label, ISkinParam skinParam, private FingerImpl(StyleBuilder styleBuilder, HtmlColor backColor, Display label, ISkinParam skinParam,
IdeaShape shape, Direction direction, int level) { IdeaShape shape, Direction direction, int level, String stereotype) {
this.backColor = backColor; this.backColor = backColor;
this.stereotype = stereotype;
this.level = level; this.level = level;
this.label = label; this.label = label;
this.skinParam = skinParam; this.skinParam = skinParam;

View File

@ -57,14 +57,15 @@ class Idea {
private final IdeaShape shape; private final IdeaShape shape;
private final HtmlColor backColor; private final HtmlColor backColor;
private final StyleBuilder styleBuilder; private final StyleBuilder styleBuilder;
private final String stereotype;
public Idea(StyleBuilder styleBuilder, Display label, IdeaShape shape) { public Idea(StyleBuilder styleBuilder, Display label, IdeaShape shape, String stereotype) {
this(styleBuilder, null, 0, null, label, shape); this(styleBuilder, null, 0, null, label, shape, stereotype);
} }
public Idea createIdea(StyleBuilder styleBuilder, HtmlColor backColor, int newLevel, Display newDisplay, public Idea createIdea(StyleBuilder styleBuilder, HtmlColor backColor, int newLevel, Display newDisplay,
IdeaShape newShape) { IdeaShape newShape, String stereotype) {
final Idea result = new Idea(styleBuilder, backColor, newLevel, this, newDisplay, newShape); final Idea result = new Idea(styleBuilder, backColor, newLevel, this, newDisplay, newShape, stereotype);
this.children.add(result); this.children.add(result);
return result; return result;
} }
@ -77,13 +78,15 @@ class Idea {
// return result; // return result;
// } // }
private Idea(StyleBuilder styleBuilder, HtmlColor backColor, int level, Idea parent, Display label, IdeaShape shape) { private Idea(StyleBuilder styleBuilder, HtmlColor backColor, int level, Idea parent, Display label,
IdeaShape shape, String stereotype) {
this.backColor = backColor; this.backColor = backColor;
this.styleBuilder = styleBuilder; this.styleBuilder = styleBuilder;
this.label = label; this.label = label;
this.level = level; this.level = level;
this.parent = parent; this.parent = parent;
this.shape = shape; this.shape = shape;
this.stereotype = stereotype;
} }
@Override @Override
@ -123,4 +126,8 @@ class Idea {
return styleBuilder; return styleBuilder;
} }
public final String getStereotype() {
return stereotype;
}
} }

View File

@ -49,6 +49,7 @@ import net.sourceforge.plantuml.Scale;
import net.sourceforge.plantuml.UmlDiagram; import net.sourceforge.plantuml.UmlDiagram;
import net.sourceforge.plantuml.UmlDiagramType; import net.sourceforge.plantuml.UmlDiagramType;
import net.sourceforge.plantuml.command.CommandExecutionResult; import net.sourceforge.plantuml.command.CommandExecutionResult;
import net.sourceforge.plantuml.command.regex.Matcher2;
import net.sourceforge.plantuml.core.DiagramDescription; import net.sourceforge.plantuml.core.DiagramDescription;
import net.sourceforge.plantuml.core.ImageData; import net.sourceforge.plantuml.core.ImageData;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
@ -62,6 +63,7 @@ import net.sourceforge.plantuml.ugraphic.ImageBuilder;
import net.sourceforge.plantuml.ugraphic.MinMax; import net.sourceforge.plantuml.ugraphic.MinMax;
import net.sourceforge.plantuml.ugraphic.UGraphic; import net.sourceforge.plantuml.ugraphic.UGraphic;
import net.sourceforge.plantuml.ugraphic.UTranslate; import net.sourceforge.plantuml.ugraphic.UTranslate;
import net.sourceforge.plantuml.wbs.WBSDiagram;
public class MindMapDiagram extends UmlDiagram { public class MindMapDiagram extends UmlDiagram {
@ -179,19 +181,25 @@ public class MindMapDiagram extends UmlDiagram {
public CommandExecutionResult addIdea(HtmlColor backColor, int level, String label, IdeaShape shape, public CommandExecutionResult addIdea(HtmlColor backColor, int level, String label, IdeaShape shape,
Direction direction) { Direction direction) {
final Matcher2 m = WBSDiagram.patternStereotype.matcher(label);
String stereotype = null;
if (m.matches()) {
label = m.group(1);
stereotype = m.group(2);
}
if (level == 0) { if (level == 0) {
if (this.right.root != null) { if (this.right.root != null) {
return CommandExecutionResult return CommandExecutionResult
.error("I don't know how to draw multi-root diagram. You should suggest an image so that the PlantUML team implements it :-)"); .error("I don't know how to draw multi-root diagram. You should suggest an image so that the PlantUML team implements it :-)");
} }
right.initRoot(getSkinParam().getCurrentStyleBuilder(), label, shape); right.initRoot(getSkinParam().getCurrentStyleBuilder(), label, shape, stereotype);
left.initRoot(getSkinParam().getCurrentStyleBuilder(), label, shape); left.initRoot(getSkinParam().getCurrentStyleBuilder(), label, shape, stereotype);
return CommandExecutionResult.ok(); return CommandExecutionResult.ok();
} }
if (direction == Direction.LEFT) { if (direction == Direction.LEFT) {
return left.add(getSkinParam().getCurrentStyleBuilder(), backColor, level, label, shape); return left.add(getSkinParam().getCurrentStyleBuilder(), backColor, level, label, shape, stereotype);
} }
return right.add(getSkinParam().getCurrentStyleBuilder(), backColor, level, label, shape); return right.add(getSkinParam().getCurrentStyleBuilder(), backColor, level, label, shape, stereotype);
} }
static class Branch { static class Branch {
@ -199,8 +207,8 @@ public class MindMapDiagram extends UmlDiagram {
private Idea last; private Idea last;
private Finger finger; private Finger finger;
private void initRoot(StyleBuilder styleBuilder, String label, IdeaShape shape) { private void initRoot(StyleBuilder styleBuilder, String label, IdeaShape shape, String stereotype) {
root = new Idea(styleBuilder, Display.getWithNewlines(label), shape); root = new Idea(styleBuilder, Display.getWithNewlines(label), shape, stereotype);
last = root; last = root;
} }
@ -213,17 +221,20 @@ public class MindMapDiagram extends UmlDiagram {
} }
private CommandExecutionResult add(StyleBuilder styleBuilder, HtmlColor backColor, int level, String label, private CommandExecutionResult add(StyleBuilder styleBuilder, HtmlColor backColor, int level, String label,
IdeaShape shape) { IdeaShape shape, String stereotype) {
if (last == null) {
return CommandExecutionResult.error("Check your indentation ?");
}
if (level == last.getLevel() + 1) { if (level == last.getLevel() + 1) {
final Idea newIdea = last.createIdea(styleBuilder, backColor, level, Display.getWithNewlines(label), final Idea newIdea = last.createIdea(styleBuilder, backColor, level, Display.getWithNewlines(label),
shape); shape, stereotype);
last = newIdea; last = newIdea;
return CommandExecutionResult.ok(); return CommandExecutionResult.ok();
} }
if (level <= last.getLevel()) { if (level <= last.getLevel()) {
final int diff = last.getLevel() - level + 1; final int diff = last.getLevel() - level + 1;
final Idea newIdea = getParentOfLast(diff).createIdea(styleBuilder, backColor, level, final Idea newIdea = getParentOfLast(diff).createIdea(styleBuilder, backColor, level,
Display.getWithNewlines(label), shape); Display.getWithNewlines(label), shape, stereotype);
last = newIdea; last = newIdea;
return CommandExecutionResult.ok(); return CommandExecutionResult.ok();
} }

View File

@ -58,6 +58,10 @@ public class FileWithSuffix {
private final String entry; private final String entry;
private final String description; private final String description;
@Override
public String toString() {
return file.toString();
}
public Reader getReader(String charset) throws IOException { public Reader getReader(String charset) throws IOException {
if (entry == null) { if (entry == null) {
if (charset == null) { if (charset == null) {

View File

@ -41,7 +41,6 @@ import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import net.sourceforge.plantuml.OptionFlags;
import net.sourceforge.plantuml.Url; import net.sourceforge.plantuml.Url;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.skin.ArrowConfiguration; import net.sourceforge.plantuml.skin.ArrowConfiguration;

View File

@ -57,7 +57,6 @@ import net.sourceforge.plantuml.style.PName;
import net.sourceforge.plantuml.style.Style; import net.sourceforge.plantuml.style.Style;
import net.sourceforge.plantuml.style.StyleBuilder; import net.sourceforge.plantuml.style.StyleBuilder;
import net.sourceforge.plantuml.style.StyleSignature; import net.sourceforge.plantuml.style.StyleSignature;
import net.sourceforge.plantuml.style.ValueImpl;
import net.sourceforge.plantuml.style.WithStyle; import net.sourceforge.plantuml.style.WithStyle;
import net.sourceforge.plantuml.ugraphic.UGraphic; import net.sourceforge.plantuml.ugraphic.UGraphic;
import net.sourceforge.plantuml.ugraphic.UTranslate; import net.sourceforge.plantuml.ugraphic.UTranslate;
@ -78,7 +77,7 @@ public class Englober implements WithStyle {
} }
public Style[] getUsedStyles() { public Style[] getUsedStyles() {
Style tmp = getDefaultStyleDefinition().getMergedStyle(styleBuilder); Style tmp = getDefaultStyleDefinition().with(participantEnglober.getStereotype()).getMergedStyle(styleBuilder);
final HtmlColor backColor = participantEnglober.getBoxColor(); final HtmlColor backColor = participantEnglober.getBoxColor();
if (tmp != null) { if (tmp != null) {
tmp = tmp.eventuallyOverride(PName.BackGroundColor, backColor); tmp = tmp.eventuallyOverride(PName.BackGroundColor, backColor);

View File

@ -44,7 +44,6 @@ 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.HtmlColor;
import net.sourceforge.plantuml.graphic.HtmlColorAndStyle;
import net.sourceforge.plantuml.graphic.Rainbow; import net.sourceforge.plantuml.graphic.Rainbow;
import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.StringBounder;
import net.sourceforge.plantuml.graphic.TextBlock; import net.sourceforge.plantuml.graphic.TextBlock;

View File

@ -37,9 +37,7 @@ package net.sourceforge.plantuml.sequencediagram;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.skin.ArrowConfiguration; import net.sourceforge.plantuml.skin.ArrowConfiguration;
import net.sourceforge.plantuml.style.Style;
import net.sourceforge.plantuml.style.StyleBuilder; import net.sourceforge.plantuml.style.StyleBuilder;
import net.sourceforge.plantuml.style.StyleSignature;
public class MessageExo extends AbstractMessage { public class MessageExo extends AbstractMessage {

View File

@ -38,7 +38,6 @@ package net.sourceforge.plantuml.sequencediagram;
import java.util.List; import java.util.List;
import net.sourceforge.plantuml.ISkinParam; import net.sourceforge.plantuml.ISkinParam;
import net.sourceforge.plantuml.OptionFlags;
import net.sourceforge.plantuml.SkinParam; import net.sourceforge.plantuml.SkinParam;
import net.sourceforge.plantuml.SpecificBackcolorable; import net.sourceforge.plantuml.SpecificBackcolorable;
import net.sourceforge.plantuml.Url; import net.sourceforge.plantuml.Url;

View File

@ -50,7 +50,6 @@ import net.sourceforge.plantuml.graphic.HtmlColor;
import net.sourceforge.plantuml.graphic.SymbolContext; import net.sourceforge.plantuml.graphic.SymbolContext;
import net.sourceforge.plantuml.graphic.color.ColorType; import net.sourceforge.plantuml.graphic.color.ColorType;
import net.sourceforge.plantuml.graphic.color.Colors; import net.sourceforge.plantuml.graphic.color.Colors;
import net.sourceforge.plantuml.style.SName;
import net.sourceforge.plantuml.style.Style; import net.sourceforge.plantuml.style.Style;
import net.sourceforge.plantuml.style.StyleBuilder; import net.sourceforge.plantuml.style.StyleBuilder;
import net.sourceforge.plantuml.style.StyleSignature; import net.sourceforge.plantuml.style.StyleSignature;
@ -73,15 +72,16 @@ public class Participant implements SpecificBackcolorable, WithStyle {
// private Style style; // private Style style;
public StyleSignature getDefaultStyleDefinition() { public StyleSignature getDefaultStyleDefinition() {
return type.getDefaultStyleDefinition(); return type.getDefaultStyleDefinition().addClickable(getUrl());
} }
public Style[] getUsedStyles() { public Style[] getUsedStyles() {
if (SkinParam.USE_STYLES() == false) { if (SkinParam.USE_STYLES() == false) {
return null; return null;
} }
Style tmp = getDefaultStyleDefinition().with(stereotype).getMergedStyle(styleBuilder) final StyleSignature signature = getDefaultStyleDefinition().with(stereotype);
.eventuallyOverride(getColors(null)); Style tmp = signature.getMergedStyle(styleBuilder);
tmp = tmp.eventuallyOverride(getColors(null));
Style stereo = getDefaultStyleDefinition().withStereotype(stereotype).getMergedStyle(styleBuilder); Style stereo = getDefaultStyleDefinition().withStereotype(stereotype).getMergedStyle(styleBuilder);
if (tmp != null) { if (tmp != null) {
stereo = tmp.mergeWith(stereo); stereo = tmp.mergeWith(stereo);

View File

@ -36,16 +36,19 @@
package net.sourceforge.plantuml.sequencediagram; package net.sourceforge.plantuml.sequencediagram;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.cucadiagram.Stereotype;
import net.sourceforge.plantuml.graphic.HtmlColor; import net.sourceforge.plantuml.graphic.HtmlColor;
public class ParticipantEnglober { public class ParticipantEnglober {
final private Display title; final private Display title;
final private HtmlColor boxColor; final private HtmlColor boxColor;
final private Stereotype stereotype;
public ParticipantEnglober(Display title, HtmlColor boxColor) { public ParticipantEnglober(Display title, HtmlColor boxColor, Stereotype stereotype) {
this.title = title; this.title = title;
this.boxColor = boxColor; this.boxColor = boxColor;
this.stereotype = stereotype;
} }
public final Display getTitle() { public final Display getTitle() {
@ -56,5 +59,8 @@ public class ParticipantEnglober {
return boxColor; return boxColor;
} }
public final Stereotype getStereotype() {
return stereotype;
}
} }

View File

@ -37,8 +37,8 @@ package net.sourceforge.plantuml.sequencediagram;
import net.sourceforge.plantuml.ColorParam; import net.sourceforge.plantuml.ColorParam;
import net.sourceforge.plantuml.style.SName; import net.sourceforge.plantuml.style.SName;
import net.sourceforge.plantuml.style.Styleable;
import net.sourceforge.plantuml.style.StyleSignature; import net.sourceforge.plantuml.style.StyleSignature;
import net.sourceforge.plantuml.style.Styleable;
public enum ParticipantType implements Styleable { public enum ParticipantType implements Styleable {
PARTICIPANT(ColorParam.participantBackground), // PARTICIPANT(ColorParam.participantBackground), //

View File

@ -42,7 +42,6 @@ import java.util.List;
import net.sourceforge.plantuml.Url; import net.sourceforge.plantuml.Url;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.graphic.HtmlColor; import net.sourceforge.plantuml.graphic.HtmlColor;
import net.sourceforge.plantuml.skin.ComponentType;
import net.sourceforge.plantuml.style.PName; import net.sourceforge.plantuml.style.PName;
import net.sourceforge.plantuml.style.SName; import net.sourceforge.plantuml.style.SName;
import net.sourceforge.plantuml.style.Style; import net.sourceforge.plantuml.style.Style;

View File

@ -61,6 +61,7 @@ import net.sourceforge.plantuml.core.DiagramDescription;
import net.sourceforge.plantuml.core.ImageData; import net.sourceforge.plantuml.core.ImageData;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.cucadiagram.EntityPortion; import net.sourceforge.plantuml.cucadiagram.EntityPortion;
import net.sourceforge.plantuml.cucadiagram.Stereotype;
import net.sourceforge.plantuml.graphic.HtmlColor; import net.sourceforge.plantuml.graphic.HtmlColor;
import net.sourceforge.plantuml.graphic.SymbolContext; import net.sourceforge.plantuml.graphic.SymbolContext;
import net.sourceforge.plantuml.sequencediagram.graphic.FileMaker; import net.sourceforge.plantuml.sequencediagram.graphic.FileMaker;
@ -391,11 +392,11 @@ public class SequenceDiagram extends UmlDiagram {
private ParticipantEnglober participantEnglober; private ParticipantEnglober participantEnglober;
public void boxStart(Display comment, HtmlColor color) { public void boxStart(Display comment, HtmlColor color, Stereotype stereotype) {
if (participantEnglober != null) { if (participantEnglober != null) {
throw new IllegalStateException(); throw new IllegalStateException();
} }
this.participantEnglober = new ParticipantEnglober(comment, color); this.participantEnglober = new ParticipantEnglober(comment, color, stereotype);
} }
public void endBox() { public void endBox() {

View File

@ -75,7 +75,6 @@ import net.sourceforge.plantuml.sequencediagram.command.CommandParticipantA4;
import net.sourceforge.plantuml.sequencediagram.command.CommandReferenceMultilinesOverSeveral; import net.sourceforge.plantuml.sequencediagram.command.CommandReferenceMultilinesOverSeveral;
import net.sourceforge.plantuml.sequencediagram.command.CommandReferenceOverSeveral; import net.sourceforge.plantuml.sequencediagram.command.CommandReferenceOverSeveral;
import net.sourceforge.plantuml.sequencediagram.command.CommandReturn; import net.sourceforge.plantuml.sequencediagram.command.CommandReturn;
import net.sourceforge.plantuml.sequencediagram.command.CommandSkin;
import net.sourceforge.plantuml.sequencediagram.command.CommandUrl; import net.sourceforge.plantuml.sequencediagram.command.CommandUrl;
public class SequenceDiagramFactory extends UmlDiagramFactory { public class SequenceDiagramFactory extends UmlDiagramFactory {

View File

@ -35,6 +35,8 @@
*/ */
package net.sourceforge.plantuml.sequencediagram.command; package net.sourceforge.plantuml.sequencediagram.command;
import net.sourceforge.plantuml.FontParam;
import net.sourceforge.plantuml.ISkinParam;
import net.sourceforge.plantuml.LineLocation; import net.sourceforge.plantuml.LineLocation;
import net.sourceforge.plantuml.command.CommandExecutionResult; import net.sourceforge.plantuml.command.CommandExecutionResult;
import net.sourceforge.plantuml.command.SingleLineCommand2; import net.sourceforge.plantuml.command.SingleLineCommand2;
@ -45,10 +47,12 @@ import net.sourceforge.plantuml.command.regex.RegexOptional;
import net.sourceforge.plantuml.command.regex.RegexOr; import net.sourceforge.plantuml.command.regex.RegexOr;
import net.sourceforge.plantuml.command.regex.RegexResult; import net.sourceforge.plantuml.command.regex.RegexResult;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.cucadiagram.Stereotype;
import net.sourceforge.plantuml.graphic.color.ColorParser; import net.sourceforge.plantuml.graphic.color.ColorParser;
import net.sourceforge.plantuml.graphic.color.ColorType; import net.sourceforge.plantuml.graphic.color.ColorType;
import net.sourceforge.plantuml.graphic.color.Colors; import net.sourceforge.plantuml.graphic.color.Colors;
import net.sourceforge.plantuml.sequencediagram.SequenceDiagram; import net.sourceforge.plantuml.sequencediagram.SequenceDiagram;
import net.sourceforge.plantuml.ugraphic.UFont;
public class CommandBoxStart extends SingleLineCommand2<SequenceDiagram> { public class CommandBoxStart extends SingleLineCommand2<SequenceDiagram> {
@ -67,7 +71,9 @@ public class CommandBoxStart extends SingleLineCommand2<SequenceDiagram> {
RegexLeaf.spaceOneOrMore(), // RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("NAME2", "([^#]+)")))), // new RegexLeaf("NAME2", "([^#]+)")))), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
color().getRegex(), RegexLeaf.end()); new RegexLeaf("STEREO", "(\\<\\<.*\\>\\>)?"), //
color().getRegex(), //
RegexLeaf.end());
} }
private static ColorParser color() { private static ColorParser color() {
@ -75,16 +81,24 @@ public class CommandBoxStart extends SingleLineCommand2<SequenceDiagram> {
} }
@Override @Override
protected CommandExecutionResult executeArg(SequenceDiagram diagram, LineLocation location, RegexResult arg2) { protected CommandExecutionResult executeArg(SequenceDiagram diagram, LineLocation location, RegexResult arg) {
if (diagram.isBoxPending()) { if (diagram.isBoxPending()) {
return CommandExecutionResult.error("Box cannot be nested"); return CommandExecutionResult.error("Box cannot be nested");
} }
final String argTitle = arg2.getLazzy("NAME", 0); final String argTitle = arg.getLazzy("NAME", 0);
final String argColor = arg2.get("COLOR", 0); final String argColor = arg.get("COLOR", 0);
final String stereo = arg.get("STEREO", 0);
Stereotype stereotype = null;
if (stereo != null) {
final ISkinParam skinParam = diagram.getSkinParam();
stereotype = new Stereotype(stereo);
}
// final HtmlColor color = diagram.getSkinParam().getIHtmlColorSet().getColorIfValid(argColor); // final HtmlColor color = diagram.getSkinParam().getIHtmlColorSet().getColorIfValid(argColor);
Colors colors = color().getColor(arg2, diagram.getSkinParam().getIHtmlColorSet()); Colors colors = color().getColor(arg, diagram.getSkinParam().getIHtmlColorSet());
final String title = argTitle == null ? "" : argTitle; final String title = argTitle == null ? "" : argTitle;
diagram.boxStart(Display.getWithNewlines(title), colors.getColor(ColorType.BACK)); diagram.boxStart(Display.getWithNewlines(title), colors.getColor(ColorType.BACK), stereotype);
return CommandExecutionResult.ok(); return CommandExecutionResult.ok();
} }

View File

@ -264,7 +264,8 @@ class Step1Message extends Step1Abstract {
} }
if (m.getArrowConfiguration().getDressing2().getHead() == ArrowHead.CROSSX) { if (m.getArrowConfiguration().getDressing2().getHead() == ArrowHead.CROSSX) {
result = result.withHead2(m.getArrowConfiguration().getDressing2().getHead()); result = result.withHead2(m.getArrowConfiguration().getDressing2().getHead());
System.err.println("WARNING : CROSSX"); // System.err.println("WARNING : CROSSX");
// Thread.dumpStack();
// assert false; // assert false;
} }
result = result.withPart(m.getArrowConfiguration().getPart()); result = result.withPart(m.getArrowConfiguration().getPart());

View File

@ -103,7 +103,6 @@ public class NoteTile extends AbstractTile implements Tile {
ug = ug.apply(new UTranslate(x, 0)); ug = ug.apply(new UTranslate(x, 0));
comp.drawU(ug, area, (Context2D) ug); comp.drawU(ug, area, (Context2D) ug);
// ug.draw(new ULine(x2 - x1, 0));
} }
private double getUsedWidth(StringBounder stringBounder) { private double getUsedWidth(StringBounder stringBounder) {

View File

@ -76,9 +76,10 @@ public class ComponentRoseArrow extends AbstractComponentRoseArrow {
boolean belowForResponse) { boolean belowForResponse) {
super(style, foregroundColor, font, stringsToDisplay, arrowConfiguration, spriteContainer, super(style, foregroundColor, font, stringsToDisplay, arrowConfiguration, spriteContainer,
textHorizontalAlignment, maxMessageSize); textHorizontalAlignment, maxMessageSize);
if (SkinParam.USE_STYLES()) { // Done in Rose::createComponentArrow
messagePosition = style.getHorizontalAlignment(); // if (SkinParam.USE_STYLES()) {
} // messagePosition = style.getHorizontalAlignment();
// }
this.messagePosition = messagePosition; this.messagePosition = messagePosition;
this.niceArrow = niceArrow; this.niceArrow = niceArrow;
this.belowForResponse = belowForResponse; this.belowForResponse = belowForResponse;

View File

@ -41,6 +41,7 @@ import net.sourceforge.plantuml.ISkinSimple;
import net.sourceforge.plantuml.LineBreakStrategy; import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.OptionFlags; import net.sourceforge.plantuml.OptionFlags;
import net.sourceforge.plantuml.SkinParam; import net.sourceforge.plantuml.SkinParam;
import net.sourceforge.plantuml.SkinParamBackcolored;
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,6 +70,10 @@ public class ComponentRoseGroupingElse extends AbstractTextualComponent {
super(style, LineBreakStrategy.NONE, comment == null ? null : "[" + comment + "]", smallFont, super(style, LineBreakStrategy.NONE, comment == null ? null : "[" + comment + "]", smallFont,
HorizontalAlignment.LEFT, 5, 5, 1, spriteContainer, null, null); HorizontalAlignment.LEFT, 5, 5, 1, spriteContainer, null, null);
if (SkinParam.USE_STYLES()) { if (SkinParam.USE_STYLES()) {
if (spriteContainer instanceof SkinParamBackcolored) {
style = style.eventuallyOverride(PName.BackGroundColor,
((SkinParamBackcolored) spriteContainer).getBackgroundColor());
}
this.groupBorder = style.value(PName.LineColor).asColor(getIHtmlColorSet()); this.groupBorder = style.value(PName.LineColor).asColor(getIHtmlColorSet());
this.backgroundColor = style.value(PName.BackGroundColor).asColor(getIHtmlColorSet()); this.backgroundColor = style.value(PName.BackGroundColor).asColor(getIHtmlColorSet());
} else { } else {

View File

@ -36,6 +36,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.SkinParam;
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;
@ -43,6 +44,7 @@ import net.sourceforge.plantuml.graphic.StringBounder;
import net.sourceforge.plantuml.graphic.SymbolContext; import net.sourceforge.plantuml.graphic.SymbolContext;
import net.sourceforge.plantuml.skin.AbstractTextualComponent; import net.sourceforge.plantuml.skin.AbstractTextualComponent;
import net.sourceforge.plantuml.skin.Area; import net.sourceforge.plantuml.skin.Area;
import net.sourceforge.plantuml.style.PName;
import net.sourceforge.plantuml.style.Style; import net.sourceforge.plantuml.style.Style;
import net.sourceforge.plantuml.ugraphic.UGraphic; import net.sourceforge.plantuml.ugraphic.UGraphic;
import net.sourceforge.plantuml.ugraphic.URectangle; import net.sourceforge.plantuml.ugraphic.URectangle;
@ -57,8 +59,13 @@ final public class ComponentRoseNoteBox extends AbstractTextualComponent {
public ComponentRoseNoteBox(Style style, SymbolContext symbolContext, FontConfiguration font, Display strings, public ComponentRoseNoteBox(Style style, SymbolContext symbolContext, FontConfiguration font, Display strings,
ISkinSimple spriteContainer, double roundCorner, HorizontalAlignment alignment) { ISkinSimple spriteContainer, double roundCorner, HorizontalAlignment alignment) {
super(style, spriteContainer.wrapWidth(), strings, font, alignment, 4, 4, 4, spriteContainer, false, null, null); super(style, spriteContainer.wrapWidth(), strings, font, alignment, 4, 4, 4, spriteContainer, false, null, null);
this.roundCorner = roundCorner; if (SkinParam.USE_STYLES()) {
this.symbolContext = symbolContext; this.symbolContext = style.getSymbolContext(getIHtmlColorSet());
this.roundCorner = style.value(PName.RoundCorner).asInt();
} else {
this.symbolContext = symbolContext;
this.roundCorner = roundCorner;
}
} }
@Override @Override

View File

@ -36,6 +36,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.SkinParam;
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;
@ -43,6 +44,7 @@ import net.sourceforge.plantuml.graphic.StringBounder;
import net.sourceforge.plantuml.graphic.SymbolContext; import net.sourceforge.plantuml.graphic.SymbolContext;
import net.sourceforge.plantuml.skin.AbstractTextualComponent; import net.sourceforge.plantuml.skin.AbstractTextualComponent;
import net.sourceforge.plantuml.skin.Area; import net.sourceforge.plantuml.skin.Area;
import net.sourceforge.plantuml.style.PName;
import net.sourceforge.plantuml.style.Style; import net.sourceforge.plantuml.style.Style;
import net.sourceforge.plantuml.ugraphic.UGraphic; import net.sourceforge.plantuml.ugraphic.UGraphic;
import net.sourceforge.plantuml.ugraphic.UPolygon; import net.sourceforge.plantuml.ugraphic.UPolygon;
@ -57,7 +59,11 @@ final public class ComponentRoseNoteHexagonal extends AbstractTextualComponent {
public ComponentRoseNoteHexagonal(Style style, SymbolContext symbolContext, FontConfiguration font, public ComponentRoseNoteHexagonal(Style style, SymbolContext symbolContext, FontConfiguration font,
Display strings, ISkinSimple spriteContainer, HorizontalAlignment alignment) { Display strings, ISkinSimple spriteContainer, HorizontalAlignment alignment) {
super(style, spriteContainer.wrapWidth(), strings, font, alignment, 12, 12, 4, spriteContainer, false, null, null); super(style, spriteContainer.wrapWidth(), strings, font, alignment, 12, 12, 4, spriteContainer, false, null, null);
this.symbolContext = symbolContext; if (SkinParam.USE_STYLES()) {
this.symbolContext = style.getSymbolContext(getIHtmlColorSet());
} else {
this.symbolContext = symbolContext;
}
} }
@Override @Override

View File

@ -42,6 +42,7 @@ 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.PaddingParam;
import net.sourceforge.plantuml.SkinParam;
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;
@ -55,7 +56,10 @@ import net.sourceforge.plantuml.skin.ArrowConfiguration;
import net.sourceforge.plantuml.skin.ArrowDirection; import net.sourceforge.plantuml.skin.ArrowDirection;
import net.sourceforge.plantuml.skin.Component; import net.sourceforge.plantuml.skin.Component;
import net.sourceforge.plantuml.skin.ComponentType; import net.sourceforge.plantuml.skin.ComponentType;
import net.sourceforge.plantuml.style.PName;
import net.sourceforge.plantuml.style.SName;
import net.sourceforge.plantuml.style.Style; import net.sourceforge.plantuml.style.Style;
import net.sourceforge.plantuml.style.StyleSignature;
import net.sourceforge.plantuml.ugraphic.UFont; import net.sourceforge.plantuml.ugraphic.UFont;
import net.sourceforge.plantuml.ugraphic.UStroke; import net.sourceforge.plantuml.ugraphic.UStroke;
@ -307,10 +311,39 @@ public class Rose {
FontParam.ARROW), stringsToDisplay, config, param, param.maxMessageSize(), FontParam.ARROW), stringsToDisplay, config, param, param.maxMessageSize(),
param.strictUmlStyle() == false); param.strictUmlStyle() == false);
} }
final HorizontalAlignment messageHorizontalAlignment = param.getHorizontalAlignment( HorizontalAlignment messageHorizontalAlignment;
AlignmentParam.sequenceMessageAlignment, config.getArrowDirection(), config.isReverseDefine()); final HorizontalAlignment textHorizontalAlignment;
final HorizontalAlignment textHorizontalAlignment = param.getHorizontalAlignment( final ArrowDirection arrowDirection = config.getArrowDirection();
AlignmentParam.sequenceMessageTextAlignment, config.getArrowDirection(), false); if (SkinParam.USE_STYLES()) {
final StyleSignature signature = StyleSignature.of(SName.root, SName.element, SName.sequenceDiagram,
SName.arrow);
final Style textStyle = signature.getMergedStyle(param.getCurrentStyleBuilder());
final String value = textStyle.value(PName.HorizontalAlignment).asString();
messageHorizontalAlignment = textStyle.getHorizontalAlignment();
textHorizontalAlignment = textStyle.getHorizontalAlignment();
if ("direction".equalsIgnoreCase(value)) {
if (arrowDirection == ArrowDirection.LEFT_TO_RIGHT_NORMAL) {
messageHorizontalAlignment = HorizontalAlignment.LEFT;
} else if (arrowDirection == ArrowDirection.RIGHT_TO_LEFT_REVERSE) {
messageHorizontalAlignment = HorizontalAlignment.RIGHT;
} else if (arrowDirection == ArrowDirection.BOTH_DIRECTION) {
messageHorizontalAlignment = HorizontalAlignment.CENTER;
}
} else if ("reversedirection".equalsIgnoreCase(value)) {
if (arrowDirection == ArrowDirection.LEFT_TO_RIGHT_NORMAL) {
messageHorizontalAlignment = HorizontalAlignment.RIGHT;
} else if (arrowDirection == ArrowDirection.RIGHT_TO_LEFT_REVERSE) {
messageHorizontalAlignment = HorizontalAlignment.LEFT;
} else if (arrowDirection == ArrowDirection.BOTH_DIRECTION) {
messageHorizontalAlignment = HorizontalAlignment.CENTER;
}
}
} else {
messageHorizontalAlignment = param.getHorizontalAlignment(AlignmentParam.sequenceMessageAlignment,
arrowDirection, config.isReverseDefine());
textHorizontalAlignment = param.getHorizontalAlignment(AlignmentParam.sequenceMessageTextAlignment,
config.getArrowDirection(), false);
}
return new ComponentRoseArrow(styles == null ? null : styles[0], sequenceArrow, getUFont2(param, return new ComponentRoseArrow(styles == null ? null : styles[0], sequenceArrow, getUFont2(param,
FontParam.ARROW), stringsToDisplay, config, messageHorizontalAlignment, param, textHorizontalAlignment, FontParam.ARROW), stringsToDisplay, config, messageHorizontalAlignment, param, textHorizontalAlignment,
param.maxMessageSize(), param.strictUmlStyle() == false, param.responseMessageBelowArrow()); param.maxMessageSize(), param.strictUmlStyle() == false, param.responseMessageBelowArrow());

View File

@ -30,40 +30,62 @@
* *
* *
* Original Author: Arnaud Roques * Original Author: Arnaud Roques
* *
* *
*/ */
package net.sourceforge.plantuml.classdiagram.command; package net.sourceforge.plantuml.style;
import java.io.File;
import java.io.IOException;
import net.sourceforge.plantuml.FileSystem;
import net.sourceforge.plantuml.LineLocation; import net.sourceforge.plantuml.LineLocation;
import net.sourceforge.plantuml.UmlDiagram;
import net.sourceforge.plantuml.command.BlocLines;
import net.sourceforge.plantuml.command.CommandExecutionResult; import net.sourceforge.plantuml.command.CommandExecutionResult;
import net.sourceforge.plantuml.command.SingleLineCommand2; import net.sourceforge.plantuml.command.SingleLineCommand2;
import net.sourceforge.plantuml.command.regex.IRegex; import net.sourceforge.plantuml.command.regex.IRegex;
import net.sourceforge.plantuml.command.regex.RegexConcat; import net.sourceforge.plantuml.command.regex.RegexConcat;
import net.sourceforge.plantuml.command.regex.RegexLeaf; import net.sourceforge.plantuml.command.regex.RegexLeaf;
import net.sourceforge.plantuml.command.regex.RegexResult; import net.sourceforge.plantuml.command.regex.RegexResult;
import net.sourceforge.plantuml.cucadiagram.CucaDiagram;
public class CommandHideShowSpecificStereotype extends SingleLineCommand2<CucaDiagram> { public class CommandStyleImport extends SingleLineCommand2<UmlDiagram> {
public CommandHideShowSpecificStereotype() { public CommandStyleImport() {
super(getRegexConcat()); super(getRegexConcat());
} }
static IRegex getRegexConcat() { static IRegex getRegexConcat() {
return RegexConcat.build(CommandHideShowSpecificStereotype.class.getName(), RegexLeaf.start(), // return RegexConcat.build(CommandStyleImport.class.getName(), //
new RegexLeaf("COMMAND", "(hide|show)"), // RegexLeaf.start(), //
RegexLeaf.spaceOneOrMore(), // new RegexLeaf("\\<style"), //
new RegexLeaf("STEREOTYPE", "(\\<\\<.*\\>\\>)"), RegexLeaf.end()); RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("\\w+"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("="), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("[%q%g]?"), //
new RegexLeaf("PATH", "([^%q%g]*)"), //
new RegexLeaf("[%q%g]?"), //
new RegexLeaf("\\>"), RegexLeaf.end()); //
} }
@Override @Override
protected CommandExecutionResult executeArg(CucaDiagram diagram, LineLocation location, RegexResult arg) { protected CommandExecutionResult executeArg(UmlDiagram diagram, LineLocation location, RegexResult arg) {
final String path = arg.get("PATH", 0);
// final String stereotype = arg.get("STEREOTYPE", 0); try {
// diagram.hideOrShow(new Stereotype(stereotype), arg.get("COMMAND", 0).equalsIgnoreCase("show")); final File f = FileSystem.getInstance().getFile(path);
// if (f.exists() == false) {
// return CommandExecutionResult.ok(); return CommandExecutionResult.error("File does not exist: " + path);
throw new UnsupportedOperationException(); }
final BlocLines lines = BlocLines.load(f, location);
final StyleBuilder styleBuilder = diagram.getSkinParam().getCurrentStyleBuilder();
for (Style modifiedStyle : StyleLoader.getDeclaredStyles(lines, styleBuilder)) {
diagram.getSkinParam().muteStyle(modifiedStyle);
}
} catch (IOException e) {
return CommandExecutionResult.error("File does not exist: " + path);
}
return CommandExecutionResult.ok();
} }
} }

View File

@ -35,32 +35,18 @@
*/ */
package net.sourceforge.plantuml.style; package net.sourceforge.plantuml.style;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.EnumMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import net.sourceforge.plantuml.SkinParam; import net.sourceforge.plantuml.SkinParam;
import net.sourceforge.plantuml.StringLocated;
import net.sourceforge.plantuml.UmlDiagram; import net.sourceforge.plantuml.UmlDiagram;
import net.sourceforge.plantuml.command.BlocLines; import net.sourceforge.plantuml.command.BlocLines;
import net.sourceforge.plantuml.command.CommandExecutionResult; import net.sourceforge.plantuml.command.CommandExecutionResult;
import net.sourceforge.plantuml.command.CommandMultilines2; import net.sourceforge.plantuml.command.CommandMultilines2;
import net.sourceforge.plantuml.command.MultilinesStrategy; import net.sourceforge.plantuml.command.MultilinesStrategy;
import net.sourceforge.plantuml.command.regex.IRegex; import net.sourceforge.plantuml.command.regex.IRegex;
import net.sourceforge.plantuml.command.regex.Matcher2;
import net.sourceforge.plantuml.command.regex.MyPattern;
import net.sourceforge.plantuml.command.regex.Pattern2;
import net.sourceforge.plantuml.command.regex.RegexConcat; import net.sourceforge.plantuml.command.regex.RegexConcat;
import net.sourceforge.plantuml.command.regex.RegexLeaf; import net.sourceforge.plantuml.command.regex.RegexLeaf;
public class CommandStyleMultilinesCSS extends CommandMultilines2<UmlDiagram> { public class CommandStyleMultilinesCSS extends CommandMultilines2<UmlDiagram> {
public static final String STYLE_SELECTOR_SEPARATOR2 = "-&";
public CommandStyleMultilinesCSS() { public CommandStyleMultilinesCSS() {
super(getRegexConcat(), MultilinesStrategy.REMOVE_STARTING_QUOTE); super(getRegexConcat(), MultilinesStrategy.REMOVE_STARTING_QUOTE);
} }
@ -77,96 +63,15 @@ public class CommandStyleMultilinesCSS extends CommandMultilines2<UmlDiagram> {
); );
} }
private static final String NAME_USER = "[\\w()]+?";
private final static Pattern2 userName = MyPattern.cmpile("^[.:]?(" + NAME_USER + ")([%s]+\\*)?[%s]*\\{$");
private final static Pattern2 propertyAndValue = MyPattern.cmpile("^([\\w]+):?[%s]+(.*?);?$");
private final static Pattern2 closeBracket = MyPattern.cmpile("^\\}$");
protected CommandExecutionResult executeNow(UmlDiagram diagram, BlocLines lines) { protected CommandExecutionResult executeNow(UmlDiagram diagram, BlocLines lines) {
if (SkinParam.USE_STYLES() == false) { if (SkinParam.USE_STYLES() == false) {
return CommandExecutionResult.ok(); return CommandExecutionResult.ok();
} }
final StyleBuilder styleBuilder = diagram.getSkinParam().getCurrentStyleBuilder(); final StyleBuilder styleBuilder = diagram.getSkinParam().getCurrentStyleBuilder();
for (Style modifiedStyle : getDeclaredStyles(lines.subExtract(1, 1), styleBuilder)) { for (Style modifiedStyle : StyleLoader.getDeclaredStyles(lines.subExtract(1, 1), styleBuilder)) {
diagram.getSkinParam().muteStyle(modifiedStyle); diagram.getSkinParam().muteStyle(modifiedStyle);
} }
return CommandExecutionResult.ok(); return CommandExecutionResult.ok();
} }
public Collection<Style> getDeclaredStyles(BlocLines lines, AutomaticCounter counter) {
final List<Style> result = new ArrayList<Style>();
final List<String> context = new ArrayList<String>();
final List<Map<PName, Value>> maps = new ArrayList<Map<PName, Value>>();
boolean inComment = false;
for (StringLocated s : lines) {
String trimmed = s.getTrimmed().getString();
if (trimmed.startsWith("/*") || trimmed.startsWith("/'")) {
inComment = true;
continue;
}
if (trimmed.endsWith("*/") || trimmed.endsWith("'/")) {
inComment = false;
continue;
}
if (inComment) {
continue;
}
final int x = trimmed.lastIndexOf("//");
if (x != -1) {
trimmed = trimmed.substring(0, x).trim();
}
final Matcher2 mUserName = userName.matcher(trimmed);
if (mUserName.find()) {
String n = mUserName.group(1);
final boolean isRecurse = mUserName.group(2) != null;
if (isRecurse) {
n += "*";
}
context.add(n);
maps.add(new EnumMap<PName, Value>(PName.class));
continue;
}
final Matcher2 mPropertyAndValue = propertyAndValue.matcher(trimmed);
if (mPropertyAndValue.find()) {
final PName key = PName.getFromName(mPropertyAndValue.group(1));
final String value = mPropertyAndValue.group(2);
if (key != null) {
maps.get(maps.size() - 1).put(key, new ValueImpl(value, counter));
}
continue;
}
final Matcher2 mCloseBracket = closeBracket.matcher(trimmed);
if (mCloseBracket.find()) {
if (context.size() > 0) {
final StyleSignature signature = contextToSignature(context);
final Style style = new Style(signature, maps.get(maps.size() - 1));
result.add(style);
context.remove(context.size() - 1);
maps.remove(maps.size() - 1);
}
}
}
return Collections.unmodifiableList(result);
}
private StyleSignature contextToSignature(List<String> context) {
StyleSignature result = StyleSignature.empty();
boolean star = false;
for (Iterator<String> it = context.iterator(); it.hasNext();) {
String s = it.next();
if (s.endsWith("*")) {
star = true;
s = s.substring(0, s.length() - 1);
}
result = result.add(s);
}
if (star) {
result = result.addStar();
}
return result;
}
} }

View File

@ -35,154 +35,180 @@
*/ */
package net.sourceforge.plantuml.style; package net.sourceforge.plantuml.style;
import java.util.ArrayList;
import java.util.Collections;
import java.util.EnumMap; import java.util.EnumMap;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.StringTokenizer; import java.util.StringTokenizer;
public class FromSkinparamToStyle { public class FromSkinparamToStyle {
private Style style; static class Data {
final private PName propertyName;
final private SName[] styleNames;
public FromSkinparamToStyle(String key, String value, AutomaticCounter counter) { Data(PName propertyName, SName[] styleNames) {
final Map<PName, Value> map = new EnumMap<PName, Value>(PName.class); this.propertyName = propertyName;
String stereo = null; this.styleNames = styleNames;
}
}
private static final Map<String, List<Data>> knowlegde = new HashMap<String, List<Data>>();
static {
addConvert("participantClickableBackgroundColor", PName.BackGroundColor, SName.participant, SName.clickable);
addConvert("participantClickableBorderColor", PName.LineColor, SName.participant, SName.clickable);
addConvert("participantBackgroundColor", PName.BackGroundColor, SName.participant);
addConvert("participantBorderColor", PName.LineColor, SName.participant);
addConvert("participantBorderThickness", PName.LineThickness, SName.participant);
addConFont("participant", SName.participant);
addConvert("boundaryBackgroundColor", PName.BackGroundColor, SName.boundary);
addConvert("boundaryBorderColor", PName.LineColor, SName.boundary);
addConvert("boundaryBorderThickness", PName.LineThickness, SName.boundary);
addConFont("boundary", SName.boundary);
addConvert("controlBackgroundColor", PName.BackGroundColor, SName.control);
addConvert("controlBorderColor", PName.LineColor, SName.control);
addConvert("controlBorderThickness", PName.LineThickness, SName.control);
addConFont("control", SName.control);
addConvert("collectionsBackgroundColor", PName.BackGroundColor, SName.collections);
addConvert("collectionsBorderColor", PName.LineColor, SName.collections);
addConvert("collectionsBorderThickness", PName.LineThickness, SName.collections);
addConFont("collections", SName.collections);
addConvert("actorBackgroundColor", PName.BackGroundColor, SName.actor);
addConvert("actorBorderColor", PName.LineColor, SName.actor);
addConvert("actorBorderThickness", PName.LineThickness, SName.actor);
addConFont("actor", SName.actor);
addConvert("databaseBackgroundColor", PName.BackGroundColor, SName.database);
addConvert("databaseBorderColor", PName.LineColor, SName.database);
addConvert("databaseBorderThickness", PName.LineThickness, SName.database);
addConFont("database", SName.database);
addConvert("entityBackgroundColor", PName.BackGroundColor, SName.entity);
addConvert("entityBorderColor", PName.LineColor, SName.entity);
addConvert("entityBorderThickness", PName.LineThickness, SName.entity);
addConFont("entity", SName.entity);
addConFont("footer", SName.footer);
addConvert("SequenceReferenceBorderColor", PName.LineColor, SName.reference);
addConvert("SequenceReferenceBorderColor", PName.LineColor, SName.referenceHeader);
addConvert("SequenceReferenceBackgroundColor", PName.BackGroundColor, SName.reference);
addConvert("sequenceReferenceHeaderBackgroundColor", PName.BackGroundColor, SName.referenceHeader);
addConFont("sequenceReference", SName.reference);
addConFont("sequenceReference", SName.referenceHeader);
addConvert("SequenceGroupBorderColor", PName.LineColor, SName.group);
addConvert("SequenceGroupBorderColor", PName.LineColor, SName.groupHeader);
addConvert("SequenceGroupBackgroundColor", PName.BackGroundColor, SName.groupHeader);
addConFont("SequenceGroupHeader", SName.groupHeader);
addConvert("SequenceBoxBorderColor", PName.LineColor, SName.box);
addConvert("SequenceBoxBackgroundColor", PName.BackGroundColor, SName.box);
addConvert("SequenceLifeLineBorderColor", PName.LineColor, SName.lifeLine);
addConvert("sequenceDividerBackgroundColor", PName.BackGroundColor, SName.separator);
addConvert("sequenceDividerBorderColor", PName.LineColor, SName.separator);
addConFont("sequenceDivider", SName.separator);
addConvert("sequenceDividerBorderThickness", PName.LineThickness, SName.separator);
addConvert("SequenceMessageAlignment", PName.HorizontalAlignment, SName.arrow);
addConFont("note", SName.note);
addConvert("noteBackgroundColor", PName.BackGroundColor, SName.note);
addConvert("packageBackgroundColor", PName.BackGroundColor, SName.group);
addConvert("packageBorderColor", PName.LineColor, SName.group);
addConvert("PartitionBorderColor", PName.LineColor, SName.partition);
addConvert("PartitionBackgroundColor", PName.BackGroundColor, SName.partition);
addConFont("Partition", SName.partition);
addConvert("hyperlinkColor", PName.HyperLinkColor, SName.root);
addConvert("activityStartColor", PName.LineColor, SName.circle);
addConvert("activityBarColor", PName.LineColor, SName.activityBar);
addConvert("activityBorderColor", PName.LineColor, SName.activity);
addConvert("activityBorderThickness", PName.LineThickness, SName.activity);
addConvert("activityBackgroundColor", PName.BackGroundColor, SName.activity);
addConFont("activity", SName.activity);
addConvert("activityDiamondBackgroundColor", PName.BackGroundColor, SName.diamond);
addConvert("activityDiamondBorderColor", PName.LineColor, SName.diamond);
addConFont("activityDiamond", SName.diamond);
addConvert("arrowColor", PName.LineColor, SName.arrow);
addConFont("arrow", SName.arrow);
addConvert("defaulttextalignment", PName.HorizontalAlignment, SName.root);
addConvert("defaultFontName", PName.FontName, SName.root);
addConFont("SwimlaneTitle", SName.swimlane);
addConvert("SwimlaneTitleBackgroundColor", PName.BackGroundColor, SName.swimlane);
addConvert("SwimlaneBorderColor", PName.LineColor, SName.swimlane);
addConvert("SwimlaneBorderThickness", PName.LineThickness, SName.swimlane);
addConvert("roundCorner", PName.RoundCorner, SName.root);
addConvert("titleBorderThickness", PName.LineThickness, SName.title);
addConvert("titleBorderColor", PName.LineColor, SName.title);
addConvert("titleBackgroundColor", PName.BackGroundColor, SName.title);
addConvert("titleBorderRoundCorner", PName.RoundCorner, SName.title);
addConFont("title", SName.title);
addConvert("legendBorderThickness", PName.LineThickness, SName.legend);
addConvert("legendBorderColor", PName.LineColor, SName.legend);
addConvert("legendBackgroundColor", PName.BackGroundColor, SName.legend);
addConvert("legendBorderRoundCorner", PName.RoundCorner, SName.legend);
addConFont("legend", SName.legend);
addConvert("noteTextAlignment", PName.HorizontalAlignment, SName.note);
}
private final List<Style> styles = new ArrayList<Style>();
private String stereo = null;
public FromSkinparamToStyle(String key, final String value, final AutomaticCounter counter) {
if (key.contains("<<")) { if (key.contains("<<")) {
final StringTokenizer st = new StringTokenizer(key, "<>"); final StringTokenizer st = new StringTokenizer(key, "<>");
key = st.nextToken(); key = st.nextToken();
stereo = st.nextToken(); stereo = st.nextToken();
} }
SName styleName = null;
if (key.equalsIgnoreCase("participantBackgroundColor")) { final List<Data> datas = knowlegde.get(key.toLowerCase());
styleName = SName.participant;
map.put(PName.BackGroundColor, new ValueImpl(value, counter)); if (datas != null) {
} else if (key.equalsIgnoreCase("footerFontColor")) { for (Data data : datas) {
styleName = SName.footer; addStyle(data.propertyName, new ValueImpl(value, counter), data.styleNames);
map.put(PName.FontColor, new ValueImpl(value, counter)); }
} else if (key.equalsIgnoreCase("footerFontSize")) {
styleName = SName.footer;
map.put(PName.FontSize, new ValueImpl(value, counter));
} else if (key.equalsIgnoreCase("SequenceGroupBorderColor")) {
styleName = SName.group;
map.put(PName.LineColor, new ValueImpl(value, counter));
} else if (key.equalsIgnoreCase("SequenceBoxBorderColor")) {
styleName = SName.box;
map.put(PName.LineColor, new ValueImpl(value, counter));
} else if (key.equalsIgnoreCase("SequenceBoxBackgroundColor")) {
styleName = SName.box;
map.put(PName.BackGroundColor, new ValueImpl(value, counter));
} else if (key.equalsIgnoreCase("SequenceLifeLineBorderColor")) {
styleName = SName.lifeLine;
map.put(PName.LineColor, new ValueImpl(value, counter));
} else if (key.equalsIgnoreCase("noteFontColor")) {
styleName = SName.note;
map.put(PName.FontColor, new ValueImpl(value, counter));
} else if (key.equalsIgnoreCase("noteBackgroundColor")) {
styleName = SName.note;
map.put(PName.BackGroundColor, new ValueImpl(value, counter));
} else if (key.equalsIgnoreCase("noteBackgroundColor")) {
styleName = SName.note;
map.put(PName.BackGroundColor, new ValueImpl(value, counter));
} else if (key.equalsIgnoreCase("packageBackgroundColor")) {
styleName = SName.group;
map.put(PName.BackGroundColor, new ValueImpl(value, counter));
} else if (key.equalsIgnoreCase("packageBorderColor")) {
styleName = SName.group;
map.put(PName.LineColor, new ValueImpl(value, counter));
} else if (key.equalsIgnoreCase("PartitionBorderColor")) {
styleName = SName.partition;
map.put(PName.LineColor, new ValueImpl(value, counter));
} else if (key.equalsIgnoreCase("PartitionBackgroundColor")) {
styleName = SName.partition;
map.put(PName.BackGroundColor, new ValueImpl(value, counter));
} else if (key.equalsIgnoreCase("PartitionFontColor")) {
styleName = SName.partition;
map.put(PName.FontColor, new ValueImpl(value, counter));
} else if (key.equalsIgnoreCase("PartitionFontSize")) {
styleName = SName.partition;
map.put(PName.FontSize, new ValueImpl(value, counter));
} else if (key.equalsIgnoreCase("hyperlinkColor")) {
styleName = SName.root;
map.put(PName.HyperLinkColor, new ValueImpl(value, counter));
} else if (key.equalsIgnoreCase("activityStartColor")) {
styleName = SName.circle;
map.put(PName.LineColor, new ValueImpl(value, counter));
} else if (key.equalsIgnoreCase("activityBarColor")) {
styleName = SName.activityBar;
map.put(PName.LineColor, new ValueImpl(value, counter));
} else if (key.equalsIgnoreCase("activityBorderColor")) {
styleName = SName.activity;
map.put(PName.LineColor, new ValueImpl(value, counter));
} else if (key.equalsIgnoreCase("activityBorderThickness")) {
styleName = SName.activity;
map.put(PName.LineThickness, new ValueImpl(value, counter));
} else if (key.equalsIgnoreCase("activityBackgroundColor")) {
styleName = SName.activity;
map.put(PName.BackGroundColor, new ValueImpl(value, counter));
} else if (key.equalsIgnoreCase("activityFontColor")) {
styleName = SName.activity;
map.put(PName.FontColor, new ValueImpl(value, counter));
} else if (key.equalsIgnoreCase("activityFontSize")) {
styleName = SName.activity;
map.put(PName.FontSize, new ValueImpl(value, counter));
} else if (key.equalsIgnoreCase("activityFontName")) {
styleName = SName.activity;
map.put(PName.FontName, new ValueImpl(value, counter));
} else if (key.equalsIgnoreCase("activityDiamondBackgroundColor")) {
styleName = SName.diamond;
map.put(PName.BackGroundColor, new ValueImpl(value, counter));
} else if (key.equalsIgnoreCase("activityDiamondBorderColor")) {
styleName = SName.diamond;
map.put(PName.LineColor, new ValueImpl(value, counter));
} else if (key.equalsIgnoreCase("activityDiamondFontSize")) {
styleName = SName.diamond;
map.put(PName.FontSize, new ValueImpl(value, counter));
} else if (key.equalsIgnoreCase("activityDiamondFontColor")) {
styleName = SName.diamond;
map.put(PName.FontColor, new ValueImpl(value, counter));
} else if (key.equalsIgnoreCase("arrowColor")) {
styleName = SName.arrow;
map.put(PName.LineColor, new ValueImpl(value, counter));
} else if (key.equalsIgnoreCase("arrowFontColor")) {
styleName = SName.arrow;
map.put(PName.FontColor, new ValueImpl(value, counter));
} else if (key.equalsIgnoreCase("defaulttextalignment")) {
styleName = SName.root;
map.put(PName.HorizontalAlignment, new ValueImpl(value, counter));
} else if (key.equalsIgnoreCase("defaultFontName")) {
styleName = SName.root;
map.put(PName.FontName, new ValueImpl(value, counter));
} else if (key.equalsIgnoreCase("SwimlaneTitleFontColor")) {
styleName = SName.swimlane;
map.put(PName.FontColor, new ValueImpl(value, counter));
} else if (key.equalsIgnoreCase("SwimlaneTitleFontSize")) {
styleName = SName.swimlane;
map.put(PName.FontSize, new ValueImpl(value, counter));
} else if (key.equalsIgnoreCase("SwimlaneTitleBackgroundColor")) {
styleName = SName.swimlane;
map.put(PName.BackGroundColor, new ValueImpl(value, counter));
} else if (key.equalsIgnoreCase("SwimlaneBorderColor")) {
styleName = SName.swimlane;
map.put(PName.LineColor, new ValueImpl(value, counter));
} else if (key.equalsIgnoreCase("SwimlaneBorderThickness")) {
styleName = SName.swimlane;
map.put(PName.LineThickness, new ValueImpl(value, counter));
} else if (key.equalsIgnoreCase("shadowing")) { } else if (key.equalsIgnoreCase("shadowing")) {
styleName = SName.root; addStyle(PName.Shadowing, getShadowingValue(value, counter), SName.root);
if (value.equalsIgnoreCase("false") || value.equalsIgnoreCase("no")) { } else if (key.equalsIgnoreCase("noteshadowing")) {
map.put(PName.Shadowing, new ValueImpl("0", counter)); addStyle(PName.Shadowing, getShadowingValue(value, counter), SName.root, SName.note);
}
}
if (styleName != null && map.size() > 0) {
String tmp = styleName.name();
if (stereo != null) {
tmp = tmp + "&" + stereo;
}
style = new Style(tmp, map);
} }
} }
public Style getStyle() { private ValueImpl getShadowingValue(final String value, final AutomaticCounter counter) {
return style; if (value.equalsIgnoreCase("false") || value.equalsIgnoreCase("no")) {
return new ValueImpl("0", counter);
}
if (value.equalsIgnoreCase("true") || value.equalsIgnoreCase("yes")) {
return new ValueImpl("3", counter);
}
return new ValueImpl(value, counter);
}
private void addStyle(PName propertyName, Value value, SName... styleNames) {
final Map<PName, Value> map = new EnumMap<PName, Value>(PName.class);
map.put(propertyName, value);
StyleSignature sig = StyleSignature.of(styleNames);
if (stereo != null) {
sig = sig.add(stereo);
}
styles.add(new Style(sig, map));
}
public List<Style> getStyles() {
return Collections.unmodifiableList(styles);
}
private static void addConvert(String skinparam, PName propertyName, SName... styleNames) {
skinparam = skinparam.toLowerCase();
List<Data> datas = knowlegde.get(skinparam);
if (datas == null) {
datas = new ArrayList<Data>();
knowlegde.put(skinparam, datas);
}
datas.add(new Data(propertyName, styleNames));
}
private static void addConFont(String skinparam, SName... styleNames) {
addConvert(skinparam + "FontSize", PName.FontSize, styleNames);
addConvert(skinparam + "FontStyle", PName.FontStyle, styleNames);
addConvert(skinparam + "FontColor", PName.FontColor, styleNames);
addConvert(skinparam + "FontName", PName.FontName, styleNames);
} }
} }

View File

@ -43,6 +43,7 @@ public enum SName {
legend, legend,
caption, caption,
element, element,
clickable,
sequenceDiagram, sequenceDiagram,
destroy, destroy,
lifeLine, lifeLine,

View File

@ -62,11 +62,6 @@ public class Style {
private final Map<PName, Value> map; private final Map<PName, Value> map;
private final StyleSignature signature; private final StyleSignature signature;
public Style(String name, Map<PName, Value> map) {
this.map = map;
this.signature = StyleSignature.build(name);
}
public Style(StyleSignature signature, Map<PName, Value> map) { public Style(StyleSignature signature, Map<PName, Value> map) {
this.map = map; this.map = map;
this.signature = signature; this.signature = signature;
@ -119,7 +114,11 @@ public class Style {
if (colors != null) { if (colors != null) {
final HtmlColor back = colors.getColor(ColorType.BACK); final HtmlColor back = colors.getColor(ColorType.BACK);
if (back != null) { if (back != null) {
result = this.eventuallyOverride(PName.BackGroundColor, back); result = result.eventuallyOverride(PName.BackGroundColor, back);
}
final HtmlColor line = colors.getColor(ColorType.LINE);
if (line != null) {
result = result.eventuallyOverride(PName.LineColor, line);
} }
} }
return result; return result;
@ -188,13 +187,16 @@ public class Style {
return value(PName.HorizontalAlignment).asHorizontalAlignment(); return value(PName.HorizontalAlignment).asHorizontalAlignment();
} }
private TextBlock createTextBlockInternal(Display display, IHtmlColorSet set, ISkinSimple spriteContainer) { private TextBlock createTextBlockInternal(Display display, IHtmlColorSet set, ISkinSimple spriteContainer,
HorizontalAlignment alignment) {
final FontConfiguration fc = getFontConfiguration(set); final FontConfiguration fc = getFontConfiguration(set);
return display.create(fc, HorizontalAlignment.LEFT, spriteContainer); return display.create(fc, alignment, spriteContainer);
} }
public TextBlock createTextBlockBordered(Display note, IHtmlColorSet set, ISkinSimple spriteContainer) { public TextBlock createTextBlockBordered(Display note, IHtmlColorSet set, ISkinSimple spriteContainer) {
final TextBlock textBlock = this.createTextBlockInternal(note, set, spriteContainer); // final HorizontalAlignment alignment = HorizontalAlignment.LEFT;
final HorizontalAlignment alignment = this.getHorizontalAlignment();
final TextBlock textBlock = this.createTextBlockInternal(note, set, spriteContainer, alignment);
final HtmlColor legendBackgroundColor = this.value(PName.BackGroundColor).asColor(set); final HtmlColor legendBackgroundColor = this.value(PName.BackGroundColor).asColor(set);
final HtmlColor legendColor = this.value(PName.LineColor).asColor(set); final HtmlColor legendColor = this.value(PName.LineColor).asColor(set);

View File

@ -39,13 +39,23 @@ import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.EnumMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import net.sourceforge.plantuml.FileSystem; import net.sourceforge.plantuml.FileSystem;
import net.sourceforge.plantuml.LineLocationImpl; import net.sourceforge.plantuml.LineLocationImpl;
import net.sourceforge.plantuml.Log; import net.sourceforge.plantuml.Log;
import net.sourceforge.plantuml.SkinParam; import net.sourceforge.plantuml.SkinParam;
import net.sourceforge.plantuml.StringLocated;
import net.sourceforge.plantuml.command.BlocLines; import net.sourceforge.plantuml.command.BlocLines;
import net.sourceforge.plantuml.command.CommandControl; import net.sourceforge.plantuml.command.regex.Matcher2;
import net.sourceforge.plantuml.command.regex.MyPattern;
import net.sourceforge.plantuml.command.regex.Pattern2;
public class StyleLoader { public class StyleLoader {
@ -86,10 +96,91 @@ public class StyleLoader {
} }
private void loadSkinInternal(final BlocLines lines) { private void loadSkinInternal(final BlocLines lines) {
final CommandStyleMultilinesCSS cmd2 = new CommandStyleMultilinesCSS(); for (Style newStyle : getDeclaredStyles(lines, styleBuilder)) {
for (Style newStyle : cmd2.getDeclaredStyles(lines, styleBuilder)) {
this.styleBuilder.put(newStyle.getSignature(), newStyle); this.styleBuilder.put(newStyle.getSignature(), newStyle);
} }
} }
private static final String NAME_USER = "[\\w()]+?";
private final static Pattern2 userName = MyPattern.cmpile("^[.:]?(" + NAME_USER + ")([%s]+\\*)?[%s]*\\{$");
private final static Pattern2 propertyAndValue = MyPattern.cmpile("^([\\w]+):?[%s]+(.*?);?$");
private final static Pattern2 closeBracket = MyPattern.cmpile("^\\}$");
public static Collection<Style> getDeclaredStyles(BlocLines lines, AutomaticCounter counter) {
lines = lines.eventuallyMoveAllEmptyBracket();
final List<Style> result = new ArrayList<Style>();
final List<String> context = new ArrayList<String>();
final List<Map<PName, Value>> maps = new ArrayList<Map<PName, Value>>();
boolean inComment = false;
for (StringLocated s : lines) {
String trimmed = s.getTrimmed().getString();
if (trimmed.startsWith("/*") || trimmed.startsWith("/'")) {
inComment = true;
continue;
}
if (trimmed.endsWith("*/") || trimmed.endsWith("'/")) {
inComment = false;
continue;
}
if (inComment) {
continue;
}
final int x = trimmed.lastIndexOf("//");
if (x != -1) {
trimmed = trimmed.substring(0, x).trim();
}
final Matcher2 mUserName = userName.matcher(trimmed);
if (mUserName.find()) {
String n = mUserName.group(1);
final boolean isRecurse = mUserName.group(2) != null;
if (isRecurse) {
n += "*";
}
context.add(n);
maps.add(new EnumMap<PName, Value>(PName.class));
continue;
}
final Matcher2 mPropertyAndValue = propertyAndValue.matcher(trimmed);
if (mPropertyAndValue.find()) {
final PName key = PName.getFromName(mPropertyAndValue.group(1));
final String value = mPropertyAndValue.group(2);
if (key != null) {
maps.get(maps.size() - 1).put(key, new ValueImpl(value, counter));
}
continue;
}
final Matcher2 mCloseBracket = closeBracket.matcher(trimmed);
if (mCloseBracket.find()) {
if (context.size() > 0) {
final StyleSignature signature = contextToSignature(context);
final Style style = new Style(signature, maps.get(maps.size() - 1));
result.add(style);
context.remove(context.size() - 1);
maps.remove(maps.size() - 1);
}
}
}
return Collections.unmodifiableList(result);
}
private static StyleSignature contextToSignature(List<String> context) {
StyleSignature result = StyleSignature.empty();
boolean star = false;
for (Iterator<String> it = context.iterator(); it.hasNext();) {
String s = it.next();
if (s.endsWith("*")) {
star = true;
s = s.substring(0, s.length() - 1);
}
result = result.add(s);
}
if (star) {
result = result.addStar();
}
return result;
}
} }

View File

@ -42,28 +42,14 @@ import java.util.HashSet;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.StringTokenizer;
import net.sourceforge.plantuml.Url;
import net.sourceforge.plantuml.cucadiagram.Stereotype; import net.sourceforge.plantuml.cucadiagram.Stereotype;
public class StyleSignature { public class StyleSignature {
private final Set<String> names = new LinkedHashSet<String>(); private final Set<String> names = new LinkedHashSet<String>();
public static StyleSignature build(String name) {
final StyleSignature result = new StyleSignature();
for (StringTokenizer st = new StringTokenizer(name.toLowerCase(),
CommandStyleMultilinesCSS.STYLE_SELECTOR_SEPARATOR2); st.hasMoreTokens();) {
String token = st.nextToken();
if (token.endsWith("*")) {
throw new IllegalArgumentException();
// token = token.substring(0, token.length() - 1);
}
result.names.add(token);
}
return result;
}
public StyleSignature(String s) { public StyleSignature(String s) {
if (s.contains("*") || s.contains("&") || s.contains("-")) { if (s.contains("*") || s.contains("&") || s.contains("-")) {
throw new IllegalArgumentException(); throw new IllegalArgumentException();
@ -82,6 +68,16 @@ public class StyleSignature {
this.names.addAll(copy); this.names.addAll(copy);
} }
public StyleSignature addClickable(Url url) {
if (url == null) {
return this;
}
final Set<String> result = new HashSet<String>(names);
result.add(SName.clickable.name());
return new StyleSignature(result);
}
public StyleSignature add(String s) { public StyleSignature add(String s) {
if (s == null) { if (s == null) {
return this; return this;
@ -200,7 +196,7 @@ public class StyleSignature {
public boolean match(Stereotype stereotype) { public boolean match(Stereotype stereotype) {
for (String s : stereotype.getMultipleLabels()) { for (String s : stereotype.getMultipleLabels()) {
if (names.contains(s)) { if (names.contains(s.toLowerCase())) {
return true; return true;
} }
} }

View File

@ -59,6 +59,7 @@ import javax.xml.transform.stream.StreamResult;
import net.sourceforge.plantuml.Log; import net.sourceforge.plantuml.Log;
import net.sourceforge.plantuml.OptionFlags; import net.sourceforge.plantuml.OptionFlags;
import net.sourceforge.plantuml.SignatureUtils;
import net.sourceforge.plantuml.StringUtils; import net.sourceforge.plantuml.StringUtils;
import net.sourceforge.plantuml.SvgString; import net.sourceforge.plantuml.SvgString;
import net.sourceforge.plantuml.code.Base64Coder; import net.sourceforge.plantuml.code.Base64Coder;
@ -90,7 +91,7 @@ public class SvgGraphics {
// http://www.adobe.com/svg/demos/samples.html // http://www.adobe.com/svg/demos/samples.html
private static final String XLINK_HREF = "href"; private static final String XLINK_HREF = "href";
final private Document document; final private Document document;
final private Element root; final private Element root;
final private Element defs; final private Element defs;
@ -807,7 +808,15 @@ public class SvgGraphics {
this.hidden = hidden; this.hidden = hidden;
} }
public static final String MD5_HEADER = "<!--MD5=[";
public static String getMD5Hex(String comment) {
return SignatureUtils.getMD5Hex(comment);
}
public void addComment(String comment) { public void addComment(String comment) {
final String signature = getMD5Hex(comment);
comment = "MD5=[" + signature + "]\n" + comment;
final Comment commentElement = document.createComment(comment); final Comment commentElement = document.createComment(comment);
getG().appendChild(commentElement); getG().appendChild(commentElement);
} }

View File

@ -496,6 +496,8 @@ public class TikzGraphics {
sb.append(couple(coord[4] + x, coord[5] + y)); sb.append(couple(coord[4] + x, coord[5] + y));
} else if (type == USegmentType.SEG_CLOSE) { } else if (type == USegmentType.SEG_CLOSE) {
// Nothing // Nothing
} else if (type == USegmentType.SEG_ARCTO) {
// Nothing
} else { } else {
Log.println("unknown4 " + seg); Log.println("unknown4 " + seg);
} }

View File

@ -77,6 +77,9 @@ public abstract class Eater {
} }
final TokenStack tokenStack = new TokenStack(); final TokenStack tokenStack = new TokenStack();
addIntoTokenStack(tokenStack, false); addIntoTokenStack(tokenStack, false);
if (tokenStack.size() == 0) {
throw new EaterException("Missing expression");
}
return tokenStack.getResult(context, memory); return tokenStack.getResult(context, memory);
} }

View File

@ -93,4 +93,8 @@ public class EaterFunctionCall extends Eater {
return Collections.unmodifiableList(values); return Collections.unmodifiableList(values);
} }
public final String getEndOfLine() throws EaterException {
return this.eatAllToEnd();
}
} }

View File

@ -577,34 +577,43 @@ public class TContext {
} }
private void executeIncludesub(TMemory memory, StringLocated s) throws EaterException { private void executeIncludesub(TMemory memory, StringLocated s) throws EaterException {
final EaterIncludesub include = new EaterIncludesub(s.getTrimmed().getString()); ImportedFiles saveImportedFiles = null;
include.execute(this, memory); try {
final String location = include.getLocation(); final EaterIncludesub include = new EaterIncludesub(s.getTrimmed().getString());
final int idx = location.indexOf('!'); include.execute(this, memory);
Sub2 sub = null; final String location = include.getLocation();
if (OptionFlags.ALLOW_INCLUDE && idx != -1) { final int idx = location.indexOf('!');
final String filename = location.substring(0, idx); Sub2 sub = null;
final String blocname = location.substring(idx + 1); if (OptionFlags.ALLOW_INCLUDE && idx != -1) {
try { final String filename = location.substring(0, idx);
final FileWithSuffix f2 = new FileWithSuffix(importedFiles, filename, null); final String blocname = location.substring(idx + 1);
if (f2.fileOk()) { try {
final Reader reader = f2.getReader(charset); final FileWithSuffix f2 = new FileWithSuffix(importedFiles, filename, null);
ReadLine readerline = ReadLineReader.create(reader, location, s.getLocation()); if (f2.fileOk()) {
readerline = new UncommentReadLine(readerline); saveImportedFiles = this.importedFiles;
readerline = new ReadLineQuoteComment(true).applyFilter(readerline); this.importedFiles = this.importedFiles.withCurrentDir(f2.getParentFile());
sub = Sub2.fromFile(readerline, blocname, this, memory); final Reader reader = f2.getReader(charset);
ReadLine readerline = ReadLineReader.create(reader, location, s.getLocation());
readerline = new UncommentReadLine(readerline);
readerline = new ReadLineQuoteComment(true).applyFilter(readerline);
sub = Sub2.fromFile(readerline, blocname, this, memory);
}
} catch (IOException e) {
e.printStackTrace();
throw new EaterException("cannot include " + e);
} }
} catch (IOException e) { } else {
e.printStackTrace(); sub = subs.get(location);
throw new EaterException("cannot include " + e); }
if (sub == null) {
throw new EaterException("cannot include " + location);
}
runSub(memory, sub);
} finally {
if (saveImportedFiles != null) {
this.importedFiles = saveImportedFiles;
} }
} else {
sub = subs.get(location);
} }
if (sub == null) {
throw new EaterException("cannot include " + location);
}
runSub(memory, sub);
} }
private void runSub(TMemory memory, final Sub2 sub) throws EaterException { private void runSub(TMemory memory, final Sub2 sub) throws EaterException {
@ -671,6 +680,9 @@ public class TContext {
reader2 = StartDiagramExtractReader.build(f2, s, charset); reader2 = StartDiagramExtractReader.build(f2, s, charset);
} else { } else {
final Reader reader = f2.getReader(charset); final Reader reader = f2.getReader(charset);
if (reader == null) {
throw new EaterException("Cannot include file");
}
reader2 = ReadLineReader.create(reader, location, s.getLocation()); reader2 = ReadLineReader.create(reader, location, s.getLocation());
} }
saveImportedFiles = this.importedFiles; saveImportedFiles = this.importedFiles;
@ -798,4 +810,13 @@ public class TContext {
return sb.toString(); return sb.toString();
} }
public void appendEndOfLine(String endOfLine) {
if (endOfLine.length() > 0) {
final int idx = resultList.size() - 1;
StringLocated last = resultList.get(idx);
last = last.append(endOfLine);
resultList.set(idx, last);
}
}
} }

View File

@ -85,8 +85,10 @@ public class TFunctionImpl implements TFunction {
final EaterFunctionCall call = new EaterFunctionCall(s, context.isLegacyDefine(signature.getFunctionName()), final EaterFunctionCall call = new EaterFunctionCall(s, context.isLegacyDefine(signature.getFunctionName()),
unquoted); unquoted);
call.execute(context, memory); call.execute(context, memory);
final String endOfLine = call.getEndOfLine();
final List<TValue> args = call.getValues(); final List<TValue> args = call.getValues();
executeVoidInternal(context, memory, args); executeVoidInternal(context, memory, args);
context.appendEndOfLine(endOfLine);
} }
public void executeVoidInternal(TContext context, TMemory memory, List<TValue> args) throws EaterException { public void executeVoidInternal(TContext context, TMemory memory, List<TValue> args) throws EaterException {
@ -114,7 +116,7 @@ public class TFunctionImpl implements TFunction {
return executeReturnLegacyDefine(context, memory, args); return executeReturnLegacyDefine(context, memory, args);
} }
if (functionType != TFunctionType.RETURN) { if (functionType != TFunctionType.RETURN) {
throw new IllegalStateException(); throw new EaterException("Illegal call here");
} }
final TMemory copy = getNewMemory(memory, args); final TMemory copy = getNewMemory(memory, args);

View File

@ -59,6 +59,10 @@ public class TokenStack {
this.tokens = list; this.tokens = list;
} }
public int size() {
return tokens.size();
}
public TokenStack subTokenStack(int i) { public TokenStack subTokenStack(int i) {
return new TokenStack(Collections.unmodifiableList(tokens.subList(i, tokens.size()))); return new TokenStack(Collections.unmodifiableList(tokens.subList(i, tokens.size())));
} }

View File

@ -76,7 +76,7 @@ abstract class CommandChangeState extends SingleLineCommand2<TimingDiagram> {
static IRegex getStateOrHidden() { static IRegex getStateOrHidden() {
return new RegexOr(// return new RegexOr(//
new RegexLeaf("STATE1", "[%g]([^%g]+)[%g]"), // new RegexLeaf("STATE1", "[%g]([^%g]*)[%g]"), //
new RegexLeaf("STATE2", STATE_CODE), // new RegexLeaf("STATE2", STATE_CODE), //
new RegexLeaf("STATE3", "(\\{hidden\\})"), // new RegexLeaf("STATE3", "(\\{hidden\\})"), //
new RegexLeaf("STATE4", "(\\{\\.\\.\\.\\})"), // new RegexLeaf("STATE4", "(\\{\\.\\.\\.\\})"), //

View File

@ -109,16 +109,16 @@ public class TimingRuler {
return highestCommonFactorInternal; return highestCommonFactorInternal;
} }
private int getNbTick() { private int getNbTick(boolean capped) {
if (times.size() == 0) { if (times.size() == 0) {
return 1; return 1;
} }
final long delta = getMax().getTime().longValue() - getMin().getTime().longValue(); final long delta = getMax().getTime().longValue() - getMin().getTime().longValue();
return (int) (1 + delta / tickUnitary()); return Math.min(1000, (int) (1 + delta / tickUnitary()));
} }
public double getWidth() { public double getWidth() {
return getNbTick() * tickIntervalInPixels; return getNbTick(false) * tickIntervalInPixels;
} }
public final double getPosInPixel(TimeTick when) { public final double getPosInPixel(TimeTick when) {
@ -151,7 +151,7 @@ public class TimingRuler {
ug = ug.apply(new UStroke(2.0)).apply(new UChangeColor(HtmlColorUtils.BLACK)); ug = ug.apply(new UStroke(2.0)).apply(new UChangeColor(HtmlColorUtils.BLACK));
final double tickHeight = 5; final double tickHeight = 5;
final ULine line = new ULine(0, tickHeight); final ULine line = new ULine(0, tickHeight);
final int nb = getNbTick(); final int nb = getNbTick(true);
for (int i = 0; i <= nb; i++) { for (int i = 0; i <= nb; i++) {
ug.apply(new UTranslate(tickIntervalInPixels * i, 0)).draw(line); ug.apply(new UTranslate(tickIntervalInPixels * i, 0)).draw(line);
} }
@ -172,7 +172,7 @@ public class TimingRuler {
result.add(round); result.add(round);
} }
} else { } else {
final int nb = getNbTick(); final int nb = getNbTick(true);
for (int i = 0; i <= nb; i++) { for (int i = 0; i <= nb; i++) {
final long round = tickUnitary * i; final long round = tickUnitary * i;
result.add(round); result.add(round);
@ -187,7 +187,7 @@ public class TimingRuler {
public void draw0(UGraphic ug, double height) { public void draw0(UGraphic ug, double height) {
ug = ug.apply(new UStroke(3, 5, 0.5)).apply(new UChangeColor(new HtmlColorSetSimple().getColorIfValid("#AAA"))); ug = ug.apply(new UStroke(3, 5, 0.5)).apply(new UChangeColor(new HtmlColorSetSimple().getColorIfValid("#AAA")));
final ULine line = new ULine(0, height); final ULine line = new ULine(0, height);
final int nb = getNbTick(); final int nb = getNbTick(true);
for (int i = 0; i <= nb; i++) { for (int i = 0; i <= nb; i++) {
ug.apply(new UTranslate(tickIntervalInPixels * i, 0)).draw(line); ug.apply(new UTranslate(tickIntervalInPixels * i, 0)).draw(line);
} }

View File

@ -46,6 +46,7 @@ import java.io.ByteArrayOutputStream;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.Random;
import java.util.Set; import java.util.Set;
import java.util.concurrent.Semaphore; import java.util.concurrent.Semaphore;
@ -79,7 +80,6 @@ import net.sourceforge.plantuml.graphic.HtmlColorSimple;
import net.sourceforge.plantuml.graphic.HtmlColorTransparent; import net.sourceforge.plantuml.graphic.HtmlColorTransparent;
import net.sourceforge.plantuml.graphic.HtmlColorUtils; import net.sourceforge.plantuml.graphic.HtmlColorUtils;
import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.StringBounder;
import net.sourceforge.plantuml.graphic.TextBlock;
import net.sourceforge.plantuml.graphic.UDrawable; import net.sourceforge.plantuml.graphic.UDrawable;
import net.sourceforge.plantuml.mjpeg.MJPEGGenerator; import net.sourceforge.plantuml.mjpeg.MJPEGGenerator;
import net.sourceforge.plantuml.skin.rose.Rose; import net.sourceforge.plantuml.skin.rose.Rose;
@ -114,6 +114,7 @@ public class ImageBuilder {
private double borderCorner; private double borderCorner;
private boolean svgDimensionStyle; private boolean svgDimensionStyle;
private boolean randomPixel;
public ImageBuilder(ColorMapper colorMapper, double dpiFactor, HtmlColor mybackcolor, String metadata, public ImageBuilder(ColorMapper colorMapper, double dpiFactor, HtmlColor mybackcolor, String metadata,
String warningOrError, double margin1, double margin2, Animation animation, boolean useHandwritten) { String warningOrError, double margin1, double margin2, Animation animation, boolean useHandwritten) {
@ -247,6 +248,9 @@ public class ImageBuilder {
- externalMargin() - borderStroke.getThickness(), borderCorner, borderCorner); - externalMargin() - borderStroke.getThickness(), borderCorner, borderCorner);
ug2.apply(new UChangeColor(color)).apply(borderStroke).draw(shape); ug2.apply(new UChangeColor(color)).apply(borderStroke).draw(shape);
} }
if (randomPixel) {
drawRandomPoint(ug2);
}
if (externalMargin1 > 0) { if (externalMargin1 > 0) {
ug2 = ug2.apply(new UTranslate(externalMargin2, externalMargin2)); ug2 = ug2.apply(new UTranslate(externalMargin2, externalMargin2));
} }
@ -273,19 +277,30 @@ public class ImageBuilder {
} }
private void drawRandomPoint(UGraphic ug2) {
final Random rnd = new Random();
final int red = rnd.nextInt(40);
final int green = rnd.nextInt(40);
final int blue = rnd.nextInt(40);
final Color c = new Color(red, green, blue);
final HtmlColor color = new HtmlColorSimple(c, false);
ug2.apply(new UChangeColor(color)).apply(new UChangeBackColor(color)).draw(new URectangle(1, 1));
}
private double externalMargin() { private double externalMargin() {
return 2 * (externalMargin1 + externalMargin2); return 2 * (externalMargin1 + externalMargin2);
} }
public Dimension2D getFinalDimension(StringBounder stringBounder) { public Dimension2D getFinalDimension(StringBounder stringBounder) {
final Dimension2D dim; final Dimension2D dim;
// if (udrawable instanceof TextBlock) { // if (udrawable instanceof TextBlock) {
// dim = ((TextBlock) udrawable).calculateDimension(stringBounder); // dim = ((TextBlock) udrawable).calculateDimension(stringBounder);
// } else { // } else {
final LimitFinder limitFinder = new LimitFinder(stringBounder, true); final LimitFinder limitFinder = new LimitFinder(stringBounder, true);
udrawable.drawU(limitFinder); udrawable.drawU(limitFinder);
dim = new Dimension2DDouble(limitFinder.getMaxX(), limitFinder.getMaxY()); dim = new Dimension2DDouble(limitFinder.getMaxX(), limitFinder.getMaxY());
// } // }
return new Dimension2DDouble(dim.getWidth() + 1 + margin1 + margin2 + externalMargin(), dim.getHeight() + 1 return new Dimension2DDouble(dim.getWidth() + 1 + margin1 + margin2 + externalMargin(), dim.getHeight() + 1
+ margin1 + margin2 + externalMargin()); + margin1 + margin2 + externalMargin());
} }
@ -452,4 +467,9 @@ public class ImageBuilder {
return ug; return ug;
} }
public void setRandomPixel(boolean randomPixel) {
this.randomPixel = randomPixel;
}
} }

Some files were not shown because too many files have changed in this diff Show More