001/* Box.java --
002   Copyright (C) 2002, 2004 Free Software Foundation, Inc.
003
004This file is part of GNU Classpath.
005
006GNU Classpath is free software; you can redistribute it and/or modify
007it under the terms of the GNU General Public License as published by
008the Free Software Foundation; either version 2, or (at your option)
009any later version.
010
011GNU Classpath is distributed in the hope that it will be useful, but
012WITHOUT ANY WARRANTY; without even the implied warranty of
013MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
014General Public License for more details.
015
016You should have received a copy of the GNU General Public License
017along with GNU Classpath; see the file COPYING.  If not, write to the
018Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
01902110-1301 USA.
020
021Linking this library statically or dynamically with other modules is
022making a combined work based on this library.  Thus, the terms and
023conditions of the GNU General Public License cover the whole
024combination.
025
026As a special exception, the copyright holders of this library give you
027permission to link this library with independent modules to produce an
028executable, regardless of the license terms of these independent
029modules, and to copy and distribute the resulting executable under
030terms of your choice, provided that you also meet, for each linked
031independent module, the terms and conditions of the license of that
032module.  An independent module is a module which is not derived from
033or based on this library.  If you modify this library, you may extend
034this exception to your version of the library, but you are not
035obligated to do so.  If you do not wish to do so, delete this
036exception statement from your version. */
037
038
039package javax.swing;
040
041import java.awt.AWTError;
042import java.awt.Component;
043import java.awt.Container;
044import java.awt.Dimension;
045import java.awt.LayoutManager;
046
047import javax.accessibility.Accessible;
048import javax.accessibility.AccessibleContext;
049import 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 */
060public 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}