/* Copyright (C) 2000 Free Software Foundation This file is part of libjava. This software is copyrighted work licensed under the terms of the Libjava License. Please consult the file "LIBJAVA_LICENSE" for details. */ package java.awt.geom; /** This class implements a rectangle with rounded corners. * @author Tom Tromey * @date December 3, 2000 */ public abstract class RoundRectangle2D extends RectangularShape { /** Return the arc height of this round rectangle. */ public abstract double getArcHeight (); /** Return the arc width of this round rectangle. */ public abstract double getArcWidth (); /** Set the values of this round rectangle * @param x The x coordinate * @param y The y coordinate * @param w The width * @param h The height * @param arcWidth The arc width * @param arcHeight The arc height */ public abstract void setRoundRect (double x, double y, double w, double h, double arcWidth, double arcHeight); /** Create a RoundRectangle2D. This is protected because this class * is abstract and cannot be instantiated. */ protected RoundRectangle2D () { } /** Return true if this object contains the specified point. * @param x The x coordinate * @param y The y coordinate */ public boolean contains (double x, double y) { double mx = getX (); double mw = getWidth (); if (x < mx || x >= mx + mw) return false; double my = getY (); double mh = getHeight (); if (y < my || y >= my + mh) return false; // Now check to see if the point is in range of an arc. double dy = Math.min (Math.abs (my - y), Math.abs (my + mh - y)); double dx = Math.min (Math.abs (mx - x), Math.abs (mx + mw - x)); double aw = getArcWidth (); double ah = getArcHeight (); if (dx > aw || dy > ah) return true; // At this point DX represents the distance from the nearest edge // of the rectangle. But we want to transform it to represent the // scaled distance from the center of the ellipse that forms the // arc. Hence this code: dy = (ah - dy) / ah; dx = (aw - dx) / aw; return dx * dx + dy * dy <= 1.0; } /** Return true if this object contains the specified rectangle * @param x The x coordinate * @param y The y coordinate * @param w The width * @param h The height */ public boolean contains (double x, double y, double w, double h) { // We have to check all four points here (for ordinary rectangles // we can just check opposing corners). return (contains (x, y) && contains (x + w, h) && contains (x, y + h) && contains (x + w, y + h)); } /** Return a new path iterator which iterates over this rectangle. * @param at An affine transform to apply to the object */ public PathIterator getPathIterator (AffineTransform at) { // FIXME. return null; } /** Return true if the given rectangle intersects this shape. * @param x The x coordinate * @param y The y coordinate * @param w The width * @param h The height */ public boolean intersects (double x, double y, double w, double h) { // Here we can use the same code we use for an ordinary rectangle. double mx = getX (); double mw = getWidth (); if (x < mx || x >= mx + mw || x + w < mx || x + w >= mx + mw) return false; double my = getY (); double mh = getHeight (); return y >= my && y < my + mh && y + h >= my && y + h < my + mh; } /** Set the boundary of this round rectangle. * @param x The x coordinate * @param y The y coordinate * @param w The width * @param h The height */ public void setFrame (double x, double y, double w, double h) { // This is a bit lame. setRoundRect (x, y, w, h, getArcWidth (), getArcHeight ()); } /** Set the values of this round rectangle to be the same as those * of the argument. * @param rr The round rectangle to copy */ public void setRoundRect (RoundRectangle2D rr) { setRoundRect (rr.getX (), rr.getY (), rr.getWidth (), rr.getHeight (), rr.getArcWidth (), rr.getArcHeight ()); } /** A subclass of RoundRectangle which keeps its parameters as * floats. */ public static class Float extends RoundRectangle2D { /** The height of the corner arc. */ public float archeight; /** The width of the corner arc. */ public float arcwidth; /** The x coordinate of this object. */ public float x; /** The y coordinate of this object. */ public float y; /** The width of this object. */ public float width; /** The height of this object. */ public float height; /** Construct a new instance, with all parameters set to 0. */ public Float () { this (0, 0, 0, 0, 0, 0); } /** Construct a new instance with the given arguments. * @param x The x coordinate * @param y The y coordinate * @param w The width * @param h The height * @param arcWidth The arc width * @param arcHeight The arc height */ public Float (float x, float y, float w, float h, float arcWidth, float arcHeight) { this.x = x; this.y = y; this.width = w; this.height = h; this.arcwidth = arcWidth; this.archeight = arcHeight; } public double getArcHeight () { return archeight; } public double getArcWidth () { return arcwidth; } public Rectangle2D getBounds2D () { return new Rectangle2D.Float (x, y, width, height); } public double getX () { return x; } public double getY () { return y; } public double getWidth () { return width; } public double getHeight () { return height; } public boolean isEmpty () { return width <= 0 || height <= 0; } public void setRoundRect (float x, float y, float w, float h, float arcWidth, float arcHeight) { this.x = x; this.y = y; this.width = w; this.height = h; this.arcwidth = arcWidth; this.archeight = arcHeight; } public void setRoundRect (double x, double y, double w, double h, double arcWidth, double arcHeight) { this.x = (float) x; this.y = (float) y; this.width = (float) w; this.height = (float) h; this.arcwidth = (float) arcWidth; this.archeight = (float) arcHeight; } } /** A subclass of RoundRectangle which keeps its parameters as * doubles. */ public static class Double extends RoundRectangle2D { /** The height of the corner arc. */ public double archeight; /** The width of the corner arc. */ public double arcwidth; /** The x coordinate of this object. */ public double x; /** The y coordinate of this object. */ public double y; /** The width of this object. */ public double width; /** The height of this object. */ public double height; /** Construct a new instance, with all parameters set to 0. */ public Double () { this (0, 0, 0, 0, 0, 0); } /** Construct a new instance with the given arguments. * @param x The x coordinate * @param y The y coordinate * @param w The width * @param h The height * @param arcWidth The arc width * @param arcHeight The arc height */ public Double (double x, double y, double w, double h, double arcWidth, double arcHeight) { this.x = x; this.y = y; this.width = w; this.height = h; this.arcwidth = arcWidth; this.archeight = arcHeight; } public double getArcHeight () { return archeight; } public double getArcWidth () { return arcwidth; } public Rectangle2D getBounds2D () { return new Rectangle2D.Double (x, y, width, height); } public double getX () { return x; } public double getY () { return y; } public double getWidth () { return width; } public double getHeight () { return height; } public boolean isEmpty () { return width <= 0 || height <= 0; } public void setRoundRect (double x, double y, double w, double h, double arcWidth, double arcHeight) { this.x = x; this.y = y; this.width = w; this.height = h; this.arcwidth = arcWidth; this.archeight = arcHeight; } } }