001: /*
002: * Copyright (c) 2002-2004 JGoodies Karsten Lentzsch. All Rights Reserved.
003: *
004: * Redistribution and use in source and binary forms, with or without
005: * modification, are permitted provided that the following conditions are met:
006: *
007: * o Redistributions of source code must retain the above copyright notice,
008: * this list of conditions and the following disclaimer.
009: *
010: * o Redistributions in binary form must reproduce the above copyright notice,
011: * this list of conditions and the following disclaimer in the documentation
012: * and/or other materials provided with the distribution.
013: *
014: * o Neither the name of JGoodies Karsten Lentzsch nor the names of
015: * its contributors may be used to endorse or promote products derived
016: * from this software without specific prior written permission.
017: *
018: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
019: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
020: * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
021: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
022: * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
023: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
024: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
025: * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
026: * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
027: * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
028: * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
029: */
030:
031: package com.jgoodies.forms.layout;
032:
033: import java.awt.Container;
034: import java.io.Serializable;
035: import java.util.List;
036:
037: /**
038: * Describes sizes that provide lower and upper bounds as used by the JGoodies
039: * {@link com.jgoodies.forms.layout.FormLayout}.
040: *
041: * @author Karsten Lentzsch
042: * @version $Revision: 1.2 $
043: *
044: * @see Sizes
045: * @see ConstantSize
046: * @see Sizes.ComponentSize
047: */
048:
049: final class BoundedSize implements Size, Serializable {
050:
051: /**
052: * Holds the base size.
053: */
054: private final Size basis;
055:
056: /**
057: * Holds an optional lower bound.
058: */
059: private Size lowerBound;
060:
061: /**
062: * Holds an optional upper bound.
063: */
064: private Size upperBound;
065:
066: // Instance Creation ****************************************************
067:
068: /**
069: * Constructs a <code>BoundedSize</code> for the given basis using the
070: * specified lower and upper bounds.
071: *
072: * @param basis
073: * the base size
074: * @param lowerBound
075: * the lower bound size
076: * @param upperBound
077: * the upper bound size
078: * @throws NullPointerException
079: * if the basis is null
080: */
081: BoundedSize(Size basis, Size lowerBound, Size upperBound) {
082: if (basis == null)
083: throw new NullPointerException(
084: "The basis of a bounded size must not be null.");
085: this .basis = basis;
086: this .lowerBound = lowerBound;
087: this .upperBound = upperBound;
088: }
089:
090: // Implementation of the Size Interface *********************************
091:
092: /**
093: * Returns this size as pixel size. Neither requires the component list nor
094: * the specified measures. Honors the lower and upper bound.
095: * <p>
096: *
097: * Invoked by <code>FormSpec</code> to determine the size of a column or
098: * row.
099: *
100: * @param container
101: * the layout container
102: * @param components
103: * the list of components to measure
104: * @param minMeasure
105: * the measure used to determine the minimum size
106: * @param prefMeasure
107: * the measure used to determine the preferred size
108: * @param defaultMeasure
109: * the measure used to determine the default size
110: * @return the maximum size in pixels
111: * @see FormSpec#maximumSize(Container, List, FormLayout.Measure,
112: * FormLayout.Measure, FormLayout.Measure)
113: */
114: public int maximumSize(Container container, List components,
115: FormLayout.Measure minMeasure,
116: FormLayout.Measure prefMeasure,
117: FormLayout.Measure defaultMeasure) {
118: int size = basis.maximumSize(container, components, minMeasure,
119: prefMeasure, defaultMeasure);
120: if (lowerBound != null) {
121: size = Math.max(size, lowerBound
122: .maximumSize(container, components, minMeasure,
123: prefMeasure, defaultMeasure));
124: }
125: if (upperBound != null) {
126: size = Math.min(size, upperBound
127: .maximumSize(container, components, minMeasure,
128: prefMeasure, defaultMeasure));
129: }
130: return size;
131: }
132:
133: // Overriding Object Behavior *******************************************
134:
135: /**
136: * Indicates whether some other BoundedSize is "equal to" this one.
137: *
138: * @param object
139: * the object with which to compare
140: * @return <code>true</code> if this object is the same as the object
141: * argument, <code>false</code> otherwise.
142: * @see Object#hashCode()
143: * @see java.util.Hashtable
144: */
145: public boolean equals(Object object) {
146: if (this == object)
147: return true;
148: if (!(object instanceof BoundedSize))
149: return false;
150: BoundedSize size = (BoundedSize) object;
151: return basis.equals(size.basis)
152: && ((lowerBound == null && size.lowerBound == null) || (lowerBound != null && lowerBound
153: .equals(size.lowerBound)))
154: && ((upperBound == null && size.upperBound == null) || (upperBound != null && upperBound
155: .equals(size.upperBound)));
156: }
157:
158: /**
159: * Returns a hash code value for the object. This method is supported for
160: * the benefit of hashtables such as those provided by
161: * <code>java.util.Hashtable</code>.
162: *
163: * @return a hash code value for this object.
164: * @see Object#equals(Object)
165: * @see java.util.Hashtable
166: */
167: public int hashCode() {
168: int hashValue = basis.hashCode();
169: if (lowerBound != null) {
170: hashValue = hashValue * 37 + lowerBound.hashCode();
171: }
172: if (upperBound != null) {
173: hashValue = hashValue * 37 + upperBound.hashCode();
174: }
175: return hashValue;
176: }
177:
178: /**
179: * Returns a string representation of this size object.
180: *
181: * <strong>Note:</strong> The string representation may change at any time.
182: * It is strongly recommended to not use this string for parsing purposes.
183: *
184: * @return a string representation of the constant size
185: */
186: public String toString() {
187: if (lowerBound != null) {
188: if (upperBound == null) {
189: return "max(" + basis + ';' + lowerBound + ')';
190: } else {
191: return "max(" + basis + ';' + "min(" + lowerBound + ';'
192: + upperBound + "))";
193: }
194: } else if (upperBound != null) {
195: return "min(" + basis + ';' + upperBound + ')';
196: } else {
197: return "bounded(" + basis + ')';
198: }
199: }
200:
201: }
|