diff options
Diffstat (limited to 'src/net/sourceforge/plantuml/sequencediagram')
14 files changed, 102 insertions, 57 deletions
diff --git a/src/net/sourceforge/plantuml/sequencediagram/GroupingLeaf.java b/src/net/sourceforge/plantuml/sequencediagram/GroupingLeaf.java index 994afb5..0e8f7f0 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/GroupingLeaf.java +++ b/src/net/sourceforge/plantuml/sequencediagram/GroupingLeaf.java @@ -113,7 +113,6 @@ final public class GroupingLeaf extends Grouping implements EventWithDeactivate } public boolean addLifeEvent(LifeEvent lifeEvent) { - lifeEvent.setLinkedToGroupingEnd(true); return true; } diff --git a/src/net/sourceforge/plantuml/sequencediagram/LifeEvent.java b/src/net/sourceforge/plantuml/sequencediagram/LifeEvent.java index a887b93..131d52d 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/LifeEvent.java +++ b/src/net/sourceforge/plantuml/sequencediagram/LifeEvent.java @@ -87,10 +87,6 @@ public class LifeEvent extends AbstractEvent implements Event { return this.p == p && type == LifeEventType.DESTROY; } - // public double getStrangePos() { - // return message.getPosYendLevel(); - // } - // private AbstractMessage message; public void setMessage(AbstractMessage message) { @@ -101,14 +97,4 @@ public class LifeEvent extends AbstractEvent implements Event { return message; } - // private boolean linkedToGroupingEnd; - // - // // public boolean isLinkedToGroupingEnd() { - // // return linkedToGroupingEnd; - // // } - - public void setLinkedToGroupingEnd(boolean linkedToGroupingEnd) { - // this.linkedToGroupingEnd = linkedToGroupingEnd; - } - } diff --git a/src/net/sourceforge/plantuml/sequencediagram/command/CommandArrow.java b/src/net/sourceforge/plantuml/sequencediagram/command/CommandArrow.java index ba86a48..4f8fa0b 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/command/CommandArrow.java +++ b/src/net/sourceforge/plantuml/sequencediagram/command/CommandArrow.java @@ -152,16 +152,19 @@ public class CommandArrow extends SingleLineCommand2<SequenceDiagram> { final boolean hasDressing2 = contains(dressing2, ">", "\\", "/", "x"); final boolean hasDressing1 = contains(dressing1, "x", "<", "\\", "/"); + final boolean reverseDefine; if (hasDressing2) { p1 = getOrCreateParticipant(diagram, arg, "PART1"); p2 = getOrCreateParticipant(diagram, arg, "PART2"); circleAtStart = dressing1.contains("o"); circleAtEnd = dressing2.contains("o"); + reverseDefine = false; } else if (hasDressing1) { p2 = getOrCreateParticipant(diagram, arg, "PART1"); p1 = getOrCreateParticipant(diagram, arg, "PART2"); circleAtStart = dressing2.contains("o"); circleAtEnd = dressing1.contains("o"); + reverseDefine = true; } else { return CommandExecutionResult.error("Illegal sequence arrow"); @@ -202,11 +205,13 @@ public class CommandArrow extends SingleLineCommand2<SequenceDiagram> { } if (dressing1.contains("x")) { config = config.withHead2(ArrowHead.CROSSX); - } if (dressing2.contains("x")) { config = config.withHead2(ArrowHead.CROSSX); } + if (reverseDefine) { + config = config.reverseDefine(); + } config = applyStyle(arg.getLazzy("ARROW_STYLE", 0), config); diff --git a/src/net/sourceforge/plantuml/sequencediagram/command/CommandReturn.java b/src/net/sourceforge/plantuml/sequencediagram/command/CommandReturn.java index 961d61d..50f21da 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/command/CommandReturn.java +++ b/src/net/sourceforge/plantuml/sequencediagram/command/CommandReturn.java @@ -35,10 +35,11 @@ */ package net.sourceforge.plantuml.sequencediagram.command; -import java.util.List; - import net.sourceforge.plantuml.command.CommandExecutionResult; -import net.sourceforge.plantuml.command.SingleLineCommand; +import net.sourceforge.plantuml.command.SingleLineCommand2; +import net.sourceforge.plantuml.command.regex.RegexConcat; +import net.sourceforge.plantuml.command.regex.RegexLeaf; +import net.sourceforge.plantuml.command.regex.RegexResult; import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.sequencediagram.EventWithDeactivate; import net.sourceforge.plantuml.sequencediagram.LifeEventType; @@ -47,34 +48,48 @@ import net.sourceforge.plantuml.sequencediagram.SequenceDiagram; import net.sourceforge.plantuml.skin.ArrowBody; import net.sourceforge.plantuml.skin.ArrowConfiguration; -public class CommandReturn extends SingleLineCommand<SequenceDiagram> { +public class CommandReturn extends SingleLineCommand2<SequenceDiagram> { public CommandReturn() { - super("(?i)^return[%s]*(.*)$"); + super(getRegexConcat()); + } + + private static RegexConcat getRegexConcat() { + return new RegexConcat(new RegexLeaf("^"), // + new RegexLeaf("PARALLEL", "(&%s*)?"), // + new RegexLeaf("[%s]*"), // + new RegexLeaf("return[%s]*"), // + new RegexLeaf("MESSAGE", "(.*)"), // + new RegexLeaf("$")); } @Override - protected CommandExecutionResult executeArg(SequenceDiagram sequenceDiagram, List<String> arg) { + protected CommandExecutionResult executeArg(SequenceDiagram sequenceDiagram, RegexResult arg) { - Message message = sequenceDiagram.getActivatingMessage(); + Message message1 = sequenceDiagram.getActivatingMessage(); boolean doDeactivation = true; - if (message == null) { + if (message1 == null) { final EventWithDeactivate last = sequenceDiagram.getLastEventWithDeactivate(); if (last instanceof Message == false) { return CommandExecutionResult.error("Nowhere to return to."); } - message = (Message) last; + message1 = (Message) last; doDeactivation = false; } - final ArrowConfiguration arrow = message.getArrowConfiguration().withBody(ArrowBody.DOTTED); + final ArrowConfiguration arrow = message1.getArrowConfiguration().withBody(ArrowBody.DOTTED); - sequenceDiagram.addMessage( - new Message(message.getParticipant2(), message.getParticipant1(), Display.getWithNewlines(arg - .get(0)), arrow, sequenceDiagram.getNextMessageNumber())); + final Display display = Display.getWithNewlines(arg.get("MESSAGE", 0)); + final Message message2 = new Message(message1.getParticipant2(), message1.getParticipant1(), display, arrow, + sequenceDiagram.getNextMessageNumber()); + final boolean parallel = arg.get("PARALLEL", 0) != null; + if (parallel) { + message2.goParallel(); + } + sequenceDiagram.addMessage(message2); if (doDeactivation) { - final String error = sequenceDiagram.activate(message.getParticipant2(), LifeEventType.DEACTIVATE, null); + final String error = sequenceDiagram.activate(message1.getParticipant2(), LifeEventType.DEACTIVATE, null); if (error != null) { return CommandExecutionResult.error(error); } diff --git a/src/net/sourceforge/plantuml/sequencediagram/graphic/DrawableSet.java b/src/net/sourceforge/plantuml/sequencediagram/graphic/DrawableSet.java index 13392dc..9be36c0 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/graphic/DrawableSet.java +++ b/src/net/sourceforge/plantuml/sequencediagram/graphic/DrawableSet.java @@ -36,6 +36,7 @@ package net.sourceforge.plantuml.sequencediagram.graphic; import java.awt.geom.Dimension2D; +import java.awt.geom.Rectangle2D; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -50,7 +51,9 @@ import net.sourceforge.plantuml.ISkinParam; import net.sourceforge.plantuml.LineParam; import net.sourceforge.plantuml.SkinParamBackcolored; import net.sourceforge.plantuml.Url; +import net.sourceforge.plantuml.graphic.InnerStrategy; import net.sourceforge.plantuml.graphic.StringBounder; +import net.sourceforge.plantuml.graphic.TextBlock; import net.sourceforge.plantuml.sequencediagram.Englober; import net.sourceforge.plantuml.sequencediagram.Event; import net.sourceforge.plantuml.sequencediagram.Newpage; @@ -62,6 +65,7 @@ import net.sourceforge.plantuml.skin.ComponentType; import net.sourceforge.plantuml.skin.Context2D; import net.sourceforge.plantuml.skin.SimpleContext2D; import net.sourceforge.plantuml.skin.Skin; +import net.sourceforge.plantuml.ugraphic.MinMax; import net.sourceforge.plantuml.ugraphic.UClip; import net.sourceforge.plantuml.ugraphic.UGraphic; import net.sourceforge.plantuml.ugraphic.UStroke; @@ -244,30 +248,55 @@ public class DrawableSet { return dimension; } + TextBlock asTextBlock(final double delta, final double width, final Page page, final boolean showTail) { + return new TextBlock() { + + public void drawU(UGraphic ug) { + drawU22(ug, delta, width, page, showTail); + } + + public Dimension2D calculateDimension(StringBounder stringBounder) { + final double height = page.getHeight(); + return new Dimension2DDouble(width, height); + } + + public MinMax getMinMax(StringBounder stringBounder) { + throw new UnsupportedOperationException(); + } + + public Rectangle2D getInnerPosition(String member, StringBounder stringBounder, InnerStrategy strategy) { + throw new UnsupportedOperationException(); + } + + }; + + } + void drawU22(final UGraphic ug, final double delta, double width, Page page, boolean showTail) { - // final UGraphic ugOrig = ug; final double height = page.getHeight(); final UGraphic ugTranslated = clipAndTranslate2(delta, width, page, ug); final SimpleContext2D context = new SimpleContext2D(true); this.drawEnglobers(ug, height - MARGIN_FOR_ENGLOBERS1, context); this.drawPlaygroundU(ugTranslated, context); - // ug = ugOrig; - this.drawLineU22(ug, showTail, page); this.drawHeadTailU(ug, page, showTail ? height - getTailHeight(ug.getStringBounder(), true) : 0); - // ug = clipAndTranslate2(delta, width, page, ug); this.drawPlaygroundU(ugTranslated, new SimpleContext2D(false)); } private UGraphic clipAndTranslate2(final double delta, double width, Page p, UGraphic ug) { ug = ug.apply(new UClip(0, p.getBodyRelativePosition(), width, p.getBodyHeight() + 1)); + ug = ug.apply(getTranslate4(delta)); + return ug; + } + + private UTranslate getTranslate4(final double delta) { if (delta > 0) { - ug = ug.apply(new UTranslate(0, -delta)); + return new UTranslate(0, -delta); } - return ug; + return new UTranslate(); } private void drawLineU22(UGraphic ug, boolean showTail, Page page) { diff --git a/src/net/sourceforge/plantuml/sequencediagram/graphic/DrawableSetInitializer.java b/src/net/sourceforge/plantuml/sequencediagram/graphic/DrawableSetInitializer.java index af988a9..822d889 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/graphic/DrawableSetInitializer.java +++ b/src/net/sourceforge/plantuml/sequencediagram/graphic/DrawableSetInitializer.java @@ -626,7 +626,7 @@ class DrawableSetInitializer { drawableSet.getSkinParam(), null); final LifeLine lifeLine = new LifeLine(box, comp.getPreferredWidth(stringBounder), drawableSet.getSkinParam() - .shadowing()); + .shadowing(p.getStereotype())); drawableSet.setLivingParticipantBox(p, new LivingParticipantBox(box, lifeLine)); this.freeX = box.getMaxX(stringBounder); diff --git a/src/net/sourceforge/plantuml/sequencediagram/graphic/SequenceDiagramFileMakerPuma2.java b/src/net/sourceforge/plantuml/sequencediagram/graphic/SequenceDiagramFileMakerPuma2.java index 80dc784..e4e4b13 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/graphic/SequenceDiagramFileMakerPuma2.java +++ b/src/net/sourceforge/plantuml/sequencediagram/graphic/SequenceDiagramFileMakerPuma2.java @@ -147,7 +147,8 @@ public class SequenceDiagramFileMakerPuma2 implements FileMaker { final SequenceDiagramArea area = new SequenceDiagramArea(fullDimension.getWidth(), page.getHeight()); final TextBlock compTitle; - final TextBlock caption = new AnnotatedWorker(diagram, diagram.getSkinParam()).getCaption(); + final AnnotatedWorker annotatedWorker = new AnnotatedWorker(diagram, diagram.getSkinParam(), stringBounder); + final TextBlock caption = annotatedWorker.getCaption(); area.setCaptionArea(caption.calculateDimension(stringBounder)); if (Display.isNull(page.getTitle())) { @@ -211,8 +212,12 @@ public class SequenceDiagramFileMakerPuma2 implements FileMaker { if (legendTop) { sequenceAreaY += legendBlock.calculateDimension(ug.getStringBounder()).getHeight(); } - drawableSet.drawU22(ug.apply(new UTranslate(area.getSequenceAreaX() + delta1 / 2, sequenceAreaY)), - delta, fullDimension.getWidth(), page, diagram.isShowFootbox()); + final UTranslate forCore = new UTranslate(area.getSequenceAreaX() + delta1 / 2, sequenceAreaY); + TextBlock core = drawableSet.asTextBlock(delta, fullDimension.getWidth(), page, diagram.isShowFootbox()); + core = annotatedWorker.addFrame(core); + core.drawU(ug.apply(forCore)); + // drawableSet.drawU22(ug.apply(forCore), delta, fullDimension.getWidth(), page, + // diagram.isShowFootbox()); drawHeader(area, ug, index); drawFooter(area, ug, index); diff --git a/src/net/sourceforge/plantuml/sequencediagram/teoz/CommunicationExoTile.java b/src/net/sourceforge/plantuml/sequencediagram/teoz/CommunicationExoTile.java index fd168d6..2f8569d 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/teoz/CommunicationExoTile.java +++ b/src/net/sourceforge/plantuml/sequencediagram/teoz/CommunicationExoTile.java @@ -82,7 +82,7 @@ public class CommunicationExoTile implements TileWithUpdateStairs { arrowConfiguration = arrowConfiguration.reverse(); } final Component comp = skin.createComponent(ComponentType.ARROW, arrowConfiguration, skinParam, - message.getLabel()); + message.getLabelNumbered()); return comp; } diff --git a/src/net/sourceforge/plantuml/sequencediagram/teoz/CommunicationTileSelf.java b/src/net/sourceforge/plantuml/sequencediagram/teoz/CommunicationTileSelf.java index 894feb6..8a0b0b8 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/teoz/CommunicationTileSelf.java +++ b/src/net/sourceforge/plantuml/sequencediagram/teoz/CommunicationTileSelf.java @@ -40,6 +40,7 @@ import java.awt.geom.Point2D; import java.util.Iterator; import net.sourceforge.plantuml.ISkinParam; +import net.sourceforge.plantuml.Log; import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.real.Real; import net.sourceforge.plantuml.sequencediagram.Event; @@ -101,10 +102,10 @@ public class CommunicationTileSelf implements TileWithUpdateStairs { if (message.isActivate()) { livingSpace1.addStepForLivebox(getEvent(), y + p2.getY()); - System.err.println("CommunicationTileSelf::updateStairs activate y=" + (y + p2.getY()) + " " + message); + Log.info("CommunicationTileSelf::updateStairs activate y=" + (y + p2.getY()) + " " + message); } else if (message.isDeactivate()) { livingSpace1.addStepForLivebox(getEvent(), y + p1.getY()); - System.err.println("CommunicationTileSelf::updateStairs deactivate y=" + (y + p1.getY()) + " " + message); + Log.info("CommunicationTileSelf::updateStairs deactivate y=" + (y + p1.getY()) + " " + message); } // livingSpace1.addStep(y + arrowY, level1); @@ -121,8 +122,7 @@ public class CommunicationTileSelf implements TileWithUpdateStairs { double x1 = getPoint1(stringBounder).getCurrentValue(); final int levelIgnore = livingSpace1.getLevelAt(this, EventsHistoryMode.IGNORE_FUTURE_ACTIVATE); final int levelConsidere = livingSpace1.getLevelAt(this, EventsHistoryMode.CONSIDERE_FUTURE_DEACTIVATE); - System.err.println("CommunicationTileSelf::drawU levelIgnore=" + levelIgnore + " levelConsidere=" - + levelConsidere); + Log.info("CommunicationTileSelf::drawU levelIgnore=" + levelIgnore + " levelConsidere=" + levelConsidere); x1 += CommunicationTile.LIVE_DELTA_SIZE * levelIgnore; if (levelIgnore < levelConsidere) { x1 += CommunicationTile.LIVE_DELTA_SIZE; diff --git a/src/net/sourceforge/plantuml/sequencediagram/teoz/EmptyTile.java b/src/net/sourceforge/plantuml/sequencediagram/teoz/EmptyTile.java index adb8779..a377aac 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/teoz/EmptyTile.java +++ b/src/net/sourceforge/plantuml/sequencediagram/teoz/EmptyTile.java @@ -45,12 +45,11 @@ import net.sourceforge.plantuml.ugraphic.UGraphic; public class EmptyTile implements Tile { private final double height; + private final Tile position; - private final Real origin; - - public EmptyTile(double height, TileArguments tileArguments) { - this.origin = tileArguments.getOrigin(); + public EmptyTile(double height, Tile position) { this.height = height; + this.position = position; } public void drawU(UGraphic ug) { @@ -64,11 +63,11 @@ public class EmptyTile implements Tile { } public Real getMinX(StringBounder stringBounder) { - return origin; + return position.getMinX(stringBounder); } public Real getMaxX(StringBounder stringBounder) { - return origin; + return position.getMaxX(stringBounder); } public Event getEvent() { diff --git a/src/net/sourceforge/plantuml/sequencediagram/teoz/EventsHistory.java b/src/net/sourceforge/plantuml/sequencediagram/teoz/EventsHistory.java index 887f604..5bae2e1 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/teoz/EventsHistory.java +++ b/src/net/sourceforge/plantuml/sequencediagram/teoz/EventsHistory.java @@ -135,6 +135,12 @@ public class EventsHistory { } private SymbolContext getActivateColor(Event event) { + if (event instanceof LifeEvent) { + final LifeEvent le = (LifeEvent) event; + if (le.isActivate()) { + return le.getSpecificColors(); + } + } for (Iterator<Event> it = events.iterator(); it.hasNext();) { final Event current = it.next(); if (event != current) { diff --git a/src/net/sourceforge/plantuml/sequencediagram/teoz/LiveBoxFinder.java b/src/net/sourceforge/plantuml/sequencediagram/teoz/LiveBoxFinder.java index c1ba862..1644fb4 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/teoz/LiveBoxFinder.java +++ b/src/net/sourceforge/plantuml/sequencediagram/teoz/LiveBoxFinder.java @@ -112,7 +112,7 @@ public class LiveBoxFinder implements UGraphic { } else if (shape instanceof NotesTile) { // Nothing ? } else if (shape instanceof Tile) { - Log.error("OtherTile " + shape); + Log.info("OtherTile " + shape); } else { throw new UnsupportedOperationException(shape.getClass().getName()); } diff --git a/src/net/sourceforge/plantuml/sequencediagram/teoz/SequenceDiagramFileMakerTeoz.java b/src/net/sourceforge/plantuml/sequencediagram/teoz/SequenceDiagramFileMakerTeoz.java index b3edc67..4f2b360 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/teoz/SequenceDiagramFileMakerTeoz.java +++ b/src/net/sourceforge/plantuml/sequencediagram/teoz/SequenceDiagramFileMakerTeoz.java @@ -84,7 +84,7 @@ public class SequenceDiagramFileMakerTeoz implements FileMaker { this.skin = skin; this.footer = getFooterOrHeader(FontParam.FOOTER); this.header = getFooterOrHeader(FontParam.HEADER); - this.annotatedWorker = new AnnotatedWorker(sequenceDiagram, sequenceDiagram.getSkinParam()); + this.annotatedWorker = new AnnotatedWorker(sequenceDiagram, sequenceDiagram.getSkinParam(), stringBounder); this.main = new MainTileAdapter(createMainTile()); this.min1 = ((MainTileAdapter) main).getMinX(stringBounder); diff --git a/src/net/sourceforge/plantuml/sequencediagram/teoz/TileBuilder.java b/src/net/sourceforge/plantuml/sequencediagram/teoz/TileBuilder.java index 86d8c94..c5a0b1d 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/teoz/TileBuilder.java +++ b/src/net/sourceforge/plantuml/sequencediagram/teoz/TileBuilder.java @@ -139,10 +139,11 @@ public class TileBuilder { tiles.add(new DividerTile(divider, tileArguments)); } else if (ev instanceof GroupingStart) { final GroupingStart start = (GroupingStart) ev; - tiles.add(new EmptyTile(4, tileArguments)); - tiles.add(new GroupingTile(it, start, tileArguments.withBackColorGeneral(start.getBackColorElement(), - start.getBackColorGeneral()), tileArguments)); - tiles.add(new EmptyTile(4, tileArguments)); + final GroupingTile groupingTile = new GroupingTile(it, start, tileArguments.withBackColorGeneral( + start.getBackColorElement(), start.getBackColorGeneral()), tileArguments); + tiles.add(new EmptyTile(4, groupingTile)); + tiles.add(groupingTile); + tiles.add(new EmptyTile(4, groupingTile)); // tiles.add(TileUtils.withMargin(tile, 0, 0, 4, 4); } else if (ev instanceof GroupingLeaf && ((GroupingLeaf) ev).getType() == GroupingType.ELSE) { final GroupingLeaf anElse = (GroupingLeaf) ev; |