package com.mxgraph.io.vdx; import com.mxgraph.util.mxPoint; import java.util.ArrayList; import java.util.List; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * This class is a general wrapper for one Shape Element.<br/> * Provides a set of method for retrieve the value of the diferents properties * stored in the shape element.<br/> * References to other shapes or stylesheets are not considered. */ public class mxGeneralShape { protected Element shape; /** * Create a new instance of mxGeneralShape * @param shape Shape Element to be wrapped. */ public mxGeneralShape(Element shape) { this.shape = shape; } /** * Returns the shape contained. * @return Shape Element contained. */ public Element getShape() { return shape; } /** * Sets the shape to be contained. * @param shape Shape Element to be contained. */ public void setShape(Element shape) { this.shape = shape; } /** * Returns the id of the stylesheet that contains the fill style. * @return ID of the stylesheet. */ public String getFillStyleId() { return shape.getAttribute(mxVdxConstants.FILL_STYLE); } /** * Returns the id of the stylesheet that contains the line style * @return ID of the stylesheet. */ public String getLineStyleId() { return shape.getAttribute(mxVdxConstants.LINE_STYLE); } /** * Returns the id of the stylesheet that contains the text style * @return ID of the stylesheet. */ public String getTextStyleId() { return shape.getAttribute(mxVdxConstants.TEXT_STYLE); } /** * Checks if the shape Element has a children with tag name = 'tag'. * @param tag Name of the Element to be found. * @return Returns <code>true</code> if the shape Element has a children with tag name = 'tag' */ protected boolean hasPrimaryTag(String tag) { boolean ret = false; NodeList childrens = shape.getChildNodes(); if (mxVdxUtils.nodeListHasTag(childrens, tag)) { ret = true; } else { ret = false; } return ret; } /** * Returns the element with tag name = 'tag' in the childrens of shape * @param tag Name of the Element to be found. * @return Element with tag name = 'tag'. */ protected Element getPrimaryTag(String tag) { NodeList childrens = shape.getChildNodes(); Element primary = null; if (mxVdxUtils.nodeListHasTag(childrens, tag)) { primary = mxVdxUtils.nodeListTag(childrens, tag); } return primary; } /** * Returns the element with tag name = 'tag' and IX attribute = 'ix' in the childrens of shape. * @param tag Name of the Element to be found. * @param ix Index of the Element to be found. * @return Element with tag name = 'tag' and IX attribute = 'ix'. */ protected Element getPrimaryTagIndexed(String tag, String ix) { NodeList childrens = shape.getChildNodes(); Element primary = null; if (mxVdxUtils.nodeListHasTag(childrens, tag)) { primary = mxVdxUtils.nodeListTagIndexed(childrens, tag, ix); } return primary; } /** * Checks if the 'primary' Element has a children with tag name = 'tag'. * @param tag Name of the Element to be found. * @return Returns <code>true</code> if the 'primary' Element has a children with tag name = 'tag'. */ protected boolean hasSecundaryTag(Element primary, String tag) { NodeList xChildrens = null; boolean ret = false; if (primary != null) { xChildrens = primary.getChildNodes(); } if (mxVdxUtils.nodeListHasTag(xChildrens, tag)) { ret = true; } else { ret = false; } return ret; } /** * Returns the value of the element with tag name = 'tag' in the childrens * of 'primary' in his double representation.<br/> * .vdx uses Inches for numerical representations, so this value * is multiplied by the result of <code>mxVdxUtils.conversionFactor()</code> * and is converted to pixels. * @param tag Name of the Element to be found. * @return Numerical value of the element. */ protected double getNumericalValueOfSecundaryTag(Element primary, String tag) { double val = 0; NodeList xChildrens = null; if (primary != null) { xChildrens = primary.getChildNodes(); } Element elem = null; if (mxVdxUtils.nodeListHasTag(xChildrens, tag)) { elem = mxVdxUtils.nodeListTag(xChildrens, tag); } if (elem != null) { val = Double.parseDouble(elem.getTextContent()) * mxVdxUtils.conversionFactor(); } return val; } /** * Returns the value of the element with tag name = 'tag' in the childrens * of primary. * @param tag Name of the Element to be found. * @return String value of the element. */ protected String getValueOfSecundaryTag(Element primary, String tag) { String val = ""; NodeList xChildrens = null; if (primary != null) { xChildrens = primary.getChildNodes(); } Element elem = null; if (mxVdxUtils.nodeListHasTag(xChildrens, tag)) { elem = mxVdxUtils.nodeListTag(xChildrens, tag); val = elem.getTextContent(); } return val; } /** * Check if the shape has defined a pinX element. * @return Returns <code>true</code> if the shape has defined a pinX element. */ public boolean hasPinX() { Element xForm = getPrimaryTag(mxVdxConstants.X_FORM); return hasSecundaryTag(xForm, mxVdxConstants.PIN_X); } /** * Returns the value of the pinX element. * @return The shape pinX element */ public double getPinX() { Element xForm = getPrimaryTag(mxVdxConstants.X_FORM); double px = 0; if (hasSecundaryTag(xForm, mxVdxConstants.PIN_X)) { px = getNumericalValueOfSecundaryTag(xForm, mxVdxConstants.PIN_X); } return px; } /** * Returns <code>true</code> if the shape has defined a pinY element. * @return Returns <code>true</code> if the shape has defined a pinY element. */ public boolean hasPinY() { Element xForm = getPrimaryTag(mxVdxConstants.X_FORM); return hasSecundaryTag(xForm, mxVdxConstants.PIN_Y); } /** * Returns the value of the pinY element in pixels. * @return Numerical value of the pinY element. */ public double getPinY() { Element xForm = getPrimaryTag(mxVdxConstants.X_FORM); double py = 0; if (hasSecundaryTag(xForm, mxVdxConstants.PIN_Y)) { py = getNumericalValueOfSecundaryTag(xForm, mxVdxConstants.PIN_Y); } return py; } /** * Check if the shape has defined a locPinX element. * @return Returns <code>true</code> if the shape has defined a locPinX element. */ public boolean hasLocPinX() { Element xForm = getPrimaryTag(mxVdxConstants.X_FORM); return hasSecundaryTag(xForm, mxVdxConstants.LOC_PIN_X); } /** * Returns the value of the locPinX element in pixels. * @return Numerical value of the pinY element. */ public double getLocPinX() { Element xForm = getPrimaryTag(mxVdxConstants.X_FORM); double py = 0; if (hasSecundaryTag(xForm, mxVdxConstants.LOC_PIN_X)) { py = getNumericalValueOfSecundaryTag(xForm, mxVdxConstants.LOC_PIN_X); } return py; } /** * Check if the shape has defined a locPinY element. * @return Returns <code>true</code> if the shape has defined a locPinY element. */ public boolean hasLocPinY() { Element xForm = getPrimaryTag(mxVdxConstants.X_FORM); return hasSecundaryTag(xForm, mxVdxConstants.LOC_PIN_Y); } /** * Returns the value of the locPinY element in pixels. * @return Numerical value of the locPinY element. */ public double getLocPinY() { Element xForm = getPrimaryTag(mxVdxConstants.X_FORM); double py = 0; if (hasSecundaryTag(xForm, mxVdxConstants.LOC_PIN_Y)) { py = getNumericalValueOfSecundaryTag(xForm, mxVdxConstants.LOC_PIN_Y); } return py; } /** * Checks if the shape has defined a width element. * @return Returns <code>true</code> if the shape has defined a width element. */ public boolean hasWidth() { Element xForm = getPrimaryTag(mxVdxConstants.X_FORM); return hasSecundaryTag(xForm, mxVdxConstants.WIDTH); } /** * Returns the value of the width element in pixels. * @return Numerical value of the width element. */ public double getWidth() { Element xForm = getPrimaryTag(mxVdxConstants.X_FORM); double w = 0; if (hasSecundaryTag(xForm, mxVdxConstants.WIDTH)) { w = getNumericalValueOfSecundaryTag(xForm, mxVdxConstants.WIDTH); } return w; } /** * Checks if the shape has defined a height element. * @return Returns <code>true</code> if the shape has defined a height element. */ public boolean hasHeight() { Element xForm = getPrimaryTag(mxVdxConstants.X_FORM); return hasSecundaryTag(xForm, mxVdxConstants.HEIGHT); } /** * Returns the value of the height element in pixels. * @return Numerical value of the height element. */ public double getHeight() { Element xForm = getPrimaryTag(mxVdxConstants.X_FORM); double h = 0; if (hasSecundaryTag(xForm, mxVdxConstants.HEIGHT)) { h = getNumericalValueOfSecundaryTag(xForm, mxVdxConstants.HEIGHT); } return h; } /** * Checks if back ground color of the Shape is defined. * @return Returns <code>true</code> if back ground color of the Shape is defined. */ public boolean hasFillColor() { Element xForm = getPrimaryTag(mxVdxConstants.FILL); return hasSecundaryTag(xForm, mxVdxConstants.FILL_BKGND); } /** * Returns the background color. * @return Background color in hexadecimal representation. */ public String getFillColor() { Element fill = getPrimaryTag(mxVdxConstants.FILL); String color = ""; if (hasSecundaryTag(fill, mxVdxConstants.FILL_BKGND)) { color = getValueOfSecundaryTag(fill, mxVdxConstants.FILL_BKGND); } if (!color.startsWith("#")) { mxPropertiesManager pm = mxPropertiesManager.getInstance(); color = pm.getColor(color); } return color; } /** * Checks if foreground color of the Shape is defined. * @return Returns <code>true</code> if foreground color of the Shape is defined. */ public boolean hasFillForeColor() { Element xForm = getPrimaryTag(mxVdxConstants.FILL); return hasSecundaryTag(xForm, mxVdxConstants.FILL_FOREGND); } /** * Returns the foreground color. * @return Foreground color in hexadecimal representation. */ public String getFillForeColor() { Element fill = getPrimaryTag(mxVdxConstants.FILL); String color = ""; if (hasSecundaryTag(fill, mxVdxConstants.FILL_FOREGND)) { color = getValueOfSecundaryTag(fill, mxVdxConstants.FILL_FOREGND); } if (!color.startsWith("#")) { mxPropertiesManager pm = mxPropertiesManager.getInstance(); color = pm.getColor(color); } return color; } /** * Checks if pattern of the Shape is defined. * @return Returns <code>true</code> if pattern of the Shape is defined. */ public boolean hasFillPattern() { Element xForm = getPrimaryTag(mxVdxConstants.FILL); return hasSecundaryTag(xForm, mxVdxConstants.FILL_PATTERN); } /** * Returns the pattern. * @return String value of the FillPattern element. */ public String getFillPattern() { Element fill = getPrimaryTag(mxVdxConstants.FILL); String pattern = ""; if (hasSecundaryTag(fill, mxVdxConstants.FILL_PATTERN)) { pattern = getValueOfSecundaryTag(fill, mxVdxConstants.FILL_PATTERN); } return pattern; } /** * Checks if shadow pattern of the Shape is defined. * @return Returns <code>true</code> if shadow pattern of the Shape is defined. */ public boolean hasShdwPattern() { Element xForm = getPrimaryTag(mxVdxConstants.FILL); return hasSecundaryTag(xForm, mxVdxConstants.SHDW_PATTERN); } /** * Returns the shadow pattern. * @return String value of the ShdwPattern Element */ public String getShdwPattern() { Element fill = getPrimaryTag(mxVdxConstants.FILL); String pattern = ""; if (hasSecundaryTag(fill, mxVdxConstants.SHDW_PATTERN)) { pattern = getValueOfSecundaryTag(fill, mxVdxConstants.SHDW_PATTERN); } return pattern; } /** * Checks if pattern of the line is defined. * @return Returns <code>true</code> if pattern of the line is defined. */ public boolean hasLinePattern() { Element xForm = getPrimaryTag(mxVdxConstants.LINE); return hasSecundaryTag(xForm, mxVdxConstants.LINE_PATTERN); } /** * Returns the line pattern of the shape * @return String value of the LinePattern element. */ public String getLinePattern() { Element fill = getPrimaryTag(mxVdxConstants.LINE); String pattern = ""; if (hasSecundaryTag(fill, mxVdxConstants.LINE_PATTERN)) { pattern = getValueOfSecundaryTag(fill, mxVdxConstants.LINE_PATTERN); } return pattern; } /** * Checks if begin arrow of the line is defined. * @return Returns <code>true</code> if begin arrow of the line is defined. */ public boolean hasBeginArrow() { Element xForm = getPrimaryTag(mxVdxConstants.LINE); return hasSecundaryTag(xForm, mxVdxConstants.BEGIN_ARROW); } /** * Returns the line begin arrow of the shape * @return String value of the BeginArrow element. */ public String getBeginArrow() { Element fill = getPrimaryTag(mxVdxConstants.LINE); String arrow = ""; if (hasSecundaryTag(fill, mxVdxConstants.BEGIN_ARROW)) { arrow = getValueOfSecundaryTag(fill, mxVdxConstants.BEGIN_ARROW); } return arrow; } /** * Checks if end arrow of the line is defined. * @return Returns <code>true</code> if end arrow of the line is defined. */ public boolean hasEndArrow() { Element xForm = getPrimaryTag(mxVdxConstants.LINE); return hasSecundaryTag(xForm, mxVdxConstants.END_ARROW); } /** * Returns the line end arrow of the shape * @return String value of the EndArrow element. */ public String getEndArrow() { Element fill = getPrimaryTag(mxVdxConstants.LINE); String arrow = ""; if (hasSecundaryTag(fill, mxVdxConstants.END_ARROW)) { arrow = getValueOfSecundaryTag(fill, mxVdxConstants.END_ARROW); } return arrow; } /** * Checks if begin arrow size of the line is defined. * @return Returns <code>true</code> if begin arrow size of the line is defined. */ public boolean hasBeginArrowSize() { Element line = getPrimaryTag(mxVdxConstants.LINE); return hasSecundaryTag(line, mxVdxConstants.BEGIN_ARROW_SIZE); } /** * Returns the line begin arrow size of the shape * @return String value of the BeginArrowSize element. */ public String getBeginArrowSize() { Element line = getPrimaryTag(mxVdxConstants.LINE); String size = ""; if (hasSecundaryTag(line, mxVdxConstants.BEGIN_ARROW_SIZE)) { size = getValueOfSecundaryTag(line, mxVdxConstants.BEGIN_ARROW_SIZE); } return size; } /** * Checks if end arrow size of the line is defined. * @return Returns <code>true</code> if end arrow size of the line is defined. */ public boolean hasEndArrowSize() { Element line = getPrimaryTag(mxVdxConstants.LINE); return hasSecundaryTag(line, mxVdxConstants.END_ARROW_SIZE); } /** * Returns the line end arrow size of the shape * @return String value of the EndArrowSize element. */ public String getEndArrowSize() { Element line = getPrimaryTag(mxVdxConstants.LINE); String size = ""; if (hasSecundaryTag(line, mxVdxConstants.END_ARROW_SIZE)) { size = getValueOfSecundaryTag(line, mxVdxConstants.END_ARROW_SIZE); } return size; } /** * Checks if the line weight is defined. * @return Returns <code>true</code> if the line weight is defined. */ public boolean hasLineWeight() { Element line = getPrimaryTag(mxVdxConstants.LINE); return hasSecundaryTag(line, mxVdxConstants.LINE_WEIGHT); } /** * Returns the line weight of the shape in pixels * @return Numerical value of the LineWeight element. */ public double getLineWeight() { Element line = getPrimaryTag(mxVdxConstants.LINE); double lw = 0; if (hasSecundaryTag(line, mxVdxConstants.LINE_WEIGHT)) { lw = getNumericalValueOfSecundaryTag(line, mxVdxConstants.LINE_WEIGHT); } return lw; } /** * Checks if line color of the Shape is defined. * @return Returns <code>true</code> if line color of the Shape is defined. */ public boolean hasLineColor() { Element line = getPrimaryTag(mxVdxConstants.LINE); return hasSecundaryTag(line, mxVdxConstants.LINE_COLOR); } /** * Returns the line color. * @return Line color of the shape in hexadecimal representation. */ public String getLineColor() { Element line = getPrimaryTag(mxVdxConstants.LINE); String color = ""; if (hasSecundaryTag(line, mxVdxConstants.LINE_COLOR)) { color = getValueOfSecundaryTag(line, mxVdxConstants.LINE_COLOR); } if (!color.startsWith("#")) { mxPropertiesManager pm = mxPropertiesManager.getInstance(); color = pm.getColor(color); } return color; } /** * Checks if the rounding factor of the Shape is defined. * @return Returns <code>true</code> if line color of the Shape is defined. */ public boolean hasRounding() { Element line = getPrimaryTag(mxVdxConstants.LINE); return hasSecundaryTag(line, mxVdxConstants.ROUNDING); } /** * Returns the rounding factor. * @return Value of the Rounding element */ public double getRounding() { Element line = getPrimaryTag(mxVdxConstants.LINE); double r = 0; if (hasSecundaryTag(line, mxVdxConstants.ROUNDING)) { String val = ""; val = getValueOfSecundaryTag(line, mxVdxConstants.ROUNDING); if (!val.equals("")) { r = Double.valueOf(val); } } return r; } /** * Checks if transparence of the Shape is defined. * @return Returns <code>true</code> if transparence of the Shape is defined. */ public boolean hasTransparence() { Element fill = getPrimaryTag(mxVdxConstants.FILL); return hasSecundaryTag(fill, mxVdxConstants.FILL_BKGND_TRANS); } /** * Returns the level of transparence of the Shape. * @return double in range (opaque = 0)..(100 = transparent) */ public double getTransparence() { Element fill = getPrimaryTag(mxVdxConstants.FILL); double trans = 0; if (hasSecundaryTag(fill, mxVdxConstants.FILL_BKGND_TRANS)) { trans = getNumericalValueOfSecundaryTag(fill, mxVdxConstants.FILL_BKGND_TRANS); } return trans; } /** * Checks if angle of the Shape is defined. * @return Returns <code>true</code> if angle of the Shape is defined. */ public boolean hasAngle() { Element fill = getPrimaryTag(mxVdxConstants.X_FORM); return hasSecundaryTag(fill, mxVdxConstants.ANGLE); } /** * Returns the rotation angle of the Shape. * @return Value of the Angle element in radians. */ public double getAngle() { Element fill = getPrimaryTag(mxVdxConstants.X_FORM); double angle = 0; if (hasSecundaryTag(fill, mxVdxConstants.ANGLE)) { String rot = "0"; rot = getValueOfSecundaryTag(fill, mxVdxConstants.ANGLE); angle = Double.valueOf(rot); } return angle; } /** * Checks if the shape has defined a Text element. * @return Returns <code>true</code> if the shape has defined a Text element. */ public boolean hasText() { return hasPrimaryTag(mxVdxConstants.TEXT); } /** * Returns the value of the Text element. * @return Value of the Text element. */ public String getText() { String ret = ""; Element text = getPrimaryTag(mxVdxConstants.TEXT); if (text != null) { ret = text.getTextContent(); } return ret; } /** * Returns the childrens Nodes of Text. * @return List with the childrens of the Text element. */ public List<Node> getTextChildrens() { List<Node> list = null; Element text = getPrimaryTag(mxVdxConstants.TEXT); NodeList child = null; if (text != null) { child = text.getChildNodes(); list = mxVdxUtils.copyNodeList(child); } return list; } /** * Returns the NameU attribute. * @return Value of the NameU attribute. */ public String getNameU() { String nameU = ""; if (shape.hasAttribute(mxVdxConstants.NAME_U)) { nameU = shape.getAttribute(mxVdxConstants.NAME_U); } return nameU; } /** * Returns the value of the Id attribute. * @return Value of the Id attribute. */ public String getId() { return shape.getAttribute(mxVdxConstants.ID); } /** * Checks if the Geom Element of the shape contains the Ellipse element. * @return Returns <code>true</code> if the Geom Element of the shape contains the Ellipse element. */ public boolean hasEllipse() { Element fill = getPrimaryTag(mxVdxConstants.GEOM); return hasSecundaryTag(fill, mxVdxConstants.ELLIPSE); } /** * Returns the amount of LineTo Elements inside of the Geom Element * @return Number of LineTo elements. */ public int getAmountLineTo() { List<Element> lineTo = new ArrayList<Element>(); Element Geom = getPrimaryTag(mxVdxConstants.GEOM); NodeList xChildrens = null; if (Geom != null) { xChildrens = Geom.getChildNodes(); } if (mxVdxUtils.nodeListHasTag(xChildrens, mxVdxConstants.LINE_TO)) { lineTo = mxVdxUtils .nodeListTags(xChildrens, mxVdxConstants.LINE_TO); } int a = lineTo.size(); return a; } /** * Returns the amount of Connection Elements inside of Shape Element. * @return Number of Connection Elements. */ public int getAmountConnection() { List<Element> lineTo = new ArrayList<Element>(); NodeList xChildrens = null; if (shape != null) { xChildrens = shape.getChildNodes(); } if (mxVdxUtils.nodeListHasTag(xChildrens, mxVdxConstants.CONNECTION)) { lineTo = mxVdxUtils.nodeListTags(xChildrens, mxVdxConstants.CONNECTION); } int a = lineTo.size(); return a; } /** * Returns the amount of EllipticalArcTo Elements inside of Geom Element * @return Number of EllipticalArcTo Elements. */ public int getAmountEllipticalArcTo() { List<Element> ellipticalArcTo = new ArrayList<Element>(); Element Geom = getPrimaryTag(mxVdxConstants.GEOM); NodeList xChildrens = null; if (Geom != null) { xChildrens = Geom.getChildNodes(); } if (mxVdxUtils.nodeListHasTag(xChildrens, mxVdxConstants.ELLIPTICAL_ARC_TO)) { ellipticalArcTo = mxVdxUtils.nodeListTags(xChildrens, mxVdxConstants.ELLIPTICAL_ARC_TO); } int a = ellipticalArcTo.size(); return a; } /** * Returns the amount of ArcTo Elements inside of Geom Element * @return Number of ArcTo Elements. */ public int getAmountArcTo() { List<Element> arcTo = new ArrayList<Element>(); Element Geom = getPrimaryTag(mxVdxConstants.GEOM); NodeList xChildrens = null; if (Geom != null) { xChildrens = Geom.getChildNodes(); } if (mxVdxUtils.nodeListHasTag(xChildrens, mxVdxConstants.ARC_TO)) { arcTo = mxVdxUtils.nodeListTags(xChildrens, mxVdxConstants.ARC_TO); } int a = arcTo.size(); return a; } /** * Checks if the shape has the XForm1D element. * @return Returns <code>true</code> if the shape has the XForm1D element. */ public boolean hasXForm1D() { NodeList childrens = shape.getChildNodes(); return mxVdxUtils.nodeListHasTag(childrens, mxVdxConstants.X_FORM_1D); } /** * Returns the co-ordinates of the begin point of an Edge Shape. * @param parentHeight Height of the parent of the shape. * @return mxPoint that represents the co-ordinates. */ public mxPoint getBeginXY(double parentHeight) { double beginX = 0; double beginY = 0; if (hasPrimaryTag(mxVdxConstants.X_FORM_1D)) { Element xForm1D = getPrimaryTag(mxVdxConstants.X_FORM_1D); if (hasSecundaryTag(xForm1D, mxVdxConstants.BEGIN_X)) { beginX = getNumericalValueOfSecundaryTag(xForm1D, mxVdxConstants.BEGIN_X); } if (hasSecundaryTag(xForm1D, mxVdxConstants.BEGIN_Y)) { beginY = parentHeight - getNumericalValueOfSecundaryTag(xForm1D, mxVdxConstants.BEGIN_Y); } } return new mxPoint(beginX, beginY); } /** * Returns the co-ordinates of the end point of an Edge Shape. * @param parentHeight Height of the parent of the shape. * @return mxPoint that represents the co-ordinates. */ public mxPoint getEndXY(double parentHeight) { double endX = 0; double endY = 0; if (hasPrimaryTag(mxVdxConstants.X_FORM_1D)) { Element xForm1D = getPrimaryTag(mxVdxConstants.X_FORM_1D); if (hasSecundaryTag(xForm1D, mxVdxConstants.END_X)) { endX = getNumericalValueOfSecundaryTag(xForm1D, mxVdxConstants.END_X); } if (hasSecundaryTag(xForm1D, mxVdxConstants.END_Y)) { endY = parentHeight - getNumericalValueOfSecundaryTag(xForm1D, mxVdxConstants.END_Y); } } return new mxPoint(endX, endY); } /** * Returns the list of routing points of a edge shape. * @param parentHeight Height of the parent of the shape. * @return List of mxPoint that represents the routing points. */ public List<mxPoint> getRoutingPoints(double parentHeight) { mxPoint beginXY = getBeginXY(parentHeight); ArrayList<mxPoint> pointList = new ArrayList<mxPoint>(); NodeList lineTos = shape.getElementsByTagName(mxVdxConstants.LINE_TO); ArrayList<Element> lineToList = new ArrayList<Element>(); //Discards deleted elements. int numLineTos = lineTos.getLength(); for (int l = 0; l < numLineTos; l++) { Element lineTo = (Element) lineTos.item(l); if (!(lineTo.hasAttribute(mxVdxConstants.DELETED) && (lineTo .getAttribute(mxVdxConstants.DELETED)).equals("1"))) { lineToList.add(lineTo); } } //Get routing points from LineTo Elements. int numPoints = lineToList.size(); for (int k = 0; (k < (numPoints - 1)); k++) { Element lineTo = lineToList.get(k); mxPoint lineToXY = getLineToXY(lineTo); Double x = (beginXY.getX() + lineToXY.getX()); Double y = (beginXY.getY() + lineToXY.getY()); pointList.add(new mxPoint(x, y)); } return pointList; } /** * Returns the xy co-ordinates inside a LineTo Element. * @param lineTo LineTo Element * @return mxPoint that represents the xy co-ordinates */ public static mxPoint getLineToXY(Element lineTo) { Element xElem = (Element) lineTo.getElementsByTagName(mxVdxConstants.X) .item(0); Element yElem = (Element) lineTo.getElementsByTagName(mxVdxConstants.Y) .item(0); double lineToX = Double.valueOf(xElem.getTextContent()) * mxVdxUtils.conversionFactor(); double lineToY = (Double.valueOf(yElem.getTextContent()) * mxVdxUtils .conversionFactor()) * -1; return new mxPoint(lineToX, lineToY); } /** * Checks if the color of one text fragment is defined * @param charIX IX atribute of Char element * @return Returns <code>true</code> if the color of one text fragment is defined. */ public boolean hasTextColor(String charIX) { Element ch = getPrimaryTagIndexed(mxVdxConstants.CHAR, charIX); return hasSecundaryTag(ch, mxVdxConstants.COLOR); } /** * Returns the color of one text fragment * @param charIX IX atribute of Char element * @return Text color in hexadecimal representation. */ public String getTextColor(String charIX) { String color = "#000000"; Element ch = getPrimaryTagIndexed(mxVdxConstants.CHAR, charIX); if (hasSecundaryTag(ch, mxVdxConstants.COLOR)) { color = getValueOfSecundaryTag(ch, mxVdxConstants.COLOR); if (!color.startsWith("#")) { mxPropertiesManager pm = mxPropertiesManager.getInstance(); color = pm.getColor(color); } } return color; } /** * Checks if the background color of text is defined * @return Returns <code>true</code> if the background color of text is defined. */ public boolean hasTextBkgndColor() { Element ch = getPrimaryTag(mxVdxConstants.TEXT_BLOCK); return hasSecundaryTag(ch, mxVdxConstants.TEXT_BKGND); } /** * Returns the background color of text. * @return Text background color in hexadecimal representation. */ public String getTextBkgndColor() { String color = ""; Element textBlock = getPrimaryTag(mxVdxConstants.TEXT_BLOCK); if (hasSecundaryTag(textBlock, mxVdxConstants.TEXT_BKGND)) { color = getValueOfSecundaryTag(textBlock, mxVdxConstants.TEXT_BKGND); if (!color.startsWith("#")) { mxPropertiesManager pm = mxPropertiesManager.getInstance(); color = String.valueOf(Integer.parseInt(color) - 1); color = pm.getColor(color); } } return color; } /** * Checks if the top margin of text is defined * @return Returns <code>true</code> if the top margin of text is defined */ public boolean hasTextTopMargin() { Element ch = getPrimaryTag(mxVdxConstants.TEXT_BLOCK); return hasSecundaryTag(ch, mxVdxConstants.TOP_MARGIN); } /** * Returns the top margin of text in pixels. * @return Numerical value of the TopMargin element */ public double getTextTopMargin() { double margin = 0; Element textBlock = getPrimaryTag(mxVdxConstants.TEXT_BLOCK); if (hasSecundaryTag(textBlock, mxVdxConstants.TOP_MARGIN)) { margin = getNumericalValueOfSecundaryTag(textBlock, mxVdxConstants.TOP_MARGIN); } return margin; } /** * Checks if the bottom margin of text is defined * @return Returns <code>true</code> if the bottom margin of text is defined. */ public boolean hasTextBottomMargin() { Element ch = getPrimaryTag(mxVdxConstants.TEXT_BLOCK); return hasSecundaryTag(ch, mxVdxConstants.BOTTOM_MARGIN); } /** * Returns the bottom margin of text in pixels. * @return Numerical value of the BottomMargin element. */ public double getTextBottomMargin() { double margin = 0; Element textBlock = getPrimaryTag(mxVdxConstants.TEXT_BLOCK); if (hasSecundaryTag(textBlock, mxVdxConstants.BOTTOM_MARGIN)) { margin = getNumericalValueOfSecundaryTag(textBlock, mxVdxConstants.BOTTOM_MARGIN); } return margin; } /** * Checks if the left margin of text is defined. * @return Returns <code>true</code> if the left margin of text is defined. */ public boolean hasTextLeftMargin() { Element ch = getPrimaryTag(mxVdxConstants.TEXT_BLOCK); return hasSecundaryTag(ch, mxVdxConstants.LEFT_MARGIN); } /** * Returns the left margin of text in pixels. * @return Numerical value of the LeftMargin element. */ public double getTextLeftMargin() { double margin = 0; Element textBlock = getPrimaryTag(mxVdxConstants.TEXT_BLOCK); if (hasSecundaryTag(textBlock, mxVdxConstants.LEFT_MARGIN)) { margin = getNumericalValueOfSecundaryTag(textBlock, mxVdxConstants.LEFT_MARGIN); } return margin; } /** * Checks if the right margin of text is defined. * @return Returns <code>true</code> if the right margin of text is defined. */ public boolean hasTextRightMargin() { Element ch = getPrimaryTag(mxVdxConstants.TEXT_BLOCK); return hasSecundaryTag(ch, mxVdxConstants.RIGHT_MARGIN); } /** * Returns the right margin of text in pixels. * @return Numerical value of the RightMargin element. */ public double getTextRightMargin() { double margin = 0; Element textBlock = getPrimaryTag(mxVdxConstants.TEXT_BLOCK); if (hasSecundaryTag(textBlock, mxVdxConstants.RIGHT_MARGIN)) { margin = getNumericalValueOfSecundaryTag(textBlock, mxVdxConstants.RIGHT_MARGIN); } return margin; } /** * Checks if the size of one text fragment is defined. * @param charIX IX atribute of Char element * @return Returns <code>true</code> if the size of one text fragment is defined. */ public boolean hasTextSize(String charIX) { Element ch = getPrimaryTagIndexed(mxVdxConstants.CHAR, charIX); return hasSecundaryTag(ch, mxVdxConstants.SIZE); } /** * Returns the size of one text fragment in pixels. * @param charIX IX atribute of Char element * @return String representation of the numerical value of the Size element. */ public String getTextSize(String charIX) { double size = 0; Element ch = getPrimaryTagIndexed(mxVdxConstants.CHAR, charIX); if (hasSecundaryTag(ch, mxVdxConstants.SIZE)) { size = getNumericalValueOfSecundaryTag(ch, mxVdxConstants.SIZE); } return String.valueOf(size); } /** * Checks if the style of one text fragment is defined. * @param charIX IX atribute of Char element * @return Returns <code>true</code> if the style of one text fragment is defined. */ public boolean hasTextStyle(String charIX) { Element ch = getPrimaryTagIndexed(mxVdxConstants.CHAR, charIX); return hasSecundaryTag(ch, mxVdxConstants.STYLE); } /** * Returns the style of one text fragment. * @param charIX IX atribute of Char element * @return String value of the Style element. */ public String getTextStyle(String charIX) { String style = ""; Element ch = getPrimaryTagIndexed(mxVdxConstants.CHAR, charIX); if (hasSecundaryTag(ch, mxVdxConstants.STYLE)) { style = getValueOfSecundaryTag(ch, mxVdxConstants.STYLE); } return style; } /** * Checks if the font of one text fragment is defined * @param charIX IX atribute of Char element * @return Returns <code>true</code> if the font of one text fragment is defined. */ public boolean hasTextFont(String charIX) { Element ch = getPrimaryTagIndexed(mxVdxConstants.CHAR, charIX); return hasSecundaryTag(ch, mxVdxConstants.FONT); } /** * Returns the font of one text fragment * @param charIX IX atribute of Char element * @return Name of the font. */ public String getTextFont(String charIX) { String font = ""; Element ch = getPrimaryTagIndexed(mxVdxConstants.CHAR, charIX); if (hasSecundaryTag(ch, mxVdxConstants.FONT)) { font = getValueOfSecundaryTag(ch, mxVdxConstants.FONT); } mxPropertiesManager mpm = mxPropertiesManager.getInstance(); font = mpm.getFont(font); return font; } /** * Checks if the position of one text fragment is defined * @param charIX IX atribute of Char element * @return Returns <code>true</code> if the position of one text fragment is defined. */ public boolean hasTextPos(String charIX) { Element ch = getPrimaryTagIndexed(mxVdxConstants.CHAR, charIX); return hasSecundaryTag(ch, mxVdxConstants.POS); } /** * Returns the position of one text fragment * @param charIX IX atribute of Char element * @return Integer value of the Pos element. */ public int getTextPos(String charIX) { int pos = 0; Element ch = getPrimaryTagIndexed(mxVdxConstants.CHAR, charIX); if (hasSecundaryTag(ch, mxVdxConstants.POS)) { String val = getValueOfSecundaryTag(ch, mxVdxConstants.POS); if (!val.equals("")) { pos = Integer.parseInt(val); } } return pos; } /** * Checks if the strikethru of one text fragment is defined * @param charIX IX atribute of Char element * @return Returns <code>true</code> if the strikethru of one text fragment is defined */ public boolean hasTextStrike(String charIX) { Element ch = getPrimaryTagIndexed(mxVdxConstants.CHAR, charIX); return hasSecundaryTag(ch, mxVdxConstants.STRIKETHRU); } /** * Checks if one text fragment is Strikethru * @param charIX IX atribute of Char element * @return Returns <code>true</code> if one text fragment is Strikethru */ public boolean getTextStrike(String charIX) { boolean strike = false; Element ch = getPrimaryTagIndexed(mxVdxConstants.CHAR, charIX); if (hasSecundaryTag(ch, mxVdxConstants.STRIKETHRU)) { String val = getValueOfSecundaryTag(ch, mxVdxConstants.STRIKETHRU); strike = val.equals("1"); } return strike; } /** * Checks if the case of one text fragment is defined * @param charIX IX atribute of Char element * @return Returns <code>true</code> if the case of one text fragment is defined. */ public boolean hasTextCase(String charIX) { Element ch = getPrimaryTagIndexed(mxVdxConstants.CHAR, charIX); return hasSecundaryTag(ch, mxVdxConstants.CASE); } /** * Returns the case property of one text fragment * @param charIX IX atribute of Char element * @return Integer value of the Case element */ public int getTextCase(String charIX) { int strike = 0; Element ch = getPrimaryTagIndexed(mxVdxConstants.CHAR, charIX); if (hasSecundaryTag(ch, mxVdxConstants.CASE)) { String val = getValueOfSecundaryTag(ch, mxVdxConstants.CASE); if (!val.equals("")) { strike = Integer.parseInt(val); } } return strike; } /** * Checks if the vertical align of text is defined. * @return Returns <code>true</code> if the vertical align of text is defined. */ public boolean hasVerticalAlign() { Element tb = getPrimaryTag(mxVdxConstants.TEXT_BLOCK); return hasSecundaryTag(tb, mxVdxConstants.VERTICAL_ALIGN); } /** * Returns the vertical align property of text. * @return Integer value of the VerticalAlign element. */ public int getVerticalAlign() { int strike = 0; Element tb = getPrimaryTag(mxVdxConstants.TEXT_BLOCK); if (hasSecundaryTag(tb, mxVdxConstants.VERTICAL_ALIGN)) { String val = getValueOfSecundaryTag(tb, mxVdxConstants.VERTICAL_ALIGN); if (!val.equals("")) { strike = Integer.parseInt(val); } } return strike; } /** * Checks if the angle of text is defined * @return Returns <code>true</code> if the angle of text is defined. */ public boolean hasTxtAngle() { Element tb = getPrimaryTag(mxVdxConstants.TEXT_X_FORM); return hasSecundaryTag(tb, mxVdxConstants.TXT_ANGLE); } /** * Returns the angle of the text. * @return Double value of the TxtAngle element. */ public double getTxtAngle() { double strike = 0; Element tb = getPrimaryTag(mxVdxConstants.TEXT_X_FORM); if (hasSecundaryTag(tb, mxVdxConstants.TXT_ANGLE)) { String val = getValueOfSecundaryTag(tb, mxVdxConstants.TXT_ANGLE); if (!val.equals("")) { strike = Double.valueOf(val); } } return strike; } /** * Checks if the horizontal align of text is defined * @param paraIX IX atribute of Para element * @return Returns <code>true</code> if the horizontal align of text is defined. */ public boolean hasHorizontalAlign(String paraIX) { Element para = getPrimaryTagIndexed(mxVdxConstants.PARAGRAPH, paraIX); return hasSecundaryTag(para, mxVdxConstants.HORIZONTAL_ALIGN); } /** * Returns the horizontal align property of text * @param paraIX IX atribute of Para element * @return Integer value of the HorizontalAlign element. */ public int getHorizontalAlign(String paraIX) { int horizontal = 0; Element tb = getPrimaryTagIndexed(mxVdxConstants.PARAGRAPH, paraIX); if (hasSecundaryTag(tb, mxVdxConstants.HORIZONTAL_ALIGN)) { String val = getValueOfSecundaryTag(tb, mxVdxConstants.HORIZONTAL_ALIGN); if (!val.equals("")) { horizontal = Integer.parseInt(val); } } return horizontal; } /** * Checks if the first indent of one paragraph is defined * @param paraIX IX atribute of Para element * @return Returns <code>true</code> if the first indent of one paragraph is defined. */ public boolean hasIndentFirst(String paraIX) { Element ch = getPrimaryTagIndexed(mxVdxConstants.PARAGRAPH, paraIX); return hasSecundaryTag(ch, mxVdxConstants.INDENT_FIRST); } /** * Returns the first indent of one paragraph in pixels. * @param paraIX IX atribute of Para element * @return String representation of the numerical value of the IndentFirst element. */ public String getIndentFirst(String paraIX) { double indent = 0; Element ch = getPrimaryTagIndexed(mxVdxConstants.PARAGRAPH, paraIX); if (hasSecundaryTag(ch, mxVdxConstants.INDENT_FIRST)) { indent = getNumericalValueOfSecundaryTag(ch, mxVdxConstants.INDENT_FIRST); } return String.valueOf(indent); } /** * Checks if the indent to left of one paragraph is defined * @param paraIX IX atribute of Para element * @return Returns <code>true</code> if the indent to left of one paragraph is defined. */ public boolean hasIndentLeft(String paraIX) { Element ch = getPrimaryTagIndexed(mxVdxConstants.PARAGRAPH, paraIX); return hasSecundaryTag(ch, mxVdxConstants.INDENT_LEFT); } /** * Returns the indent to left of one paragraph * @param paraIX IX atribute of Para element * @return String representation of the numerical value of the IndentLeft element. */ public String getIndentLeft(String paraIX) { double indent = 0; Element ch = getPrimaryTagIndexed(mxVdxConstants.PARAGRAPH, paraIX); if (hasSecundaryTag(ch, mxVdxConstants.INDENT_LEFT)) { indent = getNumericalValueOfSecundaryTag(ch, mxVdxConstants.INDENT_LEFT); } return String.valueOf(indent); } /** * Checks if the indent to right of one paragraph is defined * @param paraIX IX atribute of Para element * @return Returns <code>true</code> if the indent to right of one paragraph is defined. */ public boolean hasIndentRight(String paraIX) { Element ch = getPrimaryTagIndexed(mxVdxConstants.PARAGRAPH, paraIX); return hasSecundaryTag(ch, mxVdxConstants.INDENT_RIGHT); } /** * Returns the indent to right of one paragraph * @param paraIX IX atribute of Para element * @return String representation of the numerical value of the IndentRight element. */ public String getIndentRight(String paraIX) { double indent = 0; Element ch = getPrimaryTagIndexed(mxVdxConstants.PARAGRAPH, paraIX); if (hasSecundaryTag(ch, mxVdxConstants.INDENT_RIGHT)) { indent = getNumericalValueOfSecundaryTag(ch, mxVdxConstants.INDENT_RIGHT); } return String.valueOf(indent); } /** * Checks if the space before one paragraph is defined * @param paraIX IX atribute of Para element * @return Returns <code>true</code> if the space before one paragraph is defined. */ public boolean hasSpBefore(String paraIX) { Element ch = getPrimaryTagIndexed(mxVdxConstants.PARAGRAPH, paraIX); return hasSecundaryTag(ch, mxVdxConstants.SPACE_BEFORE); } /** * Returns the space before one paragraph. * @param paraIX IX atribute of Para element * @return String representation of the numerical value of the SpBefore element. */ public String getSpBefore(String paraIX) { double indent = 0; Element ch = getPrimaryTagIndexed(mxVdxConstants.PARAGRAPH, paraIX); if (hasSecundaryTag(ch, mxVdxConstants.SPACE_BEFORE)) { indent = getNumericalValueOfSecundaryTag(ch, mxVdxConstants.SPACE_BEFORE); } return String.valueOf(indent); } /** * Checks if the space after one paragraph is defined * @param paraIX IX atribute of Para element * @return Returns <code>true</code> if the space after one paragraph is defined. */ public boolean hasSpAfter(String paraIX) { Element ch = getPrimaryTagIndexed(mxVdxConstants.PARAGRAPH, paraIX); return hasSecundaryTag(ch, mxVdxConstants.SPACE_AFTER); } /** * Returns the space after one paragraph * @param paraIX IX atribute of Para element * @return String representation of the numerical value of the SpAfter element. */ public String getSpAfter(String paraIX) { double indent = 0; Element ch = getPrimaryTagIndexed(mxVdxConstants.PARAGRAPH, paraIX); if (hasSecundaryTag(ch, mxVdxConstants.SPACE_AFTER)) { indent = getNumericalValueOfSecundaryTag(ch, mxVdxConstants.SPACE_AFTER); } return String.valueOf(indent); } /** * Checks if the space between lines in one paragraph is defined * @param paraIX IX atribute of Para element * @return Returns <code>true</code> if the space between lines in one paragraph is defined. */ public boolean hasSpLine(String paraIX) { Element ch = getPrimaryTagIndexed(mxVdxConstants.PARAGRAPH, paraIX); return hasSecundaryTag(ch, mxVdxConstants.SPACE_LINE); } /** * Returns the space between lines in one paragraph. * @param paraIX IX atribute of Para element. * @return Double representation of the value of the SpLine element. */ public double getSpLine(String paraIX) { double space = 0; String val = ""; Element ch = getPrimaryTagIndexed(mxVdxConstants.PARAGRAPH, paraIX); if (hasSecundaryTag(ch, mxVdxConstants.SPACE_LINE)) { val = getValueOfSecundaryTag(ch, mxVdxConstants.SPACE_LINE); } if (!val.equals("")) { space = Double.parseDouble(val); } return space; } /** * Checks if the flags of one paragraph is defined. * @param paraIX IX atribute of Para element. * @return Returns <code>true</code> if the flags of one paragraph is defined. */ public boolean hasFlags(String paraIX) { Element ch = getPrimaryTagIndexed(mxVdxConstants.PARAGRAPH, paraIX); return hasSecundaryTag(ch, mxVdxConstants.FLAGS); } /** * Returns the flags of one paragraph. * @param paraIX IX atribute of Para element. * @return String value of the Flags element. */ public String getFlags(String paraIX) { String flags = "0"; Element ch = getPrimaryTagIndexed(mxVdxConstants.PARAGRAPH, paraIX); if (hasSecundaryTag(ch, mxVdxConstants.FLAGS)) { flags = getValueOfSecundaryTag(ch, mxVdxConstants.FLAGS); } return flags; } /** * Checks if the direction of one text fragment is defined * @param paraIX IX atribute of Para element * @return Returns <code>true</code> if the direction of one text fragment is defined. */ public boolean hasRTLText(String paraIX) { Element ch = getPrimaryTagIndexed(mxVdxConstants.PARAGRAPH, paraIX); return hasSecundaryTag(ch, mxVdxConstants.RTL_TEXT); } /** * Returns the direction of one text fragment. * @param paraIX IX atribute of Para element. * @return String value of the RTLText. */ public String getRTLText(String paraIX) { String flags = "ltr"; Element ch = getPrimaryTagIndexed(mxVdxConstants.PARAGRAPH, paraIX); if (hasSecundaryTag(ch, mxVdxConstants.RTL_TEXT)) { flags = getValueOfSecundaryTag(ch, mxVdxConstants.RTL_TEXT); } return flags; } /** * Checks if the space between characters in one text fragment is defined. * @param paraIX IX atribute of Para element. * @return Returns <code>true</code> if the space between characters in one text fragment is defined. */ public boolean hasLetterSpace(String paraIX) { Element ch = getPrimaryTagIndexed(mxVdxConstants.PARAGRAPH, paraIX); return hasSecundaryTag(ch, mxVdxConstants.LETTER_SPACE); } /** * Returns the space between characters in one text fragment. * @param paraIX IX atribute of Para element. * @return String representation of the numerical value of the Letterspace element. */ public String getLetterSpace(String paraIX) { double space = 0; Element ch = getPrimaryTagIndexed(mxVdxConstants.PARAGRAPH, paraIX); if (hasSecundaryTag(ch, mxVdxConstants.LETTER_SPACE)) { space = getNumericalValueOfSecundaryTag(ch, mxVdxConstants.LETTER_SPACE); } return String.valueOf(space); } /** * Checks if the bullet element is defined. * @param paraIX IX atribute of Para element. * @return Returns <code>true</code> if the bullet element is defined. */ public boolean hasBullet(String paraIX) { Element ch = getPrimaryTagIndexed(mxVdxConstants.PARAGRAPH, paraIX); return hasSecundaryTag(ch, mxVdxConstants.BULLET); } /** * Returns the bullet element value. * @param paraIX IX atribute of Para element. * @return String value of the Bullet element. */ public String getBullet(String paraIX) { String bullet = "0"; Element ch = getPrimaryTagIndexed(mxVdxConstants.PARAGRAPH, paraIX); if (hasSecundaryTag(ch, mxVdxConstants.BULLET)) { bullet = getValueOfSecundaryTag(ch, mxVdxConstants.BULLET); } return bullet; } }