1:
46:
47: package ;
48:
49: import ;
50: import ;
51:
52: import ;
53: import ;
54:
55:
58: public class AxisSpace implements Cloneable, PublicCloneable, Serializable {
59:
60:
61: private static final long serialVersionUID = -2490732595134766305L;
62:
63:
64: private double top;
65:
66:
67: private double bottom;
68:
69:
70: private double left;
71:
72:
73: private double right;
74:
75:
78: public AxisSpace() {
79: this.top = 0.0;
80: this.bottom = 0.0;
81: this.left = 0.0;
82: this.right = 0.0;
83: }
84:
85:
90: public double getTop() {
91: return this.top;
92: }
93:
94:
99: public void setTop(double space) {
100: this.top = space;
101: }
102:
103:
108: public double getBottom() {
109: return this.bottom;
110: }
111:
112:
117: public void setBottom(double space) {
118: this.bottom = space;
119: }
120:
121:
126: public double getLeft() {
127: return this.left;
128: }
129:
130:
135: public void setLeft(double space) {
136: this.left = space;
137: }
138:
139:
144: public double getRight() {
145: return this.right;
146: }
147:
148:
153: public void setRight(double space) {
154: this.right = space;
155: }
156:
157:
163: public void add(double space, RectangleEdge edge) {
164: if (edge == null) {
165: throw new IllegalArgumentException("Null 'edge' argument.");
166: }
167: if (edge == RectangleEdge.TOP) {
168: this.top += space;
169: }
170: else if (edge == RectangleEdge.BOTTOM) {
171: this.bottom += space;
172: }
173: else if (edge == RectangleEdge.LEFT) {
174: this.left += space;
175: }
176: else if (edge == RectangleEdge.RIGHT) {
177: this.right += space;
178: }
179: else {
180: throw new IllegalStateException("Unrecognised 'edge' argument.");
181: }
182: }
183:
184:
189: public void ensureAtLeast(AxisSpace space) {
190: this.top = Math.max(this.top, space.top);
191: this.bottom = Math.max(this.bottom, space.bottom);
192: this.left = Math.max(this.left, space.left);
193: this.right = Math.max(this.right, space.right);
194: }
195:
196:
203: public void ensureAtLeast(double space, RectangleEdge edge) {
204: if (edge == RectangleEdge.TOP) {
205: if (this.top < space) {
206: this.top = space;
207: }
208: }
209: else if (edge == RectangleEdge.BOTTOM) {
210: if (this.bottom < space) {
211: this.bottom = space;
212: }
213: }
214: else if (edge == RectangleEdge.LEFT) {
215: if (this.left < space) {
216: this.left = space;
217: }
218: }
219: else if (edge == RectangleEdge.RIGHT) {
220: if (this.right < space) {
221: this.right = space;
222: }
223: }
224: else {
225: throw new IllegalStateException(
226: "AxisSpace.ensureAtLeast(): unrecognised AxisLocation."
227: );
228: }
229: }
230:
231:
239: public Rectangle2D shrink(Rectangle2D area, Rectangle2D result) {
240: if (result == null) {
241: result = new Rectangle2D.Double();
242: }
243: result.setRect(
244: area.getX() + this.left,
245: area.getY() + this.top,
246: area.getWidth() - this.left - this.right,
247: area.getHeight() - this.top - this.bottom
248: );
249: return result;
250: }
251:
252:
260: public Rectangle2D expand(Rectangle2D area, Rectangle2D result) {
261: if (result == null) {
262: result = new Rectangle2D.Double();
263: }
264: result.setRect(
265: area.getX() - this.left,
266: area.getY() - this.top,
267: area.getWidth() + this.left + this.right,
268: area.getHeight() + this.top + this.bottom
269: );
270: return result;
271: }
272:
273:
281: public Rectangle2D reserved(Rectangle2D area, RectangleEdge edge) {
282: Rectangle2D result = null;
283: if (edge == RectangleEdge.TOP) {
284: result = new Rectangle2D.Double(
285: area.getX(), area.getY(), area.getWidth(), this.top
286: );
287: }
288: else if (edge == RectangleEdge.BOTTOM) {
289: result = new Rectangle2D.Double(
290: area.getX(), area.getMaxY() - this.top,
291: area.getWidth(), this.bottom
292: );
293: }
294: else if (edge == RectangleEdge.LEFT) {
295: result = new Rectangle2D.Double(
296: area.getX(), area.getY(), this.left, area.getHeight()
297: );
298: }
299: else if (edge == RectangleEdge.RIGHT) {
300: result = new Rectangle2D.Double(
301: area.getMaxX() - this.right, area.getY(),
302: this.right, area.getHeight()
303: );
304: }
305: return result;
306: }
307:
308:
316: public Object clone() throws CloneNotSupportedException {
317: return super.clone();
318: }
319:
320:
327: public boolean equals(Object obj) {
328: if (obj == this) {
329: return true;
330: }
331: if (!(obj instanceof AxisSpace)) {
332: return false;
333: }
334: AxisSpace that = (AxisSpace) obj;
335: if (this.top != that.top) {
336: return false;
337: }
338: if (this.bottom != that.bottom) {
339: return false;
340: }
341: if (this.left != that.left) {
342: return false;
343: }
344: if (this.right != that.right) {
345: return false;
346: }
347: return true;
348: }
349:
350:
355: public int hashCode() {
356: int result = 23;
357: long l = Double.doubleToLongBits(this.top);
358: result = 37 * result + (int) (l ^ (l >>> 32));
359: l = Double.doubleToLongBits(this.bottom);
360: result = 37 * result + (int) (l ^ (l >>> 32));
361: l = Double.doubleToLongBits(this.left);
362: result = 37 * result + (int) (l ^ (l >>> 32));
363: l = Double.doubleToLongBits(this.right);
364: result = 37 * result + (int) (l ^ (l >>> 32));
365: return result;
366: }
367:
368:
373: public String toString() {
374: return super.toString() + "[left=" + this.left + ",right=" + this.right
375: + ",top=" + this.top + ",bottom=" + this.bottom + "]";
376: }
377:
378: }