1
0
mirror of https://github.com/octoleo/plantuml.git synced 2024-06-04 09:30:48 +00:00

Import version 1.2020.18

This commit is contained in:
Arnaud Roques 2020-09-30 22:57:58 +02:00
parent b27fa50b50
commit 58936dc235
153 changed files with 1692 additions and 926 deletions

View File

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

View File

@ -60,6 +60,29 @@ import net.sourceforge.plantuml.ugraphic.UShape;
public class EmbeddedDiagram implements CharSequence {
public static String getEmbeddedType(CharSequence s) {
if (s == null) {
return null;
}
s = StringUtils.trin(s.toString());
if (s.equals("{{")) {
return "uml";
}
if (s.equals("{{uml")) {
return "uml";
}
if (s.equals("{{wbs")) {
return "wbs";
}
if (s.equals("{{mindmap")) {
return "mindmap";
}
if (s.equals("{{gantt")) {
return "gantt";
}
return null;
}
private final Display system;
public EmbeddedDiagram(Display system) {
@ -131,10 +154,12 @@ public class EmbeddedDiagram implements CharSequence {
}
private String getImageSvg() throws IOException, InterruptedException {
final boolean sav = SkinParam.USE_STYLES();
final Diagram system = getSystem();
final ByteArrayOutputStream os = new ByteArrayOutputStream();
system.exportDiagram(os, 0, new FileFormatOption(FileFormat.SVG));
os.close();
SkinParam.setBetaStyle(sav);
return new String(os.toByteArray());
}

View File

@ -126,8 +126,6 @@ public interface ISkinParam extends ISkinSimple {
public ConditionEndStyle getConditionEndStyle();
public double minClassWidth();
public boolean sameClassWidth();
public Rankdir getRankdir();

View File

@ -62,4 +62,6 @@ public interface ISkinSimple extends SpriteContainer {
public void copyAllFrom(ISkinSimple other);
public double minClassWidth();
}

View File

@ -78,7 +78,7 @@ import net.sourceforge.plantuml.openiconic.PSystemListOpenIconicFactory;
import net.sourceforge.plantuml.openiconic.PSystemOpenIconicFactory;
import net.sourceforge.plantuml.oregon.PSystemOregonFactory;
import net.sourceforge.plantuml.project.GanttDiagramFactory;
import net.sourceforge.plantuml.salt.PSystemSaltFactory;
import net.sourceforge.plantuml.salt.PSystemSaltFactory2;
import net.sourceforge.plantuml.security.SecurityProfile;
import net.sourceforge.plantuml.security.SecurityUtils;
import net.sourceforge.plantuml.sequencediagram.SequenceDiagramFactory;
@ -168,8 +168,8 @@ public class PSystemBuilder {
factories.add(new PSystemOpenIconicFactory());
factories.add(new PSystemListOpenIconicFactory());
factories.add(new PSystemListInternalSpritesFactory());
factories.add(new PSystemSaltFactory(DiagramType.SALT));
factories.add(new PSystemSaltFactory(DiagramType.UML));
factories.add(new PSystemSaltFactory2(DiagramType.SALT));
factories.add(new PSystemSaltFactory2(DiagramType.UML));
factories.add(new PSystemDotFactory(DiagramType.DOT));
factories.add(new PSystemDotFactory(DiagramType.UML));
factories.add(new NwDiagramFactory());

View File

@ -59,7 +59,7 @@ import net.sourceforge.plantuml.classdiagram.ClassDiagramFactory;
import net.sourceforge.plantuml.code.NoPlantumlCompressionException;
import net.sourceforge.plantuml.code.Transcoder;
import net.sourceforge.plantuml.code.TranscoderUtil;
import net.sourceforge.plantuml.command.UmlDiagramFactory;
import net.sourceforge.plantuml.command.PSystemCommandFactory;
import net.sourceforge.plantuml.descdiagram.DescriptionDiagramFactory;
import net.sourceforge.plantuml.ftp.FtpServer;
import net.sourceforge.plantuml.png.MetadataTag;
@ -349,7 +349,7 @@ public class Run {
// printPattern(new ObjectDiagramFactory(null));
}
private static void printPattern(UmlDiagramFactory factory) {
private static void printPattern(PSystemCommandFactory factory) {
System.out.println();
System.out.println(factory.getClass().getSimpleName().replaceAll("Factory", ""));
final List<String> descriptions = factory.getDescription();

View File

@ -94,4 +94,8 @@ public class SpriteContainerEmpty implements SpriteContainer, ISkinSimple {
throw new UnsupportedOperationException();
}
public double minClassWidth() {
return 0;
}
}

View File

@ -37,10 +37,7 @@ package net.sourceforge.plantuml;
import java.io.IOException;
import net.sourceforge.plantuml.command.BlocLines;
import net.sourceforge.plantuml.command.CommandControl;
import net.sourceforge.plantuml.command.CommandExecutionResult;
import net.sourceforge.plantuml.command.CommandSkinParamMultilines;
import net.sourceforge.plantuml.core.Diagram;
import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.cucadiagram.DisplayPositionned;
@ -48,6 +45,7 @@ import net.sourceforge.plantuml.cucadiagram.DisplaySection;
import net.sourceforge.plantuml.graphic.HorizontalAlignment;
import net.sourceforge.plantuml.graphic.VerticalAlignment;
import net.sourceforge.plantuml.sprite.Sprite;
import net.sourceforge.plantuml.style.StyleBuilder;
public abstract class TitledDiagram extends AbstractPSystem implements Diagram, Annotated {
@ -61,10 +59,20 @@ public abstract class TitledDiagram extends AbstractPSystem implements Diagram,
private final SkinParam skinParam;
private final Pragma pragma = new Pragma();
public Pragma getPragma() {
return pragma;
}
public TitledDiagram() {
this.skinParam = SkinParam.create(getUmlDiagramType());
}
public final StyleBuilder getCurrentStyleBuilder() {
return skinParam.getCurrentStyleBuilder();
}
public TitledDiagram(ISkinSimple orig) {
this();
if (orig != null) {
@ -179,4 +187,25 @@ public abstract class TitledDiagram extends AbstractPSystem implements Diagram,
return mainFrame;
}
private boolean useJDot;
public void setUseJDot(boolean useJDot) {
this.useJDot = useJDot;
}
public static final boolean FORCE_JDOT = false;
public boolean isUseJDot() {
if (FORCE_JDOT)
return true;
return useJDot;
}
public final double getScaleCoef(FileFormatOption fileFormatOption) {
if (getSkinParam().getDpi() == 96) {
return fileFormatOption.getScaleCoef();
}
return getSkinParam().getDpi() * fileFormatOption.getScaleCoef() / 96.0;
}
}

View File

@ -55,10 +55,7 @@ import javax.script.ScriptException;
import net.sourceforge.plantuml.anim.Animation;
import net.sourceforge.plantuml.anim.AnimationDecoder;
import net.sourceforge.plantuml.api.ImageDataSimple;
import net.sourceforge.plantuml.command.BlocLines;
import net.sourceforge.plantuml.command.CommandControl;
import net.sourceforge.plantuml.command.CommandExecutionResult;
import net.sourceforge.plantuml.command.CommandSkinParamMultilines;
import net.sourceforge.plantuml.core.Diagram;
import net.sourceforge.plantuml.core.ImageData;
import net.sourceforge.plantuml.core.UmlSource;
@ -75,7 +72,6 @@ import net.sourceforge.plantuml.pdf.PdfConverter;
import net.sourceforge.plantuml.security.ImageIO;
import net.sourceforge.plantuml.security.SFile;
import net.sourceforge.plantuml.security.SecurityUtils;
import net.sourceforge.plantuml.sprite.Sprite;
import net.sourceforge.plantuml.svek.EmptySvgException;
import net.sourceforge.plantuml.svek.GraphvizCrash;
import net.sourceforge.plantuml.svek.TextBlockBackcolored;
@ -97,7 +93,6 @@ public abstract class UmlDiagram extends TitledDiagram implements Diagram, Annot
private int minwidth = Integer.MAX_VALUE;
private final Pragma pragma = new Pragma();
private Animation animation;
public UmlDiagram() {
@ -134,10 +129,6 @@ public abstract class UmlDiagram extends TitledDiagram implements Diagram, Annot
throw new IllegalArgumentException();
}
public Pragma getPragma() {
return pragma;
}
final public void setAnimation(Iterable<CharSequence> animationData) {
try {
final AnimationDecoder animationDecoder = new AnimationDecoder(animationData);
@ -152,13 +143,6 @@ public abstract class UmlDiagram extends TitledDiagram implements Diagram, Annot
return animation;
}
public final double getScaleCoef(FileFormatOption fileFormatOption) {
if (getSkinParam().getDpi() == 96) {
return fileFormatOption.getScaleCoef();
}
return getSkinParam().getDpi() * fileFormatOption.getScaleCoef() / 96.0;
}
public final boolean isHideUnlinkedData() {
return hideUnlinkedData;
}
@ -242,8 +226,7 @@ public abstract class UmlDiagram extends TitledDiagram implements Diagram, Annot
graphicStrings.drawU(ug);
final double height = graphicStrings.calculateDimension(ug.getStringBounder()).getHeight();
ug = ug.apply(UTranslate.dy(height));
ug.draw(new UImage(new PixelImage(im, AffineTransformType.TYPE_NEAREST_NEIGHBOR))
.scale(3));
ug.draw(new UImage(new PixelImage(im, AffineTransformType.TYPE_NEAREST_NEIGHBOR)).scale(3));
}
});
}
@ -327,7 +310,7 @@ public abstract class UmlDiagram extends TitledDiagram implements Diagram, Annot
private ImageData exportDiagramInternalPdf(OutputStream os, int index) throws IOException {
final File svg = FileUtils.createTempFileLegacy("pdf", ".svf");
final File pdfFile = FileUtils.createTempFileLegacy("pdf", ".pdf");
final OutputStream fos = new BufferedOutputStream(new FileOutputStream(svg));;
final OutputStream fos = new BufferedOutputStream(new FileOutputStream(svg));
final ImageData result = exportDiagram(fos, index, new FileFormatOption(FileFormat.SVG));
fos.close();
PdfConverter.convert(svg, pdfFile);
@ -384,21 +367,6 @@ public abstract class UmlDiagram extends TitledDiagram implements Diagram, Annot
return null;
}
private boolean useJDot;
public void setUseJDot(boolean useJDot) {
this.useJDot = useJDot;
}
public static final boolean FORCE_JDOT = false;
public boolean isUseJDot() {
if (FORCE_JDOT)
return true;
return useJDot;
}
public void setHideEmptyDescription(boolean hideEmptyDescription) {
}

View File

@ -39,7 +39,7 @@ import net.sourceforge.plantuml.style.SName;
public enum UmlDiagramType {
SEQUENCE, STATE, CLASS, OBJECT, ACTIVITY, DESCRIPTION, COMPOSITE, FLOW, TIMING, BPM, NWDIAG, MINDMAP, WBS, WIRE,
HELP, GANTT;
HELP, GANTT, SALT;
public SName getStyleName() {
if (this == SEQUENCE) {
@ -72,6 +72,9 @@ public enum UmlDiagramType {
if (this == GANTT) {
return SName.ganttDiagram;
}
if (this == SALT) {
return SName.saltDiagram;
}
return SName.activityDiagram;
}
}

View File

@ -50,11 +50,11 @@ import net.sourceforge.plantuml.classdiagram.command.CommandHideShow2;
import net.sourceforge.plantuml.command.Command;
import net.sourceforge.plantuml.command.CommandFootboxIgnored;
import net.sourceforge.plantuml.command.CommandRankDir;
import net.sourceforge.plantuml.command.UmlDiagramFactory;
import net.sourceforge.plantuml.command.PSystemCommandFactory;
import net.sourceforge.plantuml.command.note.CommandFactoryNoteActivity;
import net.sourceforge.plantuml.command.note.CommandFactoryNoteOnLink;
public class ActivityDiagramFactory extends UmlDiagramFactory {
public class ActivityDiagramFactory extends PSystemCommandFactory {
private final ISkinSimple skinParam;

View File

@ -86,9 +86,9 @@ import net.sourceforge.plantuml.activitydiagram3.command.CommandWhileEnd3;
import net.sourceforge.plantuml.command.Command;
import net.sourceforge.plantuml.command.CommandDecoratorMultine;
import net.sourceforge.plantuml.command.CommandFootboxIgnored;
import net.sourceforge.plantuml.command.UmlDiagramFactory;
import net.sourceforge.plantuml.command.PSystemCommandFactory;
public class ActivityDiagramFactory3 extends UmlDiagramFactory {
public class ActivityDiagramFactory3 extends PSystemCommandFactory {
private final ISkinSimple skinParam;

View File

@ -52,7 +52,7 @@ import net.sourceforge.plantuml.ugraphic.color.HColor;
public class InstructionRepeat implements Instruction {
private final InstructionList repeatList = new InstructionList();
private final InstructionList repeatList;
private final Instruction parent;
private final LinkRendering nextLinkRenderer;
private final Swimlane swimlane;
@ -78,6 +78,7 @@ public class InstructionRepeat implements Instruction {
public InstructionRepeat(Swimlane swimlane, Instruction parent, LinkRendering nextLinkRenderer, HColor color,
Display startLabel, BoxStyle boxStyleIn, Colors colors) {
this.repeatList = new InstructionList(swimlane);
this.boxStyleIn = boxStyleIn;
this.startLabel = startLabel;
this.parent = parent;

View File

@ -39,12 +39,16 @@ import net.sourceforge.plantuml.ColorParam;
import net.sourceforge.plantuml.FontParam;
import net.sourceforge.plantuml.ISkinParam;
import net.sourceforge.plantuml.LineParam;
import net.sourceforge.plantuml.SkinParam;
import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.graphic.FontConfiguration;
import net.sourceforge.plantuml.graphic.HorizontalAlignment;
import net.sourceforge.plantuml.graphic.TextBlock;
import net.sourceforge.plantuml.graphic.TextBlockUtils;
import net.sourceforge.plantuml.skin.rose.Rose;
import net.sourceforge.plantuml.style.SName;
import net.sourceforge.plantuml.style.Style;
import net.sourceforge.plantuml.style.StyleSignature;
import net.sourceforge.plantuml.ugraphic.UStroke;
import net.sourceforge.plantuml.ugraphic.color.HColor;
@ -52,6 +56,13 @@ public class EntityImageLegend {
public static TextBlock create(Display note, ISkinParam skinParam) {
if (SkinParam.USE_STYLES()) {
final Style style = StyleSignature
.of(SName.root, skinParam.getUmlDiagramType().getStyleName(), SName.legend)
.getMergedStyle(skinParam.getCurrentStyleBuilder());
return style.createTextBlockBordered(note, skinParam.getIHtmlColorSet(), skinParam);
}
final TextBlock textBlock = note.create(new FontConfiguration(skinParam, FontParam.LEGEND, null),
HorizontalAlignment.LEFT, skinParam);
final Rose rose = new Rose();

View File

@ -218,7 +218,7 @@ public class FtileWithNoteOpale extends AbstractFtile implements Stencil, Stylea
final Point2D pp2 = new Point2D.Double(-suppSpace, dimNote.getHeight() / 2);
opale.setOpale(strategy, pp1, pp2);
}
if (swimlaneNote == null || intoSw == swimlaneNote) {
if (ug instanceof UGraphicInterceptorOneSwimlane == false || swimlaneNote == null || intoSw == swimlaneNote) {
opale.drawU(ug.apply(getTranslateForOpale(ug)));
}
ug.apply(getTranslate(stringBounder)).draw(tile);

View File

@ -92,8 +92,9 @@ public class BpmDiagram extends UmlDiagram {
margin1 = 10;
margin2 = 10;
}
final ImageBuilder imageBuilder = ImageBuilder.buildD(getSkinParam(), ClockwiseTopRightBottomLeft.margin1margin2((double) margin1, (double) margin2), getAnimation(), fileFormatOption.isWithMetadata() ? getMetadata() : null,
getWarningOrError(), dpiFactor);
final ImageBuilder imageBuilder = ImageBuilder.buildD(getSkinParam(),
ClockwiseTopRightBottomLeft.margin1margin2(margin1, margin2), getAnimation(),
fileFormatOption.isWithMetadata() ? getMetadata() : null, getWarningOrError(), dpiFactor);
imageBuilder.setUDrawable(getUDrawable());
return imageBuilder.writeImageTOBEMOVED(fileFormatOption, seed(), os);

View File

@ -40,10 +40,10 @@ import java.util.List;
import net.sourceforge.plantuml.AbstractPSystem;
import net.sourceforge.plantuml.command.Command;
import net.sourceforge.plantuml.command.UmlDiagramFactory;
import net.sourceforge.plantuml.command.PSystemCommandFactory;
import net.sourceforge.plantuml.core.DiagramType;
public class BpmDiagramFactory extends UmlDiagramFactory {
public class BpmDiagramFactory extends PSystemCommandFactory {
public BpmDiagramFactory(DiagramType type) {
super(DiagramType.BPM);

View File

@ -208,10 +208,10 @@ public class ClassDiagram extends AbstractClassOrObjectDiagram {
final int margin2;
if (SkinParam.USE_STYLES()) {
margin1 = SkinParam.zeroMargin(0);
margin2 = SkinParam.zeroMargin(10);
margin2 = SkinParam.zeroMargin(0);
} else {
margin1 = 0;
margin2 = 10;
margin2 = 0;
}
final ImageBuilder imageBuilder = ImageBuilder.buildD(getSkinParam(),
ClockwiseTopRightBottomLeft.margin1margin2(margin1, margin2), null, null, null, 1);

View File

@ -65,7 +65,7 @@ import net.sourceforge.plantuml.command.CommandPackage;
import net.sourceforge.plantuml.command.CommandPackageEmpty;
import net.sourceforge.plantuml.command.CommandPage;
import net.sourceforge.plantuml.command.CommandRankDir;
import net.sourceforge.plantuml.command.UmlDiagramFactory;
import net.sourceforge.plantuml.command.PSystemCommandFactory;
import net.sourceforge.plantuml.command.note.CommandConstraintOnLinks;
import net.sourceforge.plantuml.command.note.CommandFactoryNote;
import net.sourceforge.plantuml.command.note.CommandFactoryNoteOnEntity;
@ -80,7 +80,7 @@ import net.sourceforge.plantuml.objectdiagram.command.CommandCreateEntityObject;
import net.sourceforge.plantuml.objectdiagram.command.CommandCreateEntityObjectMultilines;
import net.sourceforge.plantuml.objectdiagram.command.CommandCreateMap;
public class ClassDiagramFactory extends UmlDiagramFactory {
public class ClassDiagramFactory extends PSystemCommandFactory {
private final ISkinSimple skinParam;

View File

@ -39,7 +39,6 @@ import net.sourceforge.plantuml.FontParam;
import net.sourceforge.plantuml.LineLocation;
import net.sourceforge.plantuml.SkinParam;
import net.sourceforge.plantuml.TitledDiagram;
import net.sourceforge.plantuml.UmlDiagram;
import net.sourceforge.plantuml.command.regex.IRegex;
import net.sourceforge.plantuml.command.regex.RegexConcat;
import net.sourceforge.plantuml.command.regex.RegexLeaf;
@ -72,13 +71,11 @@ public class CommandFooter extends SingleLineCommand2<TitledDiagram> {
final String align = arg.get("POSITION", 0);
HorizontalAlignment ha = HorizontalAlignment.fromString(align, HorizontalAlignment.CENTER);
if (SkinParam.USE_STYLES() && align == null) {
ha = FontParam.FOOTER.getStyleDefinition(null)
.getMergedStyle(((UmlDiagram) diagram).getSkinParam().getCurrentStyleBuilder())
ha = FontParam.FOOTER.getStyleDefinition(null).getMergedStyle(diagram.getCurrentStyleBuilder())
.getHorizontalAlignment();
}
diagram.getFooter().putDisplay(Display.getWithNewlines(arg.get("LABEL", 0)), ha);
return CommandExecutionResult.ok();
}
}

View File

@ -39,7 +39,6 @@ import net.sourceforge.plantuml.FontParam;
import net.sourceforge.plantuml.LineLocation;
import net.sourceforge.plantuml.SkinParam;
import net.sourceforge.plantuml.TitledDiagram;
import net.sourceforge.plantuml.UmlDiagram;
import net.sourceforge.plantuml.command.regex.IRegex;
import net.sourceforge.plantuml.command.regex.RegexConcat;
import net.sourceforge.plantuml.command.regex.RegexLeaf;
@ -74,8 +73,7 @@ public class CommandHeader extends SingleLineCommand2<TitledDiagram> {
final String align = arg.get("POSITION", 0);
HorizontalAlignment ha = HorizontalAlignment.fromString(align, HorizontalAlignment.RIGHT);
if (SkinParam.USE_STYLES() && align == null) {
ha = FontParam.HEADER.getStyleDefinition(null)
.getMergedStyle(((UmlDiagram) diagram).getSkinParam().getCurrentStyleBuilder())
ha = FontParam.HEADER.getStyleDefinition(null).getMergedStyle(diagram.getCurrentStyleBuilder())
.getHorizontalAlignment();
}
diagram.getHeader().putDisplay(Display.getWithNewlines(arg.get("LABEL", 0)), ha);

View File

@ -37,7 +37,7 @@ package net.sourceforge.plantuml.command;
import net.sourceforge.plantuml.LineLocation;
import net.sourceforge.plantuml.StringUtils;
import net.sourceforge.plantuml.UmlDiagram;
import net.sourceforge.plantuml.TitledDiagram;
import net.sourceforge.plantuml.command.regex.IRegex;
import net.sourceforge.plantuml.command.regex.RegexConcat;
import net.sourceforge.plantuml.command.regex.RegexLeaf;
@ -45,7 +45,7 @@ import net.sourceforge.plantuml.command.regex.RegexOptional;
import net.sourceforge.plantuml.command.regex.RegexResult;
import net.sourceforge.plantuml.cucadiagram.dot.GraphvizUtils;
public class CommandPragma extends SingleLineCommand2<UmlDiagram> {
public class CommandPragma extends SingleLineCommand2<TitledDiagram> {
public CommandPragma() {
super(getRegexConcat());
@ -64,7 +64,7 @@ public class CommandPragma extends SingleLineCommand2<UmlDiagram> {
}
@Override
protected CommandExecutionResult executeArg(UmlDiagram system, LineLocation location, RegexResult arg) {
protected CommandExecutionResult executeArg(TitledDiagram system, LineLocation location, RegexResult arg) {
final String name = StringUtils.goLowerCase(arg.get("NAME", 0));
final String value = arg.get("VALUE", 0);
system.getPragma().define(name, value);

View File

@ -36,13 +36,13 @@
package net.sourceforge.plantuml.command;
import net.sourceforge.plantuml.LineLocation;
import net.sourceforge.plantuml.UmlDiagram;
import net.sourceforge.plantuml.TitledDiagram;
import net.sourceforge.plantuml.command.regex.IRegex;
import net.sourceforge.plantuml.command.regex.RegexConcat;
import net.sourceforge.plantuml.command.regex.RegexLeaf;
import net.sourceforge.plantuml.command.regex.RegexResult;
public class CommandSkinParam extends SingleLineCommand2<UmlDiagram> {
public class CommandSkinParam extends SingleLineCommand2<TitledDiagram> {
public CommandSkinParam() {
super(getRegexConcat());
@ -58,7 +58,7 @@ public class CommandSkinParam extends SingleLineCommand2<UmlDiagram> {
}
@Override
protected CommandExecutionResult executeArg(UmlDiagram diagram, LineLocation location, RegexResult arg) {
protected CommandExecutionResult executeArg(TitledDiagram diagram, LineLocation location, RegexResult arg) {
// arg.get(0).endsWith("locked");
diagram.setParam(arg.get("NAME", 0), arg.get("VALUE", 0));
return CommandExecutionResult.ok();

View File

@ -36,11 +36,11 @@
package net.sourceforge.plantuml.command;
import net.sourceforge.plantuml.StringUtils;
import net.sourceforge.plantuml.UmlDiagram;
import net.sourceforge.plantuml.TitledDiagram;
import net.sourceforge.plantuml.command.regex.Matcher2;
import net.sourceforge.plantuml.command.regex.MyPattern;
public class CommandSkinParamMultilines extends CommandMultilinesBracket<UmlDiagram> {
public class CommandSkinParamMultilines extends CommandMultilinesBracket<TitledDiagram> {
public CommandSkinParamMultilines() {
super("(?i)^skinparam[%s]*(?:[%s]+([\\w.]*(?:\\<\\<.*\\>\\>)?[\\w.]*))?[%s]*\\{$");
@ -60,7 +60,7 @@ public class CommandSkinParamMultilines extends CommandMultilinesBracket<UmlDiag
return MyPattern.mtches(line, CommandMultilinesComment.COMMENT_SINGLE_LINE);
}
public CommandExecutionResult execute(UmlDiagram diagram, BlocLines lines) {
public CommandExecutionResult execute(TitledDiagram diagram, BlocLines lines) {
final SkinLoader skinLoader = new SkinLoader(diagram);
final Matcher2 mStart = getStartingPattern().matcher(lines.getFirst().getTrimmed().getString());

View File

@ -45,7 +45,7 @@ import net.sourceforge.plantuml.FileSystem;
import net.sourceforge.plantuml.FileUtils;
import net.sourceforge.plantuml.LineLocation;
import net.sourceforge.plantuml.Log;
import net.sourceforge.plantuml.UmlDiagram;
import net.sourceforge.plantuml.TitledDiagram;
import net.sourceforge.plantuml.command.regex.IRegex;
import net.sourceforge.plantuml.command.regex.RegexConcat;
import net.sourceforge.plantuml.command.regex.RegexLeaf;
@ -56,7 +56,7 @@ import net.sourceforge.plantuml.sprite.Sprite;
import net.sourceforge.plantuml.sprite.SpriteImage;
import net.sourceforge.plantuml.sprite.SpriteSvg;
public class CommandSpriteFile extends SingleLineCommand2<UmlDiagram> {
public class CommandSpriteFile extends SingleLineCommand2<TitledDiagram> {
public CommandSpriteFile() {
super(getRegexConcat());
@ -73,7 +73,7 @@ public class CommandSpriteFile extends SingleLineCommand2<UmlDiagram> {
}
@Override
protected CommandExecutionResult executeArg(UmlDiagram system, LineLocation location, RegexResult arg) {
protected CommandExecutionResult executeArg(TitledDiagram system, LineLocation location, RegexResult arg) {
final String src = arg.get("FILE", 0);
final Sprite sprite;
try {

View File

@ -59,15 +59,15 @@ import net.sourceforge.plantuml.style.CommandStyleMultilinesCSS;
import net.sourceforge.plantuml.utils.StartUtils;
import net.sourceforge.plantuml.version.IteratorCounter2;
public abstract class UmlDiagramFactory extends PSystemAbstractFactory {
public abstract class PSystemCommandFactory extends PSystemAbstractFactory {
private List<Command> cmds;
protected UmlDiagramFactory() {
protected PSystemCommandFactory() {
this(DiagramType.UML);
}
protected UmlDiagramFactory(DiagramType type) {
protected PSystemCommandFactory(DiagramType type) {
super(type);
}

View File

@ -39,7 +39,7 @@ import java.util.ArrayList;
import java.util.List;
import net.sourceforge.plantuml.StringLocated;
import net.sourceforge.plantuml.UmlDiagram;
import net.sourceforge.plantuml.TitledDiagram;
import net.sourceforge.plantuml.command.regex.Matcher2;
import net.sourceforge.plantuml.command.regex.MyPattern;
import net.sourceforge.plantuml.command.regex.Pattern2;
@ -50,9 +50,9 @@ public class SkinLoader {
.cmpile("^([\\w.]*(?:\\<\\<.*\\>\\>)?[\\w.]*)[%s]+(?:(\\{)|(.*))$|^\\}?$");
final private List<String> context = new ArrayList<String>();
final private UmlDiagram diagram;
final private TitledDiagram diagram;
public SkinLoader(UmlDiagram diagram) {
public SkinLoader(TitledDiagram diagram) {
this.diagram = diagram;
}

View File

@ -40,13 +40,13 @@ import java.util.List;
import net.sourceforge.plantuml.ISkinSimple;
import net.sourceforge.plantuml.command.Command;
import net.sourceforge.plantuml.command.UmlDiagramFactory;
import net.sourceforge.plantuml.command.PSystemCommandFactory;
import net.sourceforge.plantuml.compositediagram.command.CommandCreateBlock;
import net.sourceforge.plantuml.compositediagram.command.CommandCreatePackageBlock;
import net.sourceforge.plantuml.compositediagram.command.CommandEndPackageBlock;
import net.sourceforge.plantuml.compositediagram.command.CommandLinkBlock;
public class CompositeDiagramFactory extends UmlDiagramFactory {
public class CompositeDiagramFactory extends PSystemCommandFactory {
private final ISkinSimple skinParam;

View File

@ -58,8 +58,15 @@ public class Parser {
return new CreoleParser(fontConfiguration, horizontalAlignment, skinParam, creoleMode, stereotype);
}
public static boolean isCodeStart(String line) {
return line.equals("<code>");
}
public static boolean isCodeEnd(String line) {
return line.equals("</code>");
}
public static boolean isTreeStart(String line) {
// return false;
return line.startsWith("|_");
}

View File

@ -75,6 +75,16 @@ public class CreoleParser implements SheetBuilder {
private Stripe createStripe(String line, CreoleContext context, Stripe lastStripe,
FontConfiguration fontConfiguration) {
if (lastStripe instanceof StripeCode) {
final StripeCode code = (StripeCode) lastStripe;
if (code.isTerminated()) {
lastStripe = null;
} else {
final boolean terminated = code.addAndCheckTermination(line);
return null;
}
}
if (lastStripe instanceof StripeTable && isTableLine(line)) {
final StripeTable table = (StripeTable) lastStripe;
table.analyzeAndAddLine(line);
@ -87,6 +97,8 @@ public class CreoleParser implements SheetBuilder {
return new StripeTable(fontConfiguration, skinParam, line);
} else if (Parser.isTreeStart(line)) {
return new StripeTree(fontConfiguration, skinParam, line);
} else if (Parser.isCodeStart(line)) {
return new StripeCode(fontConfiguration.changeFamily(Parser.MONOSPACED), skinParam, line);
}
return new CreoleStripeSimpleParser(line, context, fontConfiguration, skinParam, creoleMode)
.createStripe(context);

View File

@ -0,0 +1,116 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2020, Arnaud Roques
*
* Project Info: http://plantuml.com
*
* If you like this project or if you find it useful, you can support us at:
*
* http://plantuml.com/patreon (only 1$ per month!)
* http://plantuml.com/paypal
*
* This file is part of PlantUML.
*
* PlantUML is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* PlantUML distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
* License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
*
* Original Author: Arnaud Roques
*
*
*/
package net.sourceforge.plantuml.creole.legacy;
import java.awt.geom.Dimension2D;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import net.sourceforge.plantuml.Dimension2DDouble;
import net.sourceforge.plantuml.ISkinSimple;
import net.sourceforge.plantuml.creole.Parser;
import net.sourceforge.plantuml.creole.Stripe;
import net.sourceforge.plantuml.creole.atom.Atom;
import net.sourceforge.plantuml.graphic.FontConfiguration;
import net.sourceforge.plantuml.graphic.StringBounder;
import net.sourceforge.plantuml.ugraphic.UGraphic;
import net.sourceforge.plantuml.ugraphic.UText;
import net.sourceforge.plantuml.ugraphic.UTranslate;
public class StripeCode implements Stripe, Atom {
final private FontConfiguration fontConfiguration;
private final List<String> raw = new ArrayList<String>();
private boolean terminated;
public StripeCode(FontConfiguration fontConfiguration, ISkinSimple skinParam, String line) {
// this.skinParam = skinParam;
this.fontConfiguration = fontConfiguration;
}
public List<Atom> getAtoms() {
return Collections.<Atom>singletonList(this);
}
public Atom getLHeader() {
return null;
}
public boolean addAndCheckTermination(String line) {
if (Parser.isCodeEnd(line)) {
this.terminated = true;
return true;
}
this.raw.add(line);
return false;
}
public final boolean isTerminated() {
return terminated;
}
public Dimension2D calculateDimension(StringBounder stringBounder) {
double width = 0;
double height = 0;
for (String s : raw) {
final Dimension2D dim = stringBounder.calculateDimension(fontConfiguration.getFont(), s);
width = Math.max(width, dim.getWidth());
height += dim.getHeight();
}
return new Dimension2DDouble(width, height);
}
public double getStartingAltitude(StringBounder stringBounder) {
return 0;
}
public void drawU(UGraphic ug) {
double y = 0;
for (String s : raw) {
final UText shape = new UText(s, fontConfiguration);
final Dimension2D dim = ug.getStringBounder().calculateDimension(fontConfiguration.getFont(), s);
y += dim.getHeight();
ug.apply(UTranslate.dy(y - shape.getDescent())).draw(shape);
}
}
public List<Atom> splitInTwo(StringBounder stringBounder, double width) {
throw new UnsupportedOperationException();
}
}

View File

@ -209,7 +209,9 @@ public class BodierImpl implements Bodier {
if (showFields == false) {
return new TextBlockLineBefore(TextBlockUtils.empty(0, 0));
}
return fields.asBlockMemberImpl();
// return fields.asBlockMemberImpl();
return new BodyEnhanced(rawBodyWithoutHidden(), fontParam, skinParam, manageModifier, stereotype, leaf,
SName.objectDiagram);
}
if (type.isLikeClass() == false) {
throw new UnsupportedOperationException();

View File

@ -164,9 +164,11 @@ public class BodyEnhanced extends AbstractTextBlock implements TextBlock, WithPo
for (ListIterator<CharSequence> it = rawBody.listIterator(); it.hasNext();) {
final CharSequence s2 = it.next();
if (s2 instanceof EmbeddedDiagram) {
if (members.size() > 0) {
if (members.size() > 0 || separator != 0) {
blocks.add(decorate(stringBounder, new MethodsOrFieldsArea(members, fontParam, skinParam, align,
stereotype, entity, diagramType), separator, title));
separator = 0;
title = null;
members = new ArrayList<Member>();
}
blocks.add(((EmbeddedDiagram) s2).asDraw(skinParam));
@ -183,6 +185,8 @@ public class BodyEnhanced extends AbstractTextBlock implements TextBlock, WithPo
blocks.add(decorate(stringBounder, new MethodsOrFieldsArea(members, fontParam, skinParam, align,
stereotype, entity, diagramType), separator, title));
}
separator = 0;
title = null;
members = new ArrayList<Member>();
final List<CharSequence> allTree = buildAllTree(s, it);
final TextBlock bloc = Display.create(allTree).create7(fontParam.getFontConfiguration(skinParam),

View File

@ -40,6 +40,7 @@ import java.util.ArrayList;
import java.util.List;
import net.sourceforge.plantuml.FontParam;
import net.sourceforge.plantuml.Guillemet;
import net.sourceforge.plantuml.ISkinSimple;
import net.sourceforge.plantuml.LineBreakStrategy;
import net.sourceforge.plantuml.StringUtils;
@ -55,21 +56,23 @@ import net.sourceforge.plantuml.ugraphic.UGraphic;
public class BodyEnhanced2 extends AbstractTextBlock implements TextBlock {
private TextBlock area2;
private TextBlock area;
private final FontConfiguration titleConfig;
private final Display rawBody2;
private final Display rawBody;
private final ISkinSimple spriteContainer;
private final HorizontalAlignment align;
private final LineBreakStrategy lineBreakStrategy;
private final double minClassWidth;
// private final List<Url> urls = new ArrayList<Url>();
public BodyEnhanced2(Display rawBody, FontParam fontParam, ISkinSimple spriteContainer, HorizontalAlignment align,
FontConfiguration titleConfig, LineBreakStrategy lineBreakStrategy) {
this.rawBody2 = rawBody;
FontConfiguration titleConfig, LineBreakStrategy lineBreakStrategy, double minClassWidth) {
this.rawBody = rawBody;
this.lineBreakStrategy = lineBreakStrategy;
this.spriteContainer = spriteContainer;
this.minClassWidth = minClassWidth;
this.titleConfig = titleConfig;
this.align = align;
@ -93,38 +96,45 @@ public class BodyEnhanced2 extends AbstractTextBlock implements TextBlock {
}
private TextBlock getArea(StringBounder stringBounder) {
if (area2 != null) {
return area2;
if (area != null) {
return area;
}
// urls.clear();
final List<TextBlock> blocks = new ArrayList<TextBlock>();
char separator = 0;
TextBlock title = null;
Display members2 = Display.empty();
for (CharSequence s : rawBody2) {
Display display = Display.empty();
for (CharSequence s : rawBody) {
if (isBlockSeparator(s.toString())) {
blocks.add(decorate(stringBounder, getTextBlock(members2, stringBounder), separator, title));
blocks.add(decorate(stringBounder, getTextBlock(display, stringBounder), separator, title));
separator = s.charAt(0);
title = getTitle(s.toString(), spriteContainer);
members2 = Display.empty();
display = Display.empty();
} else {
members2 = members2.add(s);
if (s instanceof String) {
s = Guillemet.GUILLEMET.manageGuillemet(s.toString());
}
display = display.add(s);
}
}
blocks.add(decorate(stringBounder, getTextBlock(members2, stringBounder), separator, title));
blocks.add(decorate(stringBounder, getTextBlock(display, stringBounder), separator, title));
if (blocks.size() == 1) {
this.area2 = blocks.get(0);
this.area = blocks.get(0);
} else {
this.area2 = new TextBlockVertical2(blocks, align);
this.area = new TextBlockVertical2(blocks, align);
}
return area2;
if (minClassWidth > 0) {
this.area = TextBlockUtils.withMinWidth(this.area, minClassWidth, align);
}
return area;
}
private TextBlock getTextBlock(Display members2, StringBounder stringBounder) {
final TextBlock result = members2.create9(titleConfig, align, spriteContainer, lineBreakStrategy);
private TextBlock getTextBlock(Display display, StringBounder stringBounder) {
final TextBlock result = display.create9(titleConfig, align, spriteContainer, lineBreakStrategy);
return result;
}

View File

@ -237,9 +237,10 @@ public class Display implements Iterable<CharSequence> {
final Iterator<? extends CharSequence> it = strings.iterator();
while (it.hasNext()) {
CharSequence s = it.next();
if (s != null && StringUtils.trin(s.toString()).equals("{{")) {
final String type = EmbeddedDiagram.getEmbeddedType(s);
if (type != null) {
final List<CharSequence> other = new ArrayList<CharSequence>();
other.add("@startuml");
other.add("@start" + type);
while (it.hasNext()) {
CharSequence s2 = it.next();
if (s2 != null && StringUtils.trin(s2.toString()).equals("}}")) {
@ -247,7 +248,7 @@ public class Display implements Iterable<CharSequence> {
}
other.add(s2);
}
other.add("@enduml");
other.add("@end" + type);
s = new EmbeddedDiagram(Display.create(other));
}
result.add(s);

View File

@ -61,6 +61,10 @@ public enum LinkArrow {
public Direction getArrowDirection() {
return guide.getArrowDirection().getInv();
}
public double getArrowDirection2() {
return Math.PI + guide.getArrowDirection2();
}
};
}

View File

@ -101,8 +101,8 @@ public class Member {
this.visibilityModifier = null;
this.abstractModifier = false;
tmpDisplay = StringUtils.trin(tmpDisplay);
this.display = tmpDisplay.length() == 0 ? " " : Guillemet.GUILLEMET.manageGuillemet(StringUtils
.trin(tmpDisplay));
this.display = tmpDisplay.length() == 0 ? " "
: Guillemet.GUILLEMET.manageGuillemet(StringUtils.trin(tmpDisplay));
}
}
@ -114,7 +114,8 @@ public class Member {
}
private String getDisplayWithoutVisibilityChar() {
// assert display.length() == 0 || VisibilityModifier.isVisibilityCharacter(display.charAt(0)) == false;
// assert display.length() == 0 ||
// VisibilityModifier.isVisibilityCharacter(display.charAt(0)) == false;
return display;
}
@ -193,13 +194,13 @@ public class Member {
}
public static boolean isMethod(String s) {
// s = UrlBuilder.purgeUrl(s);
if (s.contains("{method}")) {
final String purged = s.replaceAll(UrlBuilder.getRegexp(), "");
if (purged.contains("{method}")) {
return true;
}
if (s.contains("{field}")) {
if (purged.contains("{field}")) {
return false;
}
return s.contains("(") || s.contains(")");
return purged.contains("(") || purged.contains(")");
}
}

View File

@ -61,7 +61,6 @@ import net.sourceforge.plantuml.skin.VisibilityModifier;
import net.sourceforge.plantuml.skin.rose.Rose;
import net.sourceforge.plantuml.style.SName;
import net.sourceforge.plantuml.style.Style;
import net.sourceforge.plantuml.style.StyleSignature;
import net.sourceforge.plantuml.svek.Ports;
import net.sourceforge.plantuml.svek.WithPorts;
import net.sourceforge.plantuml.ugraphic.PlacementStrategy;

View File

@ -97,8 +97,8 @@ public class PSystemCute extends AbstractPSystem {
margin1 = 10;
margin2 = 10;
}
final ImageBuilder builder = ImageBuilder.buildB(new ColorMapperIdentity(), false, ClockwiseTopRightBottomLeft.margin1margin2((double) margin1, (double) margin2),
null, null, null, 1.0, null);
final ImageBuilder builder = ImageBuilder.buildB(new ColorMapperIdentity(), false,
ClockwiseTopRightBottomLeft.margin1margin2(margin1, margin2), null, null, null, 1.0, null);
builder.setUDrawable(root);
return builder.writeImageTOBEMOVED(fileFormat, seed, os);
}

Binary file not shown.

View File

@ -35,7 +35,6 @@
*/
package net.sourceforge.plantuml.dedication;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
@ -54,6 +53,7 @@ public class Dedications {
addNormal("Boundaries allow discipline to create true strength", "boundaries");
addCrypted("0", "pOhci6rKgPXw32AeYXhOpSY0suoauHq5VUSwFqHLHsLYgSO6WaJ7BW5vtHBAoU6ePbcW7d8Flx99MWjPSKQTDm00");
addCrypted("1", "LTxN3hdnhSJ515qcA7IQ841axt4GXfUd3n2wgNirYCdLnyX2360Gv1OEOnJ1-gwFzRW5B3HAqLBkR6Ge0WW_Z000");
addCrypted("2", "lZqLduj4j1yRqSfAvkhbqVpqK8diklatiFeenDUXSdna9bKYQTzdS264YfUBScUVDYCp2Vcq04updoN98RwxE000");
}
private static void addNormal(String sentence, String name) {
@ -82,13 +82,13 @@ public class Dedications {
if (signature.equals(ent.getKey())) {
return dedication;
}
} catch (IOException e) {
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (is != null)
is.close();
} catch (IOException e) {
} catch (Exception e) {
e.printStackTrace();
}
}

View File

@ -48,7 +48,7 @@ import net.sourceforge.plantuml.command.CommandEndPackage;
import net.sourceforge.plantuml.command.CommandFootboxIgnored;
import net.sourceforge.plantuml.command.CommandPage;
import net.sourceforge.plantuml.command.CommandRankDir;
import net.sourceforge.plantuml.command.UmlDiagramFactory;
import net.sourceforge.plantuml.command.PSystemCommandFactory;
import net.sourceforge.plantuml.command.note.CommandFactoryNote;
import net.sourceforge.plantuml.command.note.CommandFactoryNoteOnEntity;
import net.sourceforge.plantuml.command.note.CommandFactoryNoteOnLink;
@ -62,7 +62,7 @@ import net.sourceforge.plantuml.descdiagram.command.CommandLinkElement;
import net.sourceforge.plantuml.descdiagram.command.CommandNewpage;
import net.sourceforge.plantuml.descdiagram.command.CommandPackageWithUSymbol;
public class DescriptionDiagramFactory extends UmlDiagramFactory {
public class DescriptionDiagramFactory extends PSystemCommandFactory {
private final ISkinSimple skinParam;

View File

@ -40,7 +40,7 @@ import net.sourceforge.plantuml.NewpagedDiagram;
import net.sourceforge.plantuml.UmlDiagram;
import net.sourceforge.plantuml.command.CommandExecutionResult;
import net.sourceforge.plantuml.command.SingleLineCommand2;
import net.sourceforge.plantuml.command.UmlDiagramFactory;
import net.sourceforge.plantuml.command.PSystemCommandFactory;
import net.sourceforge.plantuml.command.regex.IRegex;
import net.sourceforge.plantuml.command.regex.RegexConcat;
import net.sourceforge.plantuml.command.regex.RegexLeaf;
@ -48,9 +48,9 @@ import net.sourceforge.plantuml.command.regex.RegexResult;
public class CommandNewpage extends SingleLineCommand2<UmlDiagram> {
private final UmlDiagramFactory factory;
private final PSystemCommandFactory factory;
public CommandNewpage(UmlDiagramFactory factory) {
public CommandNewpage(PSystemCommandFactory factory) {
super(getRegexConcat());
this.factory = factory;
}

View File

@ -35,7 +35,6 @@
*/
package net.sourceforge.plantuml.descdiagram.command;
import net.sourceforge.plantuml.Direction;
import net.sourceforge.plantuml.ISkinParam;
import net.sourceforge.plantuml.StringUtils;
import net.sourceforge.plantuml.cucadiagram.Display;
@ -43,10 +42,9 @@ import net.sourceforge.plantuml.cucadiagram.LinkArrow;
import net.sourceforge.plantuml.graphic.FontConfiguration;
import net.sourceforge.plantuml.graphic.HorizontalAlignment;
import net.sourceforge.plantuml.graphic.TextBlock;
import net.sourceforge.plantuml.graphic.TextBlockArrow;
import net.sourceforge.plantuml.graphic.TextBlockArrow2;
import net.sourceforge.plantuml.graphic.TextBlockUtils;
import net.sourceforge.plantuml.graphic.VerticalAlignment;
import net.sourceforge.plantuml.svek.DirectionalTextBlock;
import net.sourceforge.plantuml.svek.GuideLine;
public class StringWithArrow {
@ -104,18 +102,17 @@ public class StringWithArrow {
}
static public TextBlock addMagicArrow(TextBlock label, GuideLine guide, FontConfiguration font) {
final TextBlock arrowRight = new TextBlockArrow(Direction.RIGHT, font);
final TextBlock arrowLeft = new TextBlockArrow(Direction.LEFT, font);
final TextBlock arrowUp = new TextBlockArrow(Direction.UP, font);
final TextBlock arrowDown = new TextBlockArrow(Direction.DOWN, font);
final TextBlock right = TextBlockUtils.mergeLR(label, arrowRight, VerticalAlignment.CENTER);
final TextBlock left = TextBlockUtils.mergeLR(arrowLeft, label, VerticalAlignment.CENTER);
final TextBlock up = TextBlockUtils.mergeTB(arrowUp, label, HorizontalAlignment.CENTER);
final TextBlock down = TextBlockUtils.mergeTB(label, arrowDown, HorizontalAlignment.CENTER);
return new DirectionalTextBlock(guide, right, left, up, down);
final TextBlock arrow = new TextBlockArrow2(guide, font);
return TextBlockUtils.mergeLR(arrow, label, VerticalAlignment.CENTER);
}
static private TextBlock addMagicArrow2(TextBlock label, GuideLine guide, FontConfiguration font) {
final TextBlock arrow = new TextBlockArrow2(guide, font);
return TextBlockUtils.mergeLR(arrow, label, VerticalAlignment.CENTER);
}
/*
static public TextBlock addMagicArrow2(TextBlock label, GuideLine guide, FontConfiguration font) {
final TextBlock arrowRight = new TextBlockArrow(Direction.RIGHT, font);
final TextBlock arrowLeft = new TextBlockArrow(Direction.LEFT, font);
final TextBlock arrowUp = new TextBlockArrow(Direction.UP, font);
@ -127,6 +124,27 @@ public class StringWithArrow {
return new DirectionalTextBlock(guide, right, left, up, down);
}
static public TextBlock addMagicArrow(TextBlock label, GuideLine guide, FontConfiguration font) {
final TextBlock arrow = new TextBlockArrow2(guide, font);
return TextBlockUtils.mergeLR(label, arrow, VerticalAlignment.CENTER);
}
public static TextBlock addSeveralMagicArrows(Display label, GuideLine guide, FontConfiguration font,
HorizontalAlignment alignment, ISkinParam skinParam) {
TextBlock result = TextBlockUtils.EMPTY_TEXT_BLOCK;
for (CharSequence cs : label) {
StringWithArrow tmp = new StringWithArrow(cs.toString());
TextBlock block = tmp.getDisplay().create9(font, alignment, skinParam, skinParam.maxMessageSize());
if (tmp.getLinkArrow() != LinkArrow.NONE_OR_SEVERAL) {
block = StringWithArrow.addMagicArrow(block, tmp.getLinkArrow().mute(guide), font);
}
result = TextBlockUtils.mergeTB(result, block, alignment);
}
return result;
}
*/
public static TextBlock addSeveralMagicArrows(Display label, GuideLine guide, FontConfiguration font,
HorizontalAlignment alignment, ISkinParam skinParam) {
TextBlock result = TextBlockUtils.EMPTY_TEXT_BLOCK;

View File

@ -74,26 +74,27 @@ public class PSystemDonors extends AbstractPSystem {
private static final int COLS = 6;
private static final int FREE_LINES = 6;
public static final String DONORS = "6peC02mFU3XMJbc44wzsvvsjcZxOY0eHBCyJYiF08fxk1iGVuDxfSR-H_YAwqhrlcX5jsPhYF6DGBGXw"
+ "F3NN3DlSsmFFQdxwAlbcQdI5gJ0auIuaB6JOJp-fCgG4ptAz-MSKutlkfA5Pjis5a1j8l_2-CpRFJkEB"
+ "LuycQ2FmOs1V_TyrhQoxLrLXI9TLZQbHfoiSmeZ84VuVTPkwHMsSJ6qQFQ1JELTmKvsAj0LlUgALD1Da"
+ "NEiu7ysQLCL4caZnr4OA7ZcPeRqcgy-JAttG-QL-W3QjtJN4SmOKnqhfqVsrqVxp1DklaFYGS8POi5bW"
+ "3fKSrYSeVcswqN6A8A5r5jdOwYktF371u8SM-kOFPNB5UqXabY55n-KA57WynW39dDIk2MU7RWPKrOCj"
+ "-ZK8rULnu-uQX-MfP3OQRW4B5mjg1se8yZ_e4pwjx_p8v5o78fQGfqdSbcr0_LdoFkvDHT_CgqaWV6qV"
+ "cXdYAbEr7jBOyZFMgqQ7t3LarUXVnXg57C6ytysbOFxH0laHwA4-4KdyBFkDXGI4QqlzqBlEJITN5k6K"
+ "3YaLw_HRR7aj-K9NOB5nqQmEbkYxyUjoKoBOGbScbw47MbMvhVE9aj9G_x_8ew7hl-2QAhLxXsWzq-Oy"
+ "-x_hbcQ6uW0Txs8MT2qW44RJgg_OG0I7XIuFkGcG0wXk9hVYPdaHU-G716yk6NI5ZPGEYEUNa9iSGfY6"
+ "BjrSeWAOFQNKHSTjWOSwdO9kHPLyUfcxFgP9oxHjO-O-QOFdxGPZ5CTqGld4_JONk8LXbLeq9qzh7s6M"
+ "u74-JlEg-npCg-Ysj_2UzY4qhsJ0hp1dHAJITELvfdt4tTGHc4LRy58NszrjSF3GNGjEiMW5CzgqGvQ0"
+ "oOLarDAlA3ur6FuEGZPXhqr5li3MS9qQmin8WzTBarjgSaJ7QJhBiR4DmAilNh4hA9mYHDlIajcwbZ0r"
+ "O_KaLCZlb4zWgQmBInisjhiApyGy2l9mtYEhB_LZIN5RGFMnJ92N5a9V8KKHjZV8m5X9ptAROFjJEnRK"
+ "RJrouPX3yMqJRJTkY64AJ4_XVf4W4gCJIOLUOf8eu7j-_4gzQAw3ZU_iQSKuI5f88g2As7Bg1yPAG_L8"
+ "JMEzHlzVQ-rksVdpxtLaarE7t_Cp1T5pK3J-ZHJ0KKuWWwU1hoPVbBoLi98LoY33bMkLdWOI5kp2ErTH"
+ "3vOPrJjHB3Uh5gsYVQYgt-xACN0sDgouoASeLjzYbBMxUb05RT_rncAHW-0_H9L9cLoD9gin4Zg3BCxT"
+ "sFTAnJmtDe45lMCoWRPVVNQQnat6dAz8AWsF0Fb-Zqn9MWyjhAbfNJuHs2ITwtiBsvH8wt_1Y7v1hPFZ"
+ "KJsq3t9texj0mxS-f7P19XWkaayKoBTpJZHmyus2kgWMoiJIZXbsZc25_iP_H1GIZjd61u8iSx6iTaSE"
+ "sKBsyTue-a1HKsWW6ulr-anYePJZWHH9mPhPCfv7sg1jsDSJW5CKpFVtDeHB9ffVa5dxUlP6CfT-xiKP"
+ "H3gSdqrYqvIj3Jcm7scvREkEtFw-I8UT-k_4ZlETZwXR1n740Z7I25wF2UlcncxL5ZuZpwqQ7CTbEWuc" + "FuoJc9O0";
public static final String DONORS = "6rqC0AmEU9ELAujmujswMQFgmN9H8OBbUK9n65Z4qzs0-0FSEptkDz9VH5UwzqqpeYsRKvfd5TM2eE5u"
+ "ctROvizU27Dcl0Zkp17qVFW0KHArbH-f8zkv1sAfPFqs5TCdNSg6oFYiDq8te7FUXlUTiNbs6b-yUZH1"
+ "6u4V0_lg_owThRjNLM6MxbQj4JNgT8KRcxdN_r45TKJ1Jb2Wfn_JgHogmw6A2koem6DV-LKtpaUD9gjY"
+ "GYbIdBKH0gSOpD2Gazudo2zzKFYXta2RrkeQOha7AOwPqgFhiTgEVGV3BvJuaB05Nv1PO4vAEKmNA7vk"
+ "kg5Wuu53tIfcOqjAZZpHG-255lBc3qLIqdg8PvN1HS6kX1GuFOm2aj6eGHFE3Xm6LDo3BJeqSDNbVcDk"
+ "deVbgNWc3JU2XPq5jO0QWlmFUa6dzvMtJEvpKzWIyZQ9LxULg3zBtaxThEWRNPe4pDVMKpEjNrdAraCQ"
+ "Mzxd_AkpaxnfoChP7qOVgHn1lH_caZ6_jK3j27JVcB0alhzqFrX8GAYsr9lUTQu-ARC89sH8gLWdRsBB"
+ "Q_4_TFaw6n39sS4IVjVzN6wA1rleogIOz8PMSQfrFf2J6khlBtarTRuBhYaMkpUFUw9JeI7wVzSjpGp5"
+ "0Jemn2pe6e4XpAPLUx6127OBdPta9a0se7oPtFANvPVe8ouaU7E9e2jif3I2Fx-4tENWGdIawveKAu3P"
+ "KqgzA3YSOA5SXw2RKIMPNkQkds7IicpPcBbFsk1vgy4O-J6TK5oOR-O2zp0iLelc-6xjGwmIFCh7IJvr"
+ "d_sv2d1fuJtYnhL-oO2VOSw8I9dfYdrFkyNSrM6OHPrpLHVTm-tavg6R5vp5ebdCQ9E7B0QDKycegOy8"
+ "RMWm_Es7RCnUgxDQ1vl3TKfmCoCDhYzDRgZ94GMRvIp7p1O0bx7un2w_S0d16fQQoDQrXCWHgySXGtud"
+ "sWIMohJGD63dS5VWcR17GHpEUs3LgRvDoSu5L17J14bfmOmPakLXQu4Cp3NfcMa3x7PfnuAopKzs774e"
+ "lcsYhSOD4Ko1wIRS1mv4OhWXAT5BJ181-FvSdb8lFDV1ndVrj68S92qaCL15k3lb1wMdxhg5fh5Uel_7"
+ "MZiiEt_-lOviScgqUzrD43q7SG68y08DvNuXWhS1xuCDtO03Ld3HamXNhbfw6aXOi9dMsKNTlyoetF5Y"
+ "kJ6vQENveOf_kYX7WTE-8SL5Cba--n8bhHtgGUMtVVCNYuiS1FyILOPaSbKRhsGaT09cSMx7hZCLTTj8"
+ "0nQCZie4wfvwUZvCuoLZhbSeDGqF0_bkYmm9UWyjhAbfULm8h9RE_jx2DiJJ-xzWH3-_rl7pgXuQJc9q"
+ "VRj0mxScf75E91WkaWy4oDLpJZHevfi4yg9QA0DBssROMOCLyXlu4Lv8E68R7mXocelcR0Too1Qo3un6"
+ "rWVoQa83MLYiq6iI2wKS3wH82kQSBUDPf9sq0Njw1D0e2iR_xoq85myqFoEpzddrHZ2NPkx6CuXqk7y6"
+ "YKsdRFN8XlrGvhBDAt8xnY8STkA_uplEjp-YRfv440d4K1AyLXFIuSOErIOsGyzr6jp7PMxSJ7u1bwAT"
+ "9ndO6eejo58s0oMU1000";
/*
* Special thanks to our sponsors and donors:

View File

@ -39,10 +39,10 @@ import java.util.ArrayList;
import java.util.List;
import net.sourceforge.plantuml.command.Command;
import net.sourceforge.plantuml.command.UmlDiagramFactory;
import net.sourceforge.plantuml.command.PSystemCommandFactory;
import net.sourceforge.plantuml.core.DiagramType;
public class FlowDiagramFactory extends UmlDiagramFactory {
public class FlowDiagramFactory extends PSystemCommandFactory {
public FlowDiagramFactory() {
super(DiagramType.FLOW);

View File

@ -262,7 +262,7 @@ public class QuoteUtils {
"Gur terngrfg rarzl bs xabjyrqtr vf abg vtabenapr; vg vf gur vyyhfvba bs xabjyrqtr",
"N fghql sbhaq gung vtabenag crbcyr ner zber yvxryl gb oryvrir gurl'er oevyyvnag",
"Dh'rfg-pr dh'ba n qbap n fbaare pbzzr pn, pr zngva ?", "Ernyvgl vf gur bayl guvat gung'f erny",
"V jbhyq tvir zlfrys na N+", "Lbh rire unir frpbaq gubhtugf nobhg fbzrguvat ?",
"V jbhyq tvir zlfrys na N+ ba fbsgjner qrirybczrag", "Lbh rire unir frpbaq gubhtugf nobhg fbzrguvat ?",
"V oryvrir vg'f n ebhtu fvghngvba bire gurer", "Whfg fb lbh xabj, V tbg zl yvprafr fhfcraqrq",
"Gunax lbh sbe pubbfvat Bprnavp Nveyvarf", "4-8-15-16-23-42",
"...naq gnk phgf. Gung'yy fubj gurz znegvnaf.",
@ -276,7 +276,7 @@ public class QuoteUtils {
"Vs lbh ner abg rzoneenffrq ol gur svefg irefvba bs lbhe cebqhpg, lbh'ir ynhapurq gbb yngr",
"Zvfgnxrf znqr zl fhpprff: V znxr ehoore renfre", "Ovt Oebgure vf Jngpuvat Lbh.",
"Ab bar'f gnyxvat nobhg yrnivat gur fvatyr znexrg", "...rnfvrfg oht gb svk va uhzna uvfgbel",
"Arire nggevohgr gb znyvpr jung pna or rkcynvarq ol fghcvqvgl");
"Arire nggevohgr gb znyvpr jung pna or rkcynvarq ol fghcvqvgl", "Guvf oht nssrpgf iveghnyyl abobql");
private QuoteUtils() {
}

View File

@ -69,11 +69,7 @@ public class TextBlockArrow extends AbstractTextBlock implements TextBlock {
triSize--;
}
final UPolygon triangle = getTriangle(triSize);
if (arrow == Direction.RIGHT || arrow == Direction.LEFT) {
ug.apply(new UTranslate(2, (size - triSize) - 2)).draw(triangle);
} else {
ug.apply(new UTranslate(2, (size - triSize) - 2)).draw(triangle);
}
ug.apply(new UTranslate(2, (size - triSize) - 2)).draw(triangle);
}
private UPolygon getTriangle(int triSize) {

View File

@ -0,0 +1,91 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2020, Arnaud Roques
*
* Project Info: http://plantuml.com
*
* If you like this project or if you find it useful, you can support us at:
*
* http://plantuml.com/patreon (only 1$ per month!)
* http://plantuml.com/paypal
*
* This file is part of PlantUML.
*
* PlantUML is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* PlantUML distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
* License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
*
* Original Author: Arnaud Roques
*
*
*/
package net.sourceforge.plantuml.graphic;
import java.awt.geom.Dimension2D;
import java.awt.geom.Point2D;
import net.sourceforge.plantuml.Dimension2DDouble;
import net.sourceforge.plantuml.svek.GuideLine;
import net.sourceforge.plantuml.ugraphic.UEllipse;
import net.sourceforge.plantuml.ugraphic.UGraphic;
import net.sourceforge.plantuml.ugraphic.UPolygon;
import net.sourceforge.plantuml.ugraphic.UTranslate;
import net.sourceforge.plantuml.ugraphic.color.HColor;
public class TextBlockArrow2 extends AbstractTextBlock implements TextBlock {
private final double size;
private final GuideLine angle;
private final HColor color;
public TextBlockArrow2(GuideLine angle, FontConfiguration fontConfiguration) {
if (angle == null) {
throw new IllegalArgumentException();
}
this.angle = angle;
this.size = fontConfiguration.getFont().getSize2D();
this.color = fontConfiguration.getColor();
}
public void drawU(UGraphic ug) {
// final double triSize = size * .80;
final int triSize = (int) (size * .80);
ug = ug.apply(color);
ug = ug.apply(color.bg());
ug = ug.apply(new UTranslate(triSize / 2, size / 2));
final UPolygon triangle = new UPolygon();
final double beta = Math.PI * 4 / 5;
triangle.addPoint(getPoint(triSize / 2, angle.getArrowDirection2()));
triangle.addPoint(getPoint(triSize / 2, angle.getArrowDirection2() + beta));
triangle.addPoint(getPoint(triSize / 2, angle.getArrowDirection2() - beta));
triangle.addPoint(getPoint(triSize / 2, angle.getArrowDirection2()));
ug.draw(triangle);
}
private Point2D getPoint(double len, double alpha) {
final double dx = len * Math.sin(alpha);
final double dy = len * Math.cos(alpha);
return new Point2D.Double(dx, dy);
}
public Dimension2D calculateDimension(StringBounder stringBounder) {
return new Dimension2DDouble(size, size);
}
}

View File

@ -42,6 +42,7 @@ import net.sourceforge.plantuml.Dimension2DDouble;
import net.sourceforge.plantuml.style.ClockwiseTopRightBottomLeft;
import net.sourceforge.plantuml.svek.Ports;
import net.sourceforge.plantuml.svek.WithPorts;
import net.sourceforge.plantuml.ugraphic.UEmpty;
import net.sourceforge.plantuml.ugraphic.UGraphic;
import net.sourceforge.plantuml.ugraphic.UTranslate;
@ -75,8 +76,14 @@ class TextBlockMarged extends AbstractTextBlock implements TextBlock, WithPorts
}
public void drawU(UGraphic ug) {
final UTranslate translate = new UTranslate(left, top);
textBlock.drawU(ug.apply(translate));
// ug.apply(HColorUtils.BLUE).draw(new
// URectangle(calculateDimension(ug.getStringBounder())));
final Dimension2D dim = calculateDimension(ug.getStringBounder());
if (dim.getWidth() > 0) {
ug.draw(new UEmpty(dim));
final UTranslate translate = new UTranslate(left, top);
textBlock.drawU(ug.apply(translate));
}
}
@Override

View File

@ -83,8 +83,8 @@ public abstract class USymbol {
public final static USymbol COMPONENT2 = record("COMPONENT2", SkinParameter.COMPONENT2, new USymbolComponent2());
public final static USymbol BOUNDARY = record("BOUNDARY", SkinParameter.BOUNDARY, new USymbolBoundary());
public final static USymbol ENTITY_DOMAIN = record("ENTITY_DOMAIN", SkinParameter.ENTITY,
new USymbolEntityDomain(2));
public final static USymbol CONTROL = record("CONTROL", SkinParameter.CONTROL, new USymbolControl(2));
new USymbolEntityDomain());
public final static USymbol CONTROL = record("CONTROL", SkinParameter.CONTROL, new USymbolControl());
public final static USymbol INTERFACE = record("INTERFACE", SkinParameter.INTERFACE, new USymbolInterface());
public final static USymbol QUEUE = record("QUEUE", SkinParameter.QUEUE, new USymbolQueue());
public final static USymbol STACK = record("STACK", SkinParameter.STACK, new USymbolStack());

View File

@ -36,7 +36,6 @@
package net.sourceforge.plantuml.graphic;
import net.sourceforge.plantuml.skin.ActorStyle;
import net.sourceforge.plantuml.ugraphic.UStroke;
class USymbolActor extends USymbolSimpleAbstract {
@ -54,8 +53,8 @@ class USymbolActor extends USymbolSimpleAbstract {
@Override
protected TextBlock getDrawing(SymbolContext symbolContext) {
final double deltaShadow = symbolContext.isShadowing() ? 4.0 : 0.0;
final SymbolContext tmp = symbolContext.withDeltaShadow(deltaShadow).withStroke(new UStroke(2));
// final double deltaShadow = symbolContext.isShadowing() ? 4.0 : 0.0;
// final SymbolContext tmp = symbolContext.withDeltaShadow(deltaShadow).withStroke(new UStroke(2));
return actorStyle.getTextBlock(symbolContext);
}

View File

@ -36,7 +36,6 @@
package net.sourceforge.plantuml.graphic;
import net.sourceforge.plantuml.svek.Boundary;
import net.sourceforge.plantuml.ugraphic.UStroke;
class USymbolBoundary extends USymbolSimpleAbstract {
@ -45,10 +44,8 @@ class USymbolBoundary extends USymbolSimpleAbstract {
return SkinParameter.BOUNDARY;
}
@Override
protected TextBlock getDrawing(final SymbolContext symbolContext) {
return new Boundary(symbolContext.withDeltaShadow(symbolContext.isShadowing() ? 4.0 : 0.0).withStroke(
new UStroke(2)));
protected TextBlock getDrawing(SymbolContext symbolContext) {
return new Boundary(symbolContext.withDeltaShadow(symbolContext.isShadowing() ? 4.0 : 0.0));
}
}

View File

@ -36,26 +36,17 @@
package net.sourceforge.plantuml.graphic;
import net.sourceforge.plantuml.svek.Control;
import net.sourceforge.plantuml.ugraphic.UStroke;
class USymbolControl extends USymbolSimpleAbstract {
private final double thickness;
public USymbolControl(double thickness) {
this.thickness = thickness;
}
@Override
public SkinParameter getSkinParameter() {
return SkinParameter.CONTROL;
}
@Override
protected TextBlock getDrawing(final SymbolContext symbolContext) {
return new Control(symbolContext.withDeltaShadow(symbolContext.isShadowing() ? 4.0 : 0.0).withStroke(
new UStroke(thickness)));
return new Control(symbolContext.withDeltaShadow(symbolContext.isShadowing() ? 4.0 : 0.0));
}
}

View File

@ -36,25 +36,16 @@
package net.sourceforge.plantuml.graphic;
import net.sourceforge.plantuml.svek.EntityDomain;
import net.sourceforge.plantuml.ugraphic.UStroke;
class USymbolEntityDomain extends USymbolSimpleAbstract {
private final double thickness;
public USymbolEntityDomain(double thickness) {
this.thickness = thickness;
}
@Override
public SkinParameter getSkinParameter() {
return SkinParameter.ENTITY;
}
@Override
protected TextBlock getDrawing(final SymbolContext symbolContext) {
return new EntityDomain(symbolContext.withDeltaShadow(symbolContext.isShadowing() ? 4.0 : 0.0).withStroke(
new UStroke(thickness)));
return new EntityDomain(symbolContext.withDeltaShadow(symbolContext.isShadowing() ? 4.0 : 0.0));
}
}

View File

@ -39,6 +39,8 @@ import java.awt.geom.Dimension2D;
import net.sourceforge.plantuml.Dimension2DDouble;
import net.sourceforge.plantuml.ugraphic.UGraphic;
import net.sourceforge.plantuml.ugraphic.UGraphicStencil;
import net.sourceforge.plantuml.ugraphic.UStroke;
import net.sourceforge.plantuml.ugraphic.UTranslate;
abstract class USymbolSimpleAbstract extends USymbol {
@ -66,9 +68,9 @@ abstract class USymbolSimpleAbstract extends USymbol {
final double labelY = dimStickMan.getHeight() + dimStereo.getHeight();
// Actor bug?
// final UGraphic ug2 = UGraphicStencil.create(ug, getRectangleStencil(dimLabel), new UStroke());
// label.drawU(ug2.apply(new UTranslate(labelX, labelY)));
label.drawU(ug.apply(new UTranslate(labelX, labelY)));
final UGraphic ug2 = UGraphicStencil.create(ug, getRectangleStencil(dimLabel), new UStroke());
label.drawU(ug2.apply(new UTranslate(labelX, labelY)));
// label.drawU(ug.apply(new UTranslate(labelX, labelY)));
final double stereoX = (dimTotal.getWidth() - dimStereo.getWidth()) / 2;
stereotype.drawU(ug.apply(UTranslate.dx(stereoX)));

View File

@ -39,9 +39,9 @@ import java.util.ArrayList;
import java.util.List;
import net.sourceforge.plantuml.command.Command;
import net.sourceforge.plantuml.command.UmlDiagramFactory;
import net.sourceforge.plantuml.command.PSystemCommandFactory;
public class HelpFactory extends UmlDiagramFactory {
public class HelpFactory extends PSystemCommandFactory {
@Override
public Help createEmptyDiagram() {

View File

@ -423,10 +423,10 @@ public class CucaDiagramFileMakerJDot implements CucaDiagramFileMaker {
final int margin2;
if (SkinParam.USE_STYLES()) {
margin1 = SkinParam.zeroMargin(0);
margin2 = SkinParam.zeroMargin(10);
margin2 = SkinParam.zeroMargin(0);
} else {
margin1 = 0;
margin2 = 10;
margin2 = 0;
}
final ImageBuilder imageBuilder = ImageBuilder.buildD(diagram.getSkinParam(),
ClockwiseTopRightBottomLeft.margin1margin2(margin1, margin2), diagram.getAnimation(),

View File

@ -76,8 +76,8 @@ public class PSystemTree extends AbstractPSystem {
margin1 = 5;
margin2 = 5;
}
final ImageBuilder builder = ImageBuilder.buildB(new ColorMapperIdentity(), false, ClockwiseTopRightBottomLeft.margin1margin2((double) margin1, (double) margin2),
null, null, null, 1.0, HColorUtils.WHITE);
final ImageBuilder builder = ImageBuilder.buildB(new ColorMapperIdentity(), false,
ClockwiseTopRightBottomLeft.margin1margin2(margin1, margin2), null, null, null, 1.0, HColorUtils.WHITE);
if (rendering == Rendering.NEEDLE) {
final UDrawable tmp = Needle.getNeedle(root, 200, 0, 60);
final LimitFinder limitFinder = new LimitFinder(fileFormat.getDefaultStringBounder(), true);

View File

@ -38,10 +38,10 @@ import java.util.ArrayList;
import java.util.List;
import net.sourceforge.plantuml.command.Command;
import net.sourceforge.plantuml.command.UmlDiagramFactory;
import net.sourceforge.plantuml.command.PSystemCommandFactory;
import net.sourceforge.plantuml.core.DiagramType;
public class PSystemTreeFactory extends UmlDiagramFactory {
public class PSystemTreeFactory extends PSystemCommandFactory {
public PSystemTreeFactory(DiagramType type) {
super(type);

View File

@ -39,10 +39,10 @@ import java.util.ArrayList;
import java.util.List;
import net.sourceforge.plantuml.command.Command;
import net.sourceforge.plantuml.command.UmlDiagramFactory;
import net.sourceforge.plantuml.command.PSystemCommandFactory;
import net.sourceforge.plantuml.core.DiagramType;
public class MindMapDiagramFactory extends UmlDiagramFactory {
public class MindMapDiagramFactory extends PSystemCommandFactory {
public MindMapDiagramFactory() {
super(DiagramType.MINDMAP);

View File

@ -39,9 +39,9 @@ import java.util.ArrayList;
import java.util.List;
import net.sourceforge.plantuml.command.Command;
import net.sourceforge.plantuml.command.UmlDiagramFactory;
import net.sourceforge.plantuml.command.PSystemCommandFactory;
public class NwDiagramFactory extends UmlDiagramFactory {
public class NwDiagramFactory extends PSystemCommandFactory {
@Override
public NwDiagram createEmptyDiagram() {

View File

@ -73,8 +73,8 @@ public class PSystemOpenIconic extends AbstractPSystem {
margin1 = 5;
margin2 = 5;
}
final ImageBuilder imageBuilder = ImageBuilder.buildB(new ColorMapperIdentity(), false, ClockwiseTopRightBottomLeft.margin1margin2((double) margin1, (double) margin2),
null, null, null, 1.0, null);
final ImageBuilder imageBuilder = ImageBuilder.buildB(new ColorMapperIdentity(), false,
ClockwiseTopRightBottomLeft.margin1margin2(margin1, margin2), null, null, null, 1.0, null);
imageBuilder.setUDrawable(icon.asTextBlock(HColorUtils.BLACK, factor));
return imageBuilder.writeImageTOBEMOVED(fileFormat, seed, os);
@ -89,7 +89,8 @@ public class PSystemOpenIconic extends AbstractPSystem {
// private GraphicStrings getGraphicStrings() throws IOException {
// final UFont font = new UFont("SansSerif", Font.PLAIN, 12);
// final GraphicStrings result = new GraphicStrings(strings, font, HtmlColorUtils.BLACK, HtmlColorUtils.WHITE,
// final GraphicStrings result = new GraphicStrings(strings, font,
// HtmlColorUtils.BLACK, HtmlColorUtils.WHITE,
// UAntiAliasing.ANTI_ALIASING_ON);
// return result;
// }

View File

@ -39,9 +39,9 @@ import java.util.ArrayList;
import java.util.List;
import net.sourceforge.plantuml.command.Command;
import net.sourceforge.plantuml.command.UmlDiagramFactory;
import net.sourceforge.plantuml.command.PSystemCommandFactory;
public class PostIdDiagramFactory extends UmlDiagramFactory {
public class PostIdDiagramFactory extends PSystemCommandFactory {
@Override
protected List<Command> createCommands() {

View File

@ -35,7 +35,7 @@
*/
package net.sourceforge.plantuml.project;
import net.sourceforge.plantuml.project.time.Wink;
import net.sourceforge.plantuml.project.time.Day;
public class ConstantPlan implements LoadPlanable {
@ -53,7 +53,7 @@ public class ConstantPlan implements LoadPlanable {
return new ConstantPlan(load);
}
public int getLoadAt(Wink instant) {
public int getLoadAt(Day instant) {
return loadPerInstant;
}

View File

@ -56,7 +56,7 @@ public class DaysAsDates implements Iterable<Day> {
if (gantt.isOpen(tmp)) {
count--;
}
tmp = tmp.next();
tmp = tmp.increment();
}
this.date2 = tmp;
}
@ -75,7 +75,7 @@ public class DaysAsDates implements Iterable<Day> {
public Day next() {
final Day result = current;
current = current.next();
current = current.increment();
return result;
}

View File

@ -98,13 +98,13 @@ public class GanttArrow implements UDrawable {
ug = ug.apply(color.bg()).apply(color).apply(style.getStroke3(new UStroke(1.5)));
double x1 = getX(source.withDelta(0), atStart);
double y1 = getSource().getY(atStart).getValue();
double y1 = getSource().getY(atStart);
final double x2 = getX(dest, atEnd.getInv());
final double y2 = getDestination().getY(atEnd).getValue();
final double y2 = getDestination().getY(atEnd);
if (atStart == Direction.DOWN && y2 < y1) {
y1 = getSource().getY(atStart.getInv()).getValue();
y1 = getSource().getY(atStart.getInv());
}
if (this.atStart == Direction.DOWN && this.atEnd == Direction.RIGHT) {
@ -115,7 +115,7 @@ public class GanttArrow implements UDrawable {
drawLine(ug, x1, y1, x1, y2, x2, y2);
} else {
x1 = getX(source.withDelta(0), Direction.RIGHT);
y1 = getSource().getY(Direction.RIGHT).getValue();
y1 = getSource().getY(Direction.RIGHT);
drawLine(ug, x1, y1, x1 + 6, y1, x1 + 6, y1 + 8, x2 - 8, y1 + 8, x2 - 8, y2, x2, y2);
}
} else if (this.atStart == Direction.RIGHT && this.atEnd == Direction.LEFT) {

View File

@ -40,7 +40,7 @@ import net.sourceforge.plantuml.cucadiagram.LinkType;
import net.sourceforge.plantuml.cucadiagram.WithLinkType;
import net.sourceforge.plantuml.graphic.UDrawable;
import net.sourceforge.plantuml.project.core.TaskInstant;
import net.sourceforge.plantuml.project.time.Wink;
import net.sourceforge.plantuml.project.time.Day;
import net.sourceforge.plantuml.project.timescale.TimeScale;
import net.sourceforge.plantuml.ugraphic.color.HColor;
@ -72,7 +72,7 @@ public class GanttConstraint extends WithLinkType {
return new GanttArrow(timeScale, source, dest, getSpecificColor(), getType(), toTaskDraw);
}
public boolean isHidden(Wink min, Wink max) {
public boolean isHidden(Day min, Day max) {
if (isHidden(source.getInstantPrecise(), min, max)) {
return true;
}
@ -82,7 +82,7 @@ public class GanttConstraint extends WithLinkType {
return false;
}
private boolean isHidden(Wink now, Wink min, Wink max) {
private boolean isHidden(Day now, Day min, Day max) {
if (now.compareTo(min) < 0) {
return true;
}

View File

@ -57,6 +57,7 @@ import net.sourceforge.plantuml.Scale;
import net.sourceforge.plantuml.SkinParam;
import net.sourceforge.plantuml.TitledDiagram;
import net.sourceforge.plantuml.UmlDiagramType;
import net.sourceforge.plantuml.WithSprite;
import net.sourceforge.plantuml.command.CommandExecutionResult;
import net.sourceforge.plantuml.core.DiagramDescription;
import net.sourceforge.plantuml.core.ImageData;
@ -85,12 +86,9 @@ import net.sourceforge.plantuml.project.draw.TimeHeaderDaily;
import net.sourceforge.plantuml.project.draw.TimeHeaderMonthly;
import net.sourceforge.plantuml.project.draw.TimeHeaderSimple;
import net.sourceforge.plantuml.project.draw.TimeHeaderWeekly;
import net.sourceforge.plantuml.project.draw.YMovable;
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.project.time.GCalendar;
import net.sourceforge.plantuml.project.time.Wink;
import net.sourceforge.plantuml.project.timescale.TimeScale;
import net.sourceforge.plantuml.style.ClockwiseTopRightBottomLeft;
import net.sourceforge.plantuml.svek.TextBlockBackcolored;
@ -103,7 +101,7 @@ import net.sourceforge.plantuml.ugraphic.color.HColor;
import net.sourceforge.plantuml.ugraphic.color.HColorSet;
import net.sourceforge.plantuml.ugraphic.color.HColorUtils;
public class GanttDiagram extends TitledDiagram implements ToTaskDraw {
public class GanttDiagram extends TitledDiagram implements ToTaskDraw, WithSprite {
private final Map<TaskCode, Task> tasks = new LinkedHashMap<TaskCode, Task>();
private final Map<String, Task> byShortName = new HashMap<String, Task>();
@ -120,10 +118,10 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw {
private PrintScale printScale = PrintScale.DAILY;
private Day today;
private GCalendar calendar;
private Day calendar;
private double totalHeight;
private Wink min = new Wink(0);
private Wink max;
private Day min = Day.create(0);
private Day max;
private Day printStart;
private Day printEnd;
@ -213,8 +211,8 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw {
if (printStart == null) {
initMinMax();
} else {
this.min = calendar.fromDayAsDate(printStart);
this.max = calendar.fromDayAsDate(printEnd);
this.min = printStart;
this.max = printEnd;
}
final TimeHeader timeHeader;
if (calendar == null) {
@ -262,7 +260,7 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw {
private void drawTasksRect(UGraphic ug) {
for (Task task : tasks.values()) {
final TaskDraw draw = draws.get(task);
final UTranslate move = UTranslate.dy(draw.getY().getValue());
final UTranslate move = UTranslate.dy(draw.getY());
draw.drawU(ug.apply(move));
}
}
@ -282,7 +280,7 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw {
continue;
}
final TaskDraw draw = draws.get(task);
final UTranslate move = UTranslate.dy(draw.getY().getValue());
final UTranslate move = UTranslate.dy(draw.getY());
draw.drawTitle(ug1.apply(move));
}
}
@ -297,11 +295,10 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw {
public final LoadPlanable getDefaultPlan() {
return new LoadPlanable() {
public int getLoadAt(Wink instant) {
public int getLoadAt(Day day) {
if (calendar == null) {
return 100;
}
final Day day = calendar.toDayAsDate((Wink) instant);
if (isClosed(day)) {
return 0;
}
@ -333,7 +330,7 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw {
private final Map<Task, TaskDraw> draws = new LinkedHashMap<Task, TaskDraw>();
private void initTaskAndResourceDraws(TimeScale timeScale, double headerHeight, StringBounder stringBounder) {
YMovable y = new YMovable(headerHeight);
double y = headerHeight;
for (Task task : tasks.values()) {
final TaskDraw draw;
if (task instanceof TaskSeparator) {
@ -352,30 +349,36 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw {
draw.setColorsAndCompletion(tmp.getColors(), tmp.getCompletion(), tmp.getUrl(), tmp.getNote());
}
if (task.getRow() == null) {
y = y.add(draw.getHeightTask());
y += draw.getHeightTask();
}
draws.put(task, draw);
}
magicPush(stringBounder);
y = lastY(stringBounder);
for (Resource res : resources.values()) {
final ResourceDraw draw = new ResourceDraw(this, res, timeScale, y, min, max);
res.setTaskDraw(draw);
y = y.add(draw.getHeight());
while (magicPushOnce(stringBounder)) {
//
}
this.totalHeight = y.getValue();
if (lastY(stringBounder) != 0) {
y = lastY(stringBounder);
for (Resource res : resources.values()) {
final ResourceDraw draw = new ResourceDraw(this, res, timeScale, y, min, max);
res.setTaskDraw(draw);
y += draw.getHeight();
}
}
this.totalHeight = y;
}
private YMovable lastY(StringBounder stringBounder) {
private double lastY(StringBounder stringBounder) {
TaskDraw last = null;
for (TaskDraw td : draws.values()) {
last = td;
}
return last.getY().add(last.getHeightMax(stringBounder));
if (last == null) {
return 0;
}
return last.getY() + last.getHeightMax(stringBounder);
}
private boolean magicPush(StringBounder stringBounder) {
private boolean magicPushOnce(StringBounder stringBounder) {
final List<FingerPrint> notes = new ArrayList<FingerPrint>();
for (TaskDraw td : draws.values()) {
final FingerPrint taskPrint = td.getFingerPrint();
@ -397,29 +400,32 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw {
private void pushIncluding(TaskDraw first, double deltaY) {
boolean skipping = true;
if (first.getTrueRow() != null) {
first = first.getTrueRow();
}
for (TaskDraw td : draws.values()) {
if (td == first)
skipping = false;
if (skipping)
continue;
td.getY().pushMe(deltaY + 1);
td.pushMe(deltaY + 1);
}
}
private Wink getStart(final TaskImpl tmp) {
private Day getStart(final TaskImpl tmp) {
if (printStart == null) {
return tmp.getStart();
}
return Wink.max(min, tmp.getStart());
return Day.max(min, tmp.getStart());
}
private Wink getEnd(final TaskImpl tmp) {
private Day getEnd(final TaskImpl tmp) {
if (printStart == null) {
return tmp.getEnd();
}
return Wink.min(max, tmp.getEnd());
return Day.min(max, tmp.getEnd());
}
private void initMinMax() {
@ -431,8 +437,8 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw {
if (task instanceof TaskSeparator) {
continue;
}
final Wink start = task.getStart();
final Wink end = task.getEnd();
final Day start = task.getStart();
final Day end = task.getEnd();
// if (min.compareTo(start) > 0) {
// min = start;
// }
@ -443,15 +449,13 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw {
}
if (calendar != null) {
for (Day d : colorDays.keySet()) {
final Wink instant = calendar.fromDayAsDate(d);
if (instant.compareTo(max) > 0) {
max = instant;
if (d.compareTo(max) > 0) {
max = d;
}
}
for (Day d : nameDays.keySet()) {
final Wink instant = calendar.fromDayAsDate(d);
if (instant.compareTo(max) > 0) {
max = instant;
if (d.compareTo(max) > 0) {
max = d;
}
}
}
@ -547,33 +551,27 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw {
}
public void setStartingDate(Day start) {
this.calendar = new GCalendar(start);
this.calendar = start;
this.min = start;
}
public Day getStartingDate() {
if (this.calendar == null) {
return null;
}
return this.calendar.getStartingDate();
return this.calendar;
}
public Day getStartingDate(int nday) {
if (this.calendar == null) {
return null;
}
return this.calendar.toDayAsDate(new Wink(nday));
return this.calendar.addDays(nday);
}
public int daysInWeek() {
return 7 - closedDayOfWeek.size();
}
public Wink convert(Day day) {
return calendar.fromDayAsDate(day);
}
public boolean isOpen(Day day) {
return getDefaultPlan().getLoadAt(convert(day)) > 0;
return getDefaultPlan().getLoadAt(day) > 0;
}
public void affectResource(Task result, String description) {
@ -593,13 +591,13 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw {
public Resource getResource(String resourceName) {
Resource resource = resources.get(resourceName);
if (resource == null) {
resource = new Resource(resourceName, getDefaultPlan(), calendar);
resource = new Resource(resourceName, getDefaultPlan());
}
resources.put(resourceName, resource);
return resource;
}
public int getLoadForResource(Resource res, Wink i) {
public int getLoadForResource(Resource res, Day i) {
int result = 0;
for (Task task : tasks.values()) {
if (task instanceof TaskSeparator) {
@ -624,7 +622,7 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw {
end = max(end, ent.getKey());
}
if (start != null) {
result = new MomentImpl(convert(start), convert(end));
result = new MomentImpl(start, end);
}
}
return result;

View File

@ -42,8 +42,7 @@ import java.util.List;
import net.sourceforge.plantuml.command.Command;
import net.sourceforge.plantuml.command.CommandNope;
import net.sourceforge.plantuml.command.CommandScale;
import net.sourceforge.plantuml.command.UmlDiagramFactory;
import net.sourceforge.plantuml.command.PSystemCommandFactory;
import net.sourceforge.plantuml.core.DiagramType;
import net.sourceforge.plantuml.project.command.CommandColorTask;
import net.sourceforge.plantuml.project.command.CommandGanttArrow;
@ -69,7 +68,7 @@ import net.sourceforge.plantuml.project.lang.SubjectToday;
import net.sourceforge.plantuml.style.CommandStyleImport;
import net.sourceforge.plantuml.style.CommandStyleMultilinesCSS;
public class GanttDiagramFactory extends UmlDiagramFactory {
public class GanttDiagramFactory extends PSystemCommandFactory {
static private final List<Subject> subjects() {
return Arrays.<Subject>asList(new SubjectTask(), new SubjectProject(), new SubjectDayOfWeek(),
@ -85,6 +84,7 @@ public class GanttDiagramFactory extends UmlDiagramFactory {
protected List<Command> createCommands() {
final List<Command> cmds = new ArrayList<Command>();
addTitleCommands(cmds);
addCommonCommands2(cmds);
cmds.add(new CommandStyleMultilinesCSS());
cmds.add(new CommandStyleImport());
@ -101,7 +101,6 @@ public class GanttDiagramFactory extends UmlDiagramFactory {
cmds.add(new CommandPrintScale());
cmds.add(new CommandPrintBetween());
cmds.add(new CommandScale());
cmds.add(new CommandPage());
cmds.add(new CommandNoteBottom());

View File

@ -35,9 +35,9 @@
*/
package net.sourceforge.plantuml.project;
import net.sourceforge.plantuml.project.time.Wink;
import net.sourceforge.plantuml.project.time.Day;
public interface LoadPlanable {
public int getLoadAt(Wink instant);
public int getLoadAt(Day instant);
}

View File

@ -35,7 +35,7 @@
*/
package net.sourceforge.plantuml.project;
import net.sourceforge.plantuml.project.time.Wink;
import net.sourceforge.plantuml.project.time.Day;
public class PlanUtils {
@ -45,7 +45,7 @@ public class PlanUtils {
public static LoadPlanable minOf(final LoadPlanable p1, final LoadPlanable p2) {
return new LoadPlanable() {
public int getLoadAt(Wink instant) {
public int getLoadAt(Day instant) {
return Math.min(p1.getLoadAt(instant), p2.getLoadAt(instant));
}
};
@ -53,7 +53,7 @@ public class PlanUtils {
public static LoadPlanable multiply(final LoadPlanable p1, final LoadPlanable p2) {
return new LoadPlanable() {
public int getLoadAt(Wink instant) {
public int getLoadAt(Day instant) {
return p1.getLoadAt(instant) * p2.getLoadAt(instant) / 100;
}
};

View File

@ -41,7 +41,7 @@ import java.util.Map;
import java.util.Map.Entry;
import net.sourceforge.plantuml.project.core.TaskAttribute;
import net.sourceforge.plantuml.project.time.Wink;
import net.sourceforge.plantuml.project.time.Day;
public class Solver {
@ -56,8 +56,8 @@ public class Solver {
public void setData(TaskAttribute attribute, Value value) {
final Value previous = values.remove(attribute);
if (previous != null && attribute == TaskAttribute.START) {
final Wink previousInstant = (Wink) previous;
if (previousInstant.compareTo((Wink) value) > 0) {
final Day previousInstant = (Day) previous;
if (previousInstant.compareTo((Day) value) > 0) {
value = previous;
}
}
@ -90,8 +90,8 @@ public class Solver {
return result;
}
private Wink computeEnd() {
Wink current = (Wink) values.get(TaskAttribute.START);
private Day computeEnd() {
Day current = (Day) values.get(TaskAttribute.START);
int fullLoad = ((Load) values.get(TaskAttribute.LOAD)).getFullLoad();
while (fullLoad > 0) {
fullLoad -= loadPlanable.getLoadAt(current);
@ -100,13 +100,13 @@ public class Solver {
return current.decrement();
}
private Wink computeStart() {
Wink current = (Wink) values.get(TaskAttribute.END);
private Day computeStart() {
Day current = (Day) values.get(TaskAttribute.END);
int fullLoad = ((Load) values.get(TaskAttribute.LOAD)).getFullLoad();
while (fullLoad > 0) {
fullLoad -= loadPlanable.getLoadAt(current);
current = current.decrement();
if (current.getWink() <= 0) {
if (current.getMillis() <= 0) {
return current;
}
}

View File

@ -42,4 +42,6 @@ public interface ToTaskDraw {
public TaskDraw getTaskDraw(Task task);
public LoadPlanable getDefaultPlan();
}

View File

@ -46,8 +46,6 @@ import net.sourceforge.plantuml.descdiagram.command.CommandLinkElement;
import net.sourceforge.plantuml.project.GanttConstraint;
import net.sourceforge.plantuml.project.GanttDiagram;
import net.sourceforge.plantuml.project.core.Task;
import net.sourceforge.plantuml.project.core.TaskAttribute;
import net.sourceforge.plantuml.project.core.TaskInstant;
public class CommandGanttArrow extends SingleLineCommand2<GanttDiagram> {

View File

@ -35,12 +35,12 @@
*/
package net.sourceforge.plantuml.project.core;
import net.sourceforge.plantuml.project.time.Wink;
import net.sourceforge.plantuml.project.time.Day;
public interface Moment {
public Wink getStart();
public Day getStart();
public Wink getEnd();
public Day getEnd();
}

View File

@ -35,23 +35,23 @@
*/
package net.sourceforge.plantuml.project.core;
import net.sourceforge.plantuml.project.time.Wink;
import net.sourceforge.plantuml.project.time.Day;
public class MomentImpl implements Moment {
private final Wink start;
private final Wink end;
private final Day start;
private final Day end;
public MomentImpl(Wink start, Wink end) {
public MomentImpl(Day start, Day end) {
this.start = start;
this.end = end;
}
public Wink getStart() {
public Day getStart() {
return start;
}
public Wink getEnd() {
public Day getEnd() {
return end;
}

View File

@ -44,22 +44,18 @@ import net.sourceforge.plantuml.project.LoadPlanable;
import net.sourceforge.plantuml.project.draw.ResourceDraw;
import net.sourceforge.plantuml.project.time.Day;
import net.sourceforge.plantuml.project.time.DayOfWeek;
import net.sourceforge.plantuml.project.time.GCalendar;
import net.sourceforge.plantuml.project.time.Wink;
public class Resource {
private final String name;
private ResourceDraw draw;
private final Set<Wink> closed = new TreeSet<Wink>();
private final Set<Wink> forcedOn = new TreeSet<Wink>();
private final GCalendar calendar;
private final Set<Day> closed = new TreeSet<Day>();
private final Set<Day> forcedOn = new TreeSet<Day>();
private final Collection<DayOfWeek> closedDayOfWeek = EnumSet.noneOf(DayOfWeek.class);
public Resource(String name, LoadPlanable loadPlanable, GCalendar calendar) {
public Resource(String name, LoadPlanable loadPlanable) {
this.name = name;
this.calendar = calendar;
}
@Override
@ -90,24 +86,23 @@ public class Resource {
this.draw = draw;
}
public boolean isClosedAt(Wink instant) {
public boolean isClosedAt(Day instant) {
if (this.forcedOn.contains(instant)) {
return false;
}
if (closedDayOfWeek.size() > 0 && calendar != null) {
final Day d = calendar.toDayAsDate((Wink) instant);
if (closedDayOfWeek.contains(d.getDayOfWeek())) {
if (closedDayOfWeek.size() > 0) {
if (closedDayOfWeek.contains(instant.getDayOfWeek())) {
return true;
}
}
return this.closed.contains(instant);
}
public void addCloseDay(Wink instant) {
public void addCloseDay(Day instant) {
this.closed.add(instant);
}
public void addForceOnDay(Wink instant) {
public void addForceOnDay(Day instant) {
this.forcedOn.add(instant);
}

View File

@ -39,24 +39,24 @@ import net.sourceforge.plantuml.Url;
import net.sourceforge.plantuml.cucadiagram.Display;
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.project.time.Wink;
public interface Task extends Moment {
public TaskCode getCode();
public Wink getStart();
public Day getStart();
public Wink getEnd();
public Day getEnd();
public Load getLoad();
public void setLoad(Load load);
public void setStart(Wink start);
public void setStart(Day start);
public void setEnd(Wink end);
public void setEnd(Day end);
public void setColors(CenterBorderColor colors);
@ -74,7 +74,7 @@ public interface Task extends Moment {
public Task getRow();
public void addPause(Wink pause);
public void addPause(Day pause);
public void addPause(DayOfWeek pause);

View File

@ -54,17 +54,14 @@ import net.sourceforge.plantuml.project.Solver;
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.project.time.GCalendar;
import net.sourceforge.plantuml.project.time.Wink;
public class TaskImpl extends AbstractTask implements Task, LoadPlanable {
private final SortedSet<Wink> pausedDay = new TreeSet<Wink>();
private final SortedSet<Day> pausedDay = new TreeSet<Day>();
private final Set<DayOfWeek> pausedDayOfWeek = new HashSet<DayOfWeek>();
private final Solver solver;
private final Map<Resource, Integer> resources = new LinkedHashMap<Resource, Integer>();
private final LoadPlanable defaultPlan;
private final GCalendar calendar;
private boolean diamond;
private int completion = 100;
@ -77,16 +74,19 @@ public class TaskImpl extends AbstractTask implements Task, LoadPlanable {
this.url = url;
}
public TaskImpl(TaskCode code, LoadPlanable defaultPlan, GCalendar calendar) {
public TaskImpl(TaskCode code, LoadPlanable defaultPlan, Day calendar) {
super(code);
this.calendar = calendar;
this.defaultPlan = defaultPlan;
this.solver = new Solver(this);
setStart(new Wink(0));
if (calendar == null) {
setStart(Day.create(0));
} else {
setStart(calendar);
}
setLoad(Load.inWinks(1));
}
public int getLoadAt(Wink instant) {
public int getLoadAt(Day instant) {
if (pausedDay.contains(instant)) {
return 0;
}
@ -101,16 +101,16 @@ public class TaskImpl extends AbstractTask implements Task, LoadPlanable {
return result.getLoadAt(instant);
}
private boolean pausedDayOfWeek(Wink instant) {
private boolean pausedDayOfWeek(Day instant) {
for (DayOfWeek dayOfWeek : pausedDayOfWeek) {
if (calendar.toDayAsDate(instant).getDayOfWeek() == dayOfWeek) {
if (instant.getDayOfWeek() == dayOfWeek) {
return true;
}
}
return false;
}
public int loadForResource(Resource res, Wink instant) {
public int loadForResource(Resource res, Day instant) {
if (resources.keySet().contains(res) && instant.compareTo(getStart()) >= 0
&& instant.compareTo(getEnd()) <= 0) {
if (res.isClosedAt(instant)) {
@ -121,7 +121,7 @@ public class TaskImpl extends AbstractTask implements Task, LoadPlanable {
return 0;
}
public void addPause(Wink pause) {
public void addPause(Day pause) {
this.pausedDay.add(pause);
}
@ -134,7 +134,7 @@ public class TaskImpl extends AbstractTask implements Task, LoadPlanable {
throw new IllegalStateException();
}
return new LoadPlanable() {
public int getLoadAt(Wink instant) {
public int getLoadAt(Day instant) {
int result = 0;
for (Map.Entry<Resource, Integer> ent : resources.entrySet()) {
final Resource res = ent.getKey();
@ -184,16 +184,16 @@ public class TaskImpl extends AbstractTask implements Task, LoadPlanable {
return code;
}
public Wink getStart() {
Wink result = (Wink) solver.getData(TaskAttribute.START);
public Day getStart() {
Day result = (Day) solver.getData(TaskAttribute.START);
while (getLoadAt(result) == 0) {
result = result.increment();
}
return result;
}
public Wink getEnd() {
return (Wink) solver.getData(TaskAttribute.END);
public Day getEnd() {
return (Day) solver.getData(TaskAttribute.END);
}
public Load getLoad() {
@ -204,11 +204,11 @@ public class TaskImpl extends AbstractTask implements Task, LoadPlanable {
solver.setData(TaskAttribute.LOAD, load);
}
public void setStart(Wink start) {
public void setStart(Day start) {
solver.setData(TaskAttribute.START, start);
}
public void setEnd(Wink end) {
public void setEnd(Day end) {
solver.setData(TaskAttribute.END, end);
}
@ -244,20 +244,20 @@ public class TaskImpl extends AbstractTask implements Task, LoadPlanable {
return completion;
}
public final Collection<Wink> getAllPaused() {
final SortedSet<Wink> result = new TreeSet<Wink>(pausedDay);
public final Collection<Day> getAllPaused() {
final SortedSet<Day> result = new TreeSet<Day>(pausedDay);
for (DayOfWeek dayOfWeek : pausedDayOfWeek) {
addAll(result, dayOfWeek);
}
return Collections.unmodifiableCollection(result);
}
private void addAll(SortedSet<Wink> result, DayOfWeek dayOfWeek) {
final Day start = calendar.toDayAsDate(getStart());
final Day end = calendar.toDayAsDate(getEnd());
for (Day current = start; current.compareTo(end) <= 0; current = current.next()) {
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(calendar.fromDayAsDate(current));
result.add(current);
}
}
}

View File

@ -35,7 +35,7 @@
*/
package net.sourceforge.plantuml.project.core;
import net.sourceforge.plantuml.project.time.Wink;
import net.sourceforge.plantuml.project.time.Day;
public class TaskInstant {
@ -60,7 +60,7 @@ public class TaskInstant {
return new TaskInstant(task, attribute, newDelta);
}
private Wink manageDelta(Wink value) {
private Day manageDelta(Day value) {
if (delta > 0) {
for (int i = 0; i < delta; i++) {
value = value.increment();
@ -74,7 +74,7 @@ public class TaskInstant {
return value;
}
public Wink getInstantPrecise() {
public Day getInstantPrecise() {
if (attribute == TaskAttribute.START) {
return manageDelta(task.getStart());
}
@ -84,7 +84,7 @@ public class TaskInstant {
throw new IllegalStateException();
}
public Wink getInstantTheorical() {
public Day getInstantTheorical() {
if (attribute == TaskAttribute.START) {
return manageDelta(task.getStart());
}

View File

@ -39,8 +39,8 @@ import net.sourceforge.plantuml.Url;
import net.sourceforge.plantuml.cucadiagram.Display;
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.project.time.Wink;
public class TaskSeparator extends AbstractTask implements Task {
@ -55,19 +55,19 @@ public class TaskSeparator extends AbstractTask implements Task {
return code;
}
public Wink getStart() {
public Day getStart() {
throw new UnsupportedOperationException();
}
public Wink getEnd() {
public Day getEnd() {
throw new UnsupportedOperationException();
}
public void setStart(Wink start) {
public void setStart(Day start) {
throw new UnsupportedOperationException();
}
public void setEnd(Wink end) {
public void setEnd(Day end) {
throw new UnsupportedOperationException();
}
@ -107,7 +107,7 @@ public class TaskSeparator extends AbstractTask implements Task {
throw new UnsupportedOperationException();
}
public void addPause(Wink pause) {
public void addPause(Day pause) {
throw new UnsupportedOperationException();
}

View File

@ -35,6 +35,8 @@
*/
package net.sourceforge.plantuml.project.core2;
import net.sourceforge.plantuml.project.time.DayOfWeek;
public class Hole implements Comparable<Hole> {
private final long start;
@ -48,6 +50,11 @@ public class Hole implements Comparable<Hole> {
this.end = end;
}
@Override
public String toString() {
return DayOfWeek.timeToString(start) + " --> " + DayOfWeek.timeToString(end);
}
public final long getStart() {
return start;
}

View File

@ -44,11 +44,15 @@ public class HolesList implements Iterable<Hole> {
private final List<Hole> list = new ArrayList<Hole>();
public void add(Hole tooth) {
public void addHole(Hole tooth) {
list.add(tooth);
Collections.sort(list);
}
public int size() {
return list.size();
}
@Override
public String toString() {
return list.toString();
@ -66,4 +70,15 @@ public class HolesList implements Iterable<Hole> {
return Collections.unmodifiableList(list).iterator();
}
public HolesList negate() {
final HolesList result = new HolesList();
long i = 0;
for (Hole hole : list) {
result.addHole(new Hole(i, hole.getStart()));
i = hole.getEnd();
}
result.addHole(new Hole(i, 1000L * Integer.MAX_VALUE));
return result;
}
}

View File

@ -79,18 +79,25 @@ public class Slice {
public List<Slice> intersectWith(HolesList holes) {
final List<Slice> result = new ArrayList<Slice>();
for (Hole hole : holes) {
for (Hole hole : holes.negate()) {
final Slice inter = intersectWith(hole);
if (inter != null) {
result.add(inter);
}
}
return Collections.unmodifiableList(result);
}
private Slice intersectWith(Hole hole) {
if (hole.getEnd() <= start || hole.getStart() <= end) {
// if (hole.getEnd() <= start || hole.getStart() <= end) {
// return null;
// }
final long newStart = Math.max(start, hole.getStart());
final long newEnd = Math.min(end, hole.getEnd());
if (newEnd <= newStart) {
return null;
}
return new Slice(Math.max(start, hole.getStart()), Math.min(end, hole.getEnd()), workLoad);
return new Slice(newStart, newEnd, workLoad);
}
}

View File

@ -35,7 +35,6 @@
*/
package net.sourceforge.plantuml.project.core2;
import java.util.ArrayList;
import java.util.List;
public class WorkLoadWithHoles implements WorkLoad {
@ -44,7 +43,7 @@ public class WorkLoadWithHoles implements WorkLoad {
private final HolesList holes = new HolesList();
public void addHole(long start, long end) {
this.holes.add(new Hole(start, end));
this.holes.addHole(new Hole(start, end));
}
public WorkLoadWithHoles(WorkLoad source) {
@ -61,6 +60,8 @@ public class WorkLoadWithHoles implements WorkLoad {
public Slice next() {
final Slice candidat = slices.next();
final List<Slice> pending = candidat.intersectWith(holes);
System.err.println("pending=" + pending);
throw new UnsupportedOperationException();
}
}

View File

@ -0,0 +1,42 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2020, Arnaud Roques
*
* Project Info: http://plantuml.com
*
* If you like this project or if you find it useful, you can support us at:
*
* http://plantuml.com/patreon (only 1$ per month!)
* http://plantuml.com/paypal
*
* This file is part of PlantUML.
*
* PlantUML is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* PlantUML distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
* License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
*
* Original Author: Arnaud Roques
*
*
*/
package net.sourceforge.plantuml.project.core3;
public interface Histogram extends TimeLine {
public long getValueAt(long moment);
}

View File

@ -33,55 +33,43 @@
*
*
*/
package net.sourceforge.plantuml.project.time;
package net.sourceforge.plantuml.project.core3;
import net.sourceforge.plantuml.project.Value;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
public class Wink implements Value, Comparable<Wink> {
public class HistogramSimple implements Histogram {
private final int wink;
private final Map<Long, Long> events = new TreeMap<Long, Long>();
public Wink(int wink) {
this.wink = wink;
public long getNext(long moment) {
for (long e : events.keySet()) {
if (e > moment) {
return e;
}
}
return 1000L * Integer.MAX_VALUE;
}
public void put(long event, long value) {
this.events.put(event, value);
}
@Override
public String toString() {
return "(Wink +" + wink + ")";
return events.toString();
}
public Wink increment() {
return new Wink(wink + 1);
}
public Wink decrement() {
return new Wink(wink - 1);
}
public final int getWink() {
return wink;
}
public int compareTo(Wink other) {
return this.wink - other.wink;
}
public String toShortString() {
return "" + (wink + 1);
}
public static Wink min(Wink wink1, Wink wink2) {
if (wink2.wink < wink1.wink) {
return wink2;
public long getValueAt(long moment) {
long last = 0;
for (Entry<Long, Long> ent : events.entrySet()) {
if (ent.getKey() > moment) {
return last;
}
last = ent.getValue();
}
return wink1;
}
public static Wink max(Wink wink1, Wink wink2) {
if (wink2.wink > wink1.wink) {
return wink2;
}
return wink1;
return last;
}
}

View File

@ -0,0 +1,72 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2020, Arnaud Roques
*
* Project Info: http://plantuml.com
*
* If you like this project or if you find it useful, you can support us at:
*
* http://plantuml.com/patreon (only 1$ per month!)
* http://plantuml.com/paypal
*
* This file is part of PlantUML.
*
* PlantUML is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* PlantUML distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
* License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
*
* Original Author: Arnaud Roques
*
*
*/
package net.sourceforge.plantuml.project.core3;
public class Solver10 {
private final Histogram workLoad;
public Solver10(Histogram workLoad) {
this.workLoad = workLoad;
}
public TaskLoad solver(long totalLoad) {
final HistogramSimple resultLoad = new HistogramSimple();
final TaskLoadImpl result = new TaskLoadImpl(resultLoad);
final long start = workLoad.getNext(0);
result.setStart(start);
long currentTime = start;
while (totalLoad > 0) {
final long tmpWorkLoad = workLoad.getValueAt(currentTime);
final long nextChange = workLoad.getNext(currentTime);
final long duration = nextChange - currentTime;
final long partialLoad = duration * tmpWorkLoad;
resultLoad.put(currentTime, tmpWorkLoad);
if (partialLoad >= totalLoad) {
final long end = currentTime + totalLoad / tmpWorkLoad;
result.setEnd(end);
resultLoad.put(end, 0);
return result;
}
totalLoad -= partialLoad;
currentTime = nextChange;
}
throw new UnsupportedOperationException();
}
}

View File

@ -33,27 +33,14 @@
*
*
*/
package net.sourceforge.plantuml.project.draw;
package net.sourceforge.plantuml.project.core3;
public class YMovable {
public interface TaskLoad {
private double y;
public long getStart();
public YMovable(double y) {
this.y = y;
}
public long getEnd();
public YMovable add(double v) {
return new YMovable(y + v);
}
public final double getValue() {
return y;
}
public void pushMe(double delta) {
this.y += delta;
}
public Histogram getLoad();
}

View File

@ -33,40 +33,36 @@
*
*
*/
package net.sourceforge.plantuml.project.time;
package net.sourceforge.plantuml.project.core3;
public class GCalendar {
class TaskLoadImpl implements TaskLoad {
private final Day start;
private long start;
private long end;
private final Histogram load;
public GCalendar(Day start) {
this.start = start;
public TaskLoadImpl(Histogram load) {
this.load = load;
}
public Day toDayAsDate(Wink day) {
Day result = start;
final int target = day.getWink();
int work = 0;
while (work < target) {
result = result.next();
work++;
}
return result;
}
public Wink fromDayAsDate(Day day) {
if (day.compareTo(start) < 0) {
throw new IllegalArgumentException();
}
Wink result = new Wink(0);
while (toDayAsDate(result).equals(day) == false) {
result = result.increment();
}
return result;
}
public Day getStartingDate() {
public final long getStart() {
return start;
}
public final void setStart(long start) {
this.start = start;
}
public final long getEnd() {
return end;
}
public final void setEnd(long end) {
this.end = end;
}
public final Histogram getLoad() {
return load;
}
}

View File

@ -0,0 +1,42 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2020, Arnaud Roques
*
* Project Info: http://plantuml.com
*
* If you like this project or if you find it useful, you can support us at:
*
* http://plantuml.com/patreon (only 1$ per month!)
* http://plantuml.com/paypal
*
* This file is part of PlantUML.
*
* PlantUML is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* PlantUML distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
* License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
*
* Original Author: Arnaud Roques
*
*
*/
package net.sourceforge.plantuml.project.core3;
public interface TimeLine {
public long getNext(long moment);
}

View File

@ -0,0 +1,60 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2020, Arnaud Roques
*
* Project Info: http://plantuml.com
*
* If you like this project or if you find it useful, you can support us at:
*
* http://plantuml.com/patreon (only 1$ per month!)
* http://plantuml.com/paypal
*
* This file is part of PlantUML.
*
* PlantUML is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* PlantUML distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
* License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
*
* Original Author: Arnaud Roques
*
*
*/
package net.sourceforge.plantuml.project.core3;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class TimeLineSimple implements TimeLine {
private final List<Long> events = new ArrayList<Long>();
public long getNext(long moment) {
for (long e : events) {
if (e > moment) {
return e;
}
}
return Long.MAX_VALUE;
}
public void add(long event) {
this.events.add(event);
Collections.sort(events);
}
}

View File

@ -43,7 +43,7 @@ import net.sourceforge.plantuml.graphic.FontConfiguration;
import net.sourceforge.plantuml.project.ToTaskDraw;
import net.sourceforge.plantuml.project.core.Task;
import net.sourceforge.plantuml.project.lang.CenterBorderColor;
import net.sourceforge.plantuml.project.time.Wink;
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.Style;
@ -56,15 +56,20 @@ public abstract class AbstractTaskDraw implements TaskDraw {
protected Url url;
protected Display note;
protected final TimeScale timeScale;
protected final YMovable y;
private double y;
protected final String prettyDisplay;
protected final Wink start;
protected final Day start;
protected final ISkinParam skinParam;
private final Task task;
private final ToTaskDraw toTaskDraw;
protected final double margin = 2;
@Override
final public String toString() {
return super.toString() + " " + task;
}
final public void setColorsAndCompletion(CenterBorderColor colors, int completion, Url url, Display note) {
this.colors = colors;
this.completion = completion;
@ -72,7 +77,7 @@ public abstract class AbstractTaskDraw implements TaskDraw {
this.note = note;
}
public AbstractTaskDraw(TimeScale timeScale, YMovable y, String prettyDisplay, Wink start, ISkinParam skinParam,
public AbstractTaskDraw(TimeScale timeScale, double y, String prettyDisplay, Day start, ISkinParam skinParam,
Task task, ToTaskDraw toTaskDraw) {
this.y = y;
this.toTaskDraw = toTaskDraw;
@ -105,25 +110,35 @@ public abstract class AbstractTaskDraw implements TaskDraw {
return getFontConfiguration().getFont().getSize2D() + 5;
}
final public YMovable getY() {
public TaskDraw getTrueRow() {
return toTaskDraw.getTaskDraw(task.getRow());
}
final public double getY() {
if (task.getRow() == null) {
return y;
}
return toTaskDraw.getTaskDraw(task.getRow()).getY();
return getTrueRow().getY();
}
public void pushMe(double deltaY) {
if (task.getRow() == null) {
this.y += deltaY;
}
}
public final Task getTask() {
return task;
}
public final YMovable getY(Direction direction) {
public final double getY(Direction direction) {
if (direction == Direction.UP) {
return getY();
}
if (direction == Direction.DOWN) {
return getY().add(getHeightTask());
return getY() + getHeightTask();
}
return getY().add(getHeightTask() / 2);
return getY() + getHeightTask() / 2;
}
}

View File

@ -43,7 +43,7 @@ import net.sourceforge.plantuml.graphic.TextBlock;
import net.sourceforge.plantuml.graphic.UDrawable;
import net.sourceforge.plantuml.project.GanttDiagram;
import net.sourceforge.plantuml.project.core.Resource;
import net.sourceforge.plantuml.project.time.Wink;
import net.sourceforge.plantuml.project.time.Day;
import net.sourceforge.plantuml.project.timescale.TimeScale;
import net.sourceforge.plantuml.ugraphic.UFont;
import net.sourceforge.plantuml.ugraphic.UGraphic;
@ -56,12 +56,12 @@ public class ResourceDraw implements UDrawable {
private final Resource res;
private final TimeScale timeScale;
private final YMovable y;
private final Wink min;
private final Wink max;
private final double y;
private final Day min;
private final Day max;
private final GanttDiagram gantt;
public ResourceDraw(GanttDiagram gantt, Resource res, TimeScale timeScale, YMovable y, Wink min, Wink max) {
public ResourceDraw(GanttDiagram gantt, Resource res, TimeScale timeScale, double y, Day min, Day max) {
this.res = res;
this.timeScale = timeScale;
this.y = y;
@ -81,7 +81,7 @@ public class ResourceDraw implements UDrawable {
double startingPosition = -1;
int totalLoad = 0;
int totalLimit = 0;
for (Wink i = min; i.compareTo(max) <= 0; i = i.increment()) {
for (Day i = min; i.compareTo(max) <= 0; i = i.increment()) {
final boolean isBreaking = timeScale.isBreaking(i);
totalLoad += gantt.getLoadForResource(res, i);
totalLimit += 100;
@ -123,8 +123,8 @@ public class ResourceDraw implements UDrawable {
return 16 * 2;
}
public double getY() {
return y.getValue();
public final double getY() {
return y;
}
}

View File

@ -46,12 +46,16 @@ import net.sourceforge.plantuml.ugraphic.UGraphic;
public interface TaskDraw extends UDrawable {
public TaskDraw getTrueRow();
public void setColorsAndCompletion(CenterBorderColor colors, int completion, Url url, Display note);
public YMovable getY();
public double getY();
public YMovable getY(Direction direction);
public double getY(Direction direction);
public void pushMe(double deltaY);
public void drawTitle(UGraphic ug);
public double getHeightTask();
@ -64,4 +68,5 @@ public interface TaskDraw extends UDrawable {
public FingerPrint getFingerPrintNote(StringBounder stringBounder);
}

View File

@ -43,7 +43,7 @@ import net.sourceforge.plantuml.graphic.StringBounder;
import net.sourceforge.plantuml.graphic.TextBlock;
import net.sourceforge.plantuml.project.ToTaskDraw;
import net.sourceforge.plantuml.project.core.Task;
import net.sourceforge.plantuml.project.time.Wink;
import net.sourceforge.plantuml.project.time.Day;
import net.sourceforge.plantuml.project.timescale.TimeScale;
import net.sourceforge.plantuml.style.SName;
import net.sourceforge.plantuml.style.Style;
@ -55,7 +55,7 @@ import net.sourceforge.plantuml.ugraphic.UTranslate;
public class TaskDrawDiamond extends AbstractTaskDraw {
public TaskDrawDiamond(TimeScale timeScale, YMovable y, String prettyDisplay, Wink start, ISkinParam skinParam,
public TaskDrawDiamond(TimeScale timeScale, double y, String prettyDisplay, Day start, ISkinParam skinParam,
Task task, ToTaskDraw toTaskDraw) {
super(timeScale, y, prettyDisplay, start, skinParam, task, toTaskDraw);
}
@ -108,7 +108,7 @@ public class TaskDrawDiamond extends AbstractTaskDraw {
public FingerPrint getFingerPrint() {
final double h = getHeightTask();
final double startPos = timeScale.getStartingPosition(start);
return new FingerPrint(startPos, y.getValue(), startPos + h, y.getValue() + h);
return new FingerPrint(startPos, getY(), startPos + h, getY() + h);
}
private UShape getDiamond() {

View File

@ -37,6 +37,7 @@ package net.sourceforge.plantuml.project.draw;
import java.awt.geom.Dimension2D;
import java.util.Collection;
import java.util.TreeSet;
import net.sourceforge.plantuml.FontParam;
import net.sourceforge.plantuml.ISkinParam;
@ -54,7 +55,7 @@ import net.sourceforge.plantuml.graphic.TextBlock;
import net.sourceforge.plantuml.project.ToTaskDraw;
import net.sourceforge.plantuml.project.core.Task;
import net.sourceforge.plantuml.project.core.TaskImpl;
import net.sourceforge.plantuml.project.time.Wink;
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;
@ -72,20 +73,27 @@ import net.sourceforge.plantuml.ugraphic.color.HColorUtils;
public class TaskDrawRegular extends AbstractTaskDraw {
private final Wink end;
private final Day end;
private final boolean oddStart;
private final boolean oddEnd;
private final Collection<Wink> paused;
private final Collection<Day> paused;
private final double margin = 2;
public TaskDrawRegular(TimeScale timeScale, YMovable y, String prettyDisplay, Wink start, Wink end,
boolean oddStart, boolean oddEnd, ISkinParam skinParam, Task task, ToTaskDraw toTaskDraw) {
public TaskDrawRegular(TimeScale timeScale, double y, String prettyDisplay, Day start, Day end, boolean oddStart,
boolean oddEnd, ISkinParam skinParam, Task task, ToTaskDraw toTaskDraw) {
super(timeScale, y, prettyDisplay, start, skinParam, task, toTaskDraw);
this.end = end;
this.oddStart = oddStart;
this.oddEnd = oddEnd;
this.paused = ((TaskImpl) task).getAllPaused();
this.paused = new TreeSet<Day>(((TaskImpl) task).getAllPaused());
for (Day tmp = start; tmp.compareTo(end) <= 0; tmp = tmp.increment()) {
final int load = toTaskDraw.getDefaultPlan().getLoadAt(tmp);
if (load == 0) {
this.paused.add(tmp);
}
}
}
public void drawTitle(UGraphic ug) {
@ -156,7 +164,7 @@ public class TaskDrawRegular extends AbstractTaskDraw {
final double h = getHeightTask();
final double startPos = timeScale.getStartingPosition(start);
final double endPos = timeScale.getEndingPosition(end);
return new FingerPrint(startPos, y.getValue(), endPos - startPos, h);
return new FingerPrint(startPos, getY(), endPos - startPos, h);
}
public FingerPrint getFingerPrintNote(StringBounder stringBounder) {
@ -166,7 +174,7 @@ public class TaskDrawRegular extends AbstractTaskDraw {
final Dimension2D dim = getOpaleNote().calculateDimension(stringBounder);
final double startPos = timeScale.getStartingPosition(start);
// final double endPos = timeScale.getEndingPosition(end);
return new FingerPrint(startPos, y.getValue() + getYNotePosition(), dim.getWidth(), dim.getHeight());
return new FingerPrint(startPos, getY() + getYNotePosition(), dim.getWidth(), dim.getHeight());
}
private UGraphic applyColors(UGraphic ug) {
@ -213,8 +221,8 @@ public class TaskDrawRegular extends AbstractTaskDraw {
if (url != null) {
ug.closeUrl();
}
Wink begin = null;
for (Wink pause : paused) {
Day begin = null;
for (Day pause : paused) {
if (paused.contains(pause.increment())) {
if (begin == null)
begin = pause;
@ -228,7 +236,7 @@ public class TaskDrawRegular extends AbstractTaskDraw {
}
}
private void drawPause(UGraphic ug, Wink start1, Wink end) {
private void drawPause(UGraphic ug, Day start1, Day end) {
final double x1 = timeScale.getStartingPosition(start1);
final double x2 = timeScale.getEndingPosition(end);
final URectangle small = new URectangle(x2 - x1 - 1, getShapeHeight() + 1);

View File

@ -46,7 +46,7 @@ import net.sourceforge.plantuml.graphic.TextBlock;
import net.sourceforge.plantuml.graphic.TextBlockUtils;
import net.sourceforge.plantuml.project.core.Task;
import net.sourceforge.plantuml.project.lang.CenterBorderColor;
import net.sourceforge.plantuml.project.time.Wink;
import net.sourceforge.plantuml.project.time.Day;
import net.sourceforge.plantuml.project.timescale.TimeScale;
import net.sourceforge.plantuml.ugraphic.UFont;
import net.sourceforge.plantuml.ugraphic.UGraphic;
@ -57,12 +57,12 @@ import net.sourceforge.plantuml.ugraphic.color.HColorUtils;
public class TaskDrawSeparator implements TaskDraw {
private final TimeScale timeScale;
private final YMovable y;
private final Wink min;
private final Wink max;
private double y;
private final Day min;
private final Day max;
private final String name;
public TaskDrawSeparator(String name, TimeScale timeScale, YMovable y, Wink min, Wink max) {
public TaskDrawSeparator(String name, TimeScale timeScale, double y, Day min, Day max) {
this.name = name;
this.y = y;
this.timeScale = timeScale;
@ -112,17 +112,25 @@ public class TaskDrawSeparator implements TaskDraw {
public FingerPrint getFingerPrint() {
final double h = getHeightTask();
final double end = timeScale.getEndingPosition(max);
return new FingerPrint(0, y.getValue(), end, y.getValue() + h);
return new FingerPrint(0, y, end, y + h);
}
public double getHeightTask() {
return 16;
}
public YMovable getY() {
public double getY() {
return y;
}
public void pushMe(double deltaY) {
this.y += deltaY;
}
public TaskDraw getTrueRow() {
return null;
}
public void setColorsAndCompletion(CenterBorderColor colors, int completion, Url url, Display note) {
}
@ -130,7 +138,7 @@ public class TaskDrawSeparator implements TaskDraw {
throw new UnsupportedOperationException();
}
public YMovable getY(Direction direction) {
public double getY(Direction direction) {
throw new UnsupportedOperationException();
}

View File

@ -40,7 +40,7 @@ import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.graphic.FontConfiguration;
import net.sourceforge.plantuml.graphic.HorizontalAlignment;
import net.sourceforge.plantuml.graphic.TextBlock;
import net.sourceforge.plantuml.project.time.Wink;
import net.sourceforge.plantuml.project.time.Day;
import net.sourceforge.plantuml.project.timescale.TimeScale;
import net.sourceforge.plantuml.ugraphic.UFont;
import net.sourceforge.plantuml.ugraphic.UGraphic;
@ -55,10 +55,10 @@ public abstract class TimeHeader {
protected static final int Y_POS_ROW28 = 28;
private final TimeScale timeScale;
protected final Wink min;
protected final Wink max;
protected final Day min;
protected final Day max;
public TimeHeader(Wink min, Wink max, TimeScale timeScale) {
public TimeHeader(Day min, Day max, TimeScale timeScale) {
this.timeScale = timeScale;
this.min = min;
this.max = max;

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