/* * PainterPropertyEditor.java * * Created on March 21, 2006, 11:26 AM * * To change this template, choose Tools | Template Manager * and open the template in the editor. */ package org.jdesktop.beans.editors; import java.awt.Color; import java.awt.GradientPaint; import java.awt.Insets; import java.awt.LinearGradientPaint; import java.awt.RadialGradientPaint; import java.awt.MultipleGradientPaint.ColorSpaceType; import java.awt.geom.AffineTransform; import java.awt.geom.Arc2D; import java.awt.geom.Area; import java.awt.geom.CubicCurve2D; import java.awt.geom.Ellipse2D; import java.awt.geom.GeneralPath; import java.awt.geom.Line2D; import java.awt.geom.PathIterator; import java.awt.geom.Point2D; import java.awt.geom.QuadCurve2D; import java.awt.geom.Rectangle2D; import java.awt.geom.RoundRectangle2D; import java.beans.DefaultPersistenceDelegate; import java.beans.Encoder; import java.beans.Expression; import java.beans.PersistenceDelegate; import java.beans.PropertyEditorSupport; import java.beans.Statement; import java.beans.XMLEncoder; import java.io.ByteArrayOutputStream; import org.jdesktop.swingx.painter.Painter; /** * Two parts to this property editor. The first part is a simple dropdown. * The second part is a complicated UI for constructing multiple "layers" of * various different Painters, including gradient painters. * * @author Richard */ public class PainterPropertyEditor extends PropertyEditorSupport { /** Creates a new instance of PainterPropertyEditor */ public PainterPropertyEditor() { } @Override public Painter getValue() { return (Painter)super.getValue(); } @Override public String getJavaInitializationString() { Painter painter = getValue(); //TODO!!! return painter == null ? "null" : "new org.jdesktop.swingx.painter.CheckerboardPainter()"; } public static final class GradientPaintDelegate extends DefaultPersistenceDelegate { public GradientPaintDelegate() { super(new String[] {"point1", "color1", "point2", "color2"}); } } public static final class LinearGradientPaintDelegate extends DefaultPersistenceDelegate { public LinearGradientPaintDelegate() { super(new String[] {"startPoint", "endPoint", "fractions", "colors"}); //these 3 not yet supported. The problem is the //colorspace. I haven't figured out how to transfer that one yet //, "cycleMethod", "colorSpace", "transform"}); } @Override protected Expression instantiate(Object oldInstance, Encoder out) { ColorSpaceType e = ((LinearGradientPaint)oldInstance).getColorSpace(); Expression retValue; retValue = super.instantiate(oldInstance, out); return retValue; } } public static final class RadialGradientPaintDelegate extends DefaultPersistenceDelegate { public RadialGradientPaintDelegate() { super(new String[] {"centerPoint", "radius", "focusPoint", "fractions", "colors"}); //these 3 not yet supported. The problem is the //colorspace. I haven't figured out how to transfer that one yet //, "cycleMethod", "colorSpace", "transform"}); } } public static final class Arc2DDelegate extends DefaultPersistenceDelegate { public Arc2DDelegate() { super(new String[] {"x", "y", "width", "height", "angleStart", "angleExtent", "arcType"}); } } public static final class CubicCurve2DDelegate extends DefaultPersistenceDelegate { public CubicCurve2DDelegate() { super(new String[] {"x1", "y1", "ctrlX1", "ctrlY1", "ctrlX2", "ctrlY2", "x2", "y2"}); } } public static final class Ellipse2DDelegate extends DefaultPersistenceDelegate { public Ellipse2DDelegate() { super(new String[] {"x", "y", "width", "height"}); } } public static final class Line2DDelegate extends DefaultPersistenceDelegate { public Line2DDelegate() { super(new String[] {"x1", "y1", "x2", "y2"}); } } public static final class Point2DDelegate extends DefaultPersistenceDelegate { public Point2DDelegate() { super(new String[] {"x", "y"}); }/* protected Expression instantiate(Object oldInstance, Encoder out) { Point2D pt = (Point2D)oldInstance; Object[] constructorArgs = new Object[]{ pt.getX(), pt.getY() }; return new Expression(new Point2D.Double(-1,-1), oldInstance.getClass(), "new", constructorArgs); } */ /* protected void initialize(Class<?> type, Object oldInstance, Object newInstance, Encoder out) { super.initialize(type,oldInstance,newInstance,out); System.out.println("initialize called: " + type + " " + oldInstance + " " + newInstance + " " + out); }*/ } public static final class QuadCurve2DDelegate extends DefaultPersistenceDelegate { public QuadCurve2DDelegate() { super(new String[] {"x1", "y1", "ctrlX", "ctrlY", "x2", "y2"}); } } public static final class Rectangle2DDelegate extends DefaultPersistenceDelegate { public Rectangle2DDelegate() { super(new String[] {"x", "y", "width", "height"}); } } public static final class InsetsDelegate extends DefaultPersistenceDelegate { public InsetsDelegate() { super(new String[] {"top", "left", "bottom", "right"}); } @Override protected Expression instantiate(Object oldInstance, Encoder out) { Insets ins = (Insets)oldInstance; return new Expression(oldInstance, oldInstance.getClass(), "new", new Object[]{ ins.top, ins.left, ins.bottom, ins.right }); } } public static final class RoundRectangle2DDelegate extends DefaultPersistenceDelegate { public RoundRectangle2DDelegate() { super(new String[] {"x", "y", "width", "height", "arcWidth", "arcHeight"}); } } public static final class AreaDelegate extends PersistenceDelegate { @Override protected Expression instantiate(Object oldInstance, Encoder out) { Area a = (Area)oldInstance; //use the default constructor AffineTransform tx = new AffineTransform(); PathIterator itr = a.getPathIterator(tx); GeneralPath path = new GeneralPath(); out.writeExpression(new Expression(path, GeneralPath.class, "new", new Object[0])); while (!itr.isDone()) { float[] segment = new float[6]; //must use floats because lineTo etc use floats int pathType = itr.currentSegment(segment); switch (pathType) { case PathIterator.SEG_CLOSE: out.writeStatement(new Statement(path, "closePath", new Object[0])); break; case PathIterator.SEG_CUBICTO: out.writeStatement(new Statement(path, "curveTo", new Object[] {segment[0], segment[1], segment[2], segment[3], segment[4], segment[5]})); break; case PathIterator.SEG_LINETO: out.writeStatement(new Statement(path, "lineTo", new Object[] {segment[0], segment[1]})); break; case PathIterator.SEG_MOVETO: out.writeStatement(new Statement(path, "moveTo", new Object[] {segment[0], segment[1]})); break; case PathIterator.SEG_QUADTO: out.writeStatement(new Statement(path, "quadTo", new Object[] {segment[0], segment[1], segment[2], segment[3]})); break; } itr.next(); } return new Expression(a, Area.class, "new", new Object[] {path}); } } public static final class AffineTransformDelegate extends DefaultPersistenceDelegate { public AffineTransformDelegate() { super(new String[] {"scaleX", "shearY", "shearX", "scaleY", "translateX", "translateY"}); } } public static final class GeneralPathDelegate extends PersistenceDelegate { @Override protected Expression instantiate(Object oldInstance, Encoder out) { return new Expression(oldInstance, GeneralPath.class, "new", new Object[0]); } @Override protected void initialize(Class<?> type, Object oldInstance, Object newInstance, Encoder out) { GeneralPath a = (GeneralPath)oldInstance; AffineTransform tx = new AffineTransform(); PathIterator itr = a.getPathIterator(tx); out.writeStatement(new Statement(a, "setWindingRule", new Object[] {a.getWindingRule()})); while (!itr.isDone()) { float[] segment = new float[6]; //must use floats because lineTo etc use floats int pathType = itr.currentSegment(segment); switch (pathType) { case PathIterator.SEG_CLOSE: out.writeStatement(new Statement(a, "closePath", new Object[0])); break; case PathIterator.SEG_CUBICTO: out.writeStatement(new Statement(a, "curveTo", new Object[] {segment[0], segment[1], segment[2], segment[3], segment[4], segment[5]})); break; case PathIterator.SEG_LINETO: out.writeStatement(new Statement(a, "lineTo", new Object[] {segment[0], segment[1]})); break; case PathIterator.SEG_MOVETO: out.writeStatement(new Statement(a, "moveTo", new Object[] {segment[0], segment[1]})); break; case PathIterator.SEG_QUADTO: out.writeStatement(new Statement(a, "quadTo", new Object[] {segment[0], segment[1], segment[2], segment[3]})); break; } itr.next(); } } } // public static final class PaintDelegate extends PersistenceDelegate { // protected Expression instantiate(Object oldInstance, Encoder out) { // if (oldInstance instanceof GradientPaint) { // // } // } // } }