summaryrefslogtreecommitdiff
path: root/src/net/sourceforge/plantuml/sequencediagram/teoz/PlayingSpace.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/net/sourceforge/plantuml/sequencediagram/teoz/PlayingSpace.java')
-rw-r--r--src/net/sourceforge/plantuml/sequencediagram/teoz/PlayingSpace.java197
1 files changed, 197 insertions, 0 deletions
diff --git a/src/net/sourceforge/plantuml/sequencediagram/teoz/PlayingSpace.java b/src/net/sourceforge/plantuml/sequencediagram/teoz/PlayingSpace.java
new file mode 100644
index 0000000..57353c7
--- /dev/null
+++ b/src/net/sourceforge/plantuml/sequencediagram/teoz/PlayingSpace.java
@@ -0,0 +1,197 @@
+/* ========================================================================
+ * 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.List;
+
+import net.sourceforge.plantuml.ISkinParam;
+import net.sourceforge.plantuml.graphic.StringBounder;
+import net.sourceforge.plantuml.real.Real;
+import net.sourceforge.plantuml.real.RealUtils;
+import net.sourceforge.plantuml.sequencediagram.LinkAnchor;
+import net.sourceforge.plantuml.sequencediagram.SequenceDiagram;
+import net.sourceforge.plantuml.ugraphic.LimitFinder;
+import net.sourceforge.plantuml.ugraphic.UGraphic;
+
+public class PlayingSpace implements Bordered {
+
+ private final double startingY = 8;
+ private final Real min;
+ private final Real max;
+ private final boolean isShowFootbox;
+
+ private final List<Tile> tiles = new ArrayList<Tile>();
+ private final LivingSpaces livingSpaces;
+ private final List<LinkAnchor> linkAnchors;
+ private final ISkinParam skinParam;
+
+ public PlayingSpace(SequenceDiagram diagram, Englobers englobers, TileArguments tileArguments) {
+
+ this.livingSpaces = tileArguments.getLivingSpaces();
+ this.linkAnchors = diagram.getLinkAnchors();
+ this.skinParam = diagram.getSkinParam();
+
+ final List<Real> min2 = new ArrayList<Real>();
+ final List<Real> max2 = new ArrayList<Real>();
+
+ min2.add(tileArguments.getOrigin());
+ max2.add(tileArguments.getOrigin());
+
+ if (englobers.size() > 0) {
+ min2.add(englobers.getMinX(tileArguments.getStringBounder()));
+ max2.add(englobers.getMaxX(tileArguments.getStringBounder()));
+ }
+
+ tiles.addAll(TileBuilder.buildSeveral(diagram.events().iterator(), tileArguments, null));
+
+ for (Tile tile : tiles) {
+ min2.add(tile.getMinX(tileArguments.getStringBounder()));
+ max2.add(tile.getMaxX(tileArguments.getStringBounder()));
+ }
+
+ for (LivingSpace livingSpace : livingSpaces.values()) {
+ max2.add(livingSpace.getPosD(tileArguments.getStringBounder()));
+ max2.add(livingSpace.getPosC2(tileArguments.getStringBounder()));
+ }
+
+ this.min = RealUtils.min(min2);
+ this.max = RealUtils.max(max2);
+
+ this.isShowFootbox = diagram.isShowFootbox();
+ }
+
+ public void drawBackground(UGraphic ug) {
+ final StringBounder stringBounder = ug.getStringBounder();
+ final LiveBoxFinder liveBoxFinder = new LiveBoxFinder(stringBounder);
+
+ drawUInternal(liveBoxFinder, false);
+ final UGraphicInterceptorTile interceptor = new UGraphicInterceptorTile(ug, true);
+ drawUInternal(interceptor, false);
+ }
+
+ public void drawForeground(UGraphic ug) {
+ final UGraphicInterceptorTile interceptor = new UGraphicInterceptorTile(ug, false);
+ drawUInternal(interceptor, false);
+ }
+
+ private double drawUInternal(UGraphic ug, boolean trace) {
+ final StringBounder stringBounder = ug.getStringBounder();
+ final List<YPositionedTile> positionedTiles = new ArrayList<YPositionedTile>();
+ final double y = GroupingTile.fillPositionelTiles(stringBounder, startingY, tiles, positionedTiles);
+ for (YPositionedTile tile : positionedTiles) {
+ tile.drawInArea(ug);
+ }
+ for (LinkAnchor linkAnchor : linkAnchors) {
+ final YPositionedTile tile1 = getFromAnchor(positionedTiles, linkAnchor.getAnchor1());
+ final YPositionedTile tile2 = getFromAnchor(positionedTiles, linkAnchor.getAnchor2());
+ if (tile1 != null && tile2 != null) {
+ linkAnchor.drawAnchor(ug, tile1, tile2, skinParam);
+ }
+ }
+ // System.err.println("MainTile::drawUInternal finalY=" + y);
+ return y;
+ }
+
+ private YPositionedTile getFromAnchor(List<YPositionedTile> positionedTiles, String anchor) {
+ for (YPositionedTile tile : positionedTiles) {
+ if (tile.matchAnchor(anchor)) {
+ return tile;
+ }
+ }
+ return null;
+ }
+
+ public double getPreferredHeight(StringBounder stringBounder) {
+ final LimitFinder limitFinder = new LimitFinder(stringBounder, true);
+ final UGraphicInterceptorTile interceptor = new UGraphicInterceptorTile(limitFinder, false);
+ final double finalY = drawUInternal(interceptor, false);
+ final double result = Math.max(limitFinder.getMinMax().getDimension().getHeight(), finalY) + 10;
+ // System.err.println("MainTile::getPreferredHeight=" + result);
+ return result;
+ }
+
+ public void addConstraints(StringBounder stringBounder) {
+ for (Tile tile : tiles) {
+ tile.addConstraints(stringBounder);
+ }
+ }
+
+ public Real getMinX(StringBounder stringBounder) {
+ return min;
+ }
+
+ public Real getMaxX(StringBounder stringBounder) {
+ return max;
+ }
+
+ public boolean isShowFootbox() {
+ return isShowFootbox;
+ }
+
+ public LivingSpaces getLivingSpaces() {
+ return livingSpaces;
+ }
+
+ public double getBorder1() {
+ return min.getCurrentValue();
+ }
+
+ public double getBorder2() {
+ return max.getCurrentValue();
+ }
+
+ public List<Double> yNewPages() {
+ final List<Double> yNewPages = new ArrayList<Double>();
+ yNewPages.add((double) 0);
+ for (Tile tile : tiles) {
+ if (tile instanceof GroupingTile) {
+ ((GroupingTile) tile).addYNewPages(yNewPages);
+ }
+ if (tile instanceof NewpageTile) {
+ final double y = ((NewpageTile) tile).getCallbackY();
+ yNewPages.add(y);
+ }
+ }
+ yNewPages.add(Double.MAX_VALUE);
+ return yNewPages;
+ }
+
+ public int getNbPages() {
+ return yNewPages().size() - 1;
+ }
+
+}