mirror of
https://github.com/octoleo/plantuml.git
synced 2024-11-23 13:27:34 +00:00
feat: several gantt improvement
This commit is contained in:
parent
f0b3e6900c
commit
e991c4699b
@ -375,6 +375,13 @@ ganttDiagram {
|
|||||||
timeline {
|
timeline {
|
||||||
BackgroundColor transparent
|
BackgroundColor transparent
|
||||||
LineColor #C0C0C0
|
LineColor #C0C0C0
|
||||||
|
FontSize 10
|
||||||
|
month {
|
||||||
|
FontSize 12
|
||||||
|
}
|
||||||
|
year {
|
||||||
|
FontSize 14
|
||||||
|
}
|
||||||
}
|
}
|
||||||
closed {
|
closed {
|
||||||
BackGroundColor #F1E5E5
|
BackGroundColor #F1E5E5
|
||||||
|
@ -117,7 +117,7 @@ import net.sourceforge.plantuml.style.StyleSignatureBasic;
|
|||||||
import net.sourceforge.plantuml.svek.GraphvizCrash;
|
import net.sourceforge.plantuml.svek.GraphvizCrash;
|
||||||
import net.sourceforge.plantuml.text.BackSlash;
|
import net.sourceforge.plantuml.text.BackSlash;
|
||||||
|
|
||||||
public class GanttDiagram extends TitledDiagram implements ToTaskDraw, WithSprite {
|
public class GanttDiagram extends TitledDiagram implements ToTaskDraw, WithSprite, GanttStyle {
|
||||||
|
|
||||||
private final Map<Task, TaskDraw> draws = new LinkedHashMap<Task, TaskDraw>();
|
private final Map<Task, TaskDraw> draws = new LinkedHashMap<Task, TaskDraw>();
|
||||||
private final Map<TaskCode, Task> tasks = new LinkedHashMap<TaskCode, Task>();
|
private final Map<TaskCode, Task> tasks = new LinkedHashMap<TaskCode, Task>();
|
||||||
@ -233,8 +233,9 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw, WithSprit
|
|||||||
this.min = printStart;
|
this.min = printStart;
|
||||||
this.max = printEnd;
|
this.max = printEnd;
|
||||||
}
|
}
|
||||||
final TimeHeader timeHeader = getTimeHeader();
|
final TimeHeader timeHeader = getTimeHeader(stringBounder);
|
||||||
initTaskAndResourceDraws(timeHeader.getTimeScale(), timeHeader.getFullHeaderHeight(), stringBounder);
|
initTaskAndResourceDraws(timeHeader.getTimeScale(), timeHeader.getFullHeaderHeight(stringBounder),
|
||||||
|
stringBounder);
|
||||||
return new AbstractTextBlock() {
|
return new AbstractTextBlock() {
|
||||||
|
|
||||||
public void drawU(UGraphic ug) {
|
public void drawU(UGraphic ug) {
|
||||||
@ -250,12 +251,12 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw, WithSprit
|
|||||||
final HColor back = timelineStyle.value(PName.BackGroundColor).asColor(getIHtmlColorSet());
|
final HColor back = timelineStyle.value(PName.BackGroundColor).asColor(getIHtmlColorSet());
|
||||||
if (back.isTransparent() == false) {
|
if (back.isTransparent() == false) {
|
||||||
final URectangle rect1 = URectangle.build(calculateDimension(ug.getStringBounder()).getWidth(),
|
final URectangle rect1 = URectangle.build(calculateDimension(ug.getStringBounder()).getWidth(),
|
||||||
timeHeader.getTimeHeaderHeight());
|
timeHeader.getTimeHeaderHeight(ug.getStringBounder()));
|
||||||
ug.apply(back.bg()).draw(rect1);
|
ug.apply(back.bg()).draw(rect1);
|
||||||
if (showFootbox) {
|
if (showFootbox) {
|
||||||
final URectangle rect2 = URectangle.build(
|
final URectangle rect2 = URectangle.build(
|
||||||
calculateDimension(ug.getStringBounder()).getWidth(),
|
calculateDimension(ug.getStringBounder()).getWidth(),
|
||||||
timeHeader.getTimeFooterHeight());
|
timeHeader.getTimeFooterHeight(ug.getStringBounder()));
|
||||||
ug.apply(back.bg()).apply(UTranslate.dy(totalHeightWithoutFooter)).draw(rect2);
|
ug.apply(back.bg()).apply(UTranslate.dy(totalHeightWithoutFooter)).draw(rect2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -297,7 +298,7 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw, WithSprit
|
|||||||
|
|
||||||
public XDimension2D calculateDimension(StringBounder stringBounder) {
|
public XDimension2D calculateDimension(StringBounder stringBounder) {
|
||||||
return new XDimension2D(getTitlesColumnWidth(stringBounder) + getBarsColumnWidth(timeHeader),
|
return new XDimension2D(getTitlesColumnWidth(stringBounder) + getBarsColumnWidth(timeHeader),
|
||||||
getTotalHeight(timeHeader));
|
getTotalHeight(stringBounder, timeHeader));
|
||||||
}
|
}
|
||||||
|
|
||||||
private double getBarsColumnWidth(final TimeHeader timeHeader) {
|
private double getBarsColumnWidth(final TimeHeader timeHeader) {
|
||||||
@ -309,28 +310,27 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw, WithSprit
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private TimeHeader getTimeHeader() {
|
private TimeHeader getTimeHeader(StringBounder stringBounder) {
|
||||||
if (openClose.getStartingDay() == null)
|
if (openClose.getStartingDay() == null)
|
||||||
return new TimeHeaderSimple(thParam(), printScale);
|
return new TimeHeaderSimple(stringBounder, thParam(), printScale);
|
||||||
else if (printScale == PrintScale.DAILY)
|
else if (printScale == PrintScale.DAILY)
|
||||||
return new TimeHeaderDaily(thParam(), nameDays, printStart, printEnd);
|
return new TimeHeaderDaily(stringBounder, thParam(), nameDays, printStart, printEnd);
|
||||||
else if (printScale == PrintScale.WEEKLY)
|
else if (printScale == PrintScale.WEEKLY)
|
||||||
return new TimeHeaderWeekly(thParam(), weekNumberStrategy, withCalendarDate);
|
return new TimeHeaderWeekly(stringBounder, thParam(), weekNumberStrategy, withCalendarDate);
|
||||||
else if (printScale == PrintScale.MONTHLY)
|
else if (printScale == PrintScale.MONTHLY)
|
||||||
return new TimeHeaderMonthly(thParam());
|
return new TimeHeaderMonthly(stringBounder, thParam());
|
||||||
else if (printScale == PrintScale.QUARTERLY)
|
else if (printScale == PrintScale.QUARTERLY)
|
||||||
return new TimeHeaderQuarterly(thParam());
|
return new TimeHeaderQuarterly(stringBounder, thParam());
|
||||||
else if (printScale == PrintScale.YEARLY)
|
else if (printScale == PrintScale.YEARLY)
|
||||||
return new TimeHeaderYearly(thParam());
|
return new TimeHeaderYearly(stringBounder, thParam());
|
||||||
else
|
else
|
||||||
throw new IllegalStateException();
|
throw new IllegalStateException();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private TimeHeaderParameters thParam() {
|
private TimeHeaderParameters thParam() {
|
||||||
return new TimeHeaderParameters(colorDays(), getFactorScale(), min, max, getIHtmlColorSet(), getTimelineStyle(),
|
return new TimeHeaderParameters(colorDays(), getFactorScale(), min, max, getIHtmlColorSet(), locale, openClose,
|
||||||
getClosedStyle(), locale, openClose, colorDaysOfWeek, verticalSeparatorBefore,
|
colorDaysOfWeek, verticalSeparatorBefore, this);
|
||||||
getVerticalSeparatorStyle());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Map<Day, HColor> colorDays() {
|
private Map<Day, HColor> colorDays() {
|
||||||
@ -338,24 +338,21 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw, WithSprit
|
|||||||
return Collections.unmodifiableMap(colorDaysInternal);
|
return Collections.unmodifiableMap(colorDaysInternal);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Style getClosedStyle() {
|
@Override
|
||||||
return StyleSignatureBasic.of(SName.root, SName.element, SName.ganttDiagram, SName.closed)
|
public final Style getStyle(SName param) {
|
||||||
|
return StyleSignatureBasic.of(SName.root, SName.element, SName.ganttDiagram, param)
|
||||||
.getMergedStyle(getCurrentStyleBuilder());
|
.getMergedStyle(getCurrentStyleBuilder());
|
||||||
}
|
}
|
||||||
|
|
||||||
private Style getTimelineStyle() {
|
@Override
|
||||||
return StyleSignatureBasic.of(SName.root, SName.element, SName.ganttDiagram, SName.timeline)
|
public final Style getStyle(SName param1, SName param2) {
|
||||||
|
return StyleSignatureBasic.of(SName.root, SName.element, SName.ganttDiagram, param1, param2)
|
||||||
.getMergedStyle(getCurrentStyleBuilder());
|
.getMergedStyle(getCurrentStyleBuilder());
|
||||||
}
|
}
|
||||||
|
|
||||||
private Style getVerticalSeparatorStyle() {
|
private double getTotalHeight(StringBounder stringBounder, TimeHeader timeHeader) {
|
||||||
return StyleSignatureBasic.of(SName.root, SName.element, SName.ganttDiagram, SName.verticalSeparator)
|
|
||||||
.getMergedStyle(getCurrentStyleBuilder());
|
|
||||||
}
|
|
||||||
|
|
||||||
private double getTotalHeight(TimeHeader timeHeader) {
|
|
||||||
if (showFootbox)
|
if (showFootbox)
|
||||||
return totalHeightWithoutFooter + timeHeader.getTimeFooterHeight();
|
return totalHeightWithoutFooter + timeHeader.getTimeFooterHeight(stringBounder);
|
||||||
|
|
||||||
return totalHeightWithoutFooter;
|
return totalHeightWithoutFooter;
|
||||||
}
|
}
|
||||||
|
@ -33,12 +33,15 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
package net.sourceforge.plantuml.project.lang;
|
package net.sourceforge.plantuml.project;
|
||||||
|
|
||||||
import net.sourceforge.plantuml.regex.IRegex;
|
import net.sourceforge.plantuml.style.SName;
|
||||||
|
import net.sourceforge.plantuml.style.Style;
|
||||||
|
|
||||||
public interface Adverbial {
|
public interface GanttStyle {
|
||||||
|
|
||||||
public IRegex toRegex();
|
public Style getStyle(SName param);
|
||||||
|
|
||||||
|
public Style getStyle(SName param1, SName param2);
|
||||||
|
|
||||||
}
|
}
|
@ -43,41 +43,39 @@ import net.sourceforge.plantuml.klimt.UStroke;
|
|||||||
import net.sourceforge.plantuml.klimt.color.HColor;
|
import net.sourceforge.plantuml.klimt.color.HColor;
|
||||||
import net.sourceforge.plantuml.klimt.color.HColorSet;
|
import net.sourceforge.plantuml.klimt.color.HColorSet;
|
||||||
import net.sourceforge.plantuml.klimt.drawing.UGraphic;
|
import net.sourceforge.plantuml.klimt.drawing.UGraphic;
|
||||||
|
import net.sourceforge.plantuml.klimt.font.StringBounder;
|
||||||
import net.sourceforge.plantuml.project.time.Day;
|
import net.sourceforge.plantuml.project.time.Day;
|
||||||
import net.sourceforge.plantuml.project.time.DayOfWeek;
|
import net.sourceforge.plantuml.project.time.DayOfWeek;
|
||||||
import net.sourceforge.plantuml.style.PName;
|
import net.sourceforge.plantuml.style.PName;
|
||||||
|
import net.sourceforge.plantuml.style.SName;
|
||||||
import net.sourceforge.plantuml.style.Style;
|
import net.sourceforge.plantuml.style.Style;
|
||||||
|
|
||||||
public class TimeHeaderParameters {
|
public class TimeHeaderParameters implements GanttStyle {
|
||||||
|
|
||||||
private final Map<Day, HColor> colorDays;
|
private final Map<Day, HColor> colorDays;
|
||||||
private final double scale;
|
private final double scale;
|
||||||
private final Day min;
|
private final Day min;
|
||||||
private final Day max;
|
private final Day max;
|
||||||
private final HColorSet colorSet;
|
private final HColorSet colorSet;
|
||||||
private final Style timelineStyle;
|
private final GanttStyle ganttStyle;
|
||||||
private final Style closedStyle;
|
|
||||||
private final Style verticalSeparatorStyle;
|
|
||||||
private final Locale locale;
|
private final Locale locale;
|
||||||
private final OpenClose openClose;
|
private final OpenClose openClose;
|
||||||
private final Map<DayOfWeek, HColor> colorDaysOfWeek;
|
private final Map<DayOfWeek, HColor> colorDaysOfWeek;
|
||||||
private final Set<Day> verticalSeparatorBefore;
|
private final Set<Day> verticalSeparatorBefore;
|
||||||
|
|
||||||
public TimeHeaderParameters(Map<Day, HColor> colorDays, double scale, Day min, Day max, HColorSet colorSet,
|
public TimeHeaderParameters(Map<Day, HColor> colorDays, double scale, Day min, Day max, HColorSet colorSet,
|
||||||
Style timelineStyle, Style closedStyle, Locale locale, OpenClose openClose,
|
Locale locale, OpenClose openClose, Map<DayOfWeek, HColor> colorDaysOfWeek,
|
||||||
Map<DayOfWeek, HColor> colorDaysOfWeek, Set<Day> verticalSeparatorBefore, Style verticalSeparatorStyle) {
|
Set<Day> verticalSeparatorBefore, GanttStyle ganttStyle) {
|
||||||
this.colorDays = colorDays;
|
this.colorDays = colorDays;
|
||||||
this.scale = scale;
|
this.scale = scale;
|
||||||
this.min = min;
|
this.min = min;
|
||||||
this.max = max;
|
this.max = max;
|
||||||
this.colorSet = colorSet;
|
this.colorSet = colorSet;
|
||||||
this.timelineStyle = timelineStyle;
|
this.ganttStyle = ganttStyle;
|
||||||
this.closedStyle = closedStyle;
|
|
||||||
this.locale = locale;
|
this.locale = locale;
|
||||||
this.openClose = openClose;
|
this.openClose = openClose;
|
||||||
this.colorDaysOfWeek = colorDaysOfWeek;
|
this.colorDaysOfWeek = colorDaysOfWeek;
|
||||||
this.verticalSeparatorBefore = verticalSeparatorBefore;
|
this.verticalSeparatorBefore = verticalSeparatorBefore;
|
||||||
this.verticalSeparatorStyle = verticalSeparatorStyle;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public HColor getColor(Day wink) {
|
public HColor getColor(Day wink) {
|
||||||
@ -105,11 +103,11 @@ public class TimeHeaderParameters {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public final Style getTimelineStyle() {
|
public final Style getTimelineStyle() {
|
||||||
return timelineStyle;
|
return getStyle(SName.timeline);
|
||||||
}
|
}
|
||||||
|
|
||||||
public final Style getClosedStyle() {
|
public final Style getClosedStyle() {
|
||||||
return closedStyle;
|
return getStyle(SName.closed);
|
||||||
}
|
}
|
||||||
|
|
||||||
public final Locale getLocale() {
|
public final Locale getLocale() {
|
||||||
@ -129,9 +127,25 @@ public class TimeHeaderParameters {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public final UGraphic forVerticalSeparator(UGraphic ug) {
|
public final UGraphic forVerticalSeparator(UGraphic ug) {
|
||||||
final HColor color = verticalSeparatorStyle.value(PName.LineColor).asColor(getColorSet());
|
final Style style = getStyle(SName.verticalSeparator);
|
||||||
final UStroke stroke = verticalSeparatorStyle.getStroke();
|
final HColor color = style.value(PName.LineColor).asColor(getColorSet());
|
||||||
|
final UStroke stroke = style.getStroke();
|
||||||
return ug.apply(color).apply(stroke);
|
return ug.apply(color).apply(stroke);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final Style getStyle(SName param1, SName param2) {
|
||||||
|
return ganttStyle.getStyle(param1, param2);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Style getStyle(SName param) {
|
||||||
|
return ganttStyle.getStyle(param);
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getCellWidth(StringBounder stringBounder) {
|
||||||
|
final double w = getStyle(SName.timeline, SName.day).value(PName.FontSize).asDouble();
|
||||||
|
return w * 1.6;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -43,27 +43,42 @@ public abstract class AbstractTask implements Task {
|
|||||||
private final StyleBuilder styleBuilder;
|
private final StyleBuilder styleBuilder;
|
||||||
|
|
||||||
private Task row;
|
private Task row;
|
||||||
|
private String displayString;
|
||||||
|
|
||||||
protected AbstractTask(StyleBuilder styleBuilder, TaskCode code) {
|
protected AbstractTask(StyleBuilder styleBuilder, TaskCode code) {
|
||||||
this.styleBuilder = styleBuilder;
|
this.styleBuilder = styleBuilder;
|
||||||
this.code = code;
|
this.code = code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
final public void putInSameRowAs(Task row) {
|
final public void putInSameRowAs(Task row) {
|
||||||
if (this != row)
|
if (this != row)
|
||||||
this.row = row;
|
this.row = row;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public final Task getRow() {
|
public final Task getRow() {
|
||||||
return row;
|
return row;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public final TaskCode getCode() {
|
public final TaskCode getCode() {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public final StyleBuilder getStyleBuilder() {
|
public final StyleBuilder getStyleBuilder() {
|
||||||
return styleBuilder;
|
return styleBuilder;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setDisplay(String displayString) {
|
||||||
|
this.displayString = displayString;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getDisplayString() {
|
||||||
|
return this.displayString;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -81,4 +81,8 @@ public interface Task extends Moment {
|
|||||||
|
|
||||||
public boolean isAssignedTo(Resource res);
|
public boolean isAssignedTo(Resource res);
|
||||||
|
|
||||||
|
public void setDisplay(String displayString);
|
||||||
|
|
||||||
|
public String getDisplayString();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -134,29 +134,39 @@ public class TaskDrawDiamond extends AbstractTaskDraw {
|
|||||||
@Override
|
@Override
|
||||||
public void drawU(UGraphic ug) {
|
public void drawU(UGraphic ug) {
|
||||||
|
|
||||||
|
if (url != null)
|
||||||
|
ug.startUrl(url);
|
||||||
|
|
||||||
|
final String displayString = getTask().getDisplayString();
|
||||||
|
|
||||||
final Style style = getStyle();
|
final Style style = getStyle();
|
||||||
final ClockwiseTopRightBottomLeft margin = style.getMargin();
|
final ClockwiseTopRightBottomLeft margin = style.getMargin();
|
||||||
ug = ug.apply(UTranslate.dy(margin.getTop()));
|
ug = ug.apply(UTranslate.dy(margin.getTop()));
|
||||||
|
|
||||||
final double x1 = timeScale.getStartingPosition(start);
|
final double x1 = timeScale.getStartingPosition(start);
|
||||||
|
|
||||||
|
ug = ug.apply(UTranslate.dx(x1));
|
||||||
|
|
||||||
|
if (displayString == null) {
|
||||||
final double x2 = timeScale.getEndingPosition(start);
|
final double x2 = timeScale.getEndingPosition(start);
|
||||||
final double width = getDiamondHeight();
|
final double width = getDiamondHeight();
|
||||||
final double delta = x2 - x1 - width;
|
final double delta = x2 - x1 - width;
|
||||||
|
ug = ug.apply(UTranslate.dx(delta / 2));
|
||||||
if (url != null)
|
drawShape(applyColors(ug));
|
||||||
ug.startUrl(url);
|
} else {
|
||||||
|
final TextBlock draw = Display.getWithNewlines(displayString).create(getFontConfiguration(),
|
||||||
drawShape(applyColors(ug).apply(UTranslate.dx(x1 + delta / 2)));
|
HorizontalAlignment.LEFT, new SpriteContainerEmpty());
|
||||||
|
draw.drawU(ug);
|
||||||
|
}
|
||||||
if (url != null)
|
if (url != null)
|
||||||
ug.closeUrl();
|
ug.closeUrl();
|
||||||
}
|
}
|
||||||
|
|
||||||
private UGraphic applyColors(UGraphic ug) {
|
private UGraphic applyColors(UGraphic ug) {
|
||||||
final CenterBorderColor col = this.getColors();
|
final CenterBorderColor col = this.getColors();
|
||||||
if (col != null && col.isOk()) {
|
if (col != null && col.isOk())
|
||||||
return col.apply(ug);
|
return col.apply(ug);
|
||||||
}
|
|
||||||
return ug.apply(getLineColor()).apply(getBackgroundColor().bg());
|
return ug.apply(getLineColor()).apply(getBackgroundColor().bg());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,6 +41,7 @@ import net.sourceforge.plantuml.klimt.color.HColors;
|
|||||||
import net.sourceforge.plantuml.klimt.creole.Display;
|
import net.sourceforge.plantuml.klimt.creole.Display;
|
||||||
import net.sourceforge.plantuml.klimt.drawing.UGraphic;
|
import net.sourceforge.plantuml.klimt.drawing.UGraphic;
|
||||||
import net.sourceforge.plantuml.klimt.font.FontConfiguration;
|
import net.sourceforge.plantuml.klimt.font.FontConfiguration;
|
||||||
|
import net.sourceforge.plantuml.klimt.font.StringBounder;
|
||||||
import net.sourceforge.plantuml.klimt.font.UFont;
|
import net.sourceforge.plantuml.klimt.font.UFont;
|
||||||
import net.sourceforge.plantuml.klimt.geom.HorizontalAlignment;
|
import net.sourceforge.plantuml.klimt.geom.HorizontalAlignment;
|
||||||
import net.sourceforge.plantuml.klimt.shape.TextBlock;
|
import net.sourceforge.plantuml.klimt.shape.TextBlock;
|
||||||
@ -51,18 +52,11 @@ import net.sourceforge.plantuml.project.TimeHeaderParameters;
|
|||||||
import net.sourceforge.plantuml.project.time.Day;
|
import net.sourceforge.plantuml.project.time.Day;
|
||||||
import net.sourceforge.plantuml.project.timescale.TimeScale;
|
import net.sourceforge.plantuml.project.timescale.TimeScale;
|
||||||
import net.sourceforge.plantuml.style.PName;
|
import net.sourceforge.plantuml.style.PName;
|
||||||
|
import net.sourceforge.plantuml.style.SName;
|
||||||
|
|
||||||
public abstract class TimeHeader {
|
public abstract class TimeHeader {
|
||||||
// ::remove folder when __HAXE__
|
// ::remove folder when __HAXE__
|
||||||
|
|
||||||
protected final double Y_POS_ROW16() {
|
|
||||||
return 16;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected final double Y_POS_ROW28() {
|
|
||||||
return 28;
|
|
||||||
}
|
|
||||||
|
|
||||||
private final TimeScale timeScale;
|
private final TimeScale timeScale;
|
||||||
|
|
||||||
protected final TimeHeaderParameters thParam;
|
protected final TimeHeaderParameters thParam;
|
||||||
@ -100,15 +94,19 @@ public abstract class TimeHeader {
|
|||||||
return thParam.getTimelineStyle().value(PName.LineColor).asColor(thParam.getColorSet());
|
return thParam.getTimelineStyle().value(PName.LineColor).asColor(thParam.getColorSet());
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract double getTimeHeaderHeight();
|
public abstract double getTimeHeaderHeight(StringBounder stringBounder);
|
||||||
|
|
||||||
public abstract double getTimeFooterHeight();
|
public abstract double getTimeFooterHeight(StringBounder stringBounder);
|
||||||
|
|
||||||
|
public abstract double getFullHeaderHeight(StringBounder stringBounder);
|
||||||
|
|
||||||
public abstract void drawTimeHeader(UGraphic ug, double totalHeightWithoutFooter);
|
public abstract void drawTimeHeader(UGraphic ug, double totalHeightWithoutFooter);
|
||||||
|
|
||||||
public abstract void drawTimeFooter(UGraphic ug);
|
public abstract void drawTimeFooter(UGraphic ug);
|
||||||
|
|
||||||
public abstract double getFullHeaderHeight();
|
public final TimeScale getTimeScale() {
|
||||||
|
return timeScale;
|
||||||
|
}
|
||||||
|
|
||||||
protected final void drawHline(UGraphic ug, double y) {
|
protected final void drawHline(UGraphic ug, double y) {
|
||||||
final double xmin = getTimeScale().getStartingPosition(thParam.getMin());
|
final double xmin = getTimeScale().getStartingPosition(thParam.getMin());
|
||||||
@ -122,20 +120,17 @@ public abstract class TimeHeader {
|
|||||||
ug.apply(new UTranslate(x, y1)).draw(vbar);
|
ug.apply(new UTranslate(x, y1)).draw(vbar);
|
||||||
}
|
}
|
||||||
|
|
||||||
final protected FontConfiguration getFontConfiguration(int size, boolean bold, HColor color) {
|
final protected FontConfiguration getFontConfiguration(UFont font, boolean bold, HColor color) {
|
||||||
UFont font = UFont.serif(size);
|
|
||||||
if (bold)
|
if (bold)
|
||||||
font = font.bold();
|
font = font.bold();
|
||||||
|
|
||||||
return FontConfiguration.create(font, color, color, null);
|
return FontConfiguration.create(font, color, color, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public final TimeScale getTimeScale() {
|
protected final TextBlock getTextBlock(SName param, String text, boolean bold, HColor color) {
|
||||||
return timeScale;
|
final UFont font = thParam.getStyle(SName.timeline, param).getUFont();
|
||||||
}
|
final FontConfiguration fontConfiguration = getFontConfiguration(font, bold, color);
|
||||||
|
return Display.getWithNewlines(text).create(fontConfiguration, HorizontalAlignment.LEFT,
|
||||||
protected final TextBlock getTextBlock(String text, int size, boolean bold, HColor color) {
|
|
||||||
return Display.getWithNewlines(text).create(getFontConfiguration(size, bold, color), HorizontalAlignment.LEFT,
|
|
||||||
new SpriteContainerEmpty());
|
new SpriteContainerEmpty());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -165,7 +160,7 @@ public abstract class TimeHeader {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
ug = ug.apply(HColors.none());
|
ug = ug.apply(HColors.none());
|
||||||
ug = ug.apply(new UTranslate(x1, getFullHeaderHeight()));
|
ug = ug.apply(new UTranslate(x1, getFullHeaderHeight(ug.getStringBounder())));
|
||||||
ug.draw(URectangle.build(x2 - x1, height));
|
ug.draw(URectangle.build(x2 - x1, height));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -173,8 +168,8 @@ public abstract class TimeHeader {
|
|||||||
ug = thParam.forVerticalSeparator(ug);
|
ug = thParam.forVerticalSeparator(ug);
|
||||||
for (Day wink = getMin(); wink.compareTo(getMax()) <= 0; wink = wink.increment())
|
for (Day wink = getMin(); wink.compareTo(getMax()) <= 0; wink = wink.increment())
|
||||||
if (isBold2(wink))
|
if (isBold2(wink))
|
||||||
drawVline(ug, getTimeScale().getStartingPosition(wink), getFullHeaderHeight(),
|
drawVline(ug, getTimeScale().getStartingPosition(wink),
|
||||||
totalHeightWithoutFooter);
|
getFullHeaderHeight(ug.getStringBounder()), totalHeightWithoutFooter);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -76,7 +76,7 @@ public abstract class TimeHeaderCalendar extends TimeHeader {
|
|||||||
|
|
||||||
protected final void drawTextsBackground(UGraphic ug, double totalHeightWithoutFooter) {
|
protected final void drawTextsBackground(UGraphic ug, double totalHeightWithoutFooter) {
|
||||||
|
|
||||||
final double height = totalHeightWithoutFooter - getFullHeaderHeight();
|
final double height = totalHeightWithoutFooter - getFullHeaderHeight(ug.getStringBounder());
|
||||||
Pending pending = null;
|
Pending pending = null;
|
||||||
|
|
||||||
for (Day wink = getMin(); wink.compareTo(getMax()) <= 0; wink = wink.increment()) {
|
for (Day wink = getMin(); wink.compareTo(getMax()) <= 0; wink = wink.increment()) {
|
||||||
|
@ -40,41 +40,79 @@ import java.util.Map;
|
|||||||
import net.sourceforge.plantuml.klimt.UTranslate;
|
import net.sourceforge.plantuml.klimt.UTranslate;
|
||||||
import net.sourceforge.plantuml.klimt.color.HColor;
|
import net.sourceforge.plantuml.klimt.color.HColor;
|
||||||
import net.sourceforge.plantuml.klimt.drawing.UGraphic;
|
import net.sourceforge.plantuml.klimt.drawing.UGraphic;
|
||||||
|
import net.sourceforge.plantuml.klimt.font.StringBounder;
|
||||||
import net.sourceforge.plantuml.klimt.shape.TextBlock;
|
import net.sourceforge.plantuml.klimt.shape.TextBlock;
|
||||||
import net.sourceforge.plantuml.project.TimeHeaderParameters;
|
import net.sourceforge.plantuml.project.TimeHeaderParameters;
|
||||||
import net.sourceforge.plantuml.project.time.Day;
|
import net.sourceforge.plantuml.project.time.Day;
|
||||||
import net.sourceforge.plantuml.project.time.MonthYear;
|
import net.sourceforge.plantuml.project.time.MonthYear;
|
||||||
import net.sourceforge.plantuml.project.timescale.TimeScaleDaily;
|
import net.sourceforge.plantuml.project.timescale.TimeScaleDaily;
|
||||||
|
import net.sourceforge.plantuml.style.PName;
|
||||||
|
import net.sourceforge.plantuml.style.SName;
|
||||||
|
|
||||||
public class TimeHeaderDaily extends TimeHeaderCalendar {
|
public class TimeHeaderDaily extends TimeHeaderCalendar {
|
||||||
|
|
||||||
public double getTimeHeaderHeight() {
|
private double getH1(StringBounder stringBounder) {
|
||||||
return Y_POS_ROW28() + 13;
|
final double h = thParam.getStyle(SName.timeline, SName.month).value(PName.FontSize).asDouble() + 2;
|
||||||
|
return h;
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getTimeFooterHeight() {
|
private double getH2(StringBounder stringBounder) {
|
||||||
// return 0;
|
final double h = thParam.getStyle(SName.timeline, SName.day).value(PName.FontSize).asDouble() + 2;
|
||||||
return 24 + 14;
|
return getH1(stringBounder) + h;
|
||||||
|
}
|
||||||
|
|
||||||
|
private double getH3(StringBounder stringBounder) {
|
||||||
|
final double h = thParam.getStyle(SName.timeline, SName.day).value(PName.FontSize).asDouble() + 3;
|
||||||
|
return getH2(stringBounder) + h;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double getTimeHeaderHeight(StringBounder stringBounder) {
|
||||||
|
return getH3(stringBounder);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double getTimeFooterHeight(StringBounder stringBounder) {
|
||||||
|
final double h1 = thParam.getStyle(SName.timeline, SName.day).value(PName.FontSize).asDouble();
|
||||||
|
final double h2 = thParam.getStyle(SName.timeline, SName.day).value(PName.FontSize).asDouble();
|
||||||
|
final double h3 = thParam.getStyle(SName.timeline, SName.month).value(PName.FontSize).asDouble();
|
||||||
|
return h1 + h2 + h3 + 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
private double getHeaderNameDayHeight() {
|
||||||
|
if (nameDays.size() > 0) {
|
||||||
|
final double h = thParam.getStyle(SName.timeline, SName.day).value(PName.FontSize).asDouble() + 6;
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double getFullHeaderHeight(StringBounder stringBounder) {
|
||||||
|
return getTimeHeaderHeight(stringBounder) + getHeaderNameDayHeight();
|
||||||
}
|
}
|
||||||
|
|
||||||
private final Map<Day, String> nameDays;
|
private final Map<Day, String> nameDays;
|
||||||
|
|
||||||
public TimeHeaderDaily(TimeHeaderParameters thParam, Map<Day, String> nameDays, Day printStart, Day printEnd) {
|
public TimeHeaderDaily(StringBounder stringBounder, TimeHeaderParameters thParam, Map<Day, String> nameDays,
|
||||||
super(thParam, new TimeScaleDaily(thParam.getStartingDay(), thParam.getScale(), printStart));
|
Day printStart, Day printEnd) {
|
||||||
|
super(thParam, new TimeScaleDaily(thParam.getCellWidth(stringBounder), thParam.getStartingDay(),
|
||||||
|
thParam.getScale(), printStart));
|
||||||
this.nameDays = nameDays;
|
this.nameDays = nameDays;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void drawTimeHeader(final UGraphic ug, double totalHeightWithoutFooter) {
|
public void drawTimeHeader(final UGraphic ug, double totalHeightWithoutFooter) {
|
||||||
drawTextsBackground(ug, totalHeightWithoutFooter);
|
drawTextsBackground(ug, totalHeightWithoutFooter);
|
||||||
drawTextsDayOfWeek(ug.apply(UTranslate.dy(Y_POS_ROW16())));
|
drawTextsDayOfWeek(ug.apply(UTranslate.dy(getH1(ug.getStringBounder()))));
|
||||||
drawTextDayOfMonth(ug.apply(UTranslate.dy(Y_POS_ROW28())));
|
drawTextDayOfMonth(ug.apply(UTranslate.dy(getH2(ug.getStringBounder()))));
|
||||||
drawMonths(ug);
|
drawMonths(ug);
|
||||||
printVerticalSeparators(ug, totalHeightWithoutFooter);
|
printVerticalSeparators(ug, totalHeightWithoutFooter);
|
||||||
|
|
||||||
printNamedDays(ug);
|
printNamedDays(ug);
|
||||||
|
|
||||||
drawHline(ug, getFullHeaderHeight());
|
drawHline(ug, getFullHeaderHeight(ug.getStringBounder()));
|
||||||
drawHline(ug, totalHeightWithoutFooter);
|
drawHline(ug, totalHeightWithoutFooter);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -84,21 +122,22 @@ public class TimeHeaderDaily extends TimeHeaderCalendar {
|
|||||||
final UGraphic ugLineColor = ug.apply(getLineColor());
|
final UGraphic ugLineColor = ug.apply(getLineColor());
|
||||||
for (Day wink = getMin(); wink.compareTo(getMax()) <= 0; wink = wink.increment())
|
for (Day wink = getMin(); wink.compareTo(getMax()) <= 0; wink = wink.increment())
|
||||||
if (isBold2(wink))
|
if (isBold2(wink))
|
||||||
drawVline(ugVerticalSeparator, getTimeScale().getStartingPosition(wink), getFullHeaderHeight(),
|
drawVline(ugVerticalSeparator, getTimeScale().getStartingPosition(wink),
|
||||||
totalHeightWithoutFooter);
|
getFullHeaderHeight(ug.getStringBounder()), totalHeightWithoutFooter);
|
||||||
else
|
else
|
||||||
drawVline(ugLineColor, getTimeScale().getStartingPosition(wink), getFullHeaderHeight(),
|
drawVline(ugLineColor, getTimeScale().getStartingPosition(wink),
|
||||||
totalHeightWithoutFooter);
|
getFullHeaderHeight(ug.getStringBounder()), totalHeightWithoutFooter);
|
||||||
|
|
||||||
drawVline(ugLineColor, getTimeScale().getEndingPosition(getMax()), getFullHeaderHeight(),
|
drawVline(ugLineColor, getTimeScale().getEndingPosition(getMax()), getFullHeaderHeight(ug.getStringBounder()),
|
||||||
totalHeightWithoutFooter);
|
totalHeightWithoutFooter);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void drawTimeFooter(UGraphic ug) {
|
public void drawTimeFooter(UGraphic ug) {
|
||||||
drawTextDayOfMonth(ug.apply(UTranslate.dy(12)));
|
final double h = thParam.getStyle(SName.timeline, SName.day).value(PName.FontSize).asDouble() + 2;
|
||||||
drawTextsDayOfWeek(ug);
|
drawTextsDayOfWeek(ug);
|
||||||
drawMonths(ug.apply(UTranslate.dy(24)));
|
drawTextDayOfMonth(ug.apply(UTranslate.dy(h + 2)));
|
||||||
|
drawMonths(ug.apply(UTranslate.dy(2 * h + 3)));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void drawTextsDayOfWeek(UGraphic ug) {
|
private void drawTextsDayOfWeek(UGraphic ug) {
|
||||||
@ -106,7 +145,8 @@ public class TimeHeaderDaily extends TimeHeaderCalendar {
|
|||||||
final double x1 = getTimeScale().getStartingPosition(wink);
|
final double x1 = getTimeScale().getStartingPosition(wink);
|
||||||
final double x2 = getTimeScale().getEndingPosition(wink);
|
final double x2 = getTimeScale().getEndingPosition(wink);
|
||||||
final HColor textColor = getTextBackColor(wink);
|
final HColor textColor = getTextBackColor(wink);
|
||||||
printCentered(ug, getTextBlock(wink.getDayOfWeek().shortName(locale()), 10, false, textColor), x1, x2);
|
printCentered(ug, getTextBlock(SName.day, wink.getDayOfWeek().shortName(locale()), false, textColor), x1,
|
||||||
|
x2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -115,7 +155,7 @@ public class TimeHeaderDaily extends TimeHeaderCalendar {
|
|||||||
final double x1 = getTimeScale().getStartingPosition(wink);
|
final double x1 = getTimeScale().getStartingPosition(wink);
|
||||||
final double x2 = getTimeScale().getEndingPosition(wink);
|
final double x2 = getTimeScale().getEndingPosition(wink);
|
||||||
final HColor textColor = getTextBackColor(wink);
|
final HColor textColor = getTextBackColor(wink);
|
||||||
printCentered(ug, getTextBlock("" + wink.getDayOfMonth(), 10, false, textColor), x1, x2);
|
printCentered(ug, getTextBlock(SName.day, "" + wink.getDayOfMonth(), false, textColor), x1, x2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -146,9 +186,9 @@ public class TimeHeaderDaily extends TimeHeaderCalendar {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void printMonth(UGraphic ug, MonthYear monthYear, double start, double end) {
|
private void printMonth(UGraphic ug, MonthYear monthYear, double start, double end) {
|
||||||
final TextBlock tiny = getTextBlock(monthYear.shortName(locale()), 12, true, openFontColor());
|
final TextBlock tiny = getTextBlock(SName.month, monthYear.shortName(locale()), true, openFontColor());
|
||||||
final TextBlock small = getTextBlock(monthYear.longName(locale()), 12, true, openFontColor());
|
final TextBlock small = getTextBlock(SName.month, monthYear.longName(locale()), true, openFontColor());
|
||||||
final TextBlock big = getTextBlock(monthYear.longNameYYYY(locale()), 12, true, openFontColor());
|
final TextBlock big = getTextBlock(SName.month, monthYear.longNameYYYY(locale()), true, openFontColor());
|
||||||
printCentered(ug, false, start, end, tiny, small, big);
|
printCentered(ug, false, start, end, tiny, small, big);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -160,27 +200,17 @@ public class TimeHeaderDaily extends TimeHeaderCalendar {
|
|||||||
if (name != null && name.equals(last) == false) {
|
if (name != null && name.equals(last) == false) {
|
||||||
final double x1 = getTimeScale().getStartingPosition(wink);
|
final double x1 = getTimeScale().getStartingPosition(wink);
|
||||||
final double x2 = getTimeScale().getEndingPosition(wink);
|
final double x2 = getTimeScale().getEndingPosition(wink);
|
||||||
final TextBlock label = getTextBlock(name, 12, false, openFontColor());
|
final TextBlock label = getTextBlock(SName.month, name, false, openFontColor());
|
||||||
final double h = label.calculateDimension(ug.getStringBounder()).getHeight();
|
final double h = label.calculateDimension(ug.getStringBounder()).getHeight();
|
||||||
double y1 = getTimeHeaderHeight();
|
double y1 = getTimeHeaderHeight(ug.getStringBounder());
|
||||||
double y2 = getFullHeaderHeight();
|
double y2 = getFullHeaderHeight(ug.getStringBounder());
|
||||||
label.drawU(ug.apply(new UTranslate(x1, Y_POS_ROW28() + 11)));
|
|
||||||
|
final double position = getH3(ug.getStringBounder());
|
||||||
|
label.drawU(ug.apply(new UTranslate(x1, position)));
|
||||||
}
|
}
|
||||||
last = name;
|
last = name;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public double getFullHeaderHeight() {
|
|
||||||
return getTimeHeaderHeight() + getHeaderNameDayHeight();
|
|
||||||
}
|
|
||||||
|
|
||||||
private double getHeaderNameDayHeight() {
|
|
||||||
if (nameDays.size() > 0)
|
|
||||||
return 16;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -37,54 +37,76 @@ package net.sourceforge.plantuml.project.draw;
|
|||||||
|
|
||||||
import net.sourceforge.plantuml.klimt.UTranslate;
|
import net.sourceforge.plantuml.klimt.UTranslate;
|
||||||
import net.sourceforge.plantuml.klimt.drawing.UGraphic;
|
import net.sourceforge.plantuml.klimt.drawing.UGraphic;
|
||||||
|
import net.sourceforge.plantuml.klimt.font.StringBounder;
|
||||||
import net.sourceforge.plantuml.klimt.shape.TextBlock;
|
import net.sourceforge.plantuml.klimt.shape.TextBlock;
|
||||||
import net.sourceforge.plantuml.project.TimeHeaderParameters;
|
import net.sourceforge.plantuml.project.TimeHeaderParameters;
|
||||||
import net.sourceforge.plantuml.project.time.Day;
|
import net.sourceforge.plantuml.project.time.Day;
|
||||||
import net.sourceforge.plantuml.project.time.MonthYear;
|
import net.sourceforge.plantuml.project.time.MonthYear;
|
||||||
import net.sourceforge.plantuml.project.timescale.TimeScaleCompressed;
|
import net.sourceforge.plantuml.project.timescale.TimeScaleCompressed;
|
||||||
|
import net.sourceforge.plantuml.style.PName;
|
||||||
|
import net.sourceforge.plantuml.style.SName;
|
||||||
|
|
||||||
public class TimeHeaderMonthly extends TimeHeaderCalendar {
|
public class TimeHeaderMonthly extends TimeHeaderCalendar {
|
||||||
|
|
||||||
public double getTimeHeaderHeight() {
|
@Override
|
||||||
return 16 + 13;
|
public double getTimeHeaderHeight(StringBounder stringBounder) {
|
||||||
|
final double h1 = thParam.getStyle(SName.timeline, SName.year).value(PName.FontSize).asDouble();
|
||||||
|
final double h2 = thParam.getStyle(SName.timeline, SName.month).value(PName.FontSize).asDouble();
|
||||||
|
return h1 + h2 + 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getTimeFooterHeight() {
|
@Override
|
||||||
return 16 + 13 - 1;
|
public double getTimeFooterHeight(StringBounder stringBounder) {
|
||||||
|
final double h1 = thParam.getStyle(SName.timeline, SName.year).value(PName.FontSize).asDouble();
|
||||||
|
final double h2 = thParam.getStyle(SName.timeline, SName.month).value(PName.FontSize).asDouble();
|
||||||
|
return h1 + h2 + 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
public TimeHeaderMonthly(TimeHeaderParameters thParam) {
|
@Override
|
||||||
super(thParam, new TimeScaleCompressed(thParam.getStartingDay(), thParam.getScale()));
|
public double getFullHeaderHeight(StringBounder stringBounder) {
|
||||||
|
return getTimeHeaderHeight(stringBounder);
|
||||||
|
}
|
||||||
|
|
||||||
|
public TimeHeaderMonthly(StringBounder stringBounder, TimeHeaderParameters thParam) {
|
||||||
|
super(thParam, new TimeScaleCompressed(thParam.getCellWidth(stringBounder), thParam.getStartingDay(),
|
||||||
|
thParam.getScale()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void drawTimeHeader(final UGraphic ug, double totalHeightWithoutFooter) {
|
public void drawTimeHeader(final UGraphic ug, double totalHeightWithoutFooter) {
|
||||||
drawTextsBackground(ug, totalHeightWithoutFooter);
|
drawTextsBackground(ug, totalHeightWithoutFooter);
|
||||||
drawYears(ug);
|
drawYears(ug);
|
||||||
drawMonths(ug.apply(UTranslate.dy(16)));
|
final double h1 = thParam.getStyle(SName.timeline, SName.year).value(PName.FontSize).asDouble();
|
||||||
|
final double h2 = thParam.getStyle(SName.timeline, SName.month).value(PName.FontSize).asDouble();
|
||||||
|
drawMonths(ug.apply(UTranslate.dy(h1 + 2)));
|
||||||
printVerticalSeparators(ug, totalHeightWithoutFooter);
|
printVerticalSeparators(ug, totalHeightWithoutFooter);
|
||||||
drawHline(ug, 0);
|
drawHline(ug, 0);
|
||||||
drawHline(ug, 16);
|
drawHline(ug, h1 + 2);
|
||||||
drawHline(ug, getFullHeaderHeight());
|
drawHline(ug, h1 + 2 + h2 + 2);
|
||||||
|
// drawHline(ug, getFullHeaderHeight(ug.getStringBounder()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void drawTimeFooter(UGraphic ug) {
|
public void drawTimeFooter(UGraphic ug) {
|
||||||
ug = ug.apply(UTranslate.dy(3));
|
final double h1 = thParam.getStyle(SName.timeline, SName.year).value(PName.FontSize).asDouble();
|
||||||
|
final double h2 = thParam.getStyle(SName.timeline, SName.month).value(PName.FontSize).asDouble();
|
||||||
|
// ug = ug.apply(UTranslate.dy(3));
|
||||||
drawMonths(ug);
|
drawMonths(ug);
|
||||||
drawYears(ug.apply(UTranslate.dy(13)));
|
drawYears(ug.apply(UTranslate.dy(h2 + 2)));
|
||||||
drawHline(ug, 0);
|
drawHline(ug, 0);
|
||||||
drawHline(ug, 13);
|
drawHline(ug, h2 + 2);
|
||||||
drawHline(ug, getTimeFooterHeight());
|
drawHline(ug, h1 + 2 + h2 + 2);
|
||||||
|
// drawHline(ug, getTimeFooterHeight(ug.getStringBounder()));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void drawYears(final UGraphic ug) {
|
private void drawYears(final UGraphic ug) {
|
||||||
|
final double h1 = thParam.getStyle(SName.timeline, SName.year).value(PName.FontSize).asDouble();
|
||||||
MonthYear last = null;
|
MonthYear last = null;
|
||||||
double lastChange = -1;
|
double lastChange = -1;
|
||||||
for (Day wink = getMin(); wink.compareTo(getMax()) < 0; wink = wink.increment()) {
|
for (Day wink = getMin(); wink.compareTo(getMax()) < 0; wink = wink.increment()) {
|
||||||
final double x1 = getTimeScale().getStartingPosition(wink);
|
final double x1 = getTimeScale().getStartingPosition(wink);
|
||||||
if (last == null || wink.monthYear().year() != last.year()) {
|
if (last == null || wink.monthYear().year() != last.year()) {
|
||||||
drawVline(ug.apply(getLineColor()), x1, 0, 15);
|
drawVline(ug.apply(getLineColor()), x1, 0, h1 + 2);
|
||||||
if (last != null)
|
if (last != null)
|
||||||
printYear(ug, last, lastChange, x1);
|
printYear(ug, last, lastChange, x1);
|
||||||
|
|
||||||
@ -96,16 +118,17 @@ public class TimeHeaderMonthly extends TimeHeaderCalendar {
|
|||||||
if (x1 > lastChange)
|
if (x1 > lastChange)
|
||||||
printYear(ug, last, lastChange, x1);
|
printYear(ug, last, lastChange, x1);
|
||||||
|
|
||||||
drawVline(ug.apply(getLineColor()), getTimeScale().getEndingPosition(getMax()), (double) 0, (double) 15);
|
drawVline(ug.apply(getLineColor()), getTimeScale().getEndingPosition(getMax()), 0, h1 + 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void drawMonths(UGraphic ug) {
|
private void drawMonths(UGraphic ug) {
|
||||||
|
final double h2 = thParam.getStyle(SName.timeline, SName.month).value(PName.FontSize).asDouble();
|
||||||
MonthYear last = null;
|
MonthYear last = null;
|
||||||
double lastChange = -1;
|
double lastChange = -1;
|
||||||
for (Day wink = getMin(); wink.compareTo(getMax()) < 0; wink = wink.increment()) {
|
for (Day wink = getMin(); wink.compareTo(getMax()) < 0; wink = wink.increment()) {
|
||||||
final double x1 = getTimeScale().getStartingPosition(wink);
|
final double x1 = getTimeScale().getStartingPosition(wink);
|
||||||
if (wink.monthYear().equals(last) == false) {
|
if (wink.monthYear().equals(last) == false) {
|
||||||
drawVline(ug.apply(getLineColor()), x1, (double) 0, (double) 12);
|
drawVline(ug.apply(getLineColor()), x1, 0, h2 + 2);
|
||||||
if (last != null)
|
if (last != null)
|
||||||
printMonth(ug, last, lastChange, x1);
|
printMonth(ug, last, lastChange, x1);
|
||||||
|
|
||||||
@ -117,17 +140,17 @@ public class TimeHeaderMonthly extends TimeHeaderCalendar {
|
|||||||
if (x1 > lastChange)
|
if (x1 > lastChange)
|
||||||
printMonth(ug, last, lastChange, x1);
|
printMonth(ug, last, lastChange, x1);
|
||||||
|
|
||||||
drawVline(ug.apply(getLineColor()), getTimeScale().getEndingPosition(getMax()), (double) 0, (double) 12);
|
drawVline(ug.apply(getLineColor()), getTimeScale().getEndingPosition(getMax()), 0, h2 + 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void printYear(UGraphic ug, MonthYear monthYear, double start, double end) {
|
private void printYear(UGraphic ug, MonthYear monthYear, double start, double end) {
|
||||||
final TextBlock small = getTextBlock("" + monthYear.year(), 12, true, openFontColor());
|
final TextBlock small = getTextBlock(SName.month, "" + monthYear.year(), true, openFontColor());
|
||||||
printCentered(ug, false, start, end, small);
|
printCentered(ug, false, start, end, small);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void printMonth(UGraphic ug, MonthYear monthYear, double start, double end) {
|
private void printMonth(UGraphic ug, MonthYear monthYear, double start, double end) {
|
||||||
final TextBlock small = getTextBlock(monthYear.shortName(locale()), 10, false, openFontColor());
|
final TextBlock small = getTextBlock(SName.day, monthYear.shortName(locale()), false, openFontColor());
|
||||||
final TextBlock big = getTextBlock(monthYear.longName(locale()), 10, false, openFontColor());
|
final TextBlock big = getTextBlock(SName.day, monthYear.longName(locale()), false, openFontColor());
|
||||||
printCentered(ug, false, start, end, small, big);
|
printCentered(ug, false, start, end, small, big);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -135,9 +158,4 @@ public class TimeHeaderMonthly extends TimeHeaderCalendar {
|
|||||||
text.drawU(ug.apply(UTranslate.dx(start)));
|
text.drawU(ug.apply(UTranslate.dx(start)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public double getFullHeaderHeight() {
|
|
||||||
return getTimeHeaderHeight();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -37,54 +37,76 @@ package net.sourceforge.plantuml.project.draw;
|
|||||||
|
|
||||||
import net.sourceforge.plantuml.klimt.UTranslate;
|
import net.sourceforge.plantuml.klimt.UTranslate;
|
||||||
import net.sourceforge.plantuml.klimt.drawing.UGraphic;
|
import net.sourceforge.plantuml.klimt.drawing.UGraphic;
|
||||||
|
import net.sourceforge.plantuml.klimt.font.StringBounder;
|
||||||
import net.sourceforge.plantuml.klimt.shape.TextBlock;
|
import net.sourceforge.plantuml.klimt.shape.TextBlock;
|
||||||
import net.sourceforge.plantuml.project.TimeHeaderParameters;
|
import net.sourceforge.plantuml.project.TimeHeaderParameters;
|
||||||
import net.sourceforge.plantuml.project.time.Day;
|
import net.sourceforge.plantuml.project.time.Day;
|
||||||
import net.sourceforge.plantuml.project.time.MonthYear;
|
import net.sourceforge.plantuml.project.time.MonthYear;
|
||||||
import net.sourceforge.plantuml.project.timescale.TimeScaleCompressed;
|
import net.sourceforge.plantuml.project.timescale.TimeScaleCompressed;
|
||||||
|
import net.sourceforge.plantuml.style.PName;
|
||||||
|
import net.sourceforge.plantuml.style.SName;
|
||||||
|
|
||||||
public class TimeHeaderQuarterly extends TimeHeaderCalendar {
|
public class TimeHeaderQuarterly extends TimeHeaderCalendar {
|
||||||
|
|
||||||
public double getTimeHeaderHeight() {
|
@Override
|
||||||
return 16 + 13;
|
public double getTimeHeaderHeight(StringBounder stringBounder) {
|
||||||
|
final double h1 = thParam.getStyle(SName.timeline, SName.year).value(PName.FontSize).asDouble();
|
||||||
|
final double h2 = thParam.getStyle(SName.timeline, SName.month).value(PName.FontSize).asDouble();
|
||||||
|
return h1 + h2 + 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getTimeFooterHeight() {
|
@Override
|
||||||
return 16 + 13 - 1;
|
public double getTimeFooterHeight(StringBounder stringBounder) {
|
||||||
|
final double h1 = thParam.getStyle(SName.timeline, SName.year).value(PName.FontSize).asDouble();
|
||||||
|
final double h2 = thParam.getStyle(SName.timeline, SName.month).value(PName.FontSize).asDouble();
|
||||||
|
return h1 + h2 + 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
public TimeHeaderQuarterly(TimeHeaderParameters thParam) {
|
@Override
|
||||||
super(thParam, new TimeScaleCompressed(thParam.getStartingDay(), thParam.getScale()));
|
public double getFullHeaderHeight(StringBounder stringBounder) {
|
||||||
|
return getTimeHeaderHeight(stringBounder);
|
||||||
|
}
|
||||||
|
|
||||||
|
public TimeHeaderQuarterly(StringBounder stringBounder, TimeHeaderParameters thParam) {
|
||||||
|
super(thParam, new TimeScaleCompressed(thParam.getCellWidth(stringBounder), thParam.getStartingDay(),
|
||||||
|
thParam.getScale()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void drawTimeHeader(final UGraphic ug, double totalHeightWithoutFooter) {
|
public void drawTimeHeader(final UGraphic ug, double totalHeightWithoutFooter) {
|
||||||
drawTextsBackground(ug, totalHeightWithoutFooter);
|
drawTextsBackground(ug, totalHeightWithoutFooter);
|
||||||
drawYears(ug);
|
drawYears(ug);
|
||||||
drawQuarters(ug.apply(UTranslate.dy(16)));
|
final double h1 = thParam.getStyle(SName.timeline, SName.year).value(PName.FontSize).asDouble();
|
||||||
|
final double h2 = thParam.getStyle(SName.timeline, SName.month).value(PName.FontSize).asDouble();
|
||||||
|
drawQuarters(ug.apply(UTranslate.dy(h1 + 2)));
|
||||||
printVerticalSeparators(ug, totalHeightWithoutFooter);
|
printVerticalSeparators(ug, totalHeightWithoutFooter);
|
||||||
drawHline(ug, 0);
|
drawHline(ug, 0);
|
||||||
drawHline(ug, 16);
|
drawHline(ug, h1 + 2);
|
||||||
drawHline(ug, getFullHeaderHeight());
|
drawHline(ug, h1 + 2 + h2 + 2);
|
||||||
|
// drawHline(ug, getFullHeaderHeight(ug.getStringBounder()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void drawTimeFooter(UGraphic ug) {
|
public void drawTimeFooter(UGraphic ug) {
|
||||||
ug = ug.apply(UTranslate.dy(3));
|
final double h1 = thParam.getStyle(SName.timeline, SName.year).value(PName.FontSize).asDouble();
|
||||||
|
final double h2 = thParam.getStyle(SName.timeline, SName.month).value(PName.FontSize).asDouble();
|
||||||
|
// ug = ug.apply(UTranslate.dy(3));
|
||||||
drawQuarters(ug);
|
drawQuarters(ug);
|
||||||
drawYears(ug.apply(UTranslate.dy(13)));
|
drawYears(ug.apply(UTranslate.dy(h2 + 2)));
|
||||||
drawHline(ug, 0);
|
drawHline(ug, 0);
|
||||||
drawHline(ug, 13);
|
drawHline(ug, h2 + 2);
|
||||||
drawHline(ug, getTimeFooterHeight());
|
drawHline(ug, h1 + 2 + h2 + 2);
|
||||||
|
// drawHline(ug, getTimeFooterHeight(ug.getStringBounder()));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void drawYears(final UGraphic ug) {
|
private void drawYears(final UGraphic ug) {
|
||||||
|
final double h1 = thParam.getStyle(SName.timeline, SName.year).value(PName.FontSize).asDouble();
|
||||||
MonthYear last = null;
|
MonthYear last = null;
|
||||||
double lastChange = -1;
|
double lastChange = -1;
|
||||||
for (Day wink = getMin(); wink.compareTo(getMax()) < 0; wink = wink.increment()) {
|
for (Day wink = getMin(); wink.compareTo(getMax()) < 0; wink = wink.increment()) {
|
||||||
final double x1 = getTimeScale().getStartingPosition(wink);
|
final double x1 = getTimeScale().getStartingPosition(wink);
|
||||||
if (last == null || wink.monthYear().year() != last.year()) {
|
if (last == null || wink.monthYear().year() != last.year()) {
|
||||||
drawVline(ug.apply(getLineColor()), x1, (double) 0, (double) 15);
|
drawVline(ug.apply(getLineColor()), x1, 0, h1 + 2);
|
||||||
if (last != null)
|
if (last != null)
|
||||||
printYear(ug, last, lastChange, x1);
|
printYear(ug, last, lastChange, x1);
|
||||||
|
|
||||||
@ -96,16 +118,17 @@ public class TimeHeaderQuarterly extends TimeHeaderCalendar {
|
|||||||
if (x1 > lastChange)
|
if (x1 > lastChange)
|
||||||
printYear(ug, last, lastChange, x1);
|
printYear(ug, last, lastChange, x1);
|
||||||
|
|
||||||
drawVline(ug.apply(getLineColor()), getTimeScale().getEndingPosition(getMax()), (double) 0, (double) 15);
|
drawVline(ug.apply(getLineColor()), getTimeScale().getEndingPosition(getMax()), 0, h1 + 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void drawQuarters(UGraphic ug) {
|
private void drawQuarters(UGraphic ug) {
|
||||||
|
final double h2 = thParam.getStyle(SName.timeline, SName.month).value(PName.FontSize).asDouble();
|
||||||
String last = null;
|
String last = null;
|
||||||
double lastChange = -1;
|
double lastChange = -1;
|
||||||
for (Day wink = getMin(); wink.compareTo(getMax()) < 0; wink = wink.increment()) {
|
for (Day wink = getMin(); wink.compareTo(getMax()) < 0; wink = wink.increment()) {
|
||||||
final double x1 = getTimeScale().getStartingPosition(wink);
|
final double x1 = getTimeScale().getStartingPosition(wink);
|
||||||
if (quarter(wink).equals(last) == false) {
|
if (quarter(wink).equals(last) == false) {
|
||||||
drawVline(ug.apply(getLineColor()), x1, (double) 0, (double) 12);
|
drawVline(ug.apply(getLineColor()), x1, 0, h2 + 2);
|
||||||
if (last != null)
|
if (last != null)
|
||||||
printQuarter(ug, last, lastChange, x1);
|
printQuarter(ug, last, lastChange, x1);
|
||||||
|
|
||||||
@ -117,7 +140,7 @@ public class TimeHeaderQuarterly extends TimeHeaderCalendar {
|
|||||||
if (x1 > lastChange)
|
if (x1 > lastChange)
|
||||||
printQuarter(ug, last, lastChange, x1);
|
printQuarter(ug, last, lastChange, x1);
|
||||||
|
|
||||||
drawVline(ug.apply(getLineColor()), getTimeScale().getEndingPosition(getMax()), (double) 0, (double) 12);
|
drawVline(ug.apply(getLineColor()), getTimeScale().getEndingPosition(getMax()), 0, h2 + 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
private String quarter(Day day) {
|
private String quarter(Day day) {
|
||||||
@ -125,12 +148,12 @@ public class TimeHeaderQuarterly extends TimeHeaderCalendar {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void printYear(UGraphic ug, MonthYear monthYear, double start, double end) {
|
private void printYear(UGraphic ug, MonthYear monthYear, double start, double end) {
|
||||||
final TextBlock small = getTextBlock("" + monthYear.year(), 12, true, openFontColor());
|
final TextBlock small = getTextBlock(SName.month, "" + monthYear.year(), true, openFontColor());
|
||||||
printCentered(ug, false, start, end, small);
|
printCentered(ug, false, start, end, small);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void printQuarter(UGraphic ug, String quarter, double start, double end) {
|
private void printQuarter(UGraphic ug, String quarter, double start, double end) {
|
||||||
final TextBlock small = getTextBlock(quarter, 10, false, openFontColor());
|
final TextBlock small = getTextBlock(SName.day, quarter, false, openFontColor());
|
||||||
printCentered(ug, false, start, end, small);
|
printCentered(ug, false, start, end, small);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -138,9 +161,4 @@ public class TimeHeaderQuarterly extends TimeHeaderCalendar {
|
|||||||
text.drawU(ug.apply(UTranslate.dx(start)));
|
text.drawU(ug.apply(UTranslate.dx(start)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public double getFullHeaderHeight() {
|
|
||||||
return getTimeHeaderHeight();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -39,6 +39,9 @@ import net.sourceforge.plantuml.klimt.UTranslate;
|
|||||||
import net.sourceforge.plantuml.klimt.color.HColor;
|
import net.sourceforge.plantuml.klimt.color.HColor;
|
||||||
import net.sourceforge.plantuml.klimt.creole.Display;
|
import net.sourceforge.plantuml.klimt.creole.Display;
|
||||||
import net.sourceforge.plantuml.klimt.drawing.UGraphic;
|
import net.sourceforge.plantuml.klimt.drawing.UGraphic;
|
||||||
|
import net.sourceforge.plantuml.klimt.font.FontConfiguration;
|
||||||
|
import net.sourceforge.plantuml.klimt.font.StringBounder;
|
||||||
|
import net.sourceforge.plantuml.klimt.font.UFont;
|
||||||
import net.sourceforge.plantuml.klimt.geom.HorizontalAlignment;
|
import net.sourceforge.plantuml.klimt.geom.HorizontalAlignment;
|
||||||
import net.sourceforge.plantuml.klimt.shape.TextBlock;
|
import net.sourceforge.plantuml.klimt.shape.TextBlock;
|
||||||
import net.sourceforge.plantuml.klimt.shape.ULine;
|
import net.sourceforge.plantuml.klimt.shape.ULine;
|
||||||
@ -48,30 +51,36 @@ import net.sourceforge.plantuml.project.core.PrintScale;
|
|||||||
import net.sourceforge.plantuml.project.time.Day;
|
import net.sourceforge.plantuml.project.time.Day;
|
||||||
import net.sourceforge.plantuml.project.timescale.TimeScale;
|
import net.sourceforge.plantuml.project.timescale.TimeScale;
|
||||||
import net.sourceforge.plantuml.project.timescale.TimeScaleWink;
|
import net.sourceforge.plantuml.project.timescale.TimeScaleWink;
|
||||||
|
import net.sourceforge.plantuml.style.PName;
|
||||||
|
import net.sourceforge.plantuml.style.SName;
|
||||||
|
|
||||||
public class TimeHeaderSimple extends TimeHeader {
|
public class TimeHeaderSimple extends TimeHeader {
|
||||||
|
|
||||||
private final PrintScale printScale;
|
private final PrintScale printScale;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getFullHeaderHeight() {
|
public double getFullHeaderHeight(StringBounder stringBounder) {
|
||||||
return getTimeHeaderHeight() + getHeaderNameDayHeight();
|
return getTimeHeaderHeight(stringBounder) + getHeaderNameDayHeight();
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getTimeHeaderHeight() {
|
@Override
|
||||||
return 16;
|
public double getTimeHeaderHeight(StringBounder stringBounder) {
|
||||||
|
final double h = thParam.getStyle(SName.timeline, SName.day).value(PName.FontSize).asDouble();
|
||||||
|
return h + 6;
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getTimeFooterHeight() {
|
@Override
|
||||||
return 16;
|
public double getTimeFooterHeight(StringBounder stringBounder) {
|
||||||
|
final double h = thParam.getStyle(SName.timeline, SName.day).value(PName.FontSize).asDouble();
|
||||||
|
return h + 6;
|
||||||
}
|
}
|
||||||
|
|
||||||
private double getHeaderNameDayHeight() {
|
private double getHeaderNameDayHeight() {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public TimeHeaderSimple(TimeHeaderParameters thParam, PrintScale printScale) {
|
public TimeHeaderSimple(StringBounder stringBounder, TimeHeaderParameters thParam, PrintScale printScale) {
|
||||||
super(thParam, new TimeScaleWink(thParam.getScale(), printScale));
|
super(thParam, new TimeScaleWink(thParam.getCellWidth(stringBounder), thParam.getScale(), printScale));
|
||||||
this.printScale = printScale;
|
this.printScale = printScale;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -91,9 +100,10 @@ public class TimeHeaderSimple extends TimeHeader {
|
|||||||
value = i.getAbsoluteDayNum() / 7 + 1;
|
value = i.getAbsoluteDayNum() / 7 + 1;
|
||||||
else
|
else
|
||||||
value = i.getAbsoluteDayNum() + 1;
|
value = i.getAbsoluteDayNum() + 1;
|
||||||
final TextBlock num = Display.getWithNewlines("" + value).create(
|
final UFont font = thParam.getStyle(SName.timeline, SName.day).getUFont();
|
||||||
getFontConfiguration(10, false, openFontColor()), HorizontalAlignment.LEFT,
|
final FontConfiguration fontConfiguration = getFontConfiguration(font, false, openFontColor());
|
||||||
new SpriteContainerEmpty());
|
final TextBlock num = Display.getWithNewlines("" + value).create(fontConfiguration,
|
||||||
|
HorizontalAlignment.LEFT, new SpriteContainerEmpty());
|
||||||
final double x1 = timeScale.getStartingPosition(i);
|
final double x1 = timeScale.getStartingPosition(i);
|
||||||
final double x2;
|
final double x2;
|
||||||
if (printScale == PrintScale.WEEKLY)
|
if (printScale == PrintScale.WEEKLY)
|
||||||
@ -110,15 +120,15 @@ public class TimeHeaderSimple extends TimeHeader {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void drawTimeHeader(UGraphic ug, double totalHeightWithoutFooter) {
|
public void drawTimeHeader(UGraphic ug, double totalHeightWithoutFooter) {
|
||||||
drawTextsBackground(ug.apply(UTranslate.dy(-3)), totalHeightWithoutFooter + 6);
|
// drawTextsBackground(ug.apply(UTranslate.dy(-3)), totalHeightWithoutFooter + 6);
|
||||||
final double xmin = getTimeScale().getStartingPosition(getMin());
|
final double xmin = getTimeScale().getStartingPosition(getMin());
|
||||||
final double xmax = getTimeScale().getEndingPosition(getMax());
|
final double xmax = getTimeScale().getEndingPosition(getMax());
|
||||||
drawSmallVlinesDay(ug, getTimeScale(), totalHeightWithoutFooter + 2);
|
drawSmallVlinesDay(ug, getTimeScale(), totalHeightWithoutFooter + 2);
|
||||||
printVerticalSeparators(ug, totalHeightWithoutFooter);
|
printVerticalSeparators(ug, totalHeightWithoutFooter);
|
||||||
drawSimpleDayCounter(ug, getTimeScale());
|
drawSimpleDayCounter(ug, getTimeScale());
|
||||||
ug = ug.apply(getLineColor());
|
// ug = ug.apply(getLineColor());
|
||||||
ug.draw(ULine.hline(xmax - xmin));
|
// ug.draw(ULine.hline(xmax - xmin));
|
||||||
ug.apply(UTranslate.dy(getFullHeaderHeight() - 3)).draw(ULine.hline(xmax - xmin));
|
// ug.apply(UTranslate.dy(getFullHeaderHeight(ug.getStringBounder()) - 3)).draw(ULine.hline(xmax - xmin));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -127,9 +137,9 @@ public class TimeHeaderSimple extends TimeHeader {
|
|||||||
final double xmin = getTimeScale().getStartingPosition(getMin());
|
final double xmin = getTimeScale().getStartingPosition(getMin());
|
||||||
final double xmax = getTimeScale().getEndingPosition(getMax());
|
final double xmax = getTimeScale().getEndingPosition(getMax());
|
||||||
ug = ug.apply(UTranslate.dy(3));
|
ug = ug.apply(UTranslate.dy(3));
|
||||||
drawSmallVlinesDay(ug, getTimeScale(), getTimeFooterHeight() - 3);
|
drawSmallVlinesDay(ug, getTimeScale(), getTimeFooterHeight(ug.getStringBounder()) - 3);
|
||||||
drawSimpleDayCounter(ug, getTimeScale());
|
drawSimpleDayCounter(ug, getTimeScale());
|
||||||
ug.apply(getLineColor()).draw(ULine.hline(xmax - xmin));
|
// ug.apply(getLineColor()).draw(ULine.hline(xmax - xmin));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Duplicate in TimeHeaderDaily
|
// Duplicate in TimeHeaderDaily
|
||||||
@ -151,7 +161,7 @@ public class TimeHeaderSimple extends TimeHeader {
|
|||||||
|
|
||||||
protected final void drawTextsBackground(UGraphic ug, double totalHeightWithoutFooter) {
|
protected final void drawTextsBackground(UGraphic ug, double totalHeightWithoutFooter) {
|
||||||
|
|
||||||
final double height = totalHeightWithoutFooter - getFullHeaderHeight();
|
final double height = totalHeightWithoutFooter - getFullHeaderHeight(ug.getStringBounder());
|
||||||
Pending pending = null;
|
Pending pending = null;
|
||||||
|
|
||||||
for (Day wink = getMin(); wink.compareTo(getMax()) <= 0; wink = wink.increment()) {
|
for (Day wink = getMin(); wink.compareTo(getMax()) <= 0; wink = wink.increment()) {
|
||||||
|
@ -37,29 +37,48 @@ package net.sourceforge.plantuml.project.draw;
|
|||||||
|
|
||||||
import net.sourceforge.plantuml.klimt.UTranslate;
|
import net.sourceforge.plantuml.klimt.UTranslate;
|
||||||
import net.sourceforge.plantuml.klimt.drawing.UGraphic;
|
import net.sourceforge.plantuml.klimt.drawing.UGraphic;
|
||||||
|
import net.sourceforge.plantuml.klimt.font.StringBounder;
|
||||||
import net.sourceforge.plantuml.klimt.shape.TextBlock;
|
import net.sourceforge.plantuml.klimt.shape.TextBlock;
|
||||||
import net.sourceforge.plantuml.project.TimeHeaderParameters;
|
import net.sourceforge.plantuml.project.TimeHeaderParameters;
|
||||||
import net.sourceforge.plantuml.project.time.Day;
|
import net.sourceforge.plantuml.project.time.Day;
|
||||||
import net.sourceforge.plantuml.project.time.MonthYear;
|
import net.sourceforge.plantuml.project.time.MonthYear;
|
||||||
import net.sourceforge.plantuml.project.time.WeekNumberStrategy;
|
import net.sourceforge.plantuml.project.time.WeekNumberStrategy;
|
||||||
import net.sourceforge.plantuml.project.timescale.TimeScaleCompressed;
|
import net.sourceforge.plantuml.project.timescale.TimeScaleCompressed;
|
||||||
|
import net.sourceforge.plantuml.style.PName;
|
||||||
|
import net.sourceforge.plantuml.style.SName;
|
||||||
|
|
||||||
public class TimeHeaderWeekly extends TimeHeaderCalendar {
|
public class TimeHeaderWeekly extends TimeHeaderCalendar {
|
||||||
|
|
||||||
private final WeekNumberStrategy weekNumberStrategy;
|
private final WeekNumberStrategy weekNumberStrategy;
|
||||||
private final boolean withCalendarDate;
|
private final boolean withCalendarDate;
|
||||||
|
|
||||||
public double getTimeHeaderHeight() {
|
@Override
|
||||||
return 16 + 13;
|
public double getTimeHeaderHeight(StringBounder stringBounder) {
|
||||||
|
final double h1 = thParam.getStyle(SName.timeline, SName.month).value(PName.FontSize).asDouble();
|
||||||
|
final double h2 = thParam.getStyle(SName.timeline, SName.day).value(PName.FontSize).asDouble();
|
||||||
|
return h1 + h2 + 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getTimeFooterHeight() {
|
@Override
|
||||||
return 16;
|
public double getTimeFooterHeight(StringBounder stringBounder) {
|
||||||
|
final double h = thParam.getStyle(SName.timeline, SName.month).value(PName.FontSize).asDouble() + 4;
|
||||||
|
return h;
|
||||||
}
|
}
|
||||||
|
|
||||||
public TimeHeaderWeekly(TimeHeaderParameters thParam, WeekNumberStrategy weekNumberStrategy,
|
@Override
|
||||||
boolean withCalendarDate) {
|
public double getFullHeaderHeight(StringBounder stringBounder) {
|
||||||
super(thParam, new TimeScaleCompressed(thParam.getStartingDay(), thParam.getScale()));
|
return getTimeHeaderHeight(stringBounder);
|
||||||
|
}
|
||||||
|
|
||||||
|
private double getH1(StringBounder stringBounder) {
|
||||||
|
final double h = thParam.getStyle(SName.timeline, SName.month).value(PName.FontSize).asDouble() + 4;
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TimeHeaderWeekly(StringBounder stringBounder, TimeHeaderParameters thParam,
|
||||||
|
WeekNumberStrategy weekNumberStrategy, boolean withCalendarDate) {
|
||||||
|
super(thParam, new TimeScaleCompressed(thParam.getCellWidth(stringBounder), thParam.getStartingDay(),
|
||||||
|
thParam.getScale()));
|
||||||
this.weekNumberStrategy = weekNumberStrategy;
|
this.weekNumberStrategy = weekNumberStrategy;
|
||||||
this.withCalendarDate = withCalendarDate;
|
this.withCalendarDate = withCalendarDate;
|
||||||
}
|
}
|
||||||
@ -69,15 +88,15 @@ public class TimeHeaderWeekly extends TimeHeaderCalendar {
|
|||||||
drawTextsBackground(ug, totalHeightWithoutFooter);
|
drawTextsBackground(ug, totalHeightWithoutFooter);
|
||||||
drawCalendar(ug, totalHeightWithoutFooter);
|
drawCalendar(ug, totalHeightWithoutFooter);
|
||||||
drawHline(ug, 0);
|
drawHline(ug, 0);
|
||||||
drawHline(ug, Y_POS_ROW16());
|
drawHline(ug, getH1(ug.getStringBounder()));
|
||||||
drawHline(ug, getFullHeaderHeight());
|
drawHline(ug, getFullHeaderHeight(ug.getStringBounder()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void drawTimeFooter(UGraphic ug) {
|
public void drawTimeFooter(UGraphic ug) {
|
||||||
drawHline(ug, 0);
|
drawHline(ug, 0);
|
||||||
printMonths(ug);
|
printMonths(ug);
|
||||||
drawHline(ug, getTimeFooterHeight());
|
drawHline(ug, getTimeFooterHeight(ug.getStringBounder()));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void drawCalendar(final UGraphic ug, double totalHeightWithoutFooter) {
|
private void drawCalendar(final UGraphic ug, double totalHeightWithoutFooter) {
|
||||||
@ -92,7 +111,7 @@ public class TimeHeaderWeekly extends TimeHeaderCalendar {
|
|||||||
for (Day wink = getMin(); wink.compareTo(getMax()) < 0; wink = wink.increment()) {
|
for (Day wink = getMin(); wink.compareTo(getMax()) < 0; wink = wink.increment()) {
|
||||||
final double x1 = getTimeScale().getStartingPosition(wink);
|
final double x1 = getTimeScale().getStartingPosition(wink);
|
||||||
if (wink.monthYear().equals(last) == false) {
|
if (wink.monthYear().equals(last) == false) {
|
||||||
drawVline(ug.apply(getLineColor()), x1, (double) 0, Y_POS_ROW16());
|
drawVline(ug.apply(getLineColor()), x1, 0, getH1(ug.getStringBounder()));
|
||||||
if (last != null)
|
if (last != null)
|
||||||
printMonth(ug, last, lastChangeMonth, x1);
|
printMonth(ug, last, lastChangeMonth, x1);
|
||||||
|
|
||||||
@ -100,9 +119,10 @@ public class TimeHeaderWeekly extends TimeHeaderCalendar {
|
|||||||
last = wink.monthYear();
|
last = wink.monthYear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
drawVline(ug.apply(getLineColor()), getTimeScale().getEndingPosition(getMax()), (double) 0, Y_POS_ROW16());
|
drawVline(ug.apply(getLineColor()), getTimeScale().getEndingPosition(getMax()), (double) 0,
|
||||||
|
getH1(ug.getStringBounder()));
|
||||||
final double x1 = getTimeScale().getStartingPosition(getMax().increment());
|
final double x1 = getTimeScale().getStartingPosition(getMax().increment());
|
||||||
if (x1 > lastChangeMonth)
|
if (last != null && x1 > lastChangeMonth)
|
||||||
printMonth(ug, last, lastChangeMonth, x1);
|
printMonth(ug, last, lastChangeMonth, x1);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -111,9 +131,11 @@ public class TimeHeaderWeekly extends TimeHeaderCalendar {
|
|||||||
protected void printVerticalSeparators(final UGraphic ug, double totalHeightWithoutFooter) {
|
protected void printVerticalSeparators(final UGraphic ug, double totalHeightWithoutFooter) {
|
||||||
for (Day wink = getMin(); wink.compareTo(getMax()) <= 0; wink = wink.increment())
|
for (Day wink = getMin(); wink.compareTo(getMax()) <= 0; wink = wink.increment())
|
||||||
if (wink.getDayOfWeek() == weekNumberStrategy.getFirstDayOfWeek())
|
if (wink.getDayOfWeek() == weekNumberStrategy.getFirstDayOfWeek())
|
||||||
drawVline(ug.apply(getLineColor()), getTimeScale().getStartingPosition(wink), Y_POS_ROW16(), totalHeightWithoutFooter);
|
drawVline(ug.apply(getLineColor()), getTimeScale().getStartingPosition(wink),
|
||||||
|
getH1(ug.getStringBounder()), totalHeightWithoutFooter);
|
||||||
|
|
||||||
drawVline(ug.apply(getLineColor()), getTimeScale().getEndingPosition(getMax()), Y_POS_ROW16(), totalHeightWithoutFooter);
|
drawVline(ug.apply(getLineColor()), getTimeScale().getEndingPosition(getMax()), getH1(ug.getStringBounder()),
|
||||||
|
totalHeightWithoutFooter);
|
||||||
super.printVerticalSeparators(ug, totalHeightWithoutFooter);
|
super.printVerticalSeparators(ug, totalHeightWithoutFooter);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -125,16 +147,16 @@ public class TimeHeaderWeekly extends TimeHeaderCalendar {
|
|||||||
num = "" + wink.getDayOfMonth();
|
num = "" + wink.getDayOfMonth();
|
||||||
else
|
else
|
||||||
num = "" + wink.getWeekOfYear(weekNumberStrategy);
|
num = "" + wink.getWeekOfYear(weekNumberStrategy);
|
||||||
final TextBlock textBlock = getTextBlock(num, 10, false, openFontColor());
|
final TextBlock textBlock = getTextBlock(SName.day, num, false, openFontColor());
|
||||||
printLeft(ug.apply(UTranslate.dy(Y_POS_ROW16())), textBlock,
|
printLeft(ug.apply(UTranslate.dy(getH1(ug.getStringBounder()))), textBlock,
|
||||||
getTimeScale().getStartingPosition(wink) + 5);
|
getTimeScale().getStartingPosition(wink) + 5);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void printMonth(UGraphic ug, MonthYear monthYear, double start, double end) {
|
private void printMonth(UGraphic ug, MonthYear monthYear, double start, double end) {
|
||||||
final TextBlock small = getTextBlock(monthYear.shortName(locale()), 12, true, openFontColor());
|
final TextBlock small = getTextBlock(SName.month, monthYear.shortName(locale()), true, openFontColor());
|
||||||
final TextBlock big = getTextBlock(monthYear.shortNameYYYY(locale()), 12, true, openFontColor());
|
final TextBlock big = getTextBlock(SName.month, monthYear.shortNameYYYY(locale()), true, openFontColor());
|
||||||
printCentered(ug, false, start, end, small, big);
|
printCentered(ug, false, start, end, small, big);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -142,9 +164,4 @@ public class TimeHeaderWeekly extends TimeHeaderCalendar {
|
|||||||
text.drawU(ug.apply(UTranslate.dx(start)));
|
text.drawU(ug.apply(UTranslate.dx(start)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public double getFullHeaderHeight() {
|
|
||||||
return getTimeHeaderHeight();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -37,24 +37,37 @@ package net.sourceforge.plantuml.project.draw;
|
|||||||
|
|
||||||
import net.sourceforge.plantuml.klimt.UTranslate;
|
import net.sourceforge.plantuml.klimt.UTranslate;
|
||||||
import net.sourceforge.plantuml.klimt.drawing.UGraphic;
|
import net.sourceforge.plantuml.klimt.drawing.UGraphic;
|
||||||
|
import net.sourceforge.plantuml.klimt.font.StringBounder;
|
||||||
import net.sourceforge.plantuml.klimt.shape.TextBlock;
|
import net.sourceforge.plantuml.klimt.shape.TextBlock;
|
||||||
import net.sourceforge.plantuml.project.TimeHeaderParameters;
|
import net.sourceforge.plantuml.project.TimeHeaderParameters;
|
||||||
import net.sourceforge.plantuml.project.time.Day;
|
import net.sourceforge.plantuml.project.time.Day;
|
||||||
import net.sourceforge.plantuml.project.time.MonthYear;
|
import net.sourceforge.plantuml.project.time.MonthYear;
|
||||||
import net.sourceforge.plantuml.project.timescale.TimeScaleCompressed;
|
import net.sourceforge.plantuml.project.timescale.TimeScaleCompressed;
|
||||||
|
import net.sourceforge.plantuml.style.PName;
|
||||||
|
import net.sourceforge.plantuml.style.SName;
|
||||||
|
|
||||||
public class TimeHeaderYearly extends TimeHeaderCalendar {
|
public class TimeHeaderYearly extends TimeHeaderCalendar {
|
||||||
|
|
||||||
public double getTimeHeaderHeight() {
|
@Override
|
||||||
return 20;
|
public double getTimeHeaderHeight(StringBounder stringBounder) {
|
||||||
|
final double h1 = thParam.getStyle(SName.timeline, SName.year).value(PName.FontSize).asDouble();
|
||||||
|
return h1 + 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getTimeFooterHeight() {
|
@Override
|
||||||
return 20 - 1;
|
public double getTimeFooterHeight(StringBounder stringBounder) {
|
||||||
|
final double h1 = thParam.getStyle(SName.timeline, SName.year).value(PName.FontSize).asDouble();
|
||||||
|
return h1 + 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
public TimeHeaderYearly(TimeHeaderParameters thParam) {
|
@Override
|
||||||
super(thParam, new TimeScaleCompressed(thParam.getStartingDay(), thParam.getScale()));
|
public double getFullHeaderHeight(StringBounder stringBounder) {
|
||||||
|
return getTimeHeaderHeight(stringBounder);
|
||||||
|
}
|
||||||
|
|
||||||
|
public TimeHeaderYearly(StringBounder stringBounder, TimeHeaderParameters thParam) {
|
||||||
|
super(thParam, new TimeScaleCompressed(thParam.getCellWidth(stringBounder), thParam.getStartingDay(),
|
||||||
|
thParam.getScale()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -63,24 +76,26 @@ public class TimeHeaderYearly extends TimeHeaderCalendar {
|
|||||||
drawYears(ug);
|
drawYears(ug);
|
||||||
printVerticalSeparators(ug, totalHeightWithoutFooter);
|
printVerticalSeparators(ug, totalHeightWithoutFooter);
|
||||||
drawHline(ug, 0);
|
drawHline(ug, 0);
|
||||||
drawHline(ug, getFullHeaderHeight());
|
drawHline(ug, getFullHeaderHeight(ug.getStringBounder()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void drawTimeFooter(UGraphic ug) {
|
public void drawTimeFooter(UGraphic ug) {
|
||||||
ug = ug.apply(UTranslate.dy(3));
|
// ug = ug.apply(UTranslate.dy(3));
|
||||||
drawYears(ug);
|
drawYears(ug);
|
||||||
drawHline(ug, 0);
|
drawHline(ug, 0);
|
||||||
drawHline(ug, getTimeFooterHeight());
|
drawHline(ug, getTimeFooterHeight(ug.getStringBounder()));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void drawYears(final UGraphic ug) {
|
private void drawYears(final UGraphic ug) {
|
||||||
|
final double h1 = thParam.getStyle(SName.timeline, SName.year).value(PName.FontSize).asDouble();
|
||||||
|
|
||||||
MonthYear last = null;
|
MonthYear last = null;
|
||||||
double lastChange = -1;
|
double lastChange = -1;
|
||||||
for (Day wink = getMin(); wink.compareTo(getMax()) < 0; wink = wink.increment()) {
|
for (Day wink = getMin(); wink.compareTo(getMax()) < 0; wink = wink.increment()) {
|
||||||
final double x1 = getTimeScale().getStartingPosition(wink);
|
final double x1 = getTimeScale().getStartingPosition(wink);
|
||||||
if (last == null || wink.monthYear().year() != last.year()) {
|
if (last == null || wink.monthYear().year() != last.year()) {
|
||||||
drawVline(ug.apply(getLineColor()), x1, (double) 0, (double) 19);
|
drawVline(ug.apply(getLineColor()), x1, 0, h1 + 2);
|
||||||
if (last != null)
|
if (last != null)
|
||||||
printYear(ug, last, lastChange, x1);
|
printYear(ug, last, lastChange, x1);
|
||||||
|
|
||||||
@ -92,17 +107,12 @@ public class TimeHeaderYearly extends TimeHeaderCalendar {
|
|||||||
if (x1 > lastChange)
|
if (x1 > lastChange)
|
||||||
printYear(ug, last, lastChange, x1);
|
printYear(ug, last, lastChange, x1);
|
||||||
|
|
||||||
drawVline(ug.apply(getLineColor()), getTimeScale().getEndingPosition(getMax()), (double) 0, (double) 19);
|
drawVline(ug.apply(getLineColor()), getTimeScale().getEndingPosition(getMax()), 0, h1 + 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void printYear(UGraphic ug, MonthYear monthYear, double start, double end) {
|
private void printYear(UGraphic ug, MonthYear monthYear, double start, double end) {
|
||||||
final TextBlock small = getTextBlock("" + monthYear.year(), 14, true, openFontColor());
|
final TextBlock small = getTextBlock(SName.year, "" + monthYear.year(), true, openFontColor());
|
||||||
printCentered(ug, true, start, end, small);
|
printCentered(ug, true, start, end, small);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public double getFullHeaderHeight() {
|
|
||||||
return getTimeHeaderHeight();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,54 @@
|
|||||||
|
/* ========================================================================
|
||||||
|
* PlantUML : a free UML diagram generator
|
||||||
|
* ========================================================================
|
||||||
|
*
|
||||||
|
* (C) Copyright 2009-2024, Arnaud Roques
|
||||||
|
*
|
||||||
|
* Project Info: https://plantuml.com
|
||||||
|
*
|
||||||
|
* If you like this project or if you find it useful, you can support us at:
|
||||||
|
*
|
||||||
|
* https://plantuml.com/patreon (only 1$ per month!)
|
||||||
|
* https://plantuml.com/paypal
|
||||||
|
*
|
||||||
|
* This file is part of PlantUML.
|
||||||
|
*
|
||||||
|
* PlantUML is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* PlantUML distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||||
|
* License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||||
|
* USA.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Original Author: Arnaud Roques
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package net.sourceforge.plantuml.project.lang;
|
||||||
|
|
||||||
|
import net.sourceforge.plantuml.project.Failable;
|
||||||
|
import net.sourceforge.plantuml.project.GanttDiagram;
|
||||||
|
import net.sourceforge.plantuml.regex.IRegex;
|
||||||
|
import net.sourceforge.plantuml.regex.RegexLeaf;
|
||||||
|
import net.sourceforge.plantuml.regex.RegexResult;
|
||||||
|
|
||||||
|
public class ComplementAnything implements Something {
|
||||||
|
|
||||||
|
public IRegex toRegex(String suffix) {
|
||||||
|
return new RegexLeaf("ANYTHING" + suffix, "(.*?)");
|
||||||
|
}
|
||||||
|
|
||||||
|
public Failable<String> getMe(GanttDiagram system, RegexResult arg, String suffix) {
|
||||||
|
final String value = arg.get("ANYTHING" + suffix, 0);
|
||||||
|
return Failable.ok(value);
|
||||||
|
}
|
||||||
|
}
|
@ -38,7 +38,6 @@ package net.sourceforge.plantuml.project.lang;
|
|||||||
import net.sourceforge.plantuml.project.Failable;
|
import net.sourceforge.plantuml.project.Failable;
|
||||||
import net.sourceforge.plantuml.project.GanttDiagram;
|
import net.sourceforge.plantuml.project.GanttDiagram;
|
||||||
import net.sourceforge.plantuml.project.time.Day;
|
import net.sourceforge.plantuml.project.time.Day;
|
||||||
import net.sourceforge.plantuml.project.time.Month;
|
|
||||||
import net.sourceforge.plantuml.regex.IRegex;
|
import net.sourceforge.plantuml.regex.IRegex;
|
||||||
import net.sourceforge.plantuml.regex.RegexConcat;
|
import net.sourceforge.plantuml.regex.RegexConcat;
|
||||||
import net.sourceforge.plantuml.regex.RegexLeaf;
|
import net.sourceforge.plantuml.regex.RegexLeaf;
|
||||||
@ -70,40 +69,14 @@ public class ComplementDate implements Something {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public IRegex toRegex(String suffix) {
|
public IRegex toRegex(String suffix) {
|
||||||
|
final DayPattern dayPattern = new DayPattern(suffix);
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case ONLY_ABSOLUTE:
|
case ONLY_ABSOLUTE:
|
||||||
return new RegexOr(toRegexA(suffix), toRegexB(suffix), toRegexC(suffix));
|
return dayPattern.toRegex();
|
||||||
case ONLY_RELATIVE:
|
case ONLY_RELATIVE:
|
||||||
return new RegexOr(toRegexD(suffix), toRegexE(suffix));
|
return new RegexOr(toRegexD(suffix), toRegexE(suffix));
|
||||||
}
|
}
|
||||||
return new RegexOr(toRegexA(suffix), toRegexB(suffix), toRegexC(suffix), toRegexD(suffix), toRegexE(suffix));
|
return new RegexOr(dayPattern.toRegex(), toRegexD(suffix), toRegexE(suffix));
|
||||||
}
|
|
||||||
|
|
||||||
private IRegex toRegexA(String suffix) {
|
|
||||||
return new RegexConcat( //
|
|
||||||
new RegexLeaf("ADAY" + suffix, "([\\d]+)"), //
|
|
||||||
new RegexLeaf("[\\w, ]*?"), //
|
|
||||||
new RegexLeaf("AMONTH" + suffix, "(" + Month.getRegexString() + ")"), //
|
|
||||||
new RegexLeaf("[\\w, ]*?"), //
|
|
||||||
new RegexLeaf("AYEAR" + suffix, "([\\d]{4})"));
|
|
||||||
}
|
|
||||||
|
|
||||||
private IRegex toRegexB(String suffix) {
|
|
||||||
return new RegexConcat( //
|
|
||||||
new RegexLeaf("BYEAR" + suffix, "([\\d]{4})"), //
|
|
||||||
new RegexLeaf("\\D"), //
|
|
||||||
new RegexLeaf("BMONTH" + suffix, "([\\d]{1,2})"), //
|
|
||||||
new RegexLeaf("\\D"), //
|
|
||||||
new RegexLeaf("BDAY" + suffix, "([\\d]{1,2})"));
|
|
||||||
}
|
|
||||||
|
|
||||||
private IRegex toRegexC(String suffix) {
|
|
||||||
return new RegexConcat( //
|
|
||||||
new RegexLeaf("CMONTH" + suffix, "(" + Month.getRegexString() + ")"), //
|
|
||||||
new RegexLeaf("[\\w, ]*?"), //
|
|
||||||
new RegexLeaf("CDAY" + suffix, "([\\d]+)"), //
|
|
||||||
new RegexLeaf("[\\w, ]*?"), //
|
|
||||||
new RegexLeaf("CYEAR" + suffix, "([\\d]{4})"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private IRegex toRegexD(String suffix) {
|
private IRegex toRegexD(String suffix) {
|
||||||
@ -126,14 +99,11 @@ public class ComplementDate implements Something {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Failable<Day> getMe(GanttDiagram system, RegexResult arg, String suffix) {
|
public Failable<Day> getMe(GanttDiagram system, RegexResult arg, String suffix) {
|
||||||
if (arg.get("ADAY" + suffix, 0) != null)
|
final DayPattern dayPattern = new DayPattern(suffix);
|
||||||
return Failable.ok(resultA(arg, suffix));
|
final Day result = dayPattern.getDay(arg);
|
||||||
|
|
||||||
if (arg.get("BDAY" + suffix, 0) != null)
|
if (result != null)
|
||||||
return Failable.ok(resultB(arg, suffix));
|
return Failable.ok(result);
|
||||||
|
|
||||||
if (arg.get("CDAY" + suffix, 0) != null)
|
|
||||||
return Failable.ok(resultC(arg, suffix));
|
|
||||||
|
|
||||||
if (arg.get("DCOUNT" + suffix, 0) != null)
|
if (arg.get("DCOUNT" + suffix, 0) != null)
|
||||||
return Failable.ok(resultD(system, arg, suffix));
|
return Failable.ok(resultD(system, arg, suffix));
|
||||||
@ -144,27 +114,6 @@ public class ComplementDate implements Something {
|
|||||||
throw new IllegalStateException();
|
throw new IllegalStateException();
|
||||||
}
|
}
|
||||||
|
|
||||||
private Day resultA(RegexResult arg, String suffix) {
|
|
||||||
final int day = Integer.parseInt(arg.get("ADAY" + suffix, 0));
|
|
||||||
final String month = arg.get("AMONTH" + suffix, 0);
|
|
||||||
final int year = Integer.parseInt(arg.get("AYEAR" + suffix, 0));
|
|
||||||
return Day.create(year, month, day);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Day resultB(RegexResult arg, String suffix) {
|
|
||||||
final int day = Integer.parseInt(arg.get("BDAY" + suffix, 0));
|
|
||||||
final int month = Integer.parseInt(arg.get("BMONTH" + suffix, 0));
|
|
||||||
final int year = Integer.parseInt(arg.get("BYEAR" + suffix, 0));
|
|
||||||
return Day.create(year, month, day);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Day resultC(RegexResult arg, String suffix) {
|
|
||||||
final int day = Integer.parseInt(arg.get("CDAY" + suffix, 0));
|
|
||||||
final String month = arg.get("CMONTH" + suffix, 0);
|
|
||||||
final int year = Integer.parseInt(arg.get("CYEAR" + suffix, 0));
|
|
||||||
return Day.create(year, month, day);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Day resultD(GanttDiagram system, RegexResult arg, String suffix) {
|
private Day resultD(GanttDiagram system, RegexResult arg, String suffix) {
|
||||||
final int day = Integer.parseInt(arg.get("DCOUNT" + suffix, 0));
|
final int day = Integer.parseInt(arg.get("DCOUNT" + suffix, 0));
|
||||||
return system.getStartingDate().addDays(day);
|
return system.getStartingDate().addDays(day);
|
||||||
|
@ -52,20 +52,14 @@ public class ComplementDates implements Something {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private IRegex toRegexB(String suffix) {
|
private IRegex toRegexB(String suffix) {
|
||||||
|
final DayPattern dayPattern1 = new DayPattern("1");
|
||||||
|
final DayPattern dayPattern2 = new DayPattern("2");
|
||||||
return new RegexConcat( //
|
return new RegexConcat( //
|
||||||
new RegexLeaf("BYEAR1" + suffix, "([\\d]{4})"), //
|
dayPattern1.toRegex(), //
|
||||||
new RegexLeaf("\\D"), //
|
|
||||||
new RegexLeaf("BMONTH1" + suffix, "([\\d]{1,2})"), //
|
|
||||||
new RegexLeaf("\\D"), //
|
|
||||||
new RegexLeaf("BDAY1" + suffix, "([\\d]{1,2})"), //
|
|
||||||
Words.exactly(Words.TO), //
|
Words.exactly(Words.TO), //
|
||||||
Words.zeroOrMore(Words.THE), //
|
Words.zeroOrMore(Words.THE), //
|
||||||
RegexLeaf.spaceOneOrMore(), //
|
RegexLeaf.spaceOneOrMore(), //
|
||||||
new RegexLeaf("BYEAR2" + suffix, "([\\d]{4})"), //
|
dayPattern2.toRegex() //
|
||||||
new RegexLeaf("\\D"), //
|
|
||||||
new RegexLeaf("BMONTH2" + suffix, "([\\d]{1,2})"), //
|
|
||||||
new RegexLeaf("\\D"), //
|
|
||||||
new RegexLeaf("BDAY2" + suffix, "([\\d]{1,2})") //
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -82,30 +76,19 @@ public class ComplementDates implements Something {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Failable<DaysAsDates> getMe(GanttDiagram project, RegexResult arg, String suffix) {
|
public Failable<DaysAsDates> getMe(GanttDiagram project, RegexResult arg, String suffix) {
|
||||||
if (arg.get("BDAY1" + suffix, 0) != null) {
|
final Day d1 = new DayPattern("1").getDay(arg);
|
||||||
return Failable.ok(resultB(arg, suffix));
|
if (d1 != null) {
|
||||||
|
final Day d2 = new DayPattern("2").getDay(arg);
|
||||||
|
return Failable.ok(new DaysAsDates(d1, d2));
|
||||||
}
|
}
|
||||||
if (arg.get("ECOUNT1" + suffix, 0) != null) {
|
|
||||||
|
if (arg.get("ECOUNT1" + suffix, 0) != null)
|
||||||
return Failable.ok(resultE(project, arg, suffix));
|
return Failable.ok(resultE(project, arg, suffix));
|
||||||
}
|
|
||||||
throw new IllegalStateException();
|
throw new IllegalStateException();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private DaysAsDates resultB(RegexResult arg, String suffix) {
|
|
||||||
final int day1 = Integer.parseInt(arg.get("BDAY1" + suffix, 0));
|
|
||||||
final int month1 = Integer.parseInt(arg.get("BMONTH1" + suffix, 0));
|
|
||||||
final int year1 = Integer.parseInt(arg.get("BYEAR1" + suffix, 0));
|
|
||||||
final Day date1 = Day.create(year1, month1, day1);
|
|
||||||
|
|
||||||
final int day2 = Integer.parseInt(arg.get("BDAY2" + suffix, 0));
|
|
||||||
final int month2 = Integer.parseInt(arg.get("BMONTH2" + suffix, 0));
|
|
||||||
final int year2 = Integer.parseInt(arg.get("BYEAR2" + suffix, 0));
|
|
||||||
final Day date2 = Day.create(year2, month2, day2);
|
|
||||||
|
|
||||||
return new DaysAsDates(date1, date2);
|
|
||||||
}
|
|
||||||
|
|
||||||
private DaysAsDates resultE(GanttDiagram project, RegexResult arg, String suffix) {
|
private DaysAsDates resultE(GanttDiagram project, RegexResult arg, String suffix) {
|
||||||
final int day1 = Integer.parseInt(arg.get("ECOUNT1" + suffix, 0));
|
final int day1 = Integer.parseInt(arg.get("ECOUNT1" + suffix, 0));
|
||||||
final Day date1 = project.getStartingDate().addDays(day1);
|
final Day date1 = project.getStartingDate().addDays(day1);
|
||||||
|
136
src/net/sourceforge/plantuml/project/lang/DayPattern.java
Normal file
136
src/net/sourceforge/plantuml/project/lang/DayPattern.java
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
/* ========================================================================
|
||||||
|
* PlantUML : a free UML diagram generator
|
||||||
|
* ========================================================================
|
||||||
|
*
|
||||||
|
* (C) Copyright 2009-2024, Arnaud Roques
|
||||||
|
*
|
||||||
|
* Project Info: https://plantuml.com
|
||||||
|
*
|
||||||
|
* If you like this project or if you find it useful, you can support us at:
|
||||||
|
*
|
||||||
|
* https://plantuml.com/patreon (only 1$ per month!)
|
||||||
|
* https://plantuml.com/paypal
|
||||||
|
*
|
||||||
|
* This file is part of PlantUML.
|
||||||
|
*
|
||||||
|
* PlantUML is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* PlantUML distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||||
|
* License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||||
|
* USA.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Original Author: Arnaud Roques
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package net.sourceforge.plantuml.project.lang;
|
||||||
|
|
||||||
|
import net.sourceforge.plantuml.project.time.Day;
|
||||||
|
import net.sourceforge.plantuml.project.time.Month;
|
||||||
|
import net.sourceforge.plantuml.regex.IRegex;
|
||||||
|
import net.sourceforge.plantuml.regex.RegexConcat;
|
||||||
|
import net.sourceforge.plantuml.regex.RegexLeaf;
|
||||||
|
import net.sourceforge.plantuml.regex.RegexOr;
|
||||||
|
import net.sourceforge.plantuml.regex.RegexResult;
|
||||||
|
|
||||||
|
public class DayPattern {
|
||||||
|
|
||||||
|
private final String id;
|
||||||
|
private final String yearKeyA;
|
||||||
|
private final String yearKeyB;
|
||||||
|
private final String yearKeyC;
|
||||||
|
private final String monthKeyA;
|
||||||
|
private final String monthKeyB;
|
||||||
|
private final String monthKeyC;
|
||||||
|
private final String dayKeyA;
|
||||||
|
private final String dayKeyB;
|
||||||
|
private final String dayKeyC;
|
||||||
|
|
||||||
|
public DayPattern(String id) {
|
||||||
|
this.id = id;
|
||||||
|
this.yearKeyA = "AYEAR" + id;
|
||||||
|
this.yearKeyB = "BYEAR" + id;
|
||||||
|
this.yearKeyC = "CYEAR" + id;
|
||||||
|
this.monthKeyA = "AMONTH" + id;
|
||||||
|
this.monthKeyB = "BMONTH" + id;
|
||||||
|
this.monthKeyC = "CMONTH" + id;
|
||||||
|
this.dayKeyA = "ADAY" + id;
|
||||||
|
this.dayKeyB = "BDAY" + id;
|
||||||
|
this.dayKeyC = "CDAY" + id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IRegex toRegex() {
|
||||||
|
return new RegexOr(toRegexA_DD_MONTH_YYYY(), toRegexB_YYYY_MM_DD(), toRegexC_MONTH_DD_YYYY());
|
||||||
|
}
|
||||||
|
|
||||||
|
public Day getDay(RegexResult arg) {
|
||||||
|
if (arg.get(dayKeyA, 0) != null)
|
||||||
|
return resultA(arg);
|
||||||
|
|
||||||
|
if (arg.get(dayKeyB, 0) != null)
|
||||||
|
return resultB(arg);
|
||||||
|
|
||||||
|
if (arg.get(dayKeyC, 0) != null)
|
||||||
|
return resultC(arg);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private IRegex toRegexA_DD_MONTH_YYYY() {
|
||||||
|
return new RegexConcat( //
|
||||||
|
new RegexLeaf(dayKeyA, "([\\d]{1,2})"), //
|
||||||
|
new RegexLeaf("[\\w, ]*?"), //
|
||||||
|
new RegexLeaf(monthKeyA, "(" + Month.getRegexString() + ")"), //
|
||||||
|
new RegexLeaf("[\\w, ]*?"), //
|
||||||
|
new RegexLeaf(yearKeyA, "([\\d]{1,4})"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private Day resultA(RegexResult arg) {
|
||||||
|
final int day = Integer.parseInt(arg.get(dayKeyA, 0));
|
||||||
|
final String month = arg.get(monthKeyA, 0);
|
||||||
|
final int year = Integer.parseInt(arg.get(yearKeyA, 0));
|
||||||
|
return Day.create(year, month, day);
|
||||||
|
}
|
||||||
|
|
||||||
|
private IRegex toRegexB_YYYY_MM_DD() {
|
||||||
|
return new RegexConcat( //
|
||||||
|
new RegexLeaf(yearKeyB, "([\\d]{1,4})"), //
|
||||||
|
new RegexLeaf("\\D"), //
|
||||||
|
new RegexLeaf(monthKeyB, "([\\d]{1,2})"), //
|
||||||
|
new RegexLeaf("\\D"), //
|
||||||
|
new RegexLeaf(dayKeyB, "([\\d]{1,2})"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private Day resultB(RegexResult arg) {
|
||||||
|
final int day = Integer.parseInt(arg.get(dayKeyB, 0));
|
||||||
|
final int month = Integer.parseInt(arg.get(monthKeyB, 0));
|
||||||
|
final int year = Integer.parseInt(arg.get(yearKeyB, 0));
|
||||||
|
return Day.create(year, month, day);
|
||||||
|
}
|
||||||
|
|
||||||
|
private IRegex toRegexC_MONTH_DD_YYYY() {
|
||||||
|
return new RegexConcat( //
|
||||||
|
new RegexLeaf(monthKeyC, "(" + Month.getRegexString() + ")"), //
|
||||||
|
new RegexLeaf("[\\w, ]*?"), //
|
||||||
|
new RegexLeaf(dayKeyC, "([\\d]{1,2})"), //
|
||||||
|
new RegexLeaf("[\\w, ]*?"), //
|
||||||
|
new RegexLeaf(yearKeyC, "([\\d]{1,4})"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private Day resultC(RegexResult arg) {
|
||||||
|
final int day = Integer.parseInt(arg.get(dayKeyC, 0));
|
||||||
|
final String month = arg.get(monthKeyC, 0);
|
||||||
|
final int year = Integer.parseInt(arg.get(yearKeyC, 0));
|
||||||
|
return Day.create(year, month, day);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,56 @@
|
|||||||
|
/* ========================================================================
|
||||||
|
* PlantUML : a free UML diagram generator
|
||||||
|
* ========================================================================
|
||||||
|
*
|
||||||
|
* (C) Copyright 2009-2024, Arnaud Roques
|
||||||
|
*
|
||||||
|
* Project Info: https://plantuml.com
|
||||||
|
*
|
||||||
|
* If you like this project or if you find it useful, you can support us at:
|
||||||
|
*
|
||||||
|
* https://plantuml.com/patreon (only 1$ per month!)
|
||||||
|
* https://plantuml.com/paypal
|
||||||
|
*
|
||||||
|
* This file is part of PlantUML.
|
||||||
|
*
|
||||||
|
* PlantUML is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* PlantUML distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||||
|
* License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||||
|
* USA.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Original Author: Arnaud Roques
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package net.sourceforge.plantuml.project.lang;
|
||||||
|
|
||||||
|
import net.sourceforge.plantuml.command.CommandExecutionResult;
|
||||||
|
import net.sourceforge.plantuml.project.GanttDiagram;
|
||||||
|
import net.sourceforge.plantuml.project.core.Task;
|
||||||
|
|
||||||
|
public class SentenceIsDisplayedAs extends SentenceSimple {
|
||||||
|
|
||||||
|
public SentenceIsDisplayedAs() {
|
||||||
|
super(SubjectTask.ME, Verbs.isDisplayedAs, new ComplementAnything());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CommandExecutionResult execute(GanttDiagram project, Object subject, Object complement) {
|
||||||
|
final Task task = (Task) subject;
|
||||||
|
final String displayString = (String) complement;
|
||||||
|
task.setDisplay(displayString);
|
||||||
|
return CommandExecutionResult.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -138,12 +138,7 @@ public class SubjectDayAsDate implements Subject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private IRegex toRegexB() {
|
private IRegex toRegexB() {
|
||||||
return new RegexConcat( //
|
return TimeResolution.toRegexB_YYYY_MM_DD("BYEAR", "BMONTH", "BDAY");
|
||||||
new RegexLeaf("BYEAR", "([\\d]{4})"), //
|
|
||||||
new RegexLeaf("\\D"), //
|
|
||||||
new RegexLeaf("BMONTH", "([\\d]{1,2})"), //
|
|
||||||
new RegexLeaf("\\D"), //
|
|
||||||
new RegexLeaf("BDAY", "([\\d]{1,2})"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private IRegex toRegexE() {
|
private IRegex toRegexE() {
|
||||||
|
@ -63,19 +63,10 @@ public class SubjectDaysAsDates implements Subject {
|
|||||||
|
|
||||||
private IRegex toRegexB() {
|
private IRegex toRegexB() {
|
||||||
return new RegexConcat( //
|
return new RegexConcat( //
|
||||||
new RegexLeaf("BYEAR1", "([\\d]{4})"), //
|
TimeResolution.toRegexB_YYYY_MM_DD("BYEAR1", "BMONTH1", "BDAY1"), //
|
||||||
new RegexLeaf("\\D"), //
|
Words.exactly(Words.TO), //
|
||||||
new RegexLeaf("BMONTH1", "([\\d]{1,2})"), //
|
|
||||||
new RegexLeaf("\\D"), //
|
|
||||||
new RegexLeaf("BDAY1", "([\\d]{1,2})"), //
|
|
||||||
RegexLeaf.spaceOneOrMore(), //
|
RegexLeaf.spaceOneOrMore(), //
|
||||||
new RegexLeaf("to"), //
|
TimeResolution.toRegexB_YYYY_MM_DD("BYEAR2", "BMONTH2", "BDAY2") //
|
||||||
RegexLeaf.spaceOneOrMore(), //
|
|
||||||
new RegexLeaf("BYEAR2", "([\\d]{4})"), //
|
|
||||||
new RegexLeaf("\\D"), //
|
|
||||||
new RegexLeaf("BMONTH2", "([\\d]{1,2})"), //
|
|
||||||
new RegexLeaf("\\D"), //
|
|
||||||
new RegexLeaf("BDAY2", "([\\d]{1,2})") //
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -83,8 +74,7 @@ public class SubjectDaysAsDates implements Subject {
|
|||||||
return new RegexConcat( //
|
return new RegexConcat( //
|
||||||
new RegexLeaf("[dD]\\+"), //
|
new RegexLeaf("[dD]\\+"), //
|
||||||
new RegexLeaf("ECOUNT1", "([\\d]+)"), //
|
new RegexLeaf("ECOUNT1", "([\\d]+)"), //
|
||||||
RegexLeaf.spaceOneOrMore(), //
|
Words.exactly(Words.TO), //
|
||||||
new RegexLeaf("to"), //
|
|
||||||
RegexLeaf.spaceOneOrMore(), //
|
RegexLeaf.spaceOneOrMore(), //
|
||||||
new RegexLeaf("[dD]\\+"), //
|
new RegexLeaf("[dD]\\+"), //
|
||||||
new RegexLeaf("ECOUNT2", "([\\d]+)") //
|
new RegexLeaf("ECOUNT2", "([\\d]+)") //
|
||||||
@ -93,13 +83,8 @@ public class SubjectDaysAsDates implements Subject {
|
|||||||
|
|
||||||
private IRegex andRegex() {
|
private IRegex andRegex() {
|
||||||
return new RegexConcat( //
|
return new RegexConcat( //
|
||||||
new RegexLeaf("BYEAR3", "([\\d]{4})"), //
|
TimeResolution.toRegexB_YYYY_MM_DD("BYEAR3", "BMONTH3", "BDAY3"), //
|
||||||
new RegexLeaf("\\D"), //
|
Words.exactly(Words.AND), //
|
||||||
new RegexLeaf("BMONTH3", "([\\d]{1,2})"), //
|
|
||||||
new RegexLeaf("\\D"), //
|
|
||||||
new RegexLeaf("BDAY3", "([\\d]{1,2})"), //
|
|
||||||
RegexLeaf.spaceOneOrMore(), //
|
|
||||||
new RegexLeaf("and"), //
|
|
||||||
RegexLeaf.spaceOneOrMore(), //
|
RegexLeaf.spaceOneOrMore(), //
|
||||||
new RegexLeaf("COUNT_AND", "([\\d]+)"), //
|
new RegexLeaf("COUNT_AND", "([\\d]+)"), //
|
||||||
RegexLeaf.spaceOneOrMore(), //
|
RegexLeaf.spaceOneOrMore(), //
|
||||||
|
@ -96,7 +96,7 @@ public class SubjectTask implements Subject {
|
|||||||
new SentenceTaskEndsAbsolute(), new SentenceIsColored(), new SentenceIsColoredForCompletion(),
|
new SentenceTaskEndsAbsolute(), new SentenceIsColored(), new SentenceIsColoredForCompletion(),
|
||||||
new SentenceIsDeleted(), new SentenceIsForTask(), new SentenceLinksTo(), new SentenceOccurs(),
|
new SentenceIsDeleted(), new SentenceIsForTask(), new SentenceLinksTo(), new SentenceOccurs(),
|
||||||
new SentenceDisplayOnSameRowAs(), new SentencePausesDate(), new SentencePausesDates(),
|
new SentenceDisplayOnSameRowAs(), new SentencePausesDate(), new SentencePausesDates(),
|
||||||
new SentencePausesDayOfWeek());
|
new SentencePausesDayOfWeek(), new SentenceIsDisplayedAs());
|
||||||
}
|
}
|
||||||
|
|
||||||
public IRegex toRegex() {
|
public IRegex toRegex() {
|
||||||
@ -106,8 +106,7 @@ public class SubjectTask implements Subject {
|
|||||||
new RegexLeaf("SUBJECT", "\\[([^\\[\\]]+?)\\](?:[%s]+as[%s]+\\[([^\\[\\]]+?)\\])?"), //
|
new RegexLeaf("SUBJECT", "\\[([^\\[\\]]+?)\\](?:[%s]+as[%s]+\\[([^\\[\\]]+?)\\])?"), //
|
||||||
new RegexOptional( //
|
new RegexOptional( //
|
||||||
new RegexConcat( //
|
new RegexConcat( //
|
||||||
RegexLeaf.spaceOneOrMore(), //
|
Words.exactly(Words.ON), //
|
||||||
new RegexLeaf("on"), //
|
|
||||||
RegexLeaf.spaceOneOrMore(), //
|
RegexLeaf.spaceOneOrMore(), //
|
||||||
new RegexLeaf("RESOURCE", "((?:\\{[^{}]+\\}[%s]*)+)") //
|
new RegexLeaf("RESOURCE", "((?:\\{[^{}]+\\}[%s]*)+)") //
|
||||||
))));
|
))));
|
||||||
|
@ -0,0 +1,72 @@
|
|||||||
|
/* ========================================================================
|
||||||
|
* PlantUML : a free UML diagram generator
|
||||||
|
* ========================================================================
|
||||||
|
*
|
||||||
|
* (C) Copyright 2009-2024, Arnaud Roques
|
||||||
|
*
|
||||||
|
* Project Info: https://plantuml.com
|
||||||
|
*
|
||||||
|
* If you like this project or if you find it useful, you can support us at:
|
||||||
|
*
|
||||||
|
* https://plantuml.com/patreon (only 1$ per month!)
|
||||||
|
* https://plantuml.com/paypal
|
||||||
|
*
|
||||||
|
* This file is part of PlantUML.
|
||||||
|
*
|
||||||
|
* PlantUML is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* PlantUML distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||||
|
* License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||||
|
* USA.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Original Author: Arnaud Roques
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package net.sourceforge.plantuml.project.lang;
|
||||||
|
|
||||||
|
import net.sourceforge.plantuml.project.time.Month;
|
||||||
|
import net.sourceforge.plantuml.regex.IRegex;
|
||||||
|
import net.sourceforge.plantuml.regex.RegexConcat;
|
||||||
|
import net.sourceforge.plantuml.regex.RegexLeaf;
|
||||||
|
|
||||||
|
public abstract class TimeResolution {
|
||||||
|
|
||||||
|
public static IRegex toRegexA_DD_MONTH_YYYY(String year, String month, String day) {
|
||||||
|
return new RegexConcat( //
|
||||||
|
new RegexLeaf(day, "([\\d]{1,2})"), //
|
||||||
|
new RegexLeaf("[\\w, ]*?"), //
|
||||||
|
new RegexLeaf(month, "(" + Month.getRegexString() + ")"), //
|
||||||
|
new RegexLeaf("[\\w, ]*?"), //
|
||||||
|
new RegexLeaf(year, "([\\d]{1,4})"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IRegex toRegexB_YYYY_MM_DD(String year, String month, String day) {
|
||||||
|
return new RegexConcat( //
|
||||||
|
new RegexLeaf(year, "([\\d]{1,4})"), //
|
||||||
|
new RegexLeaf("\\D"), //
|
||||||
|
new RegexLeaf(month, "([\\d]{1,2})"), //
|
||||||
|
new RegexLeaf("\\D"), //
|
||||||
|
new RegexLeaf(day, "([\\d]{1,2})"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IRegex toRegexC_MONTH_DD_YYYY(String year, String month, String day) {
|
||||||
|
return new RegexConcat( //
|
||||||
|
new RegexLeaf(month, "(" + Month.getRegexString() + ")"), //
|
||||||
|
new RegexLeaf("[\\w, ]*?"), //
|
||||||
|
new RegexLeaf(day, "([\\d]{1,2})"), //
|
||||||
|
new RegexLeaf("[\\w, ]*?"), //
|
||||||
|
new RegexLeaf(year, "([\\d]{1,4})"));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -48,6 +48,7 @@ public class Verbs {
|
|||||||
public static IRegex is = new RegexLeaf("is");
|
public static IRegex is = new RegexLeaf("is");
|
||||||
public static IRegex isColored = new RegexLeaf("is[%s]+colou?red");
|
public static IRegex isColored = new RegexLeaf("is[%s]+colou?red");
|
||||||
public static IRegex isDeleted = new RegexLeaf("is[%s]+deleted");
|
public static IRegex isDeleted = new RegexLeaf("is[%s]+deleted");
|
||||||
|
public static IRegex isDisplayedAs = new RegexLeaf("is[%s]+displayed[%s]+as");
|
||||||
public static IRegex isOff = new RegexLeaf("is[%s]+off");
|
public static IRegex isOff = new RegexLeaf("is[%s]+off");
|
||||||
public static IRegex isOn = new RegexLeaf("is[%s]+on");
|
public static IRegex isOn = new RegexLeaf("is[%s]+on");
|
||||||
public static IRegex isOrAre = new RegexLeaf("(is|are)");
|
public static IRegex isOrAre = new RegexLeaf("(is|are)");
|
||||||
|
@ -44,6 +44,7 @@ import net.sourceforge.plantuml.regex.RegexRepeatedZeroOrMore;
|
|||||||
public class Words {
|
public class Words {
|
||||||
|
|
||||||
public final static String AFTER = "after";
|
public final static String AFTER = "after";
|
||||||
|
public final static String AND = "and";
|
||||||
public final static String AT = "at";
|
public final static String AT = "at";
|
||||||
public final static String BEFORE = "before";
|
public final static String BEFORE = "before";
|
||||||
public final static String COMPLETION = "completion";
|
public final static String COMPLETION = "completion";
|
||||||
|
@ -42,8 +42,8 @@ public class TimeScaleCompressed implements TimeScale {
|
|||||||
|
|
||||||
private final TimeScale daily;
|
private final TimeScale daily;
|
||||||
|
|
||||||
public TimeScaleCompressed(Day calendar, double scale) {
|
public TimeScaleCompressed(double size, Day calendar, double scale) {
|
||||||
this.daily = new TimeScaleDaily(calendar, scale, null);
|
this.daily = new TimeScaleDaily(size, calendar, scale, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getStartingPosition(Day instant) {
|
public double getStartingPosition(Day instant) {
|
||||||
|
@ -44,8 +44,8 @@ public final class TimeScaleDaily implements TimeScale {
|
|||||||
private final TimeScaleWink basic;
|
private final TimeScaleWink basic;
|
||||||
private final double delta;
|
private final double delta;
|
||||||
|
|
||||||
public TimeScaleDaily(Day startingDay, double scale, Day zeroDay) {
|
public TimeScaleDaily(double size, Day startingDay, double scale, Day zeroDay) {
|
||||||
this.basic = new TimeScaleWink(scale, PrintScale.DAILY);
|
this.basic = new TimeScaleWink(size, scale, PrintScale.DAILY);
|
||||||
if (zeroDay == null)
|
if (zeroDay == null)
|
||||||
this.delta = basic.getStartingPosition(startingDay);
|
this.delta = basic.getStartingPosition(startingDay);
|
||||||
else
|
else
|
||||||
|
@ -40,17 +40,17 @@ import net.sourceforge.plantuml.project.time.Day;
|
|||||||
|
|
||||||
public class TimeScaleWink implements TimeScale {
|
public class TimeScaleWink implements TimeScale {
|
||||||
|
|
||||||
private final double scale;
|
private final double cellWidth;
|
||||||
private final PrintScale printScale;
|
private final PrintScale printScale;
|
||||||
|
|
||||||
public TimeScaleWink(double scale, PrintScale printScale) {
|
public TimeScaleWink(double size, double scale, PrintScale printScale) {
|
||||||
this.scale = 16.0 * scale;
|
this.cellWidth = size * scale;
|
||||||
this.printScale = printScale;
|
this.printScale = printScale;
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getStartingPosition(Day instant) {
|
public double getStartingPosition(Day instant) {
|
||||||
final long wink = instant.getMillis();
|
final long wink = instant.getMillis();
|
||||||
return wink * scale / Day.MILLISECONDS_PER_DAY;
|
return wink * cellWidth / Day.MILLISECONDS_PER_DAY;
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getEndingPosition(Day instant) {
|
public double getEndingPosition(Day instant) {
|
||||||
@ -58,7 +58,7 @@ public class TimeScaleWink implements TimeScale {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public double getWidth(Day instant) {
|
public double getWidth(Day instant) {
|
||||||
return scale;
|
return cellWidth;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isBreaking(Day instant) {
|
public boolean isBreaking(Day instant) {
|
||||||
|
@ -69,6 +69,7 @@ public enum SName {
|
|||||||
constraintArrow, //
|
constraintArrow, //
|
||||||
control, //
|
control, //
|
||||||
database, //
|
database, //
|
||||||
|
day, //
|
||||||
delay, //
|
delay, //
|
||||||
destroy, //
|
destroy, //
|
||||||
diamond, //
|
diamond, //
|
||||||
@ -100,6 +101,7 @@ public enum SName {
|
|||||||
map, //
|
map, //
|
||||||
milestone, //
|
milestone, //
|
||||||
mindmapDiagram, //
|
mindmapDiagram, //
|
||||||
|
month, //
|
||||||
network, //
|
network, //
|
||||||
node, //
|
node, //
|
||||||
note, //
|
note, //
|
||||||
@ -139,6 +141,7 @@ public enum SName {
|
|||||||
unstarted, //
|
unstarted, //
|
||||||
usecase, //
|
usecase, //
|
||||||
verticalSeparator, //
|
verticalSeparator, //
|
||||||
|
year, //
|
||||||
|
|
||||||
visibilityIcon, //
|
visibilityIcon, //
|
||||||
private_, //
|
private_, //
|
||||||
|
Loading…
Reference in New Issue
Block a user