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: * StrictDimension.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 dimension object that uses micro-points as units of measurement.
035: *
036: * @author Thomas Morgner
037: */
038: public class StrictDimension implements Serializable, Cloneable {
039: /** The width. */
040: private long width;
041: /** The height. */
042: private long height;
043: /** A flag indicating whether this object is mutable. */
044: private boolean locked;
045:
046: /**
047: * Default-Constructor.
048: */
049: public StrictDimension() {
050: }
051:
052: /**
053: * Creates a new dimension object with the given width and height.
054: * The object is not locked.
055: *
056: * @param width the width.
057: * @param height the height.
058: */
059: public StrictDimension(final long width, final long height) {
060: this .width = width;
061: this .height = height;
062: }
063:
064: /**
065: * Checks, whether this instance is locked.
066: *
067: * @return true, if the dimension object is locked, false otherwise.
068: */
069: public boolean isLocked() {
070: return locked;
071: }
072:
073: /**
074: * Returns a copy of this dimension which cannot be modified anymore.
075: *
076: * @return a locked copy.
077: */
078: public StrictDimension getLockedInstance() {
079: if (locked) {
080: return this ;
081: }
082:
083: final StrictDimension retval = (StrictDimension) clone();
084: retval.locked = true;
085: return retval;
086: }
087:
088: /**
089: * Returns a copy of this dimension which can be modified later.
090: *
091: * @return an unlocked copy.
092: */
093: public StrictDimension getUnlockedInstance() {
094: final StrictDimension retval = (StrictDimension) clone();
095: retval.locked = false;
096: return retval;
097: }
098:
099: /**
100: * Sets the size of this <code>Dimension</code> object to the specified width and
101: * height.
102: *
103: * @param width the new width for the <code>Dimension</code> object
104: * @param height the new height for the <code>Dimension</code> object
105: * @throws IllegalStateException if the dimension object is locked
106: */
107: public void setSize(final long width, final long height) {
108: if (locked) {
109: throw new IllegalStateException("This object is locked");
110: }
111:
112: this .width = width;
113: this .height = height;
114: }
115:
116: /**
117: * Returns the height of this dimension object.
118: *
119: * @return the height.
120: */
121: public long getHeight() {
122: return height;
123: }
124:
125: /**
126: * Updates the height of this dimension object.
127: *
128: * @param height the new height, given in micro-points.
129: */
130: public void setHeight(final long height) {
131: if (locked) {
132: throw new IllegalStateException("This object is locked");
133: }
134: this .height = height;
135: }
136:
137: /**
138: * Returns the width of this dimension object.
139: *
140: * @return the width.
141: */
142: public long getWidth() {
143: return width;
144: }
145:
146: /**
147: * Updates the width of this dimension object.
148: *
149: * @param width the new width, given in micro-points.
150: */
151: public void setWidth(final long width) {
152: if (locked) {
153: throw new IllegalStateException("This object is locked");
154: }
155: this .width = width;
156: }
157:
158: /**
159: * Creates a copy of this object. This method is guaranteed to never throw
160: * a CloneNotSupportedException.
161: *
162: * @return the cloned copy.
163: */
164: public Object clone() {
165: try {
166: return super .clone();
167: } catch (CloneNotSupportedException e) {
168: throw new InternalError("Clone must always be supported.");
169: }
170: }
171:
172: /**
173: * Returns a String representation of this dimension object.
174: *
175: * @return a string describing the object.
176: */
177: public String toString() {
178: return "org.jfree.report.util.geom.StrictDimension{" + "width="
179: + width + ", height=" + height + '}';
180: }
181:
182: /**
183: * Checks, whether the given object is a StrictDimension instance convering the
184: * same area as this dimension.
185: *
186: * @param o the other object.
187: * @return true, if the other object is equal to this object, false otherwise.
188: */
189: public boolean equals(final Object o) {
190: if (this == o) {
191: return true;
192: }
193: if (o == null || getClass() != o.getClass()) {
194: return false;
195: }
196:
197: final StrictDimension that = (StrictDimension) o;
198:
199: if (height != that.height) {
200: return false;
201: }
202: if (width != that.width) {
203: return false;
204: }
205:
206: return true;
207: }
208:
209: /**
210: * Computes the hashcode for this dimension.
211: *
212: * @return the computed hashcode.
213: */
214: public int hashCode() {
215: int result = (int) (width ^ (width >>> 32));
216: result = 29 * result + (int) (height ^ (height >>> 32));
217: return result;
218: }
219: }
|