/* * @(#)Insets2D.java * * Copyright (c) 1996-2010 The authors and contributors of JHotDraw. * You may not use, copy or modify this file, except in compliance with the * accompanying license terms. */ package org.jhotdraw.geom; import java.awt.Insets; import java.awt.geom.*; import java.io.Serializable; /** * Insets2D. * * @author Werner Randelshofer * @version $Id$ * expectations of people used to the java.awt.geom.xxx2D.Double/xxx2D.Float * idioms. */ public abstract class Insets2D implements Cloneable, Serializable { private static final long serialVersionUID = 1L; /** Creates a new instance. */ protected Insets2D() { } /** * Returns the top insets in double precision. * @return the top insets of this <code>Insets2D</code>. */ public abstract double getTop(); /** * Returns the left insets in double precision. * @return the left insets of this <code>Insets2D</code>. */ public abstract double getLeft(); /** * Returns the bottom insets in double precision. * @return the bottom insets of this <code>Insets2D</code>. */ public abstract double getBottom(); /** * Returns the right insets in double precision. * @return the right insets of this <code>Insets2D</code>. */ public abstract double getRight(); /** * Sets the insets. * * @param top The top insets. * @param left The left insets. * @param bottom The bottom insets. * @param right The right insets. */ public abstract void set(double top, double left, double bottom, double right); /** * Sets the insets. * * @param i The new insets. */ public void set(Insets2D i) { set(i.getTop(), i.getLeft(), i.getBottom(), i.getRight()); } /** * Adds the specified insets to the current insets. * * @param top The top insets. * @param left The left insets. * @param bottom The bottom insets. * @param right The right insets. */ public void add(double top, double left, double bottom, double right) { set( getTop() + top, getLeft() + left, getBottom() + bottom, getRight() + right ); } /** * Adds the specified insets to the current insets. * * @param i The insets to be added. */ public void add(Insets2D i) { set( getTop() + i.getTop(), getLeft() + i.getLeft(), getBottom() + i.getBottom(), getRight() + i.getRight() ); } /** * Adds the current insets to the specified Rectangle2D making the * rectangle larger. * * @param r The Rectangle2D. */ public void addTo(Rectangle2D r) { r.setRect( r.getX() - getLeft(), r.getY() - getTop(), r.getWidth() + getLeft() + getRight(), r.getHeight() + getTop() + getBottom() ); } /** * Subtracts the specified insets from the current insets. * * @param top The top insets. * @param left The left insets. * @param bottom The bottom insets. * @param right The right insets. */ public void subtract(double top, double left, double bottom, double right) { set( getTop() - top, getLeft() - left, getBottom() - bottom, getRight() - right ); } /** * Subtracts the specified insets from the current insets. * * @param i The insets to be subtracted. */ public void subtract(Insets2D i) { set( getTop() - i.getTop(), getLeft() - i.getLeft(), getBottom() - i.getBottom(), getRight() - i.getRight() ); } /** * Subtracts the current insets to the specified Rectangle2D making the * rectangle smaller. * * @param r The Rectangle2D. */ public void subtractTo(Rectangle2D r) { r.setRect( r.getX() + getLeft(), r.getY() + getTop(), r.getWidth() - getLeft() - getRight(), r.getHeight() - getTop() - getBottom() ); } /** * Checks whether two insets objects are equal. Two instances * of <code>Insets2DDouble</code> are equal if the four integer values * of the fields <code>top</code>, <code>left</code>, * <code>bottom</code>, and <code>right</code> are all equal. * @return <code>true</code> if the two insets are equal; * otherwise <code>false</code>. * @since JDK1.1 */ @Override public boolean equals(Object obj) { if (obj instanceof Insets2D) { Insets2D that = (Insets2D)obj; return ((getTop() == that.getTop()) && (getLeft() == that.getLeft()) && (getBottom() == that.getBottom()) && (getRight() == that.getRight())); } return false; } /** * Returns the hash code for this Insets2DDouble. * * @return a hash code for this Insets2DDouble. */ @Override public int hashCode() { double sum1 = getLeft() + getBottom(); double sum2 = getRight() + getTop(); double val1 = sum1 * (sum1 + 1)/2 + getLeft(); double val2 = sum2 * (sum2 + 1)/2 + getTop(); double sum3 = val1 + val2; return java.lang.Float.floatToIntBits((float) (sum3 * (sum3 + 1)/2 + val2)); } /** * Creates a new object of the same class as this object. */ @Override public Object clone() { try { return super.clone(); } catch (CloneNotSupportedException e) { // this shouldn't happen, since we are Cloneable throw new InternalError(); } } /** * Returns a string representation of this <code>Insets</code> object. * This method is intended to be used only for debugging purposes, and * the content and format of the returned string may vary between * implementations. The returned string may be empty but may not be * <code>null</code>. * * @return a string representation of this <code>Insets</code> object. */ @Override public String toString() { return getClass().getName().substring(getClass().getName().lastIndexOf('.')+1) + "[top=" + getTop() + ",left=" + getLeft() + ",bottom=" + getBottom() + ",right=" + getRight() + "]"; } /** * The <code>Float</code> class defines insets specified in * <code>float</code> precision. */ public static class Float extends Insets2D { private static final long serialVersionUID=1L; public float top; public float left; public float bottom; public float right; /** * Constructs and initializes an <code>Insets2D</code> with * all insets set to 0. */ public Float() { } /** * Constructs and initializes an <code>Insets2D</code> with the * specified insets. * * @param top The top insets. * @param left The left insets. * @param bottom The bottom insets. * @param right The right insets. */ public Float(float top, float left, float bottom, float right) { this.top = top; this.left = left; this.bottom = bottom; this.right = right; } @Override public double getTop() { return top; } @Override public double getLeft() { return left; } @Override public double getBottom() { return bottom; } @Override public double getRight() { return right; } @Override public void set(double top, double left, double bottom, double right) { this.top = (float) top; this.left = (float) left; this.bottom = (float) bottom; this.right = (float) right; } public void set(float top, float left, float bottom, float right) { this.top = top; this.left = left; this.bottom = bottom; this.right = right; } } /** * The <code>Double</code> class defines insets specified in * <code>double</code> precision. */ public static class Double extends Insets2D { private static final long serialVersionUID=1L; public double top; public double left; public double bottom; public double right; /** * Constructs and initializes an <code>Insets2D</code> with * all insets set to 0. */ public Double() { } /** * Constructs and initializes an <code>Insets2D</code> with the * specified insets. * * @param top The top insets. * @param left The left insets. * @param bottom The bottom insets. * @param right The right insets. */ public Double(double top, double left, double bottom, double right) { this.top = top; this.left = left; this.bottom = bottom; this.right = right; } @Override public double getTop() { return top; } @Override public double getLeft() { return left; } @Override public double getBottom() { return bottom; } @Override public double getRight() { return right; } @Override public void set(double top, double left, double bottom, double right) { this.top = top; this.left = left; this.bottom = bottom; this.right = right; } } }