Package com.mxgraph.io.vdx

Source Code of com.mxgraph.io.vdx.mxVdxShape

package com.mxgraph.io.vdx;

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;
import java.util.HashMap;
import java.util.Hashtable;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

/**
* 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;
  }
}
TOP

Related Classes of com.mxgraph.io.vdx.mxVdxShape

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.