net.sourceforge.plantuml.sequencediagram.teoz.SequenceDiagramFileMakerTeoz Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of plantuml-lgpl Show documentation
Show all versions of plantuml-lgpl Show documentation
PlantUML is a component that allows to quickly write diagrams from text.
// THIS FILE HAS BEEN GENERATED BY A PREPROCESSOR.
/* +=======================================================================
* |
* | PlantUML : a free UML diagram generator
* |
* +=======================================================================
*
* (C) Copyright 2009-2024, Arnaud Roques
*
* Project Info: https://plantuml.com
*
* If you like this project or if you find it useful, you can support us at:
*
* https://plantuml.com/patreon (only 1$ per month!)
* https://plantuml.com/liberapay (only 1€ per month!)
* https://plantuml.com/paypal
*
*
* PlantUML is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser 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 Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library. If not, see .
*
* PlantUML can occasionally display sponsored or advertising messages. Those
* messages are usually generated on welcome or error images and never on
* functional diagrams.
* See https://plantuml.com/professional if you want to remove them
*
* Images (whatever their format : PNG, SVG, EPS...) generated by running PlantUML
* are owned by the author of their corresponding sources code (that is, their
* textual description in PlantUML language). Those images are not covered by
* this LGPL license.
*
* The generated images can then be used without any reference to the LGPL license.
* It is not even necessary to stipulate that they have been generated with PlantUML,
* although this will be appreciated by the PlantUML team.
*
* There is an exception : if the textual description in PlantUML language is also covered
* by any license, then the generated images are logically covered
* by the very same license.
*
* This is the IGY distribution (Install GraphViz by Yourself).
* You have to install GraphViz and to setup the GRAPHVIZ_DOT environment variable
* (see https://plantuml.com/graphviz-dot )
*
* Icons provided by OpenIconic : https://useiconic.com/open
* Archimate sprites provided by Archi : http://www.archimatetool.com
* Stdlib AWS provided by https://github.com/milo-minderbinder/AWS-PlantUML
* Stdlib Icons provided https://github.com/tupadr3/plantuml-icon-font-sprites
* ASCIIMathML (c) Peter Jipsen http://www.chapman.edu/~jipsen
* ASCIIMathML (c) David Lippman http://www.pierce.ctc.edu/dlippman
* CafeUndZopfli ported by Eugene Klyuchnikov https://github.com/eustas/CafeUndZopfli
* Brotli (c) by the Brotli Authors https://github.com/google/brotli
* Themes (c) by Brett Schwarz https://github.com/bschwarz/puml-themes
* Twemoji (c) by Twitter at https://twemoji.twitter.com/
*
*/
package net.sourceforge.plantuml.sequencediagram.teoz;
import java.io.IOException;
import java.io.OutputStream;
import net.sourceforge.plantuml.AnnotatedBuilder;
import net.sourceforge.plantuml.FileFormatOption;
import net.sourceforge.plantuml.activitydiagram3.ftile.EntityImageLegend;
import net.sourceforge.plantuml.core.ImageData;
import net.sourceforge.plantuml.cucadiagram.DisplaySection;
import net.sourceforge.plantuml.klimt.LineBreakStrategy;
import net.sourceforge.plantuml.klimt.UTranslate;
import net.sourceforge.plantuml.klimt.creole.Display;
import net.sourceforge.plantuml.klimt.drawing.UGraphic;
import net.sourceforge.plantuml.klimt.font.FontParam;
import net.sourceforge.plantuml.klimt.font.StringBounder;
import net.sourceforge.plantuml.klimt.geom.HorizontalAlignment;
import net.sourceforge.plantuml.klimt.geom.VerticalAlignment;
import net.sourceforge.plantuml.klimt.geom.XDimension2D;
import net.sourceforge.plantuml.klimt.shape.TextBlock;
import net.sourceforge.plantuml.klimt.shape.TextBlockUtils;
import net.sourceforge.plantuml.klimt.shape.UDrawable;
import net.sourceforge.plantuml.png.PngTitler;
import net.sourceforge.plantuml.real.Real;
import net.sourceforge.plantuml.real.RealOrigin;
import net.sourceforge.plantuml.real.RealUtils;
import net.sourceforge.plantuml.sequencediagram.Participant;
import net.sourceforge.plantuml.sequencediagram.SequenceDiagram;
import net.sourceforge.plantuml.sequencediagram.graphic.FileMaker;
import net.sourceforge.plantuml.skin.SimpleContext2D;
import net.sourceforge.plantuml.skin.rose.Rose;
import net.sourceforge.plantuml.style.ISkinParam;
import net.sourceforge.plantuml.style.SName;
import net.sourceforge.plantuml.style.Style;
import net.sourceforge.plantuml.style.StyleSignatureBasic;
import net.sourceforge.plantuml.utils.MathUtils;
public class SequenceDiagramFileMakerTeoz implements FileMaker {
private final SequenceDiagram diagram;
private final FileFormatOption fileFormatOption;
private final Rose skin;
private final AnnotatedBuilder annotatedBuilder;
private final int index;
public SequenceDiagramFileMakerTeoz(SequenceDiagram diagram, Rose skin, FileFormatOption fileFormatOption,
int index) {
this.index = index;
this.stringBounder = fileFormatOption.getDefaultStringBounder(diagram.getSkinParam());
this.diagram = diagram;
this.fileFormatOption = fileFormatOption;
this.skin = skin;
this.body = new PlayingSpaceWithParticipants(createMainTile());
this.footer = getFooterOrHeader(FontParam.FOOTER);
this.header = getFooterOrHeader(FontParam.HEADER);
this.annotatedBuilder = new AnnotatedBuilder(diagram, diagram.getSkinParam(), stringBounder);
this.min1 = body.getMinX(stringBounder);
this.title = getTitle();
this.legend = getLegend();
this.caption = annotatedBuilder.getCaption();
this.heightEnglober1 = dolls.getOffsetForEnglobers(stringBounder);
this.heightEnglober2 = heightEnglober1 == 0 ? 0 : 10;
final double totalWidth = MathUtils.max(body.calculateDimension(stringBounder).getWidth(),
title.calculateDimension(stringBounder).getWidth(), footer.calculateDimension(stringBounder).getWidth(),
header.calculateDimension(stringBounder).getWidth(),
legend.calculateDimension(stringBounder).getWidth());
final double totalHeight = body.calculateDimension(stringBounder).getHeight() + heightEnglober1
+ heightEnglober2 + title.calculateDimension(stringBounder).getHeight()
+ header.calculateDimension(stringBounder).getHeight()
+ legend.calculateDimension(stringBounder).getHeight()
+ caption.calculateDimension(stringBounder).getHeight()
+ footer.calculateDimension(stringBounder).getHeight() + (annotatedBuilder.hasMainFrame() ? 10 : 0);
this.dimTotal = new XDimension2D(totalWidth, totalHeight);
}
private Dolls dolls;
private final StringBounder stringBounder;
private final TextBlock footer;
private final TextBlock header;
private final PlayingSpaceWithParticipants body;
private final TextBlock title;
private final TextBlock legend;
private final TextBlock caption;
private final XDimension2D dimTotal;
private final Real min1;
private final LivingSpaces livingSpaces = new LivingSpaces();
private final double heightEnglober1;
private final double heightEnglober2;
public ImageData createOne(OutputStream os, final int index, boolean isWithMetadata) throws IOException {
if (this.index != index)
throw new IllegalStateException();
return diagram.createImageBuilder(fileFormatOption).drawable(new Foo(index)).write(os);
}
class Foo implements UDrawable {
private final int index;
Foo(int index) {
this.index = index;
}
public void drawU(UGraphic ug) {
drawInternal(ug, index);
}
}
private UGraphic goDownAndCenterForEnglobers(UGraphic ug) {
ug = goDown(ug, title);
ug = goDown(ug, header);
if (diagram.getLegend().getVerticalAlignment() == VerticalAlignment.TOP)
ug = goDown(ug, legend);
final double dx = (dimTotal.getWidth() - body.calculateDimension(stringBounder).getWidth()) / 2;
return ug.apply(UTranslate.dx(dx));
}
private UGraphic goDown(UGraphic ug, TextBlock size) {
return ug.apply(UTranslate.dy(size.calculateDimension(stringBounder).getHeight()));
}
public void printAligned(UGraphic ug, HorizontalAlignment align, final TextBlock layer) {
double dx = 0;
if (align == HorizontalAlignment.RIGHT)
dx = dimTotal.getWidth() - layer.calculateDimension(stringBounder).getWidth();
else if (align == HorizontalAlignment.CENTER)
dx = (dimTotal.getWidth() - layer.calculateDimension(stringBounder).getWidth()) / 2;
layer.drawU(ug.apply(UTranslate.dx(dx)));
}
private PlayingSpace createMainTile() {
final RealOrigin xorigin = RealUtils.createOrigin();
Real xcurrent = xorigin.addAtLeast(0);
final RealOrigin yorigin = RealUtils.createOrigin();
for (Participant p : diagram.participants()) {
final LivingSpace livingSpace = new LivingSpace(p, diagram.getEnglober(p), skin, getSkinParam(), xcurrent,
diagram.events());
livingSpaces.put(p, livingSpace);
xcurrent = livingSpace.getPosD(stringBounder).addAtLeast(0);
}
final TileArguments tileArguments = new TileArguments(stringBounder, livingSpaces, skin, diagram.getSkinParam(),
xorigin, yorigin);
this.dolls = new Dolls(tileArguments);
final PlayingSpace mainTile = new PlayingSpace(diagram, dolls, tileArguments);
this.livingSpaces.addConstraints(stringBounder);
mainTile.addConstraints();
this.dolls.addConstraints(stringBounder);
xorigin.compileNow();
if (YGauge.USE_ME)
System.err.println("COMPILING Y");
yorigin.compileNow();
tileArguments.setBordered(mainTile);
return mainTile;
}
public ISkinParam getSkinParam() {
return diagram.getSkinParam();
}
private TextBlock getTitle() {
if (diagram.getTitle().isNull())
return new ComponentAdapter(null);
final Style style = StyleSignatureBasic.of(SName.root, SName.document, SName.title)
.getMergedStyle(diagram.getSkinParam().getCurrentStyleBuilder());
final TextBlock compTitle = style.createTextBlockBordered(diagram.getTitle().getDisplay(),
diagram.getSkinParam().getIHtmlColorSet(), diagram.getSkinParam(), Style.ID_TITLE,
LineBreakStrategy.NONE);
return compTitle;
}
private TextBlock getLegend() {
final Display legend = diagram.getLegend().getDisplay();
if (Display.isNull(legend))
return TextBlockUtils.empty(0, 0);
return EntityImageLegend.create(legend, diagram.getSkinParam());
}
public TextBlock getFooterOrHeader(final FontParam param) {
if (diagram.getFooterOrHeaderTeoz(param).isNull())
return new TeozLayer(null, stringBounder, param);
final DisplaySection display = diagram.getFooterOrHeaderTeoz(param).withPage(index + 1, getNbPages());
final ISkinParam skinParam = diagram.getSkinParam();
final StyleSignatureBasic def = param.getStyleDefinition(null);
final Style style = def.getMergedStyle(skinParam.getCurrentStyleBuilder());
final PngTitler pngTitler = new PngTitler(display, style, skinParam.getIHtmlColorSet(), skinParam);
return new TeozLayer(pngTitler, stringBounder, param);
}
public int getNbPages() {
return body.getNbPages();
}
private void drawInternal(UGraphic ug, int index) {
body.setIndex(index);
final UTranslate min1translate = UTranslate.dx(-min1.getCurrentValue());
ug = ug.apply(min1translate);
dolls.drawEnglobers(goDownAndCenterForEnglobers(ug),
body.calculateDimension(stringBounder).getHeight() + heightEnglober1 + heightEnglober2 / 2,
new SimpleContext2D(true));
printAligned(ug, diagram.getFooterOrHeaderTeoz(FontParam.HEADER).getHorizontalAlignment(), header);
ug = goDown(ug, header);
final StyleSignatureBasic def = FontParam.TITLE.getStyleDefinition(null);
final HorizontalAlignment titleAlignment = def.getMergedStyle(diagram.getSkinParam().getCurrentStyleBuilder())
.getHorizontalAlignment();
printAligned(ug, titleAlignment, title);
ug = goDown(ug, title);
if (diagram.getLegend().getVerticalAlignment() == VerticalAlignment.TOP) {
printAligned(ug, diagram.getLegend().getHorizontalAlignment(), legend);
ug = goDown(ug, legend);
}
ug = ug.apply(UTranslate.dy(heightEnglober1));
final TextBlock bodyFramed = annotatedBuilder.decoreWithFrame(body);
printAligned(ug.apply(UTranslate.dx((annotatedBuilder.hasMainFrame() ? 4 : 0))), HorizontalAlignment.CENTER,
bodyFramed);
ug = goDown(ug, bodyFramed);
ug = ug.apply(UTranslate.dy(heightEnglober2));
if (diagram.getLegend().getVerticalAlignment() == VerticalAlignment.BOTTOM) {
printAligned(ug, diagram.getLegend().getHorizontalAlignment(), legend);
ug = goDown(ug, legend);
}
printAligned(ug, HorizontalAlignment.CENTER, caption);
ug = goDown(ug, caption);
printAligned(ug, diagram.getFooterOrHeaderTeoz(FontParam.FOOTER).getHorizontalAlignment(), footer);
}
@Override
public void createOneGraphic(UGraphic ug) {
throw new UnsupportedOperationException();
}
}