From 1edafc748df7b98d4c2b6b499fedadd675202158 Mon Sep 17 00:00:00 2001 From: Arnaud Roques Date: Sun, 25 Jul 2021 12:41:36 +0200 Subject: [PATCH] Import version 1.2021.9 --- src/net/sourceforge/plantuml/Option.java | 30 +- src/net/sourceforge/plantuml/OptionFlags.java | 9 + src/net/sourceforge/plantuml/OptionPrint.java | 1 + src/net/sourceforge/plantuml/Run.java | 19 ++ .../plantuml/SourceFileReaderAbstract.java | 4 +- .../activitydiagram3/ActivityDiagram3.java | 14 +- .../plantuml/activitydiagram3/Branch.java | 4 +- .../activitydiagram3/Instruction.java | 3 +- .../activitydiagram3/InstructionBreak.java | 3 +- .../activitydiagram3/InstructionEnd.java | 3 +- .../activitydiagram3/InstructionFork.java | 5 +- .../activitydiagram3/InstructionGoto.java | 3 +- .../activitydiagram3/InstructionGroup.java | 5 +- .../activitydiagram3/InstructionIf.java | 5 +- .../activitydiagram3/InstructionLabel.java | 3 +- .../activitydiagram3/InstructionList.java | 4 +- .../InstructionPartition.java | 5 +- .../activitydiagram3/InstructionRepeat.java | 5 +- .../activitydiagram3/InstructionSimple.java | 3 +- .../activitydiagram3/InstructionSplit.java | 5 +- .../activitydiagram3/InstructionSpot.java | 3 +- .../activitydiagram3/InstructionStart.java | 3 +- .../activitydiagram3/InstructionStop.java | 3 +- .../activitydiagram3/InstructionSwitch.java | 29 +- .../activitydiagram3/InstructionWhile.java | 5 +- .../command/CommandActivity3.java | 3 +- .../command/CommandActivityLegacy1.java | 3 +- .../command/CommandActivityLong3.java | 3 +- .../ftile/vertical/FtileBox.java | 92 +++--- .../ftile/vertical/FtileBox2.java | 273 +++++++++++++++++ .../ftile/vertical/FtileBoxOld.java | 285 ++++++++++++++++++ .../cucadiagram/MethodsOrFieldsArea.java | 10 +- .../plantuml/mindmap/FingerImpl.java | 4 +- .../plantuml/project/core/Task.java | 2 +- .../plantuml/project/core/TaskImpl.java | 12 +- .../plantuml/project/core/TaskSeparator.java | 2 +- .../project/draw/AbstractTaskDraw.java | 7 +- .../project/draw/TaskDrawDiamond.java | 6 +- .../project/draw/TaskDrawRegular.java | 6 +- .../project/lang/CenterBorderColor.java | 15 + .../lang/ComplementInColorsFromTo.java | 69 +++++ .../lang/SentenceIsColoredForCompletion.java | 56 ++++ .../plantuml/project/lang/SubjectTask.java | 7 +- .../plantuml/project/lang/Verbs.java | 4 + .../command/CommandExoArrowAny.java | 52 ++-- .../command/CommandExoArrowLeft.java | 6 +- .../command/CommandExoArrowRight.java | 6 +- .../sourceforge/plantuml/tim/TContext.java | 6 + .../plantuml/tim/stdlib/Dec2hex.java | 67 ++++ .../plantuml/tim/stdlib/Hex2dec.java | 67 ++++ .../plantuml/tim/stdlib/HslColor.java | 78 +++++ .../plantuml/tim/stdlib/Lower.java | 2 +- .../plantuml/tim/stdlib/ReverseColor.java | 2 +- .../tim/stdlib/ReverseHsluvColor.java | 2 +- .../plantuml/tim/stdlib/StringFunction.java | 2 +- .../plantuml/tim/stdlib/Upper.java | 2 +- .../plantuml/ugraphic/ImageBuilder.java | 22 +- .../plantuml/ugraphic/color/HColorSimple.java | 27 +- .../plantuml/ugraphic/color/HColorUtils.java | 7 + src/net/sourceforge/plantuml/utils/words.txt | 2 +- .../sourceforge/plantuml/version/Version.java | 4 +- src/net/sourceforge/plantuml/wbs/ITFLeaf.java | 4 +- .../plantuml/wbs/WBSTextBlock.java | 8 +- stdlib/archimate-abx.repx | Bin 2528 -> 2531 bytes stdlib/azure-abx.repx | Bin 5081 -> 5073 bytes stdlib/c4-abx.repx | Bin 6951 -> 8759 bytes stdlib/cloudinsight-abx.repx | Bin 803 -> 800 bytes stdlib/kubernetes-abx.repx | Bin 589 -> 584 bytes stdlib/logos-abx.repx | Bin 11441 -> 11450 bytes 69 files changed, 1214 insertions(+), 187 deletions(-) create mode 100644 src/net/sourceforge/plantuml/activitydiagram3/ftile/vertical/FtileBox2.java create mode 100644 src/net/sourceforge/plantuml/activitydiagram3/ftile/vertical/FtileBoxOld.java create mode 100644 src/net/sourceforge/plantuml/project/lang/ComplementInColorsFromTo.java create mode 100644 src/net/sourceforge/plantuml/project/lang/SentenceIsColoredForCompletion.java create mode 100644 src/net/sourceforge/plantuml/tim/stdlib/Dec2hex.java create mode 100644 src/net/sourceforge/plantuml/tim/stdlib/Hex2dec.java create mode 100644 src/net/sourceforge/plantuml/tim/stdlib/HslColor.java diff --git a/src/net/sourceforge/plantuml/Option.java b/src/net/sourceforge/plantuml/Option.java index 4caeb0700..6334c37d2 100644 --- a/src/net/sourceforge/plantuml/Option.java +++ b/src/net/sourceforge/plantuml/Option.java @@ -60,6 +60,7 @@ public class Option { private final List excludes = new ArrayList<>(); private final List config = new ArrayList<>(); private final Map defines = new LinkedHashMap(); + private String charset; private boolean computeurl = false; private boolean decodeurl = false; @@ -305,6 +306,8 @@ public class Option { manageDefine(s.substring(2)); } else if (s.startsWith("-S")) { manageSkinParam(s.substring(2)); + } else if (s.startsWith("-P")) { + managePragma(s.substring(2)); } else if (s.equalsIgnoreCase("-testdot")) { OptionPrint.printTestDot(); } else if (s.equalsIgnoreCase("-about") || s.equalsIgnoreCase("-author") @@ -318,8 +321,6 @@ public class Option { OptionFlags.getInstance().setGui(true); } else if (s.equalsIgnoreCase("-encodesprite")) { OptionFlags.getInstance().setEncodesprite(true); - // } else if (s.equalsIgnoreCase("-nosuggestengine")) { - // OptionFlags.getInstance().setUseSuggestEngine(false); } else if (s.equalsIgnoreCase("-printfonts")) { OptionFlags.getInstance().setPrintFonts(true); } else if (s.equalsIgnoreCase("-dumphtmlstats")) { @@ -467,21 +468,30 @@ public class Option { } } + private void managePragma(String s) { + final Pattern2 p = MyPattern.cmpile("^(\\w+)(?:=(.*))?$"); + final Matcher2 m = p.matcher(s); + if (m.find()) { + final String var = m.group(1); + final String value = StringUtils.eventuallyRemoveStartingAndEndingDoubleQuote(m.group(2)); + if (var != null && value != null) { + config.add("!pragma " + var + " " + value); + } + } + } + private void manageSkinParam(String s) { final Pattern2 p = MyPattern.cmpile("^(\\w+)(?:=(.*))?$"); final Matcher2 m = p.matcher(s); if (m.find()) { - skinParam(m.group(1), m.group(2)); + final String var = m.group(1); + final String value = m.group(2); + if (var != null && value != null) { + config.add("skinparamlocked " + var + " " + value); + } } } - private void skinParam(String var, String value) { - if (var != null && value != null) { - config.add("skinparamlocked " + var + " " + value); - } - - } - public final File getOutputDir() { return outputDir; } diff --git a/src/net/sourceforge/plantuml/OptionFlags.java b/src/net/sourceforge/plantuml/OptionFlags.java index c8b362f00..36a7091f9 100644 --- a/src/net/sourceforge/plantuml/OptionFlags.java +++ b/src/net/sourceforge/plantuml/OptionFlags.java @@ -122,6 +122,7 @@ public class OptionFlags { private boolean enableStats = defaultForStats(); private boolean stdLib; private boolean silentlyCompletelyIgnoreErrors; + private boolean replaceWhiteBackgroundByTransparent; private boolean extractStdLib; private boolean clipboardLoop; private boolean clipboard; @@ -367,4 +368,12 @@ public class OptionFlags { public final void setSilentlyCompletelyIgnoreErrors(boolean silentlyCompletelyIgnoreErrors) { this.silentlyCompletelyIgnoreErrors = silentlyCompletelyIgnoreErrors; } + + public final boolean isReplaceWhiteBackgroundByTransparent() { + return replaceWhiteBackgroundByTransparent; + } + + public final void setReplaceWhiteBackgroundByTransparent(boolean replaceWhiteBackgroundByTransparent) { + this.replaceWhiteBackgroundByTransparent = replaceWhiteBackgroundByTransparent; + } } diff --git a/src/net/sourceforge/plantuml/OptionPrint.java b/src/net/sourceforge/plantuml/OptionPrint.java index e45fe88a7..6e616c9fc 100644 --- a/src/net/sourceforge/plantuml/OptionPrint.java +++ b/src/net/sourceforge/plantuml/OptionPrint.java @@ -101,6 +101,7 @@ public class OptionPrint { System.out.println(" -o[utput] \"dir\"\tTo generate images in the specified directory"); System.out.println(" -DVAR1=value\tTo set a preprocessing variable as if '!define VAR1 value' were used"); System.out.println(" -Sparam1=value\tTo set a skin parameter as if 'skinparam param1 value' were used"); + System.out.println(" -Ppragma1=value\tTo set pragma as if '!pragma pragma1 value' were used"); // System.out.println(" -config \"file\"\tTo read the provided config file // before each diagram"); final char separator = SFile.separatorChar; diff --git a/src/net/sourceforge/plantuml/Run.java b/src/net/sourceforge/plantuml/Run.java index 4eb53b8af..6b2f5238b 100644 --- a/src/net/sourceforge/plantuml/Run.java +++ b/src/net/sourceforge/plantuml/Run.java @@ -46,8 +46,11 @@ import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.net.URL; +import java.time.Month; +import java.time.format.TextStyle; import java.util.ArrayList; import java.util.List; +import java.util.Locale; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; @@ -83,6 +86,10 @@ public class Run { if (argsArray.length > 0 && argsArray[0].equalsIgnoreCase("-headless")) { System.setProperty("java.awt.headless", "true"); } + if (argsArray.length > 0 && argsArray[0].equalsIgnoreCase("--de")) { + debugGantt(); + return; + } saveCommandLine(argsArray); final Option option = new Option(argsArray); ProgressBar.setEnable(option.isTextProgressBar()); @@ -577,4 +584,16 @@ public class Run { error.goOk(); } + public static void debugGantt() { + final Locale locale = Locale.GERMAN; + for (java.time.Month month : java.time.Month.values()) { + System.err.println("Testing locale " + locale + " " + month); + for (TextStyle style : TextStyle.values()) { + final String s = month.getDisplayName(style, locale); + System.err.println(style + " --> '" + s + "'"); + + } + } + } + } diff --git a/src/net/sourceforge/plantuml/SourceFileReaderAbstract.java b/src/net/sourceforge/plantuml/SourceFileReaderAbstract.java index 86f7074e0..5ab5cf6ca 100644 --- a/src/net/sourceforge/plantuml/SourceFileReaderAbstract.java +++ b/src/net/sourceforge/plantuml/SourceFileReaderAbstract.java @@ -151,7 +151,7 @@ public abstract class SourceFileReaderAbstract implements ISourceFileReader { system = blockUml.getDiagram(); } catch (Throwable t) { t.printStackTrace(); - if (OptionFlags.getInstance().isSilentlyCompletelyIgnoreErrors()) { + if (OptionFlags.getInstance().isSilentlyCompletelyIgnoreErrors() || noerror) { continue; } return getCrashedImage(blockUml, t, suggested.getFile(0)); @@ -163,7 +163,7 @@ public abstract class SourceFileReaderAbstract implements ISourceFileReader { OptionFlags.getInstance().logData(SFile.fromFile(file), system); final List exportDiagrams; - if (noerror) { + if (noerror && system instanceof PSystemError) { exportDiagrams = new ArrayList(); exportDiagrams.add( new FileImageData(null, new ImageDataSimple(new Dimension2DDouble(0, 0), FileImageData.ERROR))); diff --git a/src/net/sourceforge/plantuml/activitydiagram3/ActivityDiagram3.java b/src/net/sourceforge/plantuml/activitydiagram3/ActivityDiagram3.java index a8a25e86e..5faf9be9f 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/ActivityDiagram3.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/ActivityDiagram3.java @@ -108,16 +108,22 @@ public class ActivityDiagram3 extends UmlDiagram { return swinlanes.nextLinkRenderer(); } - public void addActivity(Display activity, BoxStyle style, Url url, Colors colors, Stereotype stereotype) { + public CommandExecutionResult addActivity(Display activity, BoxStyle style, Url url, Colors colors, + Stereotype stereotype) { manageSwimlaneStrategy(); final InstructionSimple ins = new InstructionSimple(activity, nextLinkRenderer(), swinlanes.getCurrentSwimlane(), style, url, colors, stereotype); - current().add(ins); + final CommandExecutionResult added = current().add(ins); + if (added.isOk() == false) { + return added; + } setNextLinkRendererInternal(LinkRendering.none()); manageHasUrl(activity); if (url != null) { hasUrl = true; } + return CommandExecutionResult.ok(); + } public void addSpot(String spot, HColor color) { @@ -205,9 +211,7 @@ public class ActivityDiagram3 extends UmlDiagram { result = CompressionXorYBuilder.build(CompressionMode.ON_Y, result, stringBounder); result = new TextBlockRecentred(result); - return createImageBuilder(fileFormatOption) - .drawable(result) - .write(os); + return createImageBuilder(fileFormatOption).drawable(result).write(os); } public void fork() { diff --git a/src/net/sourceforge/plantuml/activitydiagram3/Branch.java b/src/net/sourceforge/plantuml/activitydiagram3/Branch.java index 79da03e21..7c09ef19f 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/Branch.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/Branch.java @@ -44,6 +44,7 @@ import net.sourceforge.plantuml.activitydiagram3.ftile.Ftile; import net.sourceforge.plantuml.activitydiagram3.ftile.FtileFactory; import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane; import net.sourceforge.plantuml.activitydiagram3.ftile.WeldingPoint; +import net.sourceforge.plantuml.command.CommandExecutionResult; import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.graphic.Rainbow; import net.sourceforge.plantuml.graphic.color.Colors; @@ -105,8 +106,9 @@ public class Branch { return ftile.getWeldingPoints(); } - public void add(Instruction ins) { + public CommandExecutionResult add(Instruction ins) { list.add(ins); + return CommandExecutionResult.ok(); } public boolean kill() { diff --git a/src/net/sourceforge/plantuml/activitydiagram3/Instruction.java b/src/net/sourceforge/plantuml/activitydiagram3/Instruction.java index c3f3055a4..aa85025d3 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/Instruction.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/Instruction.java @@ -39,6 +39,7 @@ import net.sourceforge.plantuml.activitydiagram3.ftile.Ftile; import net.sourceforge.plantuml.activitydiagram3.ftile.FtileFactory; import net.sourceforge.plantuml.activitydiagram3.ftile.Swimable; import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane; +import net.sourceforge.plantuml.command.CommandExecutionResult; import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.graphic.color.Colors; import net.sourceforge.plantuml.sequencediagram.NotePosition; @@ -48,7 +49,7 @@ public interface Instruction extends Swimable { public Ftile createFtile(FtileFactory factory); - public void add(Instruction other); + public CommandExecutionResult add(Instruction other); public boolean kill(); diff --git a/src/net/sourceforge/plantuml/activitydiagram3/InstructionBreak.java b/src/net/sourceforge/plantuml/activitydiagram3/InstructionBreak.java index 211b407f2..0006a72b2 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/InstructionBreak.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/InstructionBreak.java @@ -41,6 +41,7 @@ import net.sourceforge.plantuml.activitydiagram3.ftile.Ftile; import net.sourceforge.plantuml.activitydiagram3.ftile.FtileBreak; import net.sourceforge.plantuml.activitydiagram3.ftile.FtileFactory; import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane; +import net.sourceforge.plantuml.command.CommandExecutionResult; public class InstructionBreak extends MonoSwimable implements Instruction { @@ -55,7 +56,7 @@ public class InstructionBreak extends MonoSwimable implements Instruction { return new FtileBreak(factory.skinParam(), getSwimlaneIn()); } - public void add(Instruction other) { + public CommandExecutionResult add(Instruction other) { throw new UnsupportedOperationException(); } diff --git a/src/net/sourceforge/plantuml/activitydiagram3/InstructionEnd.java b/src/net/sourceforge/plantuml/activitydiagram3/InstructionEnd.java index c2b8bd119..a80106c95 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/InstructionEnd.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/InstructionEnd.java @@ -40,6 +40,7 @@ import java.util.Objects; import net.sourceforge.plantuml.activitydiagram3.ftile.Ftile; import net.sourceforge.plantuml.activitydiagram3.ftile.FtileFactory; import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane; +import net.sourceforge.plantuml.command.CommandExecutionResult; public class InstructionEnd extends MonoSwimable implements Instruction { @@ -56,7 +57,7 @@ public class InstructionEnd extends MonoSwimable implements Instruction { return result; } - public void add(Instruction other) { + public CommandExecutionResult add(Instruction other) { throw new UnsupportedOperationException(); } diff --git a/src/net/sourceforge/plantuml/activitydiagram3/InstructionFork.java b/src/net/sourceforge/plantuml/activitydiagram3/InstructionFork.java index 68635fece..45a1724dd 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/InstructionFork.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/InstructionFork.java @@ -46,6 +46,7 @@ import net.sourceforge.plantuml.activitydiagram3.ftile.Ftile; import net.sourceforge.plantuml.activitydiagram3.ftile.FtileFactory; import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane; import net.sourceforge.plantuml.activitydiagram3.ftile.vcompact.FtileWithNoteOpale; +import net.sourceforge.plantuml.command.CommandExecutionResult; import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.graphic.color.Colors; import net.sourceforge.plantuml.sequencediagram.NotePosition; @@ -85,8 +86,8 @@ public class InstructionFork extends WithNote implements Instruction { return forks.get(forks.size() - 1); } - public void add(Instruction ins) { - getLastList().add(ins); + public CommandExecutionResult add(Instruction ins) { + return getLastList().add(ins); } public Ftile createFtile(FtileFactory factory) { diff --git a/src/net/sourceforge/plantuml/activitydiagram3/InstructionGoto.java b/src/net/sourceforge/plantuml/activitydiagram3/InstructionGoto.java index 2a99e0c8b..48a8e3eba 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/InstructionGoto.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/InstructionGoto.java @@ -39,6 +39,7 @@ import net.sourceforge.plantuml.activitydiagram3.ftile.Ftile; import net.sourceforge.plantuml.activitydiagram3.ftile.FtileFactory; import net.sourceforge.plantuml.activitydiagram3.ftile.FtileGoto; import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane; +import net.sourceforge.plantuml.command.CommandExecutionResult; public class InstructionGoto extends MonoSwimable implements Instruction { @@ -53,7 +54,7 @@ public class InstructionGoto extends MonoSwimable implements Instruction { return new FtileGoto(factory.skinParam(), getSwimlaneIn(), name); } - public void add(Instruction other) { + public CommandExecutionResult add(Instruction other) { throw new UnsupportedOperationException(); } diff --git a/src/net/sourceforge/plantuml/activitydiagram3/InstructionGroup.java b/src/net/sourceforge/plantuml/activitydiagram3/InstructionGroup.java index 4848679a9..f64e06a97 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/InstructionGroup.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/InstructionGroup.java @@ -42,6 +42,7 @@ import net.sourceforge.plantuml.activitydiagram3.ftile.Ftile; import net.sourceforge.plantuml.activitydiagram3.ftile.FtileFactory; import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane; import net.sourceforge.plantuml.activitydiagram3.ftile.vcompact.FtileWithNotes; +import net.sourceforge.plantuml.command.CommandExecutionResult; import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.graphic.USymbol; import net.sourceforge.plantuml.graphic.color.Colors; @@ -80,8 +81,8 @@ public class InstructionGroup implements Instruction, InstructionCollection { this.roundCorner = roundCorner; } - public void add(Instruction ins) { - list.add(ins); + public CommandExecutionResult add(Instruction ins) { + return list.add(ins); } public Ftile createFtile(FtileFactory factory) { diff --git a/src/net/sourceforge/plantuml/activitydiagram3/InstructionIf.java b/src/net/sourceforge/plantuml/activitydiagram3/InstructionIf.java index ad908f6bc..d751d5155 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/InstructionIf.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/InstructionIf.java @@ -50,6 +50,7 @@ import net.sourceforge.plantuml.activitydiagram3.ftile.FtileFactory; import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane; import net.sourceforge.plantuml.activitydiagram3.ftile.WeldingPoint; import net.sourceforge.plantuml.activitydiagram3.ftile.vcompact.FtileWithNoteOpale; +import net.sourceforge.plantuml.command.CommandExecutionResult; import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.graphic.color.Colors; import net.sourceforge.plantuml.sequencediagram.NotePosition; @@ -96,8 +97,8 @@ public class InstructionIf extends WithNote implements Instruction, InstructionC this.current = this.thens.get(0); } - public void add(Instruction ins) { - current.add(ins); + public CommandExecutionResult add(Instruction ins) { + return current.add(ins); } public Ftile createFtile(FtileFactory factory) { diff --git a/src/net/sourceforge/plantuml/activitydiagram3/InstructionLabel.java b/src/net/sourceforge/plantuml/activitydiagram3/InstructionLabel.java index 9e89802f6..a1707f0dd 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/InstructionLabel.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/InstructionLabel.java @@ -39,6 +39,7 @@ import net.sourceforge.plantuml.activitydiagram3.ftile.Ftile; import net.sourceforge.plantuml.activitydiagram3.ftile.FtileFactory; import net.sourceforge.plantuml.activitydiagram3.ftile.FtileLabel; import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane; +import net.sourceforge.plantuml.command.CommandExecutionResult; public class InstructionLabel extends MonoSwimable implements Instruction { @@ -53,7 +54,7 @@ public class InstructionLabel extends MonoSwimable implements Instruction { return new FtileLabel(factory.skinParam(), getSwimlaneIn(), name); } - public void add(Instruction other) { + public CommandExecutionResult add(Instruction other) { throw new UnsupportedOperationException(); } diff --git a/src/net/sourceforge/plantuml/activitydiagram3/InstructionList.java b/src/net/sourceforge/plantuml/activitydiagram3/InstructionList.java index f30dcec79..69d5835bd 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/InstructionList.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/InstructionList.java @@ -47,6 +47,7 @@ import net.sourceforge.plantuml.activitydiagram3.ftile.FtileEmpty; import net.sourceforge.plantuml.activitydiagram3.ftile.FtileFactory; import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane; import net.sourceforge.plantuml.activitydiagram3.ftile.WeldingPoint; +import net.sourceforge.plantuml.command.CommandExecutionResult; import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.graphic.color.Colors; import net.sourceforge.plantuml.sequencediagram.NotePosition; @@ -88,8 +89,9 @@ public class InstructionList extends WithNote implements Instruction, Instructio this.defaultSwimlane = defaultSwimlane; } - public void add(Instruction ins) { + public CommandExecutionResult add(Instruction ins) { all.add(ins); + return CommandExecutionResult.ok(); } public Ftile createFtile(FtileFactory factory) { diff --git a/src/net/sourceforge/plantuml/activitydiagram3/InstructionPartition.java b/src/net/sourceforge/plantuml/activitydiagram3/InstructionPartition.java index 9d3917a1a..b847e8c7c 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/InstructionPartition.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/InstructionPartition.java @@ -40,6 +40,7 @@ import java.util.Set; import net.sourceforge.plantuml.activitydiagram3.ftile.Ftile; import net.sourceforge.plantuml.activitydiagram3.ftile.FtileFactory; import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane; +import net.sourceforge.plantuml.command.CommandExecutionResult; import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.graphic.color.Colors; import net.sourceforge.plantuml.sequencediagram.NotePosition; @@ -74,8 +75,8 @@ public class InstructionPartition implements Instruction { return list.createFtile(factory); } - public void add(Instruction other) { - list.add(other); + public CommandExecutionResult add(Instruction other) { + return list.add(other); } public boolean kill() { diff --git a/src/net/sourceforge/plantuml/activitydiagram3/InstructionRepeat.java b/src/net/sourceforge/plantuml/activitydiagram3/InstructionRepeat.java index b66fbac06..19d356e4d 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/InstructionRepeat.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/InstructionRepeat.java @@ -45,6 +45,7 @@ import net.sourceforge.plantuml.activitydiagram3.ftile.Ftile; import net.sourceforge.plantuml.activitydiagram3.ftile.FtileFactory; import net.sourceforge.plantuml.activitydiagram3.ftile.FtileKilled; import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane; +import net.sourceforge.plantuml.command.CommandExecutionResult; import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.graphic.color.Colors; import net.sourceforge.plantuml.sequencediagram.NotePosition; @@ -111,8 +112,8 @@ public class InstructionRepeat implements Instruction { return this.backward != Display.NULL; } - public void add(Instruction ins) { - repeatList.add(ins); + public CommandExecutionResult add(Instruction ins) { + return repeatList.add(ins); } public Ftile createFtile(FtileFactory factory) { diff --git a/src/net/sourceforge/plantuml/activitydiagram3/InstructionSimple.java b/src/net/sourceforge/plantuml/activitydiagram3/InstructionSimple.java index e3e5713f3..18e2a70ab 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/InstructionSimple.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/InstructionSimple.java @@ -43,6 +43,7 @@ import net.sourceforge.plantuml.activitydiagram3.ftile.Ftile; import net.sourceforge.plantuml.activitydiagram3.ftile.FtileFactory; import net.sourceforge.plantuml.activitydiagram3.ftile.FtileKilled; import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane; +import net.sourceforge.plantuml.command.CommandExecutionResult; import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Stereotype; import net.sourceforge.plantuml.graphic.color.Colors; @@ -84,7 +85,7 @@ public class InstructionSimple extends MonoSwimable implements Instruction { return result; } - public void add(Instruction other) { + public CommandExecutionResult add(Instruction other) { throw new UnsupportedOperationException(); } diff --git a/src/net/sourceforge/plantuml/activitydiagram3/InstructionSplit.java b/src/net/sourceforge/plantuml/activitydiagram3/InstructionSplit.java index e59b06970..8818d0b8e 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/InstructionSplit.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/InstructionSplit.java @@ -43,6 +43,7 @@ import java.util.Set; import net.sourceforge.plantuml.activitydiagram3.ftile.Ftile; import net.sourceforge.plantuml.activitydiagram3.ftile.FtileFactory; import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane; +import net.sourceforge.plantuml.command.CommandExecutionResult; import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.graphic.color.Colors; import net.sourceforge.plantuml.sequencediagram.NotePosition; @@ -77,8 +78,8 @@ public class InstructionSplit implements Instruction { return splits.get(splits.size() - 1); } - public void add(Instruction ins) { - getLast().add(ins); + public CommandExecutionResult add(Instruction ins) { + return getLast().add(ins); } public Ftile createFtile(FtileFactory factory) { diff --git a/src/net/sourceforge/plantuml/activitydiagram3/InstructionSpot.java b/src/net/sourceforge/plantuml/activitydiagram3/InstructionSpot.java index 65c886092..030e47ec6 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/InstructionSpot.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/InstructionSpot.java @@ -41,6 +41,7 @@ import net.sourceforge.plantuml.activitydiagram3.ftile.Ftile; import net.sourceforge.plantuml.activitydiagram3.ftile.FtileFactory; import net.sourceforge.plantuml.activitydiagram3.ftile.FtileKilled; import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane; +import net.sourceforge.plantuml.command.CommandExecutionResult; import net.sourceforge.plantuml.ugraphic.color.HColor; public class InstructionSpot extends MonoSwimable implements Instruction { @@ -70,7 +71,7 @@ public class InstructionSpot extends MonoSwimable implements Instruction { return result; } - public void add(Instruction other) { + public CommandExecutionResult add(Instruction other) { throw new UnsupportedOperationException(); } diff --git a/src/net/sourceforge/plantuml/activitydiagram3/InstructionStart.java b/src/net/sourceforge/plantuml/activitydiagram3/InstructionStart.java index 5ee416369..39b7e8325 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/InstructionStart.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/InstructionStart.java @@ -40,6 +40,7 @@ import java.util.Objects; import net.sourceforge.plantuml.activitydiagram3.ftile.Ftile; import net.sourceforge.plantuml.activitydiagram3.ftile.FtileFactory; import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane; +import net.sourceforge.plantuml.command.CommandExecutionResult; public class InstructionStart extends MonoSwimable implements Instruction { @@ -61,7 +62,7 @@ public class InstructionStart extends MonoSwimable implements Instruction { return result; } - public void add(Instruction other) { + public CommandExecutionResult add(Instruction other) { throw new UnsupportedOperationException(); } diff --git a/src/net/sourceforge/plantuml/activitydiagram3/InstructionStop.java b/src/net/sourceforge/plantuml/activitydiagram3/InstructionStop.java index 5533e84de..2e38e731a 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/InstructionStop.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/InstructionStop.java @@ -40,6 +40,7 @@ import java.util.Objects; import net.sourceforge.plantuml.activitydiagram3.ftile.Ftile; import net.sourceforge.plantuml.activitydiagram3.ftile.FtileFactory; import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane; +import net.sourceforge.plantuml.command.CommandExecutionResult; public class InstructionStop extends MonoSwimable implements Instruction { @@ -61,7 +62,7 @@ public class InstructionStop extends MonoSwimable implements Instruction { return result; } - public void add(Instruction other) { + public CommandExecutionResult add(Instruction other) { throw new UnsupportedOperationException(); } diff --git a/src/net/sourceforge/plantuml/activitydiagram3/InstructionSwitch.java b/src/net/sourceforge/plantuml/activitydiagram3/InstructionSwitch.java index d841bdc65..ad7a01778 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/InstructionSwitch.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/InstructionSwitch.java @@ -46,6 +46,7 @@ import net.sourceforge.plantuml.ISkinParam; import net.sourceforge.plantuml.activitydiagram3.ftile.Ftile; import net.sourceforge.plantuml.activitydiagram3.ftile.FtileFactory; import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane; +import net.sourceforge.plantuml.command.CommandExecutionResult; import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.graphic.color.Colors; import net.sourceforge.plantuml.sequencediagram.NotePosition; @@ -84,27 +85,18 @@ public class InstructionSwitch extends WithNote implements Instruction, Instruct this.swimlane = swimlane; } - public void add(Instruction ins) { - current.add(ins); + public CommandExecutionResult add(Instruction ins) { + if (current == null) { + return CommandExecutionResult.error("No 'case' in this switch"); + } + return current.add(ins); } public Ftile createFtile(FtileFactory factory) { for (Branch branch : branches) { branch.updateFtile(factory); } - Ftile result = factory.createSwitch(swimlane, branches, afterEndwhile, topInlinkRendering, labelTest); - // if (getPositionedNotes().size() > 0) { - // result = FtileWithNoteOpale.create(result, getPositionedNotes(), skinParam, - // false); - // } - // final List weldingPoints = new ArrayList<>(); - // for (Branch branch : branches) { - // weldingPoints.addAll(branch.getWeldingPoints()); - // } - // if (weldingPoints.size() > 0) { - // result = new FtileDecorateWelding(result, weldingPoints); - // } - return result; + return factory.createSwitch(swimlane, branches, afterEndwhile, topInlinkRendering, labelTest); } final public boolean kill() { @@ -154,7 +146,7 @@ public class InstructionSwitch extends WithNote implements Instruction, Instruct // TODO Auto-generated method stub } - + @Override public boolean addNote(Display note, NotePosition position, NoteType type, Colors colors, Swimlane swimlaneNote) { if (current.isEmpty()) { @@ -164,9 +156,4 @@ public class InstructionSwitch extends WithNote implements Instruction, Instruct } } - - // public void afterEndwhile(LinkRendering linkRenderer) { - // this.afterEndwhile = linkRenderer; - // } - } diff --git a/src/net/sourceforge/plantuml/activitydiagram3/InstructionWhile.java b/src/net/sourceforge/plantuml/activitydiagram3/InstructionWhile.java index fd4f3ee48..11acd4510 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/InstructionWhile.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/InstructionWhile.java @@ -45,6 +45,7 @@ import net.sourceforge.plantuml.activitydiagram3.ftile.FtileFactory; import net.sourceforge.plantuml.activitydiagram3.ftile.FtileKilled; import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane; import net.sourceforge.plantuml.activitydiagram3.ftile.vcompact.FtileWithNoteOpale; +import net.sourceforge.plantuml.command.CommandExecutionResult; import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.graphic.Rainbow; import net.sourceforge.plantuml.graphic.color.Colors; @@ -93,8 +94,8 @@ public class InstructionWhile extends WithNote implements Instruction, Instructi this.skinParam = skinParam; } - public void add(Instruction ins) { - repeatList.add(ins); + public CommandExecutionResult add(Instruction ins) { + return repeatList.add(ins); } public Ftile createFtile(FtileFactory factory) { diff --git a/src/net/sourceforge/plantuml/activitydiagram3/command/CommandActivity3.java b/src/net/sourceforge/plantuml/activitydiagram3/command/CommandActivity3.java index 8a8e98b13..1974bcc4e 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/command/CommandActivity3.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/command/CommandActivity3.java @@ -123,8 +123,7 @@ public class CommandActivity3 extends SingleLineCommand2 { } final BoxStyle style = BoxStyle.fromChar(arg.get("STYLE", 0).charAt(0)); final Display display = Display.getWithNewlines2(arg.get("LABEL", 0)); - diagram.addActivity(display, style, url, colors, stereotype); - return CommandExecutionResult.ok(); + return diagram.addActivity(display, style, url, colors, stereotype); } } diff --git a/src/net/sourceforge/plantuml/activitydiagram3/command/CommandActivityLegacy1.java b/src/net/sourceforge/plantuml/activitydiagram3/command/CommandActivityLegacy1.java index a7f651c2b..cf692675f 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/command/CommandActivityLegacy1.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/command/CommandActivityLegacy1.java @@ -62,8 +62,7 @@ public class CommandActivityLegacy1 extends SingleLineCommand2 @Override protected CommandExecutionResult executeArg(ActivityDiagram3 diagram, LineLocation location, RegexResult arg) { - diagram.addActivity(Display.getWithNewlines(arg.get("LABEL", 0)), BoxStyle.PLAIN, null, Colors.empty(), null); - return CommandExecutionResult.ok(); + return diagram.addActivity(Display.getWithNewlines(arg.get("LABEL", 0)), BoxStyle.PLAIN, null, Colors.empty(), null); } } diff --git a/src/net/sourceforge/plantuml/activitydiagram3/command/CommandActivityLong3.java b/src/net/sourceforge/plantuml/activitydiagram3/command/CommandActivityLong3.java index c5223ad8a..7fd7735fd 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/command/CommandActivityLong3.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/command/CommandActivityLong3.java @@ -84,7 +84,6 @@ public class CommandActivityLong3 extends CommandMultilines2 { // 0)); final BoxStyle style = BoxStyle.fromChar(lines.getLastChar()); lines = lines.removeStartingAndEnding(line0.get("DATA", 0), 1); - diagram.addActivity(lines.toDisplay(), style, null, colors, null); - return CommandExecutionResult.ok(); + return diagram.addActivity(lines.toDisplay(), style, null, colors, null); } } diff --git a/src/net/sourceforge/plantuml/activitydiagram3/ftile/vertical/FtileBox.java b/src/net/sourceforge/plantuml/activitydiagram3/ftile/vertical/FtileBox.java index 0f154a59a..a3e919c4f 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/ftile/vertical/FtileBox.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/ftile/vertical/FtileBox.java @@ -69,6 +69,7 @@ import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.TextBlock; import net.sourceforge.plantuml.graphic.UDrawable; import net.sourceforge.plantuml.graphic.color.Colors; +import net.sourceforge.plantuml.style.ClockwiseTopRightBottomLeft; import net.sourceforge.plantuml.style.PName; import net.sourceforge.plantuml.style.SName; import net.sourceforge.plantuml.style.Style; @@ -82,10 +83,9 @@ import net.sourceforge.plantuml.ugraphic.color.HColorNone; public class FtileBox extends AbstractFtile { - private double padding1 = 10; - private double padding2 = 10; - private double paddingTop = 10; - private double paddingBottom = 10; + private final ClockwiseTopRightBottomLeft padding; + private final ClockwiseTopRightBottomLeft margin; + private final TextBlock tb; private double roundCorner = 25; private final double shadowing; @@ -130,12 +130,12 @@ public class FtileBox extends AbstractFtile { class MyStencil implements Stencil { public double getStartingX(StringBounder stringBounder, double y) { - return -padding1; + return -padding.getLeft(); } public double getEndingX(StringBounder stringBounder, double y) { final Dimension2D dim = calculateDimension(stringBounder); - return dim.getWidth() - padding2; + return dim.getWidth() - padding.getRight(); } } @@ -152,31 +152,31 @@ public class FtileBox extends AbstractFtile { return new FtileBox(skinParam, label, swimlane, boxStyle, style, styleArrow); } - public static FtileBox createWbs(StyleBuilder styleBuilder, ISkinParam skinParam, Display label, - StyleSignature styleDefinition) { - Style style = null; - Style styleArrow = null; - if (UseStyle.useBetaStyle()) { - style = styleDefinition.getMergedStyle(styleBuilder); - styleArrow = style; - } - return new FtileBox(skinParam, label, null, BoxStyle.PLAIN, style, styleArrow); - } - - public static FtileBox createWbs(Style style, ISkinParam skinParam, Display label) { - Style styleArrow = null; - if (UseStyle.useBetaStyle()) { - styleArrow = style; - } - return new FtileBox(skinParam, label, null, BoxStyle.PLAIN, style, styleArrow); - } - - public static FtileBox createMindMap(StyleBuilder styleBuilder, ISkinParam skinParam, Display label, - StyleSignature styleDefinition) { - final Style style = styleDefinition.getMergedStyle(styleBuilder); - final Style styleArrow = style; - return new FtileBox(skinParam, label, null, BoxStyle.PLAIN, style, styleArrow); - } +// public static TextBlock createWbs(StyleBuilder styleBuilder, ISkinParam skinParam, Display label, +// StyleSignature styleDefinition) { +// Style style = null; +// Style styleArrow = null; +// if (UseStyle.useBetaStyle()) { +// style = styleDefinition.getMergedStyle(styleBuilder); +// styleArrow = style; +// } +// return new FtileBox(skinParam, label, null, BoxStyle.PLAIN, style, styleArrow); +// } +// +// public static TextBlock createWbs(Style style, ISkinParam skinParam, Display label) { +// Style styleArrow = null; +// if (UseStyle.useBetaStyle()) { +// styleArrow = style; +// } +// return new FtileBox(skinParam, label, null, BoxStyle.PLAIN, style, styleArrow); +// } +// +// public static TextBlock createMindMap(StyleBuilder styleBuilder, ISkinParam skinParam, Display label, +// StyleSignature styleDefinition) { +// final Style style = styleDefinition.getMergedStyle(styleBuilder); +// final Style styleArrow = style; +// return new FtileBox(skinParam, label, null, BoxStyle.PLAIN, style, styleArrow); +// } private FtileBox(ISkinParam skinParam, Display label, Swimlane swimlane, BoxStyle boxStyle, Style style, Style styleArrow) { @@ -197,21 +197,21 @@ public class FtileBox extends AbstractFtile { this.borderColor = style.value(PName.LineColor).asColor(skinParam.getThemeStyle(), getIHtmlColorSet()); this.backColor = style.value(PName.BackGroundColor).asColor(skinParam.getThemeStyle(), getIHtmlColorSet()); fc = style.getFontConfiguration(skinParam.getThemeStyle(), getIHtmlColorSet()); - horizontalAlignment = style.getHorizontalAlignment(); - this.padding1 = style.getPadding().getLeft(); - this.padding2 = style.getPadding().getRight(); - this.paddingTop = style.getPadding().getTop(); - this.paddingBottom = style.getPadding().getBottom(); + this.horizontalAlignment = style.getHorizontalAlignment(); + this.padding = style.getPadding(); + this.margin = style.getMargin(); this.roundCorner = style.value(PName.RoundCorner).asDouble(); this.shadowing = style.value(PName.Shadowing).asDouble(); wrapWidth = style.wrapWidth(); this.minimumWidth = style.value(PName.MinimumWidth).asDouble(); } else { + this.padding = ClockwiseTopRightBottomLeft.same(10); + this.margin = ClockwiseTopRightBottomLeft.same(0); this.inRendering = new LinkRendering(Rainbow.build(skinParam)); this.borderColor = SkinParamUtils.getColor(skinParam(), null, ColorParam.activityBorder); this.backColor = SkinParamUtils.getColor(skinParam(), null, ColorParam.activityBackground); fc = new FontConfiguration(skinParam, FontParam.ACTIVITY, null); - horizontalAlignment = HorizontalAlignment.LEFT; + this.horizontalAlignment = HorizontalAlignment.LEFT; this.shadowing = skinParam().shadowing(null) ? 3.0 : 0.0; wrapWidth = skinParam.wrapWidth(); @@ -260,23 +260,25 @@ public class FtileBox extends AbstractFtile { shape.drawU(ug); if (horizontalAlignment == HorizontalAlignment.LEFT) { - tb.drawU(ug.apply(new UTranslate(padding1, paddingTop))); + tb.drawU(ug.apply(new UTranslate(padding.getLeft(), padding.getTop()))); } else if (horizontalAlignment == HorizontalAlignment.RIGHT) { final Dimension2D dimTb = tb.calculateDimension(ug.getStringBounder()); - tb.drawU(ug.apply(new UTranslate(dimTotal.getWidth() - dimTb.getWidth() - padding2, paddingBottom))); + tb.drawU(ug.apply( + new UTranslate(dimTotal.getWidth() - dimTb.getWidth() - padding.getRight(), padding.getBottom()))); } else if (horizontalAlignment == HorizontalAlignment.CENTER) { final Dimension2D dimTb = tb.calculateDimension(ug.getStringBounder()); - tb.drawU(ug.apply(new UTranslate((dimTotal.getWidth() - dimTb.getWidth()) / 2, paddingBottom))); + tb.drawU(ug.apply(new UTranslate((dimTotal.getWidth() - dimTb.getWidth()) / 2, padding.getBottom()))); } } @Override protected FtileGeometry calculateDimensionFtile(StringBounder stringBounder) { - Dimension2D dim = tb.calculateDimension(stringBounder); - dim = Dimension2DDouble.delta(dim, padding1 + padding2, paddingBottom + paddingTop); - dim = Dimension2DDouble.atLeast(dim, minimumWidth, 0); - return new FtileGeometry(dim.getWidth() + boxStyle.getShield(), dim.getHeight(), dim.getWidth() / 2, 0, - dim.getHeight()); + Dimension2D dimRaw = tb.calculateDimension(stringBounder); + dimRaw = Dimension2DDouble.delta(dimRaw, padding.getLeft() + padding.getRight(), + padding.getBottom() + padding.getTop()); + dimRaw = Dimension2DDouble.atLeast(dimRaw, minimumWidth, 0); + return new FtileGeometry(dimRaw.getWidth() + boxStyle.getShield(), dimRaw.getHeight(), dimRaw.getWidth() / 2, 0, + dimRaw.getHeight()); } public Collection getMyChildren() { diff --git a/src/net/sourceforge/plantuml/activitydiagram3/ftile/vertical/FtileBox2.java b/src/net/sourceforge/plantuml/activitydiagram3/ftile/vertical/FtileBox2.java new file mode 100644 index 000000000..a4172342f --- /dev/null +++ b/src/net/sourceforge/plantuml/activitydiagram3/ftile/vertical/FtileBox2.java @@ -0,0 +1,273 @@ +/* ======================================================================== + * 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.activitydiagram3.ftile.vertical; + +import java.awt.geom.Dimension2D; +import java.util.Collection; +import java.util.Collections; +import java.util.Set; + +import net.sourceforge.plantuml.ColorParam; +import net.sourceforge.plantuml.Dimension2DDouble; +import net.sourceforge.plantuml.FontParam; +import net.sourceforge.plantuml.ISkinParam; +import net.sourceforge.plantuml.LineBreakStrategy; +import net.sourceforge.plantuml.SkinParamColors; +import net.sourceforge.plantuml.SkinParamUtils; +import net.sourceforge.plantuml.UseStyle; +import net.sourceforge.plantuml.activitydiagram3.LinkRendering; +import net.sourceforge.plantuml.activitydiagram3.ftile.AbstractFtile; +import net.sourceforge.plantuml.activitydiagram3.ftile.BoxStyle; +import net.sourceforge.plantuml.activitydiagram3.ftile.Ftile; +import net.sourceforge.plantuml.activitydiagram3.ftile.FtileGeometry; +import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane; +import net.sourceforge.plantuml.creole.CreoleMode; +import net.sourceforge.plantuml.creole.Parser; +import net.sourceforge.plantuml.creole.Sheet; +import net.sourceforge.plantuml.creole.SheetBlock1; +import net.sourceforge.plantuml.creole.SheetBlock2; +import net.sourceforge.plantuml.creole.Stencil; +import net.sourceforge.plantuml.cucadiagram.Display; +import net.sourceforge.plantuml.cucadiagram.Stereotype; +import net.sourceforge.plantuml.graphic.FontConfiguration; +import net.sourceforge.plantuml.graphic.HorizontalAlignment; +import net.sourceforge.plantuml.graphic.Rainbow; +import net.sourceforge.plantuml.graphic.StringBounder; +import net.sourceforge.plantuml.graphic.TextBlock; +import net.sourceforge.plantuml.graphic.UDrawable; +import net.sourceforge.plantuml.graphic.color.Colors; +import net.sourceforge.plantuml.style.ClockwiseTopRightBottomLeft; +import net.sourceforge.plantuml.style.PName; +import net.sourceforge.plantuml.style.SName; +import net.sourceforge.plantuml.style.Style; +import net.sourceforge.plantuml.style.StyleBuilder; +import net.sourceforge.plantuml.style.StyleSignature; +import net.sourceforge.plantuml.ugraphic.UEmpty; +import net.sourceforge.plantuml.ugraphic.UGraphic; +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.HColorNone; + +public class FtileBox2 extends AbstractFtile { + + private final ClockwiseTopRightBottomLeft padding; + private final ClockwiseTopRightBottomLeft margin; + + private final TextBlock tb; + private double roundCorner = 25; + private final double shadowing; + private final HorizontalAlignment horizontalAlignment; + private double minimumWidth = 0; + + private final LinkRendering inRendering; + private final Swimlane swimlane; + private final BoxStyle boxStyle; + + private final HColor borderColor; + private final HColor backColor; + private final Style style; + + static public StyleSignature getDefaultStyleDefinitionActivity() { + return StyleSignature.of(SName.root, SName.element, SName.activityDiagram, SName.activity); + } + + static public StyleSignature getDefaultStyleDefinitionArrow() { + return StyleSignature.of(SName.root, SName.element, SName.activityDiagram, SName.arrow); + } + + final public LinkRendering getInLinkRendering() { + return inRendering; + } + + public Set getSwimlanes() { + if (swimlane == null) { + return Collections.emptySet(); + } + return Collections.singleton(swimlane); + } + + public Swimlane getSwimlaneIn() { + return swimlane; + } + + public Swimlane getSwimlaneOut() { + return swimlane; + } + + class MyStencil implements Stencil { + + public double getStartingX(StringBounder stringBounder, double y) { + return -padding.getLeft(); + } + + public double getEndingX(StringBounder stringBounder, double y) { + final Dimension2D dim = calculateDimension(stringBounder); + return dim.getWidth() - padding.getRight(); + } + + } + + public static FtileBox2 create(ISkinParam skinParam, Display label, Swimlane swimlane, BoxStyle boxStyle, + Stereotype stereotype) { + Style style = null; + Style styleArrow = null; + if (UseStyle.useBetaStyle()) { + style = getDefaultStyleDefinitionActivity().with(stereotype) + .getMergedStyle(skinParam.getCurrentStyleBuilder()); + styleArrow = getDefaultStyleDefinitionArrow().getMergedStyle(skinParam.getCurrentStyleBuilder()); + } + return new FtileBox2(skinParam, label, swimlane, boxStyle, style, styleArrow); + } + + private FtileBox2(ISkinParam skinParam, Display label, Swimlane swimlane, BoxStyle boxStyle, Style style, + Style styleArrow) { + super(skinParam); + this.style = style; + this.boxStyle = boxStyle; + this.swimlane = swimlane; + final FontConfiguration fc; + final LineBreakStrategy wrapWidth; + if (UseStyle.useBetaStyle()) { + this.inRendering = new LinkRendering( + Rainbow.build(styleArrow, getIHtmlColorSet(), skinParam.getThemeStyle())); + Colors specBack = null; + if (skinParam instanceof SkinParamColors) { + specBack = ((SkinParamColors) skinParam).getColors(); + } + style = style.eventuallyOverride(specBack); + this.borderColor = style.value(PName.LineColor).asColor(skinParam.getThemeStyle(), getIHtmlColorSet()); + this.backColor = style.value(PName.BackGroundColor).asColor(skinParam.getThemeStyle(), getIHtmlColorSet()); + fc = style.getFontConfiguration(skinParam.getThemeStyle(), getIHtmlColorSet()); + this.horizontalAlignment = style.getHorizontalAlignment(); + this.padding = style.getPadding(); + this.margin = style.getMargin(); + this.roundCorner = style.value(PName.RoundCorner).asDouble(); + this.shadowing = style.value(PName.Shadowing).asDouble(); + wrapWidth = style.wrapWidth(); + this.minimumWidth = style.value(PName.MinimumWidth).asDouble(); + } else { + this.padding = ClockwiseTopRightBottomLeft.same(10); + this.margin = ClockwiseTopRightBottomLeft.same(0); + this.inRendering = new LinkRendering(Rainbow.build(skinParam)); + this.borderColor = SkinParamUtils.getColor(skinParam(), null, ColorParam.activityBorder); + this.backColor = SkinParamUtils.getColor(skinParam(), null, ColorParam.activityBackground); + fc = new FontConfiguration(skinParam, FontParam.ACTIVITY, null); + this.horizontalAlignment = HorizontalAlignment.LEFT; + this.shadowing = skinParam().shadowing(null) ? 3.0 : 0.0; + wrapWidth = skinParam.wrapWidth(); + + } + final Sheet sheet = Parser + .build(fc, skinParam.getDefaultTextAlignment(horizontalAlignment), skinParam, CreoleMode.FULL) + .createSheet(label); + this.tb = new SheetBlock2(new SheetBlock1(sheet, wrapWidth, skinParam.getPadding()), new MyStencil(), + new UStroke(1)); + this.print = label.toString(); + + } + + final private String print; + + @Override + public String toString() { + return print; + } + + public void drawU(UGraphic ug) { + final Dimension2D dimRaw = getDimRaw(ug.getStringBounder()); + final double widthTotal = dimRaw.getWidth(); + final double heightTotal = dimRaw.getHeight(); + final UDrawable shape = boxStyle.getUDrawable(widthTotal, heightTotal, shadowing, roundCorner); + + final Dimension2D dimTotal = calculateDimension(ug.getStringBounder()); + ug.draw(new UEmpty(dimTotal)); + + final UStroke thickness; + if (UseStyle.useBetaStyle()) { + thickness = style.getStroke(); + } else { + thickness = getThickness(); + } + + if (borderColor == null) { + ug = ug.apply(new HColorNone()); + } else { + ug = ug.apply(borderColor); + } + if (backColor == null) { + ug = ug.apply(new HColorNone().bg()); + } else { + ug = ug.apply(backColor.bg()); + } + + ug = ug.apply(thickness); + ug = ug.apply(new UTranslate(margin.getLeft(), margin.getTop())); + shape.drawU(ug); + + if (horizontalAlignment == HorizontalAlignment.LEFT) { + tb.drawU(ug.apply(new UTranslate(padding.getLeft(), padding.getTop()))); + } else if (horizontalAlignment == HorizontalAlignment.RIGHT) { + final Dimension2D dimTb = tb.calculateDimension(ug.getStringBounder()); + tb.drawU(ug.apply( + new UTranslate(dimRaw.getWidth() - dimTb.getWidth() - padding.getRight(), padding.getBottom()))); + } else if (horizontalAlignment == HorizontalAlignment.CENTER) { + final Dimension2D dimTb = tb.calculateDimension(ug.getStringBounder()); + tb.drawU(ug.apply(new UTranslate((dimRaw.getWidth() - dimTb.getWidth()) / 2, padding.getBottom()))); + } + } + + @Override + protected FtileGeometry calculateDimensionFtile(StringBounder stringBounder) { + Dimension2D dimRaw = getDimRaw(stringBounder); + return new FtileGeometry(dimRaw.getWidth() + margin.getLeft() + margin.getRight(), + dimRaw.getHeight() + margin.getTop() + margin.getBottom(), margin.getLeft() + dimRaw.getWidth() / 2, + margin.getTop(), margin.getTop() + dimRaw.getHeight()); + } + + private Dimension2D getDimRaw(StringBounder stringBounder) { + Dimension2D dimRaw = tb.calculateDimension(stringBounder); + dimRaw = Dimension2DDouble.delta(dimRaw, padding.getLeft() + padding.getRight() + boxStyle.getShield(), + padding.getBottom() + padding.getTop()); + dimRaw = Dimension2DDouble.atLeast(dimRaw, minimumWidth, 0); + return dimRaw; + } + + public Collection getMyChildren() { + return Collections.emptyList(); + } + +} diff --git a/src/net/sourceforge/plantuml/activitydiagram3/ftile/vertical/FtileBoxOld.java b/src/net/sourceforge/plantuml/activitydiagram3/ftile/vertical/FtileBoxOld.java new file mode 100644 index 000000000..fc7d9e43a --- /dev/null +++ b/src/net/sourceforge/plantuml/activitydiagram3/ftile/vertical/FtileBoxOld.java @@ -0,0 +1,285 @@ +/* ======================================================================== + * 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.activitydiagram3.ftile.vertical; + +import java.awt.geom.Dimension2D; +import java.util.Collection; +import java.util.Collections; +import java.util.Set; + +import net.sourceforge.plantuml.ColorParam; +import net.sourceforge.plantuml.Dimension2DDouble; +import net.sourceforge.plantuml.FontParam; +import net.sourceforge.plantuml.ISkinParam; +import net.sourceforge.plantuml.LineBreakStrategy; +import net.sourceforge.plantuml.SkinParamColors; +import net.sourceforge.plantuml.SkinParamUtils; +import net.sourceforge.plantuml.UseStyle; +import net.sourceforge.plantuml.activitydiagram3.LinkRendering; +import net.sourceforge.plantuml.activitydiagram3.ftile.AbstractFtile; +import net.sourceforge.plantuml.activitydiagram3.ftile.BoxStyle; +import net.sourceforge.plantuml.activitydiagram3.ftile.Ftile; +import net.sourceforge.plantuml.activitydiagram3.ftile.FtileGeometry; +import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane; +import net.sourceforge.plantuml.creole.CreoleMode; +import net.sourceforge.plantuml.creole.Parser; +import net.sourceforge.plantuml.creole.Sheet; +import net.sourceforge.plantuml.creole.SheetBlock1; +import net.sourceforge.plantuml.creole.SheetBlock2; +import net.sourceforge.plantuml.creole.Stencil; +import net.sourceforge.plantuml.cucadiagram.Display; +import net.sourceforge.plantuml.cucadiagram.Stereotype; +import net.sourceforge.plantuml.graphic.FontConfiguration; +import net.sourceforge.plantuml.graphic.HorizontalAlignment; +import net.sourceforge.plantuml.graphic.Rainbow; +import net.sourceforge.plantuml.graphic.StringBounder; +import net.sourceforge.plantuml.graphic.TextBlock; +import net.sourceforge.plantuml.graphic.UDrawable; +import net.sourceforge.plantuml.graphic.color.Colors; +import net.sourceforge.plantuml.style.ClockwiseTopRightBottomLeft; +import net.sourceforge.plantuml.style.PName; +import net.sourceforge.plantuml.style.SName; +import net.sourceforge.plantuml.style.Style; +import net.sourceforge.plantuml.style.StyleBuilder; +import net.sourceforge.plantuml.style.StyleSignature; +import net.sourceforge.plantuml.ugraphic.UGraphic; +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.HColorNone; + +public class FtileBoxOld extends AbstractFtile { + + private final ClockwiseTopRightBottomLeft padding; + + private final TextBlock tb; + private double roundCorner = 25; + private final double shadowing; + private final HorizontalAlignment horizontalAlignment; + private double minimumWidth = 0; + + private final LinkRendering inRendering; + private final Swimlane swimlane; + private final BoxStyle boxStyle; + + private final HColor borderColor; + private final HColor backColor; + private final Style style; + + static public StyleSignature getDefaultStyleDefinitionActivity() { + return StyleSignature.of(SName.root, SName.element, SName.activityDiagram, SName.activity); + } + + static public StyleSignature getDefaultStyleDefinitionArrow() { + return StyleSignature.of(SName.root, SName.element, SName.activityDiagram, SName.arrow); + } + + final public LinkRendering getInLinkRendering() { + return inRendering; + } + + public Set getSwimlanes() { + if (swimlane == null) { + return Collections.emptySet(); + } + return Collections.singleton(swimlane); + } + + public Swimlane getSwimlaneIn() { + return swimlane; + } + + public Swimlane getSwimlaneOut() { + return swimlane; + } + + class MyStencil implements Stencil { + + public double getStartingX(StringBounder stringBounder, double y) { + return -padding.getLeft(); + } + + public double getEndingX(StringBounder stringBounder, double y) { + final Dimension2D dim = calculateDimension(stringBounder); + return dim.getWidth() - padding.getRight(); + } + + } + + public static FtileBoxOld create(ISkinParam skinParam, Display label, Swimlane swimlane, BoxStyle boxStyle, + Stereotype stereotype) { + Style style = null; + Style styleArrow = null; + if (UseStyle.useBetaStyle()) { + style = getDefaultStyleDefinitionActivity().with(stereotype) + .getMergedStyle(skinParam.getCurrentStyleBuilder()); + styleArrow = getDefaultStyleDefinitionArrow().getMergedStyle(skinParam.getCurrentStyleBuilder()); + } + return new FtileBoxOld(skinParam, label, swimlane, boxStyle, style, styleArrow); + } + + public static TextBlock createWbs(StyleBuilder styleBuilder, ISkinParam skinParam, Display label, + StyleSignature styleDefinition) { + Style style = null; + Style styleArrow = null; + if (UseStyle.useBetaStyle()) { + style = styleDefinition.getMergedStyle(styleBuilder); + styleArrow = style; + } + return new FtileBoxOld(skinParam, label, null, BoxStyle.PLAIN, style, styleArrow); + } + + public static TextBlock createWbs(Style style, ISkinParam skinParam, Display label) { + Style styleArrow = null; + if (UseStyle.useBetaStyle()) { + styleArrow = style; + } + return new FtileBoxOld(skinParam, label, null, BoxStyle.PLAIN, style, styleArrow); + } + + public static TextBlock createMindMap(StyleBuilder styleBuilder, ISkinParam skinParam, Display label, + StyleSignature styleDefinition) { + final Style style = styleDefinition.getMergedStyle(styleBuilder); + final Style styleArrow = style; + return new FtileBoxOld(skinParam, label, null, BoxStyle.PLAIN, style, styleArrow); + } + + private FtileBoxOld(ISkinParam skinParam, Display label, Swimlane swimlane, BoxStyle boxStyle, Style style, + Style styleArrow) { + super(skinParam); + this.style = style; + this.boxStyle = boxStyle; + this.swimlane = swimlane; + final FontConfiguration fc; + final LineBreakStrategy wrapWidth; + if (UseStyle.useBetaStyle()) { + this.inRendering = new LinkRendering( + Rainbow.build(styleArrow, getIHtmlColorSet(), skinParam.getThemeStyle())); + Colors specBack = null; + if (skinParam instanceof SkinParamColors) { + specBack = ((SkinParamColors) skinParam).getColors(); + } + style = style.eventuallyOverride(specBack); + this.borderColor = style.value(PName.LineColor).asColor(skinParam.getThemeStyle(), getIHtmlColorSet()); + this.backColor = style.value(PName.BackGroundColor).asColor(skinParam.getThemeStyle(), getIHtmlColorSet()); + fc = style.getFontConfiguration(skinParam.getThemeStyle(), getIHtmlColorSet()); + this.horizontalAlignment = style.getHorizontalAlignment(); + this.padding = style.getPadding(); + this.roundCorner = style.value(PName.RoundCorner).asDouble(); + this.shadowing = style.value(PName.Shadowing).asDouble(); + wrapWidth = style.wrapWidth(); + this.minimumWidth = style.value(PName.MinimumWidth).asDouble(); + } else { + this.padding = ClockwiseTopRightBottomLeft.same(10); + this.inRendering = new LinkRendering(Rainbow.build(skinParam)); + this.borderColor = SkinParamUtils.getColor(skinParam(), null, ColorParam.activityBorder); + this.backColor = SkinParamUtils.getColor(skinParam(), null, ColorParam.activityBackground); + fc = new FontConfiguration(skinParam, FontParam.ACTIVITY, null); + this.horizontalAlignment = HorizontalAlignment.LEFT; + this.shadowing = skinParam().shadowing(null) ? 3.0 : 0.0; + wrapWidth = skinParam.wrapWidth(); + + } + final Sheet sheet = Parser + .build(fc, skinParam.getDefaultTextAlignment(horizontalAlignment), skinParam, CreoleMode.FULL) + .createSheet(label); + this.tb = new SheetBlock2(new SheetBlock1(sheet, wrapWidth, skinParam.getPadding()), new MyStencil(), + new UStroke(1)); + this.print = label.toString(); + + } + + final private String print; + + @Override + public String toString() { + return print; + } + + public void drawU(UGraphic ug) { + final Dimension2D dimTotal = calculateDimension(ug.getStringBounder()); + final double widthTotal = dimTotal.getWidth(); + final double heightTotal = dimTotal.getHeight(); + final UDrawable shape = boxStyle.getUDrawable(widthTotal, heightTotal, shadowing, roundCorner); + + final UStroke thickness; + if (UseStyle.useBetaStyle()) { + thickness = style.getStroke(); + } else { + thickness = getThickness(); + } + + if (borderColor == null) { + ug = ug.apply(new HColorNone()); + } else { + ug = ug.apply(borderColor); + } + if (backColor == null) { + ug = ug.apply(new HColorNone().bg()); + } else { + ug = ug.apply(backColor.bg()); + } + + ug = ug.apply(thickness); + shape.drawU(ug); + + if (horizontalAlignment == HorizontalAlignment.LEFT) { + tb.drawU(ug.apply(new UTranslate(padding.getLeft(), padding.getTop()))); + } else if (horizontalAlignment == HorizontalAlignment.RIGHT) { + final Dimension2D dimTb = tb.calculateDimension(ug.getStringBounder()); + tb.drawU(ug.apply( + new UTranslate(dimTotal.getWidth() - dimTb.getWidth() - padding.getRight(), padding.getBottom()))); + } else if (horizontalAlignment == HorizontalAlignment.CENTER) { + final Dimension2D dimTb = tb.calculateDimension(ug.getStringBounder()); + tb.drawU(ug.apply(new UTranslate((dimTotal.getWidth() - dimTb.getWidth()) / 2, padding.getBottom()))); + } + } + + @Override + protected FtileGeometry calculateDimensionFtile(StringBounder stringBounder) { + Dimension2D dimRaw = tb.calculateDimension(stringBounder); + dimRaw = Dimension2DDouble.delta(dimRaw, padding.getLeft() + padding.getRight(), + padding.getBottom() + padding.getTop()); + dimRaw = Dimension2DDouble.atLeast(dimRaw, minimumWidth, 0); + return new FtileGeometry(dimRaw.getWidth() + boxStyle.getShield(), dimRaw.getHeight(), dimRaw.getWidth() / 2, 0, + dimRaw.getHeight()); + } + + public Collection getMyChildren() { + return Collections.emptyList(); + } + +} diff --git a/src/net/sourceforge/plantuml/cucadiagram/MethodsOrFieldsArea.java b/src/net/sourceforge/plantuml/cucadiagram/MethodsOrFieldsArea.java index 13c471788..280c7e902 100644 --- a/src/net/sourceforge/plantuml/cucadiagram/MethodsOrFieldsArea.java +++ b/src/net/sourceforge/plantuml/cucadiagram/MethodsOrFieldsArea.java @@ -40,6 +40,7 @@ import java.awt.geom.Rectangle2D; import java.util.Map; import net.sourceforge.plantuml.Dimension2DDouble; +import net.sourceforge.plantuml.EmbeddedDiagram; import net.sourceforge.plantuml.FontParam; import net.sourceforge.plantuml.ISkinParam; import net.sourceforge.plantuml.Url; @@ -185,9 +186,12 @@ public class MethodsOrFieldsArea extends AbstractTextBlock implements TextBlock, return new TextBlockTracer(m, bloc); } - TextBlock bloc = Display.getWithNewlines(cs.toString()).create8(config, align, skinParam, - CreoleMode.SIMPLE_LINE, skinParam.wrapWidth()); - return bloc; + 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/mindmap/FingerImpl.java b/src/net/sourceforge/plantuml/mindmap/FingerImpl.java index 71d07dac4..0598efd54 100644 --- a/src/net/sourceforge/plantuml/mindmap/FingerImpl.java +++ b/src/net/sourceforge/plantuml/mindmap/FingerImpl.java @@ -43,7 +43,7 @@ import java.util.List; import net.sourceforge.plantuml.Direction; import net.sourceforge.plantuml.ISkinParam; import net.sourceforge.plantuml.SkinParamColors; -import net.sourceforge.plantuml.activitydiagram3.ftile.vertical.FtileBox; +import net.sourceforge.plantuml.activitydiagram3.ftile.vertical.FtileBoxOld; import net.sourceforge.plantuml.creole.CreoleMode; import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.graphic.StringBounder; @@ -237,7 +237,7 @@ public class FingerImpl implements Finger, UDrawable { } if (shape == IdeaShape.BOX) { final ISkinParam foo = new SkinParamColors(skinParam, Colors.empty().add(ColorType.BACK, backColor)); - final FtileBox box = FtileBox.createMindMap(styleBuilder, foo, label, getDefaultStyleDefinitionNode()); + final TextBlock box = FtileBoxOld.createMindMap(styleBuilder, foo, label, getDefaultStyleDefinitionNode()); return TextBlockUtils.withMargin(box, 0, 0, marginTop, marginBottom); } diff --git a/src/net/sourceforge/plantuml/project/core/Task.java b/src/net/sourceforge/plantuml/project/core/Task.java index f541a5887..df4ce3cef 100644 --- a/src/net/sourceforge/plantuml/project/core/Task.java +++ b/src/net/sourceforge/plantuml/project/core/Task.java @@ -55,7 +55,7 @@ public interface Task extends Moment { public void setEnd(Day end); - public void setColors(CenterBorderColor colors); + public void setColors(CenterBorderColor... colors); public void addResource(Resource resource, int percentage); diff --git a/src/net/sourceforge/plantuml/project/core/TaskImpl.java b/src/net/sourceforge/plantuml/project/core/TaskImpl.java index 091d44730..61b54b7b1 100644 --- a/src/net/sourceforge/plantuml/project/core/TaskImpl.java +++ b/src/net/sourceforge/plantuml/project/core/TaskImpl.java @@ -71,7 +71,7 @@ public class TaskImpl extends AbstractTask implements Task, LoadPlanable { private Display note; private Url url; - private CenterBorderColor colors; + private CenterBorderColor[] colors; public void setUrl(Url url) { this.url = url; @@ -211,7 +211,7 @@ public class TaskImpl extends AbstractTask implements Task, LoadPlanable { solver.setData(TaskAttribute.END, end); } - public void setColors(CenterBorderColor colors) { + public void setColors(CenterBorderColor... colors) { this.colors = colors; } @@ -236,7 +236,13 @@ public class TaskImpl extends AbstractTask implements Task, LoadPlanable { } public final CenterBorderColor getColors() { - return colors; + if (colors == null) { + return null; + } + if (colors.length == 1) { + return colors[0]; + } + return colors[0].linearTo(colors[1], completion); } public final int getCompletion() { diff --git a/src/net/sourceforge/plantuml/project/core/TaskSeparator.java b/src/net/sourceforge/plantuml/project/core/TaskSeparator.java index ac99f44e7..aea34e301 100644 --- a/src/net/sourceforge/plantuml/project/core/TaskSeparator.java +++ b/src/net/sourceforge/plantuml/project/core/TaskSeparator.java @@ -68,7 +68,7 @@ public class TaskSeparator extends AbstractTask implements Task { throw new UnsupportedOperationException(); } - public void setColors(CenterBorderColor colors) { + public void setColors(CenterBorderColor... colors) { throw new UnsupportedOperationException(); } diff --git a/src/net/sourceforge/plantuml/project/draw/AbstractTaskDraw.java b/src/net/sourceforge/plantuml/project/draw/AbstractTaskDraw.java index be9b2f7bf..1d67a7138 100644 --- a/src/net/sourceforge/plantuml/project/draw/AbstractTaskDraw.java +++ b/src/net/sourceforge/plantuml/project/draw/AbstractTaskDraw.java @@ -58,7 +58,8 @@ import net.sourceforge.plantuml.ugraphic.color.HColorSet; public abstract class AbstractTaskDraw implements TaskDraw { - protected CenterBorderColor colors; + private CenterBorderColor colors; + protected int completion = 100; protected Url url; protected Display note; @@ -173,4 +174,8 @@ public abstract class AbstractTaskDraw implements TaskDraw { return colorSet; } + protected CenterBorderColor getColors() { + return colors; + } + } diff --git a/src/net/sourceforge/plantuml/project/draw/TaskDrawDiamond.java b/src/net/sourceforge/plantuml/project/draw/TaskDrawDiamond.java index 37ebd0ef1..c83c64501 100644 --- a/src/net/sourceforge/plantuml/project/draw/TaskDrawDiamond.java +++ b/src/net/sourceforge/plantuml/project/draw/TaskDrawDiamond.java @@ -47,6 +47,7 @@ import net.sourceforge.plantuml.project.LabelStrategy; import net.sourceforge.plantuml.project.ToTaskDraw; import net.sourceforge.plantuml.project.core.Task; import net.sourceforge.plantuml.project.core.TaskAttribute; +import net.sourceforge.plantuml.project.lang.CenterBorderColor; import net.sourceforge.plantuml.project.time.Day; import net.sourceforge.plantuml.project.timescale.TimeScale; import net.sourceforge.plantuml.real.Real; @@ -144,8 +145,9 @@ public class TaskDrawDiamond extends AbstractTaskDraw { } private UGraphic applyColors(UGraphic ug) { - if (colors != null && colors.isOk()) { - return colors.apply(ug); + final CenterBorderColor col = this.getColors(); + if (col != null && col.isOk()) { + return col.apply(ug); } return ug.apply(getLineColor()).apply(getBackgroundColor().bg()); } diff --git a/src/net/sourceforge/plantuml/project/draw/TaskDrawRegular.java b/src/net/sourceforge/plantuml/project/draw/TaskDrawRegular.java index 20474b6af..04b19f972 100644 --- a/src/net/sourceforge/plantuml/project/draw/TaskDrawRegular.java +++ b/src/net/sourceforge/plantuml/project/draw/TaskDrawRegular.java @@ -58,6 +58,7 @@ import net.sourceforge.plantuml.project.ToTaskDraw; import net.sourceforge.plantuml.project.core.Task; import net.sourceforge.plantuml.project.core.TaskAttribute; import net.sourceforge.plantuml.project.core.TaskImpl; +import net.sourceforge.plantuml.project.lang.CenterBorderColor; import net.sourceforge.plantuml.project.time.Day; import net.sourceforge.plantuml.project.timescale.TimeScale; import net.sourceforge.plantuml.real.Real; @@ -243,8 +244,9 @@ public class TaskDrawRegular extends AbstractTaskDraw { } private UGraphic applyColors(UGraphic ug) { - if (colors != null && colors.isOk()) { - return colors.apply(ug); + final CenterBorderColor col = this.getColors(); + if (col != null && col.isOk()) { + return col.apply(ug); } return ug.apply(getLineColor()).apply(getBackgroundColor().bg()); } diff --git a/src/net/sourceforge/plantuml/project/lang/CenterBorderColor.java b/src/net/sourceforge/plantuml/project/lang/CenterBorderColor.java index 19ef120df..30dd38424 100644 --- a/src/net/sourceforge/plantuml/project/lang/CenterBorderColor.java +++ b/src/net/sourceforge/plantuml/project/lang/CenterBorderColor.java @@ -37,6 +37,7 @@ package net.sourceforge.plantuml.project.lang; import net.sourceforge.plantuml.ugraphic.UGraphic; import net.sourceforge.plantuml.ugraphic.color.HColor; +import net.sourceforge.plantuml.ugraphic.color.HColorUtils; public class CenterBorderColor { @@ -78,4 +79,18 @@ public class CenterBorderColor { public final String getStyle() { return style; } + + public CenterBorderColor linearTo(CenterBorderColor other, int completion) { + if (completion == 0) { + return this; + } + if (completion == 100) { + return other; + } + + final HColor newCenter = HColorUtils.linear(this.center, other.center, completion); + final HColor newBorder = HColorUtils.linear(this.border, other.border, completion); + + return new CenterBorderColor(newCenter, newBorder, style); + } } diff --git a/src/net/sourceforge/plantuml/project/lang/ComplementInColorsFromTo.java b/src/net/sourceforge/plantuml/project/lang/ComplementInColorsFromTo.java new file mode 100644 index 000000000..4847bcca6 --- /dev/null +++ b/src/net/sourceforge/plantuml/project/lang/ComplementInColorsFromTo.java @@ -0,0 +1,69 @@ +/* ======================================================================== + * 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.project.lang; + +import net.sourceforge.plantuml.command.regex.IRegex; +import net.sourceforge.plantuml.command.regex.RegexLeaf; +import net.sourceforge.plantuml.command.regex.RegexResult; +import net.sourceforge.plantuml.project.Failable; +import net.sourceforge.plantuml.project.GanttDiagram; +import net.sourceforge.plantuml.ugraphic.color.HColor; + +public class ComplementInColorsFromTo implements Something { + + public IRegex toRegex(String suffix) { + return new RegexLeaf("COMPLEMENT" + suffix, + "from[%s]+(#?\\w+)(?:/(#?\\w+))?[%s]+to[%s]+(#?\\w+)(?:/(#?\\w+))?"); + } + + public Failable getMe(GanttDiagram diagram, RegexResult arg, String suffix) { + final String arg0 = arg.get("COMPLEMENT" + suffix, 0); + final String arg1 = arg.get("COMPLEMENT" + suffix, 1); + final String arg2 = arg.get("COMPLEMENT" + suffix, 2); + final String arg3 = arg.get("COMPLEMENT" + suffix, 3); + final HColor from0 = arg0 == null ? null + : diagram.getIHtmlColorSet().getColorOrWhite(diagram.getSkinParam().getThemeStyle(), arg0); + final HColor from1 = arg1 == null ? null + : diagram.getIHtmlColorSet().getColorOrWhite(diagram.getSkinParam().getThemeStyle(), arg1); + final HColor to0 = arg2 == null ? null + : diagram.getIHtmlColorSet().getColorOrWhite(diagram.getSkinParam().getThemeStyle(), arg2); + final HColor to1 = arg3 == null ? null + : diagram.getIHtmlColorSet().getColorOrWhite(diagram.getSkinParam().getThemeStyle(), arg3); + final CenterBorderColor result[] = new CenterBorderColor[] { new CenterBorderColor(from0, from1), + new CenterBorderColor(to0, to1) }; + return Failable.ok(result); + } +} diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceIsColoredForCompletion.java b/src/net/sourceforge/plantuml/project/lang/SentenceIsColoredForCompletion.java new file mode 100644 index 000000000..f902ac85f --- /dev/null +++ b/src/net/sourceforge/plantuml/project/lang/SentenceIsColoredForCompletion.java @@ -0,0 +1,56 @@ +/* ======================================================================== + * 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.project.lang; + +import net.sourceforge.plantuml.command.CommandExecutionResult; +import net.sourceforge.plantuml.project.GanttDiagram; +import net.sourceforge.plantuml.project.core.Task; + +public class SentenceIsColoredForCompletion extends SentenceSimple { + + public SentenceIsColoredForCompletion() { + super(new SubjectTask(), Verbs.isColoredForCompletion(), new ComplementInColorsFromTo()); + } + + @Override + public CommandExecutionResult execute(GanttDiagram project, Object subject, Object complement) { + final Task task = (Task) subject; + final CenterBorderColor[] colors = (CenterBorderColor[]) complement; + task.setColors(colors); + return CommandExecutionResult.ok(); + } + +} diff --git a/src/net/sourceforge/plantuml/project/lang/SubjectTask.java b/src/net/sourceforge/plantuml/project/lang/SubjectTask.java index aa1da4393..ab22cef53 100644 --- a/src/net/sourceforge/plantuml/project/lang/SubjectTask.java +++ b/src/net/sourceforge/plantuml/project/lang/SubjectTask.java @@ -77,9 +77,10 @@ public class SubjectTask implements Subject { public Collection getSentences() { return Arrays.asList(new SentenceLasts(), new SentenceTaskStarts(), new SentenceTaskStartsWithColor(), new SentenceTaskStartsAbsolute(), new SentenceHappens(), new SentenceHappensDate(), new SentenceEnds(), - new SentenceTaskEndsAbsolute(), new SentenceIsColored(), new SentenceIsDeleted(), - new SentenceIsForTask(), new SentenceLinksTo(), new SentenceOccurs(), new SentenceDisplayOnSameRowAs(), - new SentencePausesDate(), new SentencePausesDates(), new SentencePausesDayOfWeek()); + new SentenceTaskEndsAbsolute(), new SentenceIsColored(), new SentenceIsColoredForCompletion(), + new SentenceIsDeleted(), new SentenceIsForTask(), new SentenceLinksTo(), new SentenceOccurs(), + new SentenceDisplayOnSameRowAs(), new SentencePausesDate(), new SentencePausesDates(), + new SentencePausesDayOfWeek()); } public IRegex toRegex() { diff --git a/src/net/sourceforge/plantuml/project/lang/Verbs.java b/src/net/sourceforge/plantuml/project/lang/Verbs.java index 089166963..90d9cf9c6 100644 --- a/src/net/sourceforge/plantuml/project/lang/Verbs.java +++ b/src/net/sourceforge/plantuml/project/lang/Verbs.java @@ -83,6 +83,10 @@ public class Verbs { return new RegexLeaf("is[%s]+colou?red"); } + public static IRegex isColoredForCompletion() { + return new RegexLeaf("is[%s]+colou?red[%s]+for[%s]+completion"); + } + public static IRegex isOff() { return new RegexConcat(new RegexLeaf("is"), // RegexLeaf.spaceOneOrMore(), // diff --git a/src/net/sourceforge/plantuml/sequencediagram/command/CommandExoArrowAny.java b/src/net/sourceforge/plantuml/sequencediagram/command/CommandExoArrowAny.java index ff35b429f..dc637dbab 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/command/CommandExoArrowAny.java +++ b/src/net/sourceforge/plantuml/sequencediagram/command/CommandExoArrowAny.java @@ -60,7 +60,8 @@ import net.sourceforge.plantuml.ugraphic.color.NoSuchColorException; abstract class CommandExoArrowAny extends SingleLineCommand2 { - protected static final String SHORT = "SHORT"; + protected static final String ARROW_SUPPCIRCLE1 = "ARROW_SUPPCIRCLE1"; + protected static final String ARROW_SUPPCIRCLE2 = "ARROW_SUPPCIRCLE2"; public CommandExoArrowAny(IRegex pattern) { super(pattern); @@ -107,34 +108,33 @@ abstract class CommandExoArrowAny extends SingleLineCommand2 { } if (messageExoType == MessageExoType.TO_RIGHT || messageExoType == MessageExoType.TO_LEFT) { - if (containsSymbolExterior(arg, "o")) { + if (containsSymbol(ARROW_SUPPCIRCLE1, arg, "o")) { + config = config.withDecoration1(ArrowDecoration.CIRCLE); + } + if (containsSymbol(ARROW_SUPPCIRCLE1, arg, "x")) { + config = config.withHead1(ArrowHead.CROSSX); + } + if (containsSymbol(ARROW_SUPPCIRCLE2, arg, "o")) { config = config.withDecoration2(ArrowDecoration.CIRCLE); } - if (containsSymbol(arg, "o")) { - config = config.withDecoration1(ArrowDecoration.CIRCLE); + if (containsSymbol(ARROW_SUPPCIRCLE2, arg, "x")) { + config = config.withHead2(ArrowHead.CROSSX); } } else { - if (containsSymbolExterior(arg, "o")) { + if (containsSymbol(ARROW_SUPPCIRCLE2, arg, "o")) { config = config.withDecoration1(ArrowDecoration.CIRCLE); } - if (containsSymbol(arg, "o")) { + if (containsSymbol(ARROW_SUPPCIRCLE2, arg, "x")) { + config = config.withHead1(ArrowHead.CROSSX); + } + if (containsSymbol(ARROW_SUPPCIRCLE1, arg, "o")) { config = config.withDecoration2(ArrowDecoration.CIRCLE); } + if (containsSymbol(ARROW_SUPPCIRCLE1, arg, "x")) { + config = config.withHead2(ArrowHead.CROSSX); + } } - if (containsSymbolExterior(arg, "x") || containsSymbol(arg, "x")) { - config = config.withHead2(ArrowHead.CROSSX); - } - // if (messageExoType.getDirection() == 1) { - // if (containsSymbolExterior(arg2, "x") || containsSymbol(arg2, "x")) { - // config = config.withHead2(ArrowHead.CROSSX); - // } - // } else { - // if (containsSymbolExterior(arg2, "x") || containsSymbol(arg2, "x")) { - // config = config.withHead2(ArrowHead.CROSSX); - // } - // } - final MessageExo msg = new MessageExo(diagram.getSkinParam().getCurrentStyleBuilder(), p, messageExoType, labels, config, diagram.getNextMessageNumber(), isShortArrow(arg)); if (arg.get("URL", 0) != null) { @@ -206,23 +206,15 @@ abstract class CommandExoArrowAny extends SingleLineCommand2 { abstract MessageExoType getMessageExoType(RegexResult arg2); private boolean isShortArrow(RegexResult arg2) { - final String s = arg2.get(SHORT, 0); + final String s = arg2.get(ARROW_SUPPCIRCLE2, 0); if (s != null && s.contains("?")) { return true; } return false; } - private boolean containsSymbolExterior(RegexResult arg2, String symbol) { - final String s = arg2.get(SHORT, 0); - if (s != null && s.contains(symbol)) { - return true; - } - return false; - } - - private boolean containsSymbol(RegexResult arg2, String symbol) { - final String s = arg2.get("ARROW_SUPPCIRCLE", 0); + private boolean containsSymbol(String suppCircle, RegexResult arg2, String symbol) { + final String s = arg2.get(suppCircle, 0); if (s != null && s.contains(symbol)) { return true; } diff --git a/src/net/sourceforge/plantuml/sequencediagram/command/CommandExoArrowLeft.java b/src/net/sourceforge/plantuml/sequencediagram/command/CommandExoArrowLeft.java index 73f4191b7..a485deff0 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/command/CommandExoArrowLeft.java +++ b/src/net/sourceforge/plantuml/sequencediagram/command/CommandExoArrowLeft.java @@ -54,7 +54,7 @@ public class CommandExoArrowLeft extends CommandExoArrowAny { return RegexConcat.build(CommandExoArrowLeft.class.getName(), RegexLeaf.start(), // new RegexLeaf("PARALLEL", "(&[%s]*)?"), // new RegexLeaf("ANCHOR", CommandArrow.ANCHOR), // - new RegexLeaf(SHORT, "([?\\[\\]][ox]?)?"), // + new RegexLeaf(ARROW_SUPPCIRCLE2, "([?\\[\\]][ox]?)?"), // new RegexOr( // new RegexConcat( // new RegexLeaf("ARROW_BOTHDRESSING", "(< namedArgument) { + return nbArg == 1; + } + + public TValue executeReturnFunction(TContext context, TMemory memory, LineLocation location, List values, + Map named) throws EaterException, EaterExceptionLocated { + try { + return TValue.fromString("" + Integer.toHexString(values.get(0).toInt())); + } catch (Throwable t) { + return TValue.fromString(""); + } + } +} diff --git a/src/net/sourceforge/plantuml/tim/stdlib/Hex2dec.java b/src/net/sourceforge/plantuml/tim/stdlib/Hex2dec.java new file mode 100644 index 000000000..30008049d --- /dev/null +++ b/src/net/sourceforge/plantuml/tim/stdlib/Hex2dec.java @@ -0,0 +1,67 @@ +/* ======================================================================== + * 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.tim.stdlib; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +import net.sourceforge.plantuml.LineLocation; +import net.sourceforge.plantuml.tim.EaterException; +import net.sourceforge.plantuml.tim.EaterExceptionLocated; +import net.sourceforge.plantuml.tim.TContext; +import net.sourceforge.plantuml.tim.TFunctionSignature; +import net.sourceforge.plantuml.tim.TMemory; +import net.sourceforge.plantuml.tim.expression.TValue; + +public class Hex2dec extends SimpleReturnFunction { + + public TFunctionSignature getSignature() { + return new TFunctionSignature("%hex2dec", 1); + } + + public boolean canCover(int nbArg, Set namedArgument) { + return nbArg == 1; + } + + public TValue executeReturnFunction(TContext context, TMemory memory, LineLocation location, List values, + Map named) throws EaterException, EaterExceptionLocated { + try { + return TValue.fromInt(Integer.parseInt(values.get(0).toString(), 16)); + } catch (Throwable t) { + return TValue.fromInt(0); + } + } +} diff --git a/src/net/sourceforge/plantuml/tim/stdlib/HslColor.java b/src/net/sourceforge/plantuml/tim/stdlib/HslColor.java new file mode 100644 index 000000000..f1aec7fb5 --- /dev/null +++ b/src/net/sourceforge/plantuml/tim/stdlib/HslColor.java @@ -0,0 +1,78 @@ +/* ======================================================================== + * 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.tim.stdlib; + +import java.awt.Color; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import net.sourceforge.plantuml.LineLocation; +import net.sourceforge.plantuml.tim.EaterException; +import net.sourceforge.plantuml.tim.EaterExceptionLocated; +import net.sourceforge.plantuml.tim.TContext; +import net.sourceforge.plantuml.tim.TFunctionSignature; +import net.sourceforge.plantuml.tim.TMemory; +import net.sourceforge.plantuml.tim.expression.TValue; +import net.sourceforge.plantuml.ugraphic.color.HColorSimple; +import net.sourceforge.plantuml.ugraphic.color.HSLColor; + +public class HslColor extends SimpleReturnFunction { + + public TFunctionSignature getSignature() { + return new TFunctionSignature("%hsl_color", 3); + } + + public boolean canCover(int nbArg, Set namedArgument) { + return nbArg == 3 || nbArg == 4; + } + + public TValue executeReturnFunction(TContext context, TMemory memory, LineLocation location, List values, + Map named) throws EaterException, EaterExceptionLocated { + final int h = values.get(0).toInt(); + final int s = values.get(1).toInt(); + final int l = values.get(2).toInt(); + if (values.size() == 3) { + final HSLColor color = new HSLColor(h, s, l); + final Color rgb = color.getRGB(); + return TValue.fromString(new HColorSimple(rgb, false).asString()); + } + final int a = values.get(3).toInt(); + final HSLColor color = new HSLColor(h, s, l, (float) (a / 100.0)); + final Color rgb = color.getRGB(); + return TValue.fromString(new HColorSimple(rgb, false).asString()); + + } +} diff --git a/src/net/sourceforge/plantuml/tim/stdlib/Lower.java b/src/net/sourceforge/plantuml/tim/stdlib/Lower.java index 901228fb8..bd795f8fe 100644 --- a/src/net/sourceforge/plantuml/tim/stdlib/Lower.java +++ b/src/net/sourceforge/plantuml/tim/stdlib/Lower.java @@ -47,7 +47,7 @@ import net.sourceforge.plantuml.tim.expression.TValue; public class Lower extends SimpleReturnFunction { public TFunctionSignature getSignature() { - return new TFunctionSignature("%lower", 3); + return new TFunctionSignature("%lower", 1); } public boolean canCover(int nbArg, Set namedArgument) { diff --git a/src/net/sourceforge/plantuml/tim/stdlib/ReverseColor.java b/src/net/sourceforge/plantuml/tim/stdlib/ReverseColor.java index 6df295c1c..c7c64bcef 100644 --- a/src/net/sourceforge/plantuml/tim/stdlib/ReverseColor.java +++ b/src/net/sourceforge/plantuml/tim/stdlib/ReverseColor.java @@ -52,7 +52,7 @@ import net.sourceforge.plantuml.ugraphic.color.NoSuchColorException; public class ReverseColor extends SimpleReturnFunction { public TFunctionSignature getSignature() { - return new TFunctionSignature("%reverse_color", 2); + return new TFunctionSignature("%reverse_color", 1); } public boolean canCover(int nbArg, Set namedArgument) { diff --git a/src/net/sourceforge/plantuml/tim/stdlib/ReverseHsluvColor.java b/src/net/sourceforge/plantuml/tim/stdlib/ReverseHsluvColor.java index ee35c8037..79d9f40e3 100644 --- a/src/net/sourceforge/plantuml/tim/stdlib/ReverseHsluvColor.java +++ b/src/net/sourceforge/plantuml/tim/stdlib/ReverseHsluvColor.java @@ -52,7 +52,7 @@ import net.sourceforge.plantuml.ugraphic.color.NoSuchColorException; public class ReverseHsluvColor extends SimpleReturnFunction { public TFunctionSignature getSignature() { - return new TFunctionSignature("%reverse_hsluv_color", 2); + return new TFunctionSignature("%reverse_hsluv_color", 1); } public boolean canCover(int nbArg, Set namedArgument) { diff --git a/src/net/sourceforge/plantuml/tim/stdlib/StringFunction.java b/src/net/sourceforge/plantuml/tim/stdlib/StringFunction.java index 2db00cea3..b7ad336ff 100644 --- a/src/net/sourceforge/plantuml/tim/stdlib/StringFunction.java +++ b/src/net/sourceforge/plantuml/tim/stdlib/StringFunction.java @@ -47,7 +47,7 @@ import net.sourceforge.plantuml.tim.expression.TValue; public class StringFunction extends SimpleReturnFunction { public TFunctionSignature getSignature() { - return new TFunctionSignature("%string", 3); + return new TFunctionSignature("%string", 1); } public boolean canCover(int nbArg, Set namedArgument) { diff --git a/src/net/sourceforge/plantuml/tim/stdlib/Upper.java b/src/net/sourceforge/plantuml/tim/stdlib/Upper.java index 62b4d225a..8e1ea2c69 100644 --- a/src/net/sourceforge/plantuml/tim/stdlib/Upper.java +++ b/src/net/sourceforge/plantuml/tim/stdlib/Upper.java @@ -47,7 +47,7 @@ import net.sourceforge.plantuml.tim.expression.TValue; public class Upper extends SimpleReturnFunction { public TFunctionSignature getSignature() { - return new TFunctionSignature("%upper", 3); + return new TFunctionSignature("%upper", 1); } public boolean canCover(int nbArg, Set namedArgument) { diff --git a/src/net/sourceforge/plantuml/ugraphic/ImageBuilder.java b/src/net/sourceforge/plantuml/ugraphic/ImageBuilder.java index 68a774a12..301a52dad 100644 --- a/src/net/sourceforge/plantuml/ugraphic/ImageBuilder.java +++ b/src/net/sourceforge/plantuml/ugraphic/ImageBuilder.java @@ -64,6 +64,7 @@ import net.sourceforge.plantuml.FileFormatOption; import net.sourceforge.plantuml.FileUtils; import net.sourceforge.plantuml.ISkinParam; import net.sourceforge.plantuml.LineParam; +import net.sourceforge.plantuml.OptionFlags; import net.sourceforge.plantuml.Scale; import net.sourceforge.plantuml.SvgCharSizeHack; import net.sourceforge.plantuml.TitledDiagram; @@ -95,6 +96,7 @@ import net.sourceforge.plantuml.ugraphic.color.ColorMapperIdentity; import net.sourceforge.plantuml.ugraphic.color.HColor; import net.sourceforge.plantuml.ugraphic.color.HColorBackground; import net.sourceforge.plantuml.ugraphic.color.HColorGradient; +import net.sourceforge.plantuml.ugraphic.color.HColorNone; import net.sourceforge.plantuml.ugraphic.color.HColorSimple; import net.sourceforge.plantuml.ugraphic.color.HColorUtils; import net.sourceforge.plantuml.ugraphic.debug.UGraphicDebug; @@ -111,7 +113,7 @@ public class ImageBuilder { private Animation animation; private boolean annotations; - private HColor backcolor = HColorUtils.WHITE; + private HColor backcolor = getDefaultHBackColor(); private ColorMapper colorMapper = new ColorMapperIdentity(); private Dimension2D dimension; private final FileFormatOption fileFormatOption; @@ -453,13 +455,19 @@ public class ImageBuilder { private UGraphic2 createUGraphicPNG(double scaleFactor, final Dimension2D dim, Animation affineTransforms, double dx, double dy, String watermark) { - Color backColor = Color.WHITE; // TODO simplify backcolor some more in a future PR + Color backColor = getDefaultBackColor(); + if (this.backcolor instanceof HColorSimple) { backColor = colorMapper.toColor(this.backcolor); - } else if (this.backcolor instanceof HColorBackground) { + } else if (this.backcolor instanceof HColorBackground || this.backcolor instanceof HColorNone) { backColor = null; } + if (OptionFlags.getInstance().isReplaceWhiteBackgroundByTransparent() && backColor != null + && backColor.equals(Color.WHITE)) { + backColor = new Color(0, 0, 0, 0); + } + final EmptyImageBuilder builder = new EmptyImageBuilder(watermark, (int) (dim.getWidth() * scaleFactor), (int) (dim.getHeight() * scaleFactor), backColor); final Graphics2D graphics2D = builder.getGraphics2D(); @@ -476,6 +484,14 @@ public class ImageBuilder { return ug; } + static private Color getDefaultBackColor() { + return Color.WHITE; + } + + static private HColor getDefaultHBackColor() { + return HColorUtils.WHITE; + } + private String getHoverPathColorRGB() { if (fileFormatOption.getHoverColor() != null) { return fileFormatOption.getHoverColor(); diff --git a/src/net/sourceforge/plantuml/ugraphic/color/HColorSimple.java b/src/net/sourceforge/plantuml/ugraphic/color/HColorSimple.java index 2b6fbe64e..aed07125b 100644 --- a/src/net/sourceforge/plantuml/ugraphic/color/HColorSimple.java +++ b/src/net/sourceforge/plantuml/ugraphic/color/HColorSimple.java @@ -65,7 +65,7 @@ public class HColorSimple extends HColorAbstract implements HColor { if (color.getAlpha() == 255) { return DotStringFactory.sharp000000(color.getRGB()); } - return super.asString(); + return "#" + Integer.toHexString(color.getRGB()); } @Override @@ -142,4 +142,29 @@ public class HColorSimple extends HColorAbstract implements HColor { return monochrome; } + public static HColorSimple linear(HColorSimple color1, HColorSimple color2, int completion) { + final HSLColor col1 = new HSLColor(color1.color); + final HSLColor col2 = new HSLColor(color2.color); + + final float[] hsl1 = col1.getHSL(); + final float[] hsl2 = col2.getHSL(); + + final float[] hsl = linear(completion, hsl1, hsl2); + + final HSLColor col = new HSLColor(hsl); + + return new HColorSimple(col.getRGB(), color1.monochrome); + } + + private static float[] linear(int completion, float[] hsl1, float[] hsl2) { + final float h = linear(completion, hsl1[0], hsl2[0]); + final float s = linear(completion, hsl1[1], hsl2[1]); + final float l = linear(completion, hsl1[2], hsl2[2]); + return new float[] { h, s, l }; + } + + private static float linear(int completion, float x, float y) { + return x + (y - x) * completion / 100; + } + } diff --git a/src/net/sourceforge/plantuml/ugraphic/color/HColorUtils.java b/src/net/sourceforge/plantuml/ugraphic/color/HColorUtils.java index ead06dbec..64593c54e 100644 --- a/src/net/sourceforge/plantuml/ugraphic/color/HColorUtils.java +++ b/src/net/sourceforge/plantuml/ugraphic/color/HColorUtils.java @@ -152,4 +152,11 @@ public class HColorUtils { return false; } + public static HColor linear(HColor color1, HColor color2, int completion) { + if (color1 instanceof HColorSimple && color2 instanceof HColorSimple) { + return HColorSimple.linear((HColorSimple) color1, (HColorSimple) color2, completion); + } + return color1; + } + } diff --git a/src/net/sourceforge/plantuml/utils/words.txt b/src/net/sourceforge/plantuml/utils/words.txt index 2b02b41e2..518cd0748 100644 --- a/src/net/sourceforge/plantuml/utils/words.txt +++ b/src/net/sourceforge/plantuml/utils/words.txt @@ -2114,4 +2114,4 @@ youthful zeal zenith zest -zippy +zippy \ No newline at end of file diff --git a/src/net/sourceforge/plantuml/version/Version.java b/src/net/sourceforge/plantuml/version/Version.java index 9ca8b0f37..f12d84c0d 100644 --- a/src/net/sourceforge/plantuml/version/Version.java +++ b/src/net/sourceforge/plantuml/version/Version.java @@ -44,7 +44,7 @@ public class Version { private static final int MAJOR_SEPARATOR = 1000000; public static int version() { - return 1202108; + return 1202109; } public static int versionPatched() { @@ -93,7 +93,7 @@ public class Version { } public static long compileTime() { - return 1624695659217L; + return 1627208036416L; } public static String compileTimeString() { diff --git a/src/net/sourceforge/plantuml/wbs/ITFLeaf.java b/src/net/sourceforge/plantuml/wbs/ITFLeaf.java index c18859b92..c321f5e32 100644 --- a/src/net/sourceforge/plantuml/wbs/ITFLeaf.java +++ b/src/net/sourceforge/plantuml/wbs/ITFLeaf.java @@ -39,7 +39,7 @@ import java.awt.geom.Dimension2D; import java.awt.geom.Point2D; import net.sourceforge.plantuml.ISkinParam; -import net.sourceforge.plantuml.activitydiagram3.ftile.vertical.FtileBox; +import net.sourceforge.plantuml.activitydiagram3.ftile.vertical.FtileBoxOld; import net.sourceforge.plantuml.creole.CreoleMode; import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.graphic.AbstractTextBlock; @@ -56,7 +56,7 @@ class ITFLeaf extends AbstractTextBlock implements ITF { public ITFLeaf(Style style, ISkinParam skinParam, Display label, IdeaShape shape) { if (shape == IdeaShape.BOX) { - this.box = FtileBox.createWbs(style, skinParam, label); + this.box = FtileBoxOld.createWbs(style, skinParam, label); } else { final TextBlock text = label.create0( style.getFontConfiguration(skinParam.getThemeStyle(), skinParam.getIHtmlColorSet()), diff --git a/src/net/sourceforge/plantuml/wbs/WBSTextBlock.java b/src/net/sourceforge/plantuml/wbs/WBSTextBlock.java index 90515da15..d57d749da 100644 --- a/src/net/sourceforge/plantuml/wbs/WBSTextBlock.java +++ b/src/net/sourceforge/plantuml/wbs/WBSTextBlock.java @@ -40,7 +40,7 @@ import java.awt.geom.Point2D; import net.sourceforge.plantuml.ColorParam; import net.sourceforge.plantuml.ISkinParam; import net.sourceforge.plantuml.UseStyle; -import net.sourceforge.plantuml.activitydiagram3.ftile.vertical.FtileBox; +import net.sourceforge.plantuml.activitydiagram3.ftile.vertical.FtileBoxOld; import net.sourceforge.plantuml.creole.CreoleMode; import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.graphic.AbstractTextBlock; @@ -72,8 +72,7 @@ abstract class WBSTextBlock extends AbstractTextBlock { final ULine line = new ULine(p1, p2); if (UseStyle.useBetaStyle()) { getStyleUsed().applyStrokeAndLineColor(ug.apply(new UTranslate(p1)), skinParam.getIHtmlColorSet(), - skinParam.getThemeStyle()) - .draw(line); + skinParam.getThemeStyle()).draw(line); } else { final HColor color = ColorParam.activityBorder.getDefaultValue(); ug.apply(new UTranslate(p1)).apply(color).draw(line); @@ -96,8 +95,7 @@ abstract class WBSTextBlock extends AbstractTextBlock { final Display label = idea.getLabel(); final Style style = idea.getStyle(); if (idea.getShape() == IdeaShape.BOX) { - final FtileBox box = FtileBox.createWbs(style, idea.withBackColor(skinParam), label); - return box; + return FtileBoxOld.createWbs(style, idea.withBackColor(skinParam), label); } final TextBlock text = label.create0( style.getFontConfiguration(skinParam.getThemeStyle(), skinParam.getIHtmlColorSet()), diff --git a/stdlib/archimate-abx.repx b/stdlib/archimate-abx.repx index c09ca9c6c8f8a2a10d8e59f95189ed85d28a298d..10a075e7c8849df62f1744a5034ab0d164651cd2 100644 GIT binary patch literal 2531 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 literal 2528 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ξtK^oCyICT^GES4ZF@*PAA?(NOMrzh-zE`-5ZH)pp( zw80yPrZg7rtxm&?|2l(Yf_G!p9=RDQcY1s^Ce=SPGrQ`|$&lT-@R48ms$m%|`~|Aj^^#VaLpQ zTO#Rb0;v*jR^S;i%kjZ-T^EFbR{xhLKO9c%MY&voH>6HF1uF&`E;P!t$M67jqh(DV zA_JN64MRc)&?nnf=~4q|m&0N{mw<>jgob_!N_k~QZGecxG0!?%>i*z{s3Kk0z_Pfi zUduVA`#T}+5IEe3|4N?jymN-KNR{`EL8~$0&SMTridM@p#Bj>UZvmz4p`hi^SR)c-g6n!Exdp%R48_oNWhdF2ur^(V2fJPB#aE@|v zS5x%Pr$j@`ah%c7av_zNa|h{1d}uM|*HNE;B@l?DJDGyohF6?c5QDQ5xXi6l-D~qM zVNhSmJyugJ(0!J7ApXbBr!#NV+pr#8lajQJF@gSJ%z0!g7l>|g)CT?LnLCqYd*s+l z9|>-O5(IQ?dJy>XNzWn)=;+jgZHTY77Q0Sge3+SfcBm8)S~@>6?n&!v$t2hUd+qMb ze$4XfrK-W@Ivks-E>-XbPYhx5%4YghQXzU59N&4c%GX1>;nJZ?yzlIA?fpzcxm#cA z$Xqi7^v|G?QHgj#o@K|}X`krTeE=H}Nb?y_Q(FY5-|v`Q5`7aD0F@P z{nb0ucm2JR)2&i(0lXpihR1i3Ro7#v!V6Hj-N|dFm!pW95x&cyseb!ee$J^4r3IR` zWKJy^Jx!h^li#18%z7U4A&+v73&VvIU9%p|sLaBJ#PayIzI9`Ng76M{AvF zzfnig(jCjps&SpTJ9U&MmdEy}$%I!hZBjaj^`Yvd^X@98%cs7@4XCZvL1!@~hOHEw z<9}V~L%y9C0;_*Jt!a-py7}v2G6YiWFZn!aekpk@Hz_y8kQKY&yO_Ka*LoiaAjo6-FqFbzR(|-&@O??p0=yL^ewYw= z@{3b@{EzAic3yaeVnqSzAjYVpkwUy8lTXGD;&ml@rwg=#pA5`*5Gm4|GgiiI#mZTg?eNjZnH4Yvoh?4Q z$;iVl#!=yVDmS(#4gLPn=JXLH zy@{~~V7D-I@Y*xE(^)ue`Hsh3&&VO2L;`0>b^12qz~{FRf8XXJ#;NDew2EzLBMLeC^7u};(pSjN-8$W6*nUW{}mkBBf|Kx@)t7rIIOP#xM-j5BMc z3v?CJ`Y1TB66NVXN#F`vDb}-g&-9S#xjBC?X>hc1&lzAwGH7GHiueZH``|j~!@BTe zTOF6ET~oxDcNWLGT>0C%$B_E*HxhPAlK$Dr;9%+TJ?9$n9U$}dN-Z#I!lXnf60e*1Q|T}^u-`%eM#g||%5@K1L=I0W=!%3g-N zPZ-+Jks)_^dD^ltlRLf;r_R#9hHOr7Ixvebg70o6llYo;oA4L-MXr}jm+nG-i*I5~O_S($ulRWi% zigOuB3JZA_u60nJl#N#8I;GwBdl;{ScMk&I;5!;CF#gg7@JnvuARD|jOy_c4cx&sO z_TDn25ZC|2n(XU|!oZ--P$?pw%|9yudf7$&&_ykFjPIek+0F(mf0_mMvPh4D(Gt36 z&6+%5Y>u8(L9m^M(X@?B2OXN>qCM+Gw&<@|{&y|sp_+|AfxHhn#X=m^`f;{Y)Qvk( zFiWjc6BBj2Guf}l38`NydDH~fq(#TUY3$SzpkyctC^WF6ardeDmNXT^8<3X+bs|Q2?{DTV?+FonT+@!$x(d3Wwv8PL9ZZTccRN% z_A~K+mT{f2m3B`&MN=_oT`4>L#Pe}-ZF(b4KHW9B{cuJws&mjJoG)WDH;Aldzomrd zn=M_l>#Dn72Rfd<$`D`WD{2)($sKm-=dRTK2r^{*URheq~)TDXA zs3_~FoH6R7cd>lm=Lg9>fgS4`Hw(@AtwsumP?E0-^2_eIn`J`MV_wKbuF?#N>s0%K z?*c4H9YYb+MZ)Gb@uk)w#k|!w1N6M^Dn6Kl9c0WX*(JJJUK8J8QcK+6RK&c*oJ%(4 zu4b08bJQ6k98U(*l}N$VI+WM2}7<~u1nDM z6AypWqcMa+^TGvs=ADlj=(SW1Q|YaNB!=cP%C!qDE}R?}<0cR*Eih`-I0q4Q8sarL zmxN6m5mwouwtx0El{Tb-i=l%t6R?>co)b(DYMSp8%I4rmzV4Ml!uQ2~kKxA-9}+$5*a+xLUrK$5 zN^KI*6xeBD3E+??#O44Fy(AXro?6o&Ku(9;KCY&#hgk`ro<2K9)FGZ}*>$+S9RJ~4 zjFgitD}#Ka5h1oU8pki4G#3W$ICSXxJoq0cyHvFv#(0o&hNVAe*Ohf5O%gG;nIJCp zJDLf(zMG@+{ofT+BIax`gtDdHkT>2XxU3jw z8+V||`K(!f8`@Qi%AYAejI1Vh6ZoF5-xMvXFrdD`GfA%bK>Swh#wPtMUK3A)y54ik zO666;)4uJOikq$7sks2k<1^vltZ=1ft;#h>NXpj>3MWif*!cYhi0kXYgB#s;KYDCe zG0gRDuPf2R4hd_iIdHS31;7*%x7)OcWupiC52Bc9cQQ$c>Mrzt`Vr2@V=x(kWr!`k zrJdn{$Ps1WoW)*y@Val?v(+!2ye#N0fZ;h5zx(wm*(5faVs`z{Oh?lFy!y)p^edH1 z-C4y&IC#b$w?JmgJO76E;!%Lr^m%86bof=r12iASQWk;>gvtX3Z+}y-;)j1_C!Gpc zoa7?1_8)LDb+V&ZT`qlD-Hg+w7c^`IyMFbWfLtwC6uw7O<53J=%se?ziMcCKr5voy zq!=&CcC9LL=y?4?@Qy0Dl6@wrqBRV*{I&88YAN`GSd2+$#m)u47Nm8>hP`dr|AKKt z!O*2C;a<)b^SycEfR?7b>4k&Lff?ye^e2$pHTMIPlknz-FL4A=4!hK+XG#^=JBs;iX3zgfXk=zIb<>!ucy9T|v$*$Op@jz_XZf+!1 z%T+#S`f>Gdvymsq*+;K7Ki^0=%BoZ|!oTt#V(>p#)yFbuj^Nhe5H@6Mpe^06W zO;8yUbAM1*X%-4!-}$2h3+Fquj1VU45|!b*)}AI}^hUi!H`d^K(3bfraH6LH|J{Pt z$;^LprwI4gZu{XCLvb+=s!4V=%Mlcgd&*i;-FW^?}weyv9$%A*=3zXVz_NIBL^^cc0 zOI}a$C%+rJ4%<$TO+NtTifxx6x+(GB3+6rGG94Gujqr$!Y^%yS_w!_DIj@3(b_@n? z=s!QNy!}AjckS>!pq+_9O;v^$G1{6^CyTq;Z;d@Y`mR^KF=;=_Fsz(E-mId~rB$yF zRqS7H_577g z(vo_Ap!gA5C&EX*oh>gc&eNR0;N|C~JF|m^#}`WP$mM9A$HcPe|E3ZZd*a_z`XXXp zxY7{G8NSQqnN@>#I_KEer1ojN`4#IIw@Ht$A2w%>ahk}Z+^aLsf&SYQCY4Q;AgxO@ z*DIc*FAJX6;m6$uk&=P-HPT}!%x6f-^K6gYq3ySJY)aR>Zm|y-X|;m-^0KSOcUGsi zAvlj$`GB&&w7}_*)EIWTUiC#8K^g~Mt7d83z|3$j8pJZ*EiN#4*X2I=#ly)AWrk*I zlOG_)DK3g^BQWkg8(z7?hj)_A!ZSOT9Y%K&GWO5|jVRr1V=#2gW%n=laP)Yy%3tpK zzub#)>_KpF66_|Hj-lN0UlYRH>_;}ZXQ`sx#PxrHY}>~BPdK;Ql(am>1#0)GrUcDT zx+0|J7$b0Jy95XQCs_X(+Qxx63XyGc)Oez59(d`GUm5lbRc*f)apIz@{A-Ta%Op&h zvAL_CI)4gVT3)LjQ#4e2} zaQ^!oSA+~y&U~%C9fRE-d*g=@ZY@E1_Us~FkZq>y-(Q7_*I?RaqvQcFcZrmU#GVkPVUFT0{~it`DK|`}geOO=kg^KUN-=8Ioj=n!uq?gTS4up~GuH(3_ ziIDish-TjxT6JYzSCa(5JTg4th$6jHMpsXGlq2F-B$jV!2YD_IT*CDET2fLxzJMim zuHVp?kJ(yromEbYl@(J&yTpr|aXh;p*dj*^SMTrc3WB_5o7E?u!PGSd@t z?iR~DhQmW1#UE6cqsHPo+${}$-|_0i&rbV@5qZBJpHVOix=Xv zDbB9S>Pi;XvSAK8p~2qcRM&Z~w=10Gipo-W4lmVETMN*^%Yu7mRAK z%28#4N@Hyaf>K`RV$GqHjG8w=8O}5D5(LBZ@ZZm2T=TjY&?ucnIZe%R zIA$mA1e*yX%=sR-V&>c9;Fd&ug8qXi+0xz0L<+O5d30e^~;SJOf<5KzH)k# z&v)??bPQ}a(dEug2jU9{ldkyMasNM8;~OyY5?GfT;SK}Xhj_?s+i*GW=K;Xz;g`Bu zwKu^vusL>10MKSRcB+tR3;Vm{Q44q^JGHGln1zy_mIH2jdv=#M(0I-XwrM}WMz*P2 z-3SZp4+bZW$$5cfA2K9_BP-x zf!S1^lhi*@M`|jG&%z{2T9r{;k5jl@?M$bYN+l}Cz}cX2M7^cZGD;6Vr$7SZNw|NF zmEaSSFlk9AIRSIW9JO1qYYtmndnJQY|Lm^=Z;xP2Ppux??pmWvKhKA1V@8@LR^Kh^ zD%#7VUO&4;JExq|#HsDn+<;354L;!y*-xK z*WS}!vlRnlej57phj-2M(!ahw$?9{=5|urrfBe5=X%6PXm*_S|vi9HlSdOJmeu_F) zRCV+Jjv-sWZ7nAvOBtSEqj`8+v` z+W&0C++-0pNIJQB&g)x$kbMA@QAy}q6oRz@d2LLir-LS?Yg;|`TQJ8t(B(la1FNT# zV*4;_cLzYF_ZOAhUqQVtRFGT0b}8kX_X{D#mr!a^CqDw?YTg7Q4iAmhTyn=($n|jx z$2|||M=ySpLO&5SQ(ACzfbi3rUgDSyu>`u`1n&5$5)JFq`&ixk)@6K)!Y+-rawddx zbEw4N6u;~{8@j2Y@=F6ZoDav?t0HsR%`f66g>`~?#wkEXpz!xvU-B_6!sGGy7GOT~ zG1jlChEfSWu_P_S+BI78TNDauqy002sKcV!P;J>L8&Z#$vY)^{>~v(mREeP&kaUTy znd&ho1FfF(CQQ}Yo&k0zZ#8DB(^`$3u{3Ebs4C6d$PgW=t*&Y^gM&W3*_SvvM%!>Y zA0hV>-Sg;f@Y1TE3_RI;iFA1Il4>sArEA1I(u(U2)}NJ`WBJbQZ?jkRupATn<|GbD z&t%8G6VY}xSK4Vz$CC`+NOgf&sv)?(@3PW6@jHTwccs_Te*S4(({;MooKAo%`_Q^Z zOP+VQX#b3)!*a9Fo%WxC#+Bs_5SaF7@J0P2!SVmSIFV<{OFF#R< zj{HaU?HF$;S6j;_ux&1Ec2`fkCs1lRTjN#KEDE?fHLUb%YBmLKJ!BKT>e^NT@@*wI z1FEIn6__*?wGFDKQ5N8|oo)_PS-b6U(Ddo?ePg@R1?pwhdIxdHF~K)8aY$k&JNQmV zUd?lA``9rnAh_pA{T?EBq2N9UA@`vWbX#wo>})r>nLgCh*_|VapJEfF6u~bmAsjVJ zIrt@~aRpau?J=`|yxM@3MN8jmQF)LJGo*!q1LOJ7ZsBwqRL1qa2{?R?Cjva~L=x}! zJgV!QEN4p1krN^v8a#x8OBWNNG_LYGExpGhWZp4Bw=#9_TbDsQU2No>13!dn7+CSk zzO&()Dk`6(6?(G9lwnXkmRVrb9^XR;3hwEo+%q8(EUk)-*I%D@7z9U zPY@^aOz8;$Zt^4NnP#JL-8H?&)-p#U(V^`-A0{nM0 zQulONW{3egz#dIT&4%i->g*hYvaeLD&Kfe#SG`qdGa2VA=&G}@ zr{N8~sTKcatgKMBoHvQOf~C}sGVsev2uICQ4t~jLT)~yvbi(B8Rb>Ww^%u$!Nks$} zBrnfLD0{A?sMrwUX_URpB^zcb)c@sxfaCAoCWH2^8@x2_yJ&f`BZ%1JMvAD9h!-VeVskmG4;MOXc)FJNc@Ix*nN zXpMlL3|k{zwd&_XoN{|^7r%Py+PEBckG}xeq+m~4$--=YjEAY0iEk$Vi={{Jvf7I@ zBq%y5*p<*;<}PI!;oNESaT8#08Cjcw0rUM|L}rTUGWG~`RH>Z_3>+nt`v zvTCcNBey-J>$0jWxZ?w%k}*thR#RlqSBa ztiHBD$hBn|S3Uh1@HU^Hv+r?FIKOL2+8xs+*}nnay3`NL3h#0w%i@QnLyq@A@4ol@ zp>h0VcF^-41I#2qrUe{HofMGiF&^Wp#W)dWy?^lq2%B$H@V&2KlFoK`f#MKIr!djn z_Mz$d91mm<2VlbhlN9hm3KlTaz=syNQ2+HKw64wanY~oQP<-Z$>7-y+MoXgT{1}ha z<>SMQIwH=Pupxu#tYBAK%cAJ~7?0FFzh3WijRlw47zfNGK;{J;DV-FM$uS;dpzRNL zxm$nj_b{Q|#DPc&IH7-&fS3k0F8#5+FM;CJ<5yRA!At^VUciykNdcK2<1yke0>^@E z)5?7nR%wy*9pkBL>bJc^1X z0aH~}m1bGMR5kTx$R}5)AsV0iYx$w6c&nH3n-nayb=m^|_*dDspQwsI3TpOGZRTW9 z|8GwrpITpvPJBSN{%}>vI4@V(?(2GMOl=@HBB$)OuT>Th*6rCg(rMw16Y2lL9h5#$#Ny>bRu* z>e133C{o!mn9T|Hq?IhprpI`gSTTJJe^e67N!2_+x%BX2R5g!ZAx*6ouj+Yxi|_9^ zUo#S2Z+7nBu`-(}2wtSTTiD*1ny+ZKKh8kU& z!RxMSupNWhoM2B{$-?YJ*dFE`0m{Sv8G6doj_MK_iBo6=l@xFzG(td41Rvd=c6gfN z9DK%Kb^{v*n4EwYRm%AM-)^`r*GyZ^&_;CuMpUOXPeNg%{ zRr{yKakzsWXRmC1sa|+{h98v^-s3is#gEE{1fcq8_&vTbk96H!O~z8d*F&z*tH+`W zu(~Zwfhw`N0+C(=o1r?4vH+sb!^Eftn=O*P=e&JTeFk3K9<^QT)hW3%ayee(63$uV zDFd+60Gk)^q?KC0PK51Yt}epwPd=CW+dYrF0Aa&5KbV|=7gn%90C&KnHSFL$ld)rAtc8#{A4>`qW%?A65Nr$$4ls_lq!RiCu z9&a8KT|zu|W;Fu;1{i)=R(O{iSr$Jm9df(}`k)VIPxgmvOCLU?TWd|QW70zV+dz@n zG3oHg1|DeXcx~;v_fO$%=BaA8m24&fGA-ap z>ZE|oj`0}vdhm}D?(jmFRn_OAEftv03ijpHN|>Jmx%EY~j;f$K9xEY7d5dd~ug^Vk5TJ26whAtu;d5YE$||rXG;Chs(~O=jawrCu!r3$BXF` zRldxqs!Csc|HSg@>fOF*4&+xttzEInW)dLN0*<6k3drmjk5O;hL$`tG1?tPggn3wN zf*q3<+TR9>#EwaaM>udi`hAiuL?W$Kvphv+c8!&4Tj1jRqqes~DxS02bl&j&=c+M> zYqs5KuC{0RQF);~ZX;RzsBB0P{;JLKm)|OvRdORLe&tlyJlVei0Y5A$yvvQO5I-y% zlDr42w!LGyn=FLg_GIua3f6gWQYXw0Ts-TW|9(9G{MHefO_q*#88mKsOq?OkQzY1u zAo;9dUrw!r`8hBitX@x#`?vMOvQnn13S99C+L~a;WQF#(g(9(I^5GE;+`c5~i)?yJ zPA_k?B|-98!M>bY3Gv^sAPY^gb`uW1nJzCik#viWX0hb)(0j^r{*C!|)mw0rPu3#%Q z-@#=C{3w+YaLF+q;3s)O8$SFwFV(UjxRfAe)v}C)d~$Vf%;UMC)jy01m5(^=_UP8_ zYGtTS44UbrU{_kJgz5Ykk2KKI{^gF5+Uy9oOJpSWIS48#;6`YKfXa>G=(j9N^>X|9I0Zun=-gmeQp*B*B8*3>^YI~7 zUf@-q5{3-WxxucamId@w*d8hHgk~Snd(0l!E*xE>EonnJ$!7)oa%v^a&w=q^^)m7c zU38(=&^7O(Cyayw<@TGBY}6j<6Cvq%#rrHQoU7Itxf9=-m0S}-@Et%H4Y4e diff --git a/stdlib/c4-abx.repx b/stdlib/c4-abx.repx index 09535b9b28123a6f469ab6da950a163032f203ad..58944ccf12ffebbf74e16dda8ce18ec70ace2deb 100644 GIT binary patch literal 8759 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

y$#th1HX9O)VV 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 diff --git a/stdlib/cloudinsight-abx.repx b/stdlib/cloudinsight-abx.repx index b72613854113994e9a0a765e11b6b59f9993b62f..bb721e9df0f7c638e6cd8faad9597985d19ba575 100644 GIT binary patch literal 800 zcmV+*1K<1`NfQ7p3hahsq1GxiZcWSc*+Z5}2MXt>9vV1D@Vxv!{X;k(4G^2DdV}RXdZ(bqDAsPhzk0 z<0wrS9%>~LhtSv(=Y88*bOsS)CYPIE{}=FeU%H<1*A;JkGt+y8qt5jI3jIBsym@5d z^npw{qHptkaF9Q`PkPqY4SuKIa$Ib3b@j^nKd=AcKfd}sXMK}q-e2JVy-VQmJN#%4 z`O_^3AEz4UiChpveFv5J&!+j+)aO?s1j$f|O%GOCs<835jz%RO>#v0qin!u^gfib@0 ze3O%MVe|sEhuCw>9x`|p9S`Te&%t3L&~JvvkzdZ_H}KINoedWnN%5YVMXWzt-gm;3 zIfRHY_d)_5jKY2+8n>HV1v%NvL5Mtbc*{Zp-g@zcU^Gzky#5=Psf;!>Yo3ev3Vqn& zXfrQ=xaO^kZNOuPKljXfH-QgkkNBGxRIKr;23$Y+{waE}*eDmO| z6yH^!gSWokdlUV`ZX>T--VV`W4IvVlOT73nEvL$+dEcv#0bbQ`gs0OG#dB_V_4&}&_T8tZ$F`n;2aq0UudsN4U$U&&%9ka7 zOKvVe!4lwr=E)&MfxNSTHG+y{t73ZK>0LH^Dp(Oo+{u-}tqd+|XEM3&0NvzCY-vA^ z(uComRwA)z6t={9-*y(ALByEJ;pW%>1$^A=`+D>6*A?ITW~S!~N1dsJzYRzvq#52Y z->a8O|7$jR@jf`n-yYnhx^3$QKNB8U4mPkS`;X%vZ+`yXUi3+td4GWa_pX7% z@9={;EevLhM}4IIy4Gz7mPTsStUc1*Gsa{)T`N z*qKs!ne!3cLGyqa2gcbQ@=HIxzpqpVjsOhDPd8{~>tvwuHWCTo7u`@}**38zaGG&o ztbTC5%1OB}dV>mx;Mm@0@G3R#&;5*p!=#_z43DF}lF4u2qdPepE;NebJ+(?#f3>{t z#3^$K5#z!$33xEd`CHMrz0K8-lc1wJlF;!T3ki|8UV0%I4b(iZ|LiiA(S}ydbCF)5 z4?CW0=H-vqymN6}(sVQXpg7`t_yU=Ejb-l{R2Zx>@JogM1$GOl<9V0s5`IxUWxXQm z*O|9*y08aGnB{TUH7UP=%gFpj4FN0VndNoR-^k6C$|d{s#vgB7^7Lj}EGMHk!col z%S`d|)LRMus(4%UcbHDsNh_fu5UVma!~PJgvLmh1s3akRC9w?O}(%&rb&{dfy` z^x|A}<>n?2&xhX7_A8aQ-(>8562(#O2k;lmdtbS)L+*<3-(ca0yS6UGhS1$6LxAzc zy{}SyS2GUY`g+Gr@)x^}eADuFNDgZVQOI24rH5%bS2oT2UVjYms)i#zorWl$bGw(% hZyw{-)iJcAhUv6=Uq{W+U0MBOZh9s$j-u2BF0 diff --git a/stdlib/kubernetes-abx.repx b/stdlib/kubernetes-abx.repx index 7aa1f2aae2d8b01126792c0772608dcab0f71404..60fc5d9bbb9133aace63a57f6b44a2ea9f0a5989 100644 GIT binary patch literal 584 zcmV-O0=NAe#~J_}iRs1%S;%+E$jokYvdFgoacWVLkhLTQF?u?!o>3F#T_-+e`zx6qvDrFT*H7N3hLKfj(e{vL(VA0q){<(~<;iyD;G#Y2natjGW#kN_W zsMS8e>>XME7w{E}Fbng-`|pbHd^OVp%O>kR{lP*XxUVx{(dRa$_Z|0y&Y&O%Ol}io zPnDzQfRD`_&v#XwaD{7s)uw;=wC~3#-<&8P8(vlEsQm8}-}P{}gA1KYL0S-q!bWfK zVOUZ7mHAg@QBt1#T?!2!-cw@<(%oB(qk#wu!^)Zue?Ji74QVB6!5Vwn?@mLs_$h z{k(2?=3$fcZ0&*ge(8k!nL)}Zn#!P<6ABrGyJT2}Y)xZpxqXzBjsuA@D1=5h*M%e= zkcu`Z9AasGUj<#le!qY(*`!rkH_>}neCw&1?mI4fx~&oy?(=;E->hzb#C>n_xDB;H zizYFoFN-EZdHRj#67Ba2s~bkN_GWFx&80T~qJF1Dd0X%G8aBa6k``Ik)_%6cHcL5JjUaliow9B{ZOTtg6~kb;mL z&I$nvI9x*T8H0;LfC3Je5PUi$2OMxf;T(dX7@Qq&xW*vLA;lmC;p}jApnwS)bYgn( bFYdHgQD^wRs>! diff --git a/stdlib/logos-abx.repx b/stdlib/logos-abx.repx index 1543c9fe203083cbddb6829769474254de29f6d8..a45d56c2ebd59ee20da68c34cc800b59e2c914ea 100644 GIT binary patch delta 10991 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 delta 11037 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