mirror of
https://github.com/octoleo/plantuml.git
synced 2024-12-22 10:59:01 +00:00
Import version 1.2020.18
This commit is contained in:
parent
b27fa50b50
commit
58936dc235
2
pom.xml
2
pom.xml
@ -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>
|
||||
|
@ -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());
|
||||
}
|
||||
|
||||
|
@ -126,8 +126,6 @@ public interface ISkinParam extends ISkinSimple {
|
||||
|
||||
public ConditionEndStyle getConditionEndStyle();
|
||||
|
||||
public double minClassWidth();
|
||||
|
||||
public boolean sameClassWidth();
|
||||
|
||||
public Rankdir getRankdir();
|
||||
|
@ -62,4 +62,6 @@ public interface ISkinSimple extends SpriteContainer {
|
||||
|
||||
public void copyAllFrom(ISkinSimple other);
|
||||
|
||||
public double minClassWidth();
|
||||
|
||||
}
|
@ -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());
|
||||
|
@ -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();
|
||||
|
@ -94,4 +94,8 @@ public class SpriteContainerEmpty implements SpriteContainer, ISkinSimple {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
public double minClassWidth() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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) {
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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();
|
||||
|
@ -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());
|
||||
|
@ -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 {
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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("|_");
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
116
src/net/sourceforge/plantuml/creole/legacy/StripeCode.java
Normal file
116
src/net/sourceforge/plantuml/creole/legacy/StripeCode.java
Normal 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();
|
||||
}
|
||||
|
||||
}
|
@ -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();
|
||||
|
@ -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),
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -61,6 +61,10 @@ public enum LinkArrow {
|
||||
public Direction getArrowDirection() {
|
||||
return guide.getArrowDirection().getInv();
|
||||
}
|
||||
|
||||
public double getArrowDirection2() {
|
||||
return Math.PI + guide.getArrowDirection2();
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -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(")");
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
BIN
src/net/sourceforge/plantuml/dedication/2.png
Normal file
BIN
src/net/sourceforge/plantuml/dedication/2.png
Normal file
Binary file not shown.
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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:
|
||||
|
@ -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);
|
||||
|
@ -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() {
|
||||
}
|
||||
|
@ -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) {
|
||||
|
91
src/net/sourceforge/plantuml/graphic/TextBlockArrow2.java
Normal file
91
src/net/sourceforge/plantuml/graphic/TextBlockArrow2.java
Normal 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);
|
||||
}
|
||||
}
|
@ -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
|
||||
|
@ -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());
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
@ -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));
|
||||
}
|
||||
|
||||
}
|
@ -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));
|
||||
}
|
||||
}
|
@ -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)));
|
||||
|
@ -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() {
|
||||
|
@ -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(),
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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() {
|
||||
|
@ -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;
|
||||
// }
|
||||
|
@ -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() {
|
||||
|
@ -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;
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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());
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
};
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -42,4 +42,6 @@ public interface ToTaskDraw {
|
||||
|
||||
public TaskDraw getTaskDraw(Task task);
|
||||
|
||||
public LoadPlanable getDefaultPlan();
|
||||
|
||||
}
|
||||
|
@ -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> {
|
||||
|
||||
|
@ -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();
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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());
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
42
src/net/sourceforge/plantuml/project/core3/Histogram.java
Normal file
42
src/net/sourceforge/plantuml/project/core3/Histogram.java
Normal 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);
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
72
src/net/sourceforge/plantuml/project/core3/Solver10.java
Normal file
72
src/net/sourceforge/plantuml/project/core3/Solver10.java
Normal 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();
|
||||
}
|
||||
|
||||
}
|
@ -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();
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
42
src/net/sourceforge/plantuml/project/core3/TimeLine.java
Normal file
42
src/net/sourceforge/plantuml/project/core3/TimeLine.java
Normal 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);
|
||||
|
||||
}
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -46,11 +46,15 @@ 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);
|
||||
|
||||
@ -64,4 +68,5 @@ public interface TaskDraw extends UDrawable {
|
||||
|
||||
public FingerPrint getFingerPrintNote(StringBounder stringBounder);
|
||||
|
||||
|
||||
}
|
||||
|
@ -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() {
|
||||
|
@ -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);
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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
Loading…
Reference in New Issue
Block a user