diff options
Diffstat (limited to 'src/net/sourceforge/plantuml/sprite/StdlibDiagram.java')
-rw-r--r-- | src/net/sourceforge/plantuml/sprite/StdlibDiagram.java | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/src/net/sourceforge/plantuml/sprite/StdlibDiagram.java b/src/net/sourceforge/plantuml/sprite/StdlibDiagram.java new file mode 100644 index 0000000..0edd374 --- /dev/null +++ b/src/net/sourceforge/plantuml/sprite/StdlibDiagram.java @@ -0,0 +1,164 @@ +/* ======================================================================== + * 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.sprite; + +import java.awt.geom.Dimension2D; +import java.io.IOException; +import java.io.OutputStream; +import java.util.List; + +import net.sourceforge.plantuml.Dimension2DDouble; +import net.sourceforge.plantuml.FileFormatOption; +import net.sourceforge.plantuml.ISkinSimple; +import net.sourceforge.plantuml.UmlDiagram; +import net.sourceforge.plantuml.UmlDiagramType; +import net.sourceforge.plantuml.WithSprite; +import net.sourceforge.plantuml.command.BlocLines; +import net.sourceforge.plantuml.command.Command; +import net.sourceforge.plantuml.command.CommandFactorySprite; +import net.sourceforge.plantuml.core.DiagramDescription; +import net.sourceforge.plantuml.core.ImageData; +import net.sourceforge.plantuml.cucadiagram.Display; +import net.sourceforge.plantuml.graphic.AbstractTextBlock; +import net.sourceforge.plantuml.graphic.FontConfiguration; +import net.sourceforge.plantuml.graphic.HorizontalAlignment; +import net.sourceforge.plantuml.graphic.HtmlColorUtils; +import net.sourceforge.plantuml.graphic.StringBounder; +import net.sourceforge.plantuml.graphic.TextBlock; +import net.sourceforge.plantuml.graphic.TextBlockUtils; +import net.sourceforge.plantuml.preproc.Stdlib; +import net.sourceforge.plantuml.ugraphic.ImageBuilder; +import net.sourceforge.plantuml.ugraphic.UFont; +import net.sourceforge.plantuml.ugraphic.UGraphic; +import net.sourceforge.plantuml.ugraphic.UTranslate; + +public class StdlibDiagram extends UmlDiagram { + + private static final int WIDTH = 1800; + private String name; + + public StdlibDiagram(ISkinSimple skinParam) { + super(skinParam); + } + + public DiagramDescription getDescription() { + return new DiagramDescription("(Sprites)"); + } + + @Override + public UmlDiagramType getUmlDiagramType() { + return UmlDiagramType.HELP; + } + + @Override + protected ImageData exportDiagramInternal(OutputStream os, int index, FileFormatOption fileFormatOption) + throws IOException { + + final TextBlock result = getTable(); + final double margin = 10; + final double dpiFactor = 1; + + final ImageBuilder imageBuilder = new ImageBuilder(getSkinParam(), dpiFactor, + fileFormatOption.isWithMetadata() ? getMetadata() : null, getWarningOrError(), margin, margin, + getAnimation()); + imageBuilder.setUDrawable(result); + + return imageBuilder.writeImageTOBEMOVED(fileFormatOption, seed(), os); + } + + private TextBlock getTable() { + return new AbstractTextBlock() { + + public void drawU(UGraphic ug) { + try { + drawInternal(ug); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public Dimension2D calculateDimension(StringBounder stringBounder) { + return new Dimension2DDouble(WIDTH, 4096); + } + }; + } + + public void setStdlibName(String name) { + this.name = name; + } + + private void drawInternal(UGraphic ug) throws IOException { + double x = 0; + double y = 0; + double rawHeight = 0; + final Stdlib folder = Stdlib.retrieve(name); + + final CommandFactorySprite factorySpriteCommand = new CommandFactorySprite(); + + Command<WithSprite> cmd = factorySpriteCommand.createMultiLine(false); + + final List<String> all = folder.extractAllSprites(); + int nb = 0; + for (String s : all) { + // System.err.println("s="+s); + final BlocLines bloc = BlocLines.fromArray(s.split("\n")); + cmd.execute(this, bloc); +// System.err.println("nb=" + nb); + nb++; + } + + for (String n : getSkinParam().getAllSpriteNames()) { + final Sprite sprite = getSkinParam().getSprite(n); + TextBlock blockName = Display.create(n).create(FontConfiguration.blackBlueTrue(UFont.sansSerif(14)), + HorizontalAlignment.LEFT, getSkinParam()); + TextBlock tb = sprite.asTextBlock(HtmlColorUtils.BLACK, 1.0); + tb = TextBlockUtils.mergeTB(tb, blockName, HorizontalAlignment.CENTER); + tb.drawU(ug.apply(new UTranslate(x, y))); + final Dimension2D dim = tb.calculateDimension(ug.getStringBounder()); + rawHeight = Math.max(rawHeight, dim.getHeight()); + x += dim.getWidth(); + x += 30; + if (x > WIDTH) { + x = 0; + y += rawHeight + 50; + rawHeight = 0; + if (y > 1024) { +// break; + } + } + } + } +} |