1
0
mirror of https://github.com/octoleo/plantuml.git synced 2024-12-22 02:49:06 +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
# Any idea anyone how to magically synchronize those :-) ?
version = 1.2023.13beta3
version = 1.2023.13beta4
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.ErrorUml;
import net.sourceforge.plantuml.FileFormat;
import net.sourceforge.plantuml.FileFormatOption;
import net.sourceforge.plantuml.core.Diagram;
import net.sourceforge.plantuml.error.PSystemError;
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));
WasmLog.log("...drawing...");
system.exportDiagramGraphic(ug);
system.exportDiagramGraphic(ug, new FileFormatOption(FileFormat.PNG));
WasmLog.log("done!");

View File

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

View File

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

View File

@ -114,14 +114,14 @@ public abstract class AbstractPSystem implements Diagram {
}
final public String getMetadata() {
if (source == null)
if (source == null)
return getVersion();
final String rawString = source.getRawString("\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 + plainString + BackSlash.NEWLINE + getVersion();
}
@ -130,9 +130,9 @@ public abstract class AbstractPSystem implements Diagram {
}
final public long seed() {
if (source == null)
if (source == null)
return 42;
return getSource().seed();
}
@ -159,9 +159,9 @@ public abstract class AbstractPSystem implements Diagram {
}
public DisplayPositionned getTitle() {
if (source == null)
if (source == null)
return DisplayPositioned.single(Display.empty(), HorizontalAlignment.CENTER, VerticalAlignment.TOP);
return DisplayPositioned.single(source.getTitle(), HorizontalAlignment.CENTER, VerticalAlignment.TOP);
}
@ -247,7 +247,7 @@ public abstract class AbstractPSystem implements Diagram {
}
@Override
public void exportDiagramGraphic(UGraphic ug) {
public void exportDiagramGraphic(UGraphic ug, FileFormatOption fileFormatOption) {
final UFont font = UFont.monospaced(14);
final FontConfiguration fc = FontConfiguration.blackBlueTrue(font);
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")) {
preprocessorOutput = OptionPreprocOutputMode.NORMAL;
setFileFormatOption(new FileFormatOption(FileFormat.PREPROC));
} else if (s.equalsIgnoreCase("-cypher")) {
preprocessorOutput = OptionPreprocOutputMode.CYPHER;
setFileFormatOption(new FileFormatOption(FileFormat.PREPROC));
} else if (s.equalsIgnoreCase("-checkmetadata")) {
checkMetadata = true;

View File

@ -48,6 +48,7 @@ import net.sourceforge.plantuml.activitydiagram3.ActivityDiagramFactory3;
import net.sourceforge.plantuml.api.PSystemFactory;
import net.sourceforge.plantuml.board.BoardDiagramFactory;
import net.sourceforge.plantuml.bpm.BpmDiagramFactory;
import net.sourceforge.plantuml.chronology.ChronologyDiagramFactory;
import net.sourceforge.plantuml.classdiagram.ClassDiagramFactory;
import net.sourceforge.plantuml.core.Diagram;
import net.sourceforge.plantuml.core.DiagramType;
@ -223,7 +224,8 @@ public class PSystemBuilder {
// factories.add(new PSystemSudokuFactory());
// ::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 PSystemSudokuFactory());
// ::done
@ -247,11 +249,13 @@ public class PSystemBuilder {
// ::done
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());
// ::done
factories.add(new GanttDiagramFactory());
factories.add(new ChronologyDiagramFactory());
factories.add(new FlowDiagramFactory());
// ::comment when __CORE__

View File

@ -66,14 +66,13 @@ public abstract class PlainDiagram extends AbstractPSystem {
}
@Override
public void exportDiagramGraphic(UGraphic ug) {
final FileFormatOption option = new FileFormatOption(FileFormat.PNG);
public void exportDiagramGraphic(UGraphic ug, FileFormatOption fileFormatOption) {
try {
final UDrawable rootDrawable = getRootDrawable(option);
final UDrawable rootDrawable = getRootDrawable(fileFormatOption);
rootDrawable.drawU(ug);
} catch (IOException e) {
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.preproc.Defines;
import net.sourceforge.plantuml.security.SFile;
import net.sourceforge.plantuml.text.StringLocated;
import net.sourceforge.plantuml.utils.Log;
public class SourceStringReader {
@ -157,6 +158,14 @@ public class SourceStringReader {
noValidStartFound(os, fileFormatOption);
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) {
final Diagram system = b.getDiagram();
final int nbInSystem = system.getNbImages();
@ -231,7 +240,8 @@ public class SourceStringReader {
}
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());
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
public void exportDiagramGraphic(UGraphic ug) {
final TextBlock textBlock = getTextBlock();
public void exportDiagramGraphic(UGraphic ug, FileFormatOption fileFormatOption) {
final TextBlock textBlock = getTextMainBlock(fileFormatOption);
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.RegexResult;
import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.url.Url;
import net.sourceforge.plantuml.url.UrlBuilder;
import net.sourceforge.plantuml.url.UrlMode;
@ -81,9 +82,7 @@ public class CommandLinkActivity extends SingleLineCommand2<ActivityDiagram> {
new RegexLeaf("CODE", "([%pLN][%pLN_.]*)"), //
new RegexLeaf("BAR", "(?:==+)[%s]*([%pLN_.]+)[%s]*(?:==+)"), //
new RegexLeaf("QUOTED", "[%g]([^%g]+)[%g](?:[%s]+as[%s]+([%pLN_.]+))?"))), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("STEREOTYPE", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
StereotypePattern.optional("STEREOTYPE"), //
ColorParser.exp2(), //
RegexLeaf.spaceZeroOrMore(), //
UrlBuilder.OPTIONAL, //
@ -105,9 +104,7 @@ public class CommandLinkActivity extends SingleLineCommand2<ActivityDiagram> {
new RegexLeaf("BAR2", "(?:==+)[%s]*([%pLN_.]+)[%s]*(?:==+)"), //
new RegexLeaf("QUOTED2", "[%g]([^%g]+)[%g](?:[%s]+as[%s]+([%pLN][%pLN_.]*))?"), //
new RegexLeaf("QUOTED_INVISIBLE2", "(\\w.*?)")), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("STEREOTYPE2", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
StereotypePattern.optional("STEREOTYPE2"), //
new RegexOptional( //
new RegexConcat( //
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.RegexResult;
import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.text.BackSlash;
import net.sourceforge.plantuml.text.StringLocated;
import net.sourceforge.plantuml.url.Url;
@ -91,9 +92,7 @@ public class CommandLinkLongActivity extends CommandMultilines2<ActivityDiagram>
new RegexLeaf("CODE", "([%pLN][%pLN_.]*)"), //
new RegexLeaf("BAR", "(?:==+)[%s]*([%pLN_.]+)[%s]*(?:==+)"), //
new RegexLeaf("QUOTED", "[%g]([^%g]+)[%g](?:[%s]+as[%s]+([%pLN_.]+))?"))), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("STEREOTYPE", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
StereotypePattern.optional("STEREOTYPE"), //
new RegexLeaf("BACKCOLOR", "(#\\w+)?"), //
RegexLeaf.spaceZeroOrMore(), //
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.RegexResult;
import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.utils.LineLocation;
public class CommandPartition extends SingleLineCommand2<ActivityDiagram> {
@ -69,9 +70,7 @@ public class CommandPartition extends SingleLineCommand2<ActivityDiagram> {
new RegexOr(//
color().getRegex(), //
new RegexLeaf("LEGACYCOLORIGNORED", "(#[0-9a-fA-F]{6}|#?\\w+)?")), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("STEREOTYPE", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
StereotypePattern.optional("STEREOTYPE"), //
new RegexLeaf("\\{?"), //
RegexLeaf.end());
}
@ -89,12 +88,10 @@ public class CommandPartition extends SingleLineCommand2<ActivityDiagram> {
final Entity p = diagram.getCurrentGroup();
final Colors colors = color().getColor(arg, diagram.getSkinParam().getIHtmlColorSet());
if (colors.isEmpty() == false) {
if (colors.isEmpty() == false)
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();
}

View File

@ -40,7 +40,6 @@ import java.io.OutputStream;
import java.util.Map;
import java.util.Objects;
import net.sourceforge.plantuml.FileFormat;
import net.sourceforge.plantuml.FileFormatOption;
import net.sourceforge.plantuml.UmlDiagram;
import net.sourceforge.plantuml.activitydiagram3.ftile.BoxStyle;
@ -208,8 +207,7 @@ public class ActivityDiagram3 extends UmlDiagram {
}
@Override
protected TextBlock getTextBlock() {
final FileFormatOption fileFormatOption = new FileFormatOption(FileFormat.PNG);
protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) {
final StringBounder stringBounder = fileFormatOption.getDefaultStringBounder(getSkinParam());
return getTextBlock(stringBounder);
}
@ -318,10 +316,10 @@ public class ActivityDiagram3 extends UmlDiagram {
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();
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);
setNextLinkRendererInternal(LinkRendering.none());
setCurrent(instructionIf);
@ -392,7 +390,8 @@ public class ActivityDiagram3 extends UmlDiagram {
manageSwimlaneStrategy();
if (current() instanceof InstructionRepeat) {
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();
}
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.sequencediagram.NotePosition;
import net.sourceforge.plantuml.sequencediagram.NoteType;
import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.style.ISkinParam;
import net.sourceforge.plantuml.style.PName;
import net.sourceforge.plantuml.style.SName;
@ -95,12 +96,12 @@ public class Branch {
}
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.labelTest = Objects.requireNonNull(labelTest);
this.labelPositive = Objects.requireNonNull(labelPositive);
final Style style = getDefaultStyleDefinitionDiamond().getMergedStyle(styleBuilder);
final Style style = getDefaultStyleDefinitionDiamond().withTOBECHANGED(stereotype).getMergedStyle(styleBuilder);
this.color = color == null
? style.value(PName.BackGroundColor).asColor(styleBuilder.getSkinParam().getIHtmlColorSet())
: 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.Swimlane;
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.GtileIfAlone;
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.creole.Display;
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.NoteType;
import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.style.ISkinParam;
import net.sourceforge.plantuml.url.Url;
@ -75,6 +74,7 @@ public class InstructionIf extends WithNote implements Instruction, InstructionC
private Branch current;
private final LinkRendering topInlinkRendering;
private LinkRendering outColor = LinkRendering.none();
private final Stereotype stereotype;
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,
LinkRendering inlinkRendering, HColor color, ISkinParam skinParam, Url url) {
LinkRendering inlinkRendering, HColor color, ISkinParam skinParam, Url url, Stereotype stereotype) {
this.url = url;
this.stereotype = stereotype;
this.parent = parent;
this.skinParam = skinParam;
this.topInlinkRendering = Objects.requireNonNull(inlinkRendering);
this.swimlane = swimlane;
this.thens.add(new Branch(skinParam.getCurrentStyleBuilder(), swimlane, whenThen, labelTest, color,
LinkRendering.none()));
LinkRendering.none(), stereotype));
this.current = this.thens.get(0);
}
@ -138,11 +139,11 @@ public class InstructionIf extends WithNote implements Instruction, InstructionC
if (elseBranch == null)
this.elseBranch = new Branch(skinParam.getCurrentStyleBuilder(), swimlane, LinkRendering.none(),
Display.NULL, null, LinkRendering.none());
Display.NULL, null, LinkRendering.none(), stereotype);
elseBranch.updateFtile(factory);
Ftile result = factory.createIf(swimlane, thens, elseBranch, outColor, topInlinkRendering, url,
getPositionedNotes());
getPositionedNotes(), stereotype);
// if (getPositionedNotes().size() > 0)
// 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.elseBranch = new Branch(skinParam.getCurrentStyleBuilder(), swimlane, whenElse, Display.NULL, null,
LinkRendering.none());
LinkRendering.none(), stereotype);
this.current = elseBranch;
return true;
}
@ -180,7 +181,8 @@ public class InstructionIf extends WithNote implements Instruction, InstructionC
return false;
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);
return true;
@ -190,7 +192,7 @@ public class InstructionIf extends WithNote implements Instruction, InstructionC
endifCalled = true;
if (elseBranch == null)
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.current.setInlinkRendering(nextLinkRenderer);

View File

@ -58,7 +58,7 @@ import net.sourceforge.plantuml.sequencediagram.NoteType;
import net.sourceforge.plantuml.style.ISkinParam;
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 ISkinParam skinParam;
@ -166,7 +166,7 @@ public class InstructionSwitch extends WithNote implements Instruction, Instruct
this.current.setSpecial(nextLinkRenderer);
this.current = new Branch(skinParam.getCurrentStyleBuilder(), swimlane,
LinkRendering.none().withDisplay(labelCase), labelCase, null,
LinkRendering.none().withDisplay(labelCase));
LinkRendering.none().withDisplay(labelCase), null);
this.switches.add(this.current);
return true;
}

View File

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

View File

@ -78,9 +78,8 @@ public class CommandArrow3 extends SingleLineCommand2<ActivityDiagram3> {
diagram.setColorNextArrow(rainbow);
}
final String label = arg.get("LABEL", 0);
if (label != null && label.length() > 0) {
if (label != null && label.length() > 0)
diagram.setLabelNextArrow(Display.getWithNewlines(label));
}
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.RegexOptional;
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.UrlBuilder;
import net.sourceforge.plantuml.url.UrlMode;
@ -63,7 +65,7 @@ public class CommandIf2 extends SingleLineCommand2<ActivityDiagram3> {
UrlBuilder.OPTIONAL, //
ColorParser.exp4(), //
new RegexLeaf("if"), //
RegexLeaf.spaceZeroOrMore(), //
StereotypePattern.optional("STEREO"), //
new RegexLeaf("\\("), //
new RegexLeaf("TEST", "(.*?)"), //
new RegexLeaf("\\)"), //
@ -85,9 +87,8 @@ public class CommandIf2 extends SingleLineCommand2<ActivityDiagram3> {
final HColor color = s == null ? null : diagram.getSkinParam().getIHtmlColorSet().getColor(s);
String test = arg.get("TEST", 0);
if (test.length() == 0) {
if (test.length() == 0)
test = null;
}
final Url url;
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);
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();
}

View File

@ -82,10 +82,10 @@ public class CommandIf4 extends SingleLineCommand2<ActivityDiagram3> {
final HColor color = s == null ? null : diagram.getSkinParam().getIHtmlColorSet().getColor(s);
String test = arg.get("TEST", 0);
if (test.length() == 0) {
if (test.length() == 0)
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();
}

View File

@ -72,7 +72,7 @@ public class CommandIfLegacy1 extends SingleLineCommand2<ActivityDiagram3> {
protected CommandExecutionResult executeArg(ActivityDiagram3 diagram, LineLocation location, RegexResult arg) {
diagram.startIf(Display.getWithNewlines(arg.get("TEST", 0)), Display.getWithNewlines(arg.get("WHEN", 0)), null,
null);
null, null);
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.RegexResult;
import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.style.PName;
import net.sourceforge.plantuml.style.Style;
import net.sourceforge.plantuml.utils.LineLocation;
@ -77,9 +78,7 @@ public class CommandPartition3 extends SingleLineCommand2<ActivityDiagram3> {
new RegexConcat( //
RegexLeaf.spaceOneOrMore(), //
color("BACK2").getRegex())), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("STEREO", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
StereotypePattern.optional("STEREO"), //
new RegexLeaf("\\{?"), //
RegexLeaf.end());
}

View File

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

View File

@ -89,7 +89,7 @@ public interface FtileFactory {
HColor color, Instruction specialOut, Ftile backward, LinkRendering incoming1, LinkRendering incoming2);
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,
LinkRendering topInlinkRendering, Display labelTest);

View File

@ -188,8 +188,8 @@ public class FtileFactoryDelegator implements FtileFactory {
@Override
public Ftile createIf(Swimlane swimlane, List<Branch> thens, Branch elseBranch, LinkRendering afterEndwhile,
LinkRendering topInlinkRendering, Url url, Collection<PositionedNote> notes) {
return factory.createIf(swimlane, thens, elseBranch, afterEndwhile, topInlinkRendering, url, notes);
LinkRendering topInlinkRendering, Url url, Collection<PositionedNote> notes, Stereotype stereotype) {
return factory.createIf(swimlane, thens, elseBranch, afterEndwhile, topInlinkRendering, url, notes, stereotype);
}
@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.klimt.color.HColor;
import net.sourceforge.plantuml.skin.Pragma;
import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.style.PName;
import net.sourceforge.plantuml.style.Style;
import net.sourceforge.plantuml.svek.ConditionEndStyle;
@ -65,14 +66,14 @@ public class FtileFactoryDelegatorIf extends FtileFactoryDelegator {
@Override
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 ConditionEndStyle conditionEndStyle = skinParam().getConditionEndStyle();
final Branch branch0 = thens.get(0);
final Style styleArrow = getDefaultStyleDefinitionArrow().getMergedStyle(skinParam().getCurrentStyleBuilder());
final Style styleDiamond = getDefaultStyleDefinitionDiamond()
final Style styleDiamond = getDefaultStyleDefinitionDiamond().withTOBECHANGED(stereotype)
.getMergedStyle(skinParam().getCurrentStyleBuilder());
final HColor backColor = branch0.getColor() == null
? 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) {
final Set<Swimlane> result = new HashSet<>();
for (Ftile tile : tiles) {
for (Ftile tile : tiles)
result.addAll(tile.getSwimlanes());
}
return Collections.unmodifiableSet(result);
}
@ -105,9 +105,9 @@ class FtileForkInner extends AbstractFtile {
for (Ftile ftile : forks) {
final XDimension2D dim = ftile.calculateDimension(stringBounder);
width += dim.getWidth();
if (dim.getHeight() > height) {
if (dim.getHeight() > height)
height = dim.getHeight();
}
}
final XDimension2D dimTotal = new XDimension2D(width, height);
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) {
double xpos = 0;
for (Ftile ftile : forks) {
if (ftile == searched) {
if (ftile == searched)
return UTranslate.dx(xpos);
}
final XDimension2D dim = ftile.calculateDimension(stringBounder);
xpos += dim.getWidth();
}

View File

@ -85,7 +85,7 @@ public class ParallelBuilderFork extends AbstractParallelFtilesBuilder {
Ftile result = middle;
final List<Connection> conns = new ArrayList<>();
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);
double x = 0;
for (Ftile tmp : list99) {

View File

@ -169,7 +169,7 @@ public class VCompactFactory implements FtileFactory {
@Override
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<>();
for (Branch branch : thens)
ftiles.add(branch.getFtile());

View File

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

View File

@ -194,7 +194,7 @@ public class BpmDiagram extends UmlDiagram {
}
@Override
protected TextBlock getTextBlock() {
protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) {
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.stereo.Stereotag;
import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.url.Url;
import net.sourceforge.plantuml.url.UrlBuilder;
import net.sourceforge.plantuml.url.UrlMode;
@ -101,9 +102,7 @@ public class CommandCreateClass extends SingleLineCommand2<ClassDiagram> {
new RegexLeaf("GENERIC", "\\<(" + GenericRegexProducer.PATTERN + ")\\>"))), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("STEREO", "(\\<\\<.*\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
StereotypePattern.optional("STEREO"), //
new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), //
RegexLeaf.spaceZeroOrMore(), //
UrlBuilder.OPTIONAL, //

View File

@ -65,6 +65,7 @@ import net.sourceforge.plantuml.regex.RegexResult;
import net.sourceforge.plantuml.skin.VisibilityModifier;
import net.sourceforge.plantuml.stereo.Stereotag;
import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.text.StringLocated;
import net.sourceforge.plantuml.url.Url;
import net.sourceforge.plantuml.url.UrlBuilder;
@ -115,9 +116,7 @@ public class CommandCreateClassMultilines extends CommandMultilines2<ClassDiagra
new RegexLeaf("GENERIC", "\\<(" + GenericRegexProducer.PATTERN + ")\\>"))), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("STEREO", "(\\<\\<.+\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
StereotypePattern.optional("STEREO"), //
new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), //
RegexLeaf.spaceZeroOrMore(), //
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.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.Stereotag;
import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.url.Url;
import net.sourceforge.plantuml.url.UrlBuilder;
import net.sourceforge.plantuml.url.UrlMode;
@ -88,21 +88,14 @@ public class CommandCreateElementFull2 extends SingleLineCommand2<ClassDiagram>
new RegexLeaf("CODE1", CommandCreateElementFull.CODE_WITH_QUOTE), //
new RegexConcat(//
new RegexLeaf("DISPLAY2", CommandCreateElementFull.DISPLAY), //
new RegexOptional( //
new RegexConcat( //
RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("STEREOTYPE2", "(\\<\\<.+\\>\\>)") //
)), //
RegexLeaf.spaceZeroOrMore(), //
StereotypePattern.optional("STEREOTYPE2"), //
new RegexLeaf("as"), //
RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("CODE2", CommandCreateElementFull.CODE)) //
), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("STEREOTYPE", "(\\<\\<.+\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
StereotypePattern.optional("STEREOTYPE"), //
new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), //
RegexLeaf.spaceZeroOrMore(), //
UrlBuilder.OPTIONAL, //
@ -118,21 +111,14 @@ public class CommandCreateElementFull2 extends SingleLineCommand2<ClassDiagram>
new RegexLeaf("CODE1", CommandCreateElementFull.CODE_WITH_QUOTE), //
new RegexConcat(//
new RegexLeaf("DISPLAY2", CommandCreateElementFull.DISPLAY), //
new RegexOptional( //
new RegexConcat( //
RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("STEREOTYPE2", "(\\<\\<.+\\>\\>)") //
)), //
RegexLeaf.spaceZeroOrMore(), //
StereotypePattern.optional("STEREOTYPE2"), //
new RegexLeaf("as"), //
RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("CODE2", CommandCreateElementFull.CODE)) //
), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("STEREOTYPE", "(\\<\\<.+\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
StereotypePattern.optional("STEREOTYPE"), //
new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), //
RegexLeaf.spaceZeroOrMore(), //
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.RegexResult;
import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.utils.LineLocation;
public class CommandStereotype extends SingleLineCommand2<ClassDiagram> {
@ -60,7 +61,8 @@ public class CommandStereotype extends SingleLineCommand2<ClassDiagram> {
RegexLeaf.start(), //
new RegexLeaf("NAME", "([%pLN_.]+|[%g][^%g]+[%g])"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("STEREO", "(\\<\\<.*\\>\\>)"), RegexLeaf.end()); //
StereotypePattern.mandatory("STEREO"), //
RegexLeaf.end()); //
}
@Override

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -68,7 +68,7 @@ public interface Diagram {
*/
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)

View File

@ -38,9 +38,9 @@ package net.sourceforge.plantuml.core;
import net.sourceforge.plantuml.utils.StartUtils;
public enum DiagramType {
// ::remove folder when __HAXE__
UML, BPM, DITAA, DOT, PROJECT, JCCKIT, SALT, FLOW, CREOLE, MATH, LATEX, DEFINITION, GANTT, NW,
MINDMAP, WBS, WIRE, JSON, GIT, BOARD, YAML, HCL, EBNF, REGEX, FILES, UNKNOWN;
// ::remove folder when __HAXE__
UML, BPM, DITAA, DOT, PROJECT, JCCKIT, SALT, FLOW, CREOLE, MATH, LATEX, DEFINITION, GANTT, CHRONOLOGY, NW, MINDMAP,
WBS, WIRE, JSON, GIT, BOARD, YAML, HCL, EBNF, REGEX, FILES, UNKNOWN;
static public DiagramType getTypeFromArobaseStart(String s) {
s = s.toLowerCase();
@ -59,7 +59,8 @@ public enum DiagramType {
if (StartUtils.startsWithSymbolAnd("startdot", s))
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))
return JCCKIT;
// ::done
@ -126,6 +127,9 @@ public enum DiagramType {
if (StartUtils.startsWithSymbolAnd("startfiles", s))
return FILES;
if (StartUtils.startsWithSymbolAnd("startchronology", s))
return CHRONOLOGY;
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.RegexResult;
import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.url.Url;
import net.sourceforge.plantuml.url.UrlBuilder;
import net.sourceforge.plantuml.url.UrlMode;
@ -73,11 +74,11 @@ public class CommandCreateDomain extends SingleLineCommand2<DescriptionDiagram>
new RegexLeaf("DISPLAY", DISPLAY_WITH_GENERIC), //
RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("as"), //
RegexLeaf.spaceOneOrMore(), new RegexLeaf("CODE", "([a-zA-Z0-9]+)"), RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("STEREO", "(\\<\\<.+\\>\\>)?"), //
RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("CODE", "([a-zA-Z0-9]+)"), //
StereotypePattern.optional("STEREO"), //
// domain: lexical, causal, biddable
// requirement: FR, NFR, quality
RegexLeaf.spaceZeroOrMore(), //
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.RegexResult;
import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.utils.LineLocation;
public class CommandArchimate extends SingleLineCommand2<DescriptionDiagram> {
@ -74,44 +75,25 @@ public class CommandArchimate extends SingleLineCommand2<DescriptionDiagram> {
new RegexLeaf("CODE1", CommandCreateElementFull.CODE_WITH_QUOTE), //
new RegexConcat(//
new RegexLeaf("DISPLAY2", CommandCreateElementFull.DISPLAY), //
new RegexOptional( //
new RegexConcat( //
RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("STEREOTYPE2", "(?:\\<\\<([-\\w]+)\\>\\>)") //
)), //
RegexLeaf.spaceZeroOrMore(), //
StereotypePattern.optionalArchimate("STEREOTYPE2"), //
new RegexLeaf("as"), //
RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("CODE2", CommandCreateElementFull.CODE)), //
new RegexConcat(//
new RegexLeaf("CODE3", CommandCreateElementFull.CODE), //
new RegexOptional( //
new RegexConcat( //
RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("STEREOTYPE3", "(?:\\<\\<([-\\w]+)\\>\\>)") //
)), //
RegexLeaf.spaceOneOrMore(), //
StereotypePattern.optionalArchimate("STEREOTYPE3"), //
new RegexLeaf("as"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("DISPLAY3", CommandCreateElementFull.DISPLAY)), //
new RegexConcat(//
new RegexLeaf("DISPLAY4", CommandCreateElementFull.DISPLAY_WITHOUT_QUOTE), //
new RegexOptional( //
new RegexConcat( //
RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("STEREOTYPE4", "(?:\\<\\<([-\\w]+)\\>\\>)") //
)), //
RegexLeaf.spaceZeroOrMore(), //
StereotypePattern.optionalArchimate("STEREOTYPE4"), //
new RegexLeaf("as"), //
RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("CODE4", CommandCreateElementFull.CODE)) //
), //
RegexLeaf.spaceZeroOrMore(), //
new RegexOptional( //
new RegexConcat( //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("STEREOTYPE", "(?:\\<\\<([-\\w]+)\\>\\>)") //
)), RegexLeaf.end());
StereotypePattern.optionalArchimate("STEREOTYPE"), //
RegexLeaf.end());
}
private static ColorParser color() {
@ -134,7 +116,7 @@ public class CommandArchimate extends SingleLineCommand2<DescriptionDiagram> {
entity = diagram.reallyCreateLeaf(quark, Display.getWithNewlines(display), LeafType.DESCRIPTION,
USymbols.ARCHIMATE);
final String icon = arg.getLazzy("STEREOTYPE", 0);
final String icon = StereotypePattern.removeChevronBrackets(arg.getLazzy("STEREOTYPE", 0));
entity.setDisplay(Display.getWithNewlines(display));
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.RegexResult;
import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.url.UrlBuilder;
import net.sourceforge.plantuml.utils.BlocLines;
@ -77,13 +78,7 @@ public class CommandArchimateMultilines extends CommandMultilines2<AbstractEntit
color().getRegex(), //
RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("CODE", "([%pLN_.]+)"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexOptional( //
new RegexConcat( //
RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("STEREOTYPE", "(?:\\<\\<([-\\w]+)\\>\\>)") //
)), //
RegexLeaf.spaceZeroOrMore(), //
StereotypePattern.optionalArchimate("STEREOTYPE"), //
UrlBuilder.OPTIONAL, //
RegexLeaf.spaceZeroOrMore(), //
ColorParser.exp1(), //
@ -108,7 +103,7 @@ public class CommandArchimateMultilines extends CommandMultilines2<AbstractEntit
if (quark.getData() != null)
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,
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.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.Stereotag;
import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.url.Url;
import net.sourceforge.plantuml.url.UrlBuilder;
import net.sourceforge.plantuml.url.UrlMode;
@ -84,43 +84,26 @@ public class CommandCreateElementFull extends SingleLineCommand2<DescriptionDiag
new RegexLeaf("CODE1", CODE_WITH_QUOTE), //
new RegexConcat(//
new RegexLeaf("DISPLAY2", DISPLAY), //
new RegexOptional( //
new RegexConcat( //
RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("STEREOTYPE2", "(\\<\\<.+\\>\\>)")//
)), //
RegexLeaf.spaceZeroOrMore(), //
StereotypePattern.optional("STEREOTYPE2"), //
new RegexLeaf("as"), //
RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("CODE2", CODE)), //
new RegexConcat(//
new RegexLeaf("CODE3", CODE), //
new RegexOptional( //
new RegexConcat( //
RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("STEREOTYPE3", "(\\<\\<.+\\>\\>)") //
)), //
RegexLeaf.spaceOneOrMore(), //
StereotypePattern.optional("STEREOTYPE3"), //
new RegexLeaf("as"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("DISPLAY3", DISPLAY)), //
new RegexConcat(//
new RegexLeaf("DISPLAY4", DISPLAY_WITHOUT_QUOTE), //
new RegexOptional( //
new RegexConcat( //
RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("STEREOTYPE4", "(\\<\\<.+\\>\\>)") //
)), //
RegexLeaf.spaceZeroOrMore(), //
StereotypePattern.optional("STEREOTYPE4"), //
new RegexLeaf("as"), //
RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("CODE4", CODE)) //
), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("TAGS1", Stereotag.pattern() + "?"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("STEREOTYPE", "(\\<\\<.+\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
StereotypePattern.optional("STEREOTYPE"), //
new RegexLeaf("TAGS2", Stereotag.pattern() + "?"), //
RegexLeaf.spaceZeroOrMore(), //
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.RegexResult;
import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.url.Url;
import net.sourceforge.plantuml.url.UrlBuilder;
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(), //
new RegexLeaf("TYPE", "(" + CommandCreateElementFull.ALL_TYPES + ")[%s]+"), //
new RegexLeaf("CODE", "([%pLN_.]+)"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("STEREO", "(\\<\\<.+\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
StereotypePattern.optional("STEREO"), //
UrlBuilder.OPTIONAL, //
RegexLeaf.spaceZeroOrMore(), //
ColorParser.exp1(), //
@ -110,9 +109,7 @@ public class CommandCreateElementMultilines extends CommandMultilines2<AbstractE
return RegexConcat.build(CommandCreateElementMultilines.class.getName() + type, RegexLeaf.start(), //
new RegexLeaf("TYPE", "(" + CommandCreateElementFull.ALL_TYPES + ")[%s]+"), //
new RegexLeaf("CODE", "([%pLN_.]+)"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("STEREO", "(\\<\\<.+\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
StereotypePattern.optional("STEREO"), //
UrlBuilder.OPTIONAL, //
RegexLeaf.spaceZeroOrMore(), //
ColorParser.exp1(), //

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -94,7 +94,7 @@ public class JsonDiagram extends TitledDiagram {
protected ImageData exportDiagramNow(OutputStream os, int index, FileFormatOption fileFormatOption)
throws IOException {
return createImageBuilder(fileFormatOption).drawable(getTextBlock()).write(os);
return createImageBuilder(fileFormatOption).drawable(getTextMainBlock(fileFormatOption)).write(os);
}
private void drawInternal(UGraphic ug) {
@ -113,7 +113,7 @@ public class JsonDiagram extends TitledDiagram {
}
@Override
protected TextBlock getTextBlock() {
protected TextBlock getTextMainBlock(final FileFormatOption fileFormatOption) {
return new AbstractTextBlock() {
public void drawU(UGraphic ug) {
@ -121,7 +121,7 @@ public class JsonDiagram extends TitledDiagram {
}
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)
throws IOException {
return createImageBuilder(fileFormatOption).drawable(getTextBlock()).write(os);
return createImageBuilder(fileFormatOption).drawable(getTextMainBlock(fileFormatOption)).write(os);
}
@Override
protected TextBlock getTextBlock() {
protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) {
return new AbstractTextBlock() {
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)
throws IOException {
return createImageBuilder(fileFormatOption).drawable(getTextBlock()).write(os);
return createImageBuilder(fileFormatOption).drawable(getTextMainBlock(fileFormatOption)).write(os);
}
@Override
protected TextBlock getTextBlock() {
protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) {
return new AbstractTextBlock() {
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)
throws IOException {
return createImageBuilder(fileFormatOption).drawable(getTextBlock()).write(os);
return createImageBuilder(fileFormatOption).drawable(getTextMainBlock(fileFormatOption)).write(os);
}
@Override
protected TextBlock getTextBlock() {
protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) {
return new AbstractTextBlock() {
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)
throws IOException {
return createImageBuilder(fileFormatOption).drawable(getTextBlock()).write(os);
return createImageBuilder(fileFormatOption).drawable(getTextMainBlock(fileFormatOption)).write(os);
}
@Override
protected TextBlock getTextBlock() {
protected TextBlock getTextMainBlock(FileFormatOption fileFormatOption) {
return new AbstractTextBlock() {
public void drawU(UGraphic 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.RegexResult;
import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.url.Url;
import net.sourceforge.plantuml.url.UrlBuilder;
import net.sourceforge.plantuml.url.UrlMode;
@ -68,9 +69,7 @@ public class CommandCreateEntityObject extends SingleLineCommand2<AbstractClassO
new RegexLeaf("TYPE", "object"), //
RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("NAME", "(?:[%g]([^%g]+)[%g][%s]+as[%s]+)?([%pLN_.]+)"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("STEREO", "(\\<\\<.+\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
StereotypePattern.optional("STEREO"), //
UrlBuilder.OPTIONAL, //
RegexLeaf.spaceZeroOrMore(), //
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.skin.VisibilityModifier;
import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.text.StringLocated;
import net.sourceforge.plantuml.url.UrlBuilder;
import net.sourceforge.plantuml.utils.BlocLines;
@ -70,9 +71,7 @@ public class CommandCreateEntityObjectMultilines extends CommandMultilines2<Abst
new RegexLeaf("TYPE", "object"), //
RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("NAME", "(?:[%g]([^%g]+)[%g][%s]+as[%s]+)?([%pLN_.]+)"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("STEREO", "(\\<\\<.+\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
StereotypePattern.optional("STEREO"), //
UrlBuilder.OPTIONAL, //
RegexLeaf.spaceZeroOrMore(), //
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.RegexResult;
import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.text.StringLocated;
import net.sourceforge.plantuml.url.UrlBuilder;
import net.sourceforge.plantuml.utils.BlocLines;
@ -74,9 +75,7 @@ public class CommandCreateJson extends CommandMultilines2<AbstractEntityDiagram>
new RegexLeaf("TYPE", "json"), //
RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("NAME", "(?:[%g]([^%g]+)[%g][%s]+as[%s]+)?([%pLN_.]+)"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("STEREO", "(\\<\\<.+\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
StereotypePattern.optional("STEREO"), //
UrlBuilder.OPTIONAL, //
RegexLeaf.spaceZeroOrMore(), //
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.RegexResult;
import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.url.UrlBuilder;
import net.sourceforge.plantuml.utils.LineLocation;
@ -70,9 +71,7 @@ public class CommandCreateJsonSingleLine extends SingleLineCommand2<AbstractClas
new RegexLeaf("TYPE", "json"), //
RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("NAME", "(?:[%g]([^%g]+)[%g][%s]+as[%s]+)?([%pLN_.]+)"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("STEREO", "(\\<\\<.+\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
StereotypePattern.optional("STEREO"), //
UrlBuilder.OPTIONAL, //
RegexLeaf.spaceZeroOrMore(), //
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.RegexResult;
import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.stereo.StereotypePattern;
import net.sourceforge.plantuml.text.StringLocated;
import net.sourceforge.plantuml.url.UrlBuilder;
import net.sourceforge.plantuml.utils.BlocLines;
@ -77,9 +78,7 @@ public class CommandCreateMap extends CommandMultilines2<AbstractEntityDiagram>
new RegexLeaf("TYPE", "map"), //
RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("NAME", "(?:[%g]([^%g]+)[%g][%s]+as[%s]+)?([%pLN_.]+)"), //
RegexLeaf.spaceZeroOrMore(), //
new RegexLeaf("STEREO", "(\\<\\<.+\\>\\>)?"), //
RegexLeaf.spaceZeroOrMore(), //
StereotypePattern.optional("STEREO"), //
UrlBuilder.OPTIONAL, //
RegexLeaf.spaceZeroOrMore(), //
color().getRegex(), //

View File

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

View File

@ -79,8 +79,8 @@ import net.sourceforge.plantuml.style.CommandStyleMultilinesCSS;
public class GanttDiagramFactory extends PSystemCommandFactory {
static private final List<Subject> subjects() {
return Arrays.<Subject>asList(SubjectTask.ME, SubjectProject.ME, SubjectDayOfWeek.ME, SubjectDayAsDate.ME,
static private final List<Subject<GanttDiagram>> subjects() {
return Arrays.asList(SubjectTask.ME, SubjectProject.ME, SubjectDayOfWeek.ME, SubjectDayAsDate.ME,
SubjectDaysAsDates.ME, SubjectResource.ME, SubjectToday.ME, SubjectSeparator.ME);
}
@ -120,28 +120,28 @@ public class GanttDiagramFactory extends PSystemCommandFactory {
}
private void addLanguageCommands(List<Command> cmd) {
for (Subject subject : subjects())
for (SentenceSimple sentenceA : subject.getSentences()) {
for (Subject<GanttDiagram> subject : subjects())
for (SentenceSimple<GanttDiagram> sentenceA : subject.getSentences()) {
cmd.add(NaturalCommand.create(sentenceA));
for (SentenceSimple sentenceB : subject.getSentences()) {
for (SentenceSimple<GanttDiagram> sentenceB : subject.getSentences()) {
final String signatureA = sentenceA.getSignature();
final String signatureB = sentenceB.getSignature();
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 (SentenceSimple sentenceA : subject.getSentences())
for (SentenceSimple sentenceB : subject.getSentences())
for (SentenceSimple sentenceC : subject.getSentences()) {
for (Subject<GanttDiagram> subject : subjects())
for (SentenceSimple<GanttDiagram> sentenceA : subject.getSentences())
for (SentenceSimple<GanttDiagram> sentenceB : subject.getSentences())
for (SentenceSimple<GanttDiagram> 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(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.Map;
import java.util.Objects;
import java.util.Set;
import net.sourceforge.plantuml.klimt.UStroke;
@ -70,7 +71,7 @@ public class TimeHeaderParameters implements GanttStyle {
this.scale = scale;
this.min = min;
this.max = max;
this.colorSet = colorSet;
this.colorSet = Objects.requireNonNull(colorSet);
this.ganttStyle = ganttStyle;
this.locale = locale;
this.openClose = openClose;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -64,7 +64,6 @@ public class CommandTaskCompleteDefault extends SingleLineCommand2<GanttDiagram>
RegexLeaf.spaceOneOrMore(), //
new RegexLeaf("VALUE", "(\\d+)"), //
new RegexLeaf(".*"), //
RegexLeaf.spaceZeroOrMore(), //
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.SingleLineCommand2;
import net.sourceforge.plantuml.project.GanttDiagram;
import net.sourceforge.plantuml.core.Diagram;
import net.sourceforge.plantuml.project.lang.Sentence;
import net.sourceforge.plantuml.regex.RegexResult;
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());
this.sentence = sentence;
}
@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);
}
public static NaturalCommand create(Sentence sentence) {
return new NaturalCommand(sentence);
public static <D extends Diagram> NaturalCommand<D> create(Sentence<D> sentence) {
return new NaturalCommand<D>(sentence);
}

View File

@ -35,6 +35,7 @@
*/
package net.sourceforge.plantuml.project.core;
import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.style.StyleBuilder;
public abstract class AbstractTask implements Task {
@ -44,6 +45,7 @@ public abstract class AbstractTask implements Task {
private Task row;
private String displayString;
private Stereotype stereotype;
protected AbstractTask(StyleBuilder styleBuilder, TaskCode code) {
this.styleBuilder = styleBuilder;
@ -80,5 +82,16 @@ public abstract class AbstractTask implements Task {
public String getDisplayString() {
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.time.Day;
import net.sourceforge.plantuml.project.time.DayOfWeek;
import net.sourceforge.plantuml.stereo.Stereotype;
import net.sourceforge.plantuml.style.StyleBuilder;
import net.sourceforge.plantuml.url.Url;
@ -85,4 +86,8 @@ public interface Task extends Moment {
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.real.Real;
import net.sourceforge.plantuml.style.ClockwiseTopRightBottomLeft;
import net.sourceforge.plantuml.style.ISkinParam;
import net.sourceforge.plantuml.style.PName;
import net.sourceforge.plantuml.style.SName;
import net.sourceforge.plantuml.style.Style;
import net.sourceforge.plantuml.style.StyleBuilder;
import net.sourceforge.plantuml.style.StyleSignature;
import net.sourceforge.plantuml.style.StyleSignatureBasic;
import net.sourceforge.plantuml.url.Url;
import net.sourceforge.plantuml.utils.Direction;
@ -85,8 +85,8 @@ public abstract class AbstractTaskDraw implements TaskDraw {
this.note = note;
}
public AbstractTaskDraw(TimeScale timeScale, Real y, String prettyDisplay, Day start, ISkinParam skinParam,
Task task, ToTaskDraw toTaskDraw, StyleBuilder styleBuilder) {
public AbstractTaskDraw(TimeScale timeScale, Real y, String prettyDisplay, Day start, Task task,
ToTaskDraw toTaskDraw, StyleBuilder styleBuilder) {
this.y = y;
this.styleBuilder = styleBuilder;
this.toTaskDraw = toTaskDraw;
@ -96,7 +96,7 @@ public abstract class AbstractTaskDraw implements TaskDraw {
this.task = task;
}
abstract StyleSignatureBasic getStyleSignature();
abstract StyleSignature getStyleSignature();
private StyleSignatureBasic getStyleSignatureUnstarted() {
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.real.Real;
import net.sourceforge.plantuml.style.ClockwiseTopRightBottomLeft;
import net.sourceforge.plantuml.style.ISkinParam;
import net.sourceforge.plantuml.style.SName;
import net.sourceforge.plantuml.style.Style;
import net.sourceforge.plantuml.style.StyleBuilder;
import net.sourceforge.plantuml.style.StyleSignature;
import net.sourceforge.plantuml.style.StyleSignatureBasic;
public class TaskDrawDiamond extends AbstractTaskDraw {
public TaskDrawDiamond(TimeScale timeScale, Real y, String prettyDisplay, Day start, ISkinParam skinParam,
Task task, ToTaskDraw toTaskDraw, StyleBuilder styleBuilder) {
super(timeScale, y, prettyDisplay, start, skinParam, task, toTaskDraw, styleBuilder);
public TaskDrawDiamond(TimeScale timeScale, Real y, String prettyDisplay, Day start, Task task,
ToTaskDraw toTaskDraw, StyleBuilder styleBuilder) {
super(timeScale, y, prettyDisplay, start, task, toTaskDraw, styleBuilder);
}
@Override
StyleSignatureBasic getStyleSignature() {
StyleSignature getStyleSignature() {
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.real.Real;
import net.sourceforge.plantuml.style.ClockwiseTopRightBottomLeft;
import net.sourceforge.plantuml.style.ISkinParam;
import net.sourceforge.plantuml.style.SName;
import net.sourceforge.plantuml.style.Style;
import net.sourceforge.plantuml.style.StyleBuilder;
import net.sourceforge.plantuml.style.StyleSignature;
import net.sourceforge.plantuml.style.StyleSignatureBasic;
public class TaskDrawGroup extends AbstractTaskDraw {
private final Day end;
private final ISkinParam skinParam;
public TaskDrawGroup(TimeScale timeScale, Real y, String prettyDisplay, Day start, Day end, ISkinParam skinParam,
Task task, ToTaskDraw toTaskDraw, StyleBuilder styleBuilder) {
super(timeScale, y, prettyDisplay, start, skinParam, task, toTaskDraw, styleBuilder);
this.skinParam = skinParam;
public TaskDrawGroup(TimeScale timeScale, Real y, String prettyDisplay, Day start, Day end, Task task,
ToTaskDraw toTaskDraw, StyleBuilder styleBuilder) {
super(timeScale, y, prettyDisplay, start, task, toTaskDraw, styleBuilder);
this.end = end;
}
@ -122,7 +119,7 @@ public class TaskDrawGroup extends AbstractTaskDraw {
}
@Override
StyleSignatureBasic getStyleSignature() {
StyleSignature getStyleSignature() {
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