com.hfg.svg.SvgTSpan Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of com_hfg Show documentation
Show all versions of com_hfg Show documentation
com.hfg xml, html, svg, and bioinformatics utility library
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;
}
}