diff --git a/skin/plantuml.skin b/skin/plantuml.skin index ecba3aa67..e71b91a42 100644 --- a/skin/plantuml.skin +++ b/skin/plantuml.skin @@ -375,6 +375,13 @@ ganttDiagram { timeline { BackgroundColor transparent LineColor #C0C0C0 + FontSize 10 + month { + FontSize 12 + } + year { + FontSize 14 + } } closed { BackGroundColor #F1E5E5 diff --git a/src/net/sourceforge/plantuml/project/GanttDiagram.java b/src/net/sourceforge/plantuml/project/GanttDiagram.java index 10a540edc..6314bdc33 100644 --- a/src/net/sourceforge/plantuml/project/GanttDiagram.java +++ b/src/net/sourceforge/plantuml/project/GanttDiagram.java @@ -117,7 +117,7 @@ import net.sourceforge.plantuml.style.StyleSignatureBasic; import net.sourceforge.plantuml.svek.GraphvizCrash; 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 draws = new LinkedHashMap(); private final Map tasks = new LinkedHashMap(); @@ -233,8 +233,9 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw, WithSprit this.min = printStart; this.max = printEnd; } - final TimeHeader timeHeader = getTimeHeader(); - initTaskAndResourceDraws(timeHeader.getTimeScale(), timeHeader.getFullHeaderHeight(), stringBounder); + final TimeHeader timeHeader = getTimeHeader(stringBounder); + initTaskAndResourceDraws(timeHeader.getTimeScale(), timeHeader.getFullHeaderHeight(stringBounder), + stringBounder); return new AbstractTextBlock() { 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()); if (back.isTransparent() == false) { final URectangle rect1 = URectangle.build(calculateDimension(ug.getStringBounder()).getWidth(), - timeHeader.getTimeHeaderHeight()); + timeHeader.getTimeHeaderHeight(ug.getStringBounder())); ug.apply(back.bg()).draw(rect1); if (showFootbox) { final URectangle rect2 = URectangle.build( calculateDimension(ug.getStringBounder()).getWidth(), - timeHeader.getTimeFooterHeight()); + timeHeader.getTimeFooterHeight(ug.getStringBounder())); 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) { return new XDimension2D(getTitlesColumnWidth(stringBounder) + getBarsColumnWidth(timeHeader), - getTotalHeight(timeHeader)); + getTotalHeight(stringBounder, 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) - return new TimeHeaderSimple(thParam(), printScale); + return new TimeHeaderSimple(stringBounder, thParam(), printScale); 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) - return new TimeHeaderWeekly(thParam(), weekNumberStrategy, withCalendarDate); + return new TimeHeaderWeekly(stringBounder, thParam(), weekNumberStrategy, withCalendarDate); else if (printScale == PrintScale.MONTHLY) - return new TimeHeaderMonthly(thParam()); + return new TimeHeaderMonthly(stringBounder, thParam()); else if (printScale == PrintScale.QUARTERLY) - return new TimeHeaderQuarterly(thParam()); + return new TimeHeaderQuarterly(stringBounder, thParam()); else if (printScale == PrintScale.YEARLY) - return new TimeHeaderYearly(thParam()); + return new TimeHeaderYearly(stringBounder, thParam()); else throw new IllegalStateException(); } private TimeHeaderParameters thParam() { - return new TimeHeaderParameters(colorDays(), getFactorScale(), min, max, getIHtmlColorSet(), getTimelineStyle(), - getClosedStyle(), locale, openClose, colorDaysOfWeek, verticalSeparatorBefore, - getVerticalSeparatorStyle()); + return new TimeHeaderParameters(colorDays(), getFactorScale(), min, max, getIHtmlColorSet(), locale, openClose, + colorDaysOfWeek, verticalSeparatorBefore, this); } private Map colorDays() { @@ -338,24 +338,21 @@ public class GanttDiagram extends TitledDiagram implements ToTaskDraw, WithSprit return Collections.unmodifiableMap(colorDaysInternal); } - private Style getClosedStyle() { - return StyleSignatureBasic.of(SName.root, SName.element, SName.ganttDiagram, SName.closed) + @Override + public final Style getStyle(SName param) { + return StyleSignatureBasic.of(SName.root, SName.element, SName.ganttDiagram, param) .getMergedStyle(getCurrentStyleBuilder()); } - private Style getTimelineStyle() { - return StyleSignatureBasic.of(SName.root, SName.element, SName.ganttDiagram, SName.timeline) + @Override + public final Style getStyle(SName param1, SName param2) { + return StyleSignatureBasic.of(SName.root, SName.element, SName.ganttDiagram, param1, param2) .getMergedStyle(getCurrentStyleBuilder()); } - private Style getVerticalSeparatorStyle() { - return StyleSignatureBasic.of(SName.root, SName.element, SName.ganttDiagram, SName.verticalSeparator) - .getMergedStyle(getCurrentStyleBuilder()); - } - - private double getTotalHeight(TimeHeader timeHeader) { + private double getTotalHeight(StringBounder stringBounder, TimeHeader timeHeader) { if (showFootbox) - return totalHeightWithoutFooter + timeHeader.getTimeFooterHeight(); + return totalHeightWithoutFooter + timeHeader.getTimeFooterHeight(stringBounder); return totalHeightWithoutFooter; } diff --git a/src/net/sourceforge/plantuml/project/lang/Adverbial.java b/src/net/sourceforge/plantuml/project/GanttStyle.java similarity index 83% rename from src/net/sourceforge/plantuml/project/lang/Adverbial.java rename to src/net/sourceforge/plantuml/project/GanttStyle.java index 2c8ad3a02..44e15537d 100644 --- a/src/net/sourceforge/plantuml/project/lang/Adverbial.java +++ b/src/net/sourceforge/plantuml/project/GanttStyle.java @@ -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); } diff --git a/src/net/sourceforge/plantuml/project/TimeHeaderParameters.java b/src/net/sourceforge/plantuml/project/TimeHeaderParameters.java index d19da40ce..14cab9795 100644 --- a/src/net/sourceforge/plantuml/project/TimeHeaderParameters.java +++ b/src/net/sourceforge/plantuml/project/TimeHeaderParameters.java @@ -43,41 +43,39 @@ import net.sourceforge.plantuml.klimt.UStroke; import net.sourceforge.plantuml.klimt.color.HColor; import net.sourceforge.plantuml.klimt.color.HColorSet; import net.sourceforge.plantuml.klimt.drawing.UGraphic; +import net.sourceforge.plantuml.klimt.font.StringBounder; import net.sourceforge.plantuml.project.time.Day; import net.sourceforge.plantuml.project.time.DayOfWeek; import net.sourceforge.plantuml.style.PName; +import net.sourceforge.plantuml.style.SName; import net.sourceforge.plantuml.style.Style; -public class TimeHeaderParameters { +public class TimeHeaderParameters implements GanttStyle { private final Map colorDays; private final double scale; private final Day min; private final Day max; private final HColorSet colorSet; - private final Style timelineStyle; - private final Style closedStyle; - private final Style verticalSeparatorStyle; + private final GanttStyle ganttStyle; private final Locale locale; private final OpenClose openClose; private final Map colorDaysOfWeek; private final Set verticalSeparatorBefore; public TimeHeaderParameters(Map colorDays, double scale, Day min, Day max, HColorSet colorSet, - Style timelineStyle, Style closedStyle, Locale locale, OpenClose openClose, - Map colorDaysOfWeek, Set verticalSeparatorBefore, Style verticalSeparatorStyle) { + Locale locale, OpenClose openClose, Map colorDaysOfWeek, + Set verticalSeparatorBefore, GanttStyle ganttStyle) { this.colorDays = colorDays; this.scale = scale; this.min = min; this.max = max; this.colorSet = colorSet; - this.timelineStyle = timelineStyle; - this.closedStyle = closedStyle; + this.ganttStyle = ganttStyle; this.locale = locale; this.openClose = openClose; this.colorDaysOfWeek = colorDaysOfWeek; this.verticalSeparatorBefore = verticalSeparatorBefore; - this.verticalSeparatorStyle = verticalSeparatorStyle; } public HColor getColor(Day wink) { @@ -105,11 +103,11 @@ public class TimeHeaderParameters { } public final Style getTimelineStyle() { - return timelineStyle; + return getStyle(SName.timeline); } public final Style getClosedStyle() { - return closedStyle; + return getStyle(SName.closed); } public final Locale getLocale() { @@ -129,9 +127,25 @@ public class TimeHeaderParameters { } public final UGraphic forVerticalSeparator(UGraphic ug) { - final HColor color = verticalSeparatorStyle.value(PName.LineColor).asColor(getColorSet()); - final UStroke stroke = verticalSeparatorStyle.getStroke(); + final Style style = getStyle(SName.verticalSeparator); + final HColor color = style.value(PName.LineColor).asColor(getColorSet()); + final UStroke stroke = style.getStroke(); 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; + } + } diff --git a/src/net/sourceforge/plantuml/project/core/AbstractTask.java b/src/net/sourceforge/plantuml/project/core/AbstractTask.java index fe74f41cf..549e2c11f 100644 --- a/src/net/sourceforge/plantuml/project/core/AbstractTask.java +++ b/src/net/sourceforge/plantuml/project/core/AbstractTask.java @@ -43,27 +43,42 @@ public abstract class AbstractTask implements Task { private final StyleBuilder styleBuilder; private Task row; + private String displayString; protected AbstractTask(StyleBuilder styleBuilder, TaskCode code) { this.styleBuilder = styleBuilder; this.code = code; } + @Override final public void putInSameRowAs(Task row) { if (this != row) this.row = row; } + @Override public final Task getRow() { return row; } + @Override public final TaskCode getCode() { return code; } + @Override public final StyleBuilder getStyleBuilder() { return styleBuilder; } + @Override + public void setDisplay(String displayString) { + this.displayString = displayString; + } + + @Override + public String getDisplayString() { + return this.displayString; + } + } diff --git a/src/net/sourceforge/plantuml/project/core/Task.java b/src/net/sourceforge/plantuml/project/core/Task.java index 178b6283e..467274875 100644 --- a/src/net/sourceforge/plantuml/project/core/Task.java +++ b/src/net/sourceforge/plantuml/project/core/Task.java @@ -81,4 +81,8 @@ public interface Task extends Moment { public boolean isAssignedTo(Resource res); + public void setDisplay(String displayString); + + public String getDisplayString(); + } diff --git a/src/net/sourceforge/plantuml/project/draw/TaskDrawDiamond.java b/src/net/sourceforge/plantuml/project/draw/TaskDrawDiamond.java index 30e3d8031..df3a3854b 100644 --- a/src/net/sourceforge/plantuml/project/draw/TaskDrawDiamond.java +++ b/src/net/sourceforge/plantuml/project/draw/TaskDrawDiamond.java @@ -134,29 +134,39 @@ public class TaskDrawDiamond extends AbstractTaskDraw { @Override public void drawU(UGraphic ug) { + if (url != null) + ug.startUrl(url); + + final String displayString = getTask().getDisplayString(); + final Style style = getStyle(); final ClockwiseTopRightBottomLeft margin = style.getMargin(); ug = ug.apply(UTranslate.dy(margin.getTop())); final double x1 = timeScale.getStartingPosition(start); - final double x2 = timeScale.getEndingPosition(start); - final double width = getDiamondHeight(); - final double delta = x2 - x1 - width; - if (url != null) - ug.startUrl(url); - - drawShape(applyColors(ug).apply(UTranslate.dx(x1 + delta / 2))); + ug = ug.apply(UTranslate.dx(x1)); + if (displayString == null) { + final double x2 = timeScale.getEndingPosition(start); + final double width = getDiamondHeight(); + final double delta = x2 - x1 - width; + ug = ug.apply(UTranslate.dx(delta / 2)); + drawShape(applyColors(ug)); + } else { + final TextBlock draw = Display.getWithNewlines(displayString).create(getFontConfiguration(), + HorizontalAlignment.LEFT, new SpriteContainerEmpty()); + draw.drawU(ug); + } if (url != null) ug.closeUrl(); } private UGraphic applyColors(UGraphic ug) { final CenterBorderColor col = this.getColors(); - if (col != null && col.isOk()) { + if (col != null && col.isOk()) return col.apply(ug); - } + return ug.apply(getLineColor()).apply(getBackgroundColor().bg()); } diff --git a/src/net/sourceforge/plantuml/project/draw/TimeHeader.java b/src/net/sourceforge/plantuml/project/draw/TimeHeader.java index b50138d03..9d171188e 100644 --- a/src/net/sourceforge/plantuml/project/draw/TimeHeader.java +++ b/src/net/sourceforge/plantuml/project/draw/TimeHeader.java @@ -41,6 +41,7 @@ import net.sourceforge.plantuml.klimt.color.HColors; import net.sourceforge.plantuml.klimt.creole.Display; import net.sourceforge.plantuml.klimt.drawing.UGraphic; import net.sourceforge.plantuml.klimt.font.FontConfiguration; +import net.sourceforge.plantuml.klimt.font.StringBounder; import net.sourceforge.plantuml.klimt.font.UFont; import net.sourceforge.plantuml.klimt.geom.HorizontalAlignment; import net.sourceforge.plantuml.klimt.shape.TextBlock; @@ -51,18 +52,11 @@ import net.sourceforge.plantuml.project.TimeHeaderParameters; import net.sourceforge.plantuml.project.time.Day; import net.sourceforge.plantuml.project.timescale.TimeScale; import net.sourceforge.plantuml.style.PName; +import net.sourceforge.plantuml.style.SName; public abstract class TimeHeader { // ::remove folder when __HAXE__ - protected final double Y_POS_ROW16() { - return 16; - } - - protected final double Y_POS_ROW28() { - return 28; - } - private final TimeScale timeScale; protected final TimeHeaderParameters thParam; @@ -100,15 +94,19 @@ public abstract class TimeHeader { 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 drawTimeFooter(UGraphic ug); - public abstract double getFullHeaderHeight(); + public final TimeScale getTimeScale() { + return timeScale; + } protected final void drawHline(UGraphic ug, double y) { final double xmin = getTimeScale().getStartingPosition(thParam.getMin()); @@ -122,20 +120,17 @@ public abstract class TimeHeader { ug.apply(new UTranslate(x, y1)).draw(vbar); } - final protected FontConfiguration getFontConfiguration(int size, boolean bold, HColor color) { - UFont font = UFont.serif(size); + final protected FontConfiguration getFontConfiguration(UFont font, boolean bold, HColor color) { if (bold) font = font.bold(); return FontConfiguration.create(font, color, color, null); } - public final TimeScale getTimeScale() { - return timeScale; - } - - protected final TextBlock getTextBlock(String text, int size, boolean bold, HColor color) { - return Display.getWithNewlines(text).create(getFontConfiguration(size, bold, color), HorizontalAlignment.LEFT, + protected final TextBlock getTextBlock(SName param, String text, boolean bold, HColor color) { + final UFont font = thParam.getStyle(SName.timeline, param).getUFont(); + final FontConfiguration fontConfiguration = getFontConfiguration(font, bold, color); + return Display.getWithNewlines(text).create(fontConfiguration, HorizontalAlignment.LEFT, new SpriteContainerEmpty()); } @@ -165,7 +160,7 @@ public abstract class TimeHeader { return; 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)); } @@ -173,8 +168,8 @@ public abstract class TimeHeader { ug = thParam.forVerticalSeparator(ug); for (Day wink = getMin(); wink.compareTo(getMax()) <= 0; wink = wink.increment()) if (isBold2(wink)) - drawVline(ug, getTimeScale().getStartingPosition(wink), getFullHeaderHeight(), - totalHeightWithoutFooter); + drawVline(ug, getTimeScale().getStartingPosition(wink), + getFullHeaderHeight(ug.getStringBounder()), totalHeightWithoutFooter); } } diff --git a/src/net/sourceforge/plantuml/project/draw/TimeHeaderCalendar.java b/src/net/sourceforge/plantuml/project/draw/TimeHeaderCalendar.java index ff606e347..fb85e6503 100644 --- a/src/net/sourceforge/plantuml/project/draw/TimeHeaderCalendar.java +++ b/src/net/sourceforge/plantuml/project/draw/TimeHeaderCalendar.java @@ -76,7 +76,7 @@ public abstract class TimeHeaderCalendar extends TimeHeader { protected final void drawTextsBackground(UGraphic ug, double totalHeightWithoutFooter) { - final double height = totalHeightWithoutFooter - getFullHeaderHeight(); + final double height = totalHeightWithoutFooter - getFullHeaderHeight(ug.getStringBounder()); Pending pending = null; for (Day wink = getMin(); wink.compareTo(getMax()) <= 0; wink = wink.increment()) { diff --git a/src/net/sourceforge/plantuml/project/draw/TimeHeaderDaily.java b/src/net/sourceforge/plantuml/project/draw/TimeHeaderDaily.java index 55f04437c..6d5a550bb 100644 --- a/src/net/sourceforge/plantuml/project/draw/TimeHeaderDaily.java +++ b/src/net/sourceforge/plantuml/project/draw/TimeHeaderDaily.java @@ -40,41 +40,79 @@ import java.util.Map; import net.sourceforge.plantuml.klimt.UTranslate; import net.sourceforge.plantuml.klimt.color.HColor; 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.project.TimeHeaderParameters; import net.sourceforge.plantuml.project.time.Day; import net.sourceforge.plantuml.project.time.MonthYear; 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 double getTimeHeaderHeight() { - return Y_POS_ROW28() + 13; + private double getH1(StringBounder stringBounder) { + final double h = thParam.getStyle(SName.timeline, SName.month).value(PName.FontSize).asDouble() + 2; + return h; } - public double getTimeFooterHeight() { - // return 0; - return 24 + 14; + private double getH2(StringBounder stringBounder) { + final double h = thParam.getStyle(SName.timeline, SName.day).value(PName.FontSize).asDouble() + 2; + 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 nameDays; - public TimeHeaderDaily(TimeHeaderParameters thParam, Map nameDays, Day printStart, Day printEnd) { - super(thParam, new TimeScaleDaily(thParam.getStartingDay(), thParam.getScale(), printStart)); + public TimeHeaderDaily(StringBounder stringBounder, TimeHeaderParameters thParam, Map nameDays, + Day printStart, Day printEnd) { + super(thParam, new TimeScaleDaily(thParam.getCellWidth(stringBounder), thParam.getStartingDay(), + thParam.getScale(), printStart)); this.nameDays = nameDays; } @Override public void drawTimeHeader(final UGraphic ug, double totalHeightWithoutFooter) { drawTextsBackground(ug, totalHeightWithoutFooter); - drawTextsDayOfWeek(ug.apply(UTranslate.dy(Y_POS_ROW16()))); - drawTextDayOfMonth(ug.apply(UTranslate.dy(Y_POS_ROW28()))); + drawTextsDayOfWeek(ug.apply(UTranslate.dy(getH1(ug.getStringBounder())))); + drawTextDayOfMonth(ug.apply(UTranslate.dy(getH2(ug.getStringBounder())))); drawMonths(ug); printVerticalSeparators(ug, totalHeightWithoutFooter); printNamedDays(ug); - drawHline(ug, getFullHeaderHeight()); + drawHline(ug, getFullHeaderHeight(ug.getStringBounder())); drawHline(ug, totalHeightWithoutFooter); } @@ -84,21 +122,22 @@ public class TimeHeaderDaily extends TimeHeaderCalendar { final UGraphic ugLineColor = ug.apply(getLineColor()); for (Day wink = getMin(); wink.compareTo(getMax()) <= 0; wink = wink.increment()) if (isBold2(wink)) - drawVline(ugVerticalSeparator, getTimeScale().getStartingPosition(wink), getFullHeaderHeight(), - totalHeightWithoutFooter); + drawVline(ugVerticalSeparator, getTimeScale().getStartingPosition(wink), + getFullHeaderHeight(ug.getStringBounder()), totalHeightWithoutFooter); else - drawVline(ugLineColor, getTimeScale().getStartingPosition(wink), getFullHeaderHeight(), - totalHeightWithoutFooter); + drawVline(ugLineColor, getTimeScale().getStartingPosition(wink), + getFullHeaderHeight(ug.getStringBounder()), totalHeightWithoutFooter); - drawVline(ugLineColor, getTimeScale().getEndingPosition(getMax()), getFullHeaderHeight(), + drawVline(ugLineColor, getTimeScale().getEndingPosition(getMax()), getFullHeaderHeight(ug.getStringBounder()), totalHeightWithoutFooter); } @Override 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); - 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) { @@ -106,7 +145,8 @@ public class TimeHeaderDaily extends TimeHeaderCalendar { final double x1 = getTimeScale().getStartingPosition(wink); final double x2 = getTimeScale().getEndingPosition(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 x2 = getTimeScale().getEndingPosition(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) { - final TextBlock tiny = getTextBlock(monthYear.shortName(locale()), 12, true, openFontColor()); - final TextBlock small = getTextBlock(monthYear.longName(locale()), 12, true, openFontColor()); - final TextBlock big = getTextBlock(monthYear.longNameYYYY(locale()), 12, true, openFontColor()); + final TextBlock tiny = getTextBlock(SName.month, monthYear.shortName(locale()), true, openFontColor()); + final TextBlock small = getTextBlock(SName.month, monthYear.longName(locale()), true, openFontColor()); + final TextBlock big = getTextBlock(SName.month, monthYear.longNameYYYY(locale()), true, openFontColor()); printCentered(ug, false, start, end, tiny, small, big); } @@ -160,27 +200,17 @@ public class TimeHeaderDaily extends TimeHeaderCalendar { if (name != null && name.equals(last) == false) { final double x1 = getTimeScale().getStartingPosition(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(); - double y1 = getTimeHeaderHeight(); - double y2 = getFullHeaderHeight(); - label.drawU(ug.apply(new UTranslate(x1, Y_POS_ROW28() + 11))); + double y1 = getTimeHeaderHeight(ug.getStringBounder()); + double y2 = getFullHeaderHeight(ug.getStringBounder()); + + final double position = getH3(ug.getStringBounder()); + label.drawU(ug.apply(new UTranslate(x1, position))); } last = name; } } } - @Override - public double getFullHeaderHeight() { - return getTimeHeaderHeight() + getHeaderNameDayHeight(); - } - - private double getHeaderNameDayHeight() { - if (nameDays.size() > 0) - return 16; - - return 0; - } - } diff --git a/src/net/sourceforge/plantuml/project/draw/TimeHeaderMonthly.java b/src/net/sourceforge/plantuml/project/draw/TimeHeaderMonthly.java index fc6c99771..81e619c86 100644 --- a/src/net/sourceforge/plantuml/project/draw/TimeHeaderMonthly.java +++ b/src/net/sourceforge/plantuml/project/draw/TimeHeaderMonthly.java @@ -37,54 +37,76 @@ package net.sourceforge.plantuml.project.draw; import net.sourceforge.plantuml.klimt.UTranslate; 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.project.TimeHeaderParameters; import net.sourceforge.plantuml.project.time.Day; import net.sourceforge.plantuml.project.time.MonthYear; 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 double getTimeHeaderHeight() { - return 16 + 13; + @Override + 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() { - return 16 + 13 - 1; + @Override + 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) { - super(thParam, new TimeScaleCompressed(thParam.getStartingDay(), thParam.getScale())); + @Override + 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 public void drawTimeHeader(final UGraphic ug, double totalHeightWithoutFooter) { drawTextsBackground(ug, totalHeightWithoutFooter); 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); drawHline(ug, 0); - drawHline(ug, 16); - drawHline(ug, getFullHeaderHeight()); + drawHline(ug, h1 + 2); + drawHline(ug, h1 + 2 + h2 + 2); +// drawHline(ug, getFullHeaderHeight(ug.getStringBounder())); } @Override 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); - drawYears(ug.apply(UTranslate.dy(13))); + drawYears(ug.apply(UTranslate.dy(h2 + 2))); drawHline(ug, 0); - drawHline(ug, 13); - drawHline(ug, getTimeFooterHeight()); + drawHline(ug, h2 + 2); + drawHline(ug, h1 + 2 + h2 + 2); +// drawHline(ug, getTimeFooterHeight(ug.getStringBounder())); } private void drawYears(final UGraphic ug) { + final double h1 = thParam.getStyle(SName.timeline, SName.year).value(PName.FontSize).asDouble(); MonthYear last = null; double lastChange = -1; for (Day wink = getMin(); wink.compareTo(getMax()) < 0; wink = wink.increment()) { final double x1 = getTimeScale().getStartingPosition(wink); 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) printYear(ug, last, lastChange, x1); @@ -96,16 +118,17 @@ public class TimeHeaderMonthly extends TimeHeaderCalendar { if (x1 > lastChange) 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) { + final double h2 = thParam.getStyle(SName.timeline, SName.month).value(PName.FontSize).asDouble(); MonthYear last = null; double lastChange = -1; for (Day wink = getMin(); wink.compareTo(getMax()) < 0; wink = wink.increment()) { final double x1 = getTimeScale().getStartingPosition(wink); 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) printMonth(ug, last, lastChange, x1); @@ -117,17 +140,17 @@ public class TimeHeaderMonthly extends TimeHeaderCalendar { if (x1 > lastChange) 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) { - 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); } private void printMonth(UGraphic ug, MonthYear monthYear, double start, double end) { - final TextBlock small = getTextBlock(monthYear.shortName(locale()), 10, false, openFontColor()); - final TextBlock big = getTextBlock(monthYear.longName(locale()), 10, false, openFontColor()); + final TextBlock small = getTextBlock(SName.day, monthYear.shortName(locale()), false, openFontColor()); + final TextBlock big = getTextBlock(SName.day, monthYear.longName(locale()), false, openFontColor()); printCentered(ug, false, start, end, small, big); } @@ -135,9 +158,4 @@ public class TimeHeaderMonthly extends TimeHeaderCalendar { text.drawU(ug.apply(UTranslate.dx(start))); } - @Override - public double getFullHeaderHeight() { - return getTimeHeaderHeight(); - } - } diff --git a/src/net/sourceforge/plantuml/project/draw/TimeHeaderQuarterly.java b/src/net/sourceforge/plantuml/project/draw/TimeHeaderQuarterly.java index b19cdad98..87e202be0 100644 --- a/src/net/sourceforge/plantuml/project/draw/TimeHeaderQuarterly.java +++ b/src/net/sourceforge/plantuml/project/draw/TimeHeaderQuarterly.java @@ -37,54 +37,76 @@ package net.sourceforge.plantuml.project.draw; import net.sourceforge.plantuml.klimt.UTranslate; 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.project.TimeHeaderParameters; import net.sourceforge.plantuml.project.time.Day; import net.sourceforge.plantuml.project.time.MonthYear; 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 double getTimeHeaderHeight() { - return 16 + 13; + @Override + 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() { - return 16 + 13 - 1; + @Override + 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) { - super(thParam, new TimeScaleCompressed(thParam.getStartingDay(), thParam.getScale())); + @Override + 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 public void drawTimeHeader(final UGraphic ug, double totalHeightWithoutFooter) { drawTextsBackground(ug, totalHeightWithoutFooter); 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); drawHline(ug, 0); - drawHline(ug, 16); - drawHline(ug, getFullHeaderHeight()); + drawHline(ug, h1 + 2); + drawHline(ug, h1 + 2 + h2 + 2); + // drawHline(ug, getFullHeaderHeight(ug.getStringBounder())); } @Override 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); - drawYears(ug.apply(UTranslate.dy(13))); + drawYears(ug.apply(UTranslate.dy(h2 + 2))); drawHline(ug, 0); - drawHline(ug, 13); - drawHline(ug, getTimeFooterHeight()); + drawHline(ug, h2 + 2); + drawHline(ug, h1 + 2 + h2 + 2); +// drawHline(ug, getTimeFooterHeight(ug.getStringBounder())); } private void drawYears(final UGraphic ug) { + final double h1 = thParam.getStyle(SName.timeline, SName.year).value(PName.FontSize).asDouble(); MonthYear last = null; double lastChange = -1; for (Day wink = getMin(); wink.compareTo(getMax()) < 0; wink = wink.increment()) { final double x1 = getTimeScale().getStartingPosition(wink); 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) printYear(ug, last, lastChange, x1); @@ -96,16 +118,17 @@ public class TimeHeaderQuarterly extends TimeHeaderCalendar { if (x1 > lastChange) 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) { + final double h2 = thParam.getStyle(SName.timeline, SName.month).value(PName.FontSize).asDouble(); String last = null; double lastChange = -1; for (Day wink = getMin(); wink.compareTo(getMax()) < 0; wink = wink.increment()) { final double x1 = getTimeScale().getStartingPosition(wink); 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) printQuarter(ug, last, lastChange, x1); @@ -117,7 +140,7 @@ public class TimeHeaderQuarterly extends TimeHeaderCalendar { if (x1 > lastChange) 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) { @@ -125,12 +148,12 @@ public class TimeHeaderQuarterly extends TimeHeaderCalendar { } 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); } 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); } @@ -138,9 +161,4 @@ public class TimeHeaderQuarterly extends TimeHeaderCalendar { text.drawU(ug.apply(UTranslate.dx(start))); } - @Override - public double getFullHeaderHeight() { - return getTimeHeaderHeight(); - } - } diff --git a/src/net/sourceforge/plantuml/project/draw/TimeHeaderSimple.java b/src/net/sourceforge/plantuml/project/draw/TimeHeaderSimple.java index 7d23798ea..65685fe36 100644 --- a/src/net/sourceforge/plantuml/project/draw/TimeHeaderSimple.java +++ b/src/net/sourceforge/plantuml/project/draw/TimeHeaderSimple.java @@ -39,6 +39,9 @@ import net.sourceforge.plantuml.klimt.UTranslate; import net.sourceforge.plantuml.klimt.color.HColor; import net.sourceforge.plantuml.klimt.creole.Display; import net.sourceforge.plantuml.klimt.drawing.UGraphic; +import net.sourceforge.plantuml.klimt.font.FontConfiguration; +import net.sourceforge.plantuml.klimt.font.StringBounder; +import net.sourceforge.plantuml.klimt.font.UFont; import net.sourceforge.plantuml.klimt.geom.HorizontalAlignment; import net.sourceforge.plantuml.klimt.shape.TextBlock; import net.sourceforge.plantuml.klimt.shape.ULine; @@ -48,30 +51,36 @@ import net.sourceforge.plantuml.project.core.PrintScale; import net.sourceforge.plantuml.project.time.Day; import net.sourceforge.plantuml.project.timescale.TimeScale; import net.sourceforge.plantuml.project.timescale.TimeScaleWink; +import net.sourceforge.plantuml.style.PName; +import net.sourceforge.plantuml.style.SName; public class TimeHeaderSimple extends TimeHeader { private final PrintScale printScale; @Override - public double getFullHeaderHeight() { - return getTimeHeaderHeight() + getHeaderNameDayHeight(); + public double getFullHeaderHeight(StringBounder stringBounder) { + return getTimeHeaderHeight(stringBounder) + getHeaderNameDayHeight(); } - public double getTimeHeaderHeight() { - return 16; + @Override + public double getTimeHeaderHeight(StringBounder stringBounder) { + final double h = thParam.getStyle(SName.timeline, SName.day).value(PName.FontSize).asDouble(); + return h + 6; } - public double getTimeFooterHeight() { - return 16; + @Override + public double getTimeFooterHeight(StringBounder stringBounder) { + final double h = thParam.getStyle(SName.timeline, SName.day).value(PName.FontSize).asDouble(); + return h + 6; } private double getHeaderNameDayHeight() { return 0; } - public TimeHeaderSimple(TimeHeaderParameters thParam, PrintScale printScale) { - super(thParam, new TimeScaleWink(thParam.getScale(), printScale)); + public TimeHeaderSimple(StringBounder stringBounder, TimeHeaderParameters thParam, PrintScale printScale) { + super(thParam, new TimeScaleWink(thParam.getCellWidth(stringBounder), thParam.getScale(), printScale)); this.printScale = printScale; } @@ -91,9 +100,10 @@ public class TimeHeaderSimple extends TimeHeader { value = i.getAbsoluteDayNum() / 7 + 1; else value = i.getAbsoluteDayNum() + 1; - final TextBlock num = Display.getWithNewlines("" + value).create( - getFontConfiguration(10, false, openFontColor()), HorizontalAlignment.LEFT, - new SpriteContainerEmpty()); + final UFont font = thParam.getStyle(SName.timeline, SName.day).getUFont(); + final FontConfiguration fontConfiguration = getFontConfiguration(font, false, openFontColor()); + final TextBlock num = Display.getWithNewlines("" + value).create(fontConfiguration, + HorizontalAlignment.LEFT, new SpriteContainerEmpty()); final double x1 = timeScale.getStartingPosition(i); final double x2; if (printScale == PrintScale.WEEKLY) @@ -110,15 +120,15 @@ public class TimeHeaderSimple extends TimeHeader { @Override 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 xmax = getTimeScale().getEndingPosition(getMax()); drawSmallVlinesDay(ug, getTimeScale(), totalHeightWithoutFooter + 2); printVerticalSeparators(ug, totalHeightWithoutFooter); drawSimpleDayCounter(ug, getTimeScale()); - ug = ug.apply(getLineColor()); - ug.draw(ULine.hline(xmax - xmin)); - ug.apply(UTranslate.dy(getFullHeaderHeight() - 3)).draw(ULine.hline(xmax - xmin)); + // ug = ug.apply(getLineColor()); + // ug.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 xmax = getTimeScale().getEndingPosition(getMax()); ug = ug.apply(UTranslate.dy(3)); - drawSmallVlinesDay(ug, getTimeScale(), getTimeFooterHeight() - 3); + drawSmallVlinesDay(ug, getTimeScale(), getTimeFooterHeight(ug.getStringBounder()) - 3); drawSimpleDayCounter(ug, getTimeScale()); - ug.apply(getLineColor()).draw(ULine.hline(xmax - xmin)); + // ug.apply(getLineColor()).draw(ULine.hline(xmax - xmin)); } // Duplicate in TimeHeaderDaily @@ -151,7 +161,7 @@ public class TimeHeaderSimple extends TimeHeader { protected final void drawTextsBackground(UGraphic ug, double totalHeightWithoutFooter) { - final double height = totalHeightWithoutFooter - getFullHeaderHeight(); + final double height = totalHeightWithoutFooter - getFullHeaderHeight(ug.getStringBounder()); Pending pending = null; for (Day wink = getMin(); wink.compareTo(getMax()) <= 0; wink = wink.increment()) { diff --git a/src/net/sourceforge/plantuml/project/draw/TimeHeaderWeekly.java b/src/net/sourceforge/plantuml/project/draw/TimeHeaderWeekly.java index 53688b08c..c2cbc0d96 100644 --- a/src/net/sourceforge/plantuml/project/draw/TimeHeaderWeekly.java +++ b/src/net/sourceforge/plantuml/project/draw/TimeHeaderWeekly.java @@ -37,29 +37,48 @@ package net.sourceforge.plantuml.project.draw; import net.sourceforge.plantuml.klimt.UTranslate; 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.project.TimeHeaderParameters; import net.sourceforge.plantuml.project.time.Day; import net.sourceforge.plantuml.project.time.MonthYear; import net.sourceforge.plantuml.project.time.WeekNumberStrategy; import net.sourceforge.plantuml.project.timescale.TimeScaleCompressed; +import net.sourceforge.plantuml.style.PName; +import net.sourceforge.plantuml.style.SName; public class TimeHeaderWeekly extends TimeHeaderCalendar { private final WeekNumberStrategy weekNumberStrategy; private final boolean withCalendarDate; - public double getTimeHeaderHeight() { - return 16 + 13; + @Override + 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() { - return 16; + @Override + 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, - boolean withCalendarDate) { - super(thParam, new TimeScaleCompressed(thParam.getStartingDay(), thParam.getScale())); + @Override + public double getFullHeaderHeight(StringBounder stringBounder) { + 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.withCalendarDate = withCalendarDate; } @@ -69,15 +88,15 @@ public class TimeHeaderWeekly extends TimeHeaderCalendar { drawTextsBackground(ug, totalHeightWithoutFooter); drawCalendar(ug, totalHeightWithoutFooter); drawHline(ug, 0); - drawHline(ug, Y_POS_ROW16()); - drawHline(ug, getFullHeaderHeight()); + drawHline(ug, getH1(ug.getStringBounder())); + drawHline(ug, getFullHeaderHeight(ug.getStringBounder())); } @Override public void drawTimeFooter(UGraphic ug) { drawHline(ug, 0); printMonths(ug); - drawHline(ug, getTimeFooterHeight()); + drawHline(ug, getTimeFooterHeight(ug.getStringBounder())); } 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()) { final double x1 = getTimeScale().getStartingPosition(wink); 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) printMonth(ug, last, lastChangeMonth, x1); @@ -100,9 +119,10 @@ public class TimeHeaderWeekly extends TimeHeaderCalendar { 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()); - if (x1 > lastChangeMonth) + if (last != null && x1 > lastChangeMonth) printMonth(ug, last, lastChangeMonth, x1); } @@ -111,9 +131,11 @@ public class TimeHeaderWeekly extends TimeHeaderCalendar { protected void printVerticalSeparators(final UGraphic ug, double totalHeightWithoutFooter) { for (Day wink = getMin(); wink.compareTo(getMax()) <= 0; wink = wink.increment()) 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); } @@ -125,16 +147,16 @@ public class TimeHeaderWeekly extends TimeHeaderCalendar { num = "" + wink.getDayOfMonth(); else num = "" + wink.getWeekOfYear(weekNumberStrategy); - final TextBlock textBlock = getTextBlock(num, 10, false, openFontColor()); - printLeft(ug.apply(UTranslate.dy(Y_POS_ROW16())), textBlock, + final TextBlock textBlock = getTextBlock(SName.day, num, false, openFontColor()); + printLeft(ug.apply(UTranslate.dy(getH1(ug.getStringBounder()))), textBlock, getTimeScale().getStartingPosition(wink) + 5); } } } private void printMonth(UGraphic ug, MonthYear monthYear, double start, double end) { - final TextBlock small = getTextBlock(monthYear.shortName(locale()), 12, true, openFontColor()); - final TextBlock big = getTextBlock(monthYear.shortNameYYYY(locale()), 12, true, openFontColor()); + final TextBlock small = getTextBlock(SName.month, monthYear.shortName(locale()), true, openFontColor()); + final TextBlock big = getTextBlock(SName.month, monthYear.shortNameYYYY(locale()), true, openFontColor()); printCentered(ug, false, start, end, small, big); } @@ -142,9 +164,4 @@ public class TimeHeaderWeekly extends TimeHeaderCalendar { text.drawU(ug.apply(UTranslate.dx(start))); } - @Override - public double getFullHeaderHeight() { - return getTimeHeaderHeight(); - } - } diff --git a/src/net/sourceforge/plantuml/project/draw/TimeHeaderYearly.java b/src/net/sourceforge/plantuml/project/draw/TimeHeaderYearly.java index 04b25e86c..47893ed51 100644 --- a/src/net/sourceforge/plantuml/project/draw/TimeHeaderYearly.java +++ b/src/net/sourceforge/plantuml/project/draw/TimeHeaderYearly.java @@ -37,24 +37,37 @@ package net.sourceforge.plantuml.project.draw; import net.sourceforge.plantuml.klimt.UTranslate; 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.project.TimeHeaderParameters; import net.sourceforge.plantuml.project.time.Day; import net.sourceforge.plantuml.project.time.MonthYear; 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 double getTimeHeaderHeight() { - return 20; + @Override + public double getTimeHeaderHeight(StringBounder stringBounder) { + final double h1 = thParam.getStyle(SName.timeline, SName.year).value(PName.FontSize).asDouble(); + return h1 + 3; } - public double getTimeFooterHeight() { - return 20 - 1; + @Override + 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) { - super(thParam, new TimeScaleCompressed(thParam.getStartingDay(), thParam.getScale())); + @Override + 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 @@ -63,24 +76,26 @@ public class TimeHeaderYearly extends TimeHeaderCalendar { drawYears(ug); printVerticalSeparators(ug, totalHeightWithoutFooter); drawHline(ug, 0); - drawHline(ug, getFullHeaderHeight()); + drawHline(ug, getFullHeaderHeight(ug.getStringBounder())); } @Override public void drawTimeFooter(UGraphic ug) { - ug = ug.apply(UTranslate.dy(3)); + // ug = ug.apply(UTranslate.dy(3)); drawYears(ug); drawHline(ug, 0); - drawHline(ug, getTimeFooterHeight()); + drawHline(ug, getTimeFooterHeight(ug.getStringBounder())); } private void drawYears(final UGraphic ug) { + final double h1 = thParam.getStyle(SName.timeline, SName.year).value(PName.FontSize).asDouble(); + MonthYear last = null; double lastChange = -1; for (Day wink = getMin(); wink.compareTo(getMax()) < 0; wink = wink.increment()) { final double x1 = getTimeScale().getStartingPosition(wink); 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) printYear(ug, last, lastChange, x1); @@ -91,18 +106,13 @@ public class TimeHeaderYearly extends TimeHeaderCalendar { final double x1 = getTimeScale().getStartingPosition(getMax().increment()); if (x1 > lastChange) 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) { - 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); } - @Override - public double getFullHeaderHeight() { - return getTimeHeaderHeight(); - } - } diff --git a/src/net/sourceforge/plantuml/project/lang/ComplementAnything.java b/src/net/sourceforge/plantuml/project/lang/ComplementAnything.java new file mode 100644 index 000000000..787e7e55a --- /dev/null +++ b/src/net/sourceforge/plantuml/project/lang/ComplementAnything.java @@ -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 getMe(GanttDiagram system, RegexResult arg, String suffix) { + final String value = arg.get("ANYTHING" + suffix, 0); + return Failable.ok(value); + } +} diff --git a/src/net/sourceforge/plantuml/project/lang/ComplementDate.java b/src/net/sourceforge/plantuml/project/lang/ComplementDate.java index 701f15dfc..032af9d04 100644 --- a/src/net/sourceforge/plantuml/project/lang/ComplementDate.java +++ b/src/net/sourceforge/plantuml/project/lang/ComplementDate.java @@ -38,7 +38,6 @@ package net.sourceforge.plantuml.project.lang; import net.sourceforge.plantuml.project.Failable; import net.sourceforge.plantuml.project.GanttDiagram; 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; @@ -70,40 +69,14 @@ public class ComplementDate implements Something { } public IRegex toRegex(String suffix) { + final DayPattern dayPattern = new DayPattern(suffix); switch (type) { case ONLY_ABSOLUTE: - return new RegexOr(toRegexA(suffix), toRegexB(suffix), toRegexC(suffix)); + return dayPattern.toRegex(); case ONLY_RELATIVE: return new RegexOr(toRegexD(suffix), toRegexE(suffix)); } - return new RegexOr(toRegexA(suffix), toRegexB(suffix), toRegexC(suffix), 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})")); + return new RegexOr(dayPattern.toRegex(), toRegexD(suffix), toRegexE(suffix)); } private IRegex toRegexD(String suffix) { @@ -126,14 +99,11 @@ public class ComplementDate implements Something { } public Failable getMe(GanttDiagram system, RegexResult arg, String suffix) { - if (arg.get("ADAY" + suffix, 0) != null) - return Failable.ok(resultA(arg, suffix)); + final DayPattern dayPattern = new DayPattern(suffix); + final Day result = dayPattern.getDay(arg); - if (arg.get("BDAY" + suffix, 0) != null) - return Failable.ok(resultB(arg, suffix)); - - if (arg.get("CDAY" + suffix, 0) != null) - return Failable.ok(resultC(arg, suffix)); + if (result != null) + return Failable.ok(result); if (arg.get("DCOUNT" + suffix, 0) != null) return Failable.ok(resultD(system, arg, suffix)); @@ -144,27 +114,6 @@ public class ComplementDate implements Something { 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) { final int day = Integer.parseInt(arg.get("DCOUNT" + suffix, 0)); return system.getStartingDate().addDays(day); diff --git a/src/net/sourceforge/plantuml/project/lang/ComplementDates.java b/src/net/sourceforge/plantuml/project/lang/ComplementDates.java index eece3d85f..a48a91aed 100644 --- a/src/net/sourceforge/plantuml/project/lang/ComplementDates.java +++ b/src/net/sourceforge/plantuml/project/lang/ComplementDates.java @@ -52,20 +52,14 @@ public class ComplementDates implements Something { } private IRegex toRegexB(String suffix) { + final DayPattern dayPattern1 = new DayPattern("1"); + final DayPattern dayPattern2 = new DayPattern("2"); return new RegexConcat( // - new RegexLeaf("BYEAR1" + suffix, "([\\d]{4})"), // - new RegexLeaf("\\D"), // - new RegexLeaf("BMONTH1" + suffix, "([\\d]{1,2})"), // - new RegexLeaf("\\D"), // - new RegexLeaf("BDAY1" + suffix, "([\\d]{1,2})"), // + dayPattern1.toRegex(), // Words.exactly(Words.TO), // Words.zeroOrMore(Words.THE), // RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("BYEAR2" + suffix, "([\\d]{4})"), // - new RegexLeaf("\\D"), // - new RegexLeaf("BMONTH2" + suffix, "([\\d]{1,2})"), // - new RegexLeaf("\\D"), // - new RegexLeaf("BDAY2" + suffix, "([\\d]{1,2})") // + dayPattern2.toRegex() // ); } @@ -82,30 +76,19 @@ public class ComplementDates implements Something { } public Failable getMe(GanttDiagram project, RegexResult arg, String suffix) { - if (arg.get("BDAY1" + suffix, 0) != null) { - return Failable.ok(resultB(arg, suffix)); + final Day d1 = new DayPattern("1").getDay(arg); + 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)); - } + 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) { final int day1 = Integer.parseInt(arg.get("ECOUNT1" + suffix, 0)); final Day date1 = project.getStartingDate().addDays(day1); diff --git a/src/net/sourceforge/plantuml/project/lang/DayPattern.java b/src/net/sourceforge/plantuml/project/lang/DayPattern.java new file mode 100644 index 000000000..647d204d4 --- /dev/null +++ b/src/net/sourceforge/plantuml/project/lang/DayPattern.java @@ -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); + } + +} diff --git a/src/net/sourceforge/plantuml/project/lang/SentenceIsDisplayedAs.java b/src/net/sourceforge/plantuml/project/lang/SentenceIsDisplayedAs.java new file mode 100644 index 000000000..78de0f2b3 --- /dev/null +++ b/src/net/sourceforge/plantuml/project/lang/SentenceIsDisplayedAs.java @@ -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(); + } + +} diff --git a/src/net/sourceforge/plantuml/project/lang/SubjectDayAsDate.java b/src/net/sourceforge/plantuml/project/lang/SubjectDayAsDate.java index 9394b889e..473218921 100644 --- a/src/net/sourceforge/plantuml/project/lang/SubjectDayAsDate.java +++ b/src/net/sourceforge/plantuml/project/lang/SubjectDayAsDate.java @@ -138,12 +138,7 @@ public class SubjectDayAsDate implements Subject { } private IRegex toRegexB() { - return new RegexConcat( // - new RegexLeaf("BYEAR", "([\\d]{4})"), // - new RegexLeaf("\\D"), // - new RegexLeaf("BMONTH", "([\\d]{1,2})"), // - new RegexLeaf("\\D"), // - new RegexLeaf("BDAY", "([\\d]{1,2})")); + return TimeResolution.toRegexB_YYYY_MM_DD("BYEAR", "BMONTH", "BDAY"); } private IRegex toRegexE() { diff --git a/src/net/sourceforge/plantuml/project/lang/SubjectDaysAsDates.java b/src/net/sourceforge/plantuml/project/lang/SubjectDaysAsDates.java index e3f48196f..99680e27b 100644 --- a/src/net/sourceforge/plantuml/project/lang/SubjectDaysAsDates.java +++ b/src/net/sourceforge/plantuml/project/lang/SubjectDaysAsDates.java @@ -63,19 +63,10 @@ public class SubjectDaysAsDates implements Subject { private IRegex toRegexB() { return new RegexConcat( // - new RegexLeaf("BYEAR1", "([\\d]{4})"), // - new RegexLeaf("\\D"), // - new RegexLeaf("BMONTH1", "([\\d]{1,2})"), // - new RegexLeaf("\\D"), // - new RegexLeaf("BDAY1", "([\\d]{1,2})"), // + TimeResolution.toRegexB_YYYY_MM_DD("BYEAR1", "BMONTH1", "BDAY1"), // + Words.exactly(Words.TO), // RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("to"), // - 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})") // + TimeResolution.toRegexB_YYYY_MM_DD("BYEAR2", "BMONTH2", "BDAY2") // ); } @@ -83,8 +74,7 @@ public class SubjectDaysAsDates implements Subject { return new RegexConcat( // new RegexLeaf("[dD]\\+"), // new RegexLeaf("ECOUNT1", "([\\d]+)"), // - RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("to"), // + Words.exactly(Words.TO), // RegexLeaf.spaceOneOrMore(), // new RegexLeaf("[dD]\\+"), // new RegexLeaf("ECOUNT2", "([\\d]+)") // @@ -93,13 +83,8 @@ public class SubjectDaysAsDates implements Subject { private IRegex andRegex() { return new RegexConcat( // - new RegexLeaf("BYEAR3", "([\\d]{4})"), // - new RegexLeaf("\\D"), // - new RegexLeaf("BMONTH3", "([\\d]{1,2})"), // - new RegexLeaf("\\D"), // - new RegexLeaf("BDAY3", "([\\d]{1,2})"), // - RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("and"), // + TimeResolution.toRegexB_YYYY_MM_DD("BYEAR3", "BMONTH3", "BDAY3"), // + Words.exactly(Words.AND), // RegexLeaf.spaceOneOrMore(), // new RegexLeaf("COUNT_AND", "([\\d]+)"), // RegexLeaf.spaceOneOrMore(), // diff --git a/src/net/sourceforge/plantuml/project/lang/SubjectTask.java b/src/net/sourceforge/plantuml/project/lang/SubjectTask.java index 279f4ecf8..da31a4542 100644 --- a/src/net/sourceforge/plantuml/project/lang/SubjectTask.java +++ b/src/net/sourceforge/plantuml/project/lang/SubjectTask.java @@ -96,7 +96,7 @@ public class SubjectTask implements Subject { new SentenceTaskEndsAbsolute(), new SentenceIsColored(), new SentenceIsColoredForCompletion(), new SentenceIsDeleted(), new SentenceIsForTask(), new SentenceLinksTo(), new SentenceOccurs(), new SentenceDisplayOnSameRowAs(), new SentencePausesDate(), new SentencePausesDates(), - new SentencePausesDayOfWeek()); + new SentencePausesDayOfWeek(), new SentenceIsDisplayedAs()); } public IRegex toRegex() { @@ -106,8 +106,7 @@ public class SubjectTask implements Subject { new RegexLeaf("SUBJECT", "\\[([^\\[\\]]+?)\\](?:[%s]+as[%s]+\\[([^\\[\\]]+?)\\])?"), // new RegexOptional( // new RegexConcat( // - RegexLeaf.spaceOneOrMore(), // - new RegexLeaf("on"), // + Words.exactly(Words.ON), // RegexLeaf.spaceOneOrMore(), // new RegexLeaf("RESOURCE", "((?:\\{[^{}]+\\}[%s]*)+)") // )))); diff --git a/src/net/sourceforge/plantuml/project/lang/TimeResolution.java b/src/net/sourceforge/plantuml/project/lang/TimeResolution.java new file mode 100644 index 000000000..8d9015823 --- /dev/null +++ b/src/net/sourceforge/plantuml/project/lang/TimeResolution.java @@ -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})")); + } + +} diff --git a/src/net/sourceforge/plantuml/project/lang/Verbs.java b/src/net/sourceforge/plantuml/project/lang/Verbs.java index 5b7ed01e5..107a16b3f 100644 --- a/src/net/sourceforge/plantuml/project/lang/Verbs.java +++ b/src/net/sourceforge/plantuml/project/lang/Verbs.java @@ -48,6 +48,7 @@ public class Verbs { public static IRegex is = new RegexLeaf("is"); public static IRegex isColored = new RegexLeaf("is[%s]+colou?red"); 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 isOn = new RegexLeaf("is[%s]+on"); public static IRegex isOrAre = new RegexLeaf("(is|are)"); diff --git a/src/net/sourceforge/plantuml/project/lang/Words.java b/src/net/sourceforge/plantuml/project/lang/Words.java index 9d30ddd85..e3239c218 100644 --- a/src/net/sourceforge/plantuml/project/lang/Words.java +++ b/src/net/sourceforge/plantuml/project/lang/Words.java @@ -44,6 +44,7 @@ import net.sourceforge.plantuml.regex.RegexRepeatedZeroOrMore; public class Words { public final static String AFTER = "after"; + public final static String AND = "and"; public final static String AT = "at"; public final static String BEFORE = "before"; public final static String COMPLETION = "completion"; diff --git a/src/net/sourceforge/plantuml/project/timescale/TimeScaleCompressed.java b/src/net/sourceforge/plantuml/project/timescale/TimeScaleCompressed.java index 1f0ea9a3d..31cc3283a 100644 --- a/src/net/sourceforge/plantuml/project/timescale/TimeScaleCompressed.java +++ b/src/net/sourceforge/plantuml/project/timescale/TimeScaleCompressed.java @@ -42,8 +42,8 @@ public class TimeScaleCompressed implements TimeScale { private final TimeScale daily; - public TimeScaleCompressed(Day calendar, double scale) { - this.daily = new TimeScaleDaily(calendar, scale, null); + public TimeScaleCompressed(double size, Day calendar, double scale) { + this.daily = new TimeScaleDaily(size, calendar, scale, null); } public double getStartingPosition(Day instant) { diff --git a/src/net/sourceforge/plantuml/project/timescale/TimeScaleDaily.java b/src/net/sourceforge/plantuml/project/timescale/TimeScaleDaily.java index dafc2e93f..acf558340 100644 --- a/src/net/sourceforge/plantuml/project/timescale/TimeScaleDaily.java +++ b/src/net/sourceforge/plantuml/project/timescale/TimeScaleDaily.java @@ -39,13 +39,13 @@ import net.sourceforge.plantuml.project.core.PrintScale; import net.sourceforge.plantuml.project.time.Day; public final class TimeScaleDaily implements TimeScale { - // ::remove folder when __HAXE__ + // ::remove folder when __HAXE__ private final TimeScaleWink basic; private final double delta; - public TimeScaleDaily(Day startingDay, double scale, Day zeroDay) { - this.basic = new TimeScaleWink(scale, PrintScale.DAILY); + public TimeScaleDaily(double size, Day startingDay, double scale, Day zeroDay) { + this.basic = new TimeScaleWink(size, scale, PrintScale.DAILY); if (zeroDay == null) this.delta = basic.getStartingPosition(startingDay); else diff --git a/src/net/sourceforge/plantuml/project/timescale/TimeScaleWink.java b/src/net/sourceforge/plantuml/project/timescale/TimeScaleWink.java index 9324097e2..d4cc0a070 100644 --- a/src/net/sourceforge/plantuml/project/timescale/TimeScaleWink.java +++ b/src/net/sourceforge/plantuml/project/timescale/TimeScaleWink.java @@ -40,17 +40,17 @@ import net.sourceforge.plantuml.project.time.Day; public class TimeScaleWink implements TimeScale { - private final double scale; + private final double cellWidth; private final PrintScale printScale; - public TimeScaleWink(double scale, PrintScale printScale) { - this.scale = 16.0 * scale; + public TimeScaleWink(double size, double scale, PrintScale printScale) { + this.cellWidth = size * scale; this.printScale = printScale; } public double getStartingPosition(Day instant) { final long wink = instant.getMillis(); - return wink * scale / Day.MILLISECONDS_PER_DAY; + return wink * cellWidth / Day.MILLISECONDS_PER_DAY; } public double getEndingPosition(Day instant) { @@ -58,7 +58,7 @@ public class TimeScaleWink implements TimeScale { } public double getWidth(Day instant) { - return scale; + return cellWidth; } public boolean isBreaking(Day instant) { diff --git a/src/net/sourceforge/plantuml/style/SName.java b/src/net/sourceforge/plantuml/style/SName.java index 96644bffe..111c7863a 100644 --- a/src/net/sourceforge/plantuml/style/SName.java +++ b/src/net/sourceforge/plantuml/style/SName.java @@ -69,6 +69,7 @@ public enum SName { constraintArrow, // control, // database, // + day, // delay, // destroy, // diamond, // @@ -100,6 +101,7 @@ public enum SName { map, // milestone, // mindmapDiagram, // + month, // network, // node, // note, // @@ -139,6 +141,7 @@ public enum SName { unstarted, // usecase, // verticalSeparator, // + year, // visibilityIcon, // private_, //