/* ======================================================================== * 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.creole; import java.awt.geom.Dimension2D; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import net.sourceforge.plantuml.Dimension2DDouble; import net.sourceforge.plantuml.graphic.HtmlColor; import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.salt.element.Skeleton2; import net.sourceforge.plantuml.ugraphic.UChangeColor; import net.sourceforge.plantuml.ugraphic.UGraphic; import net.sourceforge.plantuml.ugraphic.UTranslate; public class AtomTree extends AbstractAtom implements Atom { private final HtmlColor lineColor; private final List cells = new ArrayList(); private final Map levels = new HashMap(); private final double margin = 2; public AtomTree(HtmlColor lineColor) { this.lineColor = lineColor; } public Dimension2D calculateDimension(StringBounder stringBounder) { final Skeleton2 skeleton = new Skeleton2(); double width = 0; double height = 0; for (Atom cell : cells) { final Dimension2D dim = cell.calculateDimension(stringBounder); height += dim.getHeight(); final int level = getLevel(cell); width = Math.max(width, skeleton.getXEndForLevel(level) + margin + dim.getWidth()); } return new Dimension2DDouble(width, height); } public double getStartingAltitude(StringBounder stringBounder) { return 0; } public void drawU(final UGraphic ugInit) { final Skeleton2 skeleton = new Skeleton2(); double y = 0; UGraphic ug = ugInit; for (Atom cell : cells) { final int level = getLevel(cell); cell.drawU(ug.apply(new UTranslate(margin + skeleton.getXEndForLevel(level), 0))); final Dimension2D dim = cell.calculateDimension(ug.getStringBounder()); skeleton.add(level, y + dim.getHeight() / 2); ug = ug.apply(new UTranslate(0, dim.getHeight())); y += dim.getHeight(); } skeleton.draw(ugInit.apply(new UChangeColor(this.lineColor))); } private int getLevel(Atom atom) { return levels.get(atom); } public void addCell(Atom cell, int level) { this.cells.add(cell); this.levels.put(cell, level); } }