package com.mxgraph.io.vdx; import java.util.HashMap; import java.util.Hashtable; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import com.mxgraph.io.mxVdxCodec; import com.mxgraph.model.mxCell; import com.mxgraph.util.mxConstants; import com.mxgraph.util.mxPoint; import com.mxgraph.view.mxGraph; /** * This class is a wrapper for one Shape Element.<br/> * This class is responsible for retrieve all the properties of the shape and add it * to the graph. If a property is not found in the shape element but it is an instance * of a Master, the property is taken from the masterShape element. If the property * is not found neither in the masterShape , and it has a reference to a stylesheet * the property is taken from there. */ public class mxVdxShape extends mxGeneralShape { /** * Master Shape referenced by the shape. */ private mxMasterShape masterShape = null; /** * Master element referenced by the shape. */ private mxMasterElement masterElement = null; /** * Stylesheet with the fill style referenced by the shape. */ private mxStyleSheet fillStyle = null; /** * Stylesheet with the line style referenced by the shape. */ private mxStyleSheet lineStyle = null; /** * Stylesheet with the text style referenced by the shape. */ private mxStyleSheet textStyle = null; /** * Create a new instance of mxVdxShape. * This method get the references to the master element, master shape * and stylesheet. * @param shape */ public mxVdxShape(Element shape) { super(shape); masterElement = mxMastersManager.getInstance().getMaster( this.lookForMasterId()); if (masterElement != null) { //If the shape has the Master attribute the master shape is the first //shape of the master element. if (this.getMasterId() != null && !this.getMasterId().equals("")) { this.masterShape = masterElement.getMasterShape(); } else if (this.getShapeMasterId() != null && !this.getShapeMasterId().equals("")) { this.masterShape = masterElement.getMasterShape(this .getShapeMasterId()); } } mxStyleSheetManager ssm = mxStyleSheetManager.getInstance(); this.fillStyle = ssm.getSheet(getFillStyleId()); this.lineStyle = ssm.getSheet(getLineStyleId()); this.textStyle = ssm.getSheet(getTextStyleId()); } /** * Returns the value of the Text element.<br/> * If the shape has not text, it is obtained from master shape. * If html labels are enabled, the text properties are set with tags html. * @return Text label of the shape. */ public String getTextLabel() { String ret = ""; if (mxVdxCodec.isHtmlLabelsEnable()) { mxVdxTextParser vtp = new mxVdxTextParser(this, masterShape, textStyle); //Get text with tags html ret = vtp.getHtmlTextContent(); } else { if (this.hasText()) { ret = this.getText(); } else if (masterShape != null && masterShape.hasText()) { return masterShape.getText(); } } return ret; } /** * Checks if a nameU is for big connectors. * @param nameU NameU attribute. * @return Returns <code>true</code> if a nameU is for big connectors. */ public boolean isConnectorBigNameU(String nameU) { return nameU.startsWith("60 degree single") || nameU.startsWith("45 degree single") || nameU.startsWith("45 degree double") || nameU.startsWith("60 degree double") || nameU.startsWith("45 degree tail") || nameU.startsWith("60 degree tail") || nameU.startsWith("45 degree tail") || nameU.startsWith("60 degree tail") || nameU.startsWith("Flexi-arrow 2") || nameU.startsWith("Flexi-arrow 1") || nameU.startsWith("Flexi-arrow 3") || nameU.startsWith("Double flexi-arrow") || nameU.startsWith("Fancy arrow"); } /** * Checks if the shape or the master shape has the XForm1D element. * @return Returns <code>true</code> if the shape or the master shape * has the XForm1D element. */ public boolean containsXForm1D() { if (this.hasXForm1D()) { return true; } else if (masterShape != null && masterShape.hasXForm1D()) { return true; } return false; } /** * Checks if the shape must be treated as an edge. * @return Returns <code>true</code> if the shape must be treated as an edge. */ public boolean isExceptionEdge() { String nameU = getNameU(); if (nameU.startsWith("Control transfer") || nameU.startsWith("Branch: no return") || nameU.startsWith("Interrupt") || nameU.startsWith("External control") || nameU.startsWith("Refinement") || nameU.startsWith("Branch: return")) { return true; } else { return false; } } /** * Checks if the shape represents a vertex. * @return Returns <code>true</code> if the shape represents a vertex. */ public boolean isVertexShape() { String nameU = getNameU(); if (nameU.startsWith("Dynamic connector") || isConnectorBigNameU(nameU)) { return false; } else if (masterElement != null && masterElement.getNameU().startsWith("Dynamic connector")) { return false; } mxPoint dimentions = this.getDimentions(); if (!isGroup() && containsXForm1D() && ((dimentions.getX() <= 0) || (dimentions.getY() <= 0) || getAmountConnection() == 0)) { return false; } if (isExceptionEdge()) { return false; } return true; } /** * Checks if the shape is supported by the application. * @return Returns <code>true</code> if the shape is supported by the application. */ public boolean isSupportedShape() { mxVdxShapeForm vsf = new mxVdxShapeForm(this, masterShape, masterElement, 0); return !vsf.getForm().equals(""); } /** * Returns the coordinates of the top left corner of the Shape. * When a coordinate is not found, it is taken from masterShape. * @param parentHeight Height of the parent cell of the shape. * @return mxPoint that represents the co-ordinates */ public mxPoint getOriginPoint(double parentHeight) { double px = 0; double py = 0; double lpy = 0; double lpx = 0; double h = 0; //Defines PinX if (this.hasPinX()) { px = this.getPinX(); } else if (masterShape != null && masterShape.hasPinX()) { px = masterShape.getPinX(); } //Defines PinY if (this.hasPinY()) { py = this.getPinY(); } else if (masterShape != null && masterShape.hasPinY()) { py = masterShape.getPinY(); } //Defines LocPinX if (this.hasLocPinX()) { lpx = this.getLocPinX(); } else if (masterShape != null && masterShape.hasLocPinX()) { lpx = masterShape.getLocPinX(); } //Defines LocPinY if (this.hasLocPinY()) { lpy = this.getLocPinY(); } else if (masterShape != null && masterShape.hasLocPinY()) { lpy = masterShape.getLocPinY(); } //Defines Height if (this.hasHeight()) { h = this.getHeight(); } else if (masterShape != null && masterShape.hasHeight()) { h = masterShape.getHeight(); } double x = (px) - (lpx); double y = parentHeight - ((py) + (h - lpy)); return new mxPoint(x, y); } /** * Returns the width and height of the Shape expressed like a mxPoint.<br/> * x = width<br/> * y = height<br/> * When a dimention is not found, it is taken from masterShape. * @return mxPoint that represents the dimentions of the shape. */ public mxPoint getDimentions() { double w = 0; double h = 0; //Defines Width if (this.hasWidth()) { w = this.getWidth(); } else if (masterShape != null && masterShape.hasWidth()) { w = masterShape.getWidth(); } //Defines Height if (this.hasHeight()) { h = this.getHeight(); } else if (masterShape != null && masterShape.hasHeight()) { h = masterShape.getHeight(); } return new mxPoint(w, h); } /** * Returns the opacity of the Shape.<br/> * @return Double in the range of (transparent = 0)..(100 = opaque) */ private double getOpacity() { mxVdxShapeForm vsf = new mxVdxShapeForm(this, masterShape, masterElement, 0); double opacity = 100; if (this.isGroup() && !vsf.isSimpleComplex() && !vsf.isSwimlane()) { opacity = 0; } if (this.hasTransparence()) { opacity = 100 - this.getTransparence(); } else if (masterShape != null && masterShape.hasTransparence()) { opacity = 100 - masterShape.getTransparence(); } if (this.hasFillPattern()) { String pattern = this.getFillPattern(); if (pattern.equals("0")) { opacity = 0; } } else if (masterShape != null && masterShape.hasFillPattern()) { String pattern = masterShape.getFillPattern(); if (pattern.equals("0")) { opacity = 0; } } else if (fillStyle != null && fillStyle.hasFillPattern()) { String pattern = fillStyle.getFillPattern(); if (pattern.equals("0")) { opacity = 0; } } opacity = Math.max(opacity, 0); opacity = Math.min(opacity, 100); return opacity; } /** * Returns the shape's fill pattern.<br/> * The property may to be defined in master shape or fill stylesheet. * @return String value of the fill pattern. */ private String getColorPattern() { String pattern = ""; if (this.hasFillPattern()) { pattern = this.getFillPattern(); } else if ((masterShape != null) && masterShape.hasFillPattern()) { pattern = masterShape.getFillPattern(); } else if ((fillStyle != null) && fillStyle.hasFillPattern()) { pattern = fillStyle.getFillPattern(); } return pattern; } /** * Returns the shape's background color. * The property may to be defined in master shape or fill stylesheet. * @return hexadecimal representation of the background color. */ private String getBackColor() { String fillcolor = ""; if (this.hasFillColor()) { fillcolor = this.getFillColor(); } else if ((masterShape != null) && masterShape.hasFillColor()) { fillcolor = masterShape.getFillColor(); } else if ((fillStyle != null) && fillStyle.hasFillColor()) { fillcolor = fillStyle.getFillColor(); } return fillcolor; } /** * Returns the shape's color.<br/> * The property may to be defined in master shape or fill stylesheet.<br/> * If the color is the background or the fore color, it depends of the pattern. * For simple gradients and solid, returns the fore color, else returns the * background color. * @return hexadecimal representation of the color. */ private String getColor() { String fillcolor = ""; if (this.hasFillPattern()) { String pattern = this.getFillPattern(); if (pattern.equals("1") || pattern.equals("25") || pattern.equals("27") || pattern.equals("28") || pattern.equals("30")) { if (this.hasFillForeColor()) { fillcolor = this.getFillForeColor(); } } else { if (this.hasFillColor()) { fillcolor = this.getFillColor(); } } } else { if (this.hasFillColor()) { fillcolor = this.getFillColor(); } } if (masterShape != null && fillcolor.equals("")) { if (masterShape.hasFillPattern()) { String pattern = masterShape.getFillPattern(); if (pattern.equals("1") || pattern.equals("25") || pattern.equals("27") || pattern.equals("28") || pattern.equals("30")) { if (masterShape.hasFillForeColor()) { fillcolor = masterShape.getFillForeColor(); } } else { if (masterShape.hasFillColor()) { fillcolor = masterShape.getFillColor(); } } } else { if (masterShape.hasFillColor()) { fillcolor = masterShape.getFillColor(); } } } if (masterShape == null && fillStyle != null && fillcolor.equals("")) { if (fillStyle.hasFillPattern()) { String pattern = fillStyle.getFillPattern(); if (pattern.equals("1") || pattern.equals("25") || pattern.equals("27") || pattern.equals("28") || pattern.equals("30")) { if (fillStyle.hasFillForeColor()) { fillcolor = fillStyle.getFillForeColor(); } } else { if (fillStyle.hasFillColor()) { fillcolor = fillStyle.getFillColor(); } } } else { if (fillStyle.hasFillColor()) { fillcolor = fillStyle.getFillColor(); } } } return fillcolor; } /** * Retuns the background color for apply in the gradient.<br/> * If no gradient must be applicated, returns an empty string. * @return hexadecimal representation of the color. */ private String getGradient() { String gradient = ""; String pattern = getColorPattern(); if (pattern.equals("25") || pattern.equals("27") || pattern.equals("28") || pattern.equals("30")) { gradient = getBackColor(); } return gradient; } /** * Returns the direction of the gradient.<br/> * If no gradient must be applicated, returns an empty string. * @return Direction.(east, west, north or south) */ private String getGradientDirection() { String direction = ""; String pattern = getColorPattern(); if (pattern.equals("25")) { direction = mxConstants.DIRECTION_EAST; } else if (pattern.equals("27")) { direction = mxConstants.DIRECTION_WEST; } else if (pattern.equals("28")) { direction = mxConstants.DIRECTION_SOUTH; } else if (pattern.equals("30")) { direction = mxConstants.DIRECTION_NORTH; } return direction; } /** * Returns the rotation of the shape.<br/> * If no gradient must be applicated, returns an empty string. * @return Rotation of the shape in degrees. */ public double getRotation() { mxVdxShapeForm vsf = new mxVdxShapeForm(this, masterShape, masterElement, 0); double rotation = 0; if (this.hasAngle()) { rotation = this.getAngle(); } else if (masterShape != null && masterShape.hasAngle()) { rotation = masterShape.getAngle(); } //Correct the rotation of shapes out of phase. if (vsf.isEastDirection()) { rotation = Math.toDegrees(rotation); rotation -= 90; rotation = rotation % 360; return 360 - rotation; } rotation = Math.toDegrees(rotation); rotation = rotation % 360; return 360 - rotation; } /** * Returns the label background color.<br/> * The property may to be defined in master shape or text stylesheet.<br/> * @return hexadecimal representation of the color. */ public String getLabelBkgndColor() { String lbkgnd = ""; if (this.hasTextBkgndColor()) { lbkgnd = this.getTextBkgndColor(); } else if (masterShape != null && masterShape.hasTextBkgndColor()) { lbkgnd = masterShape.getTextBkgndColor(); } else if (textStyle != null && textStyle.hasTextBkgndColor()) { lbkgnd = textStyle.getTextBkgndColor(); } return lbkgnd; } /** * Returns the top spacing of the label in pixels.<br/> * The property may to be defined in master shape or text stylesheet.<br/> * @return Top spacing in double precision. */ public double getTopSpacing() { double topMargin = 0; if (this.hasTextTopMargin()) { topMargin = this.getTextTopMargin(); } else if (masterShape != null && masterShape.hasTextTopMargin()) { topMargin = masterShape.getTextTopMargin(); } else if (textStyle != null && textStyle.hasTextTopMargin()) { topMargin = textStyle.getTextTopMargin(); } //value is fixed. return topMargin / 2 - 2.8; } /** * Returns the bottom spacing of the label in pixels.<br/> * The property may to be defined in master shape or text stylesheet.<br/> * @return Bottom spacing in double precision. */ public double getBottomSpacing() { double bottomMargin = 0; if (this.hasTextBottomMargin()) { bottomMargin = this.getTextBottomMargin(); } else if (masterShape != null && masterShape.hasTextBottomMargin()) { bottomMargin = masterShape.getTextBottomMargin(); } else if (textStyle != null && textStyle.hasTextBottomMargin()) { bottomMargin = textStyle.getTextBottomMargin(); } return bottomMargin / 2 - 2.8; } /** * Returns the left spacing of the label in pixels.<br/> * The property may to be defined in master shape or text stylesheet.<br/> * @return Left spacing in double precision. */ public double getLeftSpacing() { double leftMargin = 0; if (this.hasTextLeftMargin()) { leftMargin = this.getTextLeftMargin(); } else if (masterShape != null && masterShape.hasTextLeftMargin()) { leftMargin = masterShape.getTextLeftMargin(); } else if (textStyle != null && textStyle.hasTextLeftMargin()) { leftMargin = textStyle.getTextLeftMargin(); } return leftMargin / 2 - 2.8; } /** * Returns the right spacing of the label in pixels.<br/> * The property may to be defined in master shape or text stylesheet.<br/> * @return Right spacing in double precision. */ public double getRightSpacing() { double rightMargin = 0; if (this.hasTextRightMargin()) { rightMargin = this.getTextRightMargin(); } else if (masterShape != null && masterShape.hasTextRightMargin()) { rightMargin = masterShape.getTextRightMargin(); } else if (textStyle != null && textStyle.hasTextRightMargin()) { rightMargin = textStyle.getTextRightMargin(); } return rightMargin / 2 - 2.8; } /** * Returns the vertical align of the label.<br/> * The property may to be defined in master shape or text stylesheet.<br/> * @return Vertical align (bottom, middle and top) */ public String getAlignVertical() { int align = 1; String vertical = mxConstants.ALIGN_MIDDLE; if (this.hasVerticalAlign()) { align = this.getVerticalAlign(); } else if (masterShape != null && masterShape.hasVerticalAlign()) { masterShape.getVerticalAlign(); } else if (textStyle != null && textStyle.hasVerticalAlign()) { textStyle.getVerticalAlign(); } if (align == 0) { vertical = mxConstants.ALIGN_TOP; } else if (align == 2) { vertical = mxConstants.ALIGN_BOTTOM; } return vertical; } /** * Checks if the label must be rotated.<br/> * The property may to be defined in master shape or text stylesheet.<br/> * @return Returns <code>true<code/> if the label must remains horizontal. */ public boolean getLabelRotation() { boolean horz = true; //Defines rotation. double rotation = this.getRotation(); double angle = 0; if (this.hasTxtAngle()) { angle = this.getTxtAngle(); } else if (masterShape != null && masterShape.hasTxtAngle()) { angle = masterShape.getTxtAngle(); } else if (textStyle != null && textStyle.hasTxtAngle()) { angle = textStyle.getTxtAngle(); } angle = Math.toDegrees(angle); angle = angle - rotation; if (!(Math.abs(angle) < 45 || Math.abs(angle) > 270)) { horz = false; } return horz; } /** * Analizes the shape and returns a string whith the style. * @return style readed from the shape. */ public String getStyleFromShape(double parentHeight) { Hashtable<String, Object> styleMap = new Hashtable<String, Object>(); mxVdxShapeForm vsf = new mxVdxShapeForm(this, masterShape, masterElement, parentHeight); //Set the style of the labels. styleMap.put(mxConstants.STYLE_WHITE_SPACE, "wrap"); //Defines rotation. double rotation = this.getRotation(); //Defines Label Rotation styleMap.put(mxConstants.STYLE_HORIZONTAL, getLabelRotation()); styleMap.put(mxConstants.STYLE_ROTATION, rotation); //Defines opacity double opacity = this.getOpacity(); styleMap.put(mxConstants.STYLE_OPACITY, opacity); //Defines fillcolor String fillcolor = getColor(); if (!fillcolor.equals("")) { styleMap.put(mxConstants.STYLE_FILLCOLOR, fillcolor); } //Defines gradient String gradient = getGradient(); if (!gradient.equals("")) { styleMap.put(mxConstants.STYLE_GRADIENTCOLOR, gradient); String gradientDirection = getGradientDirection(); if (!gradientDirection.equals("")) { styleMap.put(mxConstants.STYLE_GRADIENT_DIRECTION, gradientDirection); } } //Defines Form String form = ""; if (this.isSupportedShape()) { form = vsf.getForm(); } else { form = vsf.getAproxForm(); } styleMap.put(mxConstants.STYLE_SHAPE, form); //Defines if line is rounding if (!form.endsWith(mxConstants.STYLE_ROUNDED + "=1")) { String isRounded = getIsRounded(); styleMap.put(mxConstants.STYLE_ROUNDED, isRounded); } //Defines line Pattern String dashed = isDashed() ? "1" : "0"; styleMap.put(mxConstants.STYLE_DASHED, dashed); //Defines line color String color = getLineStrokeColor(); styleMap.put(mxConstants.STYLE_STROKECOLOR, color); //Defines the line width double lWeight = getLineWidth(); styleMap.put(mxConstants.STYLE_STROKEWIDTH, lWeight); //Defines if line has shadow String isShadow = getIsShadow(); styleMap.put(mxConstants.STYLE_SHADOW, isShadow); //Defines label background String lbkgnd = getLabelBkgndColor(); if (!lbkgnd.equals("")) { styleMap.put(mxConstants.STYLE_LABEL_BACKGROUNDCOLOR, lbkgnd); } //Defines label top spacing double topMargin = getTopSpacing(); styleMap.put(mxConstants.STYLE_SPACING_TOP, topMargin); //Defines label bottom spacing double bottomMargin = getBottomSpacing(); styleMap.put(mxConstants.STYLE_SPACING_BOTTOM, bottomMargin); //Defines label left spacing double leftMargin = getLeftSpacing(); styleMap.put(mxConstants.STYLE_SPACING_LEFT, leftMargin); //Defines label right spacing double rightMargin = getRightSpacing(); styleMap.put(mxConstants.STYLE_SPACING_RIGHT, rightMargin); //Defines label vertical align String verticalAlign = getAlignVertical(); styleMap.put(mxConstants.STYLE_VERTICAL_ALIGN, verticalAlign); String perimeter = vsf.getPerimeter(form); styleMap.put(mxConstants.STYLE_PERIMETER, perimeter); String direction = vsf.getDirection(form); styleMap.put(mxConstants.STYLE_DIRECTION, direction); return mxVdxUtils.getStyleString(styleMap, "="); } /** * Checks if the lines of the shape are dashed.<br/> * The property may to be defined in master shape or line stylesheet.<br/> * @return Returns <code>true</code> if the lines of the shape are dashed. */ public boolean isDashed() { boolean dashed = false; if (this.hasLinePattern()) { String linePattern = this.getLinePattern(); if (!(linePattern.equals("0") || linePattern.equals("1"))) { dashed = true; } } else if ((masterShape != null) && masterShape.hasLinePattern()) { String linePattern = masterShape.getLinePattern(); if (!(linePattern.equals("0") || linePattern.equals("1"))) { dashed = true; } } else if ((lineStyle != null) && lineStyle.hasLinePattern()) { String linePattern = lineStyle.getLinePattern(); if (!(linePattern.equals("0") || linePattern.equals("1"))) { dashed = true; } } return dashed; } /** * Returns the start arrow of the line. * @return Type of start arrow. */ public String getStartArrow() { String beginArrow = mxConstants.NONE; String begin = "0"; if (this.hasBeginArrow()) { begin = this.getBeginArrow(); } else if ((masterShape != null) && masterShape.hasBeginArrow()) { begin = masterShape.getBeginArrow(); } else if ((lineStyle != null) && lineStyle.hasBeginArrow()) { begin = lineStyle.getBeginArrow(); } if (begin.equals("0")) { beginArrow = mxConstants.NONE; } else if (begin.equals("1")) { beginArrow = mxConstants.ARROW_OPEN; } else if (begin.equals("5")) { beginArrow = mxConstants.ARROW_CLASSIC; } else if (begin.equals("4")) { beginArrow = mxConstants.ARROW_BLOCK; } else if (begin.equals("10")) { beginArrow = mxConstants.ARROW_OVAL; } else { beginArrow = mxConstants.ARROW_CLASSIC; } return beginArrow; } /** * Returns the end arrow of the line. * @return Type of end arrow. */ public String getFinalArrow() { String endArrow = mxConstants.NONE; String end = "0"; if (this.hasEndArrow()) { end = this.getEndArrow(); } else if ((masterShape != null) && masterShape.hasEndArrow()) { end = masterShape.getEndArrow(); } else if ((lineStyle != null) && lineStyle.hasEndArrow()) { end = lineStyle.getEndArrow(); } if (end.equals("0")) { endArrow = mxConstants.NONE; } else if (end.equals("1")) { endArrow = mxConstants.ARROW_OPEN; } else if (end.equals("5")) { endArrow = mxConstants.ARROW_CLASSIC; } else if (end.equals("4")) { endArrow = mxConstants.ARROW_BLOCK; } else if (end.equals("10")) { endArrow = mxConstants.ARROW_OVAL; } else { endArrow = mxConstants.ARROW_CLASSIC; } return endArrow; } /** * Returns the line color.<br/> * The property may to be defined in master shape or line stylesheet.<br/> * @return hexadecimal representation of the color. */ public String getLineStrokeColor() { String color = "#000000"; if (this.hasLineColor()) { color = this.getLineColor(); } else if ((masterShape != null) && masterShape.hasLineColor()) { color = masterShape.getLineColor(); } else if ((lineStyle != null) && lineStyle.hasLineColor()) { color = lineStyle.getLineColor(); } return color; } /** * Returns the line width.<br/> * The property may to be defined in master shape or line stylesheet.<br/> * @return Line width in pixels. */ public double getLineWidth() { double lWeight = 1; if (this.hasLineWeight()) { lWeight = this.getLineWeight(); } else if ((masterShape != null) && masterShape.hasLineWeight()) { lWeight = masterShape.getLineWeight(); } else if ((lineStyle != null) && lineStyle.hasLineWeight()) { lWeight = lineStyle.getLineWeight(); } //Value is fixed for weight < 1 if (lWeight < 1) { lWeight *= 2; } return lWeight; } /** * Returns the start arrow size.<br/> * The property may to be defined in master shape or line stylesheet.<br/> * Determines the value in pixels of each arrow size category in .vdx. * @return Size in pixels. */ public float getStartArrowSize() { String baSize = "4"; float saSize = 4; if (this.hasBeginArrowSize()) { baSize = this.getBeginArrowSize(); } else if ((masterShape != null) && masterShape.hasBeginArrowSize()) { baSize = masterShape.getBeginArrowSize(); } else if ((lineStyle != null) && lineStyle.hasBeginArrowSize()) { baSize = lineStyle.getBeginArrowSize(); } if (baSize.equals("0")) { saSize = 2; } else if (baSize.equals("1")) { saSize = 3; } else if (baSize.equals("2")) { saSize = 5; } else if (baSize.equals("3")) { saSize = 7; } else if (baSize.equals("4")) { saSize = 9; } else if (baSize.equals("5")) { saSize = 22; } else if (baSize.equals("6")) { saSize = 45; } return saSize; } /** * Returns the end arrow size.<br/> * The property may to be defined in master shape or line stylesheet.<br/> * Determines the value in pixels of each arrow size category in .vdx. * @return Size in pixels. */ public float getFinalArrowSize() { String eaSize = "4"; float faSize = 4; if (this.hasEndArrowSize()) { eaSize = this.getEndArrowSize(); } else if ((masterShape != null) && masterShape.hasEndArrowSize()) { eaSize = masterShape.getEndArrowSize(); } else if ((lineStyle != null) && lineStyle.hasEndArrowSize()) { eaSize = lineStyle.getEndArrowSize(); } if (eaSize.equals("0")) { faSize = 2; } else if (eaSize.equals("1")) { faSize = 3; } else if (eaSize.equals("2")) { faSize = 5; } else if (eaSize.equals("3")) { faSize = 7; } else if (eaSize.equals("4")) { faSize = 9; } else if (eaSize.equals("5")) { faSize = 22; } else if (eaSize.equals("6")) { faSize = 45; } return faSize; } /** * Returns if the line is Rounded.<br/> * The property may to be defined in master shape or line stylesheet.<br/> * @return Returns <code>mxVdxConstants.TRUE</code> if the line is Rounded. */ public String getIsRounded() { double round = 0; if (this.hasRounding()) { round = this.getRounding(); } else if ((masterShape != null) && masterShape.hasRounding()) { round = masterShape.getRounding(); } else if ((lineStyle != null) && lineStyle.hasRounding()) { round = lineStyle.getRounding(); } String isRounded = mxVdxConstants.FALSE; if (round > 0) { isRounded = mxVdxConstants.TRUE; } return isRounded; } /** * Return if the line has shadow.<br/> * The property may to be defined in master shape or line stylesheet.<br/> * @return Returns <code>mxVdxConstants.TRUE</code> if the line has shadow. */ public String getIsShadow() { String shdw = "0"; if (this.hasShdwPattern()) { shdw = this.getShdwPattern(); } else if ((masterShape != null) && masterShape.hasShdwPattern()) { shdw = masterShape.getShdwPattern(); } else if ((lineStyle != null) && lineStyle.hasShdwPattern()) { shdw = lineStyle.getShdwPattern(); } String isShadow = mxVdxConstants.FALSE; if (!shdw.equals("0")) { isShadow = mxVdxConstants.TRUE; } return isShadow; } /** * Returns the style of the edge. (Orthogonal or straight) * @return Edge Style. */ public String getEdgeStyle() { if (this.getAmountLineTo() > 1) { return mxConstants.EDGESTYLE_ELBOW; } else { return mxConstants.NONE; } } /** * Analizes a edge shape and returns a string with the style. * @return style read from the edge shape. */ public String getStyleFromEdgeShape(double parentHeight) { Hashtable<String, Object> styleMap = new Hashtable<String, Object>(); //Defines Edge Style styleMap.put(mxConstants.STYLE_EDGE, getEdgeStyle()); //Defines Pattern String dashed = isDashed() ? "1" : "0"; styleMap.put(mxConstants.STYLE_DASHED, dashed); //Defines Begin Arrow String beginArrow = getStartArrow(); styleMap.put(mxConstants.STYLE_STARTARROW, beginArrow); //Defines End Arrow String endArrow = getFinalArrow(); styleMap.put(mxConstants.STYLE_ENDARROW, endArrow); //Defines the start arrow size. float saSize = getStartArrowSize(); styleMap.put(mxConstants.STYLE_STARTSIZE, saSize); //Defines the end arrow size. float faSize = getFinalArrowSize(); styleMap.put(mxConstants.STYLE_ENDSIZE, faSize); //Defines the line width double lWeight = getLineWidth(); styleMap.put(mxConstants.STYLE_STROKEWIDTH, lWeight); //Defines color String color = getLineStrokeColor(); styleMap.put(mxConstants.STYLE_STROKECOLOR, color); //Defines if line is rounding String isRounded = getIsRounded(); styleMap.put(mxConstants.STYLE_ROUNDED, isRounded); //Defines if line has shadow String isShadow = getIsShadow(); styleMap.put(mxConstants.STYLE_SHADOW, isShadow); if (isConnectorBigNameU(getNameU())) { styleMap.put(mxConstants.STYLE_SHAPE, mxConstants.SHAPE_ARROW); //Defines fillcolor String fillcolor = getColor(); if (!fillcolor.equals("")) { styleMap.put(mxConstants.STYLE_FILLCOLOR, fillcolor); } } //Defines label background String lbkgnd = getLabelBkgndColor(); if (!lbkgnd.equals("")) { styleMap.put(mxConstants.STYLE_LABEL_BACKGROUNDCOLOR, lbkgnd); } //Defines label top spacing double topMargin = getTopSpacing(); styleMap.put(mxConstants.STYLE_SPACING_TOP, topMargin); //Defines label bottom spacing double bottomMargin = getBottomSpacing(); styleMap.put(mxConstants.STYLE_SPACING_BOTTOM, bottomMargin); //Defines label left spacing double leftMargin = getLeftSpacing(); styleMap.put(mxConstants.STYLE_SPACING_LEFT, leftMargin); //Defines label right spacing double rightMargin = getRightSpacing(); styleMap.put(mxConstants.STYLE_SPACING_RIGHT, rightMargin); //Defines label vertical align String verticalAlign = getAlignVertical(); styleMap.put(mxConstants.STYLE_VERTICAL_ALIGN, verticalAlign); //Defines Label Rotation styleMap.put(mxConstants.STYLE_HORIZONTAL, getLabelRotation()); return mxVdxUtils.getStyleString(styleMap, "="); } /** * Returns the points of a vertex shape. * @param parentHeight Height of the parent cell of the shape. * @return array of mxPoint whith the vertex's points */ public mxPoint[] getVertexPoints(double parentHeight) { NodeList childrens = shape.getChildNodes(); mxPoint origin = this.getOriginPoint(parentHeight); mxPoint dimentions = this.getDimentions(); Element geom = mxVdxUtils.nodeListTag(childrens, mxVdxConstants.GEOM); NodeList lineToList = geom.getElementsByTagName(mxVdxConstants.LINE_TO); int length = lineToList.getLength(); mxPoint[] points = new mxPoint[length]; for (int i = 0; i < length; i++) { Element lineTo = (Element) lineToList.item(i); points[i] = getLineToXY(lineTo); points[i].setX(points[i].getX() + origin.getX()); points[i] .setY(points[i].getY() + origin.getY() + dimentions.getY()); } return points; } /** * Returns the master's Id of the Shape. * @return Master's ID of the shape, null if has not a master. */ public String getMasterId() { if (shape.hasAttribute(mxVdxConstants.MASTER)) { return shape.getAttribute(mxVdxConstants.MASTER); } else { return null; } } /** * Gets the Master's Id of the shape. If it not has the master atribute, the function look * for it in his parents. * @return Master's Id of the shape. */ public String lookForMasterId() { String id = null; Element shap = this.shape; while ((id == null || id.equals("")) && (!shap.getTagName().equals(mxVdxConstants.PAGE))) { id = shap.getAttribute(mxVdxConstants.MASTER); shap = (Element) shap.getParentNode(); } return id; } /** * Returns the masterShape's Id of the shape. * @return Master Shape's ID of the shape, null if has not a master shape. */ public String getShapeMasterId() { if (shape.hasAttribute(mxVdxConstants.MASTER_SHAPE)) { return shape.getAttribute(mxVdxConstants.MASTER_SHAPE); } else { return null; } } /** * Checks if a shape contains other shapes inside. * @return Returns <code>true</code> if a shape contains other shapes inside. */ public boolean isGroup() { return shape.getAttribute("Type").equals("Group"); } /** * Returns if the shape is composed for several shapes. * @return Returns <code>true</code> if the shape is composed for several shapes. */ public boolean isComplexShape() { mxVdxShapeForm vsf = new mxVdxShapeForm(this, masterShape, masterElement, 0); boolean isComplex = false; if (isGroup()) { isComplex = vsf.isSwimlane(); isComplex |= vsf.isSubproces(); isComplex |= vsf.isSimpleComplex(); } return isComplex; } /** * Adds a Complex shape to the graph. * The sub-shapes of a complex shape are processed like part of the shape. * @param graph Graph where the parsed graph is included. * @param parent Parent cell of the shape. * @param parentHeight Height of the parent cell of the shape. * @return Cell added to the graph. */ public mxCell addComplexShapeToGraph(mxGraph graph, Object parent, double parentHeight) { mxVdxShapeForm vsf = new mxVdxShapeForm(this, masterShape, masterElement, 0); if (vsf.isSwimlane()) { //Set title String t = ""; Element text = (Element) shape.getElementsByTagName("Text").item(0); if (text != null) { t = (text.getTextContent()); } //Get subshapes. NodeList shpsList = shape.getElementsByTagName("Shapes"); Element shps = (Element) shpsList.item(0); NodeList child = shps.getChildNodes(); Element sh = (Element) child.item(child.getLength() - 2); mxVdxShape subShape = new mxVdxShape(sh); Element sh2 = (Element) child.item(child.getLength() - 1); mxVdxShape subShape2 = new mxVdxShape(sh2); //Define dimentions mxPoint d = this.getDimentions(); d.setY(subShape.getDimentions().getY()); //Define origin mxPoint o = this.getOriginPoint(parentHeight); //Define style String style = this.getStyleFromShape(parentHeight); HashMap<String, Object> styleMap = mxVdxUtils.getStyleMap(style, "="); styleMap.put(mxConstants.STYLE_FILLCOLOR, subShape2.getColor()); style = mxVdxUtils.getStyleString(styleMap, "="); //Insert a new vertex in the graph mxCell v1 = (mxCell) graph.insertVertex(parent, null, t, o.getX(), o.getY(), d.getX(), d.getY(), style); return v1; } else { //The first shape has all the properties. return this.addSimpleShapeToGraph(graph, parent, parentHeight); } } /** * Adds a simple shape to the graph * @param graph Graph where the parsed graph is included. * @param parent Parent cell of the shape. * @param parentHeight Height of the parent cell of the shape. * @return Cell added to the graph. */ public mxCell addSimpleShapeToGraph(mxGraph graph, Object parent, double parentHeight) { mxVdxShapeForm vsf = new mxVdxShapeForm(this, masterShape, masterElement, 0); //Defines Text Label. String textLabel = this.getTextLabel(); mxPoint cordenates = this.getOriginPoint(parentHeight); mxPoint dimentions = this.getDimentions(); if (vsf.isEastDirection()) { double y = dimentions.getY(); double x = dimentions.getX(); dimentions.setX(y); dimentions.setY(x); } //Defines style String style = this.getStyleFromShape(parentHeight); //Insert a new vertex in the graph mxCell v1 = (mxCell) graph.insertVertex(parent, null, textLabel, cordenates.getX(), cordenates.getY(), dimentions.getX(), dimentions.getY(), style); return v1; } }