package nodebox.graphics; import java.awt.*; import java.awt.geom.AffineTransform; public abstract class AbstractGrob implements Grob { private TransformDelegate transformDelegate = DefaultTransformDelegate.getDefaultDelegate(); private Transform transform; private AffineTransform savedTransform; //// Constructors //// protected AbstractGrob() { transform = new Transform(); } protected AbstractGrob(AbstractGrob g) { this.transform = g.transform == null ? new Transform() : g.transform.clone(); } //// Transformations //// public Transform getTransform() { return transform; } public void setTransform(Transform transform) { this.transform = transform; } public void transform(Transform t) { this.transform.append(t); } public void appendTransform(Transform transform) { this.transform.append(transform); } public void prependTransform(Transform transform) { this.transform.prepend(transform); } public void translate(double tx, double ty) { Transform t = Transform.translated(tx, ty); transformDelegate.transform(this, t); } public void rotate(double degrees) { Transform t = Transform.rotated(degrees); transformDelegate.transform(this, t); } public void rotateRadians(double radians) { Transform t = Transform.rotatedRadians(radians); transformDelegate.transform(this, t); } public void scale(double scale) { Transform t = Transform.scaled(scale); transformDelegate.transform(this, t); } public void scale(double sx, double sy) { Transform t = Transform.scaled(sx, sy); transformDelegate.transform(this, t); } public void skew(double skew) { Transform t = Transform.skewed(skew); transformDelegate.transform(this, t); } public void skew(double kx, double ky) { Transform t = Transform.skewed(kx, ky); transformDelegate.transform(this, t); } //// Graphics context //// protected void saveTransform(Graphics2D g) { assert (savedTransform == null); savedTransform = new AffineTransform(g.getTransform()); } protected void restoreTransform(Graphics2D g) { assert (savedTransform != null); g.setTransform(savedTransform); savedTransform = null; } public TransformDelegate getTransformDelegate() { return transformDelegate; } public void setTransformDelegate(TransformDelegate d) { transformDelegate = d; } //// Object methods //// public abstract Grob clone(); }