/* * Author: tdanford * Date: Jul 18, 2008 */ package org.seqcode.viz.paintable.layout; import java.awt.*; import java.awt.geom.*; import org.seqcode.viz.paintable.AbstractPaintable; import org.seqcode.viz.paintable.Paintable; public class CornerRotatingPaintable extends AbstractPaintable { public static enum Corner { UL, UR, LR, LL, CENTER }; private double rotation; private Corner corner; private Paintable inner; public CornerRotatingPaintable(double rot, Paintable in) { corner = Corner.CENTER; rotation = rot; inner = in; inner.addPaintableChangedListener(this); } public CornerRotatingPaintable(Corner c, double rot, Paintable in) { corner = c; rotation = rot; inner = in; inner.addPaintableChangedListener(this); } public void paintItem(Graphics g, int x1, int y1, int x2, int y2) { int w = x2-x1, h = y2-y1; Graphics2D g2 = (Graphics2D)g; AffineTransform at = AffineTransform.getRotateInstance(rotation); Point axis = new Point(x1+w/2, y1+h/2); switch(corner) { case UL: axis = new Point(x1, y1); break; case UR: axis = new Point(x2, y1); break; case LR: axis = new Point(x2, y2); break; case LL: axis = new Point(x1, y2); break; case CENTER: axis = new Point(x1+w/2, y1+h/2); break; } try { AffineTransform invAt = at.createInverse(); g2.translate(axis.x, axis.y); g2.transform(at); inner.paintItem(g2, x1, y1, x2, y2); g2.transform(invAt); g2.translate(-axis.x, -axis.y); } catch (NoninvertibleTransformException e) { e.printStackTrace(); } } }