All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.hfg.svg.SvgTSpan Maven / Gradle / Ivy

There is a newer version: 20240423
Show newest version
package com.hfg.svg;

import java.awt.*;
import java.awt.geom.Rectangle2D;
import java.util.List;

import com.hfg.graphics.TextUtil;
import com.hfg.svg.attribute.SvgTextAnchor;
import com.hfg.util.StringUtil;
import com.hfg.xml.XMLTag;
import com.hfg.xml.XMLizable;

//------------------------------------------------------------------------------
/**
 * Object representation of an SVG (Scalable Vector Graphics) 'tspan' tag.
 * 
* @author J. Alex Taylor, hairyfatguy.com *
*/ //------------------------------------------------------------------------------ // com.hfg XML/HTML Coding Library // // This library 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 2.1 of the License, or (at your option) any later version. // // This library is 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, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // J. Alex Taylor, President, Founder, CEO, COO, CFO, OOPS hairyfatguy.com // [email protected] //------------------------------------------------------------------------------ public class SvgTSpan extends AbstractSvgNode implements SvgNode { //########################################################################## // CONSTRUCTORS //########################################################################## //--------------------------------------------------------------------------- public SvgTSpan() { super(SVG.tspan); } //--------------------------------------------------------------------------- public SvgTSpan(CharSequence inTitle) { this(); setContent(inTitle); } //--------------------------------------------------------------------------- public SvgTSpan(XMLTag inXMLTag) { this(); initFromXMLTag(inXMLTag); } //########################################################################## // PUBLIC METHODS //########################################################################## //--------------------------------------------------------------------------- @Override public String toString() { return super.toString() + ": " + getContent(); } //--------------------------------------------------------------------------- public SvgTSpan setId(String inValue) { setAttribute(SvgAttr.id, inValue); return this; } //--------------------------------------------------------------------------- public SvgTSpan setX(int inValue) { setAttribute(SvgAttr.x, inValue); return this; } //--------------------------------------------------------------------------- public SvgTSpan setX(float inValue) { setAttribute(SvgAttr.x, inValue); return this; } //--------------------------------------------------------------------------- public Float getX() { String xAttr = getAttributeValue(SvgAttr.x); return (StringUtil.isSet(xAttr) ? Float.parseFloat(xAttr) : null); } //--------------------------------------------------------------------------- public SvgTSpan setY(int inValue) { setAttribute(SvgAttr.y, inValue); return this; } //--------------------------------------------------------------------------- public SvgTSpan setY(float inValue) { setAttribute(SvgAttr.y, inValue); return this; } //--------------------------------------------------------------------------- public Float getY() { String yAttr = getAttributeValue(SvgAttr.y); return (StringUtil.isSet(yAttr) ? Float.parseFloat(yAttr) : null); } //--------------------------------------------------------------------------- public SvgTSpan setDy(int inValue) { setAttribute(SvgAttr.dy, inValue); return this; } //--------------------------------------------------------------------------- public SvgTSpan setDy(float inValue) { setAttribute(SvgAttr.dy, inValue); return this; } //--------------------------------------------------------------------------- public Float getDy() { String yAttr = getAttributeValue(SvgAttr.dy); return (StringUtil.isSet(yAttr) ? Float.parseFloat(yAttr) : null); } //--------------------------------------------------------------------------- public SvgTSpan setLineHeight(float inValue) { setAttribute(SvgAttr.lineHeight, inValue); return this; } //--------------------------------------------------------------------------- public Float getLineHeight() { String value = getAttributeValue(SvgAttr.lineHeight); return (StringUtil.isSet(value) ? Float.parseFloat(value) : null); } //-------------------------------------------------------------------------- @Override public SvgTSpan addStyle(CharSequence inValue) { return (SvgTSpan) super.addStyle(inValue); } //--------------------------------------------------------------------------- @Override public SvgTSpan setStyle(CharSequence inValue) { return (SvgTSpan) super.setStyle(inValue); } //--------------------------------------------------------------------------- // Determining the bounds box for a text node requires special handling. @Override public Rectangle2D getBoundsBox() { Font font = null; SvgTextAnchor textAnchor = SvgTextAnchor.start; XMLizable parentNode = getParentNode(); if (parentNode instanceof SvgText) { font = ((SvgText) getParentNode()).getFont(); if (((SvgText) getParentNode()).hasAttribute(SvgAttr.textAnchor)) { textAnchor = SvgTextAnchor.valueOf(((SvgText) getParentNode()).getAttributeValue(SvgAttr.textAnchor)); } } Rectangle textBounds = (font != null ? TextUtil.getStringRect(getContent(), font) : new Rectangle(0, 0, 0, 0)); float x = (getX() != null ? getX() : 0); if (textAnchor.equals(SvgTextAnchor.middle)) { x -= textBounds.getWidth() / 2f; } // TODO: Do we need to support dx as well? // The y position for the tspan can be an absolute y value or a delta from the previous value float y = 0; if (hasAttribute(SvgAttr.y)) { y = (getAttributeValue(SvgAttr.y) != null ? Float.parseFloat(getAttributeValue(SvgAttr.y)) : 0); } else if (hasAttribute(SvgAttr.dy) && parentNode instanceof SvgText) { List tspans = ((SvgText) parentNode).getSubtagsByClass(SvgTSpan.class); for (SvgTSpan tSpan : tspans) { if (tSpan.hasAttribute(SvgAttr.y)) { y = Float.parseFloat(tSpan.getAttributeValue(SvgAttr.y)); } else if (hasAttribute(SvgAttr.dy)) { y += Float.parseFloat(getAttributeValue(SvgAttr.dy)); } if (tSpan == this) { break; } } } Rectangle2D boundsBox = new Rectangle2D.Float(x, y - textBounds.height, textBounds.width, textBounds.height).getBounds(); adjustBoundsForTransform(boundsBox); return boundsBox; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy