/* * A Java program that demonstrates a simple general-purpose drawing architecture * * Ben Bederson, April 18, 2002 */ import java.awt.*; import java.awt.event.*; import java.awt.geom.*; import javax.swing.*; public class Glyph { static public final Color SELECTION_COLOR = Color.black; static final Stroke selectionStroke = new BasicStroke(3, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER); Rectangle bounds; // local coordinates AffineTransform at = null; Color color = null; boolean selected = false; Scene scene; public Glyph(Scene scene) { bounds = new Rectangle(); this.scene = scene; } public void repaint() { scene.repaint(); } // Don't override this, instead override paintGlyph() public void paint(Graphics2D g) { AffineTransform saveTransform = null; if (at != null) { saveTransform = g.getTransform(); g.setTransform(at); } paintGlyph(g); if (selected) { g.setColor(SELECTION_COLOR); g.setStroke(selectionStroke); g.draw(bounds); } if (at != null) { g.setTransform(saveTransform); } } // Override this one public void paintGlyph(Graphics2D g) { } public void computeBounds() { } // Determines if this glyph contains the point (x, y) specified int global coordinates public boolean contains(int x, int y) { Point2D pt = new Point2D.Double(x, y); if (at != null) { try { // These converts the point from global // to local coordinates at.inverseTransform(pt, pt); } catch (NoninvertibleTransformException e) {} } return bounds.contains(pt.getX(), pt.getY()); } public void setTransform(AffineTransform at) { this.at = at; repaint(); } // Return a copy of the transform, if one public AffineTransform getTransform() { AffineTransform newAT = at; if (at != null) { newAT = new AffineTransform(at); } return newAT; } public void setColor(Color color) { this.color = color; repaint(); } public Color getColor() { return color; } public void setSelected(boolean selected) { this.selected = selected; repaint(); } public boolean isSelected() { return selected; } public Rectangle getBounds() { return bounds; } }