1
0
mirror of https://github.com/octoleo/plantuml.git synced 2024-12-23 11:29:06 +00:00

Bug fixes

This commit is contained in:
Arnaud Roques 2021-03-12 19:16:16 +01:00
parent 1fb75b1b0e
commit 28f253d992
40 changed files with 383 additions and 617 deletions

View File

@ -78,9 +78,8 @@ public class LifeEvent extends AbstractEvent implements Event {
return type == LifeEventType.DEACTIVATE || type == LifeEventType.DESTROY; return type == LifeEventType.DEACTIVATE || type == LifeEventType.DESTROY;
} }
@Deprecated public boolean isDeactivate() {
public boolean isDestroy() { return type == LifeEventType.DEACTIVATE;
return type == LifeEventType.DESTROY;
} }
public boolean isDestroy(Participant p) { public boolean isDestroy(Participant p) {

View File

@ -44,9 +44,9 @@ import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.FontConfiguration;
import net.sourceforge.plantuml.graphic.HorizontalAlignment; import net.sourceforge.plantuml.graphic.HorizontalAlignment;
import net.sourceforge.plantuml.graphic.Rainbow; import net.sourceforge.plantuml.graphic.Rainbow;
import net.sourceforge.plantuml.graphic.StringBounder;
import net.sourceforge.plantuml.graphic.TextBlock; import net.sourceforge.plantuml.graphic.TextBlock;
import net.sourceforge.plantuml.sequencediagram.teoz.YPositionedTile; import net.sourceforge.plantuml.sequencediagram.teoz.CommonTile;
import net.sourceforge.plantuml.sequencediagram.teoz.Tile;
import net.sourceforge.plantuml.skin.rose.Rose; import net.sourceforge.plantuml.skin.rose.Rose;
import net.sourceforge.plantuml.ugraphic.UGraphic; import net.sourceforge.plantuml.ugraphic.UGraphic;
import net.sourceforge.plantuml.ugraphic.color.HColor; import net.sourceforge.plantuml.ugraphic.color.HColor;
@ -80,10 +80,10 @@ public class LinkAnchor {
return message; return message;
} }
public void drawAnchor(UGraphic ug, YPositionedTile tile1, YPositionedTile tile2, ISkinParam param) { public void drawAnchor(UGraphic ug, CommonTile tile1, CommonTile tile2, ISkinParam param) {
final double y1 = tile1.getY(); final double y1 = tile1.getY() + tile1.getContactPointRelative();
final double y2 = tile2.getY(); final double y2 = tile2.getY() + tile2.getContactPointRelative();
final double xx1 = tile1.getMiddleX(); final double xx1 = tile1.getMiddleX();
final double xx2 = tile2.getMiddleX(); final double xx2 = tile2.getMiddleX();
final double x = (xx1 + xx2) / 2; final double x = (xx1 + xx2) / 2;
@ -96,8 +96,8 @@ public class LinkAnchor {
final Display display = Display.getWithNewlines(message); final Display display = Display.getWithNewlines(message);
final TextBlock title = display.create(new FontConfiguration(param, FontParam.ARROW, null), final TextBlock title = display.create(new FontConfiguration(param, FontParam.ARROW, null),
HorizontalAlignment.CENTER, param); HorizontalAlignment.CENTER, param);
final Snake snake = Snake.create(Arrows.asToUp(), rainbow, Arrows.asToDown()) final Snake snake = Snake.create(Arrows.asToUp(), rainbow, Arrows.asToDown()).withLabel(title,
.withLabel(title, HorizontalAlignment.CENTER); HorizontalAlignment.CENTER);
snake.addPoint(x, ymin + 2); snake.addPoint(x, ymin + 2);
snake.addPoint(x, ymax - 2); snake.addPoint(x, ymax - 2);

View File

@ -55,7 +55,7 @@ public abstract class AbstractTile extends CommonTile implements Tile {
return result; return result;
} }
public boolean matchAnchorV1(String anchor) { public boolean matchAnchor(String anchor) {
final Event event = this.getEvent(); final Event event = this.getEvent();
if (event instanceof AbstractMessage) { if (event instanceof AbstractMessage) {
final AbstractMessage msg = (AbstractMessage) event; final AbstractMessage msg = (AbstractMessage) event;

View File

@ -36,24 +36,37 @@
package net.sourceforge.plantuml.sequencediagram.teoz; package net.sourceforge.plantuml.sequencediagram.teoz;
import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.StringBounder;
import net.sourceforge.plantuml.graphic.UDrawable;
public abstract class CommonTile implements Tile { public abstract class CommonTile implements Tile, UDrawable {
private final StringBounder stringBounder; private final StringBounder stringBounder;
private double y = -1;
public CommonTile(StringBounder stringBounder) { public CommonTile(StringBounder stringBounder) {
this.stringBounder = stringBounder; this.stringBounder = stringBounder;
} }
final public void callbackY(double y) { final public void callbackY(double y) {
this.y = y;
callbackY_internal(y); callbackY_internal(y);
} }
public void callbackY_internal(double y) { protected void callbackY_internal(double y) {
} }
protected final StringBounder getStringBounder() { protected final StringBounder getStringBounder() {
return stringBounder; return stringBounder;
} }
final public double getMiddleX() {
final double max = getMaxX().getCurrentValue();
final double min = getMinX().getCurrentValue();
return (min + max) / 2;
}
public final double getY() {
return y;
}
} }

View File

@ -167,7 +167,7 @@ public class CommunicationExoTile extends AbstractTile {
} }
@Override @Override
public void callbackY_internal(double y) { final protected void callbackY_internal(double y) {
final ArrowComponent comp = getComponent(getStringBounder()); final ArrowComponent comp = getComponent(getStringBounder());
final Dimension2D dim = comp.getPreferredDimension(getStringBounder()); final Dimension2D dim = comp.getPreferredDimension(getStringBounder());
final double arrowY = comp.getStartPoint(getStringBounder(), dim).getY(); final double arrowY = comp.getStartPoint(getStringBounder(), dim).getY();

View File

@ -141,7 +141,7 @@ public class CommunicationTile extends AbstractTile {
public static final double LIVE_DELTA_SIZE = 5; public static final double LIVE_DELTA_SIZE = 5;
@Override @Override
public void callbackY_internal(double y) { final protected void callbackY_internal(double y) {
if (message.isCreate()) { if (message.isCreate()) {
livingSpace2.goCreate(y); livingSpace2.goCreate(y);
} }

View File

@ -40,6 +40,7 @@ import java.awt.geom.Dimension2D;
import net.sourceforge.plantuml.ColorParam; import net.sourceforge.plantuml.ColorParam;
import net.sourceforge.plantuml.ISkinParam; import net.sourceforge.plantuml.ISkinParam;
import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.StringBounder;
import net.sourceforge.plantuml.graphic.UDrawable;
import net.sourceforge.plantuml.real.Real; import net.sourceforge.plantuml.real.Real;
import net.sourceforge.plantuml.sequencediagram.AbstractMessage; import net.sourceforge.plantuml.sequencediagram.AbstractMessage;
import net.sourceforge.plantuml.sequencediagram.Event; import net.sourceforge.plantuml.sequencediagram.Event;
@ -83,7 +84,7 @@ public class CommunicationTileNoteBottom extends AbstractTile {
} }
@Override @Override
public void callbackY_internal(double y) { final protected void callbackY_internal(double y) {
tile.callbackY(y); tile.callbackY(y);
} }
@ -103,7 +104,7 @@ public class CommunicationTileNoteBottom extends AbstractTile {
final Component comp = getComponent(stringBounder); final Component comp = getComponent(stringBounder);
final Dimension2D dim = comp.getPreferredDimension(stringBounder); final Dimension2D dim = comp.getPreferredDimension(stringBounder);
final Area area = new Area(dim.getWidth(), dim.getHeight()); final Area area = new Area(dim.getWidth(), dim.getHeight());
tile.drawU(ug); ((UDrawable) tile).drawU(ug);
final double middleMsg = (tile.getMinX().getCurrentValue() + tile.getMaxX().getCurrentValue()) / 2; final double middleMsg = (tile.getMinX().getCurrentValue() + tile.getMaxX().getCurrentValue()) / 2;

View File

@ -39,6 +39,7 @@ import java.awt.geom.Dimension2D;
import net.sourceforge.plantuml.ISkinParam; import net.sourceforge.plantuml.ISkinParam;
import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.StringBounder;
import net.sourceforge.plantuml.graphic.UDrawable;
import net.sourceforge.plantuml.real.Real; import net.sourceforge.plantuml.real.Real;
import net.sourceforge.plantuml.sequencediagram.AbstractMessage; import net.sourceforge.plantuml.sequencediagram.AbstractMessage;
import net.sourceforge.plantuml.sequencediagram.Event; import net.sourceforge.plantuml.sequencediagram.Event;
@ -81,7 +82,7 @@ public class CommunicationTileNoteLeft extends AbstractTile {
} }
@Override @Override
public void callbackY_internal(double y) { final protected void callbackY_internal(double y) {
tile.callbackY(y); tile.callbackY(y);
} }
@ -102,7 +103,7 @@ public class CommunicationTileNoteLeft extends AbstractTile {
final Component comp = getComponent(stringBounder); final Component comp = getComponent(stringBounder);
final Dimension2D dim = comp.getPreferredDimension(stringBounder); final Dimension2D dim = comp.getPreferredDimension(stringBounder);
final Area area = new Area(dim.getWidth(), dim.getHeight()); final Area area = new Area(dim.getWidth(), dim.getHeight());
tile.drawU(ug); ((UDrawable) tile).drawU(ug);
final Real p = getNotePosition(stringBounder); final Real p = getNotePosition(stringBounder);
comp.drawU(ug.apply(UTranslate.dx(p.getCurrentValue())), area, (Context2D) ug); comp.drawU(ug.apply(UTranslate.dx(p.getCurrentValue())), area, (Context2D) ug);

View File

@ -39,6 +39,7 @@ import java.awt.geom.Dimension2D;
import net.sourceforge.plantuml.ISkinParam; import net.sourceforge.plantuml.ISkinParam;
import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.StringBounder;
import net.sourceforge.plantuml.graphic.UDrawable;
import net.sourceforge.plantuml.real.Real; import net.sourceforge.plantuml.real.Real;
import net.sourceforge.plantuml.sequencediagram.AbstractMessage; import net.sourceforge.plantuml.sequencediagram.AbstractMessage;
import net.sourceforge.plantuml.sequencediagram.Event; import net.sourceforge.plantuml.sequencediagram.Event;
@ -85,7 +86,7 @@ public class CommunicationTileNoteRight extends AbstractTile {
} }
@Override @Override
public void callbackY_internal(double y) { final protected void callbackY_internal(double y) {
tile.callbackY(y); tile.callbackY(y);
} }
@ -110,7 +111,7 @@ public class CommunicationTileNoteRight extends AbstractTile {
final Component comp = getComponent(stringBounder); final Component comp = getComponent(stringBounder);
final Dimension2D dim = comp.getPreferredDimension(stringBounder); final Dimension2D dim = comp.getPreferredDimension(stringBounder);
final Area area = new Area(dim.getWidth(), dim.getHeight()); final Area area = new Area(dim.getWidth(), dim.getHeight());
tile.drawU(ug); ((UDrawable) tile).drawU(ug);
final Real p = getNotePosition(stringBounder); final Real p = getNotePosition(stringBounder);
comp.drawU(ug.apply(UTranslate.dx(p.getCurrentValue())), area, (Context2D) ug); comp.drawU(ug.apply(UTranslate.dx(p.getCurrentValue())), area, (Context2D) ug);

View File

@ -40,6 +40,7 @@ import java.awt.geom.Dimension2D;
import net.sourceforge.plantuml.ColorParam; import net.sourceforge.plantuml.ColorParam;
import net.sourceforge.plantuml.ISkinParam; import net.sourceforge.plantuml.ISkinParam;
import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.StringBounder;
import net.sourceforge.plantuml.graphic.UDrawable;
import net.sourceforge.plantuml.real.Real; import net.sourceforge.plantuml.real.Real;
import net.sourceforge.plantuml.sequencediagram.AbstractMessage; import net.sourceforge.plantuml.sequencediagram.AbstractMessage;
import net.sourceforge.plantuml.sequencediagram.Event; import net.sourceforge.plantuml.sequencediagram.Event;
@ -83,7 +84,7 @@ public class CommunicationTileNoteTop extends AbstractTile {
} }
@Override @Override
public void callbackY_internal(double y) { final protected void callbackY_internal(double y) {
tile.callbackY(y); tile.callbackY(y);
} }
@ -104,7 +105,7 @@ public class CommunicationTileNoteTop extends AbstractTile {
final Dimension2D dim = comp.getPreferredDimension(stringBounder); final Dimension2D dim = comp.getPreferredDimension(stringBounder);
final Area area = new Area(dim.getWidth(), dim.getHeight()); final Area area = new Area(dim.getWidth(), dim.getHeight());
tile.drawU(ug.apply(UTranslate.dy(dim.getHeight() + spacey))); ((UDrawable) tile).drawU(ug.apply(UTranslate.dy(dim.getHeight() + spacey)));
final double middleMsg = (tile.getMinX().getCurrentValue() + tile.getMaxX().getCurrentValue()) / 2; final double middleMsg = (tile.getMinX().getCurrentValue() + tile.getMaxX().getCurrentValue()) / 2;

View File

@ -100,7 +100,7 @@ public class CommunicationTileSelf extends AbstractTile {
} }
@Override @Override
public void callbackY_internal(double y) { final protected void callbackY_internal(double y) {
final ArrowComponent comp = getComponent(getStringBounder()); final ArrowComponent comp = getComponent(getStringBounder());
final Dimension2D dim = comp.getPreferredDimension(getStringBounder()); final Dimension2D dim = comp.getPreferredDimension(getStringBounder());
final Point2D p1 = comp.getStartPoint(getStringBounder(), dim); final Point2D p1 = comp.getStartPoint(getStringBounder(), dim);

View File

@ -79,7 +79,7 @@ public class CommunicationTileSelfNoteRight extends AbstractTile {
} }
@Override @Override
public void callbackY_internal(double y) { final protected void callbackY_internal(double y) {
tile.callbackY(y); tile.callbackY(y);
} }

View File

@ -56,17 +56,11 @@ public class DelayTile extends AbstractTile implements Tile {
// private Real first; // private Real first;
// private Real last; // private Real last;
private Real middle; private Real middle;
private double y;
public Event getEvent() { public Event getEvent() {
return delay; return delay;
} }
@Override
public void callbackY_internal(double y) {
this.y = y;
}
public DelayTile(Delay delay, TileArguments tileArguments) { public DelayTile(Delay delay, TileArguments tileArguments) {
super(tileArguments.getStringBounder()); super(tileArguments.getStringBounder());
this.delay = delay; this.delay = delay;
@ -102,7 +96,7 @@ public class DelayTile extends AbstractTile implements Tile {
final Component comp = getComponent(stringBounder); final Component comp = getComponent(stringBounder);
final Dimension2D dim = comp.getPreferredDimension(stringBounder); final Dimension2D dim = comp.getPreferredDimension(stringBounder);
final Area area = new Area(getPreferredWidth(stringBounder), dim.getHeight()); final Area area = new Area(getPreferredWidth(stringBounder), dim.getHeight());
tileArguments.getLivingSpaces().delayOn(y, dim.getHeight()); tileArguments.getLivingSpaces().delayOn(getY(), dim.getHeight());
ug = ug.apply(UTranslate.dx(getMinX().getCurrentValue())); ug = ug.apply(UTranslate.dx(getMinX().getCurrentValue()));
comp.drawU(ug, area, (Context2D) ug); comp.drawU(ug, area, (Context2D) ug);

View File

@ -130,15 +130,4 @@ public class ElseTile extends AbstractTile {
return getMinX().addFixed(dim.getWidth()); return getMinX().addFixed(dim.getWidth());
} }
private double y;
@Override
public void callbackY_internal(double y) {
this.y = y;
}
public double getCallbackY() {
return y;
}
} }

View File

@ -1,222 +0,0 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2020, Arnaud Roques
*
* Project Info: http://plantuml.com
*
* If you like this project or if you find it useful, you can support us at:
*
* http://plantuml.com/patreon (only 1$ per month!)
* http://plantuml.com/paypal
*
* This file is part of PlantUML.
*
* PlantUML is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* PlantUML distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
* License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
*
* Original Author: Arnaud Roques
*
*
*/
package net.sourceforge.plantuml.sequencediagram.teoz;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import net.sourceforge.plantuml.graphic.SymbolContext;
import net.sourceforge.plantuml.sequencediagram.AbstractMessage;
import net.sourceforge.plantuml.sequencediagram.Event;
import net.sourceforge.plantuml.sequencediagram.LifeEvent;
import net.sourceforge.plantuml.sequencediagram.Message;
import net.sourceforge.plantuml.sequencediagram.Note;
import net.sourceforge.plantuml.sequencediagram.Participant;
public class EventsHistory {
private final Participant p;
private final List<Event> events;
private final Map<Event, Double> ys3 = new HashMap<Event, Double>();
public EventsHistory(Participant p, List<Event> events) {
this.p = p;
this.events = events;
}
public void addStepForLivebox(Event event, double y) {
ys3.put(event, y);
}
public Participant getParticipant() {
return p;
}
public int getLevelAt(Event event, EventsHistoryMode mode) {
final int result = getLevelAtInternal(event, mode);
// System.err.println("EventsHistory::getLevelAt " + mode + " " + result + " " +
// event);
return result;
}
private int getLevelAtInternal(Event event, EventsHistoryMode mode) {
int level = 0; // p.getInitialLife();
// System.err.println("--->EventsHistory for " + p + " " + event);
for (Iterator<Event> it = events.iterator(); it.hasNext();) {
final Event current = it.next();
if (current instanceof LifeEvent) {
final LifeEvent le = (LifeEvent) current;
if (le.getParticipant() == p && le.isActivate()) {
level++;
}
if (le.getParticipant() == p && le.isDeactivateOrDestroy()) {
level--;
}
}
if (event == current) {
if (current instanceof AbstractMessage) {
final Event next = nextButSkippingNotes(it);
if (next instanceof LifeEvent) {
final LifeEvent le = (LifeEvent) next;
final AbstractMessage msg = (AbstractMessage) current;
if (mode != EventsHistoryMode.IGNORE_FUTURE_ACTIVATE && le.isActivate() && msg.dealWith(p)
&& le.getParticipant() == p) {
level++;
}
if (mode == EventsHistoryMode.CONSIDERE_FUTURE_DEACTIVATE && le.isDeactivateOrDestroy()
&& msg.dealWith(p) && le.getParticipant() == p) {
level--;
}
// System.err.println("Warning, this is message " + current + " next=" + next);
}
}
if (level < 0) {
return 0;
}
// System.err.println("<-result1 is " + level);
return level;
}
}
throw new IllegalArgumentException();
// return level;
}
private boolean isNextEventADestroy(Event event) {
for (Iterator<Event> it = events.iterator(); it.hasNext();) {
final Event current = it.next();
if (event != current) {
continue;
}
if (current instanceof Message) {
final Event next = nextButSkippingNotes(it);
if (next instanceof LifeEvent) {
final LifeEvent le = (LifeEvent) next;
return le.isDestroy(p);
}
}
return false;
}
return false;
}
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) {
continue;
}
if (current instanceof Message) {
final Event next = nextButSkippingNotes(it);
if (next instanceof LifeEvent) {
final LifeEvent le = (LifeEvent) next;
if (le.isActivate()) {
return le.getSpecificColors();
}
return null;
}
}
return null;
}
return null;
}
private Event nextButSkippingNotes(Iterator<Event> it) {
while (true) {
if (it.hasNext() == false) {
return null;
}
final Event next = it.next();
if (next instanceof Note) {
continue;
}
// System.err.println("nextButSkippingNotes=" + next);
return next;
}
}
public Stairs2 getStairs(double createY, double totalHeight) {
// System.err.println("EventsHistory::getStairs totalHeight=" + totalHeight);
final Stairs2 result = new Stairs2();
int value = 0;
for (Event event : events) {
final Double position = ys3.get(event);
// System.err.println("EventsHistory::getStairs event=" + event + " position=" +
// position);
if (position != null) {
assert position <= totalHeight : "position=" + position + " totalHeight=" + totalHeight;
value = getLevelAt(event, EventsHistoryMode.CONSIDERE_FUTURE_DEACTIVATE);
final SymbolContext activateColor = getActivateColor(event);
result.addStep(new StairsPosition(Math.max(createY, position), isNextEventADestroy(event)), value,
activateColor);
}
}
// System.err.println("EventsHistory::getStairs finishing totalHeight=" +
// totalHeight);
result.addStep(new StairsPosition(totalHeight, false), value, null);
// System.err.println("EventsHistory::getStairs " + p + " result=" + result);
return result;
}
public int getMaxValue() {
int max = 0;
int level = 0;
for (Event current : events) {
if (current instanceof LifeEvent) {
final LifeEvent le = (LifeEvent) current;
if (le.getParticipant() == p && le.isActivate()) {
level++;
}
if (level > max) {
max = level;
}
if (le.getParticipant() == p && le.isDeactivateOrDestroy()) {
level--;
}
}
}
return max;
}
}

View File

@ -44,6 +44,7 @@ import java.util.List;
import net.sourceforge.plantuml.ISkinParam; import net.sourceforge.plantuml.ISkinParam;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.StringBounder;
import net.sourceforge.plantuml.graphic.UDrawable;
import net.sourceforge.plantuml.real.Real; import net.sourceforge.plantuml.real.Real;
import net.sourceforge.plantuml.real.RealUtils; import net.sourceforge.plantuml.real.RealUtils;
import net.sourceforge.plantuml.sequencediagram.Event; import net.sourceforge.plantuml.sequencediagram.Event;
@ -163,7 +164,7 @@ public class GroupingTile extends AbstractTile {
double h = dim1.getHeight() + MARGINY_MAGIC / 2; double h = dim1.getHeight() + MARGINY_MAGIC / 2;
for (Tile tile : tiles) { for (Tile tile : tiles) {
tile.drawU(ug.apply(UTranslate.dy(h))); ((UDrawable) tile).drawU(ug.apply(UTranslate.dy(h)));
final double preferredHeight = tile.getPreferredHeight(); final double preferredHeight = tile.getPreferredHeight();
h += preferredHeight; h += preferredHeight;
} }
@ -182,7 +183,7 @@ public class GroupingTile extends AbstractTile {
for (Tile tile : tiles) { for (Tile tile : tiles) {
if (tile instanceof ElseTile) { if (tile instanceof ElseTile) {
final ElseTile elseTile = (ElseTile) tile; final ElseTile elseTile = (ElseTile) tile;
ys.add(elseTile.getCallbackY() - y + MARGINY_MAGIC / 2); ys.add(elseTile.getY() - getY() + MARGINY_MAGIC / 2);
} }
} }
ys.add(totalHeight); ys.add(totalHeight);
@ -217,23 +218,16 @@ public class GroupingTile extends AbstractTile {
return max.addFixed(EXTERNAL_MARGINX2); return max.addFixed(EXTERNAL_MARGINX2);
} }
private double y;
@Override
public void callbackY_internal(double y) {
this.y = y;
}
public static double fillPositionelTiles(StringBounder stringBounder, double y, List<Tile> tiles, public static double fillPositionelTiles(StringBounder stringBounder, double y, List<Tile> tiles,
final List<YPositionedTile> local, List<YPositionedTile> full) { final List<CommonTile> local, List<CommonTile> full) {
for (Tile tile : mergeParallel(stringBounder, tiles)) { for (Tile tile : mergeParallel(stringBounder, tiles)) {
final YPositionedTile ytile = new YPositionedTile(tile, y); tile.callbackY(y);
local.add(ytile); local.add((CommonTile) tile);
full.add(ytile); full.add((CommonTile) tile);
if (tile instanceof GroupingTile) { if (tile instanceof GroupingTile) {
final GroupingTile groupingTile = (GroupingTile) tile; final GroupingTile groupingTile = (GroupingTile) tile;
final double headerHeight = groupingTile.getHeaderHeight(stringBounder); final double headerHeight = groupingTile.getHeaderHeight(stringBounder);
final ArrayList<YPositionedTile> local2 = new ArrayList<YPositionedTile>(); final ArrayList<CommonTile> local2 = new ArrayList<CommonTile>();
fillPositionelTiles(stringBounder, y + headerHeight, groupingTile.tiles, local2, full); fillPositionelTiles(stringBounder, y + headerHeight, groupingTile.tiles, local2, full);
} }
y += tile.getPreferredHeight(); y += tile.getPreferredHeight();
@ -303,7 +297,7 @@ public class GroupingTile extends AbstractTile {
((GroupingTile) tile).addYNewPages(yNewPages); ((GroupingTile) tile).addYNewPages(yNewPages);
} }
if (tile instanceof NewpageTile) { if (tile instanceof NewpageTile) {
final double y = ((NewpageTile) tile).getCallbackY(); final double y = ((NewpageTile) tile).getY();
yNewPages.add(y); yNewPages.add(y);
} }
} }

View File

@ -59,7 +59,7 @@ public class LifeEventTile extends AbstractTile {
private final ISkinParam skinParam; private final ISkinParam skinParam;
@Override @Override
public void callbackY_internal(double y) { final protected void callbackY_internal(double y) {
// System.err.println("LifeEventTile::updateStairs " + lifeEvent + " " + // System.err.println("LifeEventTile::updateStairs " + lifeEvent + " " +
// livingSpace.getParticipant() + " y=" + y); // livingSpace.getParticipant() + " y=" + y);
livingSpace.addStepForLivebox(getEvent(), y); livingSpace.addStepForLivebox(getEvent(), y);

View File

@ -35,12 +35,20 @@
*/ */
package net.sourceforge.plantuml.sequencediagram.teoz; package net.sourceforge.plantuml.sequencediagram.teoz;
import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.TreeMap; import java.util.TreeMap;
import net.sourceforge.plantuml.ISkinParam; import net.sourceforge.plantuml.ISkinParam;
import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.StringBounder;
import net.sourceforge.plantuml.graphic.SymbolContext;
import net.sourceforge.plantuml.sequencediagram.AbstractMessage;
import net.sourceforge.plantuml.sequencediagram.Event;
import net.sourceforge.plantuml.sequencediagram.LifeEvent;
import net.sourceforge.plantuml.sequencediagram.Message;
import net.sourceforge.plantuml.sequencediagram.Note;
import net.sourceforge.plantuml.sequencediagram.Participant; import net.sourceforge.plantuml.sequencediagram.Participant;
import net.sourceforge.plantuml.skin.Context2D; import net.sourceforge.plantuml.skin.Context2D;
import net.sourceforge.plantuml.skin.SimpleContext2D; import net.sourceforge.plantuml.skin.SimpleContext2D;
@ -50,26 +58,194 @@ import net.sourceforge.plantuml.ugraphic.UTranslate;
public class LiveBoxes { public class LiveBoxes {
private final EventsHistory eventsHistory;
private final Rose skin; private final Rose skin;
private final ISkinParam skinParam; private final ISkinParam skinParam;
private final Map<Double, Double> delays = new TreeMap<Double, Double>(); private final Map<Double, Double> delays = new TreeMap<Double, Double>();
private final Participant p;
private final List<Event> events;
private final Map<Event, Double> eventsStep = new HashMap<Event, Double>();
public LiveBoxes(EventsHistory eventsHistory, Rose skin, ISkinParam skinParam, Participant participant) { public LiveBoxes(Participant p, List<Event> events, Rose skin, ISkinParam skinParam) {
this.eventsHistory = eventsHistory; this.p = p;
this.events = events;
this.skin = skin; this.skin = skin;
this.skinParam = skinParam; this.skinParam = skinParam;
} }
public void addStep(Event event, double y) {
if (event.dealWith(p)) {
if (event instanceof LifeEvent && ((LifeEvent) event).isDeactivate() && eventsStep.containsValue(y)) {
y += 5.0;
}
eventsStep.put(event, y);
}
}
public Participant getParticipant() {
return p;
}
public int getLevelAt(Event event, EventsHistoryMode mode) {
return getLevelAtInternal(event, mode);
}
private int getLevelAtInternal(Event event, EventsHistoryMode mode) {
int level = 0; // p.getInitialLife();
// System.err.println("--->EventsHistory for " + p + " " + event);
for (Iterator<Event> it = events.iterator(); it.hasNext();) {
final Event current = it.next();
if (current instanceof LifeEvent) {
final LifeEvent le = (LifeEvent) current;
if (le.getParticipant() == p && le.isActivate()) {
level++;
}
if (le.getParticipant() == p && le.isDeactivateOrDestroy()) {
level--;
}
}
if (event == current) {
if (current instanceof AbstractMessage) {
final Event next = nextButSkippingNotes(it);
if (next instanceof LifeEvent) {
final LifeEvent le = (LifeEvent) next;
final AbstractMessage msg = (AbstractMessage) current;
if (mode != EventsHistoryMode.IGNORE_FUTURE_ACTIVATE && le.isActivate() && msg.dealWith(p)
&& le.getParticipant() == p) {
level++;
}
if (mode == EventsHistoryMode.CONSIDERE_FUTURE_DEACTIVATE && le.isDeactivateOrDestroy()
&& msg.dealWith(p) && le.getParticipant() == p) {
level--;
}
// System.err.println("Warning, this is message " + current + " next=" + next);
}
}
if (level < 0) {
return 0;
}
// System.err.println("<-result1 is " + level);
return level;
}
}
throw new IllegalArgumentException();
// return level;
}
private boolean isNextEventADestroy(Event event) {
for (Iterator<Event> it = events.iterator(); it.hasNext();) {
final Event current = it.next();
if (event != current) {
continue;
}
if (current instanceof Message) {
final Event next = nextButSkippingNotes(it);
if (next instanceof LifeEvent) {
final LifeEvent le = (LifeEvent) next;
return le.isDestroy(p);
}
}
return false;
}
return false;
}
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) {
continue;
}
if (current instanceof Message) {
final Event next = nextButSkippingNotes(it);
if (next instanceof LifeEvent) {
final LifeEvent le = (LifeEvent) next;
if (le.isActivate()) {
return le.getSpecificColors();
}
return null;
}
}
return null;
}
return null;
}
private Event nextButSkippingNotes(Iterator<Event> it) {
while (true) {
if (it.hasNext() == false) {
return null;
}
final Event next = it.next();
if (next instanceof Note) {
continue;
}
// System.err.println("nextButSkippingNotes=" + next);
return next;
}
}
public Stairs getStairs(double createY, double totalHeight) {
final Stairs stair = new Stairs();
int indent = 0;
for (Event event : events) {
final Double position = eventsStep.get(event);
if (position != null) {
assert position <= totalHeight : "position=" + position + " totalHeight=" + totalHeight;
indent = getLevelAt(event, EventsHistoryMode.CONSIDERE_FUTURE_DEACTIVATE);
final SymbolContext activateColor = getActivateColor(event);
final Step step = new Step(Math.max(createY, position), isNextEventADestroy(event), indent,
activateColor);
stair.addStep(step);
}
}
stair.addStep(new Step(totalHeight, false, indent, null));
return stair;
}
private boolean isActivateAnDeactivate(Event event) {
if (event instanceof AbstractMessage) {
final AbstractMessage msg = (AbstractMessage) event;
return msg.isActivate() && msg.isDeactivate();
}
return false;
}
public int getMaxValue() {
int max = 0;
int level = 0;
for (Event current : events) {
if (current instanceof LifeEvent) {
final LifeEvent le = (LifeEvent) current;
if (le.getParticipant() == p && le.isActivate()) {
level++;
}
if (level > max) {
max = level;
}
if (le.getParticipant() == p && le.isDeactivateOrDestroy()) {
level--;
}
}
}
return max;
}
public double getMaxPosition(StringBounder stringBounder) { public double getMaxPosition(StringBounder stringBounder) {
final int max = eventsHistory.getMaxValue(); final int max = getMaxValue();
final LiveBoxesDrawer drawer = new LiveBoxesDrawer(new SimpleContext2D(true), skin, skinParam, delays); final LiveBoxesDrawer drawer = new LiveBoxesDrawer(new SimpleContext2D(true), skin, skinParam, delays);
return drawer.getWidth(stringBounder) / 2.0 * max; return drawer.getWidth(stringBounder) / 2.0 * max;
} }
public void drawBoxes(UGraphic ug, Context2D context, double createY, double endY) { public void drawBoxes(UGraphic ug, Context2D context, double createY, double endY) {
final Stairs2 stairs = eventsHistory.getStairs(createY, endY); final Stairs stairs = getStairs(createY, endY);
final int max = stairs.getMaxValue(); final int max = stairs.getMaxIndent();
if (max == 0) { if (max == 0) {
drawDestroys(ug, stairs, context); drawDestroys(ug, stairs, context);
} }
@ -78,27 +254,26 @@ public class LiveBoxes {
} }
} }
private void drawDestroys(UGraphic ug, Stairs2 stairs, Context2D context) { private void drawDestroys(UGraphic ug, Stairs stairs, Context2D context) {
final LiveBoxesDrawer drawer = new LiveBoxesDrawer(context, skin, skinParam, delays); final LiveBoxesDrawer drawer = new LiveBoxesDrawer(context, skin, skinParam, delays);
for (StairsPosition yposition : stairs.getYs()) { for (Step yposition : stairs.getSteps()) {
drawer.drawDestroyIfNeeded(ug, yposition); drawer.drawDestroyIfNeeded(ug, yposition);
} }
} }
private void drawOneLevel(UGraphic ug, int levelToDraw, Stairs2 stairs, Context2D context) { private void drawOneLevel(UGraphic ug, int levelToDraw, Stairs stairs, Context2D context) {
final LiveBoxesDrawer drawer = new LiveBoxesDrawer(context, skin, skinParam, delays); final LiveBoxesDrawer drawer = new LiveBoxesDrawer(context, skin, skinParam, delays);
ug = ug.apply(UTranslate.dx((levelToDraw - 1) * drawer.getWidth(ug.getStringBounder()) / 2.0)); ug = ug.apply(UTranslate.dx((levelToDraw - 1) * drawer.getWidth(ug.getStringBounder()) / 2.0));
boolean pending = true; boolean pending = true;
for (Iterator<StairsPosition> it = stairs.getYs().iterator(); it.hasNext();) { for (Iterator<Step> it = stairs.getSteps().iterator(); it.hasNext();) {
final StairsPosition yposition = it.next(); final Step yposition = it.next();
final IntegerColored integerColored = stairs.getValue(yposition.getValue()); final int indent = yposition.getIndent();
final int level = integerColored.getValue(); if (pending && indent == levelToDraw) {
if (pending && level == levelToDraw) { drawer.addStart(yposition.getValue(), yposition.getColors());
drawer.addStart(yposition.getValue(), integerColored.getColors());
pending = false; pending = false;
} else if (pending == false && (it.hasNext() == false || level < levelToDraw)) { } else if (pending == false && (it.hasNext() == false || indent < levelToDraw)) {
drawer.doDrawing(ug, yposition); drawer.doDrawing(ug, yposition.getValue());
drawer.drawDestroyIfNeeded(ug, yposition); drawer.drawDestroyIfNeeded(ug, yposition);
pending = true; pending = true;
} }

View File

@ -94,8 +94,8 @@ public class LiveBoxesDrawer {
this.symbolContext = symbolContext; this.symbolContext = symbolContext;
} }
public void doDrawing(UGraphic ug, StairsPosition yposition) { public void doDrawing(UGraphic ug, double yposition) {
final Segment full = new Segment(y1, yposition.getValue()); final Segment full = new Segment(y1, yposition);
final Collection<Segment> segments = full.cutSegmentIfNeed(delays); final Collection<Segment> segments = full.cutSegmentIfNeed(delays);
ComponentType type = ComponentType.ALIVE_BOX_CLOSE_CLOSE; ComponentType type = ComponentType.ALIVE_BOX_CLOSE_CLOSE;
if (segments.size() > 1) { if (segments.size() > 1) {
@ -106,22 +106,21 @@ public class LiveBoxesDrawer {
if (it.hasNext() == false && type != ComponentType.ALIVE_BOX_CLOSE_CLOSE) { if (it.hasNext() == false && type != ComponentType.ALIVE_BOX_CLOSE_CLOSE) {
type = ComponentType.ALIVE_BOX_OPEN_CLOSE; type = ComponentType.ALIVE_BOX_OPEN_CLOSE;
} }
drawInternal(ug, yposition, seg.getPos1(), seg.getPos2(), type); drawInternal(ug, seg.getPos1(), seg.getPos2(), type);
type = ComponentType.ALIVE_BOX_OPEN_OPEN; type = ComponentType.ALIVE_BOX_OPEN_OPEN;
} }
y1 = Double.MAX_VALUE; y1 = Double.MAX_VALUE;
} }
public void drawDestroyIfNeeded(UGraphic ug, StairsPosition yposition) { public void drawDestroyIfNeeded(UGraphic ug, Step step) {
if (yposition.isDestroy()) { if (step.isDestroy()) {
final Dimension2D dimCross = cross.getPreferredDimension(ug.getStringBounder()); final Dimension2D dimCross = cross.getPreferredDimension(ug.getStringBounder());
cross.drawU( cross.drawU(ug.apply(new UTranslate(-dimCross.getWidth() / 2, step.getValue() - dimCross.getHeight() / 2)),
ug.apply(new UTranslate(-dimCross.getWidth() / 2, yposition.getValue() - dimCross.getHeight() / 2)),
null, context); null, context);
} }
} }
private void drawInternal(UGraphic ug, StairsPosition yposition, double ya, double yb, ComponentType type) { private void drawInternal(UGraphic ug, double ya, double yb, ComponentType type) {
final double width = getWidth(ug.getStringBounder()); final double width = getWidth(ug.getStringBounder());
final Area area = new Area(width, yb - ya); final Area area = new Area(width, yb - ya);
ISkinParam skinParam2 = new SkinParamBackcolored(skinParam, ISkinParam skinParam2 = new SkinParamBackcolored(skinParam,

View File

@ -60,15 +60,15 @@ import net.sourceforge.plantuml.ugraphic.UTranslate;
public class LivingSpace { public class LivingSpace {
private final Participant p; private final Participant p;
private final Rose skin;
private final ISkinParam skinParam; private final ISkinParam skinParam;
private final ComponentType headType; private final ComponentType headType;
private final ComponentType tailType; private final ComponentType tailType;
private final boolean useContinueLineBecauseOfDelay;
private final MutingLine mutingLine; private final MutingLine mutingLine;
private final Rose rose = new Rose(); private final Rose rose = new Rose();
private final LiveBoxes liveBoxes; private final LiveBoxes liveboxes;
// private final Rose skin;
// private final boolean useContinueLineBecauseOfDelay;
// private final LivingSpaceImpl previous; // private final LivingSpaceImpl previous;
// private LivingSpace next; // private LivingSpace next;
@ -76,7 +76,6 @@ public class LivingSpace {
private Real posC; private Real posC;
private Real posD; private Real posD;
private final EventsHistory eventsHistory;
private boolean create = false; private boolean create = false;
private double createY = 0; private double createY = 0;
@ -84,11 +83,11 @@ public class LivingSpace {
public int getLevelAt(Tile tile, EventsHistoryMode mode) { public int getLevelAt(Tile tile, EventsHistoryMode mode) {
// assert mode == EventsHistoryMode.IGNORE_FUTURE_DEACTIVATE; // assert mode == EventsHistoryMode.IGNORE_FUTURE_DEACTIVATE;
return eventsHistory.getLevelAt(tile.getEvent(), mode); return liveboxes.getLevelAt(tile.getEvent(), mode);
} }
public void addStepForLivebox(Event event, double y) { public void addStepForLivebox(Event event, double y) {
eventsHistory.addStepForLivebox(event, y); liveboxes.addStep(event, y);
} }
@Override @Override
@ -105,9 +104,8 @@ public class LivingSpace {
public LivingSpace(Participant p, ParticipantEnglober englober, Rose skin, ISkinParam skinParam, Real position, public LivingSpace(Participant p, ParticipantEnglober englober, Rose skin, ISkinParam skinParam, Real position,
List<Event> events) { List<Event> events) {
this.eventsHistory = new EventsHistory(p, events);
this.p = p; this.p = p;
this.skin = skin; // this.skin = skin;
this.skinParam = skinParam; this.skinParam = skinParam;
this.englober = englober; this.englober = englober;
this.posB = position; this.posB = position;
@ -140,9 +138,9 @@ public class LivingSpace {
} }
// this.stairs2.addStep2(0, p.getInitialLife()); // this.stairs2.addStep2(0, p.getInitialLife());
// this.stairs2.addStep2(0, 0); // this.stairs2.addStep2(0, 0);
this.useContinueLineBecauseOfDelay = useContinueLineBecauseOfDelay(events); // this.useContinueLineBecauseOfDelay = useContinueLineBecauseOfDelay(events);
this.mutingLine = new MutingLine(skin, skinParam, events, p); this.mutingLine = new MutingLine(skin, skinParam, events, p);
this.liveBoxes = new LiveBoxes(eventsHistory, skin, skinParam, p); this.liveboxes = new LiveBoxes(p, events, skin, skinParam);
} }
private boolean useContinueLineBecauseOfDelay(List<Event> events) { private boolean useContinueLineBecauseOfDelay(List<Event> events) {
@ -158,10 +156,9 @@ public class LivingSpace {
return false; return false;
} }
public void drawLineAndLiveBoxes(UGraphic ug, double height, Context2D context) { public void drawLineAndLiveboxes(UGraphic ug, double height, Context2D context) {
mutingLine.drawLine(ug, context, createY, height); mutingLine.drawLine(ug, context, createY, height);
liveBoxes.drawBoxes(ug, context, createY, height); liveboxes.drawBoxes(ug, context, createY, height);
} }
// public void addDelayTile(DelayTile tile) { // public void addDelayTile(DelayTile tile) {
@ -212,7 +209,7 @@ public class LivingSpace {
} }
public Real getPosC2(StringBounder stringBounder) { public Real getPosC2(StringBounder stringBounder) {
final double delta = liveBoxes.getMaxPosition(stringBounder); final double delta = liveboxes.getMaxPosition(stringBounder);
return getPosC(stringBounder).addFixed(delta); return getPosC(stringBounder).addFixed(delta);
} }
@ -243,7 +240,7 @@ public class LivingSpace {
public void delayOn(double y, double height) { public void delayOn(double y, double height) {
mutingLine.delayOn(y, height); mutingLine.delayOn(y, height);
liveBoxes.delayOn(y, height); liveboxes.delayOn(y, height);
} }
public ParticipantEnglober getEnglober() { public ParticipantEnglober getEnglober() {

View File

@ -136,7 +136,7 @@ public class LivingSpaces {
// } // }
// System.err.println("drawing lines " + livingSpace); // System.err.println("drawing lines " + livingSpace);
final double x = livingSpace.getPosC(ug.getStringBounder()).getCurrentValue(); final double x = livingSpace.getPosC(ug.getStringBounder()).getCurrentValue();
livingSpace.drawLineAndLiveBoxes(ug.apply(UTranslate.dx(x)), height, context); livingSpace.drawLineAndLiveboxes(ug.apply(UTranslate.dx(x)), height, context);
} }
} }

View File

@ -74,17 +74,6 @@ public class NewpageTile extends AbstractTile {
return tileArguments.getOrigin(); return tileArguments.getOrigin();
} }
private double y;
@Override
public void callbackY_internal(double y) {
this.y = y;
}
public double getCallbackY() {
return y;
}
public Event getEvent() { public Event getEvent() {
return newpage; return newpage;
} }

View File

@ -46,6 +46,7 @@ import net.sourceforge.plantuml.sequencediagram.LinkAnchor;
import net.sourceforge.plantuml.sequencediagram.SequenceDiagram; import net.sourceforge.plantuml.sequencediagram.SequenceDiagram;
import net.sourceforge.plantuml.ugraphic.LimitFinder; import net.sourceforge.plantuml.ugraphic.LimitFinder;
import net.sourceforge.plantuml.ugraphic.UGraphic; import net.sourceforge.plantuml.ugraphic.UGraphic;
import net.sourceforge.plantuml.ugraphic.UTranslate;
public class PlayingSpace implements Bordered { public class PlayingSpace implements Bordered {
@ -106,15 +107,16 @@ public class PlayingSpace implements Bordered {
private double drawUInternal(UGraphic ug, boolean trace) { private double drawUInternal(UGraphic ug, boolean trace) {
final StringBounder stringBounder = ug.getStringBounder(); final StringBounder stringBounder = ug.getStringBounder();
final List<YPositionedTile> local = new ArrayList<YPositionedTile>(); final List<CommonTile> local = new ArrayList<CommonTile>();
final List<YPositionedTile> full = new ArrayList<YPositionedTile>(); final List<CommonTile> full = new ArrayList<CommonTile>();
final double y = GroupingTile.fillPositionelTiles(stringBounder, startingY, tiles, local, full); final double y = GroupingTile.fillPositionelTiles(stringBounder, startingY, tiles, local, full);
for (YPositionedTile tile : local) { for (CommonTile tile : local) {
tile.drawInArea(ug); final UTranslate dy = UTranslate.dy(((CommonTile) tile).getY());
((CommonTile) tile).drawU(ug.apply(dy));
} }
for (LinkAnchor linkAnchor : linkAnchors) { for (LinkAnchor linkAnchor : linkAnchors) {
final YPositionedTile ytile1 = getFromAnchor(full, linkAnchor.getAnchor1()); final CommonTile ytile1 = getFromAnchor(full, linkAnchor.getAnchor1());
final YPositionedTile ytile2 = getFromAnchor(full, linkAnchor.getAnchor2()); final CommonTile ytile2 = getFromAnchor(full, linkAnchor.getAnchor2());
if (ytile1 != null && ytile2 != null) { if (ytile1 != null && ytile2 != null) {
linkAnchor.drawAnchor(ug, ytile1, ytile2, skinParam); linkAnchor.drawAnchor(ug, ytile1, ytile2, skinParam);
} }
@ -123,10 +125,9 @@ public class PlayingSpace implements Bordered {
return y; return y;
} }
private YPositionedTile getFromAnchor(List<YPositionedTile> positionedTiles, String anchor) { private CommonTile getFromAnchor(List<CommonTile> positionedTiles, String anchor) {
for (YPositionedTile ytile : positionedTiles) { for (CommonTile ytile : positionedTiles) {
final boolean matchAnchorV2 = ytile.matchAnchorV2(anchor); if (ytile.matchAnchor(anchor)) {
if (matchAnchorV2) {
return ytile; return ytile;
} }
} }
@ -180,7 +181,7 @@ public class PlayingSpace implements Bordered {
((GroupingTile) tile).addYNewPages(yNewPages); ((GroupingTile) tile).addYNewPages(yNewPages);
} }
if (tile instanceof NewpageTile) { if (tile instanceof NewpageTile) {
final double y = ((NewpageTile) tile).getCallbackY(); final double y = ((NewpageTile) tile).getY();
yNewPages.add(y); yNewPages.add(y);
} }
} }

View File

@ -35,8 +35,42 @@
*/ */
package net.sourceforge.plantuml.sequencediagram.teoz; package net.sourceforge.plantuml.sequencediagram.teoz;
import net.sourceforge.plantuml.graphic.UDrawable; import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
public interface Tile2 extends UDrawable { public class Stairs {
private final List<Step> values = new ArrayList<Step>();
public void addStep(Step step) {
if (step.getIndent() < 0) {
throw new IllegalArgumentException();
}
if (values.size() > 0) {
final double lastY = values.get(values.size() - 1).getValue();
if (step.getValue() <= lastY) {
// throw new IllegalArgumentException();
return;
}
}
values.add(step);
}
public int getMaxIndent() {
int max = Integer.MIN_VALUE;
for (Step step : values) {
final int v = step.getIndent();
if (v > max) {
max = v;
}
}
return max;
}
public Collection<Step> getSteps() {
return Collections.unmodifiableCollection(values);
}
} }

View File

@ -1,125 +0,0 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2020, Arnaud Roques
*
* Project Info: http://plantuml.com
*
* If you like this project or if you find it useful, you can support us at:
*
* http://plantuml.com/patreon (only 1$ per month!)
* http://plantuml.com/paypal
*
* This file is part of PlantUML.
*
* PlantUML is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* PlantUML distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
* License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
*
* Original Author: Arnaud Roques
*
*
*/
package net.sourceforge.plantuml.sequencediagram.teoz;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.sourceforge.plantuml.graphic.SymbolContext;
public class Stairs2 {
private final List<StairsPosition> ys = new ArrayList<StairsPosition>();
private final List<IntegerColored> values = new ArrayList<IntegerColored>();
private final Map<Double, IntegerColored> cache = new HashMap<Double, IntegerColored>();
@Override
public String toString() {
return ys.toString() + " " + values;
}
public void addStep(StairsPosition position, int value, SymbolContext color) {
if (value < 0) {
throw new IllegalArgumentException();
}
// System.err.println("Stairs2::addStep " + position + " " + value + " color=" +
// color);
assert ys.size() == values.size();
if (ys.size() > 0) {
final double lastY = ys.get(ys.size() - 1).getValue();
if (position.getValue() <= lastY) {
// throw new IllegalArgumentException();
return;
}
if (lastY == position.getValue()) {
values.set(ys.size() - 1, new IntegerColored(value, color));
cache.clear();
return;
}
}
ys.add(position);
values.add(new IntegerColored(value, color));
cache.clear();
}
public int getMaxValue() {
int max = Integer.MIN_VALUE;
for (IntegerColored vc : values) {
final int v = vc.getValue();
if (v > max) {
max = v;
}
}
return max;
}
public List<StairsPosition> getYs() {
return Collections.unmodifiableList(ys);
}
public IntegerColored getValue(double y) {
IntegerColored resultc = cache.get(y);
if (resultc == null) {
resultc = getValueSlow(new StairsPosition(y, false));
cache.put(y, resultc);
}
return resultc;
}
private IntegerColored getValueSlow(StairsPosition y) {
final int idx = Collections.binarySearch(ys, y);
if (idx >= 0) {
return values.get(idx);
}
final int insertPoint = -idx - 1;
if (insertPoint == 0) {
return new IntegerColored(0, null);
}
return values.get(insertPoint - 1);
}
public int getLastValue() {
final int size = values.size();
if (size == 0) {
return 0;
}
return values.get(size - 1).getValue();
}
}

View File

@ -37,30 +37,38 @@ package net.sourceforge.plantuml.sequencediagram.teoz;
import net.sourceforge.plantuml.graphic.SymbolContext; import net.sourceforge.plantuml.graphic.SymbolContext;
public class IntegerColored { public class Step {
private final int value; private final double value;
private final boolean destroy;
private final int indent;
private final SymbolContext color; private final SymbolContext color;
public IntegerColored(int value, SymbolContext color) { public Step(double value, boolean destroy, int indent, SymbolContext color) {
if (value < 0) { if (indent < 0) {
throw new IllegalArgumentException(); throw new IllegalArgumentException();
} }
this.value = value; this.indent = indent;
this.color = color; this.color = color;
this.value = value;
this.destroy = destroy;
} }
@Override public double getValue() {
public String toString() {
return "" + value + " " + color;
}
public int getValue() {
return value; return value;
} }
public boolean isDestroy() {
return destroy;
}
public int getIndent() {
return indent;
}
public SymbolContext getColors() { public SymbolContext getColors() {
return color; return color;
} }
} }

View File

@ -38,7 +38,7 @@ package net.sourceforge.plantuml.sequencediagram.teoz;
import net.sourceforge.plantuml.real.Real; import net.sourceforge.plantuml.real.Real;
import net.sourceforge.plantuml.sequencediagram.Event; import net.sourceforge.plantuml.sequencediagram.Event;
public interface Tile extends Tile2 { public interface Tile {
public double getPreferredHeight(); public double getPreferredHeight();
@ -50,12 +50,14 @@ public interface Tile extends Tile2 {
public Real getMaxX(); public Real getMaxX();
public double getMiddleX();
public Event getEvent(); public Event getEvent();
public double getContactPointRelative(); public double getContactPointRelative();
public double getZZZ(); public double getZZZ();
public boolean matchAnchorV1(String anchor); public boolean matchAnchor(String anchor);
} }

View File

@ -35,6 +35,7 @@
*/ */
package net.sourceforge.plantuml.sequencediagram.teoz; package net.sourceforge.plantuml.sequencediagram.teoz;
import net.sourceforge.plantuml.graphic.UDrawable;
import net.sourceforge.plantuml.real.Real; import net.sourceforge.plantuml.real.Real;
import net.sourceforge.plantuml.sequencediagram.Event; import net.sourceforge.plantuml.sequencediagram.Event;
import net.sourceforge.plantuml.ugraphic.UGraphic; import net.sourceforge.plantuml.ugraphic.UGraphic;
@ -58,7 +59,7 @@ public class TileMarged extends AbstractTile implements Tile {
} }
public void drawU(UGraphic ug) { public void drawU(UGraphic ug) {
tile.drawU(ug.apply(new UTranslate(x1, y1))); ((UDrawable) tile).drawU(ug.apply(new UTranslate(x1, y1)));
} }

View File

@ -41,6 +41,7 @@ import java.util.Iterator;
import java.util.List; import java.util.List;
import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.StringBounder;
import net.sourceforge.plantuml.graphic.UDrawable;
import net.sourceforge.plantuml.real.Real; import net.sourceforge.plantuml.real.Real;
import net.sourceforge.plantuml.real.RealUtils; import net.sourceforge.plantuml.real.RealUtils;
import net.sourceforge.plantuml.sequencediagram.Event; import net.sourceforge.plantuml.sequencediagram.Event;
@ -56,7 +57,7 @@ public class TileParallel extends CommonTile {
private final List<Tile> tiles = new ArrayList<Tile>(); private final List<Tile> tiles = new ArrayList<Tile>();
@Override @Override
public void callbackY_internal(double y) { final protected void callbackY_internal(double y) {
for (Tile tile : tiles) { for (Tile tile : tiles) {
tile.callbackY(y); tile.callbackY(y);
} }
@ -70,7 +71,7 @@ public class TileParallel extends CommonTile {
final double yPointAll = getContactPointRelative(); final double yPointAll = getContactPointRelative();
for (Tile tile : tiles) { for (Tile tile : tiles) {
final double yPoint = tile.getContactPointRelative(); final double yPoint = tile.getContactPointRelative();
tile.drawU(ug.apply(UTranslate.dy(yPointAll - yPoint))); ((UDrawable) tile).drawU(ug.apply(UTranslate.dy(yPointAll - yPoint)));
} }
} }
@ -156,9 +157,9 @@ public class TileParallel extends CommonTile {
return null; return null;
} }
public boolean matchAnchorV1(String anchor) { public boolean matchAnchor(String anchor) {
for (Tile tile : tiles) { for (Tile tile : tiles) {
if (tile.matchAnchorV1(anchor)) { if (tile.matchAnchor(anchor)) {
return true; return true;
} }
} }

View File

@ -35,6 +35,7 @@
*/ */
package net.sourceforge.plantuml.sequencediagram.teoz; package net.sourceforge.plantuml.sequencediagram.teoz;
import net.sourceforge.plantuml.graphic.UDrawable;
import net.sourceforge.plantuml.graphic.UGraphicDelegator; import net.sourceforge.plantuml.graphic.UGraphicDelegator;
import net.sourceforge.plantuml.skin.Context2D; import net.sourceforge.plantuml.skin.Context2D;
import net.sourceforge.plantuml.ugraphic.UChange; import net.sourceforge.plantuml.ugraphic.UChange;
@ -52,7 +53,7 @@ public class UGraphicInterceptorTile extends UGraphicDelegator implements Contex
public void draw(UShape shape) { public void draw(UShape shape) {
if (shape instanceof Tile) { if (shape instanceof Tile) {
final Tile drawable = (Tile) shape; final UDrawable drawable = (UDrawable) shape;
drawable.drawU(this); drawable.drawU(this);
} else { } else {
getUg().draw(shape); getUg().draw(shape);

View File

@ -1,77 +0,0 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2020, Arnaud Roques
*
* Project Info: http://plantuml.com
*
* If you like this project or if you find it useful, you can support us at:
*
* http://plantuml.com/patreon (only 1$ per month!)
* http://plantuml.com/paypal
*
* This file is part of PlantUML.
*
* PlantUML is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* PlantUML distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
* License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
*
* Original Author: Arnaud Roques
*
*
*/
package net.sourceforge.plantuml.sequencediagram.teoz;
import net.sourceforge.plantuml.ugraphic.UGraphic;
import net.sourceforge.plantuml.ugraphic.UTranslate;
public class YPositionedTile {
private final Tile tile;
private final double y;
public YPositionedTile(Tile tile, double y) {
this.tile = tile;
this.y = y;
tile.callbackY(y);
}
@Override
public String toString() {
return "y=" + y + " " + tile;
}
public void drawInArea(UGraphic ug) {
// System.err.println("YPositionedTile::drawU y=" + y + " " + tile);
tile.drawU(ug.apply(UTranslate.dy(y)));
}
public boolean matchAnchorV2(String anchor) {
final boolean result = tile.matchAnchorV1(anchor);
return result;
}
public final double getY() {
return y + tile.getContactPointRelative();
}
public double getMiddleX() {
final double max = tile.getMaxX().getCurrentValue();
final double min = tile.getMinX().getCurrentValue();
return (min + max) / 2;
}
}

View File

@ -31,52 +31,30 @@
* *
* Original Author: Arnaud Roques * Original Author: Arnaud Roques
* *
*
*/ */
package net.sourceforge.plantuml.sequencediagram.teoz; package net.sourceforge.plantuml.ugraphic.svg;
public class StairsPosition implements Comparable<StairsPosition> { import net.sourceforge.plantuml.svg.SvgGraphics;
import net.sourceforge.plantuml.ugraphic.UDriver;
import net.sourceforge.plantuml.ugraphic.UParam;
import net.sourceforge.plantuml.ugraphic.UShape;
import net.sourceforge.plantuml.ugraphic.color.ColorMapper;
import net.sourceforge.plantuml.ugraphic.color.HColor;
import net.sourceforge.plantuml.ugraphic.color.HColorGradient;
private final double value; public class DriverPixelSvg implements UDriver<SvgGraphics> {
private final boolean destroy;
public StairsPosition(double value, boolean destroy) { public void draw(UShape ushape, double x, double y, ColorMapper mapper, UParam param, SvgGraphics svg) {
this.value = value; final HColor color = param.getColor();
this.destroy = destroy; if (color instanceof HColorGradient) {
} final HColorGradient gr = (HColorGradient) color;
svg.setStrokeColor(mapper.toSvg(gr.getColor1()));
@Override } else {
public String toString() { svg.setStrokeColor(mapper.toSvg(color));
return "" + value + "-(" + destroy + ")";
}
@Override
public int hashCode() {
return new Double(value).hashCode() + (destroy ? 17 : 37);
}
@Override
public boolean equals(Object obj) {
final StairsPosition other = (StairsPosition) obj;
return this.value == other.value && this.destroy == other.destroy;
}
public double getValue() {
return value;
}
public int compareTo(StairsPosition other) {
if (this.value > other.value) {
return 1;
} }
if (this.value < other.value) { svg.setStrokeWidth(0.5, "");
return -1;
}
return 0;
}
public boolean isDestroy() { svg.svgRectangle(x, y, 0.5, 0.5, 0, 0, 0, null, null);
return destroy;
}
}
} }

View File

@ -61,6 +61,7 @@ import net.sourceforge.plantuml.ugraphic.UImage;
import net.sourceforge.plantuml.ugraphic.UImageSvg; import net.sourceforge.plantuml.ugraphic.UImageSvg;
import net.sourceforge.plantuml.ugraphic.ULine; import net.sourceforge.plantuml.ugraphic.ULine;
import net.sourceforge.plantuml.ugraphic.UPath; import net.sourceforge.plantuml.ugraphic.UPath;
import net.sourceforge.plantuml.ugraphic.UPixel;
import net.sourceforge.plantuml.ugraphic.UPolygon; import net.sourceforge.plantuml.ugraphic.UPolygon;
import net.sourceforge.plantuml.ugraphic.URectangle; import net.sourceforge.plantuml.ugraphic.URectangle;
import net.sourceforge.plantuml.ugraphic.UText; import net.sourceforge.plantuml.ugraphic.UText;
@ -148,6 +149,7 @@ public class UGraphicSvg extends AbstractUGraphic<SvgGraphics> implements ClipCo
registerDriver(UText.class, new DriverTextSvg(getStringBounder(), this)); registerDriver(UText.class, new DriverTextSvg(getStringBounder(), this));
} }
registerDriver(ULine.class, new DriverLineSvg(this)); registerDriver(ULine.class, new DriverLineSvg(this));
registerDriver(UPixel.class, new DriverPixelSvg());
registerDriver(UPolygon.class, new DriverPolygonSvg(this)); registerDriver(UPolygon.class, new DriverPolygonSvg(this));
registerDriver(UEllipse.class, new DriverEllipseSvg(this)); registerDriver(UEllipse.class, new DriverEllipseSvg(this));
registerDriver(UImage.class, new DriverImagePng(this)); registerDriver(UImage.class, new DriverImagePng(this));

View File

@ -80,7 +80,7 @@ public class Version {
} }
public static int beta() { public static int beta() {
final int beta = 2; final int beta = 6;
return beta; return beta;
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

View File

@ -146,7 +146,7 @@ public class WBSDiagram extends UmlDiagram {
if (root != null) { if (root != null) {
return CommandExecutionResult.error("Error 44"); return CommandExecutionResult.error("Error 44");
} }
initRoot(backColor, label, stereotype); initRoot(backColor, label, stereotype, shape);
return CommandExecutionResult.ok(); return CommandExecutionResult.ok();
} }
return add(backColor, level, label, stereotype, direction, shape); return add(backColor, level, label, stereotype, direction, shape);
@ -159,9 +159,9 @@ public class WBSDiagram extends UmlDiagram {
private WElement root; private WElement root;
private WElement last; private WElement last;
private void initRoot(HColor backColor, String label, String stereotype) { private void initRoot(HColor backColor, String label, String stereotype, IdeaShape shape) {
root = new WElement(backColor, Display.getWithNewlines(label), stereotype, root = new WElement(backColor, Display.getWithNewlines(label), stereotype,
getSkinParam().getCurrentStyleBuilder()); getSkinParam().getCurrentStyleBuilder(), shape);
last = root; last = root;
} }

View File

@ -41,9 +41,11 @@ import net.sourceforge.plantuml.ColorParam;
import net.sourceforge.plantuml.ISkinParam; import net.sourceforge.plantuml.ISkinParam;
import net.sourceforge.plantuml.UseStyle; import net.sourceforge.plantuml.UseStyle;
import net.sourceforge.plantuml.activitydiagram3.ftile.vertical.FtileBox; import net.sourceforge.plantuml.activitydiagram3.ftile.vertical.FtileBox;
import net.sourceforge.plantuml.creole.CreoleMode;
import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.graphic.AbstractTextBlock; import net.sourceforge.plantuml.graphic.AbstractTextBlock;
import net.sourceforge.plantuml.graphic.TextBlock; import net.sourceforge.plantuml.graphic.TextBlock;
import net.sourceforge.plantuml.graphic.TextBlockUtils;
import net.sourceforge.plantuml.mindmap.IdeaShape; import net.sourceforge.plantuml.mindmap.IdeaShape;
import net.sourceforge.plantuml.style.SName; import net.sourceforge.plantuml.style.SName;
import net.sourceforge.plantuml.style.Style; import net.sourceforge.plantuml.style.Style;
@ -96,7 +98,9 @@ abstract class WBSTextBlock extends AbstractTextBlock {
final FtileBox box = FtileBox.createWbs(style, idea.withBackColor(skinParam), label); final FtileBox box = FtileBox.createWbs(style, idea.withBackColor(skinParam), label);
return box; return box;
} }
throw new UnsupportedOperationException(); final TextBlock text = label.create0(style.getFontConfiguration(skinParam.getIHtmlColorSet()),
style.getHorizontalAlignment(), skinParam, style.wrapWidth(), CreoleMode.FULL, null, null);
return TextBlockUtils.withMargin(text, 0, 3, 1, 1);
} }
} }

View File

@ -104,8 +104,8 @@ final class WElement {
return result; return result;
} }
public WElement(HColor backColor, Display label, String stereotype, StyleBuilder styleBuilder) { public WElement(HColor backColor, Display label, String stereotype, StyleBuilder styleBuilder, IdeaShape shape) {
this(backColor, 0, label, stereotype, null, IdeaShape.BOX, styleBuilder); this(backColor, 0, label, stereotype, null, shape, styleBuilder);
} }
private WElement(HColor backColor, int level, Display label, String stereotype, WElement parent, IdeaShape shape, private WElement(HColor backColor, int level, Display label, String stereotype, WElement parent, IdeaShape shape,

View File

@ -55,6 +55,7 @@ public class YamlDiagramFactory extends PSystemAbstractFactory {
} }
public Diagram createSystem(UmlSource source) { public Diagram createSystem(UmlSource source) {
final List<String> highlighted = new ArrayList<String>();
JsonValue yaml = null; JsonValue yaml = null;
StyleExtractor styleExtractor = null; StyleExtractor styleExtractor = null;
try { try {
@ -67,13 +68,17 @@ public class YamlDiagramFactory extends PSystemAbstractFactory {
if (it.hasNext() == false) { if (it.hasNext() == false) {
break; break;
} }
if (line.startsWith("#highlight ")) {
highlighted.add(line.substring("#highlight ".length()).trim());
continue;
}
list.add(line); list.add(line);
} }
yaml = new SimpleYamlParser().parse(list); yaml = new SimpleYamlParser().parse(list);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
final JsonDiagram result = new JsonDiagram(UmlDiagramType.YAML, yaml, new ArrayList<String>()); final JsonDiagram result = new JsonDiagram(UmlDiagramType.YAML, yaml, highlighted);
if (styleExtractor != null) { if (styleExtractor != null) {
styleExtractor.applyStyles(result.getSkinParam()); styleExtractor.applyStyles(result.getSkinParam());
} }

View File

@ -44,7 +44,7 @@ import java.util.regex.Pattern;
public class YamlLines implements Iterable<String> { public class YamlLines implements Iterable<String> {
public static final String KEY = "([_0-9\\w].*)"; public static final String KEY = "([^:\\s]+)";
private List<String> lines = new ArrayList<String>(); private List<String> lines = new ArrayList<String>();