001 /* Box.java --
002 Copyright (C) 2002, 2004 Free Software Foundation, Inc.
003
004 This file is part of GNU Classpath.
005
006 GNU Classpath is free software; you can redistribute it and/or modify
007 it under the terms of the GNU General Public License as published by
008 the Free Software Foundation; either version 2, or (at your option)
009 any later version.
010
011 GNU Classpath is distributed in the hope that it will be useful, but
012 WITHOUT ANY WARRANTY; without even the implied warranty of
013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014 General Public License for more details.
015
016 You should have received a copy of the GNU General Public License
017 along with GNU Classpath; see the file COPYING. If not, write to the
018 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
019 02110-1301 USA.
020
021 Linking this library statically or dynamically with other modules is
022 making a combined work based on this library. Thus, the terms and
023 conditions of the GNU General Public License cover the whole
024 combination.
025
026 As a special exception, the copyright holders of this library give you
027 permission to link this library with independent modules to produce an
028 executable, regardless of the license terms of these independent
029 modules, and to copy and distribute the resulting executable under
030 terms of your choice, provided that you also meet, for each linked
031 independent module, the terms and conditions of the license of that
032 module. An independent module is a module which is not derived from
033 or based on this library. If you modify this library, you may extend
034 this exception to your version of the library, but you are not
035 obligated to do so. If you do not wish to do so, delete this
036 exception statement from your version. */
037
038
039 package javax.swing;
040
041 import java.awt.AWTError;
042 import java.awt.Component;
043 import java.awt.Container;
044 import java.awt.Dimension;
045 import java.awt.LayoutManager;
046
047 import javax.accessibility.Accessible;
048 import javax.accessibility.AccessibleContext;
049 import javax.accessibility.AccessibleRole;
050
051 /**
052 * A component that uses a {@link BoxLayout} as Layout Manager.
053 *
054 * In addition to that, this class provides a set of static methods for
055 * creating some filler components ('struts' and 'glue') for use in
056 * containers that are laid out using BoxLayout.
057 *
058 * @author Ronald Veldema (rveldema@cs.vu.nl)
059 */
060 public class Box extends JComponent implements Accessible
061 {
062 private static final long serialVersionUID = 1525417495883046342L;
063
064 /**
065 * Provides accessibility support for <code>Box</code>es.
066 */
067 protected class AccessibleBox extends Container.AccessibleAWTContainer
068 {
069 private static final long serialVersionUID = -7775079816389931944L;
070
071 protected AccessibleBox()
072 {
073 // Nothing to do here.
074 }
075
076 public AccessibleRole getAccessibleRole()
077 {
078 return null;
079 }
080 }
081
082 /**
083 * A component that servers as a filler in BoxLayout controlled containers.
084 */
085 public static class Filler extends JComponent implements Accessible
086 {
087 private static final long serialVersionUID = -1204263191910183998L;
088
089 /**
090 * Provides accessibility support for <code>Box.Filler</code>.
091 */
092 protected class AccessibleBoxFiller
093 extends Component.AccessibleAWTComponent
094 {
095 private static final long serialVersionUID = 164963348357479321L;
096
097 protected AccessibleBoxFiller()
098 {
099 // Nothing to do here.
100 }
101
102 public AccessibleRole getAccessibleRole()
103 {
104 return null;
105 }
106 }
107
108 private transient Dimension min, pref, max;
109
110 /**
111 * Creates a new instance of Filler.
112 *
113 * @param min the minimum size of the filler.
114 * @param pref the preferred size of the filler.
115 * @param max the maximum size of the filler.
116 */
117 public Filler(Dimension min, Dimension pref, Dimension max)
118 {
119 changeShape(min, pref, max);
120 }
121
122 /**
123 * Changes the dimensions of this Filler.
124 *
125 * @param min the new minimum size of the filler.
126 * @param pref the new preferred size of the filler.
127 * @param max the new maximum size of the filler.
128 */
129 public void changeShape(Dimension min, Dimension pref, Dimension max)
130 {
131 this.min = min;
132 this.pref = pref;
133 this.max = max;
134 }
135
136 public AccessibleContext getAccessibleContext()
137 {
138 if (accessibleContext == null)
139 accessibleContext = new AccessibleBoxFiller();
140 return accessibleContext;
141 }
142
143 /**
144 * Returns the maximum size of this Filler.
145 *
146 * @return the maximum size of this Filler.
147 */
148 public Dimension getMaximumSize()
149 {
150 return max;
151 }
152
153 /**
154 * Returns the minimum size of this Filler.
155 *
156 * @return the minimum size of this Filler.
157 */
158 public Dimension getMinimumSize()
159 {
160 return min;
161 }
162
163 /**
164 * Returns the preferred size of this Filler.
165 *
166 * @return the preferred size of this Filler.
167 */
168 public Dimension getPreferredSize()
169 {
170 return pref;
171 }
172 }
173
174 /**
175 * Creates a new Box component, that lays out its children according
176 * to the <code>axis</code> parameter.
177 *
178 * @param axis the orientation of the BoxLayout.
179 *
180 * @see BoxLayout#X_AXIS
181 * @see BoxLayout#Y_AXIS
182 * @see BoxLayout#LINE_AXIS
183 * @see BoxLayout#PAGE_AXIS
184 */
185 public Box(int axis)
186 {
187 super.setLayout(new BoxLayout(this, axis));
188 }
189
190 /**
191 * Creates a filler component which acts as glue between components.
192 * It does not take space unless some extra space is available. If extra
193 * space is available, this component can expand in both X and Y directions.
194 *
195 * @return a glue-like filler component.
196 */
197 public static Component createGlue()
198 {
199 Filler glue = new Filler(new Dimension(0, 0), new Dimension(0, 0),
200 new Dimension(Short.MAX_VALUE, Short.MAX_VALUE));
201 return glue;
202 }
203
204 public static Box createHorizontalBox()
205 {
206 return new Box(BoxLayout.X_AXIS);
207 }
208
209 /**
210 * Creates a filler component which acts as glue between components.
211 * It does not take space unless some extra space is available. If extra
212 * space is available, this component can expand in the X direction.
213 *
214 * @return a glue-like filler component.
215 */
216 public static Component createHorizontalGlue()
217 {
218 Filler glue = new Filler(new Dimension(0, 0), new Dimension(0, 0),
219 new Dimension(Short.MAX_VALUE, 0));
220 return glue;
221 }
222
223 /**
224 * Creates a filler component which acts as strut between components.
225 * It will fill exactly the specified horizontal size.
226 *
227 * @param width the width of this strut in pixels.
228 *
229 * @return a strut-like filler component.
230 */
231 public static Component createHorizontalStrut(int width)
232 {
233 Filler strut = new Filler(new Dimension(width, 0),
234 new Dimension(width, 0),
235 new Dimension(width, Integer.MAX_VALUE));
236 return strut;
237 }
238
239 public static Component createRigidArea(Dimension d)
240 {
241 return new Filler(d, d, d);
242 }
243
244 public static Box createVerticalBox()
245 {
246 return new Box(BoxLayout.Y_AXIS);
247 }
248
249 /**
250 * Creates a filler component which acts as glue between components.
251 * It does not take space unless some extra space is available. If extra
252 * space is available, this component can expand in the Y direction.
253 *
254 * @return a glue-like filler component.
255 */
256 public static Component createVerticalGlue()
257 {
258 return createGlue();
259 }
260
261 /**
262 * Creates a filler component which acts as strut between components.
263 * It will fill exactly the specified vertical size.
264 *
265 * @param height the height of this strut in pixels.
266 *
267 * @return a strut-like filler component.
268 */
269 public static Component createVerticalStrut(int height)
270 {
271 Filler strut = new Filler(new Dimension(0, height),
272 new Dimension(0, height),
273 new Dimension(Integer.MAX_VALUE, height));
274 return strut;
275 }
276
277 public void setLayout(LayoutManager l)
278 {
279 throw new AWTError("Not allowed to set layout managers for boxes.");
280 }
281
282 public AccessibleContext getAccessibleContext()
283 {
284 if (accessibleContext == null)
285 accessibleContext = new AccessibleBox();
286 return accessibleContext;
287 }
288
289
290 }