LRectangleSVGGenerator.java :  » Graphic-Library » LaTeXDraw-2.0.8 » latexDraw » generators » svg » Java Open Source

Java Open Source » Graphic Library » LaTeXDraw 2.0.8 
LaTeXDraw 2.0.8 » latexDraw » generators » svg » LRectangleSVGGenerator.java
package latexDraw.generators.svg;

import static java.lang.Math.min;

import java.awt.geom.RectangularShape;

import latexDraw.figures.LaTeXDrawRectangle;
import latexDraw.parsers.svg.SVGAttributes;
import latexDraw.parsers.svg.SVGDocument;
import latexDraw.parsers.svg.elements.SVGElement;
import latexDraw.parsers.svg.elements.SVGGElement;
import latexDraw.parsers.svg.elements.SVGRectElement;
import latexDraw.psTricks.PSTricksConstants;
import latexDraw.util.LaTeXDrawNamespace;
import latexDraw.util.LaTeXDrawPoint2D;

/**
 * Defines a SVG generator for a rectangle.<br>
 *<br>
 * This file is part of LaTeXDraw.<br>
 * Copyright (c) 2005-2008 Arnaud BLOUIN<br>
 *<br>
 *  LaTeXDraw is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.<br>
 *<br>
 *  LaTeXDraw is distributed without any warranty; without even the 
 *  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
 *  PURPOSE. See the GNU General Public License for more details.<br>
 *<br>
 * 11/11/07<br>
 * @author Arnaud BLOUIN<br>
 * @version 0.1<br>
 */
public class LRectangleSVGGenerator extends LPolygonSVGGenerator
{

  public LRectangleSVGGenerator(LaTeXDrawRectangle f)
  {
    super(f);
  }
  
  
  
  /**
   * Creates a rectangle from an SVG rect element.
   * @param elt The source element.
   * @since 2.0.0
   */
  public LRectangleSVGGenerator(SVGRectElement elt)
  {
    this(new LaTeXDrawRectangle(true));
    
    setSVGRectParameters(elt);
    applyTransformations(elt);
  }
  
  
  
  
  public LRectangleSVGGenerator(SVGGElement elt)
  {
    this(elt, true);
  }
  
  
  
  /**
   * Creates a rectangle from a latexdraw-SVG element.
   * @param elt The source element.
   * @since 2.0.0
   */
  public LRectangleSVGGenerator(SVGGElement elt, boolean withTransformation)
  {
    this(new LaTeXDrawRectangle(false));

    setNumber(elt);
    SVGElement elt2 = getLaTeXDrawElement(elt, null);
    
    if(elt==null || elt2==null || !(elt2 instanceof SVGRectElement))
      throw new IllegalArgumentException();
    
    setSVGLatexdrawParameters(elt);
    setSVGRectParameters((SVGRectElement)elt2);
    setSVGShadowParameters(getLaTeXDrawElement(elt, LaTeXDrawNamespace.XML_TYPE_SHADOW));
    setSVGDbleBordersParameters(getLaTeXDrawElement(elt, LaTeXDrawNamespace.XML_TYPE_DBLE_BORDERS));
    
    if(withTransformation)
      applyTransformations(elt);
  }
  
  
  
  private void setSVGRectParameters(SVGRectElement elt)
  {
    if(elt==null)
      return ;
    
    setSVGParameters(elt);
    
    double rx = elt.getRx();
    LaTeXDrawRectangle r = (LaTeXDrawRectangle)getShape();
    double gap = getPositionGap()/2.;
    
    r.setFirstPoint(elt.getX()+gap, elt.getY()+gap);
    r.setLastPoint(elt.getX()+elt.getWidth()-gap, elt.getY()+elt.getHeight()-gap);
    
    if(rx>0)
      r.setIsRound(true);
    
    RectangularShape rs = (RectangularShape)r.getShape();
    r.setFrameArc((2*rx)/(min(rs.getHeight(), rs.getWidth())- (r.hasDoubleBoundary() ? r.getDoubleSep()+r.getThickness() : 0)));
  }

  
  
  @Override
  public SVGElement toSVG(SVGDocument document)
  {
    if(document==null || document.getFirstChild().getDefs()==null)
      throw new IllegalArgumentException();

    double gap = getPositionGap();
    LaTeXDrawPoint2D nw = shape.getTheNWPoint();
    LaTeXDrawPoint2D se = shape.getTheSEPoint();
    SVGElement elt;
        SVGElement root = new SVGGElement(document);
        root.setAttribute(LaTeXDrawNamespace.LATEXDRAW_NAMESPACE+':'+LaTeXDrawNamespace.XML_TYPE, LaTeXDrawNamespace.XML_TYPE_RECT);
        root.setAttribute(SVGAttributes.SVG_ID, getSVGID());
        
        if(shape.hasShadow())
        {
          elt = new SVGRectElement(nw.x-gap/2., nw.y-gap/2., Math.max(1, (se.x-nw.x)+gap), Math.max(1, (se.y-nw.y)+gap), document);
          setSVGShadowAttributes(elt, true);
          setSVGRoundCorner(elt);
          root.appendChild(elt);
        }
        
        if(shape.hasShadow() && !shape.getLineStyle().equals(PSTricksConstants.LINE_NONE_STYLE))
        {// The background of the borders must be filled is there is a shadow.
          elt = new SVGRectElement(nw.x-gap/2., nw.y-gap/2., Math.max(1, (se.x-nw.x)+gap), Math.max(1, (se.y-nw.y)+gap), document);
          setSVGBorderBackground(elt, root);
          setSVGRoundCorner(elt);
        }
        
        elt = new SVGRectElement(nw.x-gap/2., nw.y-gap/2., Math.max(1, (se.x-nw.x)+gap), Math.max(1, (se.y-nw.y)+gap), document);
        root.appendChild(elt);
        setSVGAttributes(document, elt, true);
        setSVGRoundCorner(elt);
        
        if(shape.hasDoubleBoundary())
        {
          elt = new SVGRectElement(nw.x-gap/2., nw.y-gap/2., Math.max(1, (se.x-nw.x)+gap), Math.max(1, (se.y-nw.y)+gap), document);
          setSVGDoubleBordersAttributes(elt);
          setSVGRoundCorner(elt);
          root.appendChild(elt);
        }

        setSVGRotationAttribute(root);
        
    return root;
  }
  
  
  
  /**
   * Sets the roundness of the SVG shape.
   * @param elt The SVG element into which the roundness must be set.
   * @since 2.0.0
   */
  protected void setSVGRoundCorner(SVGElement elt)
  {
    if(elt==null)
      return ;
    
    if(((LaTeXDrawRectangle)shape).isRound())
    {
          RectangularShape r = (RectangularShape)shape.getShape();
      double add = shape.hasDoubleBoundary() ? shape.getDoubleSep() + shape.getThickness() : 0;
      double value = 0.5*(min(r.getWidth(), r.getHeight())-add)*((LaTeXDrawRectangle)shape).getFrameArc();
      
      elt.setAttribute(SVGAttributes.SVG_RX, String.valueOf(value));
    }
  }
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.