mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			833 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			Java
		
	
	
	
			
		
		
	
	
			833 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			Java
		
	
	
	
| /* SpringLayout.java --
 | |
|    Copyright (C) 2004, 2006, Free Software Foundation, Inc.
 | |
| 
 | |
| 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., 51 Franklin Street, Fifth Floor, Boston, MA
 | |
| 02110-1301 USA.
 | |
| 
 | |
| Linking this library statically or dynamically with other modules is
 | |
| making a combined work based on this library.  Thus, the terms and
 | |
| conditions of the GNU General Public License cover the whole
 | |
| combination.
 | |
| 
 | |
| As a special exception, the copyright holders of this library give you
 | |
| permission to link this library with independent modules to produce an
 | |
| executable, regardless of the license terms of these independent
 | |
| modules, and to copy and distribute the resulting executable under
 | |
| terms of your choice, provided that you also meet, for each linked
 | |
| independent module, the terms and conditions of the license of that
 | |
| module.  An independent module is a module which is not derived from
 | |
| or based on this library.  If you modify this library, you may extend
 | |
| this exception to your version of the library, but you are not
 | |
| obligated to do so.  If you do not wish to do so, delete this
 | |
| exception statement from your version. */
 | |
| 
 | |
| 
 | |
| package javax.swing;
 | |
| 
 | |
| import java.awt.Component;
 | |
| import java.awt.Container;
 | |
| import java.awt.Dimension;
 | |
| import java.awt.LayoutManager2;
 | |
| import java.util.HashMap;
 | |
| import java.util.Map;
 | |
| 
 | |
| /**
 | |
|  * A very flexible layout manager. Components are laid out by defining the
 | |
|  * relationships between them. The relationships are expressed as
 | |
|  * {@link Spring}s. You can attach a Spring for each edge of a component and
 | |
|  * link it to an edge of a different component. For example, you can say,
 | |
|  * the northern edge of component A should be attached to the southern edge
 | |
|  * of component B, and the space between them should be something between
 | |
|  * x and y pixels, and preferably z pixels.
 | |
|  * <p>While quite simple, this layout manager can be used to emulate most other
 | |
|  * layout managers, and can also be used to solve some layout problems, which
 | |
|  * would be hard to solve with other layout managers.</p>
 | |
|  *
 | |
|  * @author Roman Kennke (roman@ontographics.com)
 | |
|  */
 | |
| public class SpringLayout implements LayoutManager2
 | |
| {
 | |
| 
 | |
|   /** The right edge of a component. */
 | |
|   public static final String EAST = "East";
 | |
| 
 | |
|   /** The top edge of a component. */
 | |
|   public static final String NORTH = "North";
 | |
| 
 | |
|   /** The bottom edge of a component. */
 | |
|   public static final String SOUTH = "South";
 | |
| 
 | |
|   /** The left edge of a component. */
 | |
|   public static final String WEST = "West";
 | |
| 
 | |
|   /** maps components to their constraints. */
 | |
|   private Map constraintsMap;
 | |
| 
 | |
|   /**
 | |
|    * The constraints that define the relationships between components.
 | |
|    * Each Constraints object can hold 4 Springs: one for each edge of the
 | |
|    * component. Additionally it can hold Springs for the components width
 | |
|    * and the components height. Since the height and width constraints are
 | |
|    * dependend on the other constraints, a component can be over-constraint.
 | |
|    * In this case (like when all of NORTH, SOUTH and HEIGHT are constraint),
 | |
|    * the values are adjusted, so that the mathematics still hold true.
 | |
|    *
 | |
|    * @author Roman Kennke (roman@ontographics.com)
 | |
|    */
 | |
|   public static class Constraints
 | |
|   {
 | |
| 
 | |
|     // The constraints for each edge, and width and height.
 | |
|     /** The Spring for the left edge. */
 | |
|     private Spring x;
 | |
| 
 | |
|     /** The Spring for the upper edge. */
 | |
|     private Spring y;
 | |
| 
 | |
|     /** The Spring for the height. */
 | |
|     private Spring height;
 | |
| 
 | |
|     /** The Spring for the width. */
 | |
|     private Spring width;
 | |
| 
 | |
|     /** The Spring for the right edge. */
 | |
|     private Spring east;
 | |
| 
 | |
|     /** The Spring for the bottom edge. */
 | |
|     private Spring south;
 | |
| 
 | |
|     /**
 | |
|      In each axis the user can set three values, i.e. x, width, east, if all
 | |
|      three are set, then there's no room for manoeuvre so in those cases the
 | |
|      third will be described by the below spring which is calculated in terms
 | |
|      of the other two
 | |
|     */
 | |
|     private Spring v;
 | |
|     private Spring h;
 | |
| 
 | |
|     /**
 | |
|      * Creates a new Constraints object.
 | |
|      * There is no constraint set.
 | |
|      */
 | |
|     public Constraints()
 | |
|     {
 | |
|       x = y = height = width = east = south = v = h = null;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Creates a new Constraints object.
 | |
|      *
 | |
|      * @param x the constraint for the left edge of the component.
 | |
|      * @param y the constraint for the upper edge of the component.
 | |
|      */
 | |
|     public Constraints(Spring x, Spring y)
 | |
|     {
 | |
|       this.x = x;
 | |
|       this.y = y;
 | |
|       width = height = east = south = v = h = null;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Creates a new Constraints object.
 | |
|      *
 | |
|      * @param x the constraint for the left edge of the component.
 | |
|      * @param y the constraint for the upper edge of the component.
 | |
|      * @param width the constraint for the width of the component.
 | |
|      * @param height the constraint for the height of the component.
 | |
|      */
 | |
|     public Constraints(Spring x, Spring y, Spring width, Spring height)
 | |
|     {
 | |
|       this.x = x;
 | |
|       this.y = y;
 | |
|       this.width = width;
 | |
|       this.height = height;
 | |
|       east = south = v = h = null;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Create a new Constraints object which tracks the indicated
 | |
|      * component.  The x and y positions for this Constraints object
 | |
|      * are constant Springs created with the component's location at
 | |
|      * the time this constructor is called.  The width and height
 | |
|      * of this Constraints are Springs created using
 | |
|      * {@link Spring#width(Component)} and {@link Spring#height(Component)},
 | |
|      * respectively.
 | |
|      * @param component the component to track
 | |
|      * @since 1.5
 | |
|      */
 | |
|     public Constraints(Component component)
 | |
|     {
 | |
|       this(Spring.constant(component.getX()),
 | |
|            Spring.constant(component.getY()),
 | |
|            Spring.width(component),
 | |
|            Spring.height(component));
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns the constraint for the edge with the <code>edgeName</code>.
 | |
|      * This is expected to be one of
 | |
|      * {@link #EAST}, {@link #WEST}, {@link #NORTH} or {@link #SOUTH}.
 | |
|      *
 | |
|      * @param edgeName the name of the edge.
 | |
|      * @return the constraint for the specified edge.
 | |
|      */
 | |
|     public Spring getConstraint(String edgeName)
 | |
|     {
 | |
|       Spring retVal = null;
 | |
|       if (edgeName.equals(SpringLayout.NORTH))
 | |
|         retVal = getY();
 | |
|       else if (edgeName.equals(SpringLayout.WEST))
 | |
|         retVal = getX();
 | |
|       else if (edgeName.equals(SpringLayout.SOUTH))
 | |
|         retVal = getSouth();
 | |
|       else if (edgeName.equals(SpringLayout.EAST))
 | |
|         retVal = getEast();
 | |
|       return retVal;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns the constraint for the height of the component.
 | |
|      *
 | |
|      * @return the height constraint.
 | |
|      */
 | |
|     public Spring getHeight()
 | |
|     {
 | |
|       if (height != null)
 | |
|         return height;
 | |
|       else if ((v == null) && (y != null) && (south != null))
 | |
|           v = Spring.sum(south, Spring.minus(y));
 | |
|       return v;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns the constraint for the width of the component.
 | |
|      *
 | |
|      * @return the width constraint.
 | |
|      */
 | |
|     public Spring getWidth()
 | |
|     {
 | |
|       if (width != null)
 | |
|         return width;
 | |
|       else if ((h == null) && (x != null) && (east != null))
 | |
|         h = Spring.sum(east, Spring.minus(x));
 | |
|       return h;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns the constraint for the left edge of the component.
 | |
|      *
 | |
|      * @return the left-edge constraint (== WEST).
 | |
|      */
 | |
|     public Spring getX()
 | |
|     {
 | |
|       if (x != null)
 | |
|         return x;
 | |
|       else if ((h == null) && (width != null) && (east != null))
 | |
|         h = Spring.sum(east, Spring.minus(width));
 | |
|       return h;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns the constraint for the upper edge of the component.
 | |
|      *
 | |
|      * @return the upper-edge constraint (== NORTH).
 | |
|      */
 | |
|     public Spring getY()
 | |
|     {
 | |
|       if (y != null)
 | |
|         return y;
 | |
|       else if ((v == null) && (height != null) && (south != null))
 | |
|         v = Spring.sum(south, Spring.minus(height));
 | |
|       return v;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns the constraint for the lower edge of the component.
 | |
|      *
 | |
|      * @return the lower-edge constraint (== SOUTH).
 | |
|      */
 | |
|     public Spring getSouth()
 | |
|     {
 | |
|       if (south != null)
 | |
|         return south;
 | |
|       else if ((v == null) && (height != null) && (y != null))
 | |
|         v = Spring.sum(y, height);
 | |
|       return v;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns the constraint for the right edge of the component.
 | |
|      *
 | |
|      * @return the right-edge constraint (== EAST).
 | |
|      */
 | |
|     public Spring getEast()
 | |
|     {
 | |
|       if (east != null)
 | |
|         return east;
 | |
|       else if ((h == null) && (width != null) && (x != null))
 | |
|         h = Spring.sum(x, width);
 | |
|       return h;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Sets a constraint for the specified edge. If this leads to an
 | |
|      * over-constrained situation, the constraints get adjusted, so that
 | |
|      * the mathematics still hold true.
 | |
|      *
 | |
|      * @param edgeName the name of the edge, one of {@link #EAST},
 | |
|      *     {@link #WEST}, {@link #NORTH} or {@link #SOUTH}.
 | |
|      * @param s the constraint to be set.
 | |
|      */
 | |
|     public void setConstraint(String edgeName, Spring s)
 | |
|     {
 | |
| 
 | |
|       if (edgeName.equals(SpringLayout.WEST))
 | |
|         setX(s);
 | |
|       else if (edgeName.equals(SpringLayout.NORTH))
 | |
|         setY(s);
 | |
|       else if (edgeName.equals(SpringLayout.EAST))
 | |
|         setEast(s);
 | |
|       else if (edgeName.equals(SpringLayout.SOUTH))
 | |
|         setSouth(s);
 | |
| 
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Sets the height-constraint.
 | |
|      *
 | |
|      * @param s the constraint to be set.
 | |
|      */
 | |
|     public void setHeight(Spring s)
 | |
|     {
 | |
|       height = s;
 | |
|       v = null;
 | |
|       if ((south != null) && (y != null) && (height != null))
 | |
|           south = null;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Sets the width-constraint.
 | |
|      *
 | |
|      * @param s the constraint to be set.
 | |
|      */
 | |
|     public void setWidth(Spring s)
 | |
|     {
 | |
|       width = s;
 | |
|       h = null;
 | |
|       if ((east != null) && (x != null) && (width != null))
 | |
|         east = null;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Sets the WEST-constraint.
 | |
|      *
 | |
|      * @param s the constraint to be set.
 | |
|      */
 | |
|     public void setX(Spring s)
 | |
|     {
 | |
|       x = s;
 | |
|       h = null;
 | |
|       if ((width != null) && (east != null) && (x != null))
 | |
|         width = null;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Sets the NORTH-constraint.
 | |
|      *
 | |
|      * @param s the constraint to be set.
 | |
|      */
 | |
|     public void setY(Spring s)
 | |
|     {
 | |
|       y = s;
 | |
|       v = null;
 | |
|       if ((height != null) && (south != null) && (y != null))
 | |
|         height = null;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Sets the SOUTH-constraint.
 | |
|      *
 | |
|      * @param s the constraint to be set.
 | |
|      */
 | |
|     public void setSouth(Spring s)
 | |
|     {
 | |
|       south = s;
 | |
|       v = null;
 | |
|       if ((height != null) && (south != null) && (y != null))
 | |
|         y = null;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Sets the EAST-constraint.
 | |
|      *
 | |
|      * @param s the constraint to be set.
 | |
|      */
 | |
|     public void setEast(Spring s)
 | |
|     {
 | |
|       east = s;
 | |
|       h = null;
 | |
|       if ((width != null) && (east != null) && (x != null))
 | |
|         x = null;
 | |
|     }
 | |
| 
 | |
|     public void dropCalcResult()
 | |
|     {
 | |
|       if (x != null)
 | |
|         x.setValue(Spring.UNSET);
 | |
|       if (y != null)
 | |
|         y.setValue(Spring.UNSET);
 | |
|       if (width != null)
 | |
|         width.setValue(Spring.UNSET);
 | |
|       if (height != null)
 | |
|         height.setValue(Spring.UNSET);
 | |
|       if (east != null)
 | |
|         east.setValue(Spring.UNSET);
 | |
|       if (south != null)
 | |
|         south.setValue(Spring.UNSET);
 | |
|       if (h != null)
 | |
|         h.setValue(Spring.UNSET);
 | |
|       if (v != null)
 | |
|         v.setValue(Spring.UNSET);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Creates a new SpringLayout.
 | |
|    */
 | |
|   public SpringLayout()
 | |
|   {
 | |
|     constraintsMap = new HashMap();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Adds a layout component and a constraint object to this layout.
 | |
|    * This method is usually only called by a {@link java.awt.Container}s add
 | |
|    * method.
 | |
|    *
 | |
|    * @param component the component to be added.
 | |
|    * @param constraint the constraint to be set.
 | |
|    */
 | |
|   public void addLayoutComponent(Component component, Object constraint)
 | |
|   {
 | |
|     constraintsMap.put(component, constraint);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Adds a layout component and a constraint object to this layout.
 | |
|    * This method is usually only called by a {@link java.awt.Container}s add
 | |
|    * method. This method does nothing, since SpringLayout does not manage
 | |
|    * String-indexed components.
 | |
|    *
 | |
|    * @param name  the name.
 | |
|    * @param c the component to be added.
 | |
|    */
 | |
|   public void addLayoutComponent(String name, Component c)
 | |
|   {
 | |
|     // do nothing here.
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * The trick to SpringLayout is that the network of Springs needs to
 | |
|    * completely created before the positioning results are generated.
 | |
|    *
 | |
|    * Using the springs directly during network creation will set their values
 | |
|    * before the network is completed, Using Deferred Springs during creation of
 | |
|    * the network allows all the edges to be connected together and the network
 | |
|    * to be created without resolving the Springs until their results need to be
 | |
|    * known, at which point the network is complete and the spring addition and
 | |
|    * and substitution calculations will work on a complete and valid network.
 | |
|    *
 | |
|    * @author Caolan McNamara (caolanm@redhat.com)
 | |
|    */
 | |
|   private static class DeferredSpring extends Spring
 | |
|   {
 | |
|     private SpringLayout sl;
 | |
|     private String edgeName;
 | |
|     private Component c;
 | |
| 
 | |
|     public String toString()
 | |
|     {
 | |
|       return "DeferredSpring of edge" + edgeName + " of " + "something";
 | |
|     }
 | |
| 
 | |
|     public DeferredSpring(SpringLayout s, String edge, Component component)
 | |
|     {
 | |
|         sl = s;
 | |
|         edgeName = edge;
 | |
|         c = component;
 | |
|     }
 | |
| 
 | |
|     private Spring resolveSpring()
 | |
|     {
 | |
|         return sl.getConstraints(c).getConstraint(edgeName);
 | |
|     }
 | |
| 
 | |
|     public int getMaximumValue()
 | |
|     {
 | |
|         return resolveSpring().getMaximumValue();
 | |
|     }
 | |
| 
 | |
|     public int getMinimumValue()
 | |
|     {
 | |
|         return resolveSpring().getMinimumValue();
 | |
|     }
 | |
| 
 | |
|     public int getPreferredValue()
 | |
|     {
 | |
|         return resolveSpring().getPreferredValue();
 | |
|     }
 | |
| 
 | |
|     public int getValue()
 | |
|     {
 | |
|         int nRet = resolveSpring().getValue();
 | |
|         if (nRet == Spring.UNSET)
 | |
|             nRet = getPreferredValue();
 | |
|         return nRet;
 | |
|     }
 | |
| 
 | |
|     public void setValue(int size)
 | |
|     {
 | |
|         resolveSpring().setValue(size);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   private abstract static class DeferredDimension extends Spring
 | |
|   {
 | |
|     private int value;
 | |
| 
 | |
|     public DeferredDimension()
 | |
|     {
 | |
|       value = Spring.UNSET;
 | |
|     }
 | |
| 
 | |
|     public void setValue(int val)
 | |
|     {
 | |
|       value = val;
 | |
|     }
 | |
| 
 | |
|     public int getValue()
 | |
|     {
 | |
|       if (value == Spring.UNSET)
 | |
|           return getPreferredValue();
 | |
|       return value;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   private static class DeferredWidth extends DeferredDimension
 | |
|   {
 | |
|     private Component c;
 | |
| 
 | |
| 
 | |
|     public DeferredWidth(Component component)
 | |
|     {
 | |
|         c = component;
 | |
|     }
 | |
| 
 | |
|     public String toString()
 | |
|     {
 | |
|       return "DeferredWidth of " + "something";
 | |
|     }
 | |
| 
 | |
|     //clip max to a value we can do meaningful calculation with
 | |
|     public int getMaximumValue()
 | |
|     {
 | |
|         int widget_width = c.getMaximumSize().width;
 | |
|         return Math.min(Short.MAX_VALUE, widget_width);
 | |
|     }
 | |
| 
 | |
|     public int getMinimumValue()
 | |
|     {
 | |
|         return c.getMinimumSize().width;
 | |
|     }
 | |
| 
 | |
|     public int getPreferredValue()
 | |
|     {
 | |
|         return c.getPreferredSize().width;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   private static class DeferredHeight extends DeferredDimension
 | |
|   {
 | |
|     private Component c;
 | |
| 
 | |
|     public String toString()
 | |
|     {
 | |
|         return "DeferredHeight of " + "something";
 | |
|     }
 | |
| 
 | |
|     public DeferredHeight(Component component)
 | |
|     {
 | |
|         c = component;
 | |
|     }
 | |
| 
 | |
|     //clip max to a value we can do meaningful calculations with it
 | |
|     public int getMaximumValue()
 | |
|     {
 | |
|         int widget_height = c.getMaximumSize().height;
 | |
|         return Math.min(Short.MAX_VALUE, widget_height);
 | |
|     }
 | |
| 
 | |
|     public int getMinimumValue()
 | |
|     {
 | |
|         return c.getMinimumSize().height;
 | |
|     }
 | |
| 
 | |
|     public int getPreferredValue()
 | |
|     {
 | |
|         return c.getPreferredSize().height;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns the constraint of the edge named by <code>edgeName</code>.
 | |
|    *
 | |
|    * @param c the component from which to get the constraint.
 | |
|    * @param edgeName the name of the edge, one of {@link #EAST},
 | |
|    *     {@link #WEST}, {@link #NORTH} or {@link #SOUTH}.
 | |
|    * @return the constraint of the edge <code>edgeName</code> of the
 | |
|    * component c.
 | |
|    */
 | |
|   public Spring getConstraint(String edgeName, Component c)
 | |
|   {
 | |
|     return new DeferredSpring(this, edgeName, c);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns the {@link Constraints} object associated with the specified
 | |
|    * component.
 | |
|    *
 | |
|    * @param c the component for which to determine the constraint.
 | |
|    * @return the {@link Constraints} object associated with the specified
 | |
|    *      component.
 | |
|    */
 | |
|   public SpringLayout.Constraints getConstraints(Component c)
 | |
|   {
 | |
|     Constraints constraints = (Constraints) constraintsMap.get(c);
 | |
| 
 | |
|     if (constraints == null)
 | |
|     {
 | |
|       constraints = new Constraints();
 | |
| 
 | |
|       constraints.setWidth(new DeferredWidth(c));
 | |
|       constraints.setHeight(new DeferredHeight(c));
 | |
|       constraints.setX(Spring.constant(0));
 | |
|       constraints.setY(Spring.constant(0));
 | |
| 
 | |
|       constraintsMap.put(c, constraints);
 | |
|     }
 | |
| 
 | |
|     return constraints;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns the X alignment of the Container <code>p</code>.
 | |
|    *
 | |
|    * @param p
 | |
|    *          the {@link java.awt.Container} for which to determine the X
 | |
|    *          alignment.
 | |
|    * @return always 0.0
 | |
|    */
 | |
|   public float getLayoutAlignmentX(Container p)
 | |
|   {
 | |
|     return 0.0F;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns the Y alignment of the Container <code>p</code>.
 | |
|    *
 | |
|    * @param p the {@link java.awt.Container} for which to determine the Y
 | |
|    *     alignment.
 | |
|    * @return always 0.0
 | |
|    */
 | |
|   public float getLayoutAlignmentY(Container p)
 | |
|   {
 | |
|     return 0.0F;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Recalculate a possibly cached layout.
 | |
|    */
 | |
|   public void invalidateLayout(Container p)
 | |
|   {
 | |
|     // nothing to do here yet
 | |
|   }
 | |
| 
 | |
|   private Constraints initContainer(Container p)
 | |
|   {
 | |
|     Constraints c = getConstraints(p);
 | |
| 
 | |
|     c.setX(Spring.constant(0));
 | |
|     c.setY(Spring.constant(0));
 | |
|     c.setWidth(null);
 | |
|     c.setHeight(null);
 | |
|     if (c.getEast() == null)
 | |
|       c.setEast(Spring.constant(0, 0, Integer.MAX_VALUE));
 | |
|     if (c.getSouth() == null)
 | |
|       c.setSouth(Spring.constant(0, 0, Integer.MAX_VALUE));
 | |
| 
 | |
|     return c;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Lays out the container <code>p</code>.
 | |
|    *
 | |
|    * @param p the container to be laid out.
 | |
|    */
 | |
|   public void layoutContainer(Container p)
 | |
|   {
 | |
|     java.awt.Insets insets = p.getInsets();
 | |
| 
 | |
|     Component[] components = p.getComponents();
 | |
| 
 | |
|     Constraints cs = initContainer(p);
 | |
|     cs.dropCalcResult();
 | |
| 
 | |
|     for (int index = 0 ; index < components.length; index++)
 | |
|     {
 | |
|         Component c = components[index];
 | |
|         getConstraints(c).dropCalcResult();
 | |
|     }
 | |
| 
 | |
|     int offsetX = p.getInsets().left;
 | |
|     int offsetY = p.getInsets().right;
 | |
| 
 | |
|     cs.getX().setValue(0);
 | |
|     cs.getY().setValue(0);
 | |
|     cs.getWidth().setValue(p.getWidth() - offsetX - insets.right);
 | |
|     cs.getHeight().setValue(p.getHeight() - offsetY - insets.bottom);
 | |
| 
 | |
|     for (int index = 0; index < components.length; index++)
 | |
|     {
 | |
|       Component c = components[index];
 | |
| 
 | |
|       Constraints constraints = getConstraints(c);
 | |
| 
 | |
|       int x = constraints.getX().getValue();
 | |
|       int y = constraints.getY().getValue();
 | |
|       int width = constraints.getWidth().getValue();
 | |
|       int height = constraints.getHeight().getValue();
 | |
| 
 | |
|       c.setBounds(x + offsetX, y + offsetY, width, height);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Calculates the maximum size of the layed out container. This
 | |
|    * respects the maximum sizes of all contained components.
 | |
|    *
 | |
|    * @param p the container to be laid out.
 | |
|    * @return the maximum size of the container.
 | |
|    */
 | |
|   public Dimension maximumLayoutSize(Container p)
 | |
|   {
 | |
|     java.awt.Insets insets = p.getInsets();
 | |
| 
 | |
|     Constraints cs = initContainer(p);
 | |
| 
 | |
|     int maxX = cs.getWidth().getMaximumValue() + insets.left + insets.right;
 | |
|     int maxY = cs.getHeight().getMaximumValue() + insets.top + insets.bottom;
 | |
| 
 | |
|     return new Dimension(maxX, maxY);
 | |
|   }
 | |
| 
 | |
| 
 | |
|   /**
 | |
|    * Calculates the minimum size of the layed out container. This
 | |
|    * respects the minimum sizes of all contained components.
 | |
|    *
 | |
|    * @param p the container to be laid out.
 | |
|    * @return the minimum size of the container.
 | |
|    */
 | |
|   public Dimension minimumLayoutSize(Container p)
 | |
|   {
 | |
|     java.awt.Insets insets = p.getInsets();
 | |
| 
 | |
|     Constraints cs = initContainer(p);
 | |
| 
 | |
|     int maxX = cs.getWidth().getMinimumValue() + insets.left + insets.right;
 | |
|     int maxY = cs.getHeight().getMinimumValue() + insets.top + insets.bottom;
 | |
| 
 | |
|     return new Dimension(maxX, maxY);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Calculates the preferred size of the layed out container. This
 | |
|    * respects the preferred sizes of all contained components.
 | |
|    *
 | |
|    * @param p the container to be laid out.
 | |
|    * @return the preferred size of the container.
 | |
|    */
 | |
|   public Dimension preferredLayoutSize(Container p)
 | |
|   {
 | |
|     java.awt.Insets insets = p.getInsets();
 | |
| 
 | |
|     Constraints cs = initContainer(p);
 | |
| 
 | |
|     int maxX = cs.getWidth().getPreferredValue() + insets.left + insets.right;
 | |
|     int maxY = cs.getHeight().getPreferredValue() + insets.top + insets.bottom;
 | |
| 
 | |
|     return new Dimension(maxX, maxY);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Attaches the edge <code>e1</code> of component <code>c1</code> to
 | |
|    * the edge <code>e2</code> of component <code>c2</code> width the
 | |
|    * fixed strut <code>pad</code>.
 | |
|    *
 | |
|    * @param e1 the edge of component 1.
 | |
|    * @param c1 the component 1.
 | |
|    * @param pad the space between the components in pixels.
 | |
|    * @param e2 the edge of component 2.
 | |
|    * @param c2 the component 2.
 | |
|    */
 | |
|   public void putConstraint(String e1, Component c1, int pad, String e2,
 | |
|                             Component c2)
 | |
|   {
 | |
|     putConstraint(e1, c1, Spring.constant(pad), e2, c2);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Attaches the edge <code>e1</code> of component <code>c1</code> to
 | |
|    * the edge <code>e2</code> of component <code>c2</code> width the
 | |
|    * {@link Spring} <code>s</code>.
 | |
|    *
 | |
|    * @param e1 the edge of component 1.
 | |
|    * @param c1 the component 1.
 | |
|    * @param s the space between the components as a {@link Spring} object.
 | |
|    * @param e2 the edge of component 2.
 | |
|    * @param c2 the component 2.
 | |
|    */
 | |
|   public void putConstraint(String e1, Component c1, Spring s, String e2,
 | |
|                             Component c2)
 | |
|   {
 | |
|     Constraints constraints1 = getConstraints(c1);
 | |
| 
 | |
|     Spring otherEdge = getConstraint(e2, c2);
 | |
|     constraints1.setConstraint(e1, Spring.sum(s, otherEdge));
 | |
| 
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Removes a layout component.
 | |
|    * @param c the layout component to remove.
 | |
|    */
 | |
|   public void removeLayoutComponent(Component c)
 | |
|   {
 | |
|     // do nothing here
 | |
|   }
 | |
| }
 |