/* GNU GENERAL LICENSE Copyright (C) 2006 The Lobo Project. Copyright (C) 2014 - 2017 Lobo Evolution This program 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 verion 3 of the License, or (at your option) any later version. This program 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 General License for more details. You should have received a copy of the GNU General Public along with this program. If not, see <http://www.gnu.org/licenses/>. Contact info: lobochief@users.sourceforge.net; ivan.difrancesco@yahoo.it */ package org.lobobrowser.html.svgimpl; import org.lobobrowser.w3c.svg.SVGLength; import org.w3c.dom.DOMException; public class SVGLengthImpl implements SVGLength { private short unitType; private float valueInSpecifiedUnits; public SVGLengthImpl() { this.unitType = SVGLength.SVG_LENGTHTYPE_UNKNOWN; this.valueInSpecifiedUnits = 0.0f; } public SVGLengthImpl(short unitType) { this.unitType = unitType; this.valueInSpecifiedUnits = 0.0f; } public SVGLengthImpl(short unitType, float valueInSpecifiedUnits) { this.unitType = unitType; this.valueInSpecifiedUnits = valueInSpecifiedUnits; } public SVGLengthImpl(String valueAsString) { setValueAsString(valueAsString); } public SVGLengthImpl(float valueInSpecifiedUnits) { this.unitType = SVGLength.SVG_LENGTHTYPE_NUMBER; this.valueInSpecifiedUnits = valueInSpecifiedUnits; } @Override public short getUnitType() { return this.unitType; } @Override public float getValue() { convertToSpecifiedUnits(SVGLengthImpl.SVG_LENGTHTYPE_NUMBER); return valueInSpecifiedUnits; } @Override public void setValue(float value) { this.valueInSpecifiedUnits = value; this.unitType = SVGLengthImpl.SVG_LENGTHTYPE_NUMBER; } @Override public String getValueAsString() { String suffix = getUnitTypeAsString(this.unitType); if (suffix.equals("unkown")) throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Unknow unit type"); if (this.valueInSpecifiedUnits == (long) this.valueInSpecifiedUnits) return String.format("%f" + suffix, (long) this.valueInSpecifiedUnits); else return String.format("%s" + suffix, this.valueInSpecifiedUnits); } @Override public void setValueAsString(String valueAsString) { if(valueAsString == null) valueAsString = "0"; String valueString = null; if (valueAsString.endsWith("cm")) { valueString = valueAsString.substring(0, valueAsString.length() - 2); this.unitType = SVGLengthImpl.SVG_LENGTHTYPE_CM; } else if (valueAsString.endsWith("ems")) { valueString = valueAsString.substring(0, valueAsString.length() - 3); this.unitType = SVGLengthImpl.SVG_LENGTHTYPE_EMS; } else if (valueAsString.endsWith("exs")) { valueString = valueAsString.substring(0, valueAsString.length() - 3); this.unitType = SVGLengthImpl.SVG_LENGTHTYPE_EXS; } else if (valueAsString.endsWith("in")) { valueString = valueAsString.substring(0, valueAsString.length() - 2); this.unitType = SVGLengthImpl.SVG_LENGTHTYPE_IN; } else if (valueAsString.endsWith("mm")) { valueString = valueAsString.substring(0, valueAsString.length() - 2); this.unitType = SVGLengthImpl.SVG_LENGTHTYPE_MM; } else if (valueAsString.endsWith("pc")) { valueString = valueAsString.substring(0, valueAsString.length() - 2); this.unitType = SVGLengthImpl.SVG_LENGTHTYPE_PC; } else if (valueAsString.endsWith("%")) { valueString = valueAsString.substring(0, valueAsString.length() - 1); this.unitType = SVGLengthImpl.SVG_LENGTHTYPE_PERCENTAGE; } else if (valueAsString.endsWith("pt")) { valueString = valueAsString.substring(0, valueAsString.length() - 2); this.unitType = SVGLengthImpl.SVG_LENGTHTYPE_PT; } else if (valueAsString.endsWith("px")) { valueString = valueAsString.substring(0, valueAsString.length() - 2); this.unitType = SVGLengthImpl.SVG_LENGTHTYPE_PX; } else { valueString = valueAsString; this.unitType = SVGLengthImpl.SVG_LENGTHTYPE_NUMBER; } try { this.valueInSpecifiedUnits = Float.parseFloat(valueString); } catch (NumberFormatException e) { throw new DOMException(DOMException.SYNTAX_ERR, "Invalid value: '" + valueString + "'!"); } } @Override public void newValueSpecifiedUnits(short unitType, float valueInSpecifiedUnits) { if (unitType != SVGLengthImpl.SVG_LENGTHTYPE_CM && unitType != SVGLengthImpl.SVG_LENGTHTYPE_EMS && unitType != SVGLengthImpl.SVG_LENGTHTYPE_EXS && unitType != SVGLengthImpl.SVG_LENGTHTYPE_IN && unitType != SVGLengthImpl.SVG_LENGTHTYPE_MM && unitType != SVGLengthImpl.SVG_LENGTHTYPE_NUMBER && unitType != SVGLengthImpl.SVG_LENGTHTYPE_PC && unitType != SVGLengthImpl.SVG_LENGTHTYPE_PERCENTAGE && unitType != SVGLengthImpl.SVG_LENGTHTYPE_PT && unitType != SVGLengthImpl.SVG_LENGTHTYPE_PX) { throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Invalid unit type"); } this.unitType = unitType; this.valueInSpecifiedUnits = valueInSpecifiedUnits; } @Override public void convertToSpecifiedUnits(short unitType) { if (this.unitType == unitType) return; float inchValue = this.valueInSpecifiedUnits; switch (this.unitType) { case SVGLengthImpl.SVG_LENGTHTYPE_IN: break; case SVGLengthImpl.SVG_LENGTHTYPE_CM: inchValue = this.valueInSpecifiedUnits / 2.54f; break; case SVGLengthImpl.SVG_LENGTHTYPE_MM: inchValue = this.valueInSpecifiedUnits / 25.40013f; break; case SVGLengthImpl.SVG_LENGTHTYPE_PT: inchValue = this.valueInSpecifiedUnits / 72.26999f; break; case SVGLengthImpl.SVG_LENGTHTYPE_PX: inchValue = this.valueInSpecifiedUnits / 96.0f; break; case SVGLengthImpl.SVG_LENGTHTYPE_EMS: inchValue = this.valueInSpecifiedUnits / 7.22699f; break; case SVGLengthImpl.SVG_LENGTHTYPE_PC: inchValue = this.valueInSpecifiedUnits / 6.0225f; break; default: break; } switch (unitType) { case SVGLengthImpl.SVG_LENGTHTYPE_IN: this.valueInSpecifiedUnits = inchValue; case SVGLengthImpl.SVG_LENGTHTYPE_MM: this.valueInSpecifiedUnits = inchValue * 25.40013f; case SVGLengthImpl.SVG_LENGTHTYPE_CM: this.valueInSpecifiedUnits = inchValue * 25.4f; case SVGLengthImpl.SVG_LENGTHTYPE_PT: this.valueInSpecifiedUnits = inchValue * 72.26999f; case SVGLengthImpl.SVG_LENGTHTYPE_PX: this.valueInSpecifiedUnits = inchValue * 96.0f; case SVGLengthImpl.SVG_LENGTHTYPE_EMS: this.valueInSpecifiedUnits = inchValue * 7.22699f; case SVGLengthImpl.SVG_LENGTHTYPE_PC: this.valueInSpecifiedUnits = inchValue * 6.0225f; default: this.valueInSpecifiedUnits = inchValue; } this.unitType = unitType; } public float getValueInSpecifiedUnits() { return valueInSpecifiedUnits; } public void setValueInSpecifiedUnits(float valueInSpecifiedUnits) { this.valueInSpecifiedUnits = valueInSpecifiedUnits; } private String getUnitTypeAsString(short unitType) { String suffix = ""; switch (unitType) { case SVGLengthImpl.SVG_LENGTHTYPE_CM: suffix = "cm"; break; case SVGLengthImpl.SVG_LENGTHTYPE_EMS: suffix = "ems"; break; case SVGLengthImpl.SVG_LENGTHTYPE_EXS: suffix = "exs"; break; case SVGLengthImpl.SVG_LENGTHTYPE_IN: suffix = "in"; break; case SVGLengthImpl.SVG_LENGTHTYPE_MM: suffix = "mm"; break; case SVGLengthImpl.SVG_LENGTHTYPE_PC: suffix = "pc"; break; case SVGLengthImpl.SVG_LENGTHTYPE_PERCENTAGE: suffix = "%"; break; case SVGLengthImpl.SVG_LENGTHTYPE_PT: suffix = "pt"; break; case SVGLengthImpl.SVG_LENGTHTYPE_PX: suffix = "px"; break; case SVGLengthImpl.SVG_LENGTHTYPE_NUMBER: suffix = ""; break; case SVGLengthImpl.SVG_LENGTHTYPE_UNKNOWN: suffix = "unknown"; default: throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Invalid unit type"); } return suffix; } }