1
0
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:
Arnaud Roques 2023-11-27 18:41:15 +01:00
parent f0b3e6900c
commit e991c4699b
30 changed files with 731 additions and 349 deletions

View File

@ -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

View File

@ -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;
} }

View File

@ -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);
} }

View File

@ -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;
}
} }

View File

@ -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;
}
} }

View File

@ -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();
} }

View File

@ -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());
} }

View File

@ -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);
} }
} }

View File

@ -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()) {

View File

@ -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;
}
} }

View File

@ -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();
}
} }

View File

@ -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();
}
} }

View File

@ -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()) {

View File

@ -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();
}
} }

View File

@ -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();
}
} }

View File

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

View File

@ -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);

View File

@ -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);

View File

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

View File

@ -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();
}
}

View File

@ -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() {

View File

@ -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(), //

View File

@ -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]*)+)") //
)))); ))));

View File

@ -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})"));
}
}

View File

@ -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)");

View File

@ -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";

View File

@ -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) {

View File

@ -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

View File

@ -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) {

View File

@ -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_, //