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

feat: work on chronology

This commit is contained in:
Arnaud Roques 2023-12-11 18:34:23 +01:00
parent d7727c5c87
commit c20b3d9642
192 changed files with 2806 additions and 611 deletions

View File

@ -1,4 +1,4 @@
# Warning, "version" should be the same in gradle.properties and Version.java # Warning, "version" should be the same in gradle.properties and Version.java
# Any idea anyone how to magically synchronize those :-) ? # Any idea anyone how to magically synchronize those :-) ?
version = 1.2023.13beta3 version = 1.2023.13beta4
org.gradle.workers.max = 3 org.gradle.workers.max = 3

View File

@ -53,6 +53,7 @@ import net.sourceforge.plantuml.BlockUml;
import net.sourceforge.plantuml.BlockUmlBuilder; import net.sourceforge.plantuml.BlockUmlBuilder;
import net.sourceforge.plantuml.ErrorUml; import net.sourceforge.plantuml.ErrorUml;
import net.sourceforge.plantuml.FileFormat; import net.sourceforge.plantuml.FileFormat;
import net.sourceforge.plantuml.FileFormatOption;
import net.sourceforge.plantuml.core.Diagram; import net.sourceforge.plantuml.core.Diagram;
import net.sourceforge.plantuml.error.PSystemError; import net.sourceforge.plantuml.error.PSystemError;
import net.sourceforge.plantuml.klimt.color.ColorMapper; import net.sourceforge.plantuml.klimt.color.ColorMapper;
@ -122,7 +123,7 @@ public class DirectDraw {
ug.apply(back).apply(back.bg()).draw(URectangle.build(frameWidth, frameHeight)); ug.apply(back).apply(back.bg()).draw(URectangle.build(frameWidth, frameHeight));
WasmLog.log("...drawing..."); WasmLog.log("...drawing...");
system.exportDiagramGraphic(ug); system.exportDiagramGraphic(ug, new FileFormatOption(FileFormat.PNG));
WasmLog.log("done!"); WasmLog.log("done!");

View File

@ -55,6 +55,7 @@ import net.sourceforge.plantuml.BlockUmlBuilder;
import net.sourceforge.plantuml.EmptyImageBuilder; import net.sourceforge.plantuml.EmptyImageBuilder;
import net.sourceforge.plantuml.ErrorUml; import net.sourceforge.plantuml.ErrorUml;
import net.sourceforge.plantuml.FileFormat; import net.sourceforge.plantuml.FileFormat;
import net.sourceforge.plantuml.FileFormatOption;
import net.sourceforge.plantuml.api.ImageDataSimple; import net.sourceforge.plantuml.api.ImageDataSimple;
import net.sourceforge.plantuml.core.Diagram; import net.sourceforge.plantuml.core.Diagram;
import net.sourceforge.plantuml.core.ImageData; import net.sourceforge.plantuml.core.ImageData;
@ -124,7 +125,7 @@ public class Raw {
ug.resetMax(); ug.resetMax();
WasmLog.log("...drawing..."); WasmLog.log("...drawing...");
system.exportDiagramGraphic(ug); system.exportDiagramGraphic(ug, new FileFormatOption(FileFormat.PNG));
final int width = (int) (2 + ug.getMaxX()); final int width = (int) (2 + ug.getMaxX());
final int height = (int) (2 + ug.getMaxY()); final int height = (int) (2 + ug.getMaxY());
@ -208,7 +209,7 @@ public class Raw {
ug.resetMax(); ug.resetMax();
WasmLog.log("...drawing..."); WasmLog.log("...drawing...");
system.exportDiagramGraphic(ug); system.exportDiagramGraphic(ug, new FileFormatOption(FileFormat.PNG));
final int width = (int) (2 + ug.getMaxX()); final int width = (int) (2 + ug.getMaxX());
final int height = (int) (2 + ug.getMaxY()); final int height = (int) (2 + ug.getMaxY());

View File

@ -376,13 +376,13 @@ public abstract class CucaDiagram extends UmlDiagram implements GroupHierarchy,
// ::done // ::done
@Override @Override
final public void exportDiagramGraphic(UGraphic ug) { final public void exportDiagramGraphic(UGraphic ug, FileFormatOption fileFormatOption) {
final CucaDiagramFileMaker maker = new CucaDiagramFileMakerSmetana(this, ug.getStringBounder()); final CucaDiagramFileMaker maker = new CucaDiagramFileMakerSmetana(this, ug.getStringBounder());
maker.createOneGraphic(ug); maker.createOneGraphic(ug);
} }
@Override @Override
final protected TextBlock getTextBlock() { final protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }

View File

@ -114,14 +114,14 @@ public abstract class AbstractPSystem implements Diagram {
} }
final public String getMetadata() { final public String getMetadata() {
if (source == null) if (source == null)
return getVersion(); return getVersion();
final String rawString = source.getRawString("\n"); final String rawString = source.getRawString("\n");
final String plainString = source.getPlainString("\n"); final String plainString = source.getPlainString("\n");
if (rawString != null && rawString.equals(plainString)) if (rawString != null && rawString.equals(plainString))
return rawString + BackSlash.NEWLINE + getVersion(); return rawString + BackSlash.NEWLINE + getVersion();
return rawString + BackSlash.NEWLINE + plainString + BackSlash.NEWLINE + getVersion(); return rawString + BackSlash.NEWLINE + plainString + BackSlash.NEWLINE + getVersion();
} }
@ -130,9 +130,9 @@ public abstract class AbstractPSystem implements Diagram {
} }
final public long seed() { final public long seed() {
if (source == null) if (source == null)
return 42; return 42;
return getSource().seed(); return getSource().seed();
} }
@ -159,9 +159,9 @@ public abstract class AbstractPSystem implements Diagram {
} }
public DisplayPositionned getTitle() { public DisplayPositionned getTitle() {
if (source == null) if (source == null)
return DisplayPositioned.single(Display.empty(), HorizontalAlignment.CENTER, VerticalAlignment.TOP); return DisplayPositioned.single(Display.empty(), HorizontalAlignment.CENTER, VerticalAlignment.TOP);
return DisplayPositioned.single(source.getTitle(), HorizontalAlignment.CENTER, VerticalAlignment.TOP); return DisplayPositioned.single(source.getTitle(), HorizontalAlignment.CENTER, VerticalAlignment.TOP);
} }
@ -247,7 +247,7 @@ public abstract class AbstractPSystem implements Diagram {
} }
@Override @Override
public void exportDiagramGraphic(UGraphic ug) { public void exportDiagramGraphic(UGraphic ug, FileFormatOption fileFormatOption) {
final UFont font = UFont.monospaced(14); final UFont font = UFont.monospaced(14);
final FontConfiguration fc = FontConfiguration.blackBlueTrue(font); final FontConfiguration fc = FontConfiguration.blackBlueTrue(font);
final UText text = UText.build("Not implemented yet for " + getClass().getName(), fc); final UText text = UText.build("Not implemented yet for " + getClass().getName(), fc);

View File

@ -440,9 +440,11 @@ public class Option {
} else if (s.equalsIgnoreCase("-preproc")) { } else if (s.equalsIgnoreCase("-preproc")) {
preprocessorOutput = OptionPreprocOutputMode.NORMAL; preprocessorOutput = OptionPreprocOutputMode.NORMAL;
setFileFormatOption(new FileFormatOption(FileFormat.PREPROC));
} else if (s.equalsIgnoreCase("-cypher")) { } else if (s.equalsIgnoreCase("-cypher")) {
preprocessorOutput = OptionPreprocOutputMode.CYPHER; preprocessorOutput = OptionPreprocOutputMode.CYPHER;
setFileFormatOption(new FileFormatOption(FileFormat.PREPROC));
} else if (s.equalsIgnoreCase("-checkmetadata")) { } else if (s.equalsIgnoreCase("-checkmetadata")) {
checkMetadata = true; checkMetadata = true;

View File

@ -48,6 +48,7 @@ import net.sourceforge.plantuml.activitydiagram3.ActivityDiagramFactory3;
import net.sourceforge.plantuml.api.PSystemFactory; import net.sourceforge.plantuml.api.PSystemFactory;
import net.sourceforge.plantuml.board.BoardDiagramFactory; import net.sourceforge.plantuml.board.BoardDiagramFactory;
import net.sourceforge.plantuml.bpm.BpmDiagramFactory; import net.sourceforge.plantuml.bpm.BpmDiagramFactory;
import net.sourceforge.plantuml.chronology.ChronologyDiagramFactory;
import net.sourceforge.plantuml.classdiagram.ClassDiagramFactory; import net.sourceforge.plantuml.classdiagram.ClassDiagramFactory;
import net.sourceforge.plantuml.core.Diagram; import net.sourceforge.plantuml.core.Diagram;
import net.sourceforge.plantuml.core.DiagramType; import net.sourceforge.plantuml.core.DiagramType;
@ -223,7 +224,8 @@ public class PSystemBuilder {
// factories.add(new PSystemSudokuFactory()); // factories.add(new PSystemSudokuFactory());
// ::done // ::done
// ::comment when __CORE__ or __MIT__ or __EPL__ or __BSD__ or __ASL__ or __LGPL__ // ::comment when __CORE__ or __MIT__ or __EPL__ or __BSD__ or __ASL__ or
// __LGPL__
factories.add(new PSystemJcckitFactory()); factories.add(new PSystemJcckitFactory());
factories.add(new PSystemSudokuFactory()); factories.add(new PSystemSudokuFactory());
// ::done // ::done
@ -247,11 +249,13 @@ public class PSystemBuilder {
// ::done // ::done
factories.add(new PSystemCharlieFactory()); factories.add(new PSystemCharlieFactory());
// ::comment when __CORE__ or __MIT__ or __EPL__ or __BSD__ or __ASL__ or __LGPL__ // ::comment when __CORE__ or __MIT__ or __EPL__ or __BSD__ or __ASL__ or
// __LGPL__
factories.add(new PSystemXearthFactory()); factories.add(new PSystemXearthFactory());
// ::done // ::done
factories.add(new GanttDiagramFactory()); factories.add(new GanttDiagramFactory());
factories.add(new ChronologyDiagramFactory());
factories.add(new FlowDiagramFactory()); factories.add(new FlowDiagramFactory());
// ::comment when __CORE__ // ::comment when __CORE__

View File

@ -66,14 +66,13 @@ public abstract class PlainDiagram extends AbstractPSystem {
} }
@Override @Override
public void exportDiagramGraphic(UGraphic ug) { public void exportDiagramGraphic(UGraphic ug, FileFormatOption fileFormatOption) {
final FileFormatOption option = new FileFormatOption(FileFormat.PNG);
try { try {
final UDrawable rootDrawable = getRootDrawable(option); final UDrawable rootDrawable = getRootDrawable(fileFormatOption);
rootDrawable.drawU(ug); rootDrawable.drawU(ug);
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
super.exportDiagramGraphic(ug); super.exportDiagramGraphic(ug, fileFormatOption);
} }
} }

View File

@ -54,6 +54,7 @@ import net.sourceforge.plantuml.klimt.shape.GraphicStrings;
import net.sourceforge.plantuml.klimt.shape.TextBlock; import net.sourceforge.plantuml.klimt.shape.TextBlock;
import net.sourceforge.plantuml.preproc.Defines; import net.sourceforge.plantuml.preproc.Defines;
import net.sourceforge.plantuml.security.SFile; import net.sourceforge.plantuml.security.SFile;
import net.sourceforge.plantuml.text.StringLocated;
import net.sourceforge.plantuml.utils.Log; import net.sourceforge.plantuml.utils.Log;
public class SourceStringReader { public class SourceStringReader {
@ -157,6 +158,14 @@ public class SourceStringReader {
noValidStartFound(os, fileFormatOption); noValidStartFound(os, fileFormatOption);
return null; return null;
} }
if (fileFormatOption.getFileFormat() == FileFormat.PREPROC) {
final BlockUml first = blocks.get(0);
for (StringLocated s : first.getData()) {
os.write(s.getString().getBytes(UTF_8));
os.write("\n".getBytes(UTF_8));
}
return new DiagramDescription("PREPROC");
}
for (BlockUml b : blocks) { for (BlockUml b : blocks) {
final Diagram system = b.getDiagram(); final Diagram system = b.getDiagram();
final int nbInSystem = system.getNbImages(); final int nbInSystem = system.getNbImages();
@ -231,7 +240,8 @@ public class SourceStringReader {
} }
public ImageData noValidStartFound(OutputStream os, FileFormatOption fileFormatOption) throws IOException { public ImageData noValidStartFound(OutputStream os, FileFormatOption fileFormatOption) throws IOException {
final TextBlock error = GraphicStrings.createForError(Arrays.asList("No valid @start/@end found, please check the version"), final TextBlock error = GraphicStrings.createForError(
Arrays.asList("No valid @start/@end found, please check the version"),
fileFormatOption.isUseRedForError()); fileFormatOption.isUseRedForError());
return plainImageBuilder(error, fileFormatOption).write(os); return plainImageBuilder(error, fileFormatOption).write(os);

View File

@ -253,11 +253,11 @@ public abstract class TitledDiagram extends AbstractPSystem implements Diagram,
} }
protected abstract TextBlock getTextBlock(); protected abstract TextBlock getTextMainBlock(FileFormatOption fileFormatOption);
@Override @Override
public void exportDiagramGraphic(UGraphic ug) { public void exportDiagramGraphic(UGraphic ug, FileFormatOption fileFormatOption) {
final TextBlock textBlock = getTextBlock(); final TextBlock textBlock = getTextMainBlock(fileFormatOption);
textBlock.drawU(ug); textBlock.drawU(ug);
} }

View File

@ -61,6 +61,7 @@ import net.sourceforge.plantuml.regex.RegexOr;
import net.sourceforge.plantuml.regex.RegexPartialMatch; import net.sourceforge.plantuml.regex.RegexPartialMatch;
import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.regex.RegexResult;
import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.Url;
import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlBuilder;
import net.sourceforge.plantuml.url.UrlMode; import net.sourceforge.plantuml.url.UrlMode;
@ -81,9 +82,7 @@ public class CommandLinkActivity extends SingleLineCommand2<ActivityDiagram> {
new RegexLeaf("CODE", "([%pLN][%pLN_.]*)"), // new RegexLeaf("CODE", "([%pLN][%pLN_.]*)"), //
new RegexLeaf("BAR", "(?:==+)[%s]*([%pLN_.]+)[%s]*(?:==+)"), // new RegexLeaf("BAR", "(?:==+)[%s]*([%pLN_.]+)[%s]*(?:==+)"), //
new RegexLeaf("QUOTED", "[%g]([^%g]+)[%g](?:[%s]+as[%s]+([%pLN_.]+))?"))), // new RegexLeaf("QUOTED", "[%g]([^%g]+)[%g](?:[%s]+as[%s]+([%pLN_.]+))?"))), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREOTYPE"), //
new RegexLeaf("STEREOTYPE", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
ColorParser.exp2(), // ColorParser.exp2(), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
UrlBuilder.OPTIONAL, // UrlBuilder.OPTIONAL, //
@ -105,9 +104,7 @@ public class CommandLinkActivity extends SingleLineCommand2<ActivityDiagram> {
new RegexLeaf("BAR2", "(?:==+)[%s]*([%pLN_.]+)[%s]*(?:==+)"), // new RegexLeaf("BAR2", "(?:==+)[%s]*([%pLN_.]+)[%s]*(?:==+)"), //
new RegexLeaf("QUOTED2", "[%g]([^%g]+)[%g](?:[%s]+as[%s]+([%pLN][%pLN_.]*))?"), // new RegexLeaf("QUOTED2", "[%g]([^%g]+)[%g](?:[%s]+as[%s]+([%pLN][%pLN_.]*))?"), //
new RegexLeaf("QUOTED_INVISIBLE2", "(\\w.*?)")), // new RegexLeaf("QUOTED_INVISIBLE2", "(\\w.*?)")), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREOTYPE2"), //
new RegexLeaf("STEREOTYPE2", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexOptional( // new RegexOptional( //
new RegexConcat( // new RegexConcat( //
new RegexLeaf("in"), // new RegexLeaf("in"), //

View File

@ -64,6 +64,7 @@ import net.sourceforge.plantuml.regex.RegexOptional;
import net.sourceforge.plantuml.regex.RegexOr; import net.sourceforge.plantuml.regex.RegexOr;
import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.regex.RegexResult;
import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.text.BackSlash; import net.sourceforge.plantuml.text.BackSlash;
import net.sourceforge.plantuml.text.StringLocated; import net.sourceforge.plantuml.text.StringLocated;
import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.Url;
@ -91,9 +92,7 @@ public class CommandLinkLongActivity extends CommandMultilines2<ActivityDiagram>
new RegexLeaf("CODE", "([%pLN][%pLN_.]*)"), // new RegexLeaf("CODE", "([%pLN][%pLN_.]*)"), //
new RegexLeaf("BAR", "(?:==+)[%s]*([%pLN_.]+)[%s]*(?:==+)"), // new RegexLeaf("BAR", "(?:==+)[%s]*([%pLN_.]+)[%s]*(?:==+)"), //
new RegexLeaf("QUOTED", "[%g]([^%g]+)[%g](?:[%s]+as[%s]+([%pLN_.]+))?"))), // new RegexLeaf("QUOTED", "[%g]([^%g]+)[%g](?:[%s]+as[%s]+([%pLN_.]+))?"))), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREOTYPE"), //
new RegexLeaf("STEREOTYPE", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("BACKCOLOR", "(#\\w+)?"), // new RegexLeaf("BACKCOLOR", "(#\\w+)?"), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
UrlBuilder.OPTIONAL, // UrlBuilder.OPTIONAL, //

View File

@ -52,6 +52,7 @@ import net.sourceforge.plantuml.regex.RegexLeaf;
import net.sourceforge.plantuml.regex.RegexOr; import net.sourceforge.plantuml.regex.RegexOr;
import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.regex.RegexResult;
import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.utils.LineLocation; import net.sourceforge.plantuml.utils.LineLocation;
public class CommandPartition extends SingleLineCommand2<ActivityDiagram> { public class CommandPartition extends SingleLineCommand2<ActivityDiagram> {
@ -69,9 +70,7 @@ public class CommandPartition extends SingleLineCommand2<ActivityDiagram> {
new RegexOr(// new RegexOr(//
color().getRegex(), // color().getRegex(), //
new RegexLeaf("LEGACYCOLORIGNORED", "(#[0-9a-fA-F]{6}|#?\\w+)?")), // new RegexLeaf("LEGACYCOLORIGNORED", "(#[0-9a-fA-F]{6}|#?\\w+)?")), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREOTYPE"), //
new RegexLeaf("STEREOTYPE", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("\\{?"), // new RegexLeaf("\\{?"), //
RegexLeaf.end()); RegexLeaf.end());
} }
@ -89,12 +88,10 @@ public class CommandPartition extends SingleLineCommand2<ActivityDiagram> {
final Entity p = diagram.getCurrentGroup(); final Entity p = diagram.getCurrentGroup();
final Colors colors = color().getColor(arg, diagram.getSkinParam().getIHtmlColorSet()); final Colors colors = color().getColor(arg, diagram.getSkinParam().getIHtmlColorSet());
if (colors.isEmpty() == false) { if (colors.isEmpty() == false)
p.setColors(colors); p.setColors(colors);
}
if (arg.get("STEREOTYPE", 0) != null) { p.setStereotype(Stereotype.build(arg.get("STEREOTYPE", 0)));
p.setStereotype(Stereotype.build(arg.get("STEREOTYPE", 0)));
}
return CommandExecutionResult.ok(); return CommandExecutionResult.ok();
} }

View File

@ -40,7 +40,6 @@ import java.io.OutputStream;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import net.sourceforge.plantuml.FileFormat;
import net.sourceforge.plantuml.FileFormatOption; import net.sourceforge.plantuml.FileFormatOption;
import net.sourceforge.plantuml.UmlDiagram; import net.sourceforge.plantuml.UmlDiagram;
import net.sourceforge.plantuml.activitydiagram3.ftile.BoxStyle; import net.sourceforge.plantuml.activitydiagram3.ftile.BoxStyle;
@ -208,8 +207,7 @@ public class ActivityDiagram3 extends UmlDiagram {
} }
@Override @Override
protected TextBlock getTextBlock() { protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) {
final FileFormatOption fileFormatOption = new FileFormatOption(FileFormat.PNG);
final StringBounder stringBounder = fileFormatOption.getDefaultStringBounder(getSkinParam()); final StringBounder stringBounder = fileFormatOption.getDefaultStringBounder(getSkinParam());
return getTextBlock(stringBounder); return getTextBlock(stringBounder);
} }
@ -318,10 +316,10 @@ public class ActivityDiagram3 extends UmlDiagram {
return CommandExecutionResult.error("Cannot find switch"); return CommandExecutionResult.error("Cannot find switch");
} }
public void startIf(Display test, Display whenThen, HColor color, Url url) { public void startIf(Display test, Display whenThen, HColor color, Url url, Stereotype stereotype) {
manageSwimlaneStrategy(); manageSwimlaneStrategy();
final InstructionIf instructionIf = new InstructionIf(swinlanes.getCurrentSwimlane(), current(), test, final InstructionIf instructionIf = new InstructionIf(swinlanes.getCurrentSwimlane(), current(), test,
LinkRendering.none().withDisplay(whenThen), nextLinkRenderer(), color, getSkinParam(), url); LinkRendering.none().withDisplay(whenThen), nextLinkRenderer(), color, getSkinParam(), url, stereotype);
current().add(instructionIf); current().add(instructionIf);
setNextLinkRendererInternal(LinkRendering.none()); setNextLinkRendererInternal(LinkRendering.none());
setCurrent(instructionIf); setCurrent(instructionIf);
@ -392,7 +390,8 @@ public class ActivityDiagram3 extends UmlDiagram {
manageSwimlaneStrategy(); manageSwimlaneStrategy();
if (current() instanceof InstructionRepeat) { if (current() instanceof InstructionRepeat) {
final InstructionRepeat instructionRepeat = (InstructionRepeat) current(); final InstructionRepeat instructionRepeat = (InstructionRepeat) current();
instructionRepeat.setBackward(label, swinlanes.getCurrentSwimlane(), boxStyle, incoming1, incoming2, stereotype); instructionRepeat.setBackward(label, swinlanes.getCurrentSwimlane(), boxStyle, incoming1, incoming2,
stereotype);
return CommandExecutionResult.ok(); return CommandExecutionResult.ok();
} }
if (current() instanceof InstructionWhile) { if (current() instanceof InstructionWhile) {

View File

@ -57,6 +57,7 @@ import net.sourceforge.plantuml.klimt.shape.TextBlock;
import net.sourceforge.plantuml.klimt.shape.TextBlockUtils; import net.sourceforge.plantuml.klimt.shape.TextBlockUtils;
import net.sourceforge.plantuml.sequencediagram.NotePosition; import net.sourceforge.plantuml.sequencediagram.NotePosition;
import net.sourceforge.plantuml.sequencediagram.NoteType; import net.sourceforge.plantuml.sequencediagram.NoteType;
import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.style.ISkinParam; import net.sourceforge.plantuml.style.ISkinParam;
import net.sourceforge.plantuml.style.PName; import net.sourceforge.plantuml.style.PName;
import net.sourceforge.plantuml.style.SName; import net.sourceforge.plantuml.style.SName;
@ -95,12 +96,12 @@ public class Branch {
} }
public Branch(StyleBuilder styleBuilder, Swimlane swimlane, LinkRendering labelPositive, Display labelTest, public Branch(StyleBuilder styleBuilder, Swimlane swimlane, LinkRendering labelPositive, Display labelTest,
HColor color, LinkRendering inlabel) { HColor color, LinkRendering inlabel, Stereotype stereotype) {
this.inlabel = Objects.requireNonNull(inlabel); this.inlabel = Objects.requireNonNull(inlabel);
this.labelTest = Objects.requireNonNull(labelTest); this.labelTest = Objects.requireNonNull(labelTest);
this.labelPositive = Objects.requireNonNull(labelPositive); this.labelPositive = Objects.requireNonNull(labelPositive);
final Style style = getDefaultStyleDefinitionDiamond().getMergedStyle(styleBuilder); final Style style = getDefaultStyleDefinitionDiamond().withTOBECHANGED(stereotype).getMergedStyle(styleBuilder);
this.color = color == null this.color = color == null
? style.value(PName.BackGroundColor).asColor(styleBuilder.getSkinParam().getIHtmlColorSet()) ? style.value(PName.BackGroundColor).asColor(styleBuilder.getSkinParam().getIHtmlColorSet())
: color; : color;

View File

@ -47,7 +47,6 @@ import net.sourceforge.plantuml.activitydiagram3.ftile.FtileDecorateWelding;
import net.sourceforge.plantuml.activitydiagram3.ftile.FtileFactory; import net.sourceforge.plantuml.activitydiagram3.ftile.FtileFactory;
import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane; import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane;
import net.sourceforge.plantuml.activitydiagram3.ftile.WeldingPoint; import net.sourceforge.plantuml.activitydiagram3.ftile.WeldingPoint;
import net.sourceforge.plantuml.activitydiagram3.ftile.vcompact.FtileWithNoteOpale;
import net.sourceforge.plantuml.activitydiagram3.gtile.Gtile; import net.sourceforge.plantuml.activitydiagram3.gtile.Gtile;
import net.sourceforge.plantuml.activitydiagram3.gtile.GtileIfAlone; import net.sourceforge.plantuml.activitydiagram3.gtile.GtileIfAlone;
import net.sourceforge.plantuml.activitydiagram3.gtile.GtileIfHexagon; import net.sourceforge.plantuml.activitydiagram3.gtile.GtileIfHexagon;
@ -56,9 +55,9 @@ import net.sourceforge.plantuml.klimt.color.Colors;
import net.sourceforge.plantuml.klimt.color.HColor; import net.sourceforge.plantuml.klimt.color.HColor;
import net.sourceforge.plantuml.klimt.creole.Display; import net.sourceforge.plantuml.klimt.creole.Display;
import net.sourceforge.plantuml.klimt.font.StringBounder; import net.sourceforge.plantuml.klimt.font.StringBounder;
import net.sourceforge.plantuml.klimt.geom.VerticalAlignment;
import net.sourceforge.plantuml.sequencediagram.NotePosition; import net.sourceforge.plantuml.sequencediagram.NotePosition;
import net.sourceforge.plantuml.sequencediagram.NoteType; import net.sourceforge.plantuml.sequencediagram.NoteType;
import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.style.ISkinParam; import net.sourceforge.plantuml.style.ISkinParam;
import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.Url;
@ -75,6 +74,7 @@ public class InstructionIf extends WithNote implements Instruction, InstructionC
private Branch current; private Branch current;
private final LinkRendering topInlinkRendering; private final LinkRendering topInlinkRendering;
private LinkRendering outColor = LinkRendering.none(); private LinkRendering outColor = LinkRendering.none();
private final Stereotype stereotype;
private final Swimlane swimlane; private final Swimlane swimlane;
@ -91,14 +91,15 @@ public class InstructionIf extends WithNote implements Instruction, InstructionC
} }
public InstructionIf(Swimlane swimlane, Instruction parent, Display labelTest, LinkRendering whenThen, public InstructionIf(Swimlane swimlane, Instruction parent, Display labelTest, LinkRendering whenThen,
LinkRendering inlinkRendering, HColor color, ISkinParam skinParam, Url url) { LinkRendering inlinkRendering, HColor color, ISkinParam skinParam, Url url, Stereotype stereotype) {
this.url = url; this.url = url;
this.stereotype = stereotype;
this.parent = parent; this.parent = parent;
this.skinParam = skinParam; this.skinParam = skinParam;
this.topInlinkRendering = Objects.requireNonNull(inlinkRendering); this.topInlinkRendering = Objects.requireNonNull(inlinkRendering);
this.swimlane = swimlane; this.swimlane = swimlane;
this.thens.add(new Branch(skinParam.getCurrentStyleBuilder(), swimlane, whenThen, labelTest, color, this.thens.add(new Branch(skinParam.getCurrentStyleBuilder(), swimlane, whenThen, labelTest, color,
LinkRendering.none())); LinkRendering.none(), stereotype));
this.current = this.thens.get(0); this.current = this.thens.get(0);
} }
@ -138,11 +139,11 @@ public class InstructionIf extends WithNote implements Instruction, InstructionC
if (elseBranch == null) if (elseBranch == null)
this.elseBranch = new Branch(skinParam.getCurrentStyleBuilder(), swimlane, LinkRendering.none(), this.elseBranch = new Branch(skinParam.getCurrentStyleBuilder(), swimlane, LinkRendering.none(),
Display.NULL, null, LinkRendering.none()); Display.NULL, null, LinkRendering.none(), stereotype);
elseBranch.updateFtile(factory); elseBranch.updateFtile(factory);
Ftile result = factory.createIf(swimlane, thens, elseBranch, outColor, topInlinkRendering, url, Ftile result = factory.createIf(swimlane, thens, elseBranch, outColor, topInlinkRendering, url,
getPositionedNotes()); getPositionedNotes(), stereotype);
// if (getPositionedNotes().size() > 0) // if (getPositionedNotes().size() > 0)
// result = FtileWithNoteOpale.create(result, getPositionedNotes(), false, VerticalAlignment.CENTER); // result = FtileWithNoteOpale.create(result, getPositionedNotes(), false, VerticalAlignment.CENTER);
@ -169,7 +170,7 @@ public class InstructionIf extends WithNote implements Instruction, InstructionC
this.current.setInlinkRendering(nextLinkRenderer); this.current.setInlinkRendering(nextLinkRenderer);
this.elseBranch = new Branch(skinParam.getCurrentStyleBuilder(), swimlane, whenElse, Display.NULL, null, this.elseBranch = new Branch(skinParam.getCurrentStyleBuilder(), swimlane, whenElse, Display.NULL, null,
LinkRendering.none()); LinkRendering.none(), stereotype);
this.current = elseBranch; this.current = elseBranch;
return true; return true;
} }
@ -180,7 +181,8 @@ public class InstructionIf extends WithNote implements Instruction, InstructionC
return false; return false;
this.current.setSpecial(nextLinkRenderer); this.current.setSpecial(nextLinkRenderer);
this.current = new Branch(skinParam.getCurrentStyleBuilder(), swimlane, whenThen, test, color, inlabel); this.current = new Branch(skinParam.getCurrentStyleBuilder(), swimlane, whenThen, test, color, inlabel,
stereotype);
this.thens.add(current); this.thens.add(current);
return true; return true;
@ -190,7 +192,7 @@ public class InstructionIf extends WithNote implements Instruction, InstructionC
endifCalled = true; endifCalled = true;
if (elseBranch == null) if (elseBranch == null)
this.elseBranch = new Branch(skinParam.getCurrentStyleBuilder(), swimlane, LinkRendering.none(), this.elseBranch = new Branch(skinParam.getCurrentStyleBuilder(), swimlane, LinkRendering.none(),
Display.NULL, null, LinkRendering.none()); Display.NULL, null, LinkRendering.none(), stereotype);
this.elseBranch.setSpecial(nextLinkRenderer); this.elseBranch.setSpecial(nextLinkRenderer);
this.current.setInlinkRendering(nextLinkRenderer); this.current.setInlinkRendering(nextLinkRenderer);

View File

@ -58,7 +58,7 @@ import net.sourceforge.plantuml.sequencediagram.NoteType;
import net.sourceforge.plantuml.style.ISkinParam; import net.sourceforge.plantuml.style.ISkinParam;
public class InstructionSwitch extends WithNote implements Instruction, InstructionCollection { public class InstructionSwitch extends WithNote implements Instruction, InstructionCollection {
// ::remove folder when __HAXE__ // ::remove folder when __HAXE__
private final List<Branch> switches = new ArrayList<>(); private final List<Branch> switches = new ArrayList<>();
private final ISkinParam skinParam; private final ISkinParam skinParam;
@ -166,7 +166,7 @@ public class InstructionSwitch extends WithNote implements Instruction, Instruct
this.current.setSpecial(nextLinkRenderer); this.current.setSpecial(nextLinkRenderer);
this.current = new Branch(skinParam.getCurrentStyleBuilder(), swimlane, this.current = new Branch(skinParam.getCurrentStyleBuilder(), swimlane,
LinkRendering.none().withDisplay(labelCase), labelCase, null, LinkRendering.none().withDisplay(labelCase), labelCase, null,
LinkRendering.none().withDisplay(labelCase)); LinkRendering.none().withDisplay(labelCase), null);
this.switches.add(this.current); this.switches.add(this.current);
return true; return true;
} }

View File

@ -52,6 +52,7 @@ import net.sourceforge.plantuml.regex.RegexLeaf;
import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.regex.RegexResult;
import net.sourceforge.plantuml.skin.ColorParam; import net.sourceforge.plantuml.skin.ColorParam;
import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.Url;
import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlBuilder;
import net.sourceforge.plantuml.url.UrlMode; import net.sourceforge.plantuml.url.UrlMode;
@ -104,9 +105,7 @@ public class CommandActivity3 extends SingleLineCommand2<ActivityDiagram3> {
return RegexConcat.build(CommandActivity3.class.getName(), RegexLeaf.start(), // return RegexConcat.build(CommandActivity3.class.getName(), RegexLeaf.start(), //
UrlBuilder.OPTIONAL, // UrlBuilder.OPTIONAL, //
color().getRegex(), // color().getRegex(), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREO"), //
new RegexLeaf("STEREO", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf(":"), // new RegexLeaf(":"), //
new RegexLeaf("LABEL", "(.*?)"), // new RegexLeaf("LABEL", "(.*?)"), //
new RegexLeaf("STYLE", endingGroupShort()), // new RegexLeaf("STYLE", endingGroupShort()), //

View File

@ -78,9 +78,8 @@ public class CommandArrow3 extends SingleLineCommand2<ActivityDiagram3> {
diagram.setColorNextArrow(rainbow); diagram.setColorNextArrow(rainbow);
} }
final String label = arg.get("LABEL", 0); final String label = arg.get("LABEL", 0);
if (label != null && label.length() > 0) { if (label != null && label.length() > 0)
diagram.setLabelNextArrow(Display.getWithNewlines(label)); diagram.setLabelNextArrow(Display.getWithNewlines(label));
}
return CommandExecutionResult.ok(); return CommandExecutionResult.ok();
} }

View File

@ -47,6 +47,8 @@ import net.sourceforge.plantuml.regex.RegexConcat;
import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexLeaf;
import net.sourceforge.plantuml.regex.RegexOptional; import net.sourceforge.plantuml.regex.RegexOptional;
import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.regex.RegexResult;
import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.Url;
import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlBuilder;
import net.sourceforge.plantuml.url.UrlMode; import net.sourceforge.plantuml.url.UrlMode;
@ -63,7 +65,7 @@ public class CommandIf2 extends SingleLineCommand2<ActivityDiagram3> {
UrlBuilder.OPTIONAL, // UrlBuilder.OPTIONAL, //
ColorParser.exp4(), // ColorParser.exp4(), //
new RegexLeaf("if"), // new RegexLeaf("if"), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREO"), //
new RegexLeaf("\\("), // new RegexLeaf("\\("), //
new RegexLeaf("TEST", "(.*?)"), // new RegexLeaf("TEST", "(.*?)"), //
new RegexLeaf("\\)"), // new RegexLeaf("\\)"), //
@ -85,9 +87,8 @@ public class CommandIf2 extends SingleLineCommand2<ActivityDiagram3> {
final HColor color = s == null ? null : diagram.getSkinParam().getIHtmlColorSet().getColor(s); final HColor color = s == null ? null : diagram.getSkinParam().getIHtmlColorSet().getColor(s);
String test = arg.get("TEST", 0); String test = arg.get("TEST", 0);
if (test.length() == 0) { if (test.length() == 0)
test = null; test = null;
}
final Url url; final Url url;
if (arg.get("URL", 0) == null) { if (arg.get("URL", 0) == null) {
@ -96,8 +97,9 @@ public class CommandIf2 extends SingleLineCommand2<ActivityDiagram3> {
final UrlBuilder urlBuilder = new UrlBuilder(diagram.getSkinParam().getValue("topurl"), UrlMode.STRICT); final UrlBuilder urlBuilder = new UrlBuilder(diagram.getSkinParam().getValue("topurl"), UrlMode.STRICT);
url = urlBuilder.getUrl(arg.get("URL", 0)); url = urlBuilder.getUrl(arg.get("URL", 0));
} }
final Stereotype stereotype = Stereotype.build(arg.get("STEREO", 0));
diagram.startIf(Display.getWithNewlines(test), Display.getWithNewlines(arg.get("WHEN", 0)), color, url); diagram.startIf(Display.getWithNewlines(test), Display.getWithNewlines(arg.get("WHEN", 0)), color, url, stereotype);
return CommandExecutionResult.ok(); return CommandExecutionResult.ok();
} }

View File

@ -82,10 +82,10 @@ public class CommandIf4 extends SingleLineCommand2<ActivityDiagram3> {
final HColor color = s == null ? null : diagram.getSkinParam().getIHtmlColorSet().getColor(s); final HColor color = s == null ? null : diagram.getSkinParam().getIHtmlColorSet().getColor(s);
String test = arg.get("TEST", 0); String test = arg.get("TEST", 0);
if (test.length() == 0) { if (test.length() == 0)
test = null; test = null;
}
diagram.startIf(Display.getWithNewlines(test), Display.getWithNewlines(arg.get("WHEN", 0)), color, null); diagram.startIf(Display.getWithNewlines(test), Display.getWithNewlines(arg.get("WHEN", 0)), color, null, null);
return CommandExecutionResult.ok(); return CommandExecutionResult.ok();
} }

View File

@ -72,7 +72,7 @@ public class CommandIfLegacy1 extends SingleLineCommand2<ActivityDiagram3> {
protected CommandExecutionResult executeArg(ActivityDiagram3 diagram, LineLocation location, RegexResult arg) { protected CommandExecutionResult executeArg(ActivityDiagram3 diagram, LineLocation location, RegexResult arg) {
diagram.startIf(Display.getWithNewlines(arg.get("TEST", 0)), Display.getWithNewlines(arg.get("WHEN", 0)), null, diagram.startIf(Display.getWithNewlines(arg.get("TEST", 0)), Display.getWithNewlines(arg.get("WHEN", 0)), null,
null); null, null);
return CommandExecutionResult.ok(); return CommandExecutionResult.ok();
} }

View File

@ -54,6 +54,7 @@ import net.sourceforge.plantuml.regex.RegexLeaf;
import net.sourceforge.plantuml.regex.RegexOptional; import net.sourceforge.plantuml.regex.RegexOptional;
import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.regex.RegexResult;
import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.style.PName; import net.sourceforge.plantuml.style.PName;
import net.sourceforge.plantuml.style.Style; import net.sourceforge.plantuml.style.Style;
import net.sourceforge.plantuml.utils.LineLocation; import net.sourceforge.plantuml.utils.LineLocation;
@ -77,9 +78,7 @@ public class CommandPartition3 extends SingleLineCommand2<ActivityDiagram3> {
new RegexConcat( // new RegexConcat( //
RegexLeaf.spaceOneOrMore(), // RegexLeaf.spaceOneOrMore(), //
color("BACK2").getRegex())), // color("BACK2").getRegex())), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREO"), //
new RegexLeaf("STEREO", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("\\{?"), // new RegexLeaf("\\{?"), //
RegexLeaf.end()); RegexLeaf.end());
} }

View File

@ -52,6 +52,7 @@ import net.sourceforge.plantuml.regex.RegexOptional;
import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.regex.RegexResult;
import net.sourceforge.plantuml.skin.ColorParam; import net.sourceforge.plantuml.skin.ColorParam;
import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.utils.LineLocation; import net.sourceforge.plantuml.utils.LineLocation;
public class CommandRepeat3 extends SingleLineCommand2<ActivityDiagram3> { public class CommandRepeat3 extends SingleLineCommand2<ActivityDiagram3> {
@ -62,7 +63,7 @@ public class CommandRepeat3 extends SingleLineCommand2<ActivityDiagram3> {
static IRegex getRegexConcat() { static IRegex getRegexConcat() {
return RegexConcat.build(CommandRepeat3.class.getName(), RegexLeaf.start(), // return RegexConcat.build(CommandRepeat3.class.getName(), RegexLeaf.start(), //
new RegexLeaf("STEREO", "(\\<\\<.*\\>\\>)?"), // StereotypePattern.optional("STEREO"), //
ColorParser.exp4(), // ColorParser.exp4(), //
new RegexLeaf("repeat"), // new RegexLeaf("repeat"), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //

View File

@ -89,7 +89,7 @@ public interface FtileFactory {
HColor color, Instruction specialOut, Ftile backward, LinkRendering incoming1, LinkRendering incoming2); HColor color, Instruction specialOut, Ftile backward, LinkRendering incoming1, LinkRendering incoming2);
public Ftile createIf(Swimlane swimlane, List<Branch> thens, Branch elseBranch, LinkRendering outColor, public Ftile createIf(Swimlane swimlane, List<Branch> thens, Branch elseBranch, LinkRendering outColor,
LinkRendering topInlinkRendering, Url url, Collection<PositionedNote> notes); LinkRendering topInlinkRendering, Url url, Collection<PositionedNote> notes, Stereotype stereotype);
public Ftile createSwitch(Swimlane swimlane, List<Branch> branches, LinkRendering afterEndwhile, public Ftile createSwitch(Swimlane swimlane, List<Branch> branches, LinkRendering afterEndwhile,
LinkRendering topInlinkRendering, Display labelTest); LinkRendering topInlinkRendering, Display labelTest);

View File

@ -188,8 +188,8 @@ public class FtileFactoryDelegator implements FtileFactory {
@Override @Override
public Ftile createIf(Swimlane swimlane, List<Branch> thens, Branch elseBranch, LinkRendering afterEndwhile, public Ftile createIf(Swimlane swimlane, List<Branch> thens, Branch elseBranch, LinkRendering afterEndwhile,
LinkRendering topInlinkRendering, Url url, Collection<PositionedNote> notes) { LinkRendering topInlinkRendering, Url url, Collection<PositionedNote> notes, Stereotype stereotype) {
return factory.createIf(swimlane, thens, elseBranch, afterEndwhile, topInlinkRendering, url, notes); return factory.createIf(swimlane, thens, elseBranch, afterEndwhile, topInlinkRendering, url, notes, stereotype);
} }
@Override @Override

View File

@ -48,6 +48,7 @@ import net.sourceforge.plantuml.activitydiagram3.ftile.Swimlane;
import net.sourceforge.plantuml.activitydiagram3.ftile.vcompact.cond.ConditionalBuilder; import net.sourceforge.plantuml.activitydiagram3.ftile.vcompact.cond.ConditionalBuilder;
import net.sourceforge.plantuml.klimt.color.HColor; import net.sourceforge.plantuml.klimt.color.HColor;
import net.sourceforge.plantuml.skin.Pragma; import net.sourceforge.plantuml.skin.Pragma;
import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.style.PName; import net.sourceforge.plantuml.style.PName;
import net.sourceforge.plantuml.style.Style; import net.sourceforge.plantuml.style.Style;
import net.sourceforge.plantuml.svek.ConditionEndStyle; import net.sourceforge.plantuml.svek.ConditionEndStyle;
@ -65,14 +66,14 @@ public class FtileFactoryDelegatorIf extends FtileFactoryDelegator {
@Override @Override
public Ftile createIf(Swimlane swimlane, List<Branch> thens, Branch elseBranch, LinkRendering afterEndwhile, public Ftile createIf(Swimlane swimlane, List<Branch> thens, Branch elseBranch, LinkRendering afterEndwhile,
LinkRendering topInlinkRendering, Url url, Collection<PositionedNote> notes) { LinkRendering topInlinkRendering, Url url, Collection<PositionedNote> notes, Stereotype stereotype) {
final ConditionStyle conditionStyle = skinParam().getConditionStyle(); final ConditionStyle conditionStyle = skinParam().getConditionStyle();
final ConditionEndStyle conditionEndStyle = skinParam().getConditionEndStyle(); final ConditionEndStyle conditionEndStyle = skinParam().getConditionEndStyle();
final Branch branch0 = thens.get(0); final Branch branch0 = thens.get(0);
final Style styleArrow = getDefaultStyleDefinitionArrow().getMergedStyle(skinParam().getCurrentStyleBuilder()); final Style styleArrow = getDefaultStyleDefinitionArrow().getMergedStyle(skinParam().getCurrentStyleBuilder());
final Style styleDiamond = getDefaultStyleDefinitionDiamond() final Style styleDiamond = getDefaultStyleDefinitionDiamond().withTOBECHANGED(stereotype)
.getMergedStyle(skinParam().getCurrentStyleBuilder()); .getMergedStyle(skinParam().getCurrentStyleBuilder());
final HColor backColor = branch0.getColor() == null final HColor backColor = branch0.getColor() == null
? styleDiamond.value(PName.BackGroundColor).asColor(skinParam().getIHtmlColorSet()) ? styleDiamond.value(PName.BackGroundColor).asColor(skinParam().getIHtmlColorSet())

View File

@ -81,9 +81,9 @@ class FtileForkInner extends AbstractFtile {
public static Set<Swimlane> mergeSwimlanes(List<Ftile> tiles) { public static Set<Swimlane> mergeSwimlanes(List<Ftile> tiles) {
final Set<Swimlane> result = new HashSet<>(); final Set<Swimlane> result = new HashSet<>();
for (Ftile tile : tiles) { for (Ftile tile : tiles)
result.addAll(tile.getSwimlanes()); result.addAll(tile.getSwimlanes());
}
return Collections.unmodifiableSet(result); return Collections.unmodifiableSet(result);
} }
@ -105,9 +105,9 @@ class FtileForkInner extends AbstractFtile {
for (Ftile ftile : forks) { for (Ftile ftile : forks) {
final XDimension2D dim = ftile.calculateDimension(stringBounder); final XDimension2D dim = ftile.calculateDimension(stringBounder);
width += dim.getWidth(); width += dim.getWidth();
if (dim.getHeight() > height) { if (dim.getHeight() > height)
height = dim.getHeight(); height = dim.getHeight();
}
} }
final XDimension2D dimTotal = new XDimension2D(width, height); final XDimension2D dimTotal = new XDimension2D(width, height);
return new FtileGeometry(dimTotal, dimTotal.getWidth() / 2, 0, dimTotal.getHeight()); return new FtileGeometry(dimTotal, dimTotal.getWidth() / 2, 0, dimTotal.getHeight());
@ -116,9 +116,9 @@ class FtileForkInner extends AbstractFtile {
public UTranslate getTranslateFor(Ftile searched, StringBounder stringBounder) { public UTranslate getTranslateFor(Ftile searched, StringBounder stringBounder) {
double xpos = 0; double xpos = 0;
for (Ftile ftile : forks) { for (Ftile ftile : forks) {
if (ftile == searched) { if (ftile == searched)
return UTranslate.dx(xpos); return UTranslate.dx(xpos);
}
final XDimension2D dim = ftile.calculateDimension(stringBounder); final XDimension2D dim = ftile.calculateDimension(stringBounder);
xpos += dim.getWidth(); xpos += dim.getWidth();
} }

View File

@ -85,7 +85,7 @@ public class ParallelBuilderFork extends AbstractParallelFtilesBuilder {
Ftile result = middle; Ftile result = middle;
final List<Connection> conns = new ArrayList<>(); final List<Connection> conns = new ArrayList<>();
final Swimlane swimlaneBlack = in; final Swimlane swimlaneBlack = in;
final Style style = getStyleSignature().getMergedStyle(skinParam().getCurrentStyleBuilder()); final Style style = getStyleSignatureArrow().getMergedStyle(skinParam().getCurrentStyleBuilder());
final Ftile black = new FtileBlackBlock(skinParam(), swimlaneBlack); final Ftile black = new FtileBlackBlock(skinParam(), swimlaneBlack);
double x = 0; double x = 0;
for (Ftile tmp : list99) { for (Ftile tmp : list99) {

View File

@ -169,7 +169,7 @@ public class VCompactFactory implements FtileFactory {
@Override @Override
public Ftile createIf(Swimlane swimlane, List<Branch> thens, Branch elseBranch, LinkRendering afterEndwhile, public Ftile createIf(Swimlane swimlane, List<Branch> thens, Branch elseBranch, LinkRendering afterEndwhile,
LinkRendering topInlinkRendering, Url url, Collection<PositionedNote> notes) { LinkRendering topInlinkRendering, Url url, Collection<PositionedNote> notes, Stereotype stereotype) {
final List<Ftile> ftiles = new ArrayList<>(); final List<Ftile> ftiles = new ArrayList<>();
for (Branch branch : thens) for (Branch branch : thens)
ftiles.add(branch.getFtile()); ftiles.add(branch.getFtile());

View File

@ -73,11 +73,11 @@ public class BoardDiagram extends UmlDiagram {
protected ImageData exportDiagramInternal(OutputStream os, int index, FileFormatOption fileFormatOption) protected ImageData exportDiagramInternal(OutputStream os, int index, FileFormatOption fileFormatOption)
throws IOException { throws IOException {
return createImageBuilder(fileFormatOption).drawable(getTextBlock()).write(os); return createImageBuilder(fileFormatOption).drawable(getTextMainBlock(fileFormatOption)).write(os);
} }
@Override @Override
protected TextBlock getTextBlock() { protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) {
return new AbstractTextBlock() { return new AbstractTextBlock() {
public void drawU(UGraphic ug) { public void drawU(UGraphic ug) {

View File

@ -194,7 +194,7 @@ public class BpmDiagram extends UmlDiagram {
} }
@Override @Override
protected TextBlock getTextBlock() { protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
} }

View File

@ -0,0 +1,853 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2024, Arnaud Roques
*
* Project Info: https://plantuml.com
*
* If you like this project or if you find it useful, you can support us at:
*
* https://plantuml.com/patreon (only 1$ per month!)
* https://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.chronology;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import net.sourceforge.plantuml.FileFormatOption;
import net.sourceforge.plantuml.TitledDiagram;
import net.sourceforge.plantuml.WithSprite;
import net.sourceforge.plantuml.command.CommandExecutionResult;
import net.sourceforge.plantuml.core.DiagramDescription;
import net.sourceforge.plantuml.core.ImageData;
import net.sourceforge.plantuml.core.UmlSource;
import net.sourceforge.plantuml.klimt.UTranslate;
import net.sourceforge.plantuml.klimt.color.HColorSet;
import net.sourceforge.plantuml.klimt.drawing.UGraphic;
import net.sourceforge.plantuml.klimt.font.StringBounder;
import net.sourceforge.plantuml.klimt.geom.HorizontalAlignment;
import net.sourceforge.plantuml.klimt.geom.XDimension2D;
import net.sourceforge.plantuml.klimt.shape.AbstractTextBlock;
import net.sourceforge.plantuml.klimt.shape.TextBlock;
import net.sourceforge.plantuml.project.GanttStyle;
import net.sourceforge.plantuml.project.LabelPosition;
import net.sourceforge.plantuml.project.LabelStrategy;
import net.sourceforge.plantuml.project.LoadPlanable;
import net.sourceforge.plantuml.project.TimeHeaderParameters;
import net.sourceforge.plantuml.project.ToTaskDraw;
import net.sourceforge.plantuml.project.core.PrintScale;
import net.sourceforge.plantuml.project.core.Task;
import net.sourceforge.plantuml.project.core.TaskCode;
import net.sourceforge.plantuml.project.core.TaskGroup;
import net.sourceforge.plantuml.project.draw.TaskDraw;
import net.sourceforge.plantuml.project.draw.TaskDrawDiamond;
import net.sourceforge.plantuml.project.draw.TimeHeader;
import net.sourceforge.plantuml.project.time.Day;
import net.sourceforge.plantuml.project.timescale.TimeScale;
import net.sourceforge.plantuml.real.Real;
import net.sourceforge.plantuml.real.RealOrigin;
import net.sourceforge.plantuml.real.RealUtils;
import net.sourceforge.plantuml.skin.UmlDiagramType;
import net.sourceforge.plantuml.style.SName;
import net.sourceforge.plantuml.style.Style;
import net.sourceforge.plantuml.style.StyleSignatureBasic;
public class ChronologyDiagram extends TitledDiagram implements ToTaskDraw, WithSprite, GanttStyle {
private final Map<Task, TaskDraw> draws = new LinkedHashMap<Task, TaskDraw>();
private final Map<TaskCode, Task> tasks = new LinkedHashMap<TaskCode, Task>();
private final Map<String, Task> byShortName = new HashMap<String, Task>();
// private final List<GanttConstraint> constraints = new ArrayList<>();
private final HColorSet colorSet = HColorSet.instance();
//
// private final OpenClose openClose = new OpenClose();
//
// private final Map<String, Resource> resources = new LinkedHashMap<String, Resource>();
// private final Map<Day, HColor> colorDaysToday = new HashMap<Day, HColor>();
// private final Map<Day, HColor> colorDaysInternal = new HashMap<Day, HColor>();
// private final Map<DayOfWeek, HColor> colorDaysOfWeek = new HashMap<DayOfWeek, HColor>();
// private final Map<Day, String> nameDays = new HashMap<Day, String>();
private LabelStrategy labelStrategy = new LabelStrategy(LabelPosition.LEGACY, HorizontalAlignment.LEFT);
//
// // Let's follow ISO-8601 rules
// private WeekNumberStrategy weekNumberStrategy = new WeekNumberStrategy(DayOfWeek.MONDAY, 4);
//
// private PrintScale printScale = PrintScale.DAILY;
// private double factorScale = 1.0;
private Locale locale = Locale.ENGLISH;
//
// private Day today;
// private double totalHeightWithoutFooter;
private Day min;
private Day max;
private TimeScaleChronology timeScale;
//
// private Day printStart;
// private Day printEnd;
//
private final RealOrigin origin = RealUtils.createOrigin();
//
// private int defaultCompletion = 100;
//
// private Task it;
// private Resource they;
public CommandExecutionResult changeLanguage(String lang) {
this.locale = new Locale(lang);
return CommandExecutionResult.ok();
}
public DiagramDescription getDescription() {
return new DiagramDescription("(Chronology)");
}
// public void setWeekNumberStrategy(DayOfWeek firstDayOfWeek, int minimalDaysInFirstWeek) {
// this.weekNumberStrategy = new WeekNumberStrategy(firstDayOfWeek, minimalDaysInFirstWeek);
// }
public ChronologyDiagram(UmlSource source) {
super(source, UmlDiagramType.CHRONOLOGY, null);
}
// public final int getDpi(FileFormatOption fileFormatOption) {
// return 96;
// }
@Override
protected ImageData exportDiagramNow(OutputStream os, int index, FileFormatOption fileFormatOption)
throws IOException {
return createImageBuilder(fileFormatOption).drawable(getTextMainBlock(fileFormatOption)).write(os);
}
// public void setPrintScale(PrintScale printScale) {
// this.printScale = printScale;
// }
//
// public void setFactorScale(double factorScale) {
// this.factorScale = factorScale;
// }
//
// private double getFactorScale() {
// return this.printScale.getDefaultScale() * this.factorScale;
// }
//
// private boolean isHidden(Task task) {
// if (printStart == null || task instanceof TaskSeparator)
// return false;
//
// if (task.getEnd().compareTo(min) < 0)
// return true;
//
// if (task.getStart().compareTo(max) > 0)
// return true;
//
// return false;
// }
//
// @Override
// public String checkFinalError() {
// try {
// initMinMax();
// } catch (ImpossibleSolvingException ex) {
// return ex.getMessage();
// }
// return null;
// }
@Override
protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) {
final StringBounder stringBounder = fileFormatOption.getDefaultStringBounder(getSkinParam());
initMinMax();
final TimeHeader timeHeader = new TimeHeaderChronology(stringBounder, thParam(), PrintScale.DAILY,
this.timeScale);
initTaskAndResourceDraws(timeHeader.getTimeScale(), timeHeader.getFullHeaderHeight(stringBounder),
stringBounder);
return new AbstractTextBlock() {
public XDimension2D calculateDimension(StringBounder stringBounder) {
return new XDimension2D(1000, 1000);
}
@Override
public void drawU(UGraphic ug) {
timeHeader.drawTimeHeader(ug, 200);
drawTasksRect(ug);
drawTasksTitle(ug, 0, 0);
}
};
}
//
// private double getTitlesColumnWidth(StringBounder stringBounder) {
// if (labelStrategy.titleInside())
// return 0;
//
// double width = 0;
// for (Task task : tasks.values()) {
// if (isHidden(task))
// continue;
//
// width = Math.max(width, draws.get(task).getTitleWidth(stringBounder));
// }
// return width;
// }
//
// public XDimension2D calculateDimension(StringBounder stringBounder) {
// return new XDimension2D(getTitlesColumnWidth(stringBounder) + getBarsColumnWidth(timeHeader),
// getTotalHeight(stringBounder, timeHeader));
// }
//
// private double getBarsColumnWidth(final TimeHeader timeHeader) {
// final double xmin = timeHeader.getTimeScale().getStartingPosition(min);
// final double xmax = timeHeader.getTimeScale().getEndingPosition(max);
// return xmax - xmin;
// }
//
// };
// }
//
// private TimeHeader getTimeHeader(StringBounder stringBounder) {
// if (openClose.getStartingDay() == null)
// return new TimeHeaderSimple(stringBounder, thParam(), printScale);
// else if (printScale == PrintScale.DAILY)
// return new TimeHeaderDaily(stringBounder, thParam(), nameDays, printStart, printEnd);
// else if (printScale == PrintScale.WEEKLY)
// return new TimeHeaderWeekly(stringBounder, thParam(), weekNumberStrategy, withCalendarDate);
// else if (printScale == PrintScale.MONTHLY)
// return new TimeHeaderMonthly(stringBounder, thParam());
// else if (printScale == PrintScale.QUARTERLY)
// return new TimeHeaderQuarterly(stringBounder, thParam());
// else if (printScale == PrintScale.YEARLY)
// return new TimeHeaderYearly(stringBounder, thParam());
// else
// throw new IllegalStateException();
//
// }
private TimeHeaderParameters thParam() {
return new TimeHeaderParameters(null, 1, min, max, getIHtmlColorSet(), locale, null, null, null, this);
}
// private Map<Day, HColor> colorDays() {
// colorDaysInternal.putAll(colorDaysToday);
// return Collections.unmodifiableMap(colorDaysInternal);
// }
@Override
public final Style getStyle(SName param) {
return StyleSignatureBasic.of(SName.root, SName.element, SName.ganttDiagram, param)
.getMergedStyle(getCurrentStyleBuilder());
}
@Override
public final Style getStyle(SName param1, SName param2) {
return StyleSignatureBasic.of(SName.root, SName.element, SName.ganttDiagram, param1, param2)
.getMergedStyle(getCurrentStyleBuilder());
}
// private double getTotalHeight(StringBounder stringBounder, TimeHeader timeHeader) {
// if (showFootbox)
// return totalHeightWithoutFooter + timeHeader.getTimeFooterHeight(stringBounder);
//
// return totalHeightWithoutFooter;
// }
private void drawTasksRect(UGraphic ug) {
for (Task task : tasks.values()) {
// if (isHidden(task))
// continue;
final TaskDraw draw = draws.get(task);
final UTranslate move = UTranslate.dy(draw.getY(ug.getStringBounder()).getCurrentValue());
draw.drawU(ug.apply(move));
}
}
// private void drawConstraints(final UGraphic ug, TimeScale timeScale) {
// for (GanttConstraint constraint : constraints) {
// if (printStart != null && constraint.isHidden(min, max))
// continue;
//
// constraint.getUDrawable(timeScale, this).drawU(ug);
// }
//
// }
//
// public StyleSignatureBasic getDefaultStyleDefinitionArrow() {
// return StyleSignatureBasic.of(SName.root, SName.element, SName.ganttDiagram, SName.arrow);
// }
private void drawTasksTitle(UGraphic ug, double colTitles, double colBars) {
for (Task task : tasks.values()) {
// if (isHidden(task))
// continue;
final TaskDraw draw = draws.get(task);
final UTranslate move = UTranslate.dy(draw.getY(ug.getStringBounder()).getCurrentValue());
draw.drawTitle(ug.apply(move), labelStrategy, colTitles, colBars);
}
}
// private void drawResources(UGraphic ug) {
// for (Resource res : resources.values()) {
// final ResourceDraw draw = res.getResourceDraw();
// final UTranslate move = UTranslate.dy(draw.getY());
// draw.drawU(ug.apply(move));
// }
// }
//
// public void closeDayOfWeek(DayOfWeek day, String task) {
// openClose.close(day);
// }
//
// public void openDayOfWeek(DayOfWeek day, String task) {
// if (task.length() == 0)
// openClose.open(day);
// else
// getOpenCloseForTask(task).open(day);
// }
//
// public void closeDayAsDate(Day day, String task) {
// if (task.length() == 0)
// openClose.close(day);
// else
// getOpenCloseForTask(task).close(day);
//
// }
//
// public void openDayAsDate(Day day, String task) {
// if (task.length() == 0)
// openClose.open(day);
// else
// getOpenCloseForTask(task).open(day);
//
// }
//
// private OpenClose getOpenCloseForTask(String task) {
// OpenClose except = openCloseForTask.get(task);
// if (except == null) {
// except = new OpenClose();
// openCloseForTask.put(task, except);
// }
// return except;
// }
//
// private final Map<String, OpenClose> openCloseForTask = new HashMap<>();
//
private void initTaskAndResourceDraws(TimeScale timeScale, double headerHeight, StringBounder stringBounder) {
Real y = origin;
y = y.addFixed(headerHeight);
for (Task task : tasks.values()) {
final TaskDraw draw;
final String disp = task.getCode().getSimpleDisplay();
draw = new TaskDrawDiamond(timeScale, y, disp, task.getStart(), task, this, task.getStyleBuilder());
final double height = draw.getFullHeightTask(stringBounder);
y = y.addAtLeast(height);
// if (task instanceof TaskSeparator) {
// final TaskSeparator taskSeparator = (TaskSeparator) task;
// draw = new TaskDrawSeparator(taskSeparator.getName(), timeScale, y, min, max, task.getStyleBuilder(),
// getSkinParam().getIHtmlColorSet());
// } else if (task instanceof TaskGroup) {
// final TaskGroup taskGroup = (TaskGroup) task;
// draw = new TaskDrawGroup(timeScale, y, taskGroup.getCode().getSimpleDisplay(), getStart(taskGroup),
// getEnd(taskGroup), task, this, task.getStyleBuilder());
// } else {
// final TaskImpl tmp = (TaskImpl) task;
// final String disp = hideResourceName ? tmp.getCode().getSimpleDisplay() : tmp.getPrettyDisplay();
// if (tmp.isDiamond()) {
// draw = new TaskDrawDiamond(timeScale, y, disp, getStart(tmp), task, this, task.getStyleBuilder());
// } else {
// final boolean oddStart = printStart != null && min.compareTo(getStart(tmp)) == 0;
// final boolean oddEnd = printStart != null && max.compareTo(getEnd(tmp)) == 0;
// draw = new TaskDrawRegular(timeScale, y, disp, getStart(tmp), getEnd(tmp), oddStart, oddEnd,
// getSkinParam(), task, this, getConstraints(task), task.getStyleBuilder());
// }
// draw.setColorsAndCompletion(tmp.getColors(), tmp.getCompletion(), tmp.getUrl(), tmp.getNote());
// }
// if (task.getRow() == null)
// y = y.addAtLeast(draw.getFullHeightTask(stringBounder));
//
draws.put(task, draw);
}
// origin.compileNow();
// magicPush(stringBounder);
// double yy = lastY(stringBounder);
// if (yy == 0) {
// yy = headerHeight;
// } else if (this.hideResourceFoobox == false)
// for (Resource res : resources.values()) {
// final ResourceDraw draw = buildResourceDraw(this, res, timeScale, yy, min, max);
// res.setTaskDraw(draw);
// yy += draw.getHeight(stringBounder);
// }
//
// this.totalHeightWithoutFooter = yy;
}
//
// private ResourceDraw buildResourceDraw(ChronologyDiagram gantt, Resource res, TimeScale timeScale, double y, Day min,
// Day max) {
// return new ResourceDrawBasic(gantt, res, timeScale, y, min, max);
// // return new ResourceDrawVersion2(gantt, res, timeScale, y, min, max);
// }
//
// private Collection<GanttConstraint> getConstraints(Task task) {
// final List<GanttConstraint> result = new ArrayList<>();
// for (GanttConstraint constraint : constraints) {
// if (constraint.isOn(task))
// result.add(constraint);
//
// }
// return Collections.unmodifiableCollection(result);
// }
//
// private double lastY(StringBounder stringBounder) {
// double result = 0;
// for (TaskDraw td : draws.values())
// result = Math.max(result, td.getY(stringBounder).getCurrentValue() + td.getHeightMax(stringBounder));
//
// return result;
// }
//
// private void magicPush(StringBounder stringBounder) {
// final List<TaskDraw> notes = new ArrayList<>();
// for (TaskDraw td : draws.values()) {
// final FingerPrint taskPrint = td.getFingerPrint(stringBounder);
// final FingerPrint fingerPrintNote = td.getFingerPrintNote(stringBounder);
//
// if (td.getTrueRow() == null)
// for (TaskDraw note : notes) {
// final FingerPrint otherNote = note.getFingerPrintNote(stringBounder);
// final double deltaY = otherNote.overlap(taskPrint);
// if (deltaY > 0) {
// final Real bottom = note.getY(stringBounder).addAtLeast(note.getHeightMax(stringBounder));
// td.getY(stringBounder).ensureBiggerThan(bottom);
// origin.compileNow();
// }
//
// }
//
// if (fingerPrintNote != null)
// notes.add(td);
//
// }
// }
//
// private Day getStart(final Task tmp) {
// if (printStart == null)
// return tmp.getStart();
//
// return Day.max(min, tmp.getStart());
// }
//
// private Day getEnd(final Task tmp) {
// if (printStart == null)
// return tmp.getEnd();
//
// return Day.min(max, tmp.getEnd());
// }
//
private void initMinMax() {
if (tasks.size() == 0) {
throw new IllegalStateException();
}
for (Task task : tasks.values()) {
if (this.min == null || this.max == null) {
this.min = task.getStart();
this.max = task.getEnd();
continue;
}
if (this.min.compareTo(task.getStart()) > 0)
this.min = task.getStart();
if (this.max.compareTo(task.getEnd()) < 0)
this.max = task.getEnd();
}
this.min = this.min.roundDayDown();
this.max = this.max.roundDayUp();
this.timeScale = new TimeScaleChronology(1000);
this.timeScale.setMin(this.min.getMillis());
this.timeScale.setMax(this.max.getMillis());
}
// public Day getThenDate() {
// Day result = getStartingDate();
// for (Day d : colorDays().keySet())
// if (d.compareTo(result) > 0)
// result = d;
//
// for (Day d : nameDays.keySet())
// if (d.compareTo(result) > 0)
// result = d;
//
// return result;
// }
//
// public Task getExistingTask(String id) {
// final Task result = byShortName.get(Objects.requireNonNull(id));
// if (result != null)
// return result;
//
// final TaskCode code = new TaskCode(id);
// return tasks.get(code);
// }
//
// public GanttConstraint forceTaskOrder(Task task1, Task task2) {
// final TaskInstant end1 = new TaskInstant(task1, TaskAttribute.END);
// task2.setStart(end1.getInstantPrecise());
// final GanttConstraint result = new GanttConstraint(this.getIHtmlColorSet(),
// getSkinParam().getCurrentStyleBuilder(), end1, new TaskInstant(task2, TaskAttribute.START));
// addContraint(result);
// return result;
// }
public Task getOrCreateTask(String codeOrShortName, String shortName, boolean linkedToPrevious) {
Objects.requireNonNull(codeOrShortName);
Task result = shortName == null ? null : byShortName.get(shortName);
if (result != null)
return result;
result = byShortName.get(codeOrShortName);
if (result != null)
return result;
final TaskCode code = new TaskCode(codeOrShortName);
result = tasks.get(code);
if (result == null) {
result = new TaskChronology(getSkinParam().getCurrentStyleBuilder(), code);
if (currentGroup != null)
currentGroup.addTask(result);
tasks.put(code, result);
if (byShortName != null)
byShortName.put(shortName, result);
}
return result;
}
// private Task getLastCreatedTask() {
// final List<Task> all = new ArrayList<>(tasks.values());
// for (int i = all.size() - 1; i >= 0; i--)
// if (all.get(i) instanceof TaskImpl)
// return all.get(i);
//
// return null;
// }
//
// public void addSeparator(String comment) {
// TaskSeparator separator = new TaskSeparator(getSkinParam().getCurrentStyleBuilder(), comment, tasks.size());
// tasks.put(separator.getCode(), separator);
// }
//
private TaskGroup currentGroup = null;
//
// public CommandExecutionResult addGroup(String name) {
// TaskGroup group = new TaskGroup(this.currentGroup, getSkinParam().getCurrentStyleBuilder(), name);
//
// if (this.currentGroup != null)
// this.currentGroup.addTask(group);
//
// this.currentGroup = group;
// tasks.put(group.getCode(), group);
// return CommandExecutionResult.ok();
// }
//
// public CommandExecutionResult endGroup() {
// if (this.currentGroup == null)
// return CommandExecutionResult.error("No group to be closed");
//
// this.currentGroup = this.currentGroup.getParent();
//
// return CommandExecutionResult.ok();
// }
//
// public void addContraint(GanttConstraint constraint) {
// constraints.add(constraint);
// }
//
// public HColorSet getIHtmlColorSet() {
// return colorSet;
// }
//
// public void setProjectStartingDate(Day start) {
// openClose.setStartingDay(start);
// this.min = start;
// }
//
// public Day getStartingDate() {
// if (openClose.getStartingDay() == null)
// return min;
//
// return openClose.getStartingDay();
// }
//
// public Day getEndingDate() {
// initMinMax();
// return max;
// }
//
// public int daysInWeek() {
// return openClose.daysInWeek();
// }
//
// public boolean isOpen(Day day) {
// return openClose.getLoadAt(day) > 0;
// }
//
// public boolean affectResource(Task result, String description) {
// final Pattern p = Pattern.compile("([^:]+)(:(\\d+))?");
// final Matcher m = p.matcher(description);
// if (m.find() == false)
// throw new IllegalArgumentException();
//
// final Resource resource = getResource(m.group(1));
// int percentage = 100;
// if (m.group(3) != null)
// percentage = Integer.parseInt(m.group(3));
//
// if (percentage == 0)
// return false;
//
// result.addResource(resource, percentage);
// return true;
// }
//
// public Resource getResource(String resourceName) {
// Resource resource = resources.get(resourceName);
// if (resource == null)
// resource = new Resource(resourceName);
//
// resources.put(resourceName, resource);
// return resource;
// }
//
// public int getLoadForResource(Resource res, Day i) {
// int result = 0;
// for (Task task : tasks.values()) {
// if (task instanceof TaskSeparator)
// continue;
//
// final TaskImpl task2 = (TaskImpl) task;
// result += task2.loadForResource(res, i);
// }
// return result;
// }
//
// public Moment getExistingMoment(String id) {
// Moment result = getExistingTask(id);
// if (result == null) {
// Day start = null;
// Day end = null;
// for (Map.Entry<Day, String> ent : nameDays.entrySet()) {
// if (ent.getValue().equalsIgnoreCase(id) == false)
// continue;
//
// start = min(start, ent.getKey());
// end = max(end, ent.getKey());
// }
// if (start != null)
// result = new MomentImpl(start, end);
//
// }
// return result;
// }
//
// private Day min(Day d1, Day d2) {
// if (d1 == null)
// return d2;
//
// if (d1.compareTo(d2) > 0)
// return d2;
//
// return d1;
// }
//
// private Day max(Day d1, Day d2) {
// if (d1 == null)
// return d2;
//
// if (d1.compareTo(d2) < 0)
// return d2;
//
// return d1;
// }
//
// public void colorDay(Day day, HColor color) {
// colorDaysInternal.put(day, color);
// }
//
// public void colorDay(DayOfWeek day, HColor color) {
// colorDaysOfWeek.put(day, color);
// }
//
// public void nameDay(Day day, String name) {
// nameDays.put(day, name);
// }
//
// public Day getToday() {
// if (today == null)
// this.today = Day.today();
//
// return today;
// }
//
// public void setTodayColors(CenterBorderColor colors) {
// if (today == null)
// this.today = Day.today();
//
// colorDaysToday.put(today, colors.getCenter());
// }
//
// public CommandExecutionResult setToday(Day date) {
// this.today = date;
// return CommandExecutionResult.ok();
// }
//
// public CommandExecutionResult deleteTask(Task task) {
// task.setColors(new CenterBorderColor(HColors.WHITE, HColors.BLACK));
// return CommandExecutionResult.ok();
// }
//
// public void setPrintInterval(Day start, Day end) {
// this.printStart = start;
// this.printEnd = end;
// }
//
// public TaskDraw getTaskDraw(Task task) {
// return draws.get(task);
// }
//
// public CommandExecutionResult addNote(Display note) {
// Task last = null;
// for (Task current : tasks.values())
// last = current;
// if (last == null)
// return CommandExecutionResult.error("No task defined");
//
// last.setNote(note);
// return CommandExecutionResult.ok();
// }
public LoadPlanable getDefaultPlan() {
throw new UnsupportedOperationException();
}
@Override
public TaskDraw getTaskDraw(Task task) {
// TODO Auto-generated method stub
return null;
}
@Override
public HColorSet getIHtmlColorSet() {
return colorSet;
}
// private boolean showFootbox = true;
//
// public void setShowFootbox(boolean footbox) {
// this.showFootbox = footbox;
//
// }
//
// @Override
// public ClockwiseTopRightBottomLeft getDefaultMargins() {
// return ClockwiseTopRightBottomLeft.none();
// }
//
// public void setLabelStrategy(LabelStrategy strategy) {
// this.labelStrategy = strategy;
// }
//
// private boolean withCalendarDate;
//
// public void setWithCalendarDate(boolean withCalendarDate) {
// this.withCalendarDate = withCalendarDate;
// }
//
// private boolean hideResourceName;
// private boolean hideResourceFoobox;
//
// public CommandExecutionResult hideResourceName() {
// this.hideResourceName = true;
// return CommandExecutionResult.ok();
// }
//
// public CommandExecutionResult hideResourceFootbox() {
// this.hideResourceFoobox = true;
// return CommandExecutionResult.ok();
// }
//
// private final Set<Day> verticalSeparatorBefore = new HashSet<>();
//
// public void addVerticalSeparatorBefore(Day day) {
// verticalSeparatorBefore.add(day);
// }
//
// public void setTaskDefaultCompletion(int defaultCompletion) {
// this.defaultCompletion = defaultCompletion;
// }
//
// public List<TaskDrawRegular> getAllTasksForResource(Resource res) {
// final List<TaskDrawRegular> result = new ArrayList<TaskDrawRegular>();
// for (Task task : tasks.values())
// if (task.isAssignedTo(res)) {
// final TaskDrawRegular draw = (TaskDrawRegular) draws.get(task);
// result.add(draw);
// }
//
// return Collections.unmodifiableList(result);
// }
//
// public void setIt(Task result) {
// this.it = result;
// }
//
// public Task getIt() {
// return it;
// }
//
// public final Resource getThey() {
// return they;
// }
//
// public final void setThey(Resource they) {
// this.they = they;
// }
}

View File

@ -0,0 +1,126 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2024, Arnaud Roques
*
* Project Info: https://plantuml.com
*
* If you like this project or if you find it useful, you can support us at:
*
* https://plantuml.com/patreon (only 1$ per month!)
* https://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.chronology;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import net.sourceforge.plantuml.command.Command;
import net.sourceforge.plantuml.command.CommonCommands;
import net.sourceforge.plantuml.command.PSystemCommandFactory;
import net.sourceforge.plantuml.core.DiagramType;
import net.sourceforge.plantuml.core.UmlSource;
import net.sourceforge.plantuml.project.command.NaturalCommand;
import net.sourceforge.plantuml.project.lang.SentenceAnd;
import net.sourceforge.plantuml.project.lang.SentenceAndAnd;
import net.sourceforge.plantuml.project.lang.SentenceSimple;
import net.sourceforge.plantuml.project.lang.Subject;
public class ChronologyDiagramFactory extends PSystemCommandFactory {
static private final List<Subject<ChronologyDiagram>> subjects() {
return Arrays.asList(SubjectTask.ME);
}
public ChronologyDiagramFactory() {
super(DiagramType.CHRONOLOGY);
}
@Override
protected void initCommandsList(List<Command> cmds) {
CommonCommands.addTitleCommands(cmds);
CommonCommands.addCommonCommands2(cmds);
// cmds.add(CommandStyleMultilinesCSS.ME);
// cmds.add(CommandStyleImport.ME);
//
// cmds.add(CommandNope.ME);
addLanguageCommands(cmds);
// cmds.add(new CommandGanttArrow());
// cmds.add(new CommandGanttArrow2());
// cmds.add(new CommandColorTask());
// cmds.add(new CommandSeparator());
// cmds.add(new CommandWeekNumberStrategy());
// cmds.add(new CommandGroupStart());
// cmds.add(new CommandGroupEnd());
//
// cmds.add(new CommandLanguage());
// cmds.add(new CommandPrintScale());
// cmds.add(new CommandPrintBetween());
// cmds.add(new CommandNoteBottom());
// cmds.add(new CommandFootbox());
// cmds.add(new CommandLabelOnColumn());
// cmds.add(new CommandHideResourceName());
// cmds.add(new CommandHideResourceFootbox());
// cmds.add(new CommandTaskCompleteDefault());
}
private void addLanguageCommands(List<Command> cmd) {
for (Subject<ChronologyDiagram> subject : subjects())
for (SentenceSimple<ChronologyDiagram> sentenceA : subject.getSentences()) {
cmd.add(NaturalCommand.create(sentenceA));
for (SentenceSimple<ChronologyDiagram> sentenceB : subject.getSentences()) {
final String signatureA = sentenceA.getSignature();
final String signatureB = sentenceB.getSignature();
if (signatureA.equals(signatureB) == false)
cmd.add(NaturalCommand.create(new SentenceAnd<ChronologyDiagram>(sentenceA, sentenceB)));
}
}
for (Subject<ChronologyDiagram> subject : subjects())
for (SentenceSimple<ChronologyDiagram> sentenceA : subject.getSentences())
for (SentenceSimple<ChronologyDiagram> sentenceB : subject.getSentences())
for (SentenceSimple<ChronologyDiagram> sentenceC : subject.getSentences()) {
final String signatureA = sentenceA.getSignature();
final String signatureB = sentenceB.getSignature();
final String signatureC = sentenceC.getSignature();
if (signatureA.equals(signatureB) == false && signatureA.equals(signatureC) == false
&& signatureC.equals(signatureB) == false)
cmd.add(NaturalCommand
.create(new SentenceAndAnd<ChronologyDiagram>(sentenceA, sentenceB, sentenceC)));
}
}
@Override
public ChronologyDiagram createEmptyDiagram(UmlSource source, Map<String, String> skinParam) {
return new ChronologyDiagram(source);
}
}

View File

@ -0,0 +1,54 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2024, Arnaud Roques
*
* Project Info: https://plantuml.com
*
* If you like this project or if you find it useful, you can support us at:
*
* https://plantuml.com/patreon (only 1$ per month!)
* https://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.chronology;
import net.sourceforge.plantuml.project.Failable;
import net.sourceforge.plantuml.project.lang.Something;
import net.sourceforge.plantuml.regex.IRegex;
import net.sourceforge.plantuml.regex.RegexLeaf;
import net.sourceforge.plantuml.regex.RegexResult;
public class ComplementAnything implements Something<ChronologyDiagram> {
public IRegex toRegex(String suffix) {
return new RegexLeaf("ANYTHING" + suffix, "(.*?)");
}
public Failable<String> getMe(ChronologyDiagram system, RegexResult arg, String suffix) {
final String value = arg.get("ANYTHING" + suffix, 0);
return Failable.ok(value);
}
}

View File

@ -0,0 +1,84 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2024, Arnaud Roques
*
* Project Info: https://plantuml.com
*
* If you like this project or if you find it useful, you can support us at:
*
* https://plantuml.com/patreon (only 1$ per month!)
* https://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.chronology;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import net.sourceforge.plantuml.project.Failable;
import net.sourceforge.plantuml.project.lang.Something;
import net.sourceforge.plantuml.project.time.Day;
import net.sourceforge.plantuml.regex.IRegex;
import net.sourceforge.plantuml.regex.RegexConcat;
import net.sourceforge.plantuml.regex.RegexLeaf;
import net.sourceforge.plantuml.regex.RegexOptional;
import net.sourceforge.plantuml.regex.RegexResult;
public class ComplementHour implements Something<ChronologyDiagram> {
// [Task1] starts at 2023-11-28 15:41:21, ends at 2023-11-28 19:40:00
static private final SimpleDateFormat inputFormat;
static private final SimpleDateFormat inputFormat2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
static {
inputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
inputFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
}
public IRegex toRegex(String suffix) {
return new RegexConcat( //
new RegexLeaf("TIME", "(\\d+-\\d+-\\d+ \\d+:\\d+:\\d+)"), //
new RegexOptional(new RegexLeaf("MS", "\\.(\\d+)")) //
); //
}
public Failable<Day> getMe(ChronologyDiagram system, RegexResult arg, String suffix) {
final String value = arg.get("TIME", 0);
System.err.println("value=" + value);
try {
final Date date = inputFormat.parse(value);
return Failable.ok(Day.create(date.getTime()));
} catch (ParseException e) {
e.printStackTrace();
}
throw new IllegalStateException();
}
}

View File

@ -0,0 +1,136 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2024, Arnaud Roques
*
* Project Info: https://plantuml.com
*
* If you like this project or if you find it useful, you can support us at:
*
* https://plantuml.com/patreon (only 1$ per month!)
* https://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.chronology;
import net.sourceforge.plantuml.project.time.Day;
import net.sourceforge.plantuml.project.time.Month;
import net.sourceforge.plantuml.regex.IRegex;
import net.sourceforge.plantuml.regex.RegexConcat;
import net.sourceforge.plantuml.regex.RegexLeaf;
import net.sourceforge.plantuml.regex.RegexOr;
import net.sourceforge.plantuml.regex.RegexResult;
public class HourPattern {
private final String id;
private final String yearKeyA;
private final String yearKeyB;
private final String yearKeyC;
private final String monthKeyA;
private final String monthKeyB;
private final String monthKeyC;
private final String dayKeyA;
private final String dayKeyB;
private final String dayKeyC;
public HourPattern(String id) {
this.id = id;
this.yearKeyA = "AYEAR" + id;
this.yearKeyB = "BYEAR" + id;
this.yearKeyC = "CYEAR" + id;
this.monthKeyA = "AMONTH" + id;
this.monthKeyB = "BMONTH" + id;
this.monthKeyC = "CMONTH" + id;
this.dayKeyA = "ADAY" + id;
this.dayKeyB = "BDAY" + id;
this.dayKeyC = "CDAY" + id;
}
public IRegex toRegex() {
return new RegexOr(toRegexA_DD_MONTH_YYYY(), toRegexB_YYYY_MM_DD(), toRegexC_MONTH_DD_YYYY());
}
public Day getDay(RegexResult arg) {
if (arg.get(dayKeyA, 0) != null)
return resultA(arg);
if (arg.get(dayKeyB, 0) != null)
return resultB(arg);
if (arg.get(dayKeyC, 0) != null)
return resultC(arg);
return null;
}
private IRegex toRegexA_DD_MONTH_YYYY() {
return new RegexConcat( //
new RegexLeaf(dayKeyA, "([\\d]{1,2})"), //
new RegexLeaf("[\\w, ]*?"), //
new RegexLeaf(monthKeyA, "(" + Month.getRegexString() + ")"), //
new RegexLeaf("[\\w, ]*?"), //
new RegexLeaf(yearKeyA, "([\\d]{1,4})"));
}
private Day resultA(RegexResult arg) {
final int day = Integer.parseInt(arg.get(dayKeyA, 0));
final String month = arg.get(monthKeyA, 0);
final int year = Integer.parseInt(arg.get(yearKeyA, 0));
return Day.create(year, month, day);
}
private IRegex toRegexB_YYYY_MM_DD() {
return new RegexConcat( //
new RegexLeaf(yearKeyB, "([\\d]{1,4})"), //
new RegexLeaf("\\D"), //
new RegexLeaf(monthKeyB, "([\\d]{1,2})"), //
new RegexLeaf("\\D"), //
new RegexLeaf(dayKeyB, "([\\d]{1,2})"));
}
private Day resultB(RegexResult arg) {
final int day = Integer.parseInt(arg.get(dayKeyB, 0));
final int month = Integer.parseInt(arg.get(monthKeyB, 0));
final int year = Integer.parseInt(arg.get(yearKeyB, 0));
return Day.create(year, month, day);
}
private IRegex toRegexC_MONTH_DD_YYYY() {
return new RegexConcat( //
new RegexLeaf(monthKeyC, "(" + Month.getRegexString() + ")"), //
new RegexLeaf("[\\w, ]*?"), //
new RegexLeaf(dayKeyC, "([\\d]{1,2})"), //
new RegexLeaf("[\\w, ]*?"), //
new RegexLeaf(yearKeyC, "([\\d]{1,4})"));
}
private Day resultC(RegexResult arg) {
final int day = Integer.parseInt(arg.get(dayKeyC, 0));
final String month = arg.get(monthKeyC, 0);
final int year = Integer.parseInt(arg.get(yearKeyC, 0));
return Day.create(year, month, day);
}
}

View File

@ -0,0 +1,60 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2024, Arnaud Roques
*
* Project Info: https://plantuml.com
*
* If you like this project or if you find it useful, you can support us at:
*
* https://plantuml.com/patreon (only 1$ per month!)
* https://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.chronology;
import net.sourceforge.plantuml.command.CommandExecutionResult;
import net.sourceforge.plantuml.project.core.Task;
import net.sourceforge.plantuml.project.lang.SentenceSimple;
import net.sourceforge.plantuml.project.lang.Verbs;
import net.sourceforge.plantuml.project.lang.Words;
import net.sourceforge.plantuml.project.time.Day;
public class SentenceHappensChronology extends SentenceSimple<ChronologyDiagram> {
public SentenceHappensChronology() {
super(SubjectTask.ME, Verbs.happens, Words.zeroOrMore(Words.THE, Words.ON, Words.AT), new ComplementHour());
}
@Override
public CommandExecutionResult execute(ChronologyDiagram project, Object subject, Object complement) {
final Task task = (Task) subject;
final Day start = (Day) complement;
task.setStart(start);
task.setEnd(start);
return CommandExecutionResult.ok();
}
}

View File

@ -0,0 +1,92 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2024, Arnaud Roques
*
* Project Info: https://plantuml.com
*
* If you like this project or if you find it useful, you can support us at:
*
* https://plantuml.com/patreon (only 1$ per month!)
* https://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.chronology;
import java.util.Arrays;
import java.util.Collection;
import net.sourceforge.plantuml.project.Failable;
import net.sourceforge.plantuml.project.core.Task;
import net.sourceforge.plantuml.project.lang.SentenceSimple;
import net.sourceforge.plantuml.project.lang.Subject;
import net.sourceforge.plantuml.project.lang.Words;
import net.sourceforge.plantuml.regex.IRegex;
import net.sourceforge.plantuml.regex.RegexConcat;
import net.sourceforge.plantuml.regex.RegexLeaf;
import net.sourceforge.plantuml.regex.RegexOptional;
import net.sourceforge.plantuml.regex.RegexOr;
import net.sourceforge.plantuml.regex.RegexResult;
import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
public class SubjectTask implements Subject<ChronologyDiagram> {
public static final Subject<ChronologyDiagram> ME = new SubjectTask();
private SubjectTask() {
}
public Failable<Task> getMe(ChronologyDiagram chronology, RegexResult arg) {
final Task result;
final String subject = arg.get("SUBJECT", 0);
final String shortName = arg.get("SHORTNAME", 0);
final String stereotype = arg.get("STEREOTYPE", 0);
result = chronology.getOrCreateTask(subject, shortName, false);
if (stereotype != null)
result.setStereotype(Stereotype.build(arg.get("STEREOTYPE", 0)));
return Failable.ok(result);
}
public Collection<? extends SentenceSimple<ChronologyDiagram>> getSentences() {
return Arrays.asList(new SentenceHappensChronology());
}
public IRegex toRegex() {
return new RegexOr( //
new RegexLeaf("SUBJECT", "\\[([^\\[\\]]+?)\\]"), //
StereotypePattern.optional("STEREOTYPE"), //
new RegexOptional(new RegexConcat(//
Words.exactly(Words.AS), //
RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("SHORTNAME", "\\[([^\\[\\]]+?)\\]"))) //
);
}
}

View File

@ -0,0 +1,372 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2024, Arnaud Roques
*
* Project Info: https://plantuml.com
*
* If you like this project or if you find it useful, you can support us at:
*
* https://plantuml.com/patreon (only 1$ per month!)
* https://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.chronology;
import net.sourceforge.plantuml.klimt.creole.Display;
import net.sourceforge.plantuml.project.Load;
import net.sourceforge.plantuml.project.core.AbstractTask;
import net.sourceforge.plantuml.project.core.Resource;
import net.sourceforge.plantuml.project.core.Task;
import net.sourceforge.plantuml.project.core.TaskCode;
import net.sourceforge.plantuml.project.lang.CenterBorderColor;
import net.sourceforge.plantuml.project.time.Day;
import net.sourceforge.plantuml.project.time.DayOfWeek;
import net.sourceforge.plantuml.style.StyleBuilder;
import net.sourceforge.plantuml.url.Url;
public class TaskChronology extends AbstractTask implements Task {
private Display note;
private Url url;
private CenterBorderColor[] colors;
private Day start;
private Day end;
public void setUrl(Url url) {
this.url = url;
}
public TaskChronology(StyleBuilder styleBuilder, TaskCode code) {
super(styleBuilder, code);
}
@Override
public void setStart(Day start) {
this.start = start;
}
@Override
public Day getStart() {
return this.start;
}
@Override
public void setEnd(Day end) {
this.end = end;
}
@Override
public Day getEnd() {
return this.end;
}
@Override
public Load getLoad() {
throw new UnsupportedOperationException();
}
@Override
public void setLoad(Load load) {
throw new UnsupportedOperationException();
}
@Override
public void addResource(Resource resource, int percentage) {
throw new UnsupportedOperationException();
}
@Override
public void setDiamond(boolean diamond) {
throw new UnsupportedOperationException();
}
@Override
public boolean isDiamond() {
return false;
}
@Override
public void setCompletion(int completion) {
throw new UnsupportedOperationException();
}
@Override
public void addPause(Day pause) {
throw new UnsupportedOperationException();
}
@Override
public void addPause(DayOfWeek pause) {
throw new UnsupportedOperationException();
}
@Override
public boolean isAssignedTo(Resource res) {
throw new UnsupportedOperationException();
}
// @Override
// public int getLoadAt(Day instant) {
// if (isPaused(instant))
// return 0;
//
// LoadPlanable result = defaultPlan;
// if (resources.size() > 0)
// result = PlanUtils.multiply(defaultPlan, getResourcePlan());
//
// return result.getLoadAt(instant);
// }
//
// private boolean isPaused(Day instant) {
// if (pausedDay.contains(instant))
// return true;
//
// if (pausedDayOfWeek(instant))
// return true;
//
// return false;
// }
//
// private boolean pausedDayOfWeek(Day instant) {
// for (DayOfWeek dayOfWeek : pausedDayOfWeek)
// if (instant.getDayOfWeek() == dayOfWeek)
// return true;
//
// return false;
// }
//
// public int loadForResource(Resource res, Day instant) {
// if (resources.keySet().contains(res) && instant.compareTo(getStart()) >= 0
// && instant.compareTo(getEnd()) <= 0) {
// if (isPaused(instant))
// return 0;
//
// if (res.isClosedAt(instant))
// return 0;
//
// return resources.get(res);
// }
// return 0;
// }
//
// @Override
// public void addPause(Day pause) {
// this.pausedDay.add(pause);
// }
//
// @Override
// public void addPause(DayOfWeek pause) {
// this.pausedDayOfWeek.add(pause);
// }
//
// private LoadPlanable getResourcePlan() {
// if (resources.size() == 0)
// throw new IllegalStateException();
//
// return new LoadPlanable() {
// public int getLoadAt(Day instant) {
// int result = 0;
// for (Map.Entry<Resource, Integer> ent : resources.entrySet()) {
// final Resource res = ent.getKey();
// if (res.isClosedAt(instant))
// continue;
//
// final int percentage = ent.getValue();
// result += percentage;
// }
// return result;
// }
//
// @Override
// public Day getLastDayIfAny() {
// return TaskChronology.this.getLastDayIfAny();
// }
// };
// }
//
// @Override
// public Day getLastDayIfAny() {
// Day result = null;
//
// for (Resource res : resources.keySet()) {
// if (res.getLastDayIfAny() == null)
// return null;
//
// if (result == null || result.compareTo(res.getLastDayIfAny()) < 0)
// result = res.getLastDayIfAny();
// }
//
// return result;
// }
//
// public String getPrettyDisplay() {
// if (resources.size() > 0) {
// final StringBuilder result = new StringBuilder(getCode().getSimpleDisplay());
// result.append(" ");
// for (Iterator<Map.Entry<Resource, Integer>> it = resources.entrySet().iterator(); it.hasNext();) {
// final Map.Entry<Resource, Integer> ent = it.next();
// result.append("{");
// result.append(ent.getKey().getName());
// final int percentage = ent.getValue();
// if (percentage != 100)
// result.append(":" + percentage + "%");
//
// result.append("}");
// if (it.hasNext())
// result.append(" ");
//
// }
// return result.toString();
// }
// return getCode().getSimpleDisplay();
// }
//
// @Override
// public String toString() {
// return getCode().toString();
// }
//
// public String debug() {
// return "" + getStart() + " ---> " + getEnd() + " [" + getLoad() + "]";
// }
//
// @Override
// public Day getStart() {
// Day result = (Day) solver.getData(TaskAttribute.START);
// if (diamond == false)
// while (getLoadAt(result) == 0)
// result = result.increment();
//
// return result;
// }
//
// @Override
// public Day getEnd() {
// return (Day) solver.getData(TaskAttribute.END);
// }
//
// @Override
// public Load getLoad() {
// return (Load) solver.getData(TaskAttribute.LOAD);
// }
//
// @Override
// public void setLoad(Load load) {
// solver.setData(TaskAttribute.LOAD, load);
// }
//
// @Override
// public void setStart(Day start) {
// solver.setData(TaskAttribute.START, start);
// }
//
// @Override
// public void setEnd(Day end) {
// solver.setData(TaskAttribute.END, end);
// }
@Override
public void setColors(CenterBorderColor... colors) {
this.colors = colors;
}
// @Override
// public void addResource(Resource resource, int percentage) {
// this.resources.put(resource, percentage);
// }
//
// @Override
// public void setDiamond(boolean diamond) {
// this.diamond = diamond;
// }
//
// @Override
// public boolean isDiamond() {
// return this.diamond;
// }
//
// @Override
// public void setCompletion(int completion) {
// this.completion = completion;
// }
//
// public final Url getUrl() {
// return url;
// }
//
// public final CenterBorderColor getColors() {
// if (colors == null)
// return null;
//
// if (colors.length == 1)
// return colors[0];
//
// return colors[0].unlinearTo(colors[1], completion);
// }
//
// public final int getCompletion() {
// return completion;
// }
//
// public final Collection<Day> getAllPaused() {
// final SortedSet<Day> result = new TreeSet<>(pausedDay);
// for (DayOfWeek dayOfWeek : pausedDayOfWeek)
// addAll(result, dayOfWeek);
//
// return Collections.unmodifiableCollection(result);
// }
//
// private void addAll(SortedSet<Day> result, DayOfWeek dayOfWeek) {
// final Day start = getStart();
// final Day end = getEnd();
// for (Day current = start; current.compareTo(end) <= 0; current = current.increment())
// if (current.getDayOfWeek() == dayOfWeek)
// result.add(current);
//
// }
@Override
public void setNote(Display note) {
this.note = note;
}
public Display getNote() {
return note;
}
// public LoadPlanable getDefaultPlan() {
// return defaultPlan;
// }
//
// @Override
// public boolean isAssignedTo(Resource res) {
// return resources.containsKey(res);
// }
}

View File

@ -0,0 +1,197 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2024, Arnaud Roques
*
* Project Info: https://plantuml.com
*
* If you like this project or if you find it useful, you can support us at:
*
* https://plantuml.com/patreon (only 1$ per month!)
* https://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.chronology;
import net.sourceforge.plantuml.klimt.UTranslate;
import net.sourceforge.plantuml.klimt.color.HColor;
import net.sourceforge.plantuml.klimt.creole.Display;
import net.sourceforge.plantuml.klimt.drawing.UGraphic;
import net.sourceforge.plantuml.klimt.font.FontConfiguration;
import net.sourceforge.plantuml.klimt.font.StringBounder;
import net.sourceforge.plantuml.klimt.font.UFont;
import net.sourceforge.plantuml.klimt.geom.HorizontalAlignment;
import net.sourceforge.plantuml.klimt.shape.TextBlock;
import net.sourceforge.plantuml.klimt.shape.ULine;
import net.sourceforge.plantuml.klimt.sprite.SpriteContainerEmpty;
import net.sourceforge.plantuml.project.TimeHeaderParameters;
import net.sourceforge.plantuml.project.core.PrintScale;
import net.sourceforge.plantuml.project.draw.TimeHeader;
import net.sourceforge.plantuml.project.time.Day;
import net.sourceforge.plantuml.project.timescale.TimeScale;
import net.sourceforge.plantuml.style.PName;
import net.sourceforge.plantuml.style.SName;
public class TimeHeaderChronology extends TimeHeader {
private final PrintScale printScale;
@Override
public double getFullHeaderHeight(StringBounder stringBounder) {
return getTimeHeaderHeight(stringBounder) + getHeaderNameDayHeight();
}
@Override
public double getTimeHeaderHeight(StringBounder stringBounder) {
final double h = thParam.getStyle(SName.timeline, SName.day).value(PName.FontSize).asDouble();
return h + 6;
}
@Override
public double getTimeFooterHeight(StringBounder stringBounder) {
final double h = thParam.getStyle(SName.timeline, SName.day).value(PName.FontSize).asDouble();
return h + 6;
}
private double getHeaderNameDayHeight() {
return 0;
}
public TimeHeaderChronology(StringBounder stringBounder, TimeHeaderParameters thParam, PrintScale printScale,
TimeScaleChronology timeScale) {
super(thParam, timeScale);
this.printScale = printScale;
}
private void drawSmallVlinesDay(UGraphic ug, TimeScale timeScale, double totalHeightWithoutFooter) {
ug = ug.apply(getLineColor());
ug = ug.apply(UTranslate.dy(6));
final ULine vbar = ULine.vline(totalHeightWithoutFooter + 2);
for (Day i = getMin(); i.compareTo(getMax().increment()) < 0; i = i.increment(printScale)) {
final double x1 = timeScale.getStartingPosition(i);
ug.apply(UTranslate.dx(x1)).draw(vbar);
}
}
private void drawSimpleDayCounter(UGraphic ug, TimeScale timeScale) {
for (Day i = getMin(); i.compareTo(getMax().increment()) < 0; i = i.increment(printScale)) {
final UFont font = thParam.getStyle(SName.timeline, SName.day).getUFont();
final FontConfiguration fontConfiguration = getFontConfiguration(font, false, openFontColor());
final TextBlock num = Display.getWithNewlines(i.toStringShort(thParam.getLocale()))
.create(fontConfiguration, HorizontalAlignment.LEFT, new SpriteContainerEmpty());
final double x1 = timeScale.getStartingPosition(i);
final double x2;
if (printScale == PrintScale.WEEKLY)
x2 = timeScale.getEndingPosition(i.addDays(6));
else
x2 = timeScale.getEndingPosition(i);
final double width = num.calculateDimension(ug.getStringBounder()).getWidth();
final double delta = (x2 - x1) - width;
if (i.compareTo(getMax().increment()) < 0)
num.drawU(ug.apply(UTranslate.dx(x1 + delta / 2)));
}
}
@Override
public void drawTimeHeader(UGraphic ug, double totalHeightWithoutFooter) {
// drawTextsBackground(ug.apply(UTranslate.dy(-3)), totalHeightWithoutFooter +
// 6);
final double xmin = getTimeScale().getStartingPosition(getMin());
final double xmax = getTimeScale().getEndingPosition(getMax());
drawSmallVlinesDay(ug, getTimeScale(), totalHeightWithoutFooter);
// printVerticalSeparators(ug, totalHeightWithoutFooter);
drawSimpleDayCounter(ug, getTimeScale());
// ug = ug.apply(getLineColor());
// ug.draw(ULine.hline(xmax - xmin));
// ug.apply(UTranslate.dy(getFullHeaderHeight(ug.getStringBounder()) -
// 3)).draw(ULine.hline(xmax - xmin));
}
@Override
public void drawTimeFooter(UGraphic ug) {
final double xmin = getTimeScale().getStartingPosition(getMin());
final double xmax = getTimeScale().getEndingPosition(getMax());
ug = ug.apply(UTranslate.dy(3));
// drawSmallVlinesDay(ug, getTimeScale(),
// getTimeFooterHeight(ug.getStringBounder()) - 3);
drawSimpleDayCounter(ug, getTimeScale());
// ug.apply(getLineColor()).draw(ULine.hline(xmax - xmin));
}
// Duplicate in TimeHeaderDaily
class Pending {
final double x1;
double x2;
final HColor color;
Pending(HColor color, double x1, double x2) {
this.x1 = x1;
this.x2 = x2;
this.color = color;
}
public void draw(UGraphic ug, double height) {
drawRectangle(ug.apply(color.bg()), height, x1, x2);
}
}
protected final void drawTextsBackground(UGraphic ug, double totalHeightWithoutFooter) {
final double height = totalHeightWithoutFooter - getFullHeaderHeight(ug.getStringBounder());
Pending pending = null;
for (Day wink = getMin(); wink.compareTo(getMax()) <= 0; wink = wink.increment()) {
final double x1 = getTimeScale().getStartingPosition(wink);
final double x2 = getTimeScale().getEndingPosition(wink);
HColor back = thParam.getColor(wink);
// // Day of week should be stronger than period of time (back color).
// final HColor backDoW = colorDaysOfWeek.get(wink.getDayOfWeek());
// if (backDoW != null) {
// back = backDoW;
// }
// if (back == null && defaultPlan.getLoadAt(wink) == 0) {
// back = closedBackgroundColor();
// }
if (back == null) {
if (pending != null)
pending.draw(ug, height);
pending = null;
} else {
if (pending != null && pending.color.equals(back) == false) {
pending.draw(ug, height);
pending = null;
}
if (pending == null)
pending = new Pending(back, x1, x2);
else
pending.x2 = x2;
}
}
}
}

View File

@ -0,0 +1,81 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2024, Arnaud Roques
*
* Project Info: https://plantuml.com
*
* If you like this project or if you find it useful, you can support us at:
*
* https://plantuml.com/patreon (only 1$ per month!)
* https://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.chronology;
import net.sourceforge.plantuml.project.time.Day;
import net.sourceforge.plantuml.project.timescale.TimeScale;
public class TimeScaleChronology implements TimeScale {
private final double fullWidth;
private long min;
private long max;
public TimeScaleChronology(double fullWidth) {
this.fullWidth = fullWidth;
}
public double getStartingPosition(Day instant) {
final long wink = instant.getMillis();
if (wink < min)
throw new IllegalArgumentException();
if (wink > max)
throw new IllegalArgumentException();
return fullWidth * (wink - min) / (max - min);
}
public double getEndingPosition(Day instant) {
return getStartingPosition(instant);
}
public double getWidth(Day instant) {
throw new UnsupportedOperationException();
}
public boolean isBreaking(Day instant) {
throw new UnsupportedOperationException();
}
public final void setMin(long min) {
this.min = min;
}
public final void setMax(long max) {
this.max = max;
}
}

View File

@ -58,6 +58,7 @@ import net.sourceforge.plantuml.regex.RegexOr;
import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.regex.RegexResult;
import net.sourceforge.plantuml.stereo.Stereotag; import net.sourceforge.plantuml.stereo.Stereotag;
import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.Url;
import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlBuilder;
import net.sourceforge.plantuml.url.UrlMode; import net.sourceforge.plantuml.url.UrlMode;
@ -101,9 +102,7 @@ public class CommandCreateClass extends SingleLineCommand2<ClassDiagram> {
new RegexLeaf("GENERIC", "\\<(" + GenericRegexProducer.PATTERN + ")\\>"))), // new RegexLeaf("GENERIC", "\\<(" + GenericRegexProducer.PATTERN + ")\\>"))), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), // new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREO"), //
new RegexLeaf("STEREO", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), // new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
UrlBuilder.OPTIONAL, // UrlBuilder.OPTIONAL, //

View File

@ -65,6 +65,7 @@ import net.sourceforge.plantuml.regex.RegexResult;
import net.sourceforge.plantuml.skin.VisibilityModifier; import net.sourceforge.plantuml.skin.VisibilityModifier;
import net.sourceforge.plantuml.stereo.Stereotag; import net.sourceforge.plantuml.stereo.Stereotag;
import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.text.StringLocated; import net.sourceforge.plantuml.text.StringLocated;
import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.Url;
import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlBuilder;
@ -115,9 +116,7 @@ public class CommandCreateClassMultilines extends CommandMultilines2<ClassDiagra
new RegexLeaf("GENERIC", "\\<(" + GenericRegexProducer.PATTERN + ")\\>"))), // new RegexLeaf("GENERIC", "\\<(" + GenericRegexProducer.PATTERN + ")\\>"))), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), // new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREO"), //
new RegexLeaf("STEREO", "(\\<\\<.+\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), // new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
UrlBuilder.OPTIONAL, // UrlBuilder.OPTIONAL, //

View File

@ -53,11 +53,11 @@ import net.sourceforge.plantuml.klimt.font.FontParam;
import net.sourceforge.plantuml.plasma.Quark; import net.sourceforge.plantuml.plasma.Quark;
import net.sourceforge.plantuml.regex.RegexConcat; import net.sourceforge.plantuml.regex.RegexConcat;
import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexLeaf;
import net.sourceforge.plantuml.regex.RegexOptional;
import net.sourceforge.plantuml.regex.RegexOr; import net.sourceforge.plantuml.regex.RegexOr;
import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.regex.RegexResult;
import net.sourceforge.plantuml.stereo.Stereotag; import net.sourceforge.plantuml.stereo.Stereotag;
import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.Url;
import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlBuilder;
import net.sourceforge.plantuml.url.UrlMode; import net.sourceforge.plantuml.url.UrlMode;
@ -88,21 +88,14 @@ public class CommandCreateElementFull2 extends SingleLineCommand2<ClassDiagram>
new RegexLeaf("CODE1", CommandCreateElementFull.CODE_WITH_QUOTE), // new RegexLeaf("CODE1", CommandCreateElementFull.CODE_WITH_QUOTE), //
new RegexConcat(// new RegexConcat(//
new RegexLeaf("DISPLAY2", CommandCreateElementFull.DISPLAY), // new RegexLeaf("DISPLAY2", CommandCreateElementFull.DISPLAY), //
new RegexOptional( // StereotypePattern.optional("STEREOTYPE2"), //
new RegexConcat( //
RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("STEREOTYPE2", "(\\<\\<.+\\>\\>)") //
)), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("as"), // new RegexLeaf("as"), //
RegexLeaf.spaceOneOrMore(), // RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("CODE2", CommandCreateElementFull.CODE)) // new RegexLeaf("CODE2", CommandCreateElementFull.CODE)) //
), // ), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), // new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREOTYPE"), //
new RegexLeaf("STEREOTYPE", "(\\<\\<.+\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), // new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
UrlBuilder.OPTIONAL, // UrlBuilder.OPTIONAL, //
@ -118,21 +111,14 @@ public class CommandCreateElementFull2 extends SingleLineCommand2<ClassDiagram>
new RegexLeaf("CODE1", CommandCreateElementFull.CODE_WITH_QUOTE), // new RegexLeaf("CODE1", CommandCreateElementFull.CODE_WITH_QUOTE), //
new RegexConcat(// new RegexConcat(//
new RegexLeaf("DISPLAY2", CommandCreateElementFull.DISPLAY), // new RegexLeaf("DISPLAY2", CommandCreateElementFull.DISPLAY), //
new RegexOptional( // StereotypePattern.optional("STEREOTYPE2"), //
new RegexConcat( //
RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("STEREOTYPE2", "(\\<\\<.+\\>\\>)") //
)), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("as"), // new RegexLeaf("as"), //
RegexLeaf.spaceOneOrMore(), // RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("CODE2", CommandCreateElementFull.CODE)) // new RegexLeaf("CODE2", CommandCreateElementFull.CODE)) //
), // ), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), // new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREOTYPE"), //
new RegexLeaf("STEREOTYPE", "(\\<\\<.+\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), // new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
UrlBuilder.OPTIONAL, // UrlBuilder.OPTIONAL, //

View File

@ -47,6 +47,7 @@ import net.sourceforge.plantuml.regex.RegexConcat;
import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexLeaf;
import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.regex.RegexResult;
import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.utils.LineLocation; import net.sourceforge.plantuml.utils.LineLocation;
public class CommandStereotype extends SingleLineCommand2<ClassDiagram> { public class CommandStereotype extends SingleLineCommand2<ClassDiagram> {
@ -60,7 +61,8 @@ public class CommandStereotype extends SingleLineCommand2<ClassDiagram> {
RegexLeaf.start(), // RegexLeaf.start(), //
new RegexLeaf("NAME", "([%pLN_.]+|[%g][^%g]+[%g])"), // new RegexLeaf("NAME", "([%pLN_.]+|[%g][^%g]+[%g])"), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("STEREO", "(\\<\\<.*\\>\\>)"), RegexLeaf.end()); // StereotypePattern.mandatory("STEREO"), //
RegexLeaf.end()); //
} }
@Override @Override

View File

@ -50,6 +50,7 @@ import net.sourceforge.plantuml.regex.RegexConcat;
import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexLeaf;
import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.regex.RegexResult;
import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.Url;
import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlBuilder;
import net.sourceforge.plantuml.url.UrlMode; import net.sourceforge.plantuml.url.UrlMode;
@ -68,9 +69,7 @@ public class CommandNamespace extends SingleLineCommand2<ClassDiagram> {
new RegexLeaf("namespace"), // new RegexLeaf("namespace"), //
RegexLeaf.spaceOneOrMore(), // RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("NAME", NAMESPACE_REGEX), // new RegexLeaf("NAME", NAMESPACE_REGEX), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREOTYPE"), //
new RegexLeaf("STEREOTYPE", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
UrlBuilder.OPTIONAL, // UrlBuilder.OPTIONAL, //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
ColorParser.exp1(), // ColorParser.exp1(), //

View File

@ -48,6 +48,7 @@ import net.sourceforge.plantuml.regex.RegexConcat;
import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexLeaf;
import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.regex.RegexResult;
import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.Url;
import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlBuilder;
import net.sourceforge.plantuml.url.UrlMode; import net.sourceforge.plantuml.url.UrlMode;
@ -72,9 +73,7 @@ public class CommandNamespace2 extends SingleLineCommand2<ClassDiagram> {
RegexLeaf.spaceOneOrMore(), // RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("NAME", CommandNamespace.NAMESPACE_REGEX), // new RegexLeaf("NAME", CommandNamespace.NAMESPACE_REGEX), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREOTYPE"), //
new RegexLeaf("STEREOTYPE", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
UrlBuilder.OPTIONAL, // UrlBuilder.OPTIONAL, //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
ColorParser.exp1(), // ColorParser.exp1(), //

View File

@ -48,6 +48,7 @@ import net.sourceforge.plantuml.regex.RegexConcat;
import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexLeaf;
import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.regex.RegexResult;
import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.Url;
import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlBuilder;
import net.sourceforge.plantuml.url.UrlMode; import net.sourceforge.plantuml.url.UrlMode;
@ -64,9 +65,7 @@ public class CommandNamespaceEmpty extends SingleLineCommand2<ClassDiagram> {
new RegexLeaf("namespace"), // new RegexLeaf("namespace"), //
RegexLeaf.spaceOneOrMore(), // RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("NAME", CommandNamespace.NAMESPACE_REGEX), // new RegexLeaf("NAME", CommandNamespace.NAMESPACE_REGEX), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREOTYPE"), //
new RegexLeaf("STEREOTYPE", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
UrlBuilder.OPTIONAL, // UrlBuilder.OPTIONAL, //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
ColorParser.exp1(), // ColorParser.exp1(), //

View File

@ -55,6 +55,7 @@ import net.sourceforge.plantuml.regex.RegexOptional;
import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.regex.RegexResult;
import net.sourceforge.plantuml.stereo.Stereotag; import net.sourceforge.plantuml.stereo.Stereotag;
import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.Url;
import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlBuilder;
import net.sourceforge.plantuml.url.UrlMode; import net.sourceforge.plantuml.url.UrlMode;
@ -80,9 +81,7 @@ public class CommandPackage extends SingleLineCommand2<AbstractEntityDiagram> {
)), // )), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), // new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREOTYPE"), //
new RegexLeaf("STEREOTYPE", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), // new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
UrlBuilder.OPTIONAL, // UrlBuilder.OPTIONAL, //

View File

@ -55,6 +55,7 @@ import net.sourceforge.plantuml.regex.RegexLeaf;
import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.regex.RegexResult;
import net.sourceforge.plantuml.stereo.Stereotag; import net.sourceforge.plantuml.stereo.Stereotag;
import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.utils.BlocLines; import net.sourceforge.plantuml.utils.BlocLines;
import net.sourceforge.plantuml.utils.LineLocation; import net.sourceforge.plantuml.utils.LineLocation;
@ -70,9 +71,7 @@ public final class CommandFactoryNote implements SingleMultiFactoryCommand<Abstr
new RegexLeaf("CODE", "([%pLN_.]+)"), // new RegexLeaf("CODE", "([%pLN_.]+)"), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("TAGS", Stereotag.pattern() + "?"), // new RegexLeaf("TAGS", Stereotag.pattern() + "?"), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREO"), //
new RegexLeaf("STEREO", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
ColorParser.exp1(), // ColorParser.exp1(), //
RegexLeaf.end() // RegexLeaf.end() //
); );
@ -91,9 +90,7 @@ public final class CommandFactoryNote implements SingleMultiFactoryCommand<Abstr
new RegexLeaf("CODE", "([%pLN_.]+)"), // new RegexLeaf("CODE", "([%pLN_.]+)"), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("TAGS", Stereotag.pattern() + "?"), // new RegexLeaf("TAGS", Stereotag.pattern() + "?"), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREO"), //
new RegexLeaf("STEREO", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
ColorParser.exp1(), // ColorParser.exp1(), //
RegexLeaf.end() // RegexLeaf.end() //
); );

View File

@ -63,6 +63,7 @@ import net.sourceforge.plantuml.regex.RegexResult;
import net.sourceforge.plantuml.skin.ColorParam; import net.sourceforge.plantuml.skin.ColorParam;
import net.sourceforge.plantuml.stereo.Stereotag; import net.sourceforge.plantuml.stereo.Stereotag;
import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.Url;
import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlBuilder;
import net.sourceforge.plantuml.url.UrlMode; import net.sourceforge.plantuml.url.UrlMode;
@ -92,9 +93,7 @@ public final class CommandFactoryNoteOnEntity implements SingleMultiFactoryComma
new RegexLeaf("")), // new RegexLeaf("")), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), // new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREO"), //
new RegexLeaf("STEREO", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), // new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
color().getRegex(), // color().getRegex(), //
@ -127,9 +126,7 @@ public final class CommandFactoryNoteOnEntity implements SingleMultiFactoryComma
new RegexLeaf("")), // new RegexLeaf("")), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), // new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREO"), //
new RegexLeaf("STEREO", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), // new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
color().getRegex(), // color().getRegex(), //
@ -153,9 +150,7 @@ public final class CommandFactoryNoteOnEntity implements SingleMultiFactoryComma
new RegexLeaf("")), // new RegexLeaf("")), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), // new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREO"), //
new RegexLeaf("STEREO", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), // new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
color().getRegex(), // color().getRegex(), //

View File

@ -61,6 +61,7 @@ import net.sourceforge.plantuml.regex.RegexResult;
import net.sourceforge.plantuml.skin.ColorParam; import net.sourceforge.plantuml.skin.ColorParam;
import net.sourceforge.plantuml.stereo.Stereotag; import net.sourceforge.plantuml.stereo.Stereotag;
import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.Url;
import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlBuilder;
import net.sourceforge.plantuml.url.UrlMode; import net.sourceforge.plantuml.url.UrlMode;
@ -89,9 +90,7 @@ public final class CommandFactoryTipOnEntity implements SingleMultiFactoryComman
partialPattern, // partialPattern, //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), // new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREO"), //
new RegexLeaf("STEREO", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), // new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
ColorParser.exp1(), // ColorParser.exp1(), //
@ -112,9 +111,7 @@ public final class CommandFactoryTipOnEntity implements SingleMultiFactoryComman
partialPattern, // partialPattern, //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), // new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREO"), //
new RegexLeaf("STEREO", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), // new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
ColorParser.exp1(), // ColorParser.exp1(), //

View File

@ -57,6 +57,7 @@ import net.sourceforge.plantuml.sequencediagram.Participant;
import net.sourceforge.plantuml.sequencediagram.SequenceDiagram; import net.sourceforge.plantuml.sequencediagram.SequenceDiagram;
import net.sourceforge.plantuml.skin.ColorParam; import net.sourceforge.plantuml.skin.ColorParam;
import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.Url;
import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlBuilder;
import net.sourceforge.plantuml.url.UrlMode; import net.sourceforge.plantuml.url.UrlMode;
@ -70,13 +71,9 @@ public final class FactorySequenceNoteAcrossCommand implements SingleMultiFactor
new RegexLeaf("VMERGE", "(/)?"), // new RegexLeaf("VMERGE", "(/)?"), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("STYLE", "(note|hnote|rnote)"), // new RegexLeaf("STYLE", "(note|hnote|rnote)"), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREO1"), //
new RegexLeaf("STEREO1", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("ACROSS", "(accross|across)"), // new RegexLeaf("ACROSS", "(accross|across)"), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREO2"), //
new RegexLeaf("STEREO2", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
color().getRegex(), // color().getRegex(), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
UrlBuilder.OPTIONAL, // UrlBuilder.OPTIONAL, //
@ -89,13 +86,9 @@ public final class FactorySequenceNoteAcrossCommand implements SingleMultiFactor
new RegexLeaf("VMERGE", "(/)?"), // new RegexLeaf("VMERGE", "(/)?"), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("STYLE", "(note|hnote|rnote)"), // new RegexLeaf("STYLE", "(note|hnote|rnote)"), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREO1"), //
new RegexLeaf("STEREO1", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("ACROSS", "(accross|across)"), // new RegexLeaf("ACROSS", "(accross|across)"), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREO2"), //
new RegexLeaf("STEREO2", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
color().getRegex(), // color().getRegex(), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
UrlBuilder.OPTIONAL, // UrlBuilder.OPTIONAL, //

View File

@ -59,6 +59,7 @@ import net.sourceforge.plantuml.sequencediagram.Participant;
import net.sourceforge.plantuml.sequencediagram.SequenceDiagram; import net.sourceforge.plantuml.sequencediagram.SequenceDiagram;
import net.sourceforge.plantuml.skin.ColorParam; import net.sourceforge.plantuml.skin.ColorParam;
import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.Url;
import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlBuilder;
import net.sourceforge.plantuml.url.UrlMode; import net.sourceforge.plantuml.url.UrlMode;
@ -66,7 +67,7 @@ import net.sourceforge.plantuml.utils.BlocLines;
import net.sourceforge.plantuml.utils.LineLocation; import net.sourceforge.plantuml.utils.LineLocation;
public final class FactorySequenceNoteCommand implements SingleMultiFactoryCommand<SequenceDiagram> { public final class FactorySequenceNoteCommand implements SingleMultiFactoryCommand<SequenceDiagram> {
// ::remove folder when __HAXE__ // ::remove folder when __HAXE__
private IRegex getRegexConcatMultiLine() { private IRegex getRegexConcatMultiLine() {
return RegexConcat.build(FactorySequenceNoteCommand.class.getName() + "multi", RegexLeaf.start(), // return RegexConcat.build(FactorySequenceNoteCommand.class.getName() + "multi", RegexLeaf.start(), //
@ -74,15 +75,11 @@ public final class FactorySequenceNoteCommand implements SingleMultiFactoryComma
new RegexLeaf("VMERGE", "(/)?"), // new RegexLeaf("VMERGE", "(/)?"), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("STYLE", "(note|hnote|rnote)"), // new RegexLeaf("STYLE", "(note|hnote|rnote)"), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREO1"), //
new RegexLeaf("STEREO1", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("POSITION", "(right|left|over)"), // new RegexLeaf("POSITION", "(right|left|over)"), //
RegexLeaf.spaceOneOrMore(), // RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("PARTICIPANT", "(?:of[%s]+)?([%pLN_.@]+|[%g][^%g]+[%g])"), // new RegexLeaf("PARTICIPANT", "(?:of[%s]+)?([%pLN_.@]+|[%g][^%g]+[%g])"), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREO2"), //
new RegexLeaf("STEREO2", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
color().getRegex(), // color().getRegex(), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
UrlBuilder.OPTIONAL, // UrlBuilder.OPTIONAL, //
@ -95,15 +92,11 @@ public final class FactorySequenceNoteCommand implements SingleMultiFactoryComma
new RegexLeaf("VMERGE", "(/)?"), // new RegexLeaf("VMERGE", "(/)?"), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("STYLE", "(note|hnote|rnote)"), // new RegexLeaf("STYLE", "(note|hnote|rnote)"), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREO1"), //
new RegexLeaf("STEREO1", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("POSITION", "(right|left|over)"), // new RegexLeaf("POSITION", "(right|left|over)"), //
RegexLeaf.spaceOneOrMore(), // RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("PARTICIPANT", "(?:of[%s])?([%pLN_.@]+|[%g][^%g]+[%g])"), // new RegexLeaf("PARTICIPANT", "(?:of[%s])?([%pLN_.@]+|[%g][^%g]+[%g])"), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREO2"), //
new RegexLeaf("STEREO2", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
color().getRegex(), // color().getRegex(), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
UrlBuilder.OPTIONAL, // UrlBuilder.OPTIONAL, //

View File

@ -60,6 +60,7 @@ import net.sourceforge.plantuml.sequencediagram.NoteStyle;
import net.sourceforge.plantuml.sequencediagram.SequenceDiagram; import net.sourceforge.plantuml.sequencediagram.SequenceDiagram;
import net.sourceforge.plantuml.skin.ColorParam; import net.sourceforge.plantuml.skin.ColorParam;
import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.Url;
import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlBuilder;
import net.sourceforge.plantuml.url.UrlMode; import net.sourceforge.plantuml.url.UrlMode;
@ -72,13 +73,9 @@ public final class FactorySequenceNoteOnArrowCommand implements SingleMultiFacto
return RegexConcat.build(FactorySequenceNoteOnArrowCommand.class.getName() + "multi", RegexLeaf.start(), // return RegexConcat.build(FactorySequenceNoteOnArrowCommand.class.getName() + "multi", RegexLeaf.start(), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("STYLE", "(note|hnote|rnote)"), // new RegexLeaf("STYLE", "(note|hnote|rnote)"), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREO1"), //
new RegexLeaf("STEREO1", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("POSITION", "(right|left|bottom|top)"), // new RegexLeaf("POSITION", "(right|left|bottom|top)"), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREO2"), //
new RegexLeaf("STEREO2", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
ColorParser.exp1(), // ColorParser.exp1(), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
UrlBuilder.OPTIONAL, // UrlBuilder.OPTIONAL, //
@ -89,13 +86,9 @@ public final class FactorySequenceNoteOnArrowCommand implements SingleMultiFacto
return RegexConcat.build(FactorySequenceNoteOnArrowCommand.class.getName() + "single", RegexLeaf.start(), // return RegexConcat.build(FactorySequenceNoteOnArrowCommand.class.getName() + "single", RegexLeaf.start(), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("STYLE", "(note|hnote|rnote)"), // new RegexLeaf("STYLE", "(note|hnote|rnote)"), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREO1"), //
new RegexLeaf("STEREO1", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("POSITION", "(right|left|bottom|top)"), // new RegexLeaf("POSITION", "(right|left|bottom|top)"), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREO2"), //
new RegexLeaf("STEREO2", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
ColorParser.exp1(), // ColorParser.exp1(), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
UrlBuilder.OPTIONAL, // UrlBuilder.OPTIONAL, //

View File

@ -58,6 +58,7 @@ import net.sourceforge.plantuml.sequencediagram.Participant;
import net.sourceforge.plantuml.sequencediagram.SequenceDiagram; import net.sourceforge.plantuml.sequencediagram.SequenceDiagram;
import net.sourceforge.plantuml.skin.ColorParam; import net.sourceforge.plantuml.skin.ColorParam;
import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.Url;
import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlBuilder;
import net.sourceforge.plantuml.url.UrlMode; import net.sourceforge.plantuml.url.UrlMode;
@ -72,9 +73,7 @@ public final class FactorySequenceNoteOverSeveralCommand implements SingleMultiF
new RegexLeaf("VMERGE", "(/)?"), // new RegexLeaf("VMERGE", "(/)?"), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("STYLE", "(note|hnote|rnote)"), // new RegexLeaf("STYLE", "(note|hnote|rnote)"), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREO1"), //
new RegexLeaf("STEREO1", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("over"), // new RegexLeaf("over"), //
RegexLeaf.spaceOneOrMore(), // RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("P1", "([%pLN_.@]+|[%g][^%g]+[%g])"), // new RegexLeaf("P1", "([%pLN_.@]+|[%g][^%g]+[%g])"), //
@ -82,9 +81,7 @@ public final class FactorySequenceNoteOverSeveralCommand implements SingleMultiF
new RegexLeaf(","), // new RegexLeaf(","), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("P2", "([%pLN_.@]+|[%g][^%g]+[%g])"), // new RegexLeaf("P2", "([%pLN_.@]+|[%g][^%g]+[%g])"), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREO2"), //
new RegexLeaf("STEREO2", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
color().getRegex(), // color().getRegex(), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
UrlBuilder.OPTIONAL, // UrlBuilder.OPTIONAL, //
@ -98,9 +95,7 @@ public final class FactorySequenceNoteOverSeveralCommand implements SingleMultiF
new RegexLeaf("VMERGE", "(/)?"), // new RegexLeaf("VMERGE", "(/)?"), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("STYLE", "(note|hnote|rnote)"), // new RegexLeaf("STYLE", "(note|hnote|rnote)"), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREO1"), //
new RegexLeaf("STEREO1", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("over"), // new RegexLeaf("over"), //
RegexLeaf.spaceOneOrMore(), // RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("P1", "([%pLN_.@]+|[%g][^%g]+[%g])"), // new RegexLeaf("P1", "([%pLN_.@]+|[%g][^%g]+[%g])"), //
@ -108,9 +103,7 @@ public final class FactorySequenceNoteOverSeveralCommand implements SingleMultiF
new RegexLeaf(","), // new RegexLeaf(","), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("P2", "([%pLN_.@]+|[%g][^%g]+[%g])"), // new RegexLeaf("P2", "([%pLN_.@]+|[%g][^%g]+[%g])"), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREO2"), //
new RegexLeaf("STEREO2", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
color().getRegex(), // color().getRegex(), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
UrlBuilder.OPTIONAL, // UrlBuilder.OPTIONAL, //

View File

@ -68,7 +68,7 @@ public interface Diagram {
*/ */
ImageData exportDiagram(OutputStream os, int num, FileFormatOption fileFormat) throws IOException; ImageData exportDiagram(OutputStream os, int num, FileFormatOption fileFormat) throws IOException;
void exportDiagramGraphic(UGraphic ug); void exportDiagramGraphic(UGraphic ug, FileFormatOption fileFormat);
/** /**
* Number of images in this diagram (usually, 1) * Number of images in this diagram (usually, 1)

View File

@ -38,9 +38,9 @@ package net.sourceforge.plantuml.core;
import net.sourceforge.plantuml.utils.StartUtils; import net.sourceforge.plantuml.utils.StartUtils;
public enum DiagramType { public enum DiagramType {
// ::remove folder when __HAXE__ // ::remove folder when __HAXE__
UML, BPM, DITAA, DOT, PROJECT, JCCKIT, SALT, FLOW, CREOLE, MATH, LATEX, DEFINITION, GANTT, NW, UML, BPM, DITAA, DOT, PROJECT, JCCKIT, SALT, FLOW, CREOLE, MATH, LATEX, DEFINITION, GANTT, CHRONOLOGY, NW, MINDMAP,
MINDMAP, WBS, WIRE, JSON, GIT, BOARD, YAML, HCL, EBNF, REGEX, FILES, UNKNOWN; WBS, WIRE, JSON, GIT, BOARD, YAML, HCL, EBNF, REGEX, FILES, UNKNOWN;
static public DiagramType getTypeFromArobaseStart(String s) { static public DiagramType getTypeFromArobaseStart(String s) {
s = s.toLowerCase(); s = s.toLowerCase();
@ -59,7 +59,8 @@ public enum DiagramType {
if (StartUtils.startsWithSymbolAnd("startdot", s)) if (StartUtils.startsWithSymbolAnd("startdot", s))
return DOT; return DOT;
// ::comment when __CORE__ or __MIT__ or __EPL__ or __BSD__ or __ASL__ or __LGPL__ // ::comment when __CORE__ or __MIT__ or __EPL__ or __BSD__ or __ASL__ or
// __LGPL__
if (StartUtils.startsWithSymbolAnd("startjcckit", s)) if (StartUtils.startsWithSymbolAnd("startjcckit", s))
return JCCKIT; return JCCKIT;
// ::done // ::done
@ -126,6 +127,9 @@ public enum DiagramType {
if (StartUtils.startsWithSymbolAnd("startfiles", s)) if (StartUtils.startsWithSymbolAnd("startfiles", s))
return FILES; return FILES;
if (StartUtils.startsWithSymbolAnd("startchronology", s))
return CHRONOLOGY;
return UNKNOWN; return UNKNOWN;
} }
} }

View File

@ -53,6 +53,7 @@ import net.sourceforge.plantuml.regex.RegexConcat;
import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexLeaf;
import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.regex.RegexResult;
import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.Url;
import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlBuilder;
import net.sourceforge.plantuml.url.UrlMode; import net.sourceforge.plantuml.url.UrlMode;
@ -73,11 +74,11 @@ public class CommandCreateDomain extends SingleLineCommand2<DescriptionDiagram>
new RegexLeaf("DISPLAY", DISPLAY_WITH_GENERIC), // new RegexLeaf("DISPLAY", DISPLAY_WITH_GENERIC), //
RegexLeaf.spaceOneOrMore(), // RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("as"), // new RegexLeaf("as"), //
RegexLeaf.spaceOneOrMore(), new RegexLeaf("CODE", "([a-zA-Z0-9]+)"), RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("STEREO", "(\\<\\<.+\\>\\>)?"), // new RegexLeaf("CODE", "([a-zA-Z0-9]+)"), //
StereotypePattern.optional("STEREO"), //
// domain: lexical, causal, biddable // domain: lexical, causal, biddable
// requirement: FR, NFR, quality // requirement: FR, NFR, quality
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("GROUP", "(\\{)?"), RegexLeaf.end()); new RegexLeaf("GROUP", "(\\{)?"), RegexLeaf.end());
} }

View File

@ -56,6 +56,7 @@ import net.sourceforge.plantuml.regex.RegexOptional;
import net.sourceforge.plantuml.regex.RegexOr; import net.sourceforge.plantuml.regex.RegexOr;
import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.regex.RegexResult;
import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.utils.LineLocation; import net.sourceforge.plantuml.utils.LineLocation;
public class CommandArchimate extends SingleLineCommand2<DescriptionDiagram> { public class CommandArchimate extends SingleLineCommand2<DescriptionDiagram> {
@ -74,44 +75,25 @@ public class CommandArchimate extends SingleLineCommand2<DescriptionDiagram> {
new RegexLeaf("CODE1", CommandCreateElementFull.CODE_WITH_QUOTE), // new RegexLeaf("CODE1", CommandCreateElementFull.CODE_WITH_QUOTE), //
new RegexConcat(// new RegexConcat(//
new RegexLeaf("DISPLAY2", CommandCreateElementFull.DISPLAY), // new RegexLeaf("DISPLAY2", CommandCreateElementFull.DISPLAY), //
new RegexOptional( // StereotypePattern.optionalArchimate("STEREOTYPE2"), //
new RegexConcat( //
RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("STEREOTYPE2", "(?:\\<\\<([-\\w]+)\\>\\>)") //
)), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("as"), // new RegexLeaf("as"), //
RegexLeaf.spaceOneOrMore(), // RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("CODE2", CommandCreateElementFull.CODE)), // new RegexLeaf("CODE2", CommandCreateElementFull.CODE)), //
new RegexConcat(// new RegexConcat(//
new RegexLeaf("CODE3", CommandCreateElementFull.CODE), // new RegexLeaf("CODE3", CommandCreateElementFull.CODE), //
new RegexOptional( // StereotypePattern.optionalArchimate("STEREOTYPE3"), //
new RegexConcat( //
RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("STEREOTYPE3", "(?:\\<\\<([-\\w]+)\\>\\>)") //
)), //
RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("as"), // new RegexLeaf("as"), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("DISPLAY3", CommandCreateElementFull.DISPLAY)), // new RegexLeaf("DISPLAY3", CommandCreateElementFull.DISPLAY)), //
new RegexConcat(// new RegexConcat(//
new RegexLeaf("DISPLAY4", CommandCreateElementFull.DISPLAY_WITHOUT_QUOTE), // new RegexLeaf("DISPLAY4", CommandCreateElementFull.DISPLAY_WITHOUT_QUOTE), //
new RegexOptional( // StereotypePattern.optionalArchimate("STEREOTYPE4"), //
new RegexConcat( //
RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("STEREOTYPE4", "(?:\\<\\<([-\\w]+)\\>\\>)") //
)), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("as"), // new RegexLeaf("as"), //
RegexLeaf.spaceOneOrMore(), // RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("CODE4", CommandCreateElementFull.CODE)) // new RegexLeaf("CODE4", CommandCreateElementFull.CODE)) //
), // ), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optionalArchimate("STEREOTYPE"), //
new RegexOptional( // RegexLeaf.end());
new RegexConcat( //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("STEREOTYPE", "(?:\\<\\<([-\\w]+)\\>\\>)") //
)), RegexLeaf.end());
} }
private static ColorParser color() { private static ColorParser color() {
@ -134,7 +116,7 @@ public class CommandArchimate extends SingleLineCommand2<DescriptionDiagram> {
entity = diagram.reallyCreateLeaf(quark, Display.getWithNewlines(display), LeafType.DESCRIPTION, entity = diagram.reallyCreateLeaf(quark, Display.getWithNewlines(display), LeafType.DESCRIPTION,
USymbols.ARCHIMATE); USymbols.ARCHIMATE);
final String icon = arg.getLazzy("STEREOTYPE", 0); final String icon = StereotypePattern.removeChevronBrackets(arg.getLazzy("STEREOTYPE", 0));
entity.setDisplay(Display.getWithNewlines(display)); entity.setDisplay(Display.getWithNewlines(display));
entity.setUSymbol(USymbols.ARCHIMATE); entity.setUSymbol(USymbols.ARCHIMATE);

View File

@ -56,6 +56,7 @@ import net.sourceforge.plantuml.regex.RegexLeaf;
import net.sourceforge.plantuml.regex.RegexOptional; import net.sourceforge.plantuml.regex.RegexOptional;
import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.regex.RegexResult;
import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlBuilder;
import net.sourceforge.plantuml.utils.BlocLines; import net.sourceforge.plantuml.utils.BlocLines;
@ -77,13 +78,7 @@ public class CommandArchimateMultilines extends CommandMultilines2<AbstractEntit
color().getRegex(), // color().getRegex(), //
RegexLeaf.spaceOneOrMore(), // RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("CODE", "([%pLN_.]+)"), // new RegexLeaf("CODE", "([%pLN_.]+)"), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optionalArchimate("STEREOTYPE"), //
new RegexOptional( //
new RegexConcat( //
RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("STEREOTYPE", "(?:\\<\\<([-\\w]+)\\>\\>)") //
)), //
RegexLeaf.spaceZeroOrMore(), //
UrlBuilder.OPTIONAL, // UrlBuilder.OPTIONAL, //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
ColorParser.exp1(), // ColorParser.exp1(), //
@ -108,7 +103,7 @@ public class CommandArchimateMultilines extends CommandMultilines2<AbstractEntit
if (quark.getData() != null) if (quark.getData() != null)
return CommandExecutionResult.error("Already exists " + quark.getName()); return CommandExecutionResult.error("Already exists " + quark.getName());
final String icon = line0.getLazzy("STEREOTYPE", 0); final String icon = StereotypePattern.removeChevronBrackets(line0.getLazzy("STEREOTYPE", 0));
final Entity entity = diagram.reallyCreateLeaf(quark, Display.getWithNewlines(quark), LeafType.DESCRIPTION, final Entity entity = diagram.reallyCreateLeaf(quark, Display.getWithNewlines(quark), LeafType.DESCRIPTION,
USymbols.RECTANGLE); USymbols.RECTANGLE);

View File

@ -57,11 +57,11 @@ import net.sourceforge.plantuml.plasma.Quark;
import net.sourceforge.plantuml.regex.IRegex; import net.sourceforge.plantuml.regex.IRegex;
import net.sourceforge.plantuml.regex.RegexConcat; import net.sourceforge.plantuml.regex.RegexConcat;
import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexLeaf;
import net.sourceforge.plantuml.regex.RegexOptional;
import net.sourceforge.plantuml.regex.RegexOr; import net.sourceforge.plantuml.regex.RegexOr;
import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.regex.RegexResult;
import net.sourceforge.plantuml.stereo.Stereotag; import net.sourceforge.plantuml.stereo.Stereotag;
import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.Url;
import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlBuilder;
import net.sourceforge.plantuml.url.UrlMode; import net.sourceforge.plantuml.url.UrlMode;
@ -84,43 +84,26 @@ public class CommandCreateElementFull extends SingleLineCommand2<DescriptionDiag
new RegexLeaf("CODE1", CODE_WITH_QUOTE), // new RegexLeaf("CODE1", CODE_WITH_QUOTE), //
new RegexConcat(// new RegexConcat(//
new RegexLeaf("DISPLAY2", DISPLAY), // new RegexLeaf("DISPLAY2", DISPLAY), //
new RegexOptional( // StereotypePattern.optional("STEREOTYPE2"), //
new RegexConcat( //
RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("STEREOTYPE2", "(\\<\\<.+\\>\\>)")//
)), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("as"), // new RegexLeaf("as"), //
RegexLeaf.spaceOneOrMore(), // RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("CODE2", CODE)), // new RegexLeaf("CODE2", CODE)), //
new RegexConcat(// new RegexConcat(//
new RegexLeaf("CODE3", CODE), // new RegexLeaf("CODE3", CODE), //
new RegexOptional( // StereotypePattern.optional("STEREOTYPE3"), //
new RegexConcat( //
RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("STEREOTYPE3", "(\\<\\<.+\\>\\>)") //
)), //
RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("as"), // new RegexLeaf("as"), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("DISPLAY3", DISPLAY)), // new RegexLeaf("DISPLAY3", DISPLAY)), //
new RegexConcat(// new RegexConcat(//
new RegexLeaf("DISPLAY4", DISPLAY_WITHOUT_QUOTE), // new RegexLeaf("DISPLAY4", DISPLAY_WITHOUT_QUOTE), //
new RegexOptional( // StereotypePattern.optional("STEREOTYPE4"), //
new RegexConcat( //
RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("STEREOTYPE4", "(\\<\\<.+\\>\\>)") //
)), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("as"), // new RegexLeaf("as"), //
RegexLeaf.spaceOneOrMore(), // RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("CODE4", CODE)) // new RegexLeaf("CODE4", CODE)) //
), // ), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), // new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREOTYPE"), //
new RegexLeaf("STEREOTYPE", "(\\<\\<.+\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), // new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
UrlBuilder.OPTIONAL, // UrlBuilder.OPTIONAL, //

View File

@ -59,6 +59,7 @@ import net.sourceforge.plantuml.regex.RegexConcat;
import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexLeaf;
import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.regex.RegexResult;
import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.Url;
import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlBuilder;
import net.sourceforge.plantuml.url.UrlMode; import net.sourceforge.plantuml.url.UrlMode;
@ -93,9 +94,7 @@ public class CommandCreateElementMultilines extends CommandMultilines2<AbstractE
return RegexConcat.build(CommandCreateElementMultilines.class.getName() + type, RegexLeaf.start(), // return RegexConcat.build(CommandCreateElementMultilines.class.getName() + type, RegexLeaf.start(), //
new RegexLeaf("TYPE", "(" + CommandCreateElementFull.ALL_TYPES + ")[%s]+"), // new RegexLeaf("TYPE", "(" + CommandCreateElementFull.ALL_TYPES + ")[%s]+"), //
new RegexLeaf("CODE", "([%pLN_.]+)"), // new RegexLeaf("CODE", "([%pLN_.]+)"), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREO"), //
new RegexLeaf("STEREO", "(\\<\\<.+\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
UrlBuilder.OPTIONAL, // UrlBuilder.OPTIONAL, //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
ColorParser.exp1(), // ColorParser.exp1(), //
@ -110,9 +109,7 @@ public class CommandCreateElementMultilines extends CommandMultilines2<AbstractE
return RegexConcat.build(CommandCreateElementMultilines.class.getName() + type, RegexLeaf.start(), // return RegexConcat.build(CommandCreateElementMultilines.class.getName() + type, RegexLeaf.start(), //
new RegexLeaf("TYPE", "(" + CommandCreateElementFull.ALL_TYPES + ")[%s]+"), // new RegexLeaf("TYPE", "(" + CommandCreateElementFull.ALL_TYPES + ")[%s]+"), //
new RegexLeaf("CODE", "([%pLN_.]+)"), // new RegexLeaf("CODE", "([%pLN_.]+)"), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREO"), //
new RegexLeaf("STEREO", "(\\<\\<.+\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
UrlBuilder.OPTIONAL, // UrlBuilder.OPTIONAL, //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
ColorParser.exp1(), // ColorParser.exp1(), //

View File

@ -59,6 +59,7 @@ import net.sourceforge.plantuml.regex.RegexOptional;
import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.regex.RegexResult;
import net.sourceforge.plantuml.skin.ActorStyle; import net.sourceforge.plantuml.skin.ActorStyle;
import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.utils.Direction; import net.sourceforge.plantuml.utils.Direction;
import net.sourceforge.plantuml.utils.LineLocation; import net.sourceforge.plantuml.utils.LineLocation;
@ -104,9 +105,7 @@ public class CommandLinkElement extends SingleLineCommand2<DescriptionDiagram> {
// RegexLeaf.spaceZeroOrMore(), // // RegexLeaf.spaceZeroOrMore(), //
color().getRegex(), // color().getRegex(), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREOTYPE"), //
new RegexLeaf("STEREOTYPE", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("LABEL_LINK", "(?::[%s]*(.+))?"), // new RegexLeaf("LABEL_LINK", "(?::[%s]*(.+))?"), //
RegexLeaf.end()); RegexLeaf.end());
} }

View File

@ -57,6 +57,7 @@ import net.sourceforge.plantuml.regex.RegexOr;
import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.regex.RegexResult;
import net.sourceforge.plantuml.stereo.Stereotag; import net.sourceforge.plantuml.stereo.Stereotag;
import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.Url;
import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlBuilder;
import net.sourceforge.plantuml.url.UrlMode; import net.sourceforge.plantuml.url.UrlMode;
@ -115,9 +116,7 @@ public class CommandPackageWithUSymbol extends SingleLineCommand2<AbstractEntity
), // ), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), // new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREOTYPE"), //
new RegexLeaf("STEREOTYPE", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), // new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
UrlBuilder.OPTIONAL, // UrlBuilder.OPTIONAL, //

View File

@ -97,11 +97,11 @@ public class PSystemEbnf extends TitledDiagram {
@Override @Override
protected ImageData exportDiagramNow(OutputStream os, int index, FileFormatOption fileFormatOption) protected ImageData exportDiagramNow(OutputStream os, int index, FileFormatOption fileFormatOption)
throws IOException { throws IOException {
return createImageBuilder(fileFormatOption).drawable(getTextBlock()).write(os); return createImageBuilder(fileFormatOption).drawable(getTextMainBlock(fileFormatOption)).write(os);
} }
@Override @Override
protected TextBlock getTextBlock() { protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) {
if (expressions.size() == 0) { if (expressions.size() == 0) {
final Style style = ETile.getStyleSignature().getMergedStyle(getSkinParam().getCurrentStyleBuilder()); final Style style = ETile.getStyleSignature().getMergedStyle(getSkinParam().getCurrentStyleBuilder());
final FontConfiguration fc = style.getFontConfiguration(getSkinParam().getIHtmlColorSet()); final FontConfiguration fc = style.getFontConfiguration(getSkinParam().getIHtmlColorSet());

View File

@ -89,11 +89,11 @@ public class FilesDiagram extends UmlDiagram {
protected ImageData exportDiagramInternal(OutputStream os, int index, FileFormatOption fileFormatOption) protected ImageData exportDiagramInternal(OutputStream os, int index, FileFormatOption fileFormatOption)
throws IOException { throws IOException {
return createImageBuilder(fileFormatOption).drawable(getTextBlock()).write(os); return createImageBuilder(fileFormatOption).drawable(getTextMainBlock(fileFormatOption)).write(os);
} }
@Override @Override
protected TextBlock getTextBlock() { protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) {
return list; return list;
} }

View File

@ -230,7 +230,7 @@ public class FlowDiagram extends UmlDiagram implements TextBlock {
} }
@Override @Override
protected TextBlock getTextBlock() { protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) {
return this; return this;
} }

View File

@ -68,7 +68,7 @@ public class GitDiagram extends UmlDiagram {
protected ImageData exportDiagramInternal(OutputStream os, int index, FileFormatOption fileFormatOption) protected ImageData exportDiagramInternal(OutputStream os, int index, FileFormatOption fileFormatOption)
throws IOException { throws IOException {
return createImageBuilder(fileFormatOption).drawable(getTextBlock()).write(os); return createImageBuilder(fileFormatOption).drawable(getTextMainBlock(fileFormatOption)).write(os);
} }
private void drawInternal(UGraphic ug) { private void drawInternal(UGraphic ug) {
@ -84,7 +84,7 @@ public class GitDiagram extends UmlDiagram {
} }
@Override @Override
protected TextBlock getTextBlock() { protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) {
return new AbstractTextBlock() { return new AbstractTextBlock() {
public void drawU(UGraphic ug) { public void drawU(UGraphic ug) {

View File

@ -96,7 +96,7 @@ public class Help extends UmlDiagram {
} }
@Override @Override
protected TextBlock getTextBlock() { protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }

View File

@ -94,7 +94,7 @@ public class JsonDiagram extends TitledDiagram {
protected ImageData exportDiagramNow(OutputStream os, int index, FileFormatOption fileFormatOption) protected ImageData exportDiagramNow(OutputStream os, int index, FileFormatOption fileFormatOption)
throws IOException { throws IOException {
return createImageBuilder(fileFormatOption).drawable(getTextBlock()).write(os); return createImageBuilder(fileFormatOption).drawable(getTextMainBlock(fileFormatOption)).write(os);
} }
private void drawInternal(UGraphic ug) { private void drawInternal(UGraphic ug) {
@ -113,7 +113,7 @@ public class JsonDiagram extends TitledDiagram {
} }
@Override @Override
protected TextBlock getTextBlock() { protected TextBlock getTextMainBlock(final FileFormatOption fileFormatOption) {
return new AbstractTextBlock() { return new AbstractTextBlock() {
public void drawU(UGraphic ug) { public void drawU(UGraphic ug) {
@ -121,7 +121,7 @@ public class JsonDiagram extends TitledDiagram {
} }
public XDimension2D calculateDimension(StringBounder stringBounder) { public XDimension2D calculateDimension(StringBounder stringBounder) {
return TextBlockUtils.getMinMax(getTextBlock(), stringBounder, true).getDimension(); return TextBlockUtils.getMinMax(getTextMainBlock(fileFormatOption), stringBounder, true).getDimension();
} }
}; };
} }

View File

@ -79,11 +79,11 @@ public class ListSpriteDiagram extends UmlDiagram {
protected ImageData exportDiagramInternal(OutputStream os, int index, FileFormatOption fileFormatOption) protected ImageData exportDiagramInternal(OutputStream os, int index, FileFormatOption fileFormatOption)
throws IOException { throws IOException {
return createImageBuilder(fileFormatOption).drawable(getTextBlock()).write(os); return createImageBuilder(fileFormatOption).drawable(getTextMainBlock(fileFormatOption)).write(os);
} }
@Override @Override
protected TextBlock getTextBlock() { protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) {
return new AbstractTextBlock() { return new AbstractTextBlock() {
public void drawU(UGraphic ug) { public void drawU(UGraphic ug) {

View File

@ -91,11 +91,11 @@ public class StdlibDiagram extends UmlDiagram {
protected ImageData exportDiagramInternal(OutputStream os, int index, FileFormatOption fileFormatOption) protected ImageData exportDiagramInternal(OutputStream os, int index, FileFormatOption fileFormatOption)
throws IOException { throws IOException {
return createImageBuilder(fileFormatOption).drawable(getTextBlock()).write(os); return createImageBuilder(fileFormatOption).drawable(getTextMainBlock(fileFormatOption)).write(os);
} }
@Override @Override
protected TextBlock getTextBlock() { protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) {
return new AbstractTextBlock() { return new AbstractTextBlock() {
public void drawU(UGraphic ug) { public void drawU(UGraphic ug) {

View File

@ -83,11 +83,11 @@ public class MindMapDiagram extends UmlDiagram {
protected ImageData exportDiagramInternal(OutputStream os, int index, FileFormatOption fileFormatOption) protected ImageData exportDiagramInternal(OutputStream os, int index, FileFormatOption fileFormatOption)
throws IOException { throws IOException {
return createImageBuilder(fileFormatOption).drawable(getTextBlock()).write(os); return createImageBuilder(fileFormatOption).drawable(getTextMainBlock(fileFormatOption)).write(os);
} }
@Override @Override
protected TextBlock getTextBlock() { protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) {
return new AbstractTextBlock() { return new AbstractTextBlock() {
public void drawU(UGraphic ug) { public void drawU(UGraphic ug) {

View File

@ -331,11 +331,11 @@ public class NwDiagram extends UmlDiagram {
protected ImageData exportDiagramInternal(OutputStream os, int index, FileFormatOption fileFormatOption) protected ImageData exportDiagramInternal(OutputStream os, int index, FileFormatOption fileFormatOption)
throws IOException { throws IOException {
return createImageBuilder(fileFormatOption).drawable(getTextBlock()).write(os); return createImageBuilder(fileFormatOption).drawable(getTextMainBlock(fileFormatOption)).write(os);
} }
@Override @Override
protected TextBlock getTextBlock() { protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) {
return new AbstractTextBlock() { return new AbstractTextBlock() {
public void drawU(UGraphic ug) { public void drawU(UGraphic ug) {
drawMe(ug); drawMe(ug);

View File

@ -52,6 +52,7 @@ import net.sourceforge.plantuml.regex.RegexConcat;
import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexLeaf;
import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.regex.RegexResult;
import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.Url;
import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlBuilder;
import net.sourceforge.plantuml.url.UrlMode; import net.sourceforge.plantuml.url.UrlMode;
@ -68,9 +69,7 @@ public class CommandCreateEntityObject extends SingleLineCommand2<AbstractClassO
new RegexLeaf("TYPE", "object"), // new RegexLeaf("TYPE", "object"), //
RegexLeaf.spaceOneOrMore(), // RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("NAME", "(?:[%g]([^%g]+)[%g][%s]+as[%s]+)?([%pLN_.]+)"), // new RegexLeaf("NAME", "(?:[%g]([^%g]+)[%g][%s]+as[%s]+)?([%pLN_.]+)"), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREO"), //
new RegexLeaf("STEREO", "(\\<\\<.+\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
UrlBuilder.OPTIONAL, // UrlBuilder.OPTIONAL, //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
ColorParser.exp1(), RegexLeaf.end()); ColorParser.exp1(), RegexLeaf.end());

View File

@ -55,6 +55,7 @@ import net.sourceforge.plantuml.regex.RegexLeaf;
import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.regex.RegexResult;
import net.sourceforge.plantuml.skin.VisibilityModifier; import net.sourceforge.plantuml.skin.VisibilityModifier;
import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.text.StringLocated; import net.sourceforge.plantuml.text.StringLocated;
import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlBuilder;
import net.sourceforge.plantuml.utils.BlocLines; import net.sourceforge.plantuml.utils.BlocLines;
@ -70,9 +71,7 @@ public class CommandCreateEntityObjectMultilines extends CommandMultilines2<Abst
new RegexLeaf("TYPE", "object"), // new RegexLeaf("TYPE", "object"), //
RegexLeaf.spaceOneOrMore(), // RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("NAME", "(?:[%g]([^%g]+)[%g][%s]+as[%s]+)?([%pLN_.]+)"), // new RegexLeaf("NAME", "(?:[%g]([^%g]+)[%g][%s]+as[%s]+)?([%pLN_.]+)"), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREO"), //
new RegexLeaf("STEREO", "(\\<\\<.+\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
UrlBuilder.OPTIONAL, // UrlBuilder.OPTIONAL, //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
ColorParser.exp1(), // ColorParser.exp1(), //

View File

@ -59,6 +59,7 @@ import net.sourceforge.plantuml.regex.RegexConcat;
import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexLeaf;
import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.regex.RegexResult;
import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.text.StringLocated; import net.sourceforge.plantuml.text.StringLocated;
import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlBuilder;
import net.sourceforge.plantuml.utils.BlocLines; import net.sourceforge.plantuml.utils.BlocLines;
@ -74,9 +75,7 @@ public class CommandCreateJson extends CommandMultilines2<AbstractEntityDiagram>
new RegexLeaf("TYPE", "json"), // new RegexLeaf("TYPE", "json"), //
RegexLeaf.spaceOneOrMore(), // RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("NAME", "(?:[%g]([^%g]+)[%g][%s]+as[%s]+)?([%pLN_.]+)"), // new RegexLeaf("NAME", "(?:[%g]([^%g]+)[%g][%s]+as[%s]+)?([%pLN_.]+)"), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREO"), //
new RegexLeaf("STEREO", "(\\<\\<.+\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
UrlBuilder.OPTIONAL, // UrlBuilder.OPTIONAL, //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
ColorParser.exp1(), // ColorParser.exp1(), //

View File

@ -56,6 +56,7 @@ import net.sourceforge.plantuml.regex.RegexConcat;
import net.sourceforge.plantuml.regex.RegexLeaf; import net.sourceforge.plantuml.regex.RegexLeaf;
import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.regex.RegexResult;
import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlBuilder;
import net.sourceforge.plantuml.utils.LineLocation; import net.sourceforge.plantuml.utils.LineLocation;
@ -70,9 +71,7 @@ public class CommandCreateJsonSingleLine extends SingleLineCommand2<AbstractClas
new RegexLeaf("TYPE", "json"), // new RegexLeaf("TYPE", "json"), //
RegexLeaf.spaceOneOrMore(), // RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("NAME", "(?:[%g]([^%g]+)[%g][%s]+as[%s]+)?([%pLN_.]+)"), // new RegexLeaf("NAME", "(?:[%g]([^%g]+)[%g][%s]+as[%s]+)?([%pLN_.]+)"), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREO"), //
new RegexLeaf("STEREO", "(\\<\\<.+\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
UrlBuilder.OPTIONAL, // UrlBuilder.OPTIONAL, //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
ColorParser.exp1(), // ColorParser.exp1(), //

View File

@ -62,6 +62,7 @@ import net.sourceforge.plantuml.regex.RegexLeaf;
import net.sourceforge.plantuml.regex.RegexOptional; import net.sourceforge.plantuml.regex.RegexOptional;
import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.regex.RegexResult;
import net.sourceforge.plantuml.stereo.Stereotype; import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.text.StringLocated; import net.sourceforge.plantuml.text.StringLocated;
import net.sourceforge.plantuml.url.UrlBuilder; import net.sourceforge.plantuml.url.UrlBuilder;
import net.sourceforge.plantuml.utils.BlocLines; import net.sourceforge.plantuml.utils.BlocLines;
@ -77,9 +78,7 @@ public class CommandCreateMap extends CommandMultilines2<AbstractEntityDiagram>
new RegexLeaf("TYPE", "map"), // new RegexLeaf("TYPE", "map"), //
RegexLeaf.spaceOneOrMore(), // RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("NAME", "(?:[%g]([^%g]+)[%g][%s]+as[%s]+)?([%pLN_.]+)"), // new RegexLeaf("NAME", "(?:[%g]([^%g]+)[%g][%s]+as[%s]+)?([%pLN_.]+)"), //
RegexLeaf.spaceZeroOrMore(), // StereotypePattern.optional("STEREO"), //
new RegexLeaf("STEREO", "(\\<\\<.+\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
UrlBuilder.OPTIONAL, // UrlBuilder.OPTIONAL, //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
color().getRegex(), // color().getRegex(), //

View File

@ -51,7 +51,6 @@ import java.util.Set;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import net.sourceforge.plantuml.FileFormat;
import net.sourceforge.plantuml.FileFormatOption; import net.sourceforge.plantuml.FileFormatOption;
import net.sourceforge.plantuml.TitledDiagram; import net.sourceforge.plantuml.TitledDiagram;
import net.sourceforge.plantuml.WithSprite; import net.sourceforge.plantuml.WithSprite;
@ -162,7 +161,7 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw, WithSprit
} }
public DiagramDescription getDescription() { public DiagramDescription getDescription() {
return new DiagramDescription("(Project)"); return new DiagramDescription("(Gantt)");
} }
public void setWeekNumberStrategy(DayOfWeek firstDayOfWeek, int minimalDaysInFirstWeek) { public void setWeekNumberStrategy(DayOfWeek firstDayOfWeek, int minimalDaysInFirstWeek) {
@ -180,8 +179,7 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw, WithSprit
@Override @Override
protected ImageData exportDiagramNow(OutputStream os, int index, FileFormatOption fileFormatOption) protected ImageData exportDiagramNow(OutputStream os, int index, FileFormatOption fileFormatOption)
throws IOException { throws IOException {
final StringBounder stringBounder = fileFormatOption.getDefaultStringBounder(getSkinParam()); return createImageBuilder(fileFormatOption).drawable(getTextMainBlock(fileFormatOption)).write(os);
return createImageBuilder(fileFormatOption).drawable(getTextBlock(stringBounder)).write(os);
} }
public void setPrintScale(PrintScale printScale) { public void setPrintScale(PrintScale printScale) {
@ -220,13 +218,8 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw, WithSprit
} }
@Override @Override
protected TextBlock getTextBlock() { protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) {
final FileFormatOption fileFormatOption = new FileFormatOption(FileFormat.PNG);
final StringBounder stringBounder = fileFormatOption.getDefaultStringBounder(getSkinParam()); final StringBounder stringBounder = fileFormatOption.getDefaultStringBounder(getSkinParam());
return getTextBlock(stringBounder);
}
private TextBlock getTextBlock(StringBounder stringBounder) {
if (printStart == null) { if (printStart == null) {
initMinMax(); initMinMax();
} else { } else {
@ -450,13 +443,12 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw, WithSprit
} else if (task instanceof TaskGroup) { } else if (task instanceof TaskGroup) {
final TaskGroup taskGroup = (TaskGroup) task; final TaskGroup taskGroup = (TaskGroup) task;
draw = new TaskDrawGroup(timeScale, y, taskGroup.getCode().getSimpleDisplay(), getStart(taskGroup), draw = new TaskDrawGroup(timeScale, y, taskGroup.getCode().getSimpleDisplay(), getStart(taskGroup),
getEnd(taskGroup), getSkinParam(), task, this, task.getStyleBuilder()); getEnd(taskGroup), task, this, task.getStyleBuilder());
} else { } else {
final TaskImpl tmp = (TaskImpl) task; final TaskImpl tmp = (TaskImpl) task;
final String disp = hideResourceName ? tmp.getCode().getSimpleDisplay() : tmp.getPrettyDisplay(); final String disp = hideResourceName ? tmp.getCode().getSimpleDisplay() : tmp.getPrettyDisplay();
if (tmp.isDiamond()) { if (tmp.isDiamond()) {
draw = new TaskDrawDiamond(timeScale, y, disp, getStart(tmp), getSkinParam(), task, this, draw = new TaskDrawDiamond(timeScale, y, disp, getStart(tmp), task, this, task.getStyleBuilder());
task.getStyleBuilder());
} else { } else {
final boolean oddStart = printStart != null && min.compareTo(getStart(tmp)) == 0; final boolean oddStart = printStart != null && min.compareTo(getStart(tmp)) == 0;
final boolean oddEnd = printStart != null && max.compareTo(getEnd(tmp)) == 0; final boolean oddEnd = printStart != null && max.compareTo(getEnd(tmp)) == 0;

View File

@ -79,8 +79,8 @@ import net.sourceforge.plantuml.style.CommandStyleMultilinesCSS;
public class GanttDiagramFactory extends PSystemCommandFactory { public class GanttDiagramFactory extends PSystemCommandFactory {
static private final List<Subject> subjects() { static private final List<Subject<GanttDiagram>> subjects() {
return Arrays.<Subject>asList(SubjectTask.ME, SubjectProject.ME, SubjectDayOfWeek.ME, SubjectDayAsDate.ME, return Arrays.asList(SubjectTask.ME, SubjectProject.ME, SubjectDayOfWeek.ME, SubjectDayAsDate.ME,
SubjectDaysAsDates.ME, SubjectResource.ME, SubjectToday.ME, SubjectSeparator.ME); SubjectDaysAsDates.ME, SubjectResource.ME, SubjectToday.ME, SubjectSeparator.ME);
} }
@ -120,28 +120,28 @@ public class GanttDiagramFactory extends PSystemCommandFactory {
} }
private void addLanguageCommands(List<Command> cmd) { private void addLanguageCommands(List<Command> cmd) {
for (Subject subject : subjects()) for (Subject<GanttDiagram> subject : subjects())
for (SentenceSimple sentenceA : subject.getSentences()) { for (SentenceSimple<GanttDiagram> sentenceA : subject.getSentences()) {
cmd.add(NaturalCommand.create(sentenceA)); cmd.add(NaturalCommand.create(sentenceA));
for (SentenceSimple sentenceB : subject.getSentences()) { for (SentenceSimple<GanttDiagram> sentenceB : subject.getSentences()) {
final String signatureA = sentenceA.getSignature(); final String signatureA = sentenceA.getSignature();
final String signatureB = sentenceB.getSignature(); final String signatureB = sentenceB.getSignature();
if (signatureA.equals(signatureB) == false) if (signatureA.equals(signatureB) == false)
cmd.add(NaturalCommand.create(new SentenceAnd(sentenceA, sentenceB))); cmd.add(NaturalCommand.create(new SentenceAnd<GanttDiagram>(sentenceA, sentenceB)));
} }
} }
for (Subject subject : subjects()) for (Subject<GanttDiagram> subject : subjects())
for (SentenceSimple sentenceA : subject.getSentences()) for (SentenceSimple<GanttDiagram> sentenceA : subject.getSentences())
for (SentenceSimple sentenceB : subject.getSentences()) for (SentenceSimple<GanttDiagram> sentenceB : subject.getSentences())
for (SentenceSimple sentenceC : subject.getSentences()) { for (SentenceSimple<GanttDiagram> sentenceC : subject.getSentences()) {
final String signatureA = sentenceA.getSignature(); final String signatureA = sentenceA.getSignature();
final String signatureB = sentenceB.getSignature(); final String signatureB = sentenceB.getSignature();
final String signatureC = sentenceC.getSignature(); final String signatureC = sentenceC.getSignature();
if (signatureA.equals(signatureB) == false && signatureA.equals(signatureC) == false if (signatureA.equals(signatureB) == false && signatureA.equals(signatureC) == false
&& signatureC.equals(signatureB) == false) && signatureC.equals(signatureB) == false)
cmd.add(NaturalCommand.create(new SentenceAndAnd(sentenceA, sentenceB, sentenceC))); cmd.add(NaturalCommand.create(new SentenceAndAnd<GanttDiagram>(sentenceA, sentenceB, sentenceC)));
} }
} }

View File

@ -37,6 +37,7 @@ package net.sourceforge.plantuml.project;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Objects;
import java.util.Set; import java.util.Set;
import net.sourceforge.plantuml.klimt.UStroke; import net.sourceforge.plantuml.klimt.UStroke;
@ -70,7 +71,7 @@ public class TimeHeaderParameters implements GanttStyle {
this.scale = scale; this.scale = scale;
this.min = min; this.min = min;
this.max = max; this.max = max;
this.colorSet = colorSet; this.colorSet = Objects.requireNonNull(colorSet);
this.ganttStyle = ganttStyle; this.ganttStyle = ganttStyle;
this.locale = locale; this.locale = locale;
this.openClose = openClose; this.openClose = openClose;

View File

@ -59,7 +59,8 @@ public class CommandColorTask extends SingleLineCommand2<GanttDiagram> {
new RegexLeaf("CODE", "\\[([%pLN_.]+)\\]"), // new RegexLeaf("CODE", "\\[([%pLN_.]+)\\]"), //
RegexLeaf.spaceOneOrMore(), // RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("COLORS", "#(\\w+)(?:/(#?\\w+))?"), // new RegexLeaf("COLORS", "#(\\w+)(?:/(#?\\w+))?"), //
RegexLeaf.spaceZeroOrMore(), RegexLeaf.end()); RegexLeaf.spaceZeroOrMore(), //
RegexLeaf.end());
} }
@Override @Override

View File

@ -45,7 +45,7 @@ import net.sourceforge.plantuml.regex.RegexResult;
import net.sourceforge.plantuml.utils.LineLocation; import net.sourceforge.plantuml.utils.LineLocation;
public class CommandFootbox extends SingleLineCommand2<GanttDiagram> { public class CommandFootbox extends SingleLineCommand2<GanttDiagram> {
// ::remove folder when __HAXE__ // ::remove folder when __HAXE__
public CommandFootbox() { public CommandFootbox() {
super(getRegexConcat()); super(getRegexConcat());
@ -55,7 +55,8 @@ public class CommandFootbox extends SingleLineCommand2<GanttDiagram> {
return RegexConcat.build(CommandFootbox.class.getName(), RegexLeaf.start(), // return RegexConcat.build(CommandFootbox.class.getName(), RegexLeaf.start(), //
new RegexLeaf("TYPE", "(hide|show)?"), // new RegexLeaf("TYPE", "(hide|show)?"), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("footbox"), RegexLeaf.end()); // new RegexLeaf("footbox"), //
RegexLeaf.end());
} }
@Override @Override

View File

@ -63,7 +63,8 @@ public class CommandGanttArrow extends SingleLineCommand2<GanttDiagram> {
new RegexLeaf("\\>"), // new RegexLeaf("\\>"), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("CODE2", "([%pLN_.]+)"), // new RegexLeaf("CODE2", "([%pLN_.]+)"), //
RegexLeaf.spaceZeroOrMore(), RegexLeaf.end()); RegexLeaf.spaceZeroOrMore(), //
RegexLeaf.end());
} }
@Override @Override

View File

@ -57,7 +57,7 @@ public class CommandHideResourceFootbox extends SingleLineCommand2<GanttDiagram>
new RegexLeaf("ress?ources?"), // new RegexLeaf("ress?ources?"), //
RegexLeaf.spaceOneOrMore(), // RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("footbox"), // new RegexLeaf("footbox"), //
RegexLeaf.end()); // RegexLeaf.end());
} }
@Override @Override

View File

@ -57,7 +57,7 @@ public class CommandHideResourceName extends SingleLineCommand2<GanttDiagram> {
new RegexLeaf("ress?ources?"), // new RegexLeaf("ress?ources?"), //
RegexLeaf.spaceOneOrMore(), // RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("names?"), // new RegexLeaf("names?"), //
RegexLeaf.end()); // RegexLeaf.end());
} }
@Override @Override

View File

@ -70,7 +70,8 @@ public class CommandLabelOnColumn extends SingleLineCommand2<GanttDiagram> {
new RegexLeaf("ALIGNED", "(left|right)"), // new RegexLeaf("ALIGNED", "(left|right)"), //
RegexLeaf.spaceZeroOrMore(), // RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("aligned") // new RegexLeaf("aligned") //
)), RegexLeaf.end()); // )), //
RegexLeaf.end());
} }
@Override @Override

View File

@ -55,7 +55,7 @@ public class CommandLanguage extends SingleLineCommand2<GanttDiagram> {
new RegexLeaf("language"), // new RegexLeaf("language"), //
RegexLeaf.spaceOneOrMore(), // RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("LANG", "(\\w+)"), // new RegexLeaf("LANG", "(\\w+)"), //
RegexLeaf.end()); // RegexLeaf.end());
} }
@Override @Override

View File

@ -66,7 +66,7 @@ public class CommandPrintBetween extends SingleLineCommand2<GanttDiagram> {
new RegexLeaf("and"), // new RegexLeaf("and"), //
RegexLeaf.spaceOneOrMore(), // RegexLeaf.spaceOneOrMore(), //
pattern.toRegex("END"), // pattern.toRegex("END"), //
RegexLeaf.end()); // RegexLeaf.end());
} }
@Override @Override

View File

@ -77,7 +77,7 @@ public class CommandPrintScale extends SingleLineCommand2<GanttDiagram> {
new RegexLeaf("zoom"), // new RegexLeaf("zoom"), //
RegexLeaf.spaceOneOrMore(), // RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("ZOOM", "([.\\d]+)"))), // new RegexLeaf("ZOOM", "([.\\d]+)"))), //
RegexLeaf.end()); // RegexLeaf.end());
} }
@Override @Override

View File

@ -64,7 +64,6 @@ public class CommandTaskCompleteDefault extends SingleLineCommand2<GanttDiagram>
RegexLeaf.spaceOneOrMore(), // RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("VALUE", "(\\d+)"), // new RegexLeaf("VALUE", "(\\d+)"), //
new RegexLeaf(".*"), // new RegexLeaf(".*"), //
RegexLeaf.spaceZeroOrMore(), //
RegexLeaf.end()); RegexLeaf.end());
} }

View File

@ -37,27 +37,27 @@ package net.sourceforge.plantuml.project.command;
import net.sourceforge.plantuml.command.CommandExecutionResult; import net.sourceforge.plantuml.command.CommandExecutionResult;
import net.sourceforge.plantuml.command.SingleLineCommand2; import net.sourceforge.plantuml.command.SingleLineCommand2;
import net.sourceforge.plantuml.project.GanttDiagram; import net.sourceforge.plantuml.core.Diagram;
import net.sourceforge.plantuml.project.lang.Sentence; import net.sourceforge.plantuml.project.lang.Sentence;
import net.sourceforge.plantuml.regex.RegexResult; import net.sourceforge.plantuml.regex.RegexResult;
import net.sourceforge.plantuml.utils.LineLocation; import net.sourceforge.plantuml.utils.LineLocation;
public class NaturalCommand extends SingleLineCommand2<GanttDiagram> { public class NaturalCommand<D extends Diagram> extends SingleLineCommand2<D> {
private final Sentence sentence; private final Sentence<D> sentence;
public NaturalCommand(Sentence sentence) { public NaturalCommand(Sentence<D> sentence) {
super(sentence.toRegex()); super(sentence.toRegex());
this.sentence = sentence; this.sentence = sentence;
} }
@Override @Override
final protected CommandExecutionResult executeArg(GanttDiagram system, LineLocation location, RegexResult arg) { final protected CommandExecutionResult executeArg(D system, LineLocation location, RegexResult arg) {
return sentence.execute(system, arg); return sentence.execute(system, arg);
} }
public static NaturalCommand create(Sentence sentence) { public static <D extends Diagram> NaturalCommand<D> create(Sentence<D> sentence) {
return new NaturalCommand(sentence); return new NaturalCommand<D>(sentence);
} }

View File

@ -35,6 +35,7 @@
*/ */
package net.sourceforge.plantuml.project.core; package net.sourceforge.plantuml.project.core;
import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.style.StyleBuilder; import net.sourceforge.plantuml.style.StyleBuilder;
public abstract class AbstractTask implements Task { public abstract class AbstractTask implements Task {
@ -44,6 +45,7 @@ public abstract class AbstractTask implements Task {
private Task row; private Task row;
private String displayString; private String displayString;
private Stereotype stereotype;
protected AbstractTask(StyleBuilder styleBuilder, TaskCode code) { protected AbstractTask(StyleBuilder styleBuilder, TaskCode code) {
this.styleBuilder = styleBuilder; this.styleBuilder = styleBuilder;
@ -80,5 +82,16 @@ public abstract class AbstractTask implements Task {
public String getDisplayString() { public String getDisplayString() {
return this.displayString; return this.displayString;
} }
@Override
public Stereotype getStereotype() {
return stereotype;
}
@Override
public final void setStereotype(Stereotype stereotype) {
this.stereotype = stereotype;
}
} }

View File

@ -40,6 +40,7 @@ import net.sourceforge.plantuml.project.Load;
import net.sourceforge.plantuml.project.lang.CenterBorderColor; import net.sourceforge.plantuml.project.lang.CenterBorderColor;
import net.sourceforge.plantuml.project.time.Day; import net.sourceforge.plantuml.project.time.Day;
import net.sourceforge.plantuml.project.time.DayOfWeek; import net.sourceforge.plantuml.project.time.DayOfWeek;
import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.style.StyleBuilder; import net.sourceforge.plantuml.style.StyleBuilder;
import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.Url;
@ -85,4 +86,8 @@ public interface Task extends Moment {
public String getDisplayString(); public String getDisplayString();
public Stereotype getStereotype();
public void setStereotype(Stereotype stereotype);
} }

View File

@ -49,11 +49,11 @@ import net.sourceforge.plantuml.project.time.Day;
import net.sourceforge.plantuml.project.timescale.TimeScale; import net.sourceforge.plantuml.project.timescale.TimeScale;
import net.sourceforge.plantuml.real.Real; import net.sourceforge.plantuml.real.Real;
import net.sourceforge.plantuml.style.ClockwiseTopRightBottomLeft; import net.sourceforge.plantuml.style.ClockwiseTopRightBottomLeft;
import net.sourceforge.plantuml.style.ISkinParam;
import net.sourceforge.plantuml.style.PName; import net.sourceforge.plantuml.style.PName;
import net.sourceforge.plantuml.style.SName; import net.sourceforge.plantuml.style.SName;
import net.sourceforge.plantuml.style.Style; import net.sourceforge.plantuml.style.Style;
import net.sourceforge.plantuml.style.StyleBuilder; import net.sourceforge.plantuml.style.StyleBuilder;
import net.sourceforge.plantuml.style.StyleSignature;
import net.sourceforge.plantuml.style.StyleSignatureBasic; import net.sourceforge.plantuml.style.StyleSignatureBasic;
import net.sourceforge.plantuml.url.Url; import net.sourceforge.plantuml.url.Url;
import net.sourceforge.plantuml.utils.Direction; import net.sourceforge.plantuml.utils.Direction;
@ -85,8 +85,8 @@ public abstract class AbstractTaskDraw implements TaskDraw {
this.note = note; this.note = note;
} }
public AbstractTaskDraw(TimeScale timeScale, Real y, String prettyDisplay, Day start, ISkinParam skinParam, public AbstractTaskDraw(TimeScale timeScale, Real y, String prettyDisplay, Day start, Task task,
Task task, ToTaskDraw toTaskDraw, StyleBuilder styleBuilder) { ToTaskDraw toTaskDraw, StyleBuilder styleBuilder) {
this.y = y; this.y = y;
this.styleBuilder = styleBuilder; this.styleBuilder = styleBuilder;
this.toTaskDraw = toTaskDraw; this.toTaskDraw = toTaskDraw;
@ -96,7 +96,7 @@ public abstract class AbstractTaskDraw implements TaskDraw {
this.task = task; this.task = task;
} }
abstract StyleSignatureBasic getStyleSignature(); abstract StyleSignature getStyleSignature();
private StyleSignatureBasic getStyleSignatureUnstarted() { private StyleSignatureBasic getStyleSignatureUnstarted() {
return StyleSignatureBasic.of(SName.root, SName.element, SName.ganttDiagram, SName.task, SName.unstarted); return StyleSignatureBasic.of(SName.root, SName.element, SName.ganttDiagram, SName.task, SName.unstarted);

View File

@ -54,21 +54,21 @@ import net.sourceforge.plantuml.project.time.Day;
import net.sourceforge.plantuml.project.timescale.TimeScale; import net.sourceforge.plantuml.project.timescale.TimeScale;
import net.sourceforge.plantuml.real.Real; import net.sourceforge.plantuml.real.Real;
import net.sourceforge.plantuml.style.ClockwiseTopRightBottomLeft; import net.sourceforge.plantuml.style.ClockwiseTopRightBottomLeft;
import net.sourceforge.plantuml.style.ISkinParam;
import net.sourceforge.plantuml.style.SName; import net.sourceforge.plantuml.style.SName;
import net.sourceforge.plantuml.style.Style; import net.sourceforge.plantuml.style.Style;
import net.sourceforge.plantuml.style.StyleBuilder; import net.sourceforge.plantuml.style.StyleBuilder;
import net.sourceforge.plantuml.style.StyleSignature;
import net.sourceforge.plantuml.style.StyleSignatureBasic; import net.sourceforge.plantuml.style.StyleSignatureBasic;
public class TaskDrawDiamond extends AbstractTaskDraw { public class TaskDrawDiamond extends AbstractTaskDraw {
public TaskDrawDiamond(TimeScale timeScale, Real y, String prettyDisplay, Day start, ISkinParam skinParam, public TaskDrawDiamond(TimeScale timeScale, Real y, String prettyDisplay, Day start, Task task,
Task task, ToTaskDraw toTaskDraw, StyleBuilder styleBuilder) { ToTaskDraw toTaskDraw, StyleBuilder styleBuilder) {
super(timeScale, y, prettyDisplay, start, skinParam, task, toTaskDraw, styleBuilder); super(timeScale, y, prettyDisplay, start, task, toTaskDraw, styleBuilder);
} }
@Override @Override
StyleSignatureBasic getStyleSignature() { StyleSignature getStyleSignature() {
return StyleSignatureBasic.of(SName.root, SName.element, SName.ganttDiagram, SName.milestone); return StyleSignatureBasic.of(SName.root, SName.element, SName.ganttDiagram, SName.milestone);
} }

View File

@ -54,22 +54,19 @@ import net.sourceforge.plantuml.project.time.Day;
import net.sourceforge.plantuml.project.timescale.TimeScale; import net.sourceforge.plantuml.project.timescale.TimeScale;
import net.sourceforge.plantuml.real.Real; import net.sourceforge.plantuml.real.Real;
import net.sourceforge.plantuml.style.ClockwiseTopRightBottomLeft; import net.sourceforge.plantuml.style.ClockwiseTopRightBottomLeft;
import net.sourceforge.plantuml.style.ISkinParam;
import net.sourceforge.plantuml.style.SName; import net.sourceforge.plantuml.style.SName;
import net.sourceforge.plantuml.style.Style; import net.sourceforge.plantuml.style.Style;
import net.sourceforge.plantuml.style.StyleBuilder; import net.sourceforge.plantuml.style.StyleBuilder;
import net.sourceforge.plantuml.style.StyleSignature;
import net.sourceforge.plantuml.style.StyleSignatureBasic; import net.sourceforge.plantuml.style.StyleSignatureBasic;
public class TaskDrawGroup extends AbstractTaskDraw { public class TaskDrawGroup extends AbstractTaskDraw {
private final Day end; private final Day end;
private final ISkinParam skinParam; public TaskDrawGroup(TimeScale timeScale, Real y, String prettyDisplay, Day start, Day end, Task task,
ToTaskDraw toTaskDraw, StyleBuilder styleBuilder) {
public TaskDrawGroup(TimeScale timeScale, Real y, String prettyDisplay, Day start, Day end, ISkinParam skinParam, super(timeScale, y, prettyDisplay, start, task, toTaskDraw, styleBuilder);
Task task, ToTaskDraw toTaskDraw, StyleBuilder styleBuilder) {
super(timeScale, y, prettyDisplay, start, skinParam, task, toTaskDraw, styleBuilder);
this.skinParam = skinParam;
this.end = end; this.end = end;
} }
@ -122,7 +119,7 @@ public class TaskDrawGroup extends AbstractTaskDraw {
} }
@Override @Override
StyleSignatureBasic getStyleSignature() { StyleSignature getStyleSignature() {
return StyleSignatureBasic.of(SName.root, SName.element, SName.ganttDiagram, SName.task); return StyleSignatureBasic.of(SName.root, SName.element, SName.ganttDiagram, SName.task);
} }

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