From 1afe7aae824c5195577e8c0214ae7d63e644569f Mon Sep 17 00:00:00 2001 From: Arnaud Roques Date: Fri, 27 May 2022 16:18:47 +0200 Subject: [PATCH] Minor bug fixes --- skin/plantuml.skin | 1 + .../command/CommandCreateClass.java | 57 +++------------ .../command/CommandExecutionResult.java | 11 ++- .../plantuml/cucadiagram/BodyEnhanced1.java | 11 +-- .../plantuml/cucadiagram/Link.java | 4 +- .../plantuml/cucadiagram/LinkType.java | 29 ++++---- .../cucadiagram/MethodsOrFieldsArea.java | 5 +- .../plantuml/donors/PSystemDonors.java | 49 ++++++------- .../plantuml/graphic/FontConfiguration.java | 11 ++- .../plantuml/graphic/color/Colors.java | 8 +-- .../sequencediagram/command/CommandArrow.java | 7 +- src/net/sourceforge/plantuml/style/Style.java | 9 ++- .../sourceforge/plantuml/svek/SvekLine.java | 9 ++- .../plantuml/svek/image/EntityImageClass.java | 2 +- .../svek/image/EntityImageClassHeader.java | 2 +- .../plantuml/timingdiagram/Clocks.java | 4 +- .../plantuml/timingdiagram/TimingDiagram.java | 21 ++++++ .../timingdiagram/TimingDiagramFactory.java | 2 + .../plantuml/timingdiagram/TimingFormat.java | 30 ++++++-- .../plantuml/timingdiagram/TimingRuler.java | 20 +++--- .../command/CommandUseDateFormat.java | 71 +++++++++++++++++++ .../command/TimeTickBuilder.java | 14 ++-- .../sourceforge/plantuml/version/Version.java | 2 +- 23 files changed, 237 insertions(+), 142 deletions(-) create mode 100644 src/net/sourceforge/plantuml/timingdiagram/command/CommandUseDateFormat.java diff --git a/skin/plantuml.skin b/skin/plantuml.skin index 5d604d9f8..641e5e181 100644 --- a/skin/plantuml.skin +++ b/skin/plantuml.skin @@ -400,6 +400,7 @@ timingDiagram { timeline { FontStyle plain FontSize 11 + LineThickness 2 } note { LineThickness 0.5 diff --git a/src/net/sourceforge/plantuml/classdiagram/command/CommandCreateClass.java b/src/net/sourceforge/plantuml/classdiagram/command/CommandCreateClass.java index 1eb4c6d73..9c9c34528 100644 --- a/src/net/sourceforge/plantuml/classdiagram/command/CommandCreateClass.java +++ b/src/net/sourceforge/plantuml/classdiagram/command/CommandCreateClass.java @@ -139,9 +139,9 @@ public class CommandCreateClass extends SingleLineCommand2 { if (diagram.V1972()) { if (diagram.leafExistSmart(idNewLong)) { entity = diagram.getOrCreateLeaf(idNewLong, idNewLong, type, null); - if (entity.muteToType(type, null) == false) { + if (entity.muteToType(type, null) == false) return CommandExecutionResult.error("Bad name"); - } + } else { entity = diagram.createLeaf(idNewLong, idNewLong, Display.getWithNewlines(display), type, null); } @@ -149,9 +149,9 @@ public class CommandCreateClass extends SingleLineCommand2 { final Code code = diagram.buildCode(idShort); if (diagram.leafExist(code)) { entity = diagram.getOrCreateLeaf(idNewLong, code, type, null); - if (entity.muteToType(type, null) == false) { + if (entity.muteToType(type, null) == false) return CommandExecutionResult.error("Bad name"); - } + } else { entity = diagram.createLeaf(idNewLong, code, Display.getWithNewlines(display), type, null); } @@ -162,9 +162,8 @@ public class CommandCreateClass extends SingleLineCommand2 { diagram.getSkinParam().getIHtmlColorSet())); entity.setStereostyle(stereo); } - if (generic != null) { + if (generic != null) entity.setGeneric(generic); - } final String urlString = arg.get("URL", 0); if (urlString != null) { @@ -180,57 +179,19 @@ public class CommandCreateClass extends SingleLineCommand2 { final HColor lineColor = s == null ? null : diagram.getSkinParam().getIHtmlColorSet().getColor(diagram.getSkinParam().getThemeStyle(), s); - if (lineColor != null) { + if (lineColor != null) colors = colors.add(ColorType.LINE, lineColor); - } - if (arg.get("LINECOLOR", 0) != null) { + + if (arg.get("LINECOLOR", 0) != null) colors = colors.addLegacyStroke(arg.get("LINECOLOR", 0)); - } + entity.setColors(colors); - // entity.setSpecificColorTOBEREMOVED(ColorType.LINE, lineColor); - // entity.setSpecificColorTOBEREMOVED(ColorType.HEADER, - // colors.getColor(ColorType.HEADER)); - // - // if (colors.getLineStyle() != null) { - // entity.setSpecificLineStroke(LinkStyle.getStroke(colors.getLineStyle())); - // } - // - // if (arg.get("LINECOLOR", 0) != null) { - // entity.applyStroke(arg.get("LINECOLOR", 0)); - // } - - // manageExtends(diagram, arg, entity); CommandCreateClassMultilines.manageExtends("EXTENDS", diagram, arg, entity); CommandCreateClassMultilines.manageExtends("IMPLEMENTS", diagram, arg, entity); CommandCreateClassMultilines.addTags(entity, arg.get("TAGS", 0)); return CommandExecutionResult.ok(); } - // public static void manageExtends(ClassDiagram system, RegexResult arg, final - // IEntity entity) { - // if (arg.get("EXTENDS", 1) != null) { - // final Mode mode = arg.get("EXTENDS", 1).equalsIgnoreCase("extends") ? - // Mode.EXTENDS : Mode.IMPLEMENTS; - // final Code other = diagram.buildCode(arg.get("EXTENDS", 2)); - // LeafType type2 = LeafType.CLASS; - // if (mode == Mode.IMPLEMENTS) { - // type2 = LeafType.INTERFACE; - // } - // if (mode == Mode.EXTENDS && entity.getEntityType() == LeafType.INTERFACE) { - // type2 = LeafType.INTERFACE; - // } - // final IEntity cl2 = system.getOrCreateLeaf(other, type2, null); - // LinkType typeLink = new LinkType(LinkDecor.NONE, LinkDecor.EXTENDS); - // if (type2 == LeafType.INTERFACE && entity.getEntityType() != - // LeafType.INTERFACE) { - // typeLink = typeLink.getDashed(); - // } - // final Link link = new Link(cl2, entity, typeLink, null, 2, null, null, - // system.getLabeldistance(), - // system.getLabelangle()); - // system.addLink(link); - // } - // } } diff --git a/src/net/sourceforge/plantuml/command/CommandExecutionResult.java b/src/net/sourceforge/plantuml/command/CommandExecutionResult.java index 242f2c045..858020c8f 100644 --- a/src/net/sourceforge/plantuml/command/CommandExecutionResult.java +++ b/src/net/sourceforge/plantuml/command/CommandExecutionResult.java @@ -87,16 +87,15 @@ public class CommandExecutionResult { public static List getStackTrace(Throwable exception) { final List result = new ArrayList<>(); result.add(exception.toString()); - for (StackTraceElement ste : exception.getStackTrace()) { + for (StackTraceElement ste : exception.getStackTrace()) result.add(" " + ste.toString()); - } + if (exception.getCause() != null) { final Throwable cause = exception.getCause(); result.add(" "); result.add("Caused by " + cause.toString()); - for (StackTraceElement ste : cause.getStackTrace()) { + for (StackTraceElement ste : cause.getStackTrace()) result.add(" " + ste.toString()); - } } return result; @@ -107,9 +106,9 @@ public class CommandExecutionResult { } public String getError() { - if (isOk()) { + if (isOk()) throw new IllegalStateException(); - } + return error; } diff --git a/src/net/sourceforge/plantuml/cucadiagram/BodyEnhanced1.java b/src/net/sourceforge/plantuml/cucadiagram/BodyEnhanced1.java index a2404968a..d13edaae1 100644 --- a/src/net/sourceforge/plantuml/cucadiagram/BodyEnhanced1.java +++ b/src/net/sourceforge/plantuml/cucadiagram/BodyEnhanced1.java @@ -75,7 +75,9 @@ public class BodyEnhanced1 extends BodyEnhancedAbstract implements TextBlock, Wi BodyEnhanced1(HorizontalAlignment align, List rawBody, ISkinParam skinParam, ILeaf entity, Style style) { - super(align, style.getFontConfiguration(skinParam.getThemeStyle(), skinParam.getIHtmlColorSet()), style); + super(align, + style.getFontConfiguration(skinParam.getThemeStyle(), skinParam.getIHtmlColorSet(), entity.getColors()), + style); this.style = style; this.rawBody2 = Display.create(rawBody); @@ -87,9 +89,10 @@ public class BodyEnhanced1 extends BodyEnhancedAbstract implements TextBlock, Wi this.inEllipse = false; } - BodyEnhanced1(HorizontalAlignment align, Display display, ISkinParam skinParam, ILeaf entity, - Style style) { - super(align, style.getFontConfiguration(skinParam.getThemeStyle(), skinParam.getIHtmlColorSet()), style); + BodyEnhanced1(HorizontalAlignment align, Display display, ISkinParam skinParam, ILeaf entity, Style style) { + super(align, + style.getFontConfiguration(skinParam.getThemeStyle(), skinParam.getIHtmlColorSet(), entity.getColors()), + style); this.style = style; this.entity = entity; diff --git a/src/net/sourceforge/plantuml/cucadiagram/Link.java b/src/net/sourceforge/plantuml/cucadiagram/Link.java index e804f14b7..907a4ac08 100644 --- a/src/net/sourceforge/plantuml/cucadiagram/Link.java +++ b/src/net/sourceforge/plantuml/cucadiagram/Link.java @@ -133,9 +133,9 @@ public class Link extends WithLinkType implements Hideable, Removeable { public Link(IEntity cl1, IEntity cl2, LinkType type, Display label, int length, String qualifier1, String qualifier2, String labeldistance, String labelangle, HColor specificColor, StyleBuilder styleBuilder) { - if (length < 1) { + if (length < 1) throw new IllegalArgumentException(); - } + this.styleBuilder = styleBuilder; this.cl1 = Objects.requireNonNull(cl1); this.cl2 = Objects.requireNonNull(cl2); diff --git a/src/net/sourceforge/plantuml/cucadiagram/LinkType.java b/src/net/sourceforge/plantuml/cucadiagram/LinkType.java index 65ffc3b56..ec8930d3d 100644 --- a/src/net/sourceforge/plantuml/cucadiagram/LinkType.java +++ b/src/net/sourceforge/plantuml/cucadiagram/LinkType.java @@ -54,19 +54,19 @@ public class LinkType { } public boolean looksLikeRevertedForSvg() { - if (this.decor1 == LinkDecor.NONE && this.decor2 != LinkDecor.NONE) { + if (this.decor1 == LinkDecor.NONE && this.decor2 != LinkDecor.NONE) return true; - } + return false; } public boolean looksLikeNoDecorAtAllSvg() { - if (this.decor1 == LinkDecor.NONE && this.decor2 == LinkDecor.NONE) { + if (this.decor1 == LinkDecor.NONE && this.decor2 == LinkDecor.NONE) return true; - } - if (this.decor1 != LinkDecor.NONE && this.decor2 != LinkDecor.NONE) { + + if (this.decor1 != LinkDecor.NONE && this.decor2 != LinkDecor.NONE) return true; - } + return false; } @@ -184,9 +184,9 @@ public class LinkType { final double arrowsize = Math.max(decor1.getArrowSize(), decor2.getArrowSize()); if (arrowsize > 0) { - if (sb.length() > 0) { + if (sb.length() > 0) sb.append(","); - } + sb.append("arrowsize=" + arrowsize); } return sb.toString(); @@ -235,13 +235,16 @@ public class LinkType { } public UStroke getStroke3(UStroke defaultThickness) { - if (linkStyle.isThicknessOverrided()) { + if (linkStyle.isThicknessOverrided()) return linkStyle.getStroke3(); - } - if (defaultThickness == null) { + + if (defaultThickness == null) return linkStyle.getStroke3(); - } - return linkStyle.goThickness(defaultThickness.getThickness()).getStroke3(); + + if (defaultThickness.getDashVisible() == 0 && defaultThickness.getDashSpace() == 0) + return linkStyle.goThickness(defaultThickness.getThickness()).getStroke3(); + + return defaultThickness; } public LinkMiddleDecor getMiddleDecor() { diff --git a/src/net/sourceforge/plantuml/cucadiagram/MethodsOrFieldsArea.java b/src/net/sourceforge/plantuml/cucadiagram/MethodsOrFieldsArea.java index ab8cb5df1..cc1edc1d8 100644 --- a/src/net/sourceforge/plantuml/cucadiagram/MethodsOrFieldsArea.java +++ b/src/net/sourceforge/plantuml/cucadiagram/MethodsOrFieldsArea.java @@ -174,7 +174,7 @@ public class MethodsOrFieldsArea extends AbstractTextBlock implements TextBlock, private TextBlock createTextBlock(CharSequence cs) { - FontConfiguration config = FontConfiguration.create(skinParam, style); + FontConfiguration config = FontConfiguration.create(skinParam, style, leaf.getColors()); if (cs instanceof Member) { final Member m = (Member) cs; @@ -195,9 +195,8 @@ public class MethodsOrFieldsArea extends AbstractTextBlock implements TextBlock, return new TextBlockTracer(m, bloc); } - if (cs instanceof EmbeddedDiagram) { + if (cs instanceof EmbeddedDiagram) return ((EmbeddedDiagram) cs).asDraw(skinParam); - } return Display.getWithNewlines(cs.toString()).create8(config, align, skinParam, CreoleMode.SIMPLE_LINE, skinParam.wrapWidth()); diff --git a/src/net/sourceforge/plantuml/donors/PSystemDonors.java b/src/net/sourceforge/plantuml/donors/PSystemDonors.java index 264280d8b..ff5c76b46 100644 --- a/src/net/sourceforge/plantuml/donors/PSystemDonors.java +++ b/src/net/sourceforge/plantuml/donors/PSystemDonors.java @@ -35,7 +35,6 @@ */ package net.sourceforge.plantuml.donors; -import net.sourceforge.plantuml.awt.geom.Dimension2D; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -45,6 +44,7 @@ import java.util.StringTokenizer; import net.sourceforge.plantuml.BackSlash; import net.sourceforge.plantuml.FileFormatOption; import net.sourceforge.plantuml.PlainDiagram; +import net.sourceforge.plantuml.awt.geom.Dimension2D; import net.sourceforge.plantuml.code.AsciiEncoder; import net.sourceforge.plantuml.code.CompressionBrotli; import net.sourceforge.plantuml.code.NoPlantumlCompressionException; @@ -70,29 +70,30 @@ public class PSystemDonors extends PlainDiagram { private static final int COLS = 6; private static final int FREE_LINES = 6; - public static final String DONORS = "6t4E03mSS7Dt1Og5J5Uh3hcJits4ZufNcNRmsK-DFu8Mfx004WGrllMtt9JI0K46z1ewUipjEptkDz9V" - + "H5UwzqqpHgtN9kKCeleWw07lRWljG-b_VH3cB7aHt9aIN40AYEBeOlcHRkGuVL9bI2baDAVOxcLYNg-G" - + "IYa-V-KZz1F8fg3pd6aKYPeNE3rg-odslkRdrrnTGomKo_C49L3IPKAwwSFSckbxFssauoVm-wH15OkY" - + "BTsMh94s7MFUrxK07TEkrN8c7qrgLiMugaYnZauQLf5CQCl5v7FaHPyq_gWtuIFgaI4PTGLqbjNHzNDl" - + "NzyJyoyNVSJ957n3KGCZO3soDj7YFFIWOUA0eMKNnTYgmf4dwP38WnRouH-5AOoKd5q6Dmsp1a1OlGCL" - + "H79GcnhETXm6L9bYYxuGRhhKtrWwxyjAgK9N6fv9RCnCr0Ah58aDkg4xSzs-cger0XoHdXAriFKed-FO" - + "Ip-iw9jUIWJhQ-kqBC5VKSekfQRZzftgTvyIm17IyfqFOufGJg0fWocKyMi56LUXkzQ2BJgkSh2G1b4V" - + "jxZfm-R6GoiY79Cf5MeTlupjL2lyeSiMR4p2as1nlwTzARM0Gqssgj82-4AhaXuxNq0o5BmSzFYEl-yT" - + "hgcK96z8j17EaFJRysn7CnO2T6mPiw6RAR0OTrdLMsn1X7gKZWxGMaW6uMnkbxtP1-aZFm7m5XAYsstY" - + "Q0T_VcdAr96BD97GJMci05QVLjHDm-8H36er5TsCAS7qDivnfLjZ7okELSkYJPwt6eo9twZJ51lBPIeo" - + "tR1I3sykVCUsbtOfxfCnU7MxJ_Qw2cWfzvvouzulCX3dQZ9GAJBTyUvllcMPGLZCuf_h5PIUDNjoyz2T" - + "mNOMYvOnivMfXwm01eUILEiZqLX2ZFIsGxR0hute4K1-ZICbU9YH1wyVIwwfvfY6oIQBwDaYHBQrUSNU" - + "sPNpW3qlVv8ZeqJAnLUFGa9-nyOYebNMHcd3vdnNu1btYgAyd7VFgYVuLmrJ5r2TAWg2qeArIaBxwlK0" - + "6RftrhFKaZZZ5ISMbBqk1uO4fLUYQEl13O0fD3D4yC304s4WAsMNDZ4YyDqVTvldBdMenzy-xM8S8jqb" - + "2L05X5DUK4qqM4U48-ij_l-vTuET-FD_hMcJKxkzzps4q1D8242u5neoBW0XdW9V7pRC0Pp2aX2T95ov" - + "Qkrv88h1JiPW5tNxCgDoutUMcv6Rrbu_LEMfAKM5atuW-qKmQAzpIPNkGz2fx77V-KQuoC7O_YMgp4fn" - + "xogZxPMHy4aeulYEqyi1pLWOe0Phe8u2_-x-h2pKDDP-HL9vE03vPaDIgPckHTMMriP6OAESsDzRirFE" - + "pC_Am3wxrONpgXxQ9Ybkf1XH-DOfBiy84pE9f8a8Ta_9YGSZVED1lgWMIs9fMxkTCLWX_sC_XZSI3jaX" - + "3JJgCQKytO0SjadtiLMWFuZt41x8mcATxYmMIoKyaY8fdAjO9ZAaJxGPv_O6CIWAn__t5fGhJ3G_eTcb" - + "TdQIkNHhDoaWyg7-pf9Qv6ojoC2-g-QopSjp-zOc4-pO_y2Fdsz_LDry4m4uegiIl6utyk765jKLR45v" - + "iuJxk2pMpUINSIdQ9Qg1pVlEHWsm6Iga98A81w12U8txDVq9Myu5yktrbxamKiFpU3NqpAUx0ol8DXfU" - + "9GsgNcHnR7s_vIRl7CYSU6nmOPMnqyES7YqprBQRDbl8e9AuSyLOps1sZv8gdygOLChGL8qDDKjYwxAp" - + "7Ps1yItaYlMzVMjZXfJw1VEPu1H3JKal3MG20Lb4Ke21v2hPhrfnXepCj4gynSfMqZ3LJMfej1iiYZjB" + "Ms7pORCrtdviIo40"; + public static final String DONORS = "6miF03mSRygAr4-2sU91UhPs3uiVqvmG9uBbUK9nOX6dku3u0zmxFUutqbz4LtRlcsP4hTScvGoY-Y3e" + + "0Uzk2-r3wNzz4EOiUH7ScH9SG0g8ukWI-P5kP3jzKcL82TvyX-vlcQmzsJek5ZMV4u6h02gHaD6SOhkN" + + "YNczGYgb-FoLZz1Fu6tww3nt6aMZ_XEuUTJsKUnzpVzDdMNdeH1cwMu5Hc1KD49rth77-FyKGOKes3bK" + + "mOubntGghLeELNICUL_N0dLCkbPDauygDQjYN5MaM4Od3Oj89jJbOl8nyg9F6h_Kc_3XkYeauzu1dMrr" + + "T7tJspRFnFppHH-2ZC4t53Km0jOZQHFDpqCF6aOE66fsuSOM5OuyYOT46hIGN_vGc48loTaLSDCmgG24" + + "nJjGWIG7rQdXRCTXG8KbjcYpyAYB_S7Ik2uhfp9TQNWYiJ4nKGkeKkH_q0tTKUjuD7NtC3WYFIKQOSjH" + + "FWjifHrMzFbPIWGBWCwOnVehH3cLr7GSpzg_Soq0kwNbLGzZ2dzEe2bBA9JnYGNgLw7Rve8jUkzoi906" + + "KH-7R_g8S-MXkWX7P4fPhQENiPrhcJzqsOBrINWABEGzxakn1HniYgigDO0lj0ffgVC992tpxwN7ot_V" + + "4wufb6IlNxGHhf3qquznCaCXGFkcCHkwYGABiIfMhSKMHB17wT00hOLa4CwHTjb7_99-vIS0tbn2T9kD" + + "G3tuzvUc31svI0C9NPN62c3rQKNTDCmUmQ1KKz7rHCMNtiQFhqnhx6EbiMfPjCdpHeCnyfjqcc9ZkK95" + + "XXaMwc7DcU_KbcYNucxfWrUz9tjT1RYKUG-vSUyN6V1p3nce59pkUCz7Rbc62OjPF7EzJEcPdqnk7hhn" + + "m5qiciQCClMGPS1WVoAgzP6eRnOZl-sGpSXh9Re7iBuA90SFCoh1woScLrHpJCDeaqLqR14YsToyufHT" + + "kRPWCozFagEYHChDLWz3Gdv7-YAYLT96gSFcV9VW6PAZ82_dtR7gCN-xOUe2AbCdWKzQi6PBQD-pBf21" + + "jOkUgPR4wVy-iI3lVJampL1y9Oas7jn0CGLcXd0V65WY6SXAnKkR617ulZ_kZXxnEjJZRvzECGwIRf8O" + + "g8A4arzGJTHPHuGJwpN-_wPFIrpuywyzRPDJlJtx7e9eCuWBG9WNw8gS5q8y1RusDam1dC8I5vqaNBbi" + + "xPL0b8ADzC4kwlPbHld6JvORaPlMNZzKuKzJZ0h7_K2s2r_HtkUIAjCNqwW6-yEx3XSv6FubgWo8vB8t" + + "CoiZKIR1nN4VfxKDpLWwG0tcG9q4djtzsMAXeR7sAvGgmmcGhpSabHfbMbWTqzBO2AoK4_jxQqxA6VNP" + + "6SJF7klCULKFTPCKrrECA7o7ISXJmiJC8d4YWjtYEIb13z_i8rzK2oMnjAdDpX2iaF--7yCR2GVia0SQ" + + "zOHIdcb13jkaUziiy4U2zn0ba8N5Cjr5B9JAU215KZ2NMyOpfA-q6QVs1j0f2iR_zmQKoqmqFwBPfNTr" + + "ahd2rdRY82h3_PubjYZPQf61VLVDPUkNvRRDJMROaV-17plV_AYwVX41DKHN9NZDQUJ3ZSrgQjYY_cOE" + + "zt6PhPl9p-DIj7DK0vlqPAE6iXaev2I4I0T2XVHL-5Nz2LlEEVBfVQeK1cfu7hiDFNYk1kR8LXfU9Gse" + + "NcHnR7s_uIPF3XHEJBR-LQUnqyEO7gqmrAQRDcl8e1AvIyLNZc1sSqcLjoecbJAyy-FUKBCajFQTxUZq" + + "JcuXbzTpFBqnWqlzakWpmJa6ch9U7CY41cGHMK4ZYAwI_Q8LPyYeBAl4HwfWc3ZQ4kxGQ3DOk3lMfw5i" + + "NZ5RuziaFZ126vR-nWNSUuP4pmKD8zkS06nO52cKX6OetMCGEs57p2vkUISVW_BMtW00"; /* * Special thanks to our sponsors and donors: diff --git a/src/net/sourceforge/plantuml/graphic/FontConfiguration.java b/src/net/sourceforge/plantuml/graphic/FontConfiguration.java index 1b4d59aac..7b7e3b7da 100644 --- a/src/net/sourceforge/plantuml/graphic/FontConfiguration.java +++ b/src/net/sourceforge/plantuml/graphic/FontConfiguration.java @@ -92,12 +92,17 @@ public class FontConfiguration { } public static FontConfiguration create(ISkinParam skinParam, Style style) { + return create(skinParam, style, null); + } + + public static FontConfiguration create(ISkinParam skinParam, Style style, Colors colors) { final HColor hyperlinkColor = style.value(PName.HyperLinkColor).asColor(skinParam.getThemeStyle(), skinParam.getIHtmlColorSet()); final boolean useUnderlineForHyperlink = skinParam.useUnderlineForHyperlink(); - return create(style.getUFont(), - style.value(PName.FontColor).asColor(skinParam.getThemeStyle(), skinParam.getIHtmlColorSet()), - hyperlinkColor, useUnderlineForHyperlink, skinParam.getTabSize()); + HColor color = colors == null ? null : colors.getColor(ColorType.TEXT); + if (color == null) + color = style.value(PName.FontColor).asColor(skinParam.getThemeStyle(), skinParam.getIHtmlColorSet()); + return create(style.getUFont(), color, hyperlinkColor, useUnderlineForHyperlink, skinParam.getTabSize()); } // --- diff --git a/src/net/sourceforge/plantuml/graphic/color/Colors.java b/src/net/sourceforge/plantuml/graphic/color/Colors.java index 62646f716..a418af574 100644 --- a/src/net/sourceforge/plantuml/graphic/color/Colors.java +++ b/src/net/sourceforge/plantuml/graphic/color/Colors.java @@ -166,12 +166,12 @@ public class Colors { } public static UGraphic applyStroke(UGraphic ug, Colors colors) { - if (colors == null) { + if (colors == null) return ug; - } - if (colors.lineStyle == null) { + + if (colors.lineStyle == null) return ug; - } + return ug.apply(colors.lineStyle.getStroke3()); } diff --git a/src/net/sourceforge/plantuml/sequencediagram/command/CommandArrow.java b/src/net/sourceforge/plantuml/sequencediagram/command/CommandArrow.java index c6eaaf9d4..8e8ccb680 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/command/CommandArrow.java +++ b/src/net/sourceforge/plantuml/sequencediagram/command/CommandArrow.java @@ -96,7 +96,7 @@ public class CommandArrow extends SingleLineCommand2 { RegexLeaf.spaceZeroOrMore(), // new RegexOptional(new RegexOr("ARROW_DRESSING1", // new RegexLeaf("[%s][ox]"), // - new RegexLeaf("(?:[%s][ox])?< { final String dressing1 = getDressing(arg, "ARROW_DRESSING1"); final String dressing2 = getDressing(arg, "ARROW_DRESSING2"); - final int inclination = getInclination(arg.get("ARROW_DRESSING2", 0)); + final int inclination1 = getInclination(arg.get("ARROW_DRESSING1", 0)); + final int inclination2 = getInclination(arg.get("ARROW_DRESSING2", 0)); final boolean circleAtStart; final boolean circleAtEnd; @@ -288,7 +289,7 @@ public class CommandArrow extends SingleLineCommand2 { config = applyStyle(diagram.getSkinParam().getThemeStyle(), arg.getLazzy("ARROW_STYLE", 0), config); - config = config.withInclination(inclination); + config = config.withInclination(inclination1 + inclination2); final String activationSpec = arg.get("ACTIVATION", 0); diff --git a/src/net/sourceforge/plantuml/style/Style.java b/src/net/sourceforge/plantuml/style/Style.java index 01940babf..c6badc0b3 100644 --- a/src/net/sourceforge/plantuml/style/Style.java +++ b/src/net/sourceforge/plantuml/style/Style.java @@ -187,8 +187,15 @@ public class Style { } public FontConfiguration getFontConfiguration(ThemeStyle themeStyle, HColorSet set) { + return getFontConfiguration(themeStyle, set, null); + } + + public FontConfiguration getFontConfiguration(ThemeStyle themeStyle, HColorSet set, Colors colors) { final UFont font = getUFont(); - final HColor color = value(PName.FontColor).asColor(themeStyle, set); + HColor color = colors == null ? null : colors.getColor(ColorType.TEXT); + if (color == null) + color = value(PName.FontColor).asColor(themeStyle, set); + final HColor hyperlinkColor = value(PName.HyperLinkColor).asColor(themeStyle, set); return FontConfiguration.create(font, color, hyperlinkColor, true); } diff --git a/src/net/sourceforge/plantuml/svek/SvekLine.java b/src/net/sourceforge/plantuml/svek/SvekLine.java index c7003d3ec..f601da5f5 100644 --- a/src/net/sourceforge/plantuml/svek/SvekLine.java +++ b/src/net/sourceforge/plantuml/svek/SvekLine.java @@ -665,9 +665,12 @@ public class SvekLine implements Moveable, Hideable, GuideLine { ug = ug.apply(new HColorNone().bg()).apply(color); final LinkType linkType = link.getType(); - UStroke stroke = suggestedStroke == null || linkType.getStyle().isNormal() == false - ? linkType.getStroke3(defaultThickness) - : suggestedStroke; + UStroke stroke; + if (suggestedStroke == null || linkType.getStyle().isNormal() == false) + stroke = linkType.getStroke3(defaultThickness); + else + stroke = linkType.getStroke3(suggestedStroke); + if (link.getColors() != null && link.getColors().getSpecificLineStroke() != null) stroke = link.getColors().getSpecificLineStroke(); diff --git a/src/net/sourceforge/plantuml/svek/image/EntityImageClass.java b/src/net/sourceforge/plantuml/svek/image/EntityImageClass.java index c04961c20..1659a933c 100644 --- a/src/net/sourceforge/plantuml/svek/image/EntityImageClass.java +++ b/src/net/sourceforge/plantuml/svek/image/EntityImageClass.java @@ -192,7 +192,7 @@ public class EntityImageClass extends AbstractEntityImage implements Stencil, Wi ug = ug.apply(classBorder); ug = ug.apply(backcolor.bg()); - final UStroke stroke = getStyle().getStroke(); + final UStroke stroke = getStyle().getStroke(lineConfig.getColors()); UGraphic ugHeader = ug; if (roundCorner == 0 && headerBackcolor != null && backcolor.equals(headerBackcolor) == false) { diff --git a/src/net/sourceforge/plantuml/svek/image/EntityImageClassHeader.java b/src/net/sourceforge/plantuml/svek/image/EntityImageClassHeader.java index 49c604946..22e80431e 100644 --- a/src/net/sourceforge/plantuml/svek/image/EntityImageClassHeader.java +++ b/src/net/sourceforge/plantuml/svek/image/EntityImageClassHeader.java @@ -87,7 +87,7 @@ public class EntityImageClassHeader extends AbstractEntityImage { .withTOBECHANGED(stereotype) // .with(entity.getStereostyles()) // .getMergedStyle(skinParam.getCurrentStyleBuilder()); - FontConfiguration fontConfigurationName = FontConfiguration.create(skinParam, style); + FontConfiguration fontConfigurationName = FontConfiguration.create(skinParam, style, entity.getColors()); if (italic) fontConfigurationName = fontConfigurationName.italic(); diff --git a/src/net/sourceforge/plantuml/timingdiagram/Clocks.java b/src/net/sourceforge/plantuml/timingdiagram/Clocks.java index 0da8166cc..4bd348d19 100644 --- a/src/net/sourceforge/plantuml/timingdiagram/Clocks.java +++ b/src/net/sourceforge/plantuml/timingdiagram/Clocks.java @@ -39,7 +39,9 @@ public interface Clocks { public TimeTick getNow(); public TimeTick getClockValue(String clockName, int nb); - + public TimeTick getCodeValue(String code); + public TimingFormat getTimingFormatDate(); + } diff --git a/src/net/sourceforge/plantuml/timingdiagram/TimingDiagram.java b/src/net/sourceforge/plantuml/timingdiagram/TimingDiagram.java index 4d86f7d53..08bb3d87d 100644 --- a/src/net/sourceforge/plantuml/timingdiagram/TimingDiagram.java +++ b/src/net/sourceforge/plantuml/timingdiagram/TimingDiagram.java @@ -38,10 +38,12 @@ import java.awt.geom.Rectangle2D; import java.io.IOException; import java.io.OutputStream; import java.math.BigDecimal; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import net.sourceforge.plantuml.Dimension2DDouble; @@ -389,4 +391,23 @@ public class TimingDiagram extends UmlDiagram implements Clocks { this.compactByDefault = true; } + private SimpleDateFormat sdf; + + public CommandExecutionResult useDateFormat(String dateFormat) { + try { + this.sdf = new SimpleDateFormat(dateFormat, Locale.US); + } catch (Exception e) { + return CommandExecutionResult.error("Bad date format"); + } + + return CommandExecutionResult.ok(); + } + + @Override + public TimingFormat getTimingFormatDate() { + if (sdf == null) + return TimingFormat.DATE; + return TimingFormat.create(sdf); + } + } diff --git a/src/net/sourceforge/plantuml/timingdiagram/TimingDiagramFactory.java b/src/net/sourceforge/plantuml/timingdiagram/TimingDiagramFactory.java index 6cee7302e..06125df02 100644 --- a/src/net/sourceforge/plantuml/timingdiagram/TimingDiagramFactory.java +++ b/src/net/sourceforge/plantuml/timingdiagram/TimingDiagramFactory.java @@ -65,6 +65,7 @@ import net.sourceforge.plantuml.timingdiagram.command.CommandRobustConcise; import net.sourceforge.plantuml.timingdiagram.command.CommandScalePixel; import net.sourceforge.plantuml.timingdiagram.command.CommandTicks; import net.sourceforge.plantuml.timingdiagram.command.CommandTimeMessage; +import net.sourceforge.plantuml.timingdiagram.command.CommandUseDateFormat; public class TimingDiagramFactory extends PSystemCommandFactory { @@ -100,6 +101,7 @@ public class TimingDiagramFactory extends PSystemCommandFactory { cmds.add(new CommandModeCompact()); cmds.add(new CommandTicks()); cmds.add(new CommandPixelHeight()); + cmds.add(new CommandUseDateFormat()); return cmds; } diff --git a/src/net/sourceforge/plantuml/timingdiagram/TimingFormat.java b/src/net/sourceforge/plantuml/timingdiagram/TimingFormat.java index 5e8f48226..295be1ff7 100644 --- a/src/net/sourceforge/plantuml/timingdiagram/TimingFormat.java +++ b/src/net/sourceforge/plantuml/timingdiagram/TimingFormat.java @@ -35,24 +35,40 @@ package net.sourceforge.plantuml.timingdiagram; import java.math.BigDecimal; +import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.TimeZone; -public enum TimingFormat { - DECIMAL, HOUR, DATE; - +public final class TimingFormat { private static final TimeZone GMT = TimeZone.getTimeZone("GMT"); private static final GregorianCalendar gc = new GregorianCalendar(TimingFormat.GMT); + public static final TimingFormat DECIMAL = new TimingFormat(null); + public static final TimingFormat HOUR = new TimingFormat(null); + public static final TimingFormat DATE = new TimingFormat(null); + + private final SimpleDateFormat sdf; + + private TimingFormat(SimpleDateFormat sdf) { + this.sdf = sdf; + } + + public static TimingFormat create(SimpleDateFormat sdf) { + return new TimingFormat(sdf); + } + public String formatTime(BigDecimal time) { - if (this == HOUR || this == DATE) { + if (this == HOUR || this == DATE || sdf != null) return formatTime(time.longValueExact()); - } + return time.toPlainString(); } public String formatTime(long time) { + if (sdf != null) + return sdf.format(time * 1000L); + if (this == HOUR) { final int s = (int) time % 60; final int m = (int) (time / 60) % 60; @@ -75,14 +91,14 @@ public enum TimingFormat { return "" + time; } - public static TimeTick createDate(final int yyyy, final int mm, final int dd) { + public static TimeTick createDate(int yyyy, int mm, int dd, TimingFormat format) { final long timeInMillis; synchronized (gc) { gc.setTimeInMillis(0); gc.set(yyyy, mm - 1, dd); timeInMillis = gc.getTimeInMillis() / 1000L; } - return new TimeTick(new BigDecimal(timeInMillis), TimingFormat.DATE); + return new TimeTick(new BigDecimal(timeInMillis), format); } } diff --git a/src/net/sourceforge/plantuml/timingdiagram/TimingRuler.java b/src/net/sourceforge/plantuml/timingdiagram/TimingRuler.java index 6ad1f2d8a..85df6bd69 100644 --- a/src/net/sourceforge/plantuml/timingdiagram/TimingRuler.java +++ b/src/net/sourceforge/plantuml/timingdiagram/TimingRuler.java @@ -59,6 +59,7 @@ import net.sourceforge.plantuml.ugraphic.ULine; import net.sourceforge.plantuml.ugraphic.UStroke; import net.sourceforge.plantuml.ugraphic.UTranslate; import net.sourceforge.plantuml.ugraphic.color.HColor; +import net.sourceforge.plantuml.ugraphic.color.HColorUtils; public class TimingRuler { @@ -200,7 +201,14 @@ public class TimingRuler { if (timeAxisStategy == TimeAxisStategy.HIDDEN) return; - ug = ug.apply(new UStroke(2.0)).apply(black()); + final Style style = StyleSignatureBasic.of(SName.root, SName.timingDiagram, SName.timeline) + .getMergedStyle(skinParam.getCurrentStyleBuilder()); + + final HColor color = style.value(PName.LineColor).asColor(skinParam.getThemeStyle(), + skinParam.getIHtmlColorSet()); + final UStroke stroke = style.getStroke(); + + ug = ug.apply(stroke).apply(color); if (timeAxisStategy == TimeAxisStategy.AUTOMATIC) drawTimeAxisAutomatic(ug); @@ -254,15 +262,7 @@ public class TimingRuler { if (tick.equals(ent.getValue())) return ent.getKey(); - return ""; - // return format.formatTime(tick.getTime()); - } - - private HColor black() { - final Style style = StyleSignatureBasic.of(SName.root, SName.element, SName.timingDiagram) - .getMergedStyle(skinParam.getCurrentStyleBuilder()); - return style.value(PName.LineColor).asColor(skinParam.getThemeStyle(), skinParam.getIHtmlColorSet()); - + return format.formatTime(tick.getTime()); } private BigDecimal getFirstPositiveOrZeroValue() { diff --git a/src/net/sourceforge/plantuml/timingdiagram/command/CommandUseDateFormat.java b/src/net/sourceforge/plantuml/timingdiagram/command/CommandUseDateFormat.java new file mode 100644 index 000000000..582247ce2 --- /dev/null +++ b/src/net/sourceforge/plantuml/timingdiagram/command/CommandUseDateFormat.java @@ -0,0 +1,71 @@ +/* ======================================================================== + * PlantUML : a free UML diagram generator + * ======================================================================== + * + * (C) Copyright 2009-2023, 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.timingdiagram.command; + +import net.sourceforge.plantuml.LineLocation; +import net.sourceforge.plantuml.command.CommandExecutionResult; +import net.sourceforge.plantuml.command.SingleLineCommand2; +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.RegexResult; +import net.sourceforge.plantuml.timingdiagram.TimingDiagram; + +public class CommandUseDateFormat extends SingleLineCommand2 { + + public CommandUseDateFormat() { + super(getRegexConcat()); + } + + private static IRegex getRegexConcat() { + return RegexConcat.build(CommandUseDateFormat.class.getName(), RegexLeaf.start(), // + new RegexLeaf("use"), // + RegexLeaf.spaceZeroOrMore(), // + new RegexLeaf("date"), // + RegexLeaf.spaceZeroOrMore(), // + new RegexLeaf("format"), // + RegexLeaf.spaceZeroOrMore(), // + new RegexLeaf("FORMAT", "[%g]([^%g]+)[%g]"), // + RegexLeaf.end()); + } + + @Override + final protected CommandExecutionResult executeArg(TimingDiagram diagram, LineLocation location, RegexResult arg) { + final String format = arg.get("FORMAT", 0); + return diagram.useDateFormat(format); + } + +} diff --git a/src/net/sourceforge/plantuml/timingdiagram/command/TimeTickBuilder.java b/src/net/sourceforge/plantuml/timingdiagram/command/TimeTickBuilder.java index 8d58b18c7..2ebeaa5cc 100644 --- a/src/net/sourceforge/plantuml/timingdiagram/command/TimeTickBuilder.java +++ b/src/net/sourceforge/plantuml/timingdiagram/command/TimeTickBuilder.java @@ -72,9 +72,9 @@ public class TimeTickBuilder { if (code != null) { final String delta = arg.get(name + "CODE", 1); TimeTick result = clock.getCodeValue(code); - if (delta == null) { + if (delta == null) return result; - } + final BigDecimal value = result.getTime().add(new BigDecimal(delta)); return new TimeTick(value, TimingFormat.DECIMAL); } @@ -97,17 +97,17 @@ public class TimeTickBuilder { final int mm = Integer.parseInt(arg.get(name + "DATE", 1)); final int dd = Integer.parseInt(arg.get(name + "DATE", 2)); - return TimingFormat.createDate(yy, mm, dd); + return TimingFormat.createDate(yy, mm, dd, clock.getTimingFormatDate()); } final String number = arg.get(name + "DIGIT", 1); - if (number == null) { + if (number == null) return clock.getNow(); - } + final boolean isRelative = "+".equals(arg.get(name + "DIGIT", 0)); BigDecimal value = new BigDecimal(number); - if (isRelative && clock.getNow() != null) { + if (isRelative && clock.getNow() != null) value = clock.getNow().getTime().add(value); - } + return new TimeTick(value, TimingFormat.DECIMAL); } diff --git a/src/net/sourceforge/plantuml/version/Version.java b/src/net/sourceforge/plantuml/version/Version.java index 7bafdfd8b..14353d8e4 100644 --- a/src/net/sourceforge/plantuml/version/Version.java +++ b/src/net/sourceforge/plantuml/version/Version.java @@ -80,7 +80,7 @@ public class Version { } public static int beta() { - final int beta = 2; + final int beta = 4; return beta; }