001: /**
002: * ===========================================
003: * JFreeReport : a free Java reporting library
004: * ===========================================
005: *
006: * Project Info: http://reporting.pentaho.org/
007: *
008: * (C) Copyright 2001-2007, by Object Refinery Ltd, Pentaho Corporation and Contributors.
009: *
010: * This library is free software; you can redistribute it and/or modify it under the terms
011: * of the GNU Lesser General Public License as published by the Free Software Foundation;
012: * either version 2.1 of the License, or (at your option) any later version.
013: *
014: * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
015: * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
016: * See the GNU Lesser General Public License for more details.
017: *
018: * You should have received a copy of the GNU Lesser General Public License along with this
019: * library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
020: * Boston, MA 02111-1307, USA.
021: *
022: * [Java is a trademark or registered trademark of Sun Microsystems, Inc.
023: * in the United States and other countries.]
024: *
025: * ------------
026: * StrictPoint.java
027: * ------------
028: * (C) Copyright 2001-2007, by Object Refinery Ltd, Pentaho Corporation and Contributors.
029: */package org.jfree.report.util.geom;
030:
031: import java.io.Serializable;
032:
033: /**
034: * A StrictPoint class represents a coordinate in the report layout. It
035: * is similiar to the {@link java.awt.geom.Point2D} class, but uses
036: * micro-points instead of doubles.
037: *
038: * @author Thomas Morgner
039: */
040: public class StrictPoint implements Serializable, Cloneable {
041: /** The x-Coordinate. */
042: private long x;
043: /** The y-coordinate. */
044: private long y;
045: /** A flag indicating whether this object is mutable. */
046: private boolean locked;
047:
048: /**
049: * DefaultConstructor.
050: */
051: public StrictPoint() {
052: }
053:
054: /**
055: * Creates a StrictBounds object with the given coordinates, width
056: * and height.
057: *
058: * @param x the x-coordinate
059: * @param y the y-coordinate
060: */
061: public StrictPoint(final long x, final long y) {
062: this .x = x;
063: this .y = y;
064: }
065:
066: /**
067: * Returns the X coordinate of this <code>StrictPoint</code> in micro points.
068: *
069: * @return the X coordinate of this <code>StrictPoint</code>.
070: */
071: public long getX() {
072: return x;
073: }
074:
075: /**
076: * Returns the Y coordinate of this <code>StrictPoint</code> in micro points.
077: *
078: * @return the Y coordinate of this <code>StrictPoint</code>.
079: */
080: public long getY() {
081: return y;
082: }
083:
084: /**
085: * Sets the location of this <code>StrictPoint</code> to the specified coordinates.
086: *
087: * @param x the coordinates of this <code>StrictPoint</code>
088: * @param y the coordinates of this <code>StrictPoint</code>
089: */
090: public void setLocation(final long x, final long y) {
091: if (locked) {
092: throw new IllegalStateException();
093: }
094:
095: this .x = x;
096: this .y = y;
097: }
098:
099: /**
100: * Checks, whether this point object is locked.
101: *
102: * @return true, if the point is locked and therefore immutable, false otherwise.
103: */
104: public boolean isLocked() {
105: return locked;
106: }
107:
108: /**
109: * Returns a copy of this bounds object which cannot be modified anymore.
110: *
111: * @return a locked copy.
112: */
113: public StrictPoint getLockedInstance() {
114: if (locked) {
115: return this ;
116: }
117:
118: final StrictPoint retval = (StrictPoint) clone();
119: retval.locked = true;
120: return retval;
121: }
122:
123: /**
124: * Returns a copy of this bounds object which can be modified later.
125: *
126: * @return an unlocked copy.
127: */
128: public StrictPoint getUnlockedInstance() {
129: final StrictPoint retval = (StrictPoint) clone();
130: retval.locked = false;
131: return retval;
132: }
133:
134: /**
135: * Returns a copy of this Point object. This method will never throw a
136: * 'CloneNotSupportedException'.
137: *
138: * @return the cloned instance.
139: */
140: public Object clone() {
141: try {
142: return super .clone();
143: } catch (CloneNotSupportedException e) {
144: throw new InternalError("Clone must always be supported.");
145: }
146: }
147:
148: /**
149: * Returns a string representation of these bounds.
150: *
151: * @return the string representing this object.
152: */
153: public String toString() {
154: return "org.jfree.report.util.geom.StrictPoint{" + "x=" + x
155: + ", y=" + y + '}';
156: }
157:
158: /**
159: * Checks, whether the given object is a StrictPoint instance sharing the same
160: * coordinates as this point.
161: *
162: * @param o the other object.
163: * @return true, if the other object is equal to this object, false otherwise.
164: */
165: public boolean equals(final Object o) {
166: if (this == o) {
167: return true;
168: }
169: if (o == null || getClass() != o.getClass()) {
170: return false;
171: }
172:
173: final StrictPoint that = (StrictPoint) o;
174:
175: if (x != that.x) {
176: return false;
177: }
178: if (y != that.y) {
179: return false;
180: }
181:
182: return true;
183: }
184:
185: /**
186: * Computes the hashcode for this point.
187: *
188: * @return the computed hashcode.
189: */
190: public int hashCode() {
191: int result = (int) (x ^ (x >>> 32));
192: result = 29 * result + (int) (y ^ (y >>> 32));
193: return result;
194: }
195: }
|