package org.archstudio.bna.logics.hints.coders; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import org.archstudio.bna.logics.hints.EncodedValue; import org.archstudio.bna.logics.hints.IEncodedValue; import org.archstudio.bna.logics.hints.IPropertyCoder; import org.archstudio.bna.logics.hints.PropertyDecodeException; public class GeomPropertyCoder implements IPropertyCoder { @Override public IEncodedValue encode(IPropertyCoder masterCoder, Object value) { if (value instanceof Point2D) { Point2D v = (Point2D) value; String type = Point2D.class.getName(); String data = "1," + Double.doubleToLongBits(v.getX()) + "," + Double.doubleToLongBits(v.getY()); return new EncodedValue(type, data); } else if (value instanceof Rectangle2D) { Rectangle2D v = (Rectangle2D) value; String type = Rectangle2D.class.getName(); String data = "1," + Double.doubleToLongBits(v.getX()) + "," + Double.doubleToLongBits(v.getY()) + "," + Double.doubleToLongBits(v.getWidth()) + "," + Double.doubleToLongBits(v.getHeight()); return new EncodedValue(type, data); } return null; } @Override public Object decode(IPropertyCoder masterCoder, IEncodedValue encodedValue) throws PropertyDecodeException { try { String type = encodedValue.getType(); String data = encodedValue.getData(); if (Point2D.class.getName().equals(type)) { String[] d = data.split(","); double x = Double.longBitsToDouble(Long.parseLong(d[1])); double y = Double.longBitsToDouble(Long.parseLong(d[2])); Point2D v = new Point2D.Double(x, y); return v; } else if (Rectangle2D.class.getName().equals(type)) { String[] d = data.split(","); double x = Double.longBitsToDouble(Long.parseLong(d[1])); double y = Double.longBitsToDouble(Long.parseLong(d[2])); double width = Double.longBitsToDouble(Long.parseLong(d[3])); double height = Double.longBitsToDouble(Long.parseLong(d[4])); Rectangle2D v = new Rectangle2D.Double(x, y, width, height); return v; } } catch (Throwable t) { throw new PropertyDecodeException(t); } return null; } }