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

Import version 1.2020.14

This commit is contained in:
Arnaud Roques 2020-06-21 22:31:45 +02:00
parent 5cd6df817e
commit a38685d3ba
64 changed files with 458 additions and 291 deletions

View File

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

View File

@ -41,7 +41,7 @@ public enum ComponentStyle {
UML1, UML2, RECTANGLE;
public USymbol toSymbol() {
public USymbol toUSymbol() {
switch (this) {
case UML1:
return USymbol.COMPONENT1;

View File

@ -140,7 +140,9 @@ public class EmbeddedDiagram implements CharSequence {
private BufferedImage getImage() throws IOException, InterruptedException {
if (image == null) {
final boolean sav = SkinParam.USE_STYLES();
image = getImageSlow();
SkinParam.setBetaStyle(sav);
}
return image;
}

View File

@ -38,6 +38,8 @@ package net.sourceforge.plantuml;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
@ -56,6 +58,25 @@ public class FileUtils {
counter = new AtomicInteger(0);
}
static public File createTempFileLegacy(String prefix, String suffix) throws IOException {
if (suffix.startsWith(".") == false) {
throw new IllegalArgumentException();
}
if (prefix == null) {
throw new IllegalArgumentException();
}
final File f;
if (counter == null) {
f = File.createTempFile(prefix, suffix);
} else {
final String name = prefix + counter.addAndGet(1) + suffix;
f = new File(name);
}
Log.info("Creating temporary file: " + f);
f.deleteOnExit();
return f;
}
static public SFile createTempFile(String prefix, String suffix) throws IOException {
if (suffix.startsWith(".") == false) {
throw new IllegalArgumentException();
@ -106,6 +127,12 @@ public class FileUtils {
copyInternal(fis, fos);
}
static public void copyToStream(File src, OutputStream os) throws IOException {
final InputStream fis = new BufferedInputStream(new FileInputStream(src));
final OutputStream fos = new BufferedOutputStream(os);
copyInternal(fis, fos);
}
static public void copyToStream(InputStream is, OutputStream os) throws IOException {
final InputStream fis = new BufferedInputStream(is);
final OutputStream fos = new BufferedOutputStream(os);

View File

@ -181,7 +181,7 @@ public enum FontParam {
return new FontConfiguration(skinParam, this, null);
}
public StyleSignature getStyleDefinition() {
public StyleSignature getStyleDefinition(SName diagramType) {
if (this == FOOTER) {
return StyleSignature.of(SName.root, SName.footer);
}
@ -191,8 +191,15 @@ public enum FontParam {
if (this == TITLE) {
return StyleSignature.of(SName.root, SName.title);
}
System.err.println("Warning " + this);
return null;
if (this == CLASS_ATTRIBUTE) {
return StyleSignature.of(SName.root, SName.element, SName.classDiagram, SName.class_);
}
if (this == RECTANGLE || this == NODE) {
return StyleSignature.of(SName.root, SName.element, SName.componentDiagram, SName.component);
}
return StyleSignature.of(SName.root, SName.element, diagramType, SName.component);
// System.err.println("Warning " + this);
// throw new UnsupportedOperationException();
}
}

View File

@ -96,7 +96,7 @@ public interface ISkinParam extends ISkinSimple {
public boolean shadowing2(Stereotype stereotype, SkinParameter skinParameter);
public PackageStyle getPackageStyle();
public PackageStyle packageStyle();
public ComponentStyle componentStyle();
@ -156,7 +156,7 @@ public interface ISkinParam extends ISkinSimple {
public UmlDiagramType getUmlDiagramType();
public HColor getHoverPathColor();
public HColor hoverPathColor();
public TikzFontDistortion getTikzFontDistortion();
@ -176,7 +176,7 @@ public interface ISkinParam extends ISkinSimple {
public boolean isUseVizJs();
public Padder getSequenceDiagramPadder();
public Padder sequenceDiagramPadder();
public StyleBuilder getCurrentStyleBuilder();
@ -188,6 +188,6 @@ public interface ISkinParam extends ISkinSimple {
public void setDefaultSkin(String newSkin);
public ActorStyle getActorStyle();
public ActorStyle actorStyle();
}

View File

@ -780,15 +780,6 @@ public class SkinParam implements ISkinParam {
return true;
}
public PackageStyle getPackageStyle() {
final String value = getValue("packageStyle");
final PackageStyle p = PackageStyle.fromString(value);
if (p == null) {
return PackageStyle.FOLDER;
}
return p;
}
private final Map<String, Sprite> sprites = new HashMap<String, Sprite>();
public Collection<String> getAllSpriteNames() {
@ -807,16 +798,27 @@ public class SkinParam implements ISkinParam {
return result;
}
public PackageStyle packageStyle() {
final String value = getValue("packageStyle");
final PackageStyle p = PackageStyle.fromString(value);
if (p == null) {
return PackageStyle.FOLDER;
}
return p;
}
public ComponentStyle componentStyle() {
if (strictUmlStyle()) {
return ComponentStyle.UML2;
}
final String value = getValue("componentstyle");
if ("uml1".equalsIgnoreCase(value))
return ComponentStyle.UML1;
if ("uml2".equalsIgnoreCase(value))
return ComponentStyle.UML2;
if ("rectangle".equalsIgnoreCase(value))
return ComponentStyle.RECTANGLE;
return ComponentStyle.UML1;
return ComponentStyle.UML2;
}
public boolean stereotypePositionTop() {
@ -1144,7 +1146,7 @@ public class SkinParam implements ISkinParam {
return type;
}
public HColor getHoverPathColor() {
public HColor hoverPathColor() {
final String value = getValue("pathhovercolor");
if (value == null) {
return null;
@ -1219,7 +1221,7 @@ public class SkinParam implements ISkinParam {
return useVizJs;
}
public Padder getSequenceDiagramPadder() {
public Padder sequenceDiagramPadder() {
final double padding = getAsDouble("SequenceMessagePadding");
final double margin = getAsDouble("SequenceMessageMargin");
final String borderColor = getValue("SequenceMessageBorderColor");
@ -1234,7 +1236,7 @@ public class SkinParam implements ISkinParam {
.withBorderColor(border).withRoundCorner(roundCorner);
}
public ActorStyle getActorStyle() {
public ActorStyle actorStyle() {
final String value = getValue("actorstyle");
if ("awesome".equalsIgnoreCase(value)) {
return ActorStyle.AWESOME;

View File

@ -124,8 +124,8 @@ public class SkinParamDelegator implements ISkinParam {
return skinParam.shadowing2(stereotype, skinParameter);
}
public PackageStyle getPackageStyle() {
return skinParam.getPackageStyle();
public PackageStyle packageStyle() {
return skinParam.packageStyle();
}
public Sprite getSprite(String name) {
@ -276,8 +276,8 @@ public class SkinParamDelegator implements ISkinParam {
return skinParam.getUmlDiagramType();
}
public HColor getHoverPathColor() {
return skinParam.getHoverPathColor();
public HColor hoverPathColor() {
return skinParam.hoverPathColor();
}
public double getPadding(PaddingParam param) {
@ -336,8 +336,8 @@ public class SkinParamDelegator implements ISkinParam {
return skinParam.getStereotypeAlignment();
}
public Padder getSequenceDiagramPadder() {
return skinParam.getSequenceDiagramPadder();
public Padder sequenceDiagramPadder() {
return skinParam.sequenceDiagramPadder();
}
public StyleBuilder getCurrentStyleBuilder() {
@ -360,8 +360,8 @@ public class SkinParamDelegator implements ISkinParam {
skinParam.setDefaultSkin(newFileName);
}
public ActorStyle getActorStyle() {
return skinParam.getActorStyle();
public ActorStyle actorStyle() {
return skinParam.actorStyle();
}
}

View File

@ -39,9 +39,12 @@ import java.awt.Color;
import java.awt.geom.AffineTransform;
import java.awt.geom.Dimension2D;
import java.awt.image.BufferedImage;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
@ -77,8 +80,8 @@ import net.sourceforge.plantuml.svek.EmptySvgException;
import net.sourceforge.plantuml.svek.GraphvizCrash;
import net.sourceforge.plantuml.svek.TextBlockBackcolored;
import net.sourceforge.plantuml.ugraphic.AffineTransformType;
import net.sourceforge.plantuml.ugraphic.PixelImage;
import net.sourceforge.plantuml.ugraphic.ImageBuilder;
import net.sourceforge.plantuml.ugraphic.PixelImage;
import net.sourceforge.plantuml.ugraphic.UGraphic;
import net.sourceforge.plantuml.ugraphic.UImage;
import net.sourceforge.plantuml.ugraphic.UTranslate;
@ -183,7 +186,7 @@ public abstract class UmlDiagram extends TitledDiagram implements Diagram, Annot
final protected ImageData exportDiagramNow(OutputStream os, int index, FileFormatOption fileFormatOption, long seed)
throws IOException {
final HColor hover = getSkinParam().getHoverPathColor();
final HColor hover = getSkinParam().hoverPathColor();
if (fileFormatOption.getSvgLinkTarget() == null || fileFormatOption.getSvgLinkTarget().equals("_top")) {
fileFormatOption = fileFormatOption.withSvgLinkTarget(getSkinParam().getSvgLinkTarget());
}
@ -337,9 +340,9 @@ public abstract class UmlDiagram extends TitledDiagram implements Diagram, Annot
private Dimension2D lastInfo;
private ImageData exportDiagramInternalPdf(OutputStream os, int index) throws IOException {
final SFile svg = FileUtils.createTempFile("pdf", ".svf");
final SFile pdfFile = FileUtils.createTempFile("pdf", ".pdf");
final OutputStream fos = svg.createBufferedOutputStream();
final File svg = FileUtils.createTempFileLegacy("pdf", ".svf");
final File pdfFile = FileUtils.createTempFileLegacy("pdf", ".pdf");
final OutputStream fos = new BufferedOutputStream(new FileOutputStream(svg));;
final ImageData result = exportDiagram(fos, index, new FileFormatOption(FileFormat.SVG));
fos.close();
PdfConverter.convert(svg, pdfFile);

View File

@ -74,7 +74,7 @@ public class LaneDivider extends AbstractTextBlock {
}
public StyleSignature getDefaultStyleDefinition() {
return StyleSignature.of(SName.root, SName.element, SName.classDiagram, SName.swimlane);
return StyleSignature.of(SName.root, SName.element, SName.activityDiagram, SName.swimlane);
}
private Style getStyle() {

View File

@ -118,7 +118,7 @@ public class Swimlanes extends AbstractTextBlock implements TextBlock, Styleable
}
public StyleSignature getDefaultStyleDefinition() {
return StyleSignature.of(SName.root, SName.element, SName.classDiagram, SName.swimlane);
return StyleSignature.of(SName.root, SName.element, SName.activityDiagram, SName.swimlane);
}
public Swimlanes(ISkinParam skinParam, Pragma pragma) {

View File

@ -178,7 +178,7 @@ public class CommandCreateElementFull2 extends SingleLineCommand2<ClassDiagram>
if (symbol == null) {
type = LeafType.DESCRIPTION;
usymbol = diagram.getSkinParam().getActorStyle().getUSymbol();
usymbol = diagram.getSkinParam().actorStyle().toUSymbol();
} else if (symbol.equalsIgnoreCase("port")) {
type = LeafType.PORT;
usymbol = null;
@ -190,7 +190,7 @@ public class CommandCreateElementFull2 extends SingleLineCommand2<ClassDiagram>
usymbol = null;
} else {
type = LeafType.DESCRIPTION;
usymbol = USymbol.getFromString(symbol, diagram.getSkinParam());
usymbol = USymbol.fromString(symbol, diagram.getSkinParam());
if (usymbol == null) {
throw new IllegalStateException();
}

View File

@ -72,7 +72,7 @@ public class CommandFooter extends SingleLineCommand2<TitledDiagram> {
final String align = arg.get("POSITION", 0);
HorizontalAlignment ha = HorizontalAlignment.fromString(align, HorizontalAlignment.CENTER);
if (SkinParam.USE_STYLES() && align == null) {
ha = FontParam.FOOTER.getStyleDefinition()
ha = FontParam.FOOTER.getStyleDefinition(null)
.getMergedStyle(((UmlDiagram) diagram).getSkinParam().getCurrentStyleBuilder())
.getHorizontalAlignment();
}

View File

@ -74,7 +74,7 @@ public class CommandHeader extends SingleLineCommand2<TitledDiagram> {
final String align = arg.get("POSITION", 0);
HorizontalAlignment ha = HorizontalAlignment.fromString(align, HorizontalAlignment.RIGHT);
if (SkinParam.USE_STYLES() && align == null) {
ha = FontParam.HEADER.getStyleDefinition()
ha = FontParam.HEADER.getStyleDefinition(null)
.getMergedStyle(((UmlDiagram) diagram).getSkinParam().getCurrentStyleBuilder())
.getHorizontalAlignment();
}

View File

@ -66,7 +66,7 @@ public class CommandMultilinesFooter extends CommandMultilines<TitledDiagram> {
if (strings.size() > 0) {
HorizontalAlignment ha = HorizontalAlignment.fromString(align, HorizontalAlignment.CENTER);
if (SkinParam.USE_STYLES() && align == null) {
ha = FontParam.FOOTER.getStyleDefinition()
ha = FontParam.FOOTER.getStyleDefinition(null)
.getMergedStyle(((UmlDiagram) diagram).getSkinParam().getCurrentStyleBuilder())
.getHorizontalAlignment();
}

View File

@ -66,7 +66,7 @@ public class CommandMultilinesHeader extends CommandMultilines<TitledDiagram> {
if (strings.size() > 0) {
HorizontalAlignment ha = HorizontalAlignment.fromString(align, HorizontalAlignment.RIGHT);
if (SkinParam.USE_STYLES() && align == null) {
ha = FontParam.HEADER.getStyleDefinition()
ha = FontParam.HEADER.getStyleDefinition(null)
.getMergedStyle(((UmlDiagram) diagram).getSkinParam().getCurrentStyleBuilder())
.getHorizontalAlignment();
}

View File

@ -136,7 +136,8 @@ public class CommandPackage extends SingleLineCommand2<AbstractEntityDiagram> {
// p.setThisIsTogether();
// } else
if (stereotype != null) {
final USymbol usymbol = USymbol.getFromString(stereotype, diagram.getSkinParam().getActorStyle());
final USymbol usymbol = USymbol.fromString(stereotype, diagram.getSkinParam().actorStyle(),
diagram.getSkinParam().componentStyle(), diagram.getSkinParam().packageStyle());
if (usymbol == null) {
p.setStereotype(new Stereotype(stereotype));
} else {

View File

@ -219,12 +219,9 @@ public abstract class UmlDiagramFactory extends PSystemAbstractFactory {
addTitleCommands(cmds);
addCommonCommands2(cmds);
addCommonHides(cmds);
cmds.add(new CommandStyleMultilinesCSS());
cmds.add(new CommandStyleImport());
}
final protected void addCommonCommands2(List<Command> cmds) {
// cmds.add(new CommandListSprite());
cmds.add(new CommandNope());
cmds.add(new CommandPragma());
@ -245,6 +242,10 @@ public abstract class UmlDiagramFactory extends PSystemAbstractFactory {
cmds.add(factorySpriteCommand.createMultiLine(false));
cmds.add(factorySpriteCommand.createSingleLine());
cmds.add(new CommandSpriteFile());
cmds.add(new CommandStyleMultilinesCSS());
cmds.add(new CommandStyleImport());
}
final protected void addCommonHides(List<Command> cmds) {

View File

@ -50,6 +50,9 @@ public class Sea {
private final StringBounder stringBounder;
public Sea(StringBounder stringBounder) {
if (stringBounder == null) {
throw new IllegalArgumentException();
}
this.stringBounder = stringBounder;
}

View File

@ -48,6 +48,7 @@ import net.sourceforge.plantuml.graphic.TextBlock;
import net.sourceforge.plantuml.graphic.TextBlockLineBefore;
import net.sourceforge.plantuml.graphic.TextBlockUtils;
import net.sourceforge.plantuml.skin.VisibilityModifier;
import net.sourceforge.plantuml.style.SName;
public class BodierImpl implements Bodier {
@ -83,19 +84,10 @@ public class BodierImpl implements Bodier {
}
public void addFieldOrMethod(String s) {
// if (leaf == null) {
// throw new IllegalArgumentException();
// }
// Empty cache
methodsToDisplay = null;
fieldsToDisplay = null;
rawBody.add(s);
// if (leaf instanceof ILeaf) {
// if (this.leaf != null && this.leaf != leaf) {
// throw new IllegalArgumentException();
// }
// this.leaf = (ILeaf) leaf;
// }
}
private boolean isBodyEnhanced() {
@ -203,7 +195,8 @@ public class BodierImpl implements Bodier {
final boolean showFields, Stereotype stereotype) {
if (type.isLikeClass() && isBodyEnhanced()) {
if (showMethods || showFields) {
return new BodyEnhanced(rawBodyWithoutHidden(), fontParam, skinParam, manageModifier, stereotype, leaf);
return new BodyEnhanced(rawBodyWithoutHidden(), fontParam, skinParam, manageModifier, stereotype, leaf,
SName.classDiagram);
}
return null;
}
@ -211,7 +204,7 @@ public class BodierImpl implements Bodier {
throw new IllegalStateException();
}
final MethodsOrFieldsArea fields = new MethodsOrFieldsArea(getFieldsToDisplay(), fontParam, skinParam,
stereotype, leaf);
stereotype, leaf, SName.classDiagram);
if (type == LeafType.OBJECT) {
if (showFields == false) {
return new TextBlockLineBefore(TextBlockUtils.empty(0, 0));
@ -222,7 +215,7 @@ public class BodierImpl implements Bodier {
throw new UnsupportedOperationException();
}
final MethodsOrFieldsArea methods = new MethodsOrFieldsArea(getMethodsToDisplay(), fontParam, skinParam,
stereotype, leaf);
stereotype, leaf, SName.classDiagram);
if (showFields && showMethods == false) {
return fields.asBlockMemberImpl();
} else if (showMethods && showFields == false) {

View File

@ -59,6 +59,7 @@ import net.sourceforge.plantuml.graphic.TextBlock;
import net.sourceforge.plantuml.graphic.TextBlockLineBefore;
import net.sourceforge.plantuml.graphic.TextBlockUtils;
import net.sourceforge.plantuml.graphic.TextBlockVertical2;
import net.sourceforge.plantuml.style.SName;
import net.sourceforge.plantuml.svek.Ports;
import net.sourceforge.plantuml.svek.WithPorts;
import net.sourceforge.plantuml.ugraphic.UGraphic;
@ -79,9 +80,11 @@ public class BodyEnhanced extends AbstractTextBlock implements TextBlock, WithPo
private final ILeaf entity;
private final boolean inEllipse;
private final double minClassWidth;
private final SName diagramType;
public BodyEnhanced(List<String> rawBody, FontParam fontParam, ISkinParam skinParam, boolean manageModifier,
Stereotype stereotype, ILeaf entity) {
Stereotype stereotype, ILeaf entity, SName diagramType) {
this.diagramType = diagramType;
this.rawBody = new ArrayList<CharSequence>(rawBody);
this.stereotype = stereotype;
this.fontParam = fontParam;
@ -98,13 +101,16 @@ public class BodyEnhanced extends AbstractTextBlock implements TextBlock, WithPo
}
public BodyEnhanced(Display display, FontParam fontParam, ISkinParam skinParam, HorizontalAlignment align,
Stereotype stereotype, boolean manageHorizontalLine, boolean manageModifier, ILeaf entity) {
this(display, fontParam, skinParam, align, stereotype, manageHorizontalLine, manageHorizontalLine, entity, 0);
Stereotype stereotype, boolean manageHorizontalLine, boolean manageModifier, ILeaf entity,
SName diagramType) {
this(display, fontParam, skinParam, align, stereotype, manageHorizontalLine, manageHorizontalLine, entity, 0,
diagramType);
}
public BodyEnhanced(Display display, FontParam fontParam, ISkinParam skinParam, HorizontalAlignment align,
Stereotype stereotype, boolean manageHorizontalLine, boolean manageModifier, ILeaf entity,
double minClassWidth) {
double minClassWidth, SName diagramType) {
this.diagramType = diagramType;
this.minClassWidth = minClassWidth;
this.entity = entity;
this.stereotype = stereotype;
@ -163,17 +169,15 @@ public class BodyEnhanced extends AbstractTextBlock implements TextBlock, WithPo
} else {
final String s = s2.toString();
if (manageHorizontalLine && isBlockSeparator(s)) {
blocks.add(decorate(stringBounder,
new MethodsOrFieldsArea(members, fontParam, skinParam, align, stereotype, entity),
separator, title));
blocks.add(decorate(stringBounder, new MethodsOrFieldsArea(members, fontParam, skinParam, align,
stereotype, entity, diagramType), separator, title));
separator = s.charAt(0);
title = getTitle(s, skinParam);
members = new ArrayList<Member>();
} else if (Parser.isTreeStart(s)) {
if (members.size() > 0) {
blocks.add(decorate(stringBounder,
new MethodsOrFieldsArea(members, fontParam, skinParam, align, stereotype, entity),
separator, title));
blocks.add(decorate(stringBounder, new MethodsOrFieldsArea(members, fontParam, skinParam, align,
stereotype, entity, diagramType), separator, title));
}
members = new ArrayList<Member>();
final List<CharSequence> allTree = buildAllTree(s, it);
@ -193,7 +197,8 @@ public class BodyEnhanced extends AbstractTextBlock implements TextBlock, WithPo
members.add(new Member("", false, false));
}
blocks.add(decorate(stringBounder,
new MethodsOrFieldsArea(members, fontParam, skinParam, align, stereotype, entity), separator, title));
new MethodsOrFieldsArea(members, fontParam, skinParam, align, stereotype, entity, diagramType),
separator, title));
if (blocks.size() == 1) {
this.area = blocks.get(0);

View File

@ -41,6 +41,8 @@ import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import net.sourceforge.plantuml.BackSlash;
import net.sourceforge.plantuml.EmbeddedDiagram;
@ -313,6 +315,23 @@ public class Display implements Iterable<CharSequence> {
return new Display(result, this.naturalHorizontalAlignment, this.isNull, this.defaultCreoleMode);
}
public Display underlinedName() {
final Pattern p = Pattern.compile("^([^:]+?)(\\s*:.+)$");
final List<CharSequence> result = new ArrayList<CharSequence>();
for (CharSequence line : displayData) {
if (result.size() == 0) {
final Matcher m = p.matcher(line);
if (m.matches())
result.add("<u>" + m.group(1) + "</u>" + m.group(2));
else
result.add("<u>" + line);
} else {
result.add("<u>" + line);
}
}
return new Display(result, this.naturalHorizontalAlignment, this.isNull, this.defaultCreoleMode);
}
public Display withCreoleMode(CreoleMode mode) {
if (isNull) {
throw new IllegalArgumentException();

View File

@ -81,30 +81,26 @@ public class MethodsOrFieldsArea extends AbstractTextBlock implements TextBlockW
private final FontParam fontParam;
private final ISkinParam skinParam;
// private final HColor color;
// private final HColor hyperlinkColor;
// private final boolean useUnderlineForHyperlink;
private final Rose rose = new Rose();
private final List<Member> members = new ArrayList<Member>();
private final HorizontalAlignment align;
private final Stereotype stereotype;
private final ILeaf leaf;
private final SName diagramType;
public MethodsOrFieldsArea(List<Member> members, FontParam fontParam, ISkinParam skinParam, Stereotype stereotype,
ILeaf leaf) {
this(members, fontParam, skinParam, HorizontalAlignment.LEFT, stereotype, leaf);
ILeaf leaf, SName diagramType) {
this(members, fontParam, skinParam, HorizontalAlignment.LEFT, stereotype, leaf, diagramType);
}
public MethodsOrFieldsArea(List<Member> members, FontParam fontParam, ISkinParam skinParam,
HorizontalAlignment align, Stereotype stereotype, ILeaf leaf) {
HorizontalAlignment align, Stereotype stereotype, ILeaf leaf, SName diagramType) {
this.diagramType = diagramType;
this.leaf = leaf;
this.stereotype = stereotype;
this.align = align;
this.skinParam = skinParam;
this.fontParam = fontParam;
// this.color = rose.getFontColor(skinParam, fontParam);
// this.hyperlinkColor = skinParam.getHyperlinkColor();
// this.useUnderlineForHyperlink = skinParam.useUnderlineForHyperlink();
this.members.addAll(members);
}
@ -165,7 +161,9 @@ public class MethodsOrFieldsArea extends AbstractTextBlock implements TextBlockW
}
FontConfiguration config;
if (SkinParam.USE_STYLES()) {
final Style style = StyleSignature.of(SName.root, SName.element, SName.componentDiagram, SName.component)
// final Style style = StyleSignature.of(SName.root, SName.element, SName.componentDiagram, SName.component)
// .getMergedStyle(skinParam.getCurrentStyleBuilder());
final Style style = fontParam.getStyleDefinition(diagramType)
.getMergedStyle(skinParam.getCurrentStyleBuilder());
config = new FontConfiguration(style, skinParam, stereotype, fontParam);
} else {

View File

@ -145,7 +145,7 @@ public class CommandCreateDomain extends SingleLineCommand2<DescriptionDiagram>
type = "biddable";
}
}
USymbol usymbol = USymbol.getFromString(type, diagram.getSkinParam());
USymbol usymbol = USymbol.fromString(type, diagram.getSkinParam());
entity.setUSymbol(usymbol);
return CommandExecutionResult.ok();
}

View File

@ -75,14 +75,14 @@ public class DescriptionDiagram extends AbstractEntityDiagram {
if (type == null) {
String codeString = code.getName();
if (codeString.startsWith("[") && codeString.endsWith("]")) {
final USymbol sym = getSkinParam().componentStyle().toSymbol() ;
final USymbol sym = getSkinParam().componentStyle().toUSymbol() ;
final Ident idNewLong = ident.eventuallyRemoveStartingAndEndingDoubleQuote("\"([:");
return getOrCreateLeafDefault(idNewLong, idNewLong.toCode(this), LeafType.DESCRIPTION, sym);
}
if (codeString.startsWith(":") && codeString.endsWith(":")) {
final Ident idNewLong = ident.eventuallyRemoveStartingAndEndingDoubleQuote("\"([:");
return getOrCreateLeafDefault(idNewLong, idNewLong.toCode(this), LeafType.DESCRIPTION,
getSkinParam().getActorStyle().getUSymbol());
getSkinParam().actorStyle().toUSymbol());
}
if (codeString.startsWith("()")) {
codeString = StringUtils.trin(codeString.substring(2));
@ -103,7 +103,7 @@ public class DescriptionDiagram extends AbstractEntityDiagram {
for (ILeaf leaf : getLeafsvalues()) {
final LeafType type = leaf.getLeafType();
final USymbol usymbol = leaf.getUSymbol();
if (type == LeafType.USECASE || usymbol == getSkinParam().getActorStyle().getUSymbol()) {
if (type == LeafType.USECASE || usymbol == getSkinParam().actorStyle().toUSymbol()) {
return true;
}
}
@ -114,7 +114,7 @@ public class DescriptionDiagram extends AbstractEntityDiagram {
public void makeDiagramReady() {
super.makeDiagramReady();
final LeafType defaultType = isUsecase() ? LeafType.DESCRIPTION : LeafType.DESCRIPTION;
final USymbol defaultSymbol = isUsecase() ? getSkinParam().getActorStyle().getUSymbol() : USymbol.INTERFACE;
final USymbol defaultSymbol = isUsecase() ? getSkinParam().actorStyle().toUSymbol() : USymbol.INTERFACE;
for (ILeaf leaf : getLeafsvalues()) {
if (leaf.getLeafType() == LeafType.STILL_UNKNOWN) {
leaf.muteToType(defaultType, defaultSymbol);

View File

@ -56,6 +56,7 @@ import net.sourceforge.plantuml.graphic.StringBounder;
import net.sourceforge.plantuml.graphic.TextBlock;
import net.sourceforge.plantuml.graphic.TextBlockUtils;
import net.sourceforge.plantuml.graphic.color.ColorType;
import net.sourceforge.plantuml.style.SName;
import net.sourceforge.plantuml.svek.AbstractEntityImage;
import net.sourceforge.plantuml.svek.ShapeType;
import net.sourceforge.plantuml.ugraphic.AbstractUGraphicHorizontalLine;
@ -78,7 +79,7 @@ public class EntityImageRequirement extends AbstractEntityImage {
final Stereotype stereotype = entity.getStereotype();
final TextBlock tmp = new BodyEnhanced(entity.getDisplay(), FontParam.REQUIREMENT, skinParam,
HorizontalAlignment.CENTER, stereotype, true, false, entity);
HorizontalAlignment.CENTER, stereotype, true, false, entity, SName.componentDiagram);
if (stereotype == null || stereotype.getLabel(Guillemet.DOUBLE_COMPARATOR) == null) {
this.desc = tmp;

View File

@ -178,7 +178,7 @@ public class CommandCreateElementFull extends SingleLineCommand2<DescriptionDiag
if (symbol == null) {
type = LeafType.DESCRIPTION;
usymbol = diagram.getSkinParam().getActorStyle().getUSymbol();
usymbol = diagram.getSkinParam().actorStyle().toUSymbol();
} else if (symbol.equalsIgnoreCase("portin")) {
type = LeafType.PORTIN;
usymbol = null;
@ -196,7 +196,7 @@ public class CommandCreateElementFull extends SingleLineCommand2<DescriptionDiag
usymbol = null;
} else {
type = LeafType.DESCRIPTION;
usymbol = USymbol.getFromString(symbol, diagram.getSkinParam());
usymbol = USymbol.fromString(symbol, diagram.getSkinParam());
if (usymbol == null) {
throw new IllegalStateException();
}

View File

@ -60,6 +60,8 @@ import net.sourceforge.plantuml.cucadiagram.Stereotype;
import net.sourceforge.plantuml.graphic.USymbol;
import net.sourceforge.plantuml.graphic.color.ColorParser;
import net.sourceforge.plantuml.graphic.color.ColorType;
import net.sourceforge.plantuml.graphic.color.Colors;
import net.sourceforge.plantuml.ugraphic.color.HColor;
public class CommandCreateElementMultilines extends CommandMultilines2<AbstractEntityDiagram> {
@ -133,7 +135,8 @@ public class CommandCreateElementMultilines extends CommandMultilines2<AbstractE
type = LeafType.USECASE;
usymbol = null;
} else {
usymbol = USymbol.getFromString(symbol, diagram.getSkinParam().getActorStyle());
usymbol = USymbol.fromString(symbol, diagram.getSkinParam().actorStyle(),
diagram.getSkinParam().componentStyle(), diagram.getSkinParam().packageStyle());
if (usymbol == null) {
throw new IllegalStateException();
}
@ -179,9 +182,18 @@ public class CommandCreateElementMultilines extends CommandMultilines2<AbstractE
result.addUrl(url);
}
result.setSpecificColorTOBEREMOVED(ColorType.BACK,
diagram.getSkinParam().getIHtmlColorSet().getColorIfValid(line0.get("COLOR", 0)));
// final HColor backColor =
// diagram.getSkinParam().getIHtmlColorSet().getColorIfValid(line0.get("COLOR",
// 0));
final Colors colors = color().getColor(line0, diagram.getSkinParam().getIHtmlColorSet());
result.setColors(colors);
// result.setSpecificColorTOBEREMOVED(ColorType.BACK, backColor);
return CommandExecutionResult.ok();
}
private static ColorParser color() {
return ColorParser.simpleColor(ColorType.BACK);
}
}

View File

@ -155,7 +155,7 @@ public class CommandCreateElementParenthesis extends SingleLineCommand2<ClassDia
final USymbol usymbol;
type = LeafType.DESCRIPTION;
usymbol = USymbol.getFromString(symbol, diagram.getSkinParam());
usymbol = USymbol.fromString(symbol, diagram.getSkinParam());
final String idShort = StringUtils.eventuallyRemoveStartingAndEndingDoubleQuote(codeRaw);
final Ident ident = diagram.buildLeafIdent(idShort);

View File

@ -289,9 +289,9 @@ public class CommandLinkElement extends SingleLineCommand2<DescriptionDiagram> {
return getOrCreateLeaf1972(diagram, ident3, code3, LeafType.USECASE, USymbol.USECASE, pure);
} else if (codeChar == ':') {
return getOrCreateLeaf1972(diagram, ident3, code3, LeafType.DESCRIPTION,
diagram.getSkinParam().getActorStyle().getUSymbol(), pure);
diagram.getSkinParam().actorStyle().toUSymbol(), pure);
} else if (codeChar == '[') {
final USymbol sym = diagram.getSkinParam().componentStyle().toSymbol();
final USymbol sym = diagram.getSkinParam().componentStyle().toUSymbol();
return getOrCreateLeaf1972(diagram, ident3, code3, LeafType.DESCRIPTION, sym, pure);
}

View File

@ -160,7 +160,8 @@ public class CommandPackageWithUSymbol extends SingleLineCommand2<AbstractEntity
if ("together".equalsIgnoreCase(symbol)) {
p.setThisIsTogether();
}
p.setUSymbol(USymbol.getFromString(symbol, diagram.getSkinParam().getActorStyle()));
p.setUSymbol(USymbol.fromString(symbol, diagram.getSkinParam().actorStyle(),
diagram.getSkinParam().componentStyle(), diagram.getSkinParam().packageStyle()));
final String stereotype = arg.getLazzy("STEREOTYPE", 0);
if (stereotype != null) {
p.setStereotype(new Stereotype(stereotype, false));

View File

@ -74,26 +74,26 @@ public class PSystemDonors extends AbstractPSystem {
private static final int COLS = 6;
private static final int FREE_LINES = 6;
public static final String DONORS = "6ySB02mFUBXRGOc9nbfsvvsjZ8zbDKqYM9ud58U1HJpT3OW_mBtJutuZ_KLqfNlVD2FQiZN5USOGiI3e"
+ "yJIvPjZctXvupCdFe-IxmsY4GPYio__BbYQxT2r0gWmfmRDSR_uPnVYUEsbeodQv4793qY-yxupDizFu"
+ "ujMZ2Te8_1ZOL_zlwf1nUQWAmz1iXJ4O5OrGdJ_q56ijjVR_KOqBfs3VeOeUIuxfrCLrE5JHYCwA5uhL"
+ "E0UtZFFHfCMecD0cKefgeuGYEPYXhIRLvyWL6TpyKZz0cwxjcX8v4efzbaXqV-rftt60ziibFtJoGopO"
+ "8h20Ye_i9oXvRSIuoHT1GyjSzCPM7Ldo90E6KkZ2tloXB8wufsJcChIuAN062ehSne78I6hJ0hC3Ym5L"
+ "Ug95doOfkZ5kmftFOLcArKR3iy2YW2Nd06ioyZ_e4pxTTtraSioRefQKfqdUozQZSTMzbsipec_wqIHH"
+ "lhPtoTBZIb4rJ-bizUdpjRf3xfgowl4leqOyUt2tqq8Q5XyfY1-6RXiJbUJFj8M558HhA_qWNUR6AsSl"
+ "mZ4RifIjus-nPJNsyYvViJ6nB7SMUFTytMXAXbhAAkGqTBjMPIxjVAAbD3N-B_BeqVc_m9fAita7wJrB"
+ "vpB_lnjMQiOI3Zesn2pNpGB5ucbIzIusBaBJJAU6t0J83QZk9hVYRdKHVzG7vDvICX65pRO4YVPKSfUB"
+ "4APZfPjAZ02MJ2dd-XjR4FcgrS7eLaI9HSeYz35CUgRjgx1D-k1ckxanYQCwfNmIVbi8tCEmKYsQsQ5j"
+ "6tCnNiR7SLvrh_v-bRJjBRodV4ZDAnZ8AoqOOIaveZoEie-4kmOAihXBNXhYUuHr3XwwSy4PB5h6Z3RR"
+ "8Gj3SZmPP-bN31-Q37lxNJPihurDNi3xghCJmiZ8WzTBacjgSOcRV3DOJWxR08gDnIjs-PcB25LRRYgR"
+ "wnAcHgmUXGhu7VC9p9LjuSfZlTsru0nO5DN1l3lMM1gtAStR0ghBgOAOTA6CcT8KQNix6NfMfsUf3R3z"
+ "gUuBpZOVLTWqABsjeks63QPFeUaKwHSD8X4IhGgvrAGmm7Tz_4eywEiGupkzR24EaHQI5A02oZaVE9K6"
+ "ppsrbFKQ_N-jjTFA-VFlTMI3KtlSyvD2w1a8ujz3WHpX539v6lXwymVW7G6hOfPs2h1oZTppG5A3dNXd"
+ "5dN_CADp9nRApQX5hzW-LELltww0nNA83IikOccAwLkSidPg19LVzvrlB0voMFYxg38Xawkdh3P6mcVG"
+ "YnCT-vgbk7FD116CZai5xdxrMJFDkumvNx6iRZWuyiqH6L9q3osg9MbjFZsmKPpvlPLjIARxNp8Ydrzg"
+ "rlVgeRTJ_Xnf0is_jTJx6LbWcCWuCB2-tEV40pVU2AWBKpl-wMB1bOkk67PvmHRs6_iHMPxmmhPMcGXp"
+ "dswLeoyByQnsUewr9UzZez7qGQ9IU23R5-lqsOd5iWoFP84KhjbR9ej8w_I6Ixg3S8Z2-VxU1dEilFaH"
+ "cTNcqnk5NDhSYtiG-N1ycgIcNJOxSfCRwuxSRIC1-ge0";
public static final String DONORS = "6xKB02mFkBap0p4nqLYNlhbPJVbOScQJ29Rd2SLXO15FTmFY3t3lzBZVI7yHNUdUDys8jcnDSPunH2m8"
+ "UZnDhXcskRS7GbifBu8ZbU02Ka1y6oVdVUp8-_H9bI4bYAMIzTjKJ9zqAHiYuxFU2Ds0pdaRtdV6vjbf"
+ "VF7gqGHj17uCxAl_DwULTVUgAin0bzMCcL7H4weOKYCYHVn_LEEoKnlVJNKQI08wTN45DzMfW5SdF0OM"
+ "QGQtZFDgqcHKJ68JAQ7QA24a1ZEqvQJsEVAB31A_r1leqbfTGo9tGF6OAH9TZ-NsxJjeVhd4Y-0Flc2p"
+ "m1nAEOelKFpSY97myw2XPHUziLL7bZmfWA4CMjYRFnJ9aTv3ChiCBH81DL0GyZOEI4QXDaquExOOK6KF"
+ "jkZJ85MN-asuSnsMf_JSQ7WHM0HOS1PGGv3_GI_uZBxobiazDqKj8K-JU5LRZ_gLU2zjCw9l-j4aK3xR"
+ "JyrSVkKfMm_fN7cVyw_E3ddNa9MhFumwCda4TpdCfM5-Qu7w4UYsEL59V4zPM4X0kAxK6-awDrwflGZ7"
+ "R4YfMCTVOijh-X-w8fMDYULqiCXFzzUbfcImXQvCgg4tj2hJhFE9bjHGVt_9ewNpNN1DfTczW_GUQNEU"
+ "_zzrIpD3SO2EJJ4BkaMW6AocLM-nWGXE2vqVSXCW6r2-J6xvo_9B_54V4BovH20A6v9syET7o4CkN9Y1"
+ "LTsKOWGmUqevBn911oBKwX1qAwga8sNk-XacFTkMZPbbqWVNxGPZvCTqGd4HVfaBFCAmKYsQzTtQ9dO9"
+ "hl8wpglkDTglujZUmdlAJMh_aW4_mvmHaN8ZYdrFkoKyr56OnLxoL1VVq-tauA4x5vp1ecNCQBCTCWqA"
+ "Pv9nfZvYzA71y7SKifhT6vjw1U4xOIkucP46pvScrzJa4Wc_xIp7mnQ04dFnYbrHuP92rImxbQjh2PCZ"
+ "Lez2XloEzGaibMdXnjFFvgw5PsIFWZgSTyUgexvDQTuMK5rC4wIbXJ9dI9E7hGKoi5QdPwaDiFkb7GlM"
+ "DZzPiU9GVDj4suqR54o1wIBS1mqYKIvebEWb9ea1lklZL-h9VHriV7TFAyP1qa8I0rN8rLa_E3KDdbje"
+ "6kir-d-ijSEoy-VVwyWcf_Quzrq4qNEG7Fzk2j1HJY22fu6ljtmoUIV1gh58JqhcoZLAJmC92tRIExEe"
+ "HuSPhJjUB3SZ5xry-r2LFvrSWOlvu1jMNAJJvBClSTBQeHvKKTjtlh4uo67WxwBAX4okSlNQ60cTGIzE"
+ "QkmsKt6NLGgmO7PS9h3tgy-QQRnap7t7KjtmE91lZiYGOlJGmfgQriQ5m4RfpEyjR4Coe_yBHlIBQgsV"
+ "U_NGUr9-ZnI1Xczda75691WkaWuCZ9lxd6ZGpJSCyiBKdEXqiVZAHLSCEr-mmdvZFo8B2IziQwQ9iDVH"
+ "hURKnrmyfnt8CRQGVMmscbx8gmWDP66nJgzEB9HoF90YAPYpjumNaNRI6rpQEu1EKJ3-VxSXd5veVaHc"
+ "bNdrHZ6NS-x5FOXqk3-DnAPTDZEowLsdAt9Z10y0";
/*
* Special thanks to our sponsors and donors:

View File

@ -272,7 +272,10 @@ public class QuoteUtils {
"V qba'g gnxr erfcbafvovyvgl ng nyy",
"Gurer'f n jbeq sbe crbcyr jub guvax rirelbar vf pbafcvevat ntnvafg gurz: creprcgvir",
"V'yy yrg gung cnff orpnhfr guvf vf tbbqolr", "V ybir vg jura n cyna pbzrf gbtrgure",
"Znxr hf nyy fnsr. Tb onpx gb lbhe ohaxre");
"Znxr hf nyy fnsr. Tb onpx gb lbhe ohaxre", "Gh z'nf qrph, Ongzna", "Gurerfr, p'rfg har pngnfgebcur",
"Vs lbh ner abg rzoneenffrq ol gur svefg irefvba bs lbhe cebqhpg, lbh'ir ynhapurq gbb yngr",
"Zvfgnxrf znqr zl fhpprff: V znxr ehoore renfre", "Ovt Oebgure vf Jngpuvat Lbh.",
"Ab bar'f gnyxvat nobhg yrnivat gur fvatyr znexrg");
private QuoteUtils() {
}

View File

@ -141,6 +141,11 @@ public class SkinParameter {
private final CornerParam roundParam;
private final SName styleName;
@Override
public String toString() {
return name;
}
public SName getStyleName() {
return styleName;
}

View File

@ -40,12 +40,14 @@ import java.util.HashMap;
import java.util.Map;
import net.sourceforge.plantuml.ColorParam;
import net.sourceforge.plantuml.ComponentStyle;
import net.sourceforge.plantuml.Dimension2DDouble;
import net.sourceforge.plantuml.FontParam;
import net.sourceforge.plantuml.ISkinParam;
import net.sourceforge.plantuml.StringUtils;
import net.sourceforge.plantuml.creole.Stencil;
import net.sourceforge.plantuml.skin.ActorStyle;
import net.sourceforge.plantuml.svek.PackageStyle;
public abstract class USymbol {
@ -111,26 +113,6 @@ public abstract class USymbol {
return getSkinParameter().getColorParamBorder();
}
public static USymbol getFromString(String s, ActorStyle actorStyle) {
if (s == null) {
return null;
}
if (s.equalsIgnoreCase("actor")) {
return actorStyle.getUSymbol();
}
final USymbol result = all.get(StringUtils.goUpperCase(s.replaceAll("\\W", "")));
if (result == null) {
if (s.equalsIgnoreCase("component")) {
return COMPONENT2;
}
if (s.equalsIgnoreCase("entity")) {
return ENTITY_DOMAIN;
}
return null;
}
return result;
}
private static USymbol record(String code, SkinParameter skinParameter, USymbol symbol) {
all.put(StringUtils.goUpperCase(code), symbol);
return symbol;
@ -200,7 +182,28 @@ public abstract class USymbol {
};
}
public static USymbol getFromString(String symbol, ISkinParam skinParam) {
public static USymbol fromString(String s, ActorStyle actorStyle, ComponentStyle componentStyle,
PackageStyle packageStyle) {
if (s == null) {
return null;
}
if (s.equalsIgnoreCase("package")) {
return packageStyle.toUSymbol();
}
if (s.equalsIgnoreCase("actor")) {
return actorStyle.toUSymbol();
}
if (s.equalsIgnoreCase("component")) {
return componentStyle.toUSymbol();
}
if (s.equalsIgnoreCase("entity")) {
return ENTITY_DOMAIN;
}
final USymbol result = all.get(StringUtils.goUpperCase(s.replaceAll("\\W", "")));
return result;
}
public static USymbol fromString(String symbol, ISkinParam skinParam) {
USymbol usymbol = null;
if (symbol.equalsIgnoreCase("artifact")) {
usymbol = USymbol.ARTIFACT;
@ -233,9 +236,9 @@ public abstract class USymbol {
} else if (symbol.equalsIgnoreCase("agent")) {
usymbol = USymbol.AGENT;
} else if (symbol.equalsIgnoreCase("actor")) {
usymbol = skinParam.getActorStyle().getUSymbol();
usymbol = skinParam.actorStyle().toUSymbol();
} else if (symbol.equalsIgnoreCase("component")) {
usymbol = skinParam.componentStyle().toSymbol();
usymbol = skinParam.componentStyle().toUSymbol();
} else if (symbol.equalsIgnoreCase("boundary")) {
usymbol = USymbol.BOUNDARY;
} else if (symbol.equalsIgnoreCase("control")) {

View File

@ -65,7 +65,7 @@ class USymbolCloud extends USymbol {
private void drawCloud(UGraphic ug, double width, double height, boolean shadowing) {
final UPath shape = getSpecificFrontierForCloud(width, height);
if (shadowing) {
// shape.setDeltaShadow(3.0);
shape.setDeltaShadow(3.0);
}
ug.apply(UTranslate.dy(0)).draw(shape);
}

View File

@ -99,9 +99,10 @@ class USymbolComponent1 extends USymbol {
}
@Override
public TextBlock asBig(final TextBlock title, HorizontalAlignment labelAlignment, final TextBlock stereotype,
final double width, final double height, final SymbolContext symbolContext, final HorizontalAlignment stereoAlignment) {
throw new UnsupportedOperationException();
public TextBlock asBig(TextBlock title, HorizontalAlignment labelAlignment, TextBlock stereotype, double width,
double height, SymbolContext symbolContext, HorizontalAlignment stereoAlignment) {
return USymbol.COMPONENT2.asBig(title, labelAlignment, stereotype, width, height, symbolContext,
stereoAlignment);
}
@Override

View File

@ -65,6 +65,11 @@ public class USymbolFolder extends USymbol {
this.showTitle = showTitle;
}
@Override
public String toString() {
return super.toString() + " " + skinParameter + " " + showTitle;
}
@Override
public SkinParameter getSkinParameter() {
return skinParameter;
@ -167,7 +172,8 @@ public class USymbolFolder extends USymbol {
@Override
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() {
public void drawU(UGraphic ug) {

View File

@ -56,11 +56,6 @@ class USymbolStack extends USymbol {
private void drawQueue(UGraphic ug, double width, double height, boolean shadowing, double roundCorner) {
final double border = 15;
final URectangle rect = new URectangle(width - 2 * border, height).rounded(roundCorner);
if (shadowing) {
rect.setDeltaShadow(3.0);
}
ug.apply(new HColorNone()).apply(UTranslate.dx(border)).draw(rect);
final UPath path = new UPath();
if (roundCorner == 0) {
path.moveTo(0, 0);
@ -81,7 +76,12 @@ class USymbolStack extends USymbol {
path.arcTo(new Point2D.Double(width - border + roundCorner / 2, 0), roundCorner / 2, 0, 1);
path.lineTo(width, 0);
}
if (shadowing) {
path.setDeltaShadow(3.0);
}
ug.apply(new HColorNone().bg()).draw(path);
final URectangle rect = new URectangle(width - 2 * border, height).rounded(roundCorner);
ug.apply(new HColorNone()).apply(UTranslate.dx(border)).draw(rect);
}
private Margin getMargin() {

View File

@ -93,6 +93,7 @@ import net.sourceforge.plantuml.graphic.TextBlockWidth;
import net.sourceforge.plantuml.graphic.UDrawable;
import net.sourceforge.plantuml.graphic.USymbol;
import net.sourceforge.plantuml.style.ClockwiseTopRightBottomLeft;
import net.sourceforge.plantuml.style.SName;
import net.sourceforge.plantuml.svek.Bibliotekon;
import net.sourceforge.plantuml.svek.Cluster;
import net.sourceforge.plantuml.svek.CucaDiagramFileMaker;
@ -236,7 +237,7 @@ public class CucaDiagramFileMakerJDot implements CucaDiagramFileMaker {
attribute = new TextBlockEmpty();
} else {
attribute = new MethodsOrFieldsArea(members, FontParam.STATE_ATTRIBUTE, diagram.getSkinParam(),
g.getStereotype(), null);
g.getStereotype(), null, SName.stateDiagram);
}
final Dimension2D dimAttribute = attribute.calculateDimension(stringBounder);
final double attributeHeight = dimAttribute.getHeight();
@ -427,8 +428,9 @@ public class CucaDiagramFileMakerJDot implements CucaDiagramFileMaker {
margin1 = 0;
margin2 = 10;
}
final ImageBuilder imageBuilder = ImageBuilder.buildD(diagram.getSkinParam(), ClockwiseTopRightBottomLeft.margin1margin2((double) margin1, (double) margin2), diagram.getAnimation(), fileFormatOption.isWithMetadata() ? diagram.getMetadata() : null,
null, scale);
final ImageBuilder imageBuilder = ImageBuilder.buildD(diagram.getSkinParam(),
ClockwiseTopRightBottomLeft.margin1margin2(margin1, margin2), diagram.getAnimation(),
fileFormatOption.isWithMetadata() ? diagram.getMetadata() : null, null, scale);
imageBuilder.setUDrawable(new Drawing(null));
final Dimension2D dim = imageBuilder.getFinalDimension(stringBounder);

View File

@ -35,6 +35,7 @@
package net.sourceforge.plantuml.nwdiag;
import net.sourceforge.plantuml.ColorParam;
import net.sourceforge.plantuml.ComponentStyle;
import net.sourceforge.plantuml.SpriteContainerEmpty;
import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.graphic.FontConfiguration;
@ -44,6 +45,7 @@ import net.sourceforge.plantuml.graphic.TextBlock;
import net.sourceforge.plantuml.graphic.TextBlockUtils;
import net.sourceforge.plantuml.graphic.USymbol;
import net.sourceforge.plantuml.skin.ActorStyle;
import net.sourceforge.plantuml.svek.PackageStyle;
import net.sourceforge.plantuml.ugraphic.UFont;
import net.sourceforge.plantuml.ugraphic.color.HColorUtils;
@ -88,8 +90,8 @@ public class DiagElement {
final SymbolContext symbolContext = new SymbolContext(ColorParam.activityBackground.getDefaultValue(),
ColorParam.activityBorder.getDefaultValue()).withShadow(3);
final TextBlock desc = toTextBlock(description);
final TextBlock box = shape.asSmall(TextBlockUtils.empty(0, 0), desc, TextBlockUtils.empty(0, 0),
symbolContext, HorizontalAlignment.CENTER);
final TextBlock box = shape.asSmall(TextBlockUtils.empty(0, 0), desc, TextBlockUtils.empty(0, 0), symbolContext,
HorizontalAlignment.CENTER);
return new LinkedElement(ad1, box, ad2, mainNetwork, this);
}
@ -110,7 +112,8 @@ public class DiagElement {
}
public final void setShape(String shapeName) {
final USymbol shapeFromString = USymbol.getFromString(shapeName, ActorStyle.STICKMAN);
final USymbol shapeFromString = USymbol.fromString(shapeName, ActorStyle.STICKMAN, ComponentStyle.RECTANGLE,
PackageStyle.RECTANGLE);
if (shapeFromString != null) {
this.shape = shapeFromString;
}

View File

@ -1,66 +0,0 @@
/* ========================================================================
* 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.objectdiagram;
import net.sourceforge.plantuml.ISkinSimple;
import net.sourceforge.plantuml.UmlDiagramType;
import net.sourceforge.plantuml.cucadiagram.Code;
import net.sourceforge.plantuml.cucadiagram.ILeaf;
import net.sourceforge.plantuml.cucadiagram.Ident;
import net.sourceforge.plantuml.cucadiagram.LeafType;
import net.sourceforge.plantuml.graphic.USymbol;
public class ObjectDiagram extends AbstractClassOrObjectDiagram {
public ObjectDiagram(ISkinSimple skinParam) {
super(skinParam);
}
@Override
public ILeaf getOrCreateLeaf(Ident ident, Code code, LeafType type, USymbol symbol) {
if (type == null) {
type = LeafType.OBJECT;
}
// final Ident idNewLong = buildLeafIdent(id);
return getOrCreateLeafDefault(ident, code, type, symbol);
}
@Override
public UmlDiagramType getUmlDiagramType() {
return UmlDiagramType.OBJECT;
}
}

View File

@ -35,13 +35,12 @@
*/
package net.sourceforge.plantuml.pdf;
import java.io.File;
import java.lang.reflect.Method;
import net.sourceforge.plantuml.security.SFile;
public class PdfConverter {
public static void convert(SFile svgFile, SFile pdfFile) {
public static void convert(File svgFile, File pdfFile) {
if (svgFile.exists() == false) {
throw new IllegalArgumentException();

View File

@ -38,6 +38,7 @@ package net.sourceforge.plantuml.security;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
@ -46,6 +47,13 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import javax.swing.ImageIcon;
@ -120,7 +128,7 @@ public class SURL {
}
final int port = internal.getPort();
// Using INTERNET profile, port 80 and 443 are ok
if (port == 80 || port == 443) {
if (port == 80 || port == 443 || port == -1) {
return true;
}
}
@ -128,11 +136,11 @@ public class SURL {
}
private boolean pureIP(String full) {
if (full.matches("^https?://\\d+\\.\\d+\\.\\d+\\.\\d+\\/")) {
return false;
}
if (full.matches("^https?://\\d+\\.\\d+\\.\\d+\\.\\d+.*")) {
return true;
}
return false;
}
private boolean isInAllowList() {
final String full = cleanPath(internal.toString());
@ -160,10 +168,27 @@ public class SURL {
return Arrays.asList(StringUtils.eventuallyRemoveStartingAndEndingDoubleQuote(env).split(";"));
}
private final static ExecutorService exe = Executors.newCachedThreadPool();
private final static Map<String, Long> badHosts = new ConcurrentHashMap<String, Long>();
// Added by Alain Corbiere
public byte[] getBytes() {
if (isUrlOk())
try {
if (isUrlOk() == false) {
return null;
}
final String host = internal.getHost();
final Long bad = badHosts.get(host);
if (bad != null) {
final long duration = System.currentTimeMillis() - bad;
if (duration < 1000L * 60) {
// System.err.println("BAD HOST!" + host);
return null;
}
// System.err.println("cleaning " + host);
badHosts.remove(host);
}
final Future<byte[]> result = exe.submit(new Callable<byte[]>() {
public byte[] call() throws IOException {
InputStream input = null;
try {
final URLConnection connection = internal.openConnection();
@ -184,9 +209,18 @@ public class SURL {
input.close();
}
}
} catch (Exception e) {
e.printStackTrace();
}
});
try {
byte data[] = result.get(SecurityUtils.getSecurityProfile().getTimeout(), TimeUnit.MILLISECONDS);
if (data != null) {
return data;
}
} catch (Exception e) {
System.err.println("issue " + host + " " + e);
}
badHosts.put(host, System.currentTimeMillis());
return null;
}

View File

@ -136,4 +136,24 @@ public enum SecurityProfile {
}
return "<i>This is completely safe: no access on local files or on distant URL.";
}
/**
* Retrieve the timeout for URL.
*/
public long getTimeout() {
switch (this) {
case SANDBOX:
return 1000L;
case ALLOWLIST:
return 1000L * 60 * 5;
case INTERNET:
return 1000L * 10;
case LEGACY:
return 1000L * 60;
case UNSECURE:
return 1000L * 60 * 5;
}
throw new AssertionError();
}
}

View File

@ -327,7 +327,7 @@ public class SequenceDiagramFileMakerPuma2 implements FileMaker {
final DisplaySection display = diagram.getFooterOrHeaderTeoz(fontParam).withPage(page + 1, pages.size());
Style style = null;
if (SkinParam.USE_STYLES()) {
final StyleSignature def = fontParam.getStyleDefinition();
final StyleSignature def = fontParam.getStyleDefinition(null);
style = def.getMergedStyle(skinParam.getCurrentStyleBuilder());
}
return new PngTitler(titleColor, display, fontSize, fontFamily, hyperlinkColor,

View File

@ -270,7 +270,7 @@ public class SequenceDiagramFileMakerTeoz implements FileMaker {
Style style = null;
final ISkinParam skinParam = diagram.getSkinParam();
if (SkinParam.USE_STYLES()) {
final StyleSignature def = param.getStyleDefinition();
final StyleSignature def = param.getStyleDefinition(null);
style = def.getMergedStyle(skinParam.getCurrentStyleBuilder());
}
final PngTitler pngTitler = new PngTitler(titleColor, display, fontSize, fontFamily, hyperlinkColor,
@ -296,7 +296,7 @@ public class SequenceDiagramFileMakerTeoz implements FileMaker {
HorizontalAlignment titleAlignment = HorizontalAlignment.CENTER;
if (SkinParam.USE_STYLES()) {
final StyleSignature def = FontParam.TITLE.getStyleDefinition();
final StyleSignature def = FontParam.TITLE.getStyleDefinition(null);
titleAlignment = def.getMergedStyle(diagram.getSkinParam().getCurrentStyleBuilder())
.getHorizontalAlignment();
}

View File

@ -43,7 +43,7 @@ public enum ActorStyle {
STICKMAN, AWESOME;
public USymbol getUSymbol() {
public USymbol toUSymbol() {
if (this == STICKMAN) {
return USymbol.ACTOR_STICKMAN;
} else if (this == AWESOME) {

View File

@ -78,7 +78,7 @@ public abstract class AbstractComponentRoseArrow extends AbstractTextualComponen
@Override
final protected TextBlock getTextBlock() {
final Padder padder = getISkinSimple() instanceof ISkinParam ? ((ISkinParam) getISkinSimple())
.getSequenceDiagramPadder() : Padder.NONE;
.sequenceDiagramPadder() : Padder.NONE;
return padder.apply(super.getTextBlock());
}

View File

@ -143,13 +143,13 @@ public class Rose {
getStroke(param, LineParam.sequenceLifeLineBorder, 1.5), param.getIHtmlColorSet());
}
if (type == ComponentType.ACTOR_HEAD) {
return new ComponentRoseActor(param.getActorStyle(), styles == null ? null : styles[0],
return new ComponentRoseActor(param.actorStyle(), styles == null ? null : styles[0],
styles == null ? null : styles[1], getSymbolContext(stereotype, param, ColorParam.actorBorder),
getUFont2(param, FontParam.ACTOR), stringsToDisplay, true, param, newFontForStereotype,
getFontColor(param, FontParam.SEQUENCE_STEREOTYPE));
}
if (type == ComponentType.ACTOR_TAIL) {
return new ComponentRoseActor(param.getActorStyle(), styles == null ? null : styles[0],
return new ComponentRoseActor(param.actorStyle(), styles == null ? null : styles[0],
styles == null ? null : styles[1], getSymbolContext(stereotype, param, ColorParam.actorBorder),
getUFont2(param, FontParam.ACTOR), stringsToDisplay, false, param, newFontForStereotype,
getFontColor(param, FontParam.SEQUENCE_STEREOTYPE));

View File

@ -354,7 +354,7 @@ public class Cluster implements Moveable {
}
PackageStyle packageStyle = group.getPackageStyle();
if (packageStyle == null) {
packageStyle = skinParam2.getPackageStyle();
packageStyle = skinParam2.packageStyle();
}
if (border != null) {
final HColor tmp = skinParam2.getHtmlColor(border, group.getStereotype(), false);
@ -512,7 +512,7 @@ public class Cluster implements Moveable {
attribute = new TextBlockEmpty();
} else {
attribute = new MethodsOrFieldsArea(members, FontParam.STATE_ATTRIBUTE, skinParam, group.getStereotype(),
null);
null, SName.stateDiagram);
}
return attribute;
}
@ -836,12 +836,12 @@ public class Cluster implements Moveable {
printCluster1(sb, lines, stringBounder);
final Node added = printCluster2(sb, lines, stringBounder, dotMode, graphvizVersion, type);
if (entityPositionsExceptNormal.size() > 0 && added == null) {
if (entityPositionsExceptNormal.size() > 0) {
if (hasPort()) {
sb.append(empty() + " [shape=rect,width=.01,height=.01,label=");
sb.append(label);
sb.append("];");
} else {
} else if (added == null) {
sb.append(empty() + " [shape=point,width=.01,label=\"\"];");
}
SvekUtils.println(sb);
@ -874,7 +874,11 @@ public class Cluster implements Moveable {
}
private String empty() {
return "empty" + color;
// return "empty" + color;
// We use the same node with one for thereALinkFromOrToGroup2 as an empty
// because we cannot put a new node in the nested inside of the cluster
// if thereALinkFromOrToGroup2 is enabled.
return getSpecialPointId(group);
}
public boolean isLabel() {

View File

@ -631,7 +631,7 @@ public final class GeneralImageBuilder {
attribute = new TextBlockEmpty();
} else {
attribute = new MethodsOrFieldsArea(members, FontParam.STATE_ATTRIBUTE, dotData.getSkinParam(),
g.getStereotype(), null);
g.getStereotype(), null, SName.stateDiagram);
}
final Dimension2D dimAttribute = attribute.calculateDimension(stringBounder);
final double attributeHeight = dimAttribute.getHeight();

View File

@ -85,7 +85,7 @@ public enum PackageStyle {
return USymbol.RECTANGLE;
}
if (this == FOLDER) {
return USymbol.FOLDER;
return USymbol.PACKAGE;
}
return null;
}

View File

@ -45,6 +45,7 @@ import net.sourceforge.plantuml.FontParam;
import net.sourceforge.plantuml.ISkinParam;
import net.sourceforge.plantuml.LineConfigurable;
import net.sourceforge.plantuml.LineParam;
import net.sourceforge.plantuml.SkinParam;
import net.sourceforge.plantuml.SkinParamUtils;
import net.sourceforge.plantuml.Url;
import net.sourceforge.plantuml.creole.Stencil;
@ -57,6 +58,10 @@ import net.sourceforge.plantuml.graphic.InnerStrategy;
import net.sourceforge.plantuml.graphic.StringBounder;
import net.sourceforge.plantuml.graphic.TextBlock;
import net.sourceforge.plantuml.graphic.color.ColorType;
import net.sourceforge.plantuml.style.PName;
import net.sourceforge.plantuml.style.SName;
import net.sourceforge.plantuml.style.Style;
import net.sourceforge.plantuml.style.StyleSignature;
import net.sourceforge.plantuml.svek.AbstractEntityImage;
import net.sourceforge.plantuml.svek.Margins;
import net.sourceforge.plantuml.svek.Ports;
@ -133,6 +138,14 @@ public class EntityImageClass extends AbstractEntityImage implements Stencil, Wi
}
}
private Style getStyle() {
return getDefaultStyleDefinition().getMergedStyle(getSkinParam().getCurrentStyleBuilder());
}
private StyleSignature getDefaultStyleDefinition() {
return StyleSignature.of(SName.root, SName.element, SName.classDiagram, SName.class_);
}
private void drawInternal(UGraphic ug) {
final StringBounder stringBounder = ug.getStringBounder();
final Dimension2D dimTotal = calculateDimension(stringBounder);
@ -147,12 +160,19 @@ public class EntityImageClass extends AbstractEntityImage implements Stencil, Wi
}
HColor classBorder = lineConfig.getColors(getSkinParam()).getColor(ColorType.LINE);
HColor headerBackcolor = getEntity().getColors(getSkinParam()).getColor(ColorType.HEADER);
if (classBorder == null) {
if (SkinParam.USE_STYLES())
classBorder = getStyle().value(PName.LineColor).asColor(getSkinParam().getIHtmlColorSet());
else
classBorder = SkinParamUtils.getColor(getSkinParam(), getStereo(), ColorParam.classBorder);
}
ug = ug.apply(classBorder);
HColor backcolor = getEntity().getColors(getSkinParam()).getColor(ColorType.BACK);
if (backcolor == null) {
if (SkinParam.USE_STYLES())
backcolor = getStyle().value(PName.BackGroundColor).asColor(getSkinParam().getIHtmlColorSet());
else {
if (leafType == LeafType.ENUM) {
backcolor = SkinParamUtils.getColor(getSkinParam(), getStereo(), ColorParam.enumBackground,
ColorParam.classBackground);
@ -160,12 +180,17 @@ public class EntityImageClass extends AbstractEntityImage implements Stencil, Wi
backcolor = SkinParamUtils.getColor(getSkinParam(), getStereo(), ColorParam.classBackground);
}
}
}
ug = ug.apply(classBorder);
ug = ug.apply(backcolor.bg());
final UStroke stroke = getStroke();
HColor headerBackcolor = getEntity().getColors(getSkinParam()).getColor(ColorType.HEADER);
if (headerBackcolor == null) {
if (SkinParam.USE_STYLES())
headerBackcolor = getStyle().value(PName.BackGroundColor).asColor(getSkinParam().getIHtmlColorSet());
else
headerBackcolor = getSkinParam().getHtmlColor(ColorParam.classHeaderBackground, getStereo(), false);
}
UGraphic ugHeader = ug;

View File

@ -41,6 +41,7 @@ import net.sourceforge.plantuml.ColorParam;
import net.sourceforge.plantuml.FontParam;
import net.sourceforge.plantuml.Guillemet;
import net.sourceforge.plantuml.ISkinParam;
import net.sourceforge.plantuml.SkinParam;
import net.sourceforge.plantuml.SkinParamUtils;
import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.cucadiagram.EntityPortion;
@ -58,6 +59,8 @@ import net.sourceforge.plantuml.graphic.TextBlockUtils;
import net.sourceforge.plantuml.graphic.VerticalAlignment;
import net.sourceforge.plantuml.skin.VisibilityModifier;
import net.sourceforge.plantuml.skin.rose.Rose;
import net.sourceforge.plantuml.style.SName;
import net.sourceforge.plantuml.style.Style;
import net.sourceforge.plantuml.svek.AbstractEntityImage;
import net.sourceforge.plantuml.svek.HeaderLayout;
import net.sourceforge.plantuml.svek.ShapeType;
@ -78,7 +81,15 @@ public class EntityImageClassHeader extends AbstractEntityImage {
final Stereotype stereotype = entity.getStereotype();
final boolean displayGenericWithOldFashion = skinParam.displayGenericWithOldFashion();
final String generic = displayGenericWithOldFashion ? null : entity.getGeneric();
FontConfiguration fontConfigurationName = new FontConfiguration(getSkinParam(), FontParam.CLASS, stereotype);
FontConfiguration fontConfigurationName;
if (SkinParam.USE_STYLES()) {
final Style style = FontParam.CLASS.getStyleDefinition(SName.classDiagram)
.getMergedStyle(skinParam.getCurrentStyleBuilder());
fontConfigurationName = new FontConfiguration(style, skinParam, stereotype, FontParam.CLASS);
} else {
fontConfigurationName = new FontConfiguration(getSkinParam(), FontParam.CLASS, stereotype);
}
if (italic) {
fontConfigurationName = fontConfigurationName.italic();
}
@ -105,8 +116,7 @@ public class EntityImageClassHeader extends AbstractEntityImage {
|| portionShower.showPortion(EntityPortion.STEREOTYPE, entity) == false) {
stereo = null;
} else {
stereo = TextBlockUtils.withMargin(
Display.create(stereotype.getLabels(skinParam.guillemet())).create(
stereo = TextBlockUtils.withMargin(Display.create(stereotype.getLabels(skinParam.guillemet())).create(
new FontConfiguration(getSkinParam(), FontParam.CLASS_STEREOTYPE, stereotype),
HorizontalAlignment.CENTER, skinParam), 1, 0);
}
@ -119,8 +129,7 @@ public class EntityImageClassHeader extends AbstractEntityImage {
new FontConfiguration(getSkinParam(), FontParam.CLASS_STEREOTYPE, stereotype),
HorizontalAlignment.CENTER, skinParam);
genericBlock = TextBlockUtils.withMargin(genericBlock, 1, 1);
final HColor classBackground = SkinParamUtils
.getColor(getSkinParam(), stereotype, ColorParam.background);
final HColor classBackground = SkinParamUtils.getColor(getSkinParam(), stereotype, ColorParam.background);
final HColor classBorder = SkinParamUtils.getFontColor(getSkinParam(), FontParam.CLASS_STEREOTYPE,
stereotype);

View File

@ -123,7 +123,7 @@ public class EntityImageDescription extends AbstractEntityImage {
} else {
desc = new BodyEnhanced(entity.getDisplay(), symbol.getFontParam(), getSkinParam(),
HorizontalAlignment.LEFT, stereotype, symbol.manageHorizontalLine(), false, entity,
skinParam.minClassWidth());
skinParam.minClassWidth(), SName.componentDiagram);
}
this.url = entity.getUrl99();
@ -180,7 +180,7 @@ public class EntityImageDescription extends AbstractEntityImage {
}
name = new BodyEnhanced(codeDisplay, symbol.getFontParam(), getSkinParam(), HorizontalAlignment.CENTER,
stereotype, symbol.manageHorizontalLine(), false, entity);
stereotype, symbol.manageHorizontalLine(), false, entity, SName.componentDiagram);
if (hideText) {
asSmall = symbol.asSmall(TextBlockUtils.empty(0, 0), TextBlockUtils.empty(0, 0), TextBlockUtils.empty(0, 0),
@ -191,7 +191,7 @@ public class EntityImageDescription extends AbstractEntityImage {
}
private USymbol getUSymbol(ILeaf entity) {
final USymbol result = entity.getUSymbol() == null ? getSkinParam().componentStyle().toSymbol()
final USymbol result = entity.getUSymbol() == null ? getSkinParam().componentStyle().toUSymbol()
: entity.getUSymbol();
if (result == null) {
throw new IllegalArgumentException();

View File

@ -121,7 +121,7 @@ public class EntityImageEmptyPackage extends AbstractEntityImage {
final double roundCorner = 0;
final UStroke stroke = GeneralImageBuilder.getForcedStroke(getEntity().getStereotype(), getSkinParam());
final ClusterDecoration decoration = new ClusterDecoration(getSkinParam().getPackageStyle(), null, desc,
final ClusterDecoration decoration = new ClusterDecoration(getSkinParam().packageStyle(), null, desc,
stereoBlock, 0, 0, widthTotal, heightTotal, stroke);
final double shadowing = getSkinParam().shadowing(getEntity().getStereotype()) ? 3 : 0;

View File

@ -56,6 +56,7 @@ import net.sourceforge.plantuml.graphic.TextBlock;
import net.sourceforge.plantuml.graphic.TextBlockUtils;
import net.sourceforge.plantuml.graphic.USymbol;
import net.sourceforge.plantuml.graphic.color.ColorType;
import net.sourceforge.plantuml.style.SName;
import net.sourceforge.plantuml.svek.AbstractEntityImage;
import net.sourceforge.plantuml.svek.ShapeType;
import net.sourceforge.plantuml.ugraphic.UEllipse;
@ -76,14 +77,14 @@ public class EntityImageLollipopInterfaceEye2 extends AbstractEntityImage {
super(entity, skinParam);
final Stereotype stereotype = entity.getStereotype();
final USymbol symbol = entity.getUSymbol() == null ? skinParam.componentStyle().toSymbol()
final USymbol symbol = entity.getUSymbol() == null ? skinParam.componentStyle().toUSymbol()
: entity.getUSymbol();
if (symbol == null) {
throw new IllegalArgumentException();
}
this.desc = new BodyEnhanced(entity.getDisplay(), symbol.getFontParam(), skinParam, HorizontalAlignment.CENTER,
stereotype, symbol.manageHorizontalLine(), false, entity);
stereotype, symbol.manageHorizontalLine(), false, entity, SName.componentDiagram);
this.url = entity.getUrl99();

View File

@ -88,9 +88,9 @@ public class EntityImageObject extends AbstractEntityImage implements Stencil {
this.lineConfig = entity;
final Stereotype stereotype = entity.getStereotype();
this.roundCorner = skinParam.getRoundCorner(CornerParam.DEFAULT, null);
this.name = TextBlockUtils.withMargin(
entity.getDisplay().create(new FontConfiguration(getSkinParam(), FontParam.OBJECT, stereotype),
HorizontalAlignment.CENTER, skinParam), 2, 2);
final FontConfiguration fc = new FontConfiguration(getSkinParam(), FontParam.OBJECT, stereotype);
final TextBlock tmp = getUnderlinedName(entity).create(fc, HorizontalAlignment.CENTER, skinParam);
this.name = TextBlockUtils.withMargin(tmp, 2, 2);
if (stereotype == null || stereotype.getLabel(Guillemet.DOUBLE_COMPARATOR) == null
|| portionShower.showPortion(EntityPortion.STEREOTYPE, entity) == false) {
this.stereo = null;
@ -100,7 +100,6 @@ public class EntityImageObject extends AbstractEntityImage implements Stencil {
HorizontalAlignment.CENTER, skinParam);
}
// final boolean showMethods = portionShower.showPortion(EntityPortion.METHOD, entity);
final boolean showFields = portionShower.showPortion(EntityPortion.FIELD, entity);
if (entity.getBodier().getFieldsToDisplay().size() == 0) {
@ -113,6 +112,13 @@ public class EntityImageObject extends AbstractEntityImage implements Stencil {
}
private Display getUnderlinedName(ILeaf entity) {
if (getSkinParam().strictUmlStyle()) {
return entity.getDisplay().underlinedName();
}
return entity.getDisplay();
}
private int marginEmptyFieldsOrMethod = 13;
public Dimension2D calculateDimension(StringBounder stringBounder) {
@ -194,8 +200,8 @@ public class EntityImageObject extends AbstractEntityImage implements Stencil {
private Dimension2D getNameAndSteretypeDimension(StringBounder stringBounder) {
final Dimension2D nameDim = name.calculateDimension(stringBounder);
final Dimension2D stereoDim = stereo == null ? new Dimension2DDouble(0, 0) : stereo
.calculateDimension(stringBounder);
final Dimension2D stereoDim = stereo == null ? new Dimension2DDouble(0, 0)
: stereo.calculateDimension(stringBounder);
final Dimension2D nameAndStereo = new Dimension2DDouble(Math.max(nameDim.getWidth(), stereoDim.getWidth()),
nameDim.getHeight() + stereoDim.getHeight());
return nameAndStereo;

View File

@ -53,6 +53,7 @@ import net.sourceforge.plantuml.graphic.TextBlock;
import net.sourceforge.plantuml.graphic.TextBlockUtils;
import net.sourceforge.plantuml.graphic.USymbol;
import net.sourceforge.plantuml.graphic.color.ColorType;
import net.sourceforge.plantuml.style.SName;
import net.sourceforge.plantuml.svek.AbstractEntityImage;
import net.sourceforge.plantuml.svek.ShapeType;
import net.sourceforge.plantuml.ugraphic.UGraphic;
@ -86,14 +87,15 @@ public class EntityImageState2 extends AbstractEntityImage {
// backcolor = HtmlColorUtils.BLUE;
final HColor forecolor = SkinParamUtils.getColor(getSkinParam(), getStereo(), symbol.getColorParamBorder());
final SymbolContext ctx = new SymbolContext(backcolor, forecolor).withStroke(new UStroke(1.5)).withShadow(
getSkinParam().shadowing(getEntity().getStereotype()) ? 3 : 0);
final SymbolContext ctx = new SymbolContext(backcolor, forecolor).withStroke(new UStroke(1.5))
.withShadow(getSkinParam().shadowing(getEntity().getStereotype()) ? 3 : 0);
this.url = entity.getUrl99();
TextBlock stereo = TextBlockUtils.empty(0, 0);
final TextBlock desc = new BodyEnhanced(entity.getDisplay(), symbol.getFontParam(), skinParam,
HorizontalAlignment.CENTER, stereotype, symbol.manageHorizontalLine(), false, entity);
HorizontalAlignment.CENTER, stereotype, symbol.manageHorizontalLine(), false, entity,
SName.stateDiagram);
asSmall = symbol.asSmall(null, desc, stereo, ctx, skinParam.getStereotypeAlignment());

View File

@ -58,6 +58,7 @@ import net.sourceforge.plantuml.graphic.StringBounder;
import net.sourceforge.plantuml.graphic.TextBlock;
import net.sourceforge.plantuml.graphic.TextBlockUtils;
import net.sourceforge.plantuml.graphic.color.ColorType;
import net.sourceforge.plantuml.style.SName;
import net.sourceforge.plantuml.svek.AbstractEntityImage;
import net.sourceforge.plantuml.svek.ShapeType;
import net.sourceforge.plantuml.ugraphic.AbstractUGraphicHorizontalLine;
@ -80,7 +81,7 @@ public class EntityImageUseCase extends AbstractEntityImage {
final Stereotype stereotype = entity.getStereotype();
final TextBlock tmp = new BodyEnhanced(entity.getDisplay(), FontParam.USECASE, skinParam,
HorizontalAlignment.CENTER, stereotype, true, false, entity);
HorizontalAlignment.CENTER, stereotype, true, false, entity, SName.componentDiagram);
if (stereotype == null || stereotype.getLabel(Guillemet.DOUBLE_COMPARATOR) == null
|| portionShower.showPortion(EntityPortion.STEREOTYPE, entity) == false) {

View File

@ -36,6 +36,8 @@ package net.sourceforge.plantuml.timingdiagram;
import java.awt.geom.Dimension2D;
import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
@ -59,6 +61,7 @@ import net.sourceforge.plantuml.ugraphic.color.HColorUtils;
public class PlayerBinary extends Player {
private final List<TimeConstraint> constraints = new ArrayList<TimeConstraint>();
private final SortedMap<TimeTick, Boolean> values = new TreeMap<TimeTick, Boolean>();
private Boolean initialState;
@ -67,8 +70,12 @@ public class PlayerBinary extends Player {
this.suggestedHeight = 30;
}
private double getHeightForConstraints(StringBounder stringBounder) {
return TimeConstraint.getHeightForConstraints(stringBounder, constraints);
}
public double getFullHeight(StringBounder stringBounder) {
return suggestedHeight;
return getHeightForConstraints(stringBounder) + suggestedHeight;
}
public void drawFrameTitle(UGraphic ug) {
@ -80,7 +87,8 @@ public class PlayerBinary extends Player {
public IntricatedPoint getTimeProjection(StringBounder stringBounder, TimeTick tick) {
final double x = ruler.getPosInPixel(tick);
return new IntricatedPoint(new Point2D.Double(x, getYpos(false)), new Point2D.Double(x, getYpos(true)));
return new IntricatedPoint(new Point2D.Double(x, getYpos(stringBounder, false)),
new Point2D.Double(x, getYpos(stringBounder, true)));
}
public void addNote(TimeTick now, Display note, Position position) {
@ -105,13 +113,21 @@ public class PlayerBinary extends Player {
}
public void createConstraint(TimeTick tick1, TimeTick tick2, String message) {
throw new UnsupportedOperationException();
this.constraints.add(new TimeConstraint(tick1, tick2, message, skinParam));
}
private final double ymargin = 8;
private double getYpos(boolean state) {
return state ? ymargin : getFullHeight(null) - ymargin;
private double getYpos(StringBounder stringBounder, boolean state) {
return state ? getYhigh(stringBounder) : getYlow(stringBounder);
}
private double getYlow(StringBounder stringBounder) {
return getFullHeight(stringBounder) - ymargin;
}
private double getYhigh(StringBounder stringBounder) {
return ymargin + getHeightForConstraints(stringBounder);
}
public TextBlock getPart1(double fullAvailableWidth, double specialVSpace) {
@ -138,18 +154,30 @@ public class PlayerBinary extends Player {
ug = getContext().apply(ug);
double lastx = 0;
boolean lastValue = initialState == null ? false : initialState;
final StringBounder stringBounder = ug.getStringBounder();
final ULine vline = ULine.vline(getYlow(stringBounder) - getYhigh(stringBounder));
for (Map.Entry<TimeTick, Boolean> ent : values.entrySet()) {
final double x = ruler.getPosInPixel(ent.getKey());
ug.apply(new UTranslate(lastx, getYpos(lastValue))).draw(ULine.hline(x - lastx));
ug.apply(new UTranslate(lastx, getYpos(stringBounder, lastValue))).draw(ULine.hline(x - lastx));
if (lastValue != ent.getValue()) {
ug.apply(new UTranslate(x, ymargin)).draw(ULine.vline(getFullHeight(null) - 2 * ymargin));
ug.apply(new UTranslate(x, getYhigh(stringBounder))).draw(vline);
}
lastx = x;
lastValue = ent.getValue();
}
ug.apply(new UTranslate(lastx, getYpos(lastValue))).draw(ULine.hline(ruler.getWidth() - lastx));
ug.apply(new UTranslate(lastx, getYpos(stringBounder, lastValue)))
.draw(ULine.hline(ruler.getWidth() - lastx));
drawConstraints(ug.apply(UTranslate.dy(getHeightForConstraints(ug.getStringBounder()))));
}
};
}
private void drawConstraints(final UGraphic ug) {
for (TimeConstraint constraint : constraints) {
constraint.drawU(ug, ruler);
}
}
}

View File

@ -178,9 +178,15 @@ public class DriverShadowedG2d {
g2d.scale(1 / dpiFactor, 1 / dpiFactor);
final Shape sav = g2d.getClip();
Area full = new Area(new Rectangle2D.Double(0, 0, bounds.getMaxX() + deltaShadow * 2 + 6,
bounds.getMaxY() + deltaShadow * 2 + 6));
final Area full = new Area(
new Rectangle2D.Double(0, 0, (bounds.getMaxX() + deltaShadow * 2 + 6) * dpiFactor,
(bounds.getMaxY() + deltaShadow * 2 + 6) * dpiFactor));
if (dpiFactor == 1) {
full.subtract(new Area(shape));
} else {
full.subtract(
new Area(shape).createTransformedArea(AffineTransform.getScaleInstance(dpiFactor, dpiFactor)));
}
g2d.setClip(full);
g2d.drawImage(destination, (int) (bounds.getMinX() * dpiFactor), (int) (bounds.getMinY() * dpiFactor),

View File

@ -44,7 +44,7 @@ public class Version {
private static final int MAJOR_SEPARATOR = 1000000;
public static int version() {
return 1202013;
return 1202014;
}
public static int versionPatched() {
@ -93,7 +93,7 @@ public class Version {
}
public static long compileTime() {
return 1592051198896L;
return 1592662474056L;
}
public static String compileTimeString() {