/*
* @(#)DefaultSVGFigureFactory.java
*
* Copyright (c) 1996-2010 The authors and contributors of JHotDraw.
* You may not use, copy or modify this file, except in compliance with the
* accompanying license terms.
*/
package org.jhotdraw.samples.svg.io;
import java.awt.Color;
import java.awt.geom.*;
import java.awt.image.BufferedImage;
import java.util.*;
import javax.swing.text.*;
import org.jhotdraw.draw.*;
import org.jhotdraw.geom.BezierPath;
import org.jhotdraw.samples.svg.*;
import org.jhotdraw.samples.svg.figures.*;
/**
* DefaultSVGFigureFactory.
*
* @author Werner Randelshofer
* @version $Id$
*/
public class DefaultSVGFigureFactory implements SVGFigureFactory {
/** Creates a new instance. */
public DefaultSVGFigureFactory() {
}
@Override
public Figure createRect(double x, double y, double w, double h, double rx, double ry, Map<AttributeKey<?>, Object> a) {
SVGRectFigure figure = new SVGRectFigure();
figure.setBounds(new Point2D.Double(x,y),new Point2D.Double(x+w,y+h));
figure.setArc(rx, ry);
figure.setAttributes(a);
return figure;
}
@Override
public Figure createCircle(double cx, double cy, double r, Map<AttributeKey<?>, Object> a) {
return createEllipse(cx, cy, r, r, a);
}
@Override
public Figure createEllipse(double cx, double cy, double rx, double ry, Map<AttributeKey<?>, Object> a) {
SVGEllipseFigure figure = new SVGEllipseFigure(cx-rx, cy-ry, rx*2d, ry*2d);
figure.setAttributes(a);
return figure;
}
@Override
public Figure createLine(
double x1, double y1, double x2, double y2,
Map<AttributeKey<?>,Object> a) {
SVGPathFigure figure = new SVGPathFigure();
figure.removeAllChildren();
SVGBezierFigure bf = new SVGBezierFigure();
bf.addNode(new BezierPath.Node(x1, y1));
bf.addNode(new BezierPath.Node(x2, y2));
figure.add(bf);
figure.setAttributes(a);
return figure;
}
@Override
public Figure createPolyline(Point2D.Double[] points, Map<AttributeKey<?>, Object> a) {
SVGPathFigure figure = new SVGPathFigure();
figure.removeAllChildren();
SVGBezierFigure bf = new SVGBezierFigure();
for (int i=0; i < points.length; i++) {
bf.addNode(new BezierPath.Node(points[i].x, points[i].y));
}
figure.add(bf);
figure.setAttributes(a);
return figure;
}
@Override
public Figure createPolygon(Point2D.Double[] points, Map<AttributeKey<?>, Object> a) {
SVGPathFigure figure = new SVGPathFigure();
figure.removeAllChildren();
SVGBezierFigure bf = new SVGBezierFigure();
for (int i=0; i < points.length; i++) {
bf.addNode(new BezierPath.Node(points[i].x, points[i].y));
}
bf.setClosed(true);
figure.add(bf);
figure.setAttributes(a);
return figure;
}
@Override
public Figure createPath(BezierPath[] beziers, Map<AttributeKey<?>, Object> a) {
SVGPathFigure figure = new SVGPathFigure();
figure.removeAllChildren();
for (int i=0; i < beziers.length; i++) {
SVGBezierFigure bf = new SVGBezierFigure();
bf.setBezierPath(beziers[i]);
figure.add(bf);
}
figure.setAttributes(a);
return figure;
}
@Override
public CompositeFigure createG(Map<AttributeKey<?>, Object> a) {
SVGGroupFigure figure = new SVGGroupFigure();
figure.setAttributes(a);
return figure;
}
@Override
public Figure createImage(double x, double y, double w, double h,
byte[] imageData, BufferedImage bufferedImage, Map<AttributeKey<?>, Object> a) {
SVGImageFigure figure = new SVGImageFigure();
figure.setBounds(new Point2D.Double(x,y),new Point2D.Double(x+w,y+h));
figure.setImage(imageData, bufferedImage);
figure.setAttributes(a);
return figure;
}
@Override
public Figure createTextArea(double x, double y, double w, double h, StyledDocument doc, Map<AttributeKey<?>, Object> attributes) {
SVGTextAreaFigure figure = new SVGTextAreaFigure();
figure.setBounds(new Point2D.Double(x,y),new Point2D.Double(x+w,y+h));
try {
figure.setText(doc.getText(0, doc.getLength()));
} catch (BadLocationException e) {
InternalError ex = new InternalError(e.getMessage());
ex.initCause(e);
throw ex;
}
figure.setAttributes(attributes);
return figure;
}
@Override
public Figure createText(Point2D.Double[] coordinates, double[] rotates, StyledDocument text, Map<AttributeKey<?>, Object> a) {
SVGTextFigure figure = new SVGTextFigure();
figure.setCoordinates(coordinates);
figure.setRotates(rotates);
try {
figure.setText(text.getText(0, text.getLength()));
} catch (BadLocationException e) {
InternalError ex = new InternalError(e.getMessage());
ex.initCause(e);
throw ex;
}
figure.setAttributes(a);
return figure;
}
@Override
public Gradient createRadialGradient(
double cx, double cy, double fx, double fy, double r,
double[] stopOffsets, Color[] stopColors, double[] stopOpacities,
boolean isRelativeToFigureBounds,
AffineTransform tx) {
return new RadialGradient(cx, cy, fx, fy, r,
stopOffsets, stopColors, stopOpacities,
isRelativeToFigureBounds,
tx);
}
@Override
public Gradient createLinearGradient(
double x1, double y1, double x2, double y2,
double[] stopOffsets, Color[] stopColors, double[] stopOpacities,
boolean isRelativeToFigureBounds,
AffineTransform tx) {
return new LinearGradient(x1, y1, x2, y2,
stopOffsets, stopColors, stopOpacities,
isRelativeToFigureBounds,
tx);
}
}