/* ======================================================================== * PlantUML : a free UML diagram generator * ======================================================================== * * (C) Copyright 2009-2023, 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.svek; import java.util.Objects; import net.sourceforge.plantuml.Dimension2DDouble; import net.sourceforge.plantuml.awt.geom.Dimension2D; import net.sourceforge.plantuml.graphic.AbstractTextBlock; import net.sourceforge.plantuml.graphic.HorizontalAlignment; import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.TextBlock; import net.sourceforge.plantuml.graphic.VerticalAlignment; import net.sourceforge.plantuml.ugraphic.MinMax; import net.sourceforge.plantuml.ugraphic.UGraphic; import net.sourceforge.plantuml.ugraphic.UTranslate; import net.sourceforge.plantuml.ugraphic.color.HColor; public class DecorateEntityImage extends AbstractTextBlock implements TextBlockBackcolored { private final TextBlock original; private final HorizontalAlignment horizontal1; private final TextBlock text1; private final HorizontalAlignment horizontal2; private final TextBlock text2; private double deltaX; private double deltaY; public static TextBlock addTop(TextBlock original, TextBlock text, HorizontalAlignment horizontal) { return new DecorateEntityImage(original, text, horizontal, null, null); } public static TextBlock addBottom(TextBlock original, TextBlock text, HorizontalAlignment horizontal) { return new DecorateEntityImage(original, null, null, text, horizontal); } public static TextBlock add(TextBlock original, TextBlock text, HorizontalAlignment horizontal, VerticalAlignment verticalAlignment) { if (verticalAlignment == VerticalAlignment.TOP) { return addTop(original, text, horizontal); } return addBottom(original, text, horizontal); } public static TextBlock addTopAndBottom(TextBlock original, TextBlock text1, HorizontalAlignment horizontal1, TextBlock text2, HorizontalAlignment horizontal2) { return new DecorateEntityImage(original, text1, horizontal1, text2, horizontal2); } private DecorateEntityImage(TextBlock original, TextBlock text1, HorizontalAlignment horizontal1, TextBlock text2, HorizontalAlignment horizontal2) { this.original = Objects.requireNonNull(original); this.horizontal1 = horizontal1; this.text1 = text1; this.horizontal2 = horizontal2; this.text2 = text2; } public void drawU(UGraphic ug) { final StringBounder stringBounder = ug.getStringBounder(); final Dimension2D dimOriginal = original.calculateDimension(stringBounder); final Dimension2D dimText1 = getTextDim(text1, stringBounder); final Dimension2D dimText2 = getTextDim(text2, stringBounder); final Dimension2D dimTotal = calculateDimension(stringBounder); final double yImage = dimText1.getHeight(); final double yText2 = yImage + dimOriginal.getHeight(); final double xImage = (dimTotal.getWidth() - dimOriginal.getWidth()) / 2; if (text1 != null) { final double xText1 = getTextX(dimText1, dimTotal, horizontal1); text1.drawU(ug.apply(UTranslate.dx(xText1))); } original.drawU(ug.apply(new UTranslate(xImage, yImage))); deltaX = xImage; deltaY = yImage; if (text2 != null) { final double xText2 = getTextX(dimText2, dimTotal, horizontal2); text2.drawU(ug.apply(new UTranslate(xText2, yText2))); } } private Dimension2D getTextDim(TextBlock text, StringBounder stringBounder) { if (text == null) { return new Dimension2DDouble(0, 0); } return text.calculateDimension(stringBounder); } private double getTextX(final Dimension2D dimText, final Dimension2D dimTotal, HorizontalAlignment h) { if (h == HorizontalAlignment.CENTER) { return (dimTotal.getWidth() - dimText.getWidth()) / 2; } else if (h == HorizontalAlignment.LEFT) { return 0; } else if (h == HorizontalAlignment.RIGHT) { return dimTotal.getWidth() - dimText.getWidth(); } else { throw new IllegalStateException(); } } public HColor getBackcolor() { if (original instanceof TextBlockBackcolored) { return ((TextBlockBackcolored) original).getBackcolor(); } throw new UnsupportedOperationException(); } public Dimension2D calculateDimension(StringBounder stringBounder) { final Dimension2D dimOriginal = original.calculateDimension(stringBounder); final Dimension2D dim1 = getTextDim(text1, stringBounder); final Dimension2D dim2 = getTextDim(text2, stringBounder); final Dimension2D dimText = Dimension2DDouble.mergeTB(dim1, dim2); return Dimension2DDouble.mergeTB(dimOriginal, dimText); } @Override public MinMax getMinMax(StringBounder stringBounder) { return MinMax.fromDim(calculateDimension(stringBounder)); } public final double getDeltaX() { if (original instanceof DecorateEntityImage) { return deltaX + ((DecorateEntityImage) original).deltaX; } return deltaX; } public final double getDeltaY() { if (original instanceof DecorateEntityImage) { return deltaY + ((DecorateEntityImage) original).deltaY; } return deltaY; } }