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}