From 986e6497bc6dd83edc49a48bb527ccf3a5e62f7b Mon Sep 17 00:00:00 2001 From: tromey Date: Wed, 16 Jan 2002 04:21:35 +0000 Subject: Start of AWT merge with Classpath: * Makefile.in: Rebuilt. * Makefile.am (awt_java_source_files): Reference files in gnu/java/awt, not gnu/gcj/awt. * java/awt/image/BufferedImage.java: Updated copyright. * java/awt/image/ComponentColorModel.java: Updated copyright. * java/awt/image/ComponentSampleModel.java: Updated copyright. * java/awt/image/DataBuffer.java: Updated copyright. * java/awt/image/DataBufferByte.java: Updated copyright. * java/awt/image/DataBufferInt.java: Updated copyright. * java/awt/image/DataBufferUShort.java: Updated copyright. * java/awt/image/IndexColorModel.java: Updated copyright. * java/awt/image/PackedColorModel.java: Updated copyright. * java/awt/image/Raster.java: Updated copyright. * java/awt/image/RasterOp.java: Updated copyright. * java/awt/image/SampleModel.java: Updated copyright. * java/awt/image/SinglePixelPackedSampleModel.java: Updated copyright. * java/awt/image/WritableRaster.java: Updated copyright. * java/awt/color/ColorSpace.java: Updated copyright. * java/awt/color/ICC_ColorSpace.java: Updated copyright * java/awt/color/ICC_Profile.java: Updated copyright. * java/awt/event/HierarchyBoundsAdapter.java: Updated copyright. * java/awt/event/HierarchyBoundsListener.java: Updated copyright. * java/awt/event/HierarchyEvent.java: Updated copyright. * java/awt/event/HierarchyListener.java: Updated copyright. * java/awt/geom/AffineTransform.java: Updated copyright. * java/awt/geom/Dimension2D.java: Updated copyright. * java/awt/geom/Ellipse2D.java: Updated copyright. * java/awt/geom/IllegalPathStateException.java: Updated copyright. * java/awt/geom/Line2D.java: Updated copyright. * java/awt/geom/NoninvertibleTransformException.java: Updated copyright. * java/awt/geom/PathIterator.java: Updated copyright. * java/awt/geom/Point2D.java: Updated copyright. * java/awt/geom/Rectangle2D.java: Updated copyright. * java/awt/geom/RectangularShape.java: Updated copyright. * java/awt/geom/RoundRectangle2D.java: Updated copyright. * java/awt/Toolkit.java: Updated import for file moves. * java/awt/Rectangle.java: Updated copyright; added javadoc from Classpath. (hashCode): New method from Classpath. * java/awt/Graphics2D.java: Updated copyright. * java/awt/Transparency.java: Updated copyright. * java/awt/Paint.java: Updated copyright. * java/awt/Graphics.java: New version from Classpath. * java/awt/EventDispatchThread.java: Updated copyright. * java/awt/CardLayout.java (layoutContainer): Don't skip invisible children. (gotoComponent): Wrap around on next/previous. * gnu/gcj/awt/BitMaskExtent.java: Removed. * gnu/gcj/awt/Buffers.java: Removed. * gnu/gcj/awt/ComponentDataBlitOp.java: Removed. * gnu/gcj/awt/GLightweightPeer.java: Removed. * gnu/java/awt/BitMaskExtent.java: Added. * gnu/java/awt/Buffers.java: Added. * gnu/java/awt/ComponentDataBlitOp.java: Added. * gnu/java/awt/GLightweightPeer.java: Added. * java/awt/geom/Line2D.java (clone): Ignore CloneNotSupportedException. * gnu/gcj/awt/GLightweightPeer.java (getColorModel): New method. * java/awt/Frame.java: Merged with Classpath. * java/awt/RenderingHints.java: Copyright update. * java/awt/Paint.java: Copyright update. * java/awt/image/DirectColorModel.java: Merged with Classpath. * java/awt/image/ColorModel.java: Merged with Classpath. * java/awt/Window.java (show): New Implementation from Classpath. (isShowing): Use super.isShowing(). * java/awt/EventQueue.java: Merged with Classpath. * java/awt/AWTEventMulticaster.java (save): Throw RuntimeException. (saveInternal): Likewise. * java/awt/AWTEvent.java: Now implements Serializable. * java/awt/Event.java: Copyright update. * java/awt/peer/ComponentPeer.java: Merged with Classpath. * java/awt/image/BufferedImage.java: Copyright update. * java/awt/GraphicsConfiguration.java: Copyright update. * java/awt/Component.java: (addNotify): Don't call addNotifyContainerChildren(). (addNotifyContainerChildren): Removed. (setPeer): New method from Classpath. (setTreeLock): Likewise. (setVisible): Rewrote. (show): Use it. (hide): Likewise. (validate): Set `valid'. (checkImage(Image,ImageObserver)): Implementation from Classpath. (createImage(ImageProducer)): Likewise. (prepareImage): Likewise. * java/awt/Container.java (addImpl): Handle case where constraint is not a String. Post event via system event queue. (remove): Post event via system event queue. (validateTree): Only validate child if it is invalid. (getAlignmentX): Call super method as default. (getAlignmentY): Likewise. (addContainerListener): Now synchronized. (removeContainerListener): Likewise. (addNotifyContainerChildren): Now private. * java/awt/ComponentOrientation.java: Updated copyright. Added @author. * java/awt/FlowLayout.java (serialVersionUID): New field. (setAlignment): Better exception message. (layoutContainer): Don't compute component's preferred size unless we're going to use it. * java/awt/BorderLayout.java (AFTER_LAST_LINE, AFTER_LINE_ENDS, BEFORE_FIRST_LINE, BEFORE_LINE_BEGINS): New constants. (firstLine, lastLine, firstItem, lastItem): New fields. (addLayoutComponent): Handle case where constraints is null. Also, handle relative locations. (removeLayoutComponent): Handle relative locations. (MIN, MAX, PREF): New constants. (calcCompSize): New method. (calcSize): New method. (minimumLayoutSize): Use it. (preferredLayoutSize): Likewise. (maximumLayoutSize): Likewise. (toString): Include more information. (setBounds): New method. (layoutContainer): Use libgcj implementation; extended to handle relative locations. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@48896 138bc75d-0d04-0410-961f-82ee72b054a4 --- libjava/java/awt/BorderLayout.java | 809 +++++++++++++++++++++++++++---------- 1 file changed, 585 insertions(+), 224 deletions(-) (limited to 'libjava/java/awt/BorderLayout.java') diff --git a/libjava/java/awt/BorderLayout.java b/libjava/java/awt/BorderLayout.java index 0d779c1a752..dd19b0ebb8e 100644 --- a/libjava/java/awt/BorderLayout.java +++ b/libjava/java/awt/BorderLayout.java @@ -1,174 +1,481 @@ -/* Copyright (C) 1999, 2000 Free Software Foundation +/* BorderLayout.java -- A layout manager class + Copyright (C) 1999, 2002 Free Software Foundation, Inc. - This file is part of libjava. +This file is part of GNU Classpath. + +GNU Classpath is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU Classpath is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GNU Classpath; see the file COPYING. If not, write to the +Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +02111-1307 USA. + +As a special exception, if you link this library with other files to +produce an executable, this library does not by itself cause the +resulting executable to be covered by the GNU General Public License. +This exception does not however invalidate any other reasons why the +executable file might be covered by the GNU General Public License. */ -This software is copyrighted work licensed under the terms of the -Libjava License. Please consult the file "LIBJAVA_LICENSE" for -details. */ package java.awt; +/** + * This class implements a layout manager that positions components + * in certain sectors of the parent container. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Rolf W. Rasmussen + */ public class BorderLayout implements LayoutManager2, java.io.Serializable { - public static final String NORTH = "North", - SOUTH = "South", - EAST = "East", - WEST = "West", - CENTER = "Center"; - - // FIXME: use these too - public static final String BEFORE_FIRST_LINE = "First", - AFTER_LAST_LINE = "Last", - BEFORE_LINE_BEGINS = "Before", - AFTER_LINE_ENDS = "After"; - - - // FIXME: check serialization of fields - int hgap; - int vgap; - Component north, south, east, west, center; - - public BorderLayout () - { - this (0, 0); - } - - public BorderLayout (int hgap, int vgap) - { - this.hgap = hgap; - this.vgap = vgap; - } - - public int getHgap() - { - return hgap; - } - - public void setHgap(int hgap) - { - this.hgap = hgap; - } - - public int getVgap() - { - return vgap; - } - - public void setVgap(int vgap) - { - this.vgap = vgap; - } - - public void addLayoutComponent(Component comp, Object constraints) - { - if ((constraints == null) || CENTER.equals(constraints)) - { - center = comp; - } - else if (NORTH.equals(constraints)) - { - north = comp; - } - else if (SOUTH.equals(constraints)) - { - south = comp; - } - else if (EAST.equals(constraints)) - { - east = comp; - } - else if (WEST.equals(constraints)) - { - west = comp; - } - } - - public void addLayoutComponent(String name, Component comp) - { - addLayoutComponent(comp, name); - } - - public void removeLayoutComponent(Component comp) - { - if (center == comp) - { - center = null; - } - else if (north == comp) - { - north = null; - } - else if (south == comp) - { - south = null; - } - else if (east == comp) - { - east = null; - } - else if (west == comp) - { - west = null; - } - } - - public Dimension minimumLayoutSize(Container target) - { - return calcSize(getMinimumSize(center), - getMinimumSize(north), - getMinimumSize(south), - getMinimumSize(east), - getMinimumSize(west), - target); - } - - public Dimension preferredLayoutSize(Container target) - { - return calcSize(getPreferredSize(center), - getPreferredSize(north), - getPreferredSize(south), - getPreferredSize(east), - getPreferredSize(west), - target); - } - - /** - * Completely disregards the requested maximum sizes of the - * components, and states that the container has no upper size - * limit. - * - * @return a dimension of width and height Integer.MAX_VALUE. - */ - public Dimension maximumLayoutSize(Container target) - { - return (Dimension) DIM_MAX.clone(); - } - - public float getLayoutAlignmentX(Container parent) - { - return Component.CENTER_ALIGNMENT; - } - - public float getLayoutAlignmentY(Container parent) - { - return Component.CENTER_ALIGNMENT; - } - - public void invalidateLayout(Container target) - { - // TODO... implement caching? - } - - public void layoutContainer(Container target) - { - Insets i = target.getInsets(); - Dimension c = getPreferredSize(center); - Dimension n = getPreferredSize(north); - Dimension s = getPreferredSize(south); - Dimension e = getPreferredSize(east); - Dimension w = getPreferredSize(west); - Dimension t = target.getSize(); - + +/* + * Static Variables + */ + +/** + * Constant indicating the top of the container + */ +public static final String NORTH = "North"; + +/** + * Constant indicating the bottom of the container + */ +public static final String SOUTH = "South"; + +/** + * Constant indicating the right side of the container + */ +public static final String EAST = "East"; + +/** + * Constant indicating the left side of the container + */ +public static final String WEST = "West"; + +/** + * Constant indicating the center of the container + */ +public static final String CENTER = "Center"; + +/** + * Constant indicating the position just after the last line of the + * layout. + */ +public static final String AFTER_LAST_LINE = "Last"; + +/** + * Constant indicating the position just after the end of the line. + */ +public static final String AFTER_LINE_ENDS = "After"; + +/** + * Constant indicating the position just before the first line of the + * layout. + */ +public static final String BEFORE_FIRST_LINE = "First"; + +/** + * Constant indicating the position at the beginning of the line. + */ +public static final String BEFORE_LINE_BEGINS = "Before"; + +// Serialization constant +private static final long serialVersionUID = -8658291919501921765L; + +/*************************************************************************/ + +/* + * Instance Variables + */ + +/** + * @serial + */ +private Component north; + +/** + * @serial + */ +private Component south; + +/** + * @serial + */ +private Component east; + +/** + * @serial + */ +private Component west; + +/** + * @serial + */ +private Component center; + +/** + * @serial + */ +private Component firstLine; + +/** + * @serial + */ +private Component lastLine; + +/** + * @serial + */ +private Component firstItem; + +/** + * @serial + */ +private Component lastItem; + +/** + * @serial The horizontal gap between components + */ +private int hgap; + +/** + * @serial The vertical gap between components + */ +private int vgap; + +/*************************************************************************/ + +/* + * Constructors + */ + +/** + * Initializes a new instance of BorderLayout with no + * horiztonal or vertical gaps between components. + */ +public +BorderLayout() +{ + this(0,0); +} + +/*************************************************************************/ + +/** + * Initializes a new instance of BorderLayout with the + * specified horiztonal and vertical gaps between components. + * + * @param hgap The horizontal gap between components. + * @param vgap The vertical gap between components. + */ +public +BorderLayout(int hgap, int vgap) +{ + this.hgap = hgap; + this.vgap = vgap; +} + +/*************************************************************************/ + +/* + * Instance Variables + */ + +/** + * Returns the horitzontal gap value. + * + * @return The horitzontal gap value. + */ +public int +getHgap() +{ + return(hgap); +} + +/*************************************************************************/ + +/** + * Sets the horizontal gap to the specified value. + * + * @param hgap The new horizontal gap. + */ +public void +setHgap(int hgap) +{ + this.hgap = hgap; +} + +/*************************************************************************/ + +/** + * Returns the vertical gap value. + * + * @return The vertical gap value. + */ +public int +getVgap() +{ + return(vgap); +} + +/*************************************************************************/ + +/** + * Sets the vertical gap to the specified value. + * + * @param vgap The new vertical gap value. + */ +public void +setVgap(int vgap) +{ + this.vgap = vgap; +} + +/*************************************************************************/ + +/** + * Adds a component to the layout in the specified constraint position, + * which must be one of the string constants defined in this class. + * + * @param component The component to add. + * @param constraints The constraint string. + * + * @exception IllegalArgumentException If the constraint object is not + * a string, or is not one of the specified constants in this class. + */ +public void +addLayoutComponent(Component component, Object constraints) +{ + if (constraints != null && ! (constraints instanceof String)) + throw new IllegalArgumentException("Constraint must be a string"); + + String str = (String)constraints; + + if (str == null || str.equals(CENTER)) + center = component; + if (str.equals(NORTH)) + north = component; + else if (str.equals(SOUTH)) + south = component; + else if (str.equals(EAST)) + east = component; + else if (str.equals(WEST)) + west = component; + else if (str.equals(BEFORE_FIRST_LINE)) + firstLine = component; + else if (str.equals(AFTER_LAST_LINE)) + lastLine = component; + else if (str.equals(BEFORE_LINE_BEGINS)) + firstItem = component; + else if (str.equals(AFTER_LINE_ENDS)) + lastItem = component; + else + throw new IllegalArgumentException("Constraint value not valid: " + str); +} + +/*************************************************************************/ + +/** + * Adds a component to the layout in the specified constraint position, + * which must be one of the string constants defined in this class. + * + * @param constraints The constraint string. + * @param component The component to add. + * + * @exception IllegalArgumentException If the constraint object is not + * one of the specified constants in this class. + * + * @deprecated This method is deprecated in favor of + * addLayoutComponent(Component, Object). + */ +public void +addLayoutComponent(String constraints, Component component) +{ + addLayoutComponent(component, constraints); +} + +/*************************************************************************/ + +/** + * Removes the specified component from the layout. + * + * @param component The component to remove from the layout. + */ +public void +removeLayoutComponent(Component component) +{ + if (north == component) + north = null; + if (south == component) + south = null; + if (east == component) + east = null; + if (west == component) + west = null; + if (center == component) + center = null; + if (firstItem == component) + firstItem = null; + if (lastItem == component) + lastItem = null; + if (firstLine == component) + firstLine = null; + if (lastLine == component) + lastLine = null; +} + +/*************************************************************************/ + +/** + * Returns the minimum size of the specified container using this layout. + * + * @param target The container to calculate the minimum size for. + * + * @return The minimum size of the container + */ +public Dimension +minimumLayoutSize(Container target) +{ + return calcSize(target, MIN); +} + +/*************************************************************************/ + +/** + * Returns the preferred size of the specified container using this layout. + * + * @param target The container to calculate the preferred size for. + * + * @return The preferred size of the container + */ +public Dimension +preferredLayoutSize(Container target) +{ + return calcSize(target, PREF); +} + +/*************************************************************************/ + +/** + * Returns the maximum size of the specified container using this layout. + * + * @param target The container to calculate the maximum size for. + * + * @return The maximum size of the container + */ +public Dimension +maximumLayoutSize(Container target) +{ + return calcSize(target, MAX); +} + +/*************************************************************************/ + +/** + * Returns the X axis alignment, which is a float indicating + * where along the X axis this container wishs to position its layout. + * 0 indicates align to the left, 1 indicates align to the right, and 0.5 + * indicates align to the center. + * + * @param parent The parent container. + * + * @return The X alignment value. + */ +public float +getLayoutAlignmentX(Container parent) +{ + return(parent.getAlignmentX()); +} + +/*************************************************************************/ + +/** + * Returns the Y axis alignment, which is a float indicating + * where along the Y axis this container wishs to position its layout. + * 0 indicates align to the top, 1 indicates align to the bottom, and 0.5 + * indicates align to the center. + * + * @param parent The parent container. + * + * @return The Y alignment value. + */ +public float +getLayoutAlignmentY(Container parent) +{ + return(parent.getAlignmentY()); +} + +/*************************************************************************/ + +/** + * Instructs this object to discard any layout information it might + * have cached. + * + * @param parent The parent container. + */ +public void +invalidateLayout(Container parent) +{ +} + +/*************************************************************************/ + +/** + * Lays out the specified container according to the constraints + * in this object. + * + * @param target The container to lay out. + */ +public void +layoutContainer(Container target) +{ + Insets i = target.getInsets(); + + ComponentOrientation orient = target.getComponentOrientation (); + boolean left_to_right = orient.isLeftToRight (); + + Component my_north = north; + Component my_east = east; + Component my_south = south; + Component my_west = west; + + // Note that we currently don't handle vertical layouts. Neither + // does JDK 1.3. + if (firstLine != null) + my_north = firstLine; + if (lastLine != null) + my_south = lastLine; + if (firstItem != null) + { + if (left_to_right) + my_west = firstItem; + else + my_east = firstItem; + } + if (lastItem != null) + { + if (left_to_right) + my_east = lastItem; + else + my_west = lastItem; + } + + Dimension c = calcCompSize(center, PREF); + Dimension n = calcCompSize(my_north, PREF); + Dimension s = calcCompSize(my_south, PREF); + Dimension e = calcCompSize(my_east, PREF); + Dimension w = calcCompSize(my_west, PREF); + Dimension t = target.getSize(); + /* <-> hgap <-> hgap +----------------------------+ } @@ -190,65 +497,119 @@ public class BorderLayout implements LayoutManager2, java.io.Serializable i.left i.right */ - int x1 = i.left; - int x2 = x1 + w.width + hgap; - int x3 = t.width - i.right - e.width; - int ww = t.width - i.right - i.left; - - int y1 = i.top; - int y2 = y1 + n.height + vgap; - int y3 = t.height - i.bottom - s.height; - int hh = y3-y2-vgap; - - setBounds(center, x2, y2, x3-x2-hgap, hh); - setBounds(north, x1, y1, ww, n.height); - setBounds(south, x1, y3, ww, s.height); - setBounds(west, x1, y2, w.width, hh); - setBounds(east, x3, y2, e.width, hh); - } - - public String toString() - { - return getClass().getName() + "[hgap=" + hgap + ",vgap=" + vgap + "]"; - } - - - // Support: - - static final Dimension DIM_0 = new Dimension(0, 0); - static final Dimension DIM_MAX = new Dimension(Integer.MAX_VALUE, - Integer.MAX_VALUE); - - void setBounds(Component comp, int x, int y, int w, int h) - { - if (comp == null) - return; - comp.setBounds(x, y, w, h); - } - - Dimension getMinimumSize(Component comp) - { - if (comp == null) - return DIM_0; + int x1 = i.left; + int x2 = x1 + w.width + hgap; + int x3 = t.width - i.right - e.width; + int ww = t.width - i.right - i.left; + + int y1 = i.top; + int y2 = y1 + n.height + vgap; + int y3 = t.height - i.bottom - s.height; + int hh = y3-y2-vgap; + + setBounds(center, x2, y2, x3-x2-hgap, hh); + setBounds(my_north, x1, y1, ww, n.height); + setBounds(my_south, x1, y3, ww, s.height); + setBounds(my_west, x1, y2, w.width, hh); + setBounds(my_east, x3, y2, e.width, hh); +} + +/*************************************************************************/ + +/** + * Returns a string representation of this layout manager. + * + * @return A string representation of this object. + */ +public String +toString() +{ + return getClass().getName() + "[hgap=" + hgap + ",vgap=" + vgap + "]"; +} + +private void +setBounds(Component comp, int x, int y, int w, int h) +{ + if (comp == null) + return; + comp.setBounds(x, y, w, h); +} + +// Some constants for use with calcSize(). +private static final int MIN = 0; +private static final int MAX = 1; +private static final int PREF = 2; + +private Dimension +calcCompSize(Component comp, int what) +{ + if (comp == null) + return new Dimension(0, 0); + if (what == MIN) return comp.getMinimumSize(); - } - - Dimension getPreferredSize(Component comp) - { - if (comp == null) - return DIM_0; - return comp.getPreferredSize(); - } - - Dimension calcSize(Dimension c, Dimension n, Dimension s, - Dimension e, Dimension w, Container target) - { - Insets i = target.getInsets(); - - return new Dimension(c.width + e.width + w.width + hgap*2 + - i.left + i.right, - c.height + n.height + s.height + vgap*2 + - i.top + i.bottom - ); - } + else if (what == MAX) + return comp.getMaximumSize(); + return comp.getPreferredSize(); +} + +// This is a helper function used to compute the various sizes for +// this layout. +private Dimension +calcSize(Container target, int what) +{ + Insets ins = target.getInsets(); + + ComponentOrientation orient = target.getComponentOrientation (); + boolean left_to_right = orient.isLeftToRight (); + + Component my_north = north; + Component my_east = east; + Component my_south = south; + Component my_west = west; + + // Note that we currently don't handle vertical layouts. Neither + // does JDK 1.3. + if (firstLine != null) + my_north = firstLine; + if (lastLine != null) + my_south = lastLine; + if (firstItem != null) + { + if (left_to_right) + my_west = firstItem; + else + my_east = firstItem; + } + if (lastItem != null) + { + if (left_to_right) + my_east = lastItem; + else + my_west = lastItem; + } + + Dimension ndim = calcCompSize(my_north, what); + Dimension sdim = calcCompSize(my_south, what); + Dimension edim = calcCompSize(my_east, what); + Dimension wdim = calcCompSize(my_west, what); + Dimension cdim = calcCompSize(center, what); + + int width = edim.width + cdim.width + wdim.width + (hgap * 2); + if (ndim.width > width) + width = ndim.width; + if (sdim.width > width) + width = sdim.width; + + width += (ins.left + ins.right); + + int height = edim.height; + if (cdim.height > height) + height = cdim.height; + if (wdim.height > height) + height = wdim.height; + + height += (ndim.height + sdim.height + (vgap * 2) + ins.top + ins.bottom); + + return(new Dimension(width, height)); } +} // class BorderLayout -- cgit v1.2.1