0N/A/*
2362N/A * Copyright (c) 1995, 2006, Oracle and/or its affiliates. All rights reserved.
0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0N/A *
0N/A * This code is free software; you can redistribute it and/or modify it
0N/A * under the terms of the GNU General Public License version 2 only, as
2362N/A * published by the Free Software Foundation. Oracle designates this
0N/A * particular file as subject to the "Classpath" exception as provided
2362N/A * by Oracle in the LICENSE file that accompanied this code.
0N/A *
0N/A * This code is distributed in the hope that it will be useful, but WITHOUT
0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0N/A * version 2 for more details (a copy is included in the LICENSE file that
0N/A * accompanied this code).
0N/A *
0N/A * You should have received a copy of the GNU General Public License version
0N/A * 2 along with this work; if not, write to the Free Software Foundation,
0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0N/A *
2362N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2362N/A * or visit www.oracle.com if you need additional information or have any
2362N/A * questions.
0N/A */
0N/A
0N/Apackage java.awt;
0N/A
0N/Aimport java.util.Hashtable;
0N/A
0N/A/**
0N/A * A border layout lays out a container, arranging and resizing
0N/A * its components to fit in five regions:
0N/A * north, south, east, west, and center.
0N/A * Each region may contain no more than one component, and
0N/A * is identified by a corresponding constant:
0N/A * <code>NORTH</code>, <code>SOUTH</code>, <code>EAST</code>,
0N/A * <code>WEST</code>, and <code>CENTER</code>. When adding a
0N/A * component to a container with a border layout, use one of these
0N/A * five constants, for example:
0N/A * <pre>
0N/A * Panel p = new Panel();
0N/A * p.setLayout(new BorderLayout());
0N/A * p.add(new Button("Okay"), BorderLayout.SOUTH);
0N/A * </pre>
0N/A * As a convenience, <code>BorderLayout</code> interprets the
0N/A * absence of a string specification the same as the constant
0N/A * <code>CENTER</code>:
0N/A * <pre>
0N/A * Panel p2 = new Panel();
0N/A * p2.setLayout(new BorderLayout());
0N/A * p2.add(new TextArea()); // Same as p.add(new TextArea(), BorderLayout.CENTER);
0N/A * </pre>
0N/A * <p>
0N/A * In addition, <code>BorderLayout</code> supports the relative
0N/A * positioning constants, <code>PAGE_START</code>, <code>PAGE_END</code>,
0N/A * <code>LINE_START</code>, and <code>LINE_END</code>.
0N/A * In a container whose <code>ComponentOrientation</code> is set to
0N/A * <code>ComponentOrientation.LEFT_TO_RIGHT</code>, these constants map to
0N/A * <code>NORTH</code>, <code>SOUTH</code>, <code>WEST</code>, and
0N/A * <code>EAST</code>, respectively.
0N/A * <p>
0N/A * For compatibility with previous releases, <code>BorderLayout</code>
0N/A * also includes the relative positioning constants <code>BEFORE_FIRST_LINE</code>,
0N/A * <code>AFTER_LAST_LINE</code>, <code>BEFORE_LINE_BEGINS</code> and
0N/A * <code>AFTER_LINE_ENDS</code>. These are equivalent to
0N/A * <code>PAGE_START</code>, <code>PAGE_END</code>, <code>LINE_START</code>
0N/A * and <code>LINE_END</code> respectively. For
0N/A * consistency with the relative positioning constants used by other
0N/A * components, the latter constants are preferred.
0N/A * <p>
0N/A * Mixing both absolute and relative positioning constants can lead to
0N/A * unpredicable results. If
0N/A * you use both types, the relative constants will take precedence.
0N/A * For example, if you add components using both the <code>NORTH</code>
0N/A * and <code>PAGE_START</code> constants in a container whose
0N/A * orientation is <code>LEFT_TO_RIGHT</code>, only the
0N/A * <code>PAGE_START</code> will be layed out.
0N/A * <p>
0N/A * NOTE: Currently (in the Java 2 platform v1.2),
0N/A * <code>BorderLayout</code> does not support vertical
0N/A * orientations. The <code>isVertical</code> setting on the container's
0N/A * <code>ComponentOrientation</code> is not respected.
0N/A * <p>
0N/A * The components are laid out according to their
0N/A * preferred sizes and the constraints of the container's size.
0N/A * The <code>NORTH</code> and <code>SOUTH</code> components may
0N/A * be stretched horizontally; the <code>EAST</code> and
0N/A * <code>WEST</code> components may be stretched vertically;
0N/A * the <code>CENTER</code> component may stretch both horizontally
0N/A * and vertically to fill any space left over.
0N/A * <p>
0N/A * Here is an example of five buttons in an applet laid out using
0N/A * the <code>BorderLayout</code> layout manager:
0N/A * <p>
0N/A * <img src="doc-files/BorderLayout-1.gif"
0N/A * alt="Diagram of an applet demonstrating BorderLayout.
0N/A * Each section of the BorderLayout contains a Button corresponding to its position in the layout, one of:
0N/A * North, West, Center, East, or South."
0N/A * ALIGN=center HSPACE=10 VSPACE=7>
0N/A * <p>
0N/A * The code for this applet is as follows:
0N/A * <p>
0N/A * <hr><blockquote><pre>
0N/A * import java.awt.*;
0N/A * import java.applet.Applet;
0N/A *
0N/A * public class buttonDir extends Applet {
0N/A * public void init() {
0N/A * setLayout(new BorderLayout());
0N/A * add(new Button("North"), BorderLayout.NORTH);
0N/A * add(new Button("South"), BorderLayout.SOUTH);
0N/A * add(new Button("East"), BorderLayout.EAST);
0N/A * add(new Button("West"), BorderLayout.WEST);
0N/A * add(new Button("Center"), BorderLayout.CENTER);
0N/A * }
0N/A * }
0N/A * </pre></blockquote><hr>
0N/A * <p>
0N/A * @author Arthur van Hoff
0N/A * @see java.awt.Container#add(String, Component)
0N/A * @see java.awt.ComponentOrientation
0N/A * @since JDK1.0
0N/A */
0N/Apublic class BorderLayout implements LayoutManager2,
0N/A java.io.Serializable {
0N/A /**
0N/A * Constructs a border layout with the horizontal gaps
0N/A * between components.
0N/A * The horizontal gap is specified by <code>hgap</code>.
0N/A *
0N/A * @see #getHgap()
0N/A * @see #setHgap(int)
0N/A *
0N/A * @serial
0N/A */
0N/A int hgap;
0N/A
0N/A /**
0N/A * Constructs a border layout with the vertical gaps
0N/A * between components.
0N/A * The vertical gap is specified by <code>vgap</code>.
0N/A *
0N/A * @see #getVgap()
0N/A * @see #setVgap(int)
0N/A * @serial
0N/A */
0N/A int vgap;
0N/A
0N/A /**
0N/A * Constant to specify components location to be the
0N/A * north portion of the border layout.
0N/A * @serial
0N/A * @see #getChild(String, boolean)
0N/A * @see #addLayoutComponent
0N/A * @see #getLayoutAlignmentX
0N/A * @see #getLayoutAlignmentY
0N/A * @see #removeLayoutComponent
0N/A */
0N/A Component north;
0N/A /**
0N/A * Constant to specify components location to be the
0N/A * west portion of the border layout.
0N/A * @serial
0N/A * @see #getChild(String, boolean)
0N/A * @see #addLayoutComponent
0N/A * @see #getLayoutAlignmentX
0N/A * @see #getLayoutAlignmentY
0N/A * @see #removeLayoutComponent
0N/A */
0N/A Component west;
0N/A /**
0N/A * Constant to specify components location to be the
0N/A * east portion of the border layout.
0N/A * @serial
0N/A * @see #getChild(String, boolean)
0N/A * @see #addLayoutComponent
0N/A * @see #getLayoutAlignmentX
0N/A * @see #getLayoutAlignmentY
0N/A * @see #removeLayoutComponent
0N/A */
0N/A Component east;
0N/A /**
0N/A * Constant to specify components location to be the
0N/A * south portion of the border layout.
0N/A * @serial
0N/A * @see #getChild(String, boolean)
0N/A * @see #addLayoutComponent
0N/A * @see #getLayoutAlignmentX
0N/A * @see #getLayoutAlignmentY
0N/A * @see #removeLayoutComponent
0N/A */
0N/A Component south;
0N/A /**
0N/A * Constant to specify components location to be the
0N/A * center portion of the border layout.
0N/A * @serial
0N/A * @see #getChild(String, boolean)
0N/A * @see #addLayoutComponent
0N/A * @see #getLayoutAlignmentX
0N/A * @see #getLayoutAlignmentY
0N/A * @see #removeLayoutComponent
0N/A */
0N/A Component center;
0N/A
0N/A /**
0N/A *
0N/A * A relative positioning constant, that can be used instead of
0N/A * north, south, east, west or center.
0N/A * mixing the two types of constants can lead to unpredicable results. If
0N/A * you use both types, the relative constants will take precedence.
0N/A * For example, if you add components using both the <code>NORTH</code>
0N/A * and <code>BEFORE_FIRST_LINE</code> constants in a container whose
0N/A * orientation is <code>LEFT_TO_RIGHT</code>, only the
0N/A * <code>BEFORE_FIRST_LINE</code> will be layed out.
0N/A * This will be the same for lastLine, firstItem, lastItem.
0N/A * @serial
0N/A */
0N/A Component firstLine;
0N/A /**
0N/A * A relative positioning constant, that can be used instead of
0N/A * north, south, east, west or center.
0N/A * Please read Description for firstLine.
0N/A * @serial
0N/A */
0N/A Component lastLine;
0N/A /**
0N/A * A relative positioning constant, that can be used instead of
0N/A * north, south, east, west or center.
0N/A * Please read Description for firstLine.
0N/A * @serial
0N/A */
0N/A Component firstItem;
0N/A /**
0N/A * A relative positioning constant, that can be used instead of
0N/A * north, south, east, west or center.
0N/A * Please read Description for firstLine.
0N/A * @serial
0N/A */
0N/A Component lastItem;
0N/A
0N/A /**
0N/A * The north layout constraint (top of container).
0N/A */
0N/A public static final String NORTH = "North";
0N/A
0N/A /**
0N/A * The south layout constraint (bottom of container).
0N/A */
0N/A public static final String SOUTH = "South";
0N/A
0N/A /**
0N/A * The east layout constraint (right side of container).
0N/A */
0N/A public static final String EAST = "East";
0N/A
0N/A /**
0N/A * The west layout constraint (left side of container).
0N/A */
0N/A public static final String WEST = "West";
0N/A
0N/A /**
0N/A * The center layout constraint (middle of container).
0N/A */
0N/A public static final String CENTER = "Center";
0N/A
0N/A /**
0N/A * Synonym for PAGE_START. Exists for compatibility with previous
0N/A * versions. PAGE_START is preferred.
0N/A *
0N/A * @see #PAGE_START
0N/A * @since 1.2
0N/A */
0N/A public static final String BEFORE_FIRST_LINE = "First";
0N/A
0N/A /**
0N/A * Synonym for PAGE_END. Exists for compatibility with previous
0N/A * versions. PAGE_END is preferred.
0N/A *
0N/A * @see #PAGE_END
0N/A * @since 1.2
0N/A */
0N/A public static final String AFTER_LAST_LINE = "Last";
0N/A
0N/A /**
0N/A * Synonym for LINE_START. Exists for compatibility with previous
0N/A * versions. LINE_START is preferred.
0N/A *
0N/A * @see #LINE_START
0N/A * @since 1.2
0N/A */
0N/A public static final String BEFORE_LINE_BEGINS = "Before";
0N/A
0N/A /**
0N/A * Synonym for LINE_END. Exists for compatibility with previous
0N/A * versions. LINE_END is preferred.
0N/A *
0N/A * @see #LINE_END
0N/A * @since 1.2
0N/A */
0N/A public static final String AFTER_LINE_ENDS = "After";
0N/A
0N/A /**
0N/A * The component comes before the first line of the layout's content.
0N/A * For Western, left-to-right and top-to-bottom orientations, this is
0N/A * equivalent to NORTH.
0N/A *
0N/A * @see java.awt.Component#getComponentOrientation
0N/A * @since 1.4
0N/A */
0N/A public static final String PAGE_START = BEFORE_FIRST_LINE;
0N/A
0N/A /**
0N/A * The component comes after the last line of the layout's content.
0N/A * For Western, left-to-right and top-to-bottom orientations, this is
0N/A * equivalent to SOUTH.
0N/A *
0N/A * @see java.awt.Component#getComponentOrientation
0N/A * @since 1.4
0N/A */
0N/A public static final String PAGE_END = AFTER_LAST_LINE;
0N/A
0N/A /**
0N/A * The component goes at the beginning of the line direction for the
0N/A * layout. For Western, left-to-right and top-to-bottom orientations,
0N/A * this is equivalent to WEST.
0N/A *
0N/A * @see java.awt.Component#getComponentOrientation
0N/A * @since 1.4
0N/A */
0N/A public static final String LINE_START = BEFORE_LINE_BEGINS;
0N/A
0N/A /**
0N/A * The component goes at the end of the line direction for the
0N/A * layout. For Western, left-to-right and top-to-bottom orientations,
0N/A * this is equivalent to EAST.
0N/A *
0N/A * @see java.awt.Component#getComponentOrientation
0N/A * @since 1.4
0N/A */
0N/A public static final String LINE_END = AFTER_LINE_ENDS;
0N/A
0N/A /*
0N/A * JDK 1.1 serialVersionUID
0N/A */
0N/A private static final long serialVersionUID = -8658291919501921765L;
0N/A
0N/A /**
0N/A * Constructs a new border layout with
0N/A * no gaps between components.
0N/A */
0N/A public BorderLayout() {
0N/A this(0, 0);
0N/A }
0N/A
0N/A /**
0N/A * Constructs a border layout with the specified gaps
0N/A * between components.
0N/A * The horizontal gap is specified by <code>hgap</code>
0N/A * and the vertical gap is specified by <code>vgap</code>.
0N/A * @param hgap the horizontal gap.
0N/A * @param vgap the vertical gap.
0N/A */
0N/A public BorderLayout(int hgap, int vgap) {
0N/A this.hgap = hgap;
0N/A this.vgap = vgap;
0N/A }
0N/A
0N/A /**
0N/A * Returns the horizontal gap between components.
0N/A * @since JDK1.1
0N/A */
0N/A public int getHgap() {
0N/A return hgap;
0N/A }
0N/A
0N/A /**
0N/A * Sets the horizontal gap between components.
0N/A * @param hgap the horizontal gap between components
0N/A * @since JDK1.1
0N/A */
0N/A public void setHgap(int hgap) {
0N/A this.hgap = hgap;
0N/A }
0N/A
0N/A /**
0N/A * Returns the vertical gap between components.
0N/A * @since JDK1.1
0N/A */
0N/A public int getVgap() {
0N/A return vgap;
0N/A }
0N/A
0N/A /**
0N/A * Sets the vertical gap between components.
0N/A * @param vgap the vertical gap between components
0N/A * @since JDK1.1
0N/A */
0N/A public void setVgap(int vgap) {
0N/A this.vgap = vgap;
0N/A }
0N/A
0N/A /**
0N/A * Adds the specified component to the layout, using the specified
0N/A * constraint object. For border layouts, the constraint must be
0N/A * one of the following constants: <code>NORTH</code>,
0N/A * <code>SOUTH</code>, <code>EAST</code>,
0N/A * <code>WEST</code>, or <code>CENTER</code>.
0N/A * <p>
0N/A * Most applications do not call this method directly. This method
0N/A * is called when a component is added to a container using the
0N/A * <code>Container.add</code> method with the same argument types.
0N/A * @param comp the component to be added.
0N/A * @param constraints an object that specifies how and where
0N/A * the component is added to the layout.
0N/A * @see java.awt.Container#add(java.awt.Component, java.lang.Object)
0N/A * @exception IllegalArgumentException if the constraint object is not
0N/A * a string, or if it not one of the five specified
0N/A * constants.
0N/A * @since JDK1.1
0N/A */
0N/A public void addLayoutComponent(Component comp, Object constraints) {
0N/A synchronized (comp.getTreeLock()) {
0N/A if ((constraints == null) || (constraints instanceof String)) {
0N/A addLayoutComponent((String)constraints, comp);
0N/A } else {
0N/A throw new IllegalArgumentException("cannot add to layout: constraint must be a string (or null)");
0N/A }
0N/A }
0N/A }
0N/A
0N/A /**
0N/A * @deprecated replaced by <code>addLayoutComponent(Component, Object)</code>.
0N/A */
0N/A @Deprecated
0N/A public void addLayoutComponent(String name, Component comp) {
0N/A synchronized (comp.getTreeLock()) {
0N/A /* Special case: treat null the same as "Center". */
0N/A if (name == null) {
0N/A name = "Center";
0N/A }
0N/A
0N/A /* Assign the component to one of the known regions of the layout.
0N/A */
0N/A if ("Center".equals(name)) {
0N/A center = comp;
0N/A } else if ("North".equals(name)) {
0N/A north = comp;
0N/A } else if ("South".equals(name)) {
0N/A south = comp;
0N/A } else if ("East".equals(name)) {
0N/A east = comp;
0N/A } else if ("West".equals(name)) {
0N/A west = comp;
0N/A } else if (BEFORE_FIRST_LINE.equals(name)) {
0N/A firstLine = comp;
0N/A } else if (AFTER_LAST_LINE.equals(name)) {
0N/A lastLine = comp;
0N/A } else if (BEFORE_LINE_BEGINS.equals(name)) {
0N/A firstItem = comp;
0N/A } else if (AFTER_LINE_ENDS.equals(name)) {
0N/A lastItem = comp;
0N/A } else {
0N/A throw new IllegalArgumentException("cannot add to layout: unknown constraint: " + name);
0N/A }
0N/A }
0N/A }
0N/A
0N/A /**
0N/A * Removes the specified component from this border layout. This
0N/A * method is called when a container calls its <code>remove</code> or
0N/A * <code>removeAll</code> methods. Most applications do not call this
0N/A * method directly.
0N/A * @param comp the component to be removed.
0N/A * @see java.awt.Container#remove(java.awt.Component)
0N/A * @see java.awt.Container#removeAll()
0N/A */
0N/A public void removeLayoutComponent(Component comp) {
0N/A synchronized (comp.getTreeLock()) {
0N/A if (comp == center) {
0N/A center = null;
0N/A } else if (comp == north) {
0N/A north = null;
0N/A } else if (comp == south) {
0N/A south = null;
0N/A } else if (comp == east) {
0N/A east = null;
0N/A } else if (comp == west) {
0N/A west = null;
0N/A }
0N/A if (comp == firstLine) {
0N/A firstLine = null;
0N/A } else if (comp == lastLine) {
0N/A lastLine = null;
0N/A } else if (comp == firstItem) {
0N/A firstItem = null;
0N/A } else if (comp == lastItem) {
0N/A lastItem = null;
0N/A }
0N/A }
0N/A }
0N/A
0N/A /**
0N/A * Gets the component that was added using the given constraint
0N/A *
0N/A * @param constraints the desired constraint, one of <code>CENTER</code>,
0N/A * <code>NORTH</code>, <code>SOUTH</code>,
0N/A * <code>WEST</code>, <code>EAST</code>,
0N/A * <code>PAGE_START</code>, <code>PAGE_END</code>,
0N/A * <code>LINE_START</code>, <code>LINE_END</code>
0N/A * @return the component at the given location, or <code>null</code> if
0N/A * the location is empty
0N/A * @exception IllegalArgumentException if the constraint object is
0N/A * not one of the nine specified constants
0N/A * @see #addLayoutComponent(java.awt.Component, java.lang.Object)
0N/A * @since 1.5
0N/A */
0N/A public Component getLayoutComponent(Object constraints) {
0N/A if (CENTER.equals(constraints)) {
0N/A return center;
0N/A } else if (NORTH.equals(constraints)) {
0N/A return north;
0N/A } else if (SOUTH.equals(constraints)) {
0N/A return south;
0N/A } else if (WEST.equals(constraints)) {
0N/A return west;
0N/A } else if (EAST.equals(constraints)) {
0N/A return east;
0N/A } else if (PAGE_START.equals(constraints)) {
0N/A return firstLine;
0N/A } else if (PAGE_END.equals(constraints)) {
0N/A return lastLine;
0N/A } else if (LINE_START.equals(constraints)) {
0N/A return firstItem;
0N/A } else if (LINE_END.equals(constraints)) {
0N/A return lastItem;
0N/A } else {
0N/A throw new IllegalArgumentException("cannot get component: unknown constraint: " + constraints);
0N/A }
0N/A }
0N/A
0N/A
0N/A /**
0N/A * Returns the component that corresponds to the given constraint location
0N/A * based on the target <code>Container</code>'s component orientation.
0N/A * Components added with the relative constraints <code>PAGE_START</code>,
0N/A * <code>PAGE_END</code>, <code>LINE_START</code>, and <code>LINE_END</code>
0N/A * take precedence over components added with the explicit constraints
0N/A * <code>NORTH</code>, <code>SOUTH</code>, <code>WEST</code>, and <code>EAST</code>.
0N/A * The <code>Container</code>'s component orientation is used to determine the location of components
0N/A * added with <code>LINE_START</code> and <code>LINE_END</code>.
0N/A *
0N/A * @param constraints the desired absolute position, one of <code>CENTER</code>,
0N/A * <code>NORTH</code>, <code>SOUTH</code>,
0N/A * <code>EAST</code>, <code>WEST</code>
0N/A * @param target the {@code Container} used to obtain
0N/A * the constraint location based on the target
0N/A * {@code Container}'s component orientation.
0N/A * @return the component at the given location, or <code>null</code> if
0N/A * the location is empty
0N/A * @exception IllegalArgumentException if the constraint object is
0N/A * not one of the five specified constants
0N/A * @exception NullPointerException if the target parameter is null
0N/A * @see #addLayoutComponent(java.awt.Component, java.lang.Object)
0N/A * @since 1.5
0N/A */
0N/A public Component getLayoutComponent(Container target, Object constraints) {
0N/A boolean ltr = target.getComponentOrientation().isLeftToRight();
0N/A Component result = null;
0N/A
0N/A if (NORTH.equals(constraints)) {
0N/A result = (firstLine != null) ? firstLine : north;
0N/A } else if (SOUTH.equals(constraints)) {
0N/A result = (lastLine != null) ? lastLine : south;
0N/A } else if (WEST.equals(constraints)) {
0N/A result = ltr ? firstItem : lastItem;
0N/A if (result == null) {
0N/A result = west;
0N/A }
0N/A } else if (EAST.equals(constraints)) {
0N/A result = ltr ? lastItem : firstItem;
0N/A if (result == null) {
0N/A result = east;
0N/A }
0N/A } else if (CENTER.equals(constraints)) {
0N/A result = center;
0N/A } else {
0N/A throw new IllegalArgumentException("cannot get component: invalid constraint: " + constraints);
0N/A }
0N/A
0N/A return result;
0N/A }
0N/A
0N/A
0N/A /**
0N/A * Gets the constraints for the specified component
0N/A *
0N/A * @param comp the component to be queried
0N/A * @return the constraint for the specified component,
0N/A * or null if component is null or is not present
0N/A * in this layout
0N/A * @see #addLayoutComponent(java.awt.Component, java.lang.Object)
0N/A * @since 1.5
0N/A */
0N/A public Object getConstraints(Component comp) {
0N/A //fix for 6242148 : API method java.awt.BorderLayout.getConstraints(null) should return null
0N/A if (comp == null){
0N/A return null;
0N/A }
0N/A if (comp == center) {
0N/A return CENTER;
0N/A } else if (comp == north) {
0N/A return NORTH;
0N/A } else if (comp == south) {
0N/A return SOUTH;
0N/A } else if (comp == west) {
0N/A return WEST;
0N/A } else if (comp == east) {
0N/A return EAST;
0N/A } else if (comp == firstLine) {
0N/A return PAGE_START;
0N/A } else if (comp == lastLine) {
0N/A return PAGE_END;
0N/A } else if (comp == firstItem) {
0N/A return LINE_START;
0N/A } else if (comp == lastItem) {
0N/A return LINE_END;
0N/A }
0N/A return null;
0N/A }
0N/A
0N/A /**
0N/A * Determines the minimum size of the <code>target</code> container
0N/A * using this layout manager.
0N/A * <p>
0N/A * This method is called when a container calls its
0N/A * <code>getMinimumSize</code> method. Most applications do not call
0N/A * this method directly.
0N/A * @param target the container in which to do the layout.
0N/A * @return the minimum dimensions needed to lay out the subcomponents
0N/A * of the specified container.
0N/A * @see java.awt.Container
0N/A * @see java.awt.BorderLayout#preferredLayoutSize
0N/A * @see java.awt.Container#getMinimumSize()
0N/A */
0N/A public Dimension minimumLayoutSize(Container target) {
0N/A synchronized (target.getTreeLock()) {
0N/A Dimension dim = new Dimension(0, 0);
0N/A
0N/A boolean ltr = target.getComponentOrientation().isLeftToRight();
0N/A Component c = null;
0N/A
0N/A if ((c=getChild(EAST,ltr)) != null) {
0N/A Dimension d = c.getMinimumSize();
0N/A dim.width += d.width + hgap;
0N/A dim.height = Math.max(d.height, dim.height);
0N/A }
0N/A if ((c=getChild(WEST,ltr)) != null) {
0N/A Dimension d = c.getMinimumSize();
0N/A dim.width += d.width + hgap;
0N/A dim.height = Math.max(d.height, dim.height);
0N/A }
0N/A if ((c=getChild(CENTER,ltr)) != null) {
0N/A Dimension d = c.getMinimumSize();
0N/A dim.width += d.width;
0N/A dim.height = Math.max(d.height, dim.height);
0N/A }
0N/A if ((c=getChild(NORTH,ltr)) != null) {
0N/A Dimension d = c.getMinimumSize();
0N/A dim.width = Math.max(d.width, dim.width);
0N/A dim.height += d.height + vgap;
0N/A }
0N/A if ((c=getChild(SOUTH,ltr)) != null) {
0N/A Dimension d = c.getMinimumSize();
0N/A dim.width = Math.max(d.width, dim.width);
0N/A dim.height += d.height + vgap;
0N/A }
0N/A
0N/A Insets insets = target.getInsets();
0N/A dim.width += insets.left + insets.right;
0N/A dim.height += insets.top + insets.bottom;
0N/A
0N/A return dim;
0N/A }
0N/A }
0N/A
0N/A /**
0N/A * Determines the preferred size of the <code>target</code>
0N/A * container using this layout manager, based on the components
0N/A * in the container.
0N/A * <p>
0N/A * Most applications do not call this method directly. This method
0N/A * is called when a container calls its <code>getPreferredSize</code>
0N/A * method.
0N/A * @param target the container in which to do the layout.
0N/A * @return the preferred dimensions to lay out the subcomponents
0N/A * of the specified container.
0N/A * @see java.awt.Container
0N/A * @see java.awt.BorderLayout#minimumLayoutSize
0N/A * @see java.awt.Container#getPreferredSize()
0N/A */
0N/A public Dimension preferredLayoutSize(Container target) {
0N/A synchronized (target.getTreeLock()) {
0N/A Dimension dim = new Dimension(0, 0);
0N/A
0N/A boolean ltr = target.getComponentOrientation().isLeftToRight();
0N/A Component c = null;
0N/A
0N/A if ((c=getChild(EAST,ltr)) != null) {
0N/A Dimension d = c.getPreferredSize();
0N/A dim.width += d.width + hgap;
0N/A dim.height = Math.max(d.height, dim.height);
0N/A }
0N/A if ((c=getChild(WEST,ltr)) != null) {
0N/A Dimension d = c.getPreferredSize();
0N/A dim.width += d.width + hgap;
0N/A dim.height = Math.max(d.height, dim.height);
0N/A }
0N/A if ((c=getChild(CENTER,ltr)) != null) {
0N/A Dimension d = c.getPreferredSize();
0N/A dim.width += d.width;
0N/A dim.height = Math.max(d.height, dim.height);
0N/A }
0N/A if ((c=getChild(NORTH,ltr)) != null) {
0N/A Dimension d = c.getPreferredSize();
0N/A dim.width = Math.max(d.width, dim.width);
0N/A dim.height += d.height + vgap;
0N/A }
0N/A if ((c=getChild(SOUTH,ltr)) != null) {
0N/A Dimension d = c.getPreferredSize();
0N/A dim.width = Math.max(d.width, dim.width);
0N/A dim.height += d.height + vgap;
0N/A }
0N/A
0N/A Insets insets = target.getInsets();
0N/A dim.width += insets.left + insets.right;
0N/A dim.height += insets.top + insets.bottom;
0N/A
0N/A return dim;
0N/A }
0N/A }
0N/A
0N/A /**
0N/A * Returns the maximum dimensions for this layout given the components
0N/A * in the specified target container.
0N/A * @param target the component which needs to be laid out
0N/A * @see Container
0N/A * @see #minimumLayoutSize
0N/A * @see #preferredLayoutSize
0N/A */
0N/A public Dimension maximumLayoutSize(Container target) {
0N/A return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE);
0N/A }
0N/A
0N/A /**
0N/A * Returns the alignment along the x axis. This specifies how
0N/A * the component would like to be aligned relative to other
0N/A * components. The value should be a number between 0 and 1
0N/A * where 0 represents alignment along the origin, 1 is aligned
0N/A * the furthest away from the origin, 0.5 is centered, etc.
0N/A */
0N/A public float getLayoutAlignmentX(Container parent) {
0N/A return 0.5f;
0N/A }
0N/A
0N/A /**
0N/A * Returns the alignment along the y axis. This specifies how
0N/A * the component would like to be aligned relative to other
0N/A * components. The value should be a number between 0 and 1
0N/A * where 0 represents alignment along the origin, 1 is aligned
0N/A * the furthest away from the origin, 0.5 is centered, etc.
0N/A */
0N/A public float getLayoutAlignmentY(Container parent) {
0N/A return 0.5f;
0N/A }
0N/A
0N/A /**
0N/A * Invalidates the layout, indicating that if the layout manager
0N/A * has cached information it should be discarded.
0N/A */
0N/A public void invalidateLayout(Container target) {
0N/A }
0N/A
0N/A /**
0N/A * Lays out the container argument using this border layout.
0N/A * <p>
0N/A * This method actually reshapes the components in the specified
0N/A * container in order to satisfy the constraints of this
0N/A * <code>BorderLayout</code> object. The <code>NORTH</code>
0N/A * and <code>SOUTH</code> components, if any, are placed at
0N/A * the top and bottom of the container, respectively. The
0N/A * <code>WEST</code> and <code>EAST</code> components are
0N/A * then placed on the left and right, respectively. Finally,
0N/A * the <code>CENTER</code> object is placed in any remaining
0N/A * space in the middle.
0N/A * <p>
0N/A * Most applications do not call this method directly. This method
0N/A * is called when a container calls its <code>doLayout</code> method.
0N/A * @param target the container in which to do the layout.
0N/A * @see java.awt.Container
0N/A * @see java.awt.Container#doLayout()
0N/A */
0N/A public void layoutContainer(Container target) {
0N/A synchronized (target.getTreeLock()) {
0N/A Insets insets = target.getInsets();
0N/A int top = insets.top;
0N/A int bottom = target.height - insets.bottom;
0N/A int left = insets.left;
0N/A int right = target.width - insets.right;
0N/A
0N/A boolean ltr = target.getComponentOrientation().isLeftToRight();
0N/A Component c = null;
0N/A
0N/A if ((c=getChild(NORTH,ltr)) != null) {
0N/A c.setSize(right - left, c.height);
0N/A Dimension d = c.getPreferredSize();
0N/A c.setBounds(left, top, right - left, d.height);
0N/A top += d.height + vgap;
0N/A }
0N/A if ((c=getChild(SOUTH,ltr)) != null) {
0N/A c.setSize(right - left, c.height);
0N/A Dimension d = c.getPreferredSize();
0N/A c.setBounds(left, bottom - d.height, right - left, d.height);
0N/A bottom -= d.height + vgap;
0N/A }
0N/A if ((c=getChild(EAST,ltr)) != null) {
0N/A c.setSize(c.width, bottom - top);
0N/A Dimension d = c.getPreferredSize();
0N/A c.setBounds(right - d.width, top, d.width, bottom - top);
0N/A right -= d.width + hgap;
0N/A }
0N/A if ((c=getChild(WEST,ltr)) != null) {
0N/A c.setSize(c.width, bottom - top);
0N/A Dimension d = c.getPreferredSize();
0N/A c.setBounds(left, top, d.width, bottom - top);
0N/A left += d.width + hgap;
0N/A }
0N/A if ((c=getChild(CENTER,ltr)) != null) {
0N/A c.setBounds(left, top, right - left, bottom - top);
0N/A }
0N/A }
0N/A }
0N/A
0N/A /**
0N/A * Get the component that corresponds to the given constraint location
0N/A *
0N/A * @param key The desired absolute position,
0N/A * either NORTH, SOUTH, EAST, or WEST.
0N/A * @param ltr Is the component line direction left-to-right?
0N/A */
0N/A private Component getChild(String key, boolean ltr) {
0N/A Component result = null;
0N/A
0N/A if (key == NORTH) {
0N/A result = (firstLine != null) ? firstLine : north;
0N/A }
0N/A else if (key == SOUTH) {
0N/A result = (lastLine != null) ? lastLine : south;
0N/A }
0N/A else if (key == WEST) {
0N/A result = ltr ? firstItem : lastItem;
0N/A if (result == null) {
0N/A result = west;
0N/A }
0N/A }
0N/A else if (key == EAST) {
0N/A result = ltr ? lastItem : firstItem;
0N/A if (result == null) {
0N/A result = east;
0N/A }
0N/A }
0N/A else if (key == CENTER) {
0N/A result = center;
0N/A }
0N/A if (result != null && !result.visible) {
0N/A result = null;
0N/A }
0N/A return result;
0N/A }
0N/A
0N/A /**
0N/A * Returns a string representation of the state of this border layout.
0N/A * @return a string representation of this border layout.
0N/A */
0N/A public String toString() {
0N/A return getClass().getName() + "[hgap=" + hgap + ",vgap=" + vgap + "]";
0N/A }
0N/A}