mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			746 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			Java
		
	
	
	
			
		
		
	
	
			746 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			Java
		
	
	
	
| /* Spring.java --
 | |
|    Copyright (C) 2004 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.Dimension;
 | |
| 
 | |
| /**
 | |
|  * Calculates the space between component edges, that are layed out by
 | |
|  * {@link SpringLayout}.
 | |
|  * <p>
 | |
|  * A Spring defines a minimum, preferred and maximum distance for each edge
 | |
|  * (north, east, south, west) of a component.
 | |
|  * </p>
 | |
|  * However, springs are not static, their actual values are computed at
 | |
|  * runtime. That means, if a Spring C is defined as the sum of Spring A and
 | |
|  * Spring B, then the values (min, pref and max) are not calculated at
 | |
|  * creation of Spring C, but instead always when {@link #getValue} is
 | |
|  * called. So, when Spring A or Spring B changes, this is reflected in
 | |
|  * Spring C.
 | |
|  *
 | |
|  * @author Roman Kennke (roman@ontographics.com)
 | |
|  */
 | |
| public abstract class Spring
 | |
| {
 | |
| 
 | |
|   /** Indicates a not-set value. **/
 | |
|   public static final int UNSET = Integer.MIN_VALUE;
 | |
| 
 | |
|   /**
 | |
|    * Creates a new Spring object. This constructor is used by the static
 | |
|    * methods which create Springs.
 | |
|    */
 | |
|   protected Spring()
 | |
|   {
 | |
|     // Nothing to do here.
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Creates a Spring which min, pref and max values are all the same.
 | |
|    * These kind of Springs are 'struts'.
 | |
|    *
 | |
|    * @param val the constant for min, pref and max values.
 | |
|    * @return a Spring object with constant values for min, pref and max.
 | |
|    */
 | |
|   public static Spring constant(int val)
 | |
|   {
 | |
|     return new SimpleSpring(val, val, val);
 | |
|   }
 | |
| 
 | |
|   /** Creates a Spring which min, pref and max values are constants.
 | |
|    * @param min the constant for the minimum value.
 | |
|    * @param pref the constant for the preferred value.
 | |
|    * @param max the constant for the maximum value.
 | |
|    * @return a Spring object with constant values for min, pref and max.
 | |
|    */
 | |
|   public static Spring constant(int min, int pref, int max)
 | |
|   {
 | |
|     return new SimpleSpring(min, pref, max);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns the maximum value of the Spring.
 | |
|    *
 | |
|    * @return the maximum value.
 | |
|    */
 | |
|   public abstract int getMaximumValue();
 | |
| 
 | |
|   /**
 | |
|    * Returns the minimum value of this Spring.
 | |
|    *
 | |
|    * @return the minimum value.
 | |
|    */
 | |
|   public abstract int getMinimumValue();
 | |
| 
 | |
|   /**
 | |
|    * Return the preferred value of this Spring.
 | |
|    *
 | |
|    * @return the preferred value.
 | |
|    */
 | |
|   public abstract int getPreferredValue();
 | |
| 
 | |
|   /**
 | |
|    * Return the actual value of this Spring.
 | |
|    *
 | |
|    * @return the actual value of this Spring.
 | |
|    */
 | |
|   public abstract int getValue();
 | |
| 
 | |
|   /**
 | |
|    * Creates and returns a Spring, which always has the maximum values
 | |
|    * min = max(min_s1, min_s2), pref = max(pref_s1, pref_s2), max =
 | |
|    * max(max_s1, max_s2).
 | |
|    *
 | |
|    * @param s1 the first summand of the max Spring.
 | |
|    * @param s2 the second summand of the max Spring.
 | |
|    * @return a Spring which is max(s1, s2).
 | |
|    */
 | |
|   public static Spring max(Spring s1, Spring s2)
 | |
|   {
 | |
|     return new MaxSpring(s1, s2);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Creates and returns a Spring, which is always the negation of s.
 | |
|    * min = -min_s, pref = -pref_s, max = -max_pref.
 | |
|    *
 | |
|    * @param s the Spring to be negated.
 | |
|    * @return the negative of <code>s</code>.
 | |
|    */
 | |
|   public static Spring minus(Spring s)
 | |
|   {
 | |
|     return new MinusSpring(s);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Sets the actual value. If <code>value</code> is out of the (min, max)
 | |
|    * bounds, then the value is adjusted, so that is inside these bounds.
 | |
|    *
 | |
|    * @param value the value to be set.
 | |
|    */
 | |
|   public abstract void setValue(int value);
 | |
| 
 | |
|   private int getShrinkRange()
 | |
|   {
 | |
|     return (getPreferredValue() - getMinimumValue());
 | |
|   }
 | |
| 
 | |
|   private int getExpandRange()
 | |
|   {
 | |
|     return (getMaximumValue() - getPreferredValue());
 | |
|   }
 | |
| 
 | |
|   double getStrain()
 | |
|   {
 | |
|     int v = getValue();
 | |
|     int p = getPreferredValue();
 | |
|     int r = (v < p) ? getShrinkRange() : getExpandRange();
 | |
|     if (r == 0)
 | |
|       r = 1;
 | |
|     return (double)(v - p) / r;
 | |
|   }
 | |
| 
 | |
|   void setStrain(double strain)
 | |
|   {
 | |
|     int r = (strain < 0) ? getShrinkRange() : getExpandRange();
 | |
|     int v = (getPreferredValue() + (int)(strain * r));
 | |
|     setValue(v);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Creates and returns a Spring, which is always the sum of s1 and s2.
 | |
|    * min_sum = min_s1 + min_s2, pref_sum = pref_s1 + pref_s2, max_sum =
 | |
|    * max_s1 + max_s2.
 | |
|    *
 | |
|    * @param s1 the 1st summand of the sum Spring.
 | |
|    * @param s2 the 2nd summand of the sum Spring.
 | |
|    * @return a sum which is <code>s1 + s2</code>.
 | |
|    */
 | |
|   public static Spring sum(Spring s1, Spring s2)
 | |
|   {
 | |
|     return new AddSpring(s1, s2);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Return a new Spring which computes its values by scaling
 | |
|    * the values of another spring by a constant factor.  If the
 | |
|    * factor is negative, the minimum and maximum values of
 | |
|    * the argument spring will be interchanged.
 | |
|    * @param spring the spring to track
 | |
|    * @param factor the factor by which to scale
 | |
|    * @return a new multiplicative Spring
 | |
|    * @since 1.5
 | |
|    */
 | |
|   public static Spring scale(final Spring spring, final float factor)
 | |
|   {
 | |
|     if (spring == null)
 | |
|       throw new NullPointerException("spring argument is null");
 | |
|     return new Spring()
 | |
|     {
 | |
|       public int getMaximumValue()
 | |
|       {
 | |
|         return (int) ((factor < 0 ? spring.getMinimumValue()
 | |
|                             : spring.getMaximumValue())
 | |
|                       * factor);
 | |
|       }
 | |
| 
 | |
|       public int getMinimumValue()
 | |
|       {
 | |
|         return (int) ((factor < 0 ? spring.getMaximumValue()
 | |
|                                   : spring.getMinimumValue())
 | |
|                             * factor);
 | |
|       }
 | |
| 
 | |
|       public int getPreferredValue()
 | |
|       {
 | |
|         return (int) (spring.getPreferredValue() * factor);
 | |
|       }
 | |
| 
 | |
|       public int getValue()
 | |
|       {
 | |
|         return (int) (spring.getValue() * factor);
 | |
|       }
 | |
| 
 | |
|       public void setValue(int value)
 | |
|       {
 | |
|         spring.setValue((int) (value / factor));
 | |
|       }
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Return a new Spring which takes its values from the specified
 | |
|    * Component.  In particular, the maximum value is taken from
 | |
|    * the maximumSize, the minimum value is taken from the minimumSize,
 | |
|    * the preferred value is taken from the preferredSize, and the
 | |
|    * value is taken from the component's current size.  These values
 | |
|    * change as the component changes size.
 | |
|    * @param component the component
 | |
|    * @return a new Spring which tracks the component's width
 | |
|    * @since 1.5
 | |
|    */
 | |
|   public static Spring width(final Component component)
 | |
|   {
 | |
|     return new Spring()
 | |
|     {
 | |
|       public int getMaximumValue()
 | |
|       {
 | |
|         return component.getMaximumSize().width;
 | |
|       }
 | |
| 
 | |
|       public int getMinimumValue()
 | |
|       {
 | |
|         return component.getMinimumSize().width;
 | |
|       }
 | |
| 
 | |
|       public int getPreferredValue()
 | |
|       {
 | |
|         return component.getPreferredSize().width;
 | |
|       }
 | |
| 
 | |
|       public int getValue()
 | |
|       {
 | |
|         return component.getSize().width;
 | |
|       }
 | |
| 
 | |
|       public void setValue(int value)
 | |
|       {
 | |
|         Dimension d = component.getSize();
 | |
|         component.setSize(value, d.height);
 | |
|       }
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Return a new Spring which takes its values from the specified
 | |
|    * Component.  In particular, the maximum value is taken from
 | |
|    * the maximumSize, the minimum value is taken from the minimumSize,
 | |
|    * the preferred value is taken from the preferredSize, and the
 | |
|    * value is taken from the component's current size.  These values
 | |
|    * change as the component changes size.
 | |
|    * @param component the component
 | |
|    * @return a new Spring which tracks the component's height
 | |
|    * @since 1.5
 | |
|    */
 | |
|   public static Spring height(final Component component)
 | |
|   {
 | |
|     return new Spring()
 | |
|     {
 | |
|       public int getMaximumValue()
 | |
|       {
 | |
|         return component.getMaximumSize().height;
 | |
|       }
 | |
| 
 | |
|       public int getMinimumValue()
 | |
|       {
 | |
|         return component.getMinimumSize().height;
 | |
|       }
 | |
| 
 | |
|       public int getPreferredValue()
 | |
|       {
 | |
|         return component.getPreferredSize().height;
 | |
|       }
 | |
| 
 | |
|       public int getValue()
 | |
|       {
 | |
|         return component.getSize().height;
 | |
|       }
 | |
| 
 | |
|       public void setValue(int value)
 | |
|       {
 | |
|         Dimension d = component.getSize();
 | |
|         component.setSize(d.width, value);
 | |
|       }
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * A simple Spring, that holds constant values for min, pref and max.
 | |
|    *
 | |
|    * @author Roman Kennke (roman@ontographics.com)
 | |
|    */
 | |
|   private static final class SimpleSpring extends Spring
 | |
|   {
 | |
| 
 | |
|     /** The constant value for min. */
 | |
|     private final int min;
 | |
| 
 | |
|     /** The constant value for pref. */
 | |
|     private final int pref;
 | |
| 
 | |
|     /** The constant value for max. */
 | |
|     private final int max;
 | |
| 
 | |
|     /** The actual value of the spring. */
 | |
|     private int value;
 | |
| 
 | |
|     public String toString()
 | |
|     {
 | |
|       return "SimpleSpring of " + value;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Creates a new SimpleSpring object.
 | |
|      *
 | |
|      * @param newMin the constant minimum value.
 | |
|      * @param newPref the constant preferred value.
 | |
|      * @param newMax the constant maximum value.
 | |
|      */
 | |
|     public SimpleSpring(int newMin, int newPref, int newMax)
 | |
|     {
 | |
|       min = newMin;
 | |
|       pref = newPref;
 | |
|       max = newMax;
 | |
|       value = newPref;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns the maximum value of this Spring.
 | |
|      *
 | |
|      * @return the maximum value.
 | |
|      */
 | |
|     public int getMaximumValue()
 | |
|     {
 | |
|       return max;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns the minimum value of this Spring.
 | |
|      *
 | |
|      * @return the minimum value.
 | |
|      */
 | |
|     public int getMinimumValue()
 | |
|     {
 | |
|       return min;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns the preferred value of this Spring.
 | |
|      *
 | |
|      * @return the preferred value.
 | |
|      */
 | |
|     public int getPreferredValue()
 | |
|     {
 | |
|       return pref;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Return the actual current value of this Spring.
 | |
|      *
 | |
|      * @return the current value.
 | |
|      */
 | |
|     public int getValue()
 | |
|     {
 | |
|       if (value == Spring.UNSET)
 | |
|           return pref;
 | |
|       return value;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Sets the current value.
 | |
|      *
 | |
|      * @param val the value to be set.
 | |
|      */
 | |
|     public void setValue(int val)
 | |
|     {
 | |
|       value = val;
 | |
|     }
 | |
|   }
 | |
| 
 | |
| 
 | |
|   /**
 | |
|    * A Spring, that is the sum of two other Springs.
 | |
|    *
 | |
|    * @author Roman Kennke (roman@ontographics.com)
 | |
|    */
 | |
|   private static final class AddSpring extends Spring
 | |
|   {
 | |
| 
 | |
|     /** The springs, that are the 'operands' of this Spring. */
 | |
|     private final Spring s1;
 | |
|     private final Spring s2;
 | |
| 
 | |
|     /** The current value for this Spring. */
 | |
|     private int value;
 | |
| 
 | |
|     public String toString()
 | |
|     {
 | |
|       return "AddSpring of " + s1 + " and " + s2;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Creates a new AddSpring object.
 | |
|      *
 | |
|      * @param s1 the first operand.
 | |
|      * @param s2 the second operand.
 | |
|      */
 | |
|     protected AddSpring(Spring s1, Spring s2)
 | |
|     {
 | |
|       super();
 | |
|       this.s1 = s1;
 | |
|       this.s2 = s2;
 | |
|       value = Spring.UNSET;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns the maximum value of this Spring.
 | |
|      *
 | |
|      * @return the maximum value.
 | |
|      */
 | |
|     public int getMaximumValue()
 | |
|     {
 | |
|       int max1 = s1.getMaximumValue();
 | |
|       int max2 = s2.getMaximumValue();
 | |
|       return max1 + max2;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Return the minimum value of this Spring.
 | |
|      *
 | |
|      * @return the minimum value.
 | |
|      */
 | |
|     public int getMinimumValue()
 | |
|     {
 | |
|       int min1 = s1.getMinimumValue();
 | |
|       int min2 = s2.getMinimumValue();
 | |
|       return min1 + min2;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns the preferred value of this Spring.
 | |
|      *
 | |
|      * @return the preferred value.
 | |
|      */
 | |
|     public int getPreferredValue()
 | |
|     {
 | |
|       int pref1 = s1.getPreferredValue();
 | |
|       int pref2 = s2.getPreferredValue();
 | |
|       return pref1 + pref2;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns the actual current value of this Spring.
 | |
|      *
 | |
|      * @return the current value of this Spring.
 | |
|      */
 | |
|     public int getValue()
 | |
|     {
 | |
|       if (value == Spring.UNSET)
 | |
|         {
 | |
|           int val1 = s1.getValue();
 | |
|           int val2 = s2.getValue();
 | |
|           value = val1 + val2;
 | |
|         }
 | |
|       return value;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Sets the current value.
 | |
|      *
 | |
|      * @param val the value to be set.
 | |
|      */
 | |
|     public void setValue(int val)
 | |
|     {
 | |
|       if (val == Spring.UNSET)
 | |
|       {
 | |
|         if (value != Spring.UNSET)
 | |
|         {
 | |
|           s1.setValue(Spring.UNSET);
 | |
|           s2.setValue(Spring.UNSET);
 | |
|         }
 | |
|         value = Spring.UNSET;
 | |
|         return;
 | |
|       }
 | |
| 
 | |
|       value = val;
 | |
| 
 | |
|       //Spead the value over the two components
 | |
|       double fStrain = getStrain();
 | |
|       s1.setStrain(fStrain);
 | |
|       int remainder = val - s1.getValue();
 | |
|       s2.setValue(remainder);
 | |
|     }
 | |
| 
 | |
|   }
 | |
| 
 | |
| 
 | |
|   /**
 | |
|    * A Spring that is calculated as the negation of another Spring.
 | |
|    *
 | |
|    * @author Roman Kennke (roman@ontographics.com)
 | |
|    */
 | |
|   private static final class MinusSpring extends Spring
 | |
|   {
 | |
| 
 | |
|     /** The Spring from which to calculate the negation. */
 | |
|     private final Spring s;
 | |
| 
 | |
|     public String toString()
 | |
|     {
 | |
|       return "MinusSpring of " + s;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Creates a new MinusSpring object.
 | |
|      * @param s the Spring from which to calculate the negation.
 | |
|      */
 | |
|     protected MinusSpring(Spring s)
 | |
|     {
 | |
|       super();
 | |
|       this.s = s;
 | |
|     }
 | |
| 
 | |
|     /** Returns the maximum value of this Spring.
 | |
|      *
 | |
|      * @return the maximum value.
 | |
|      */
 | |
|     public int getMaximumValue()
 | |
|     {
 | |
|       return -s.getMinimumValue();
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns the minimum value of this Spring.
 | |
|      *
 | |
|      * @return the minimum value.
 | |
|      */
 | |
|     public int getMinimumValue()
 | |
|     {
 | |
|       return -s.getMaximumValue();
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns the preferred value of this Spring.
 | |
|      *
 | |
|      * @return the preferred value.
 | |
|      */
 | |
|     public int getPreferredValue()
 | |
|     {
 | |
|       return -s.getPreferredValue();
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns the current value of this Spring.
 | |
|      *
 | |
|      * @return the current value.
 | |
|      */
 | |
|     public int getValue()
 | |
|     {
 | |
|       return -s.getValue();
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Sets the current value.
 | |
|      *
 | |
|      * @param val the value to be set.
 | |
|      */
 | |
|     public void setValue(int val)
 | |
|     {
 | |
|       if (val == Spring.UNSET)
 | |
|         s.setValue(Spring.UNSET);
 | |
|       else
 | |
|         s.setValue(-val);
 | |
|     }
 | |
|   }
 | |
| 
 | |
| 
 | |
|   /**
 | |
|    * A Spring, that is calculated as the maximum of two Springs.
 | |
|    *
 | |
|    * @author Roman Kennke (roman@ontographics.com)
 | |
|    */
 | |
|   private static final class MaxSpring extends Spring
 | |
|   {
 | |
| 
 | |
|     /** The two other Springs from which to calculate the maximum. */
 | |
|     private final Spring s1;
 | |
|     private final Spring s2;
 | |
| 
 | |
|     public String toString()
 | |
|     {
 | |
|       return "MaxSpring of " + s1 + " and " + s2;
 | |
|     }
 | |
| 
 | |
|     /** The current value of this Spring. */
 | |
|     private int value;
 | |
| 
 | |
|     /**
 | |
|      * Creates a new MaxSpring object.
 | |
|      *
 | |
|      * @param s1 the 1st operand.
 | |
|      * @param s2 the 2nd operand.
 | |
|      */
 | |
|     protected MaxSpring(Spring s1, Spring s2)
 | |
|     {
 | |
|       super();
 | |
|       this.s1 = s1;
 | |
|       this.s2 = s2;
 | |
|       value = Spring.UNSET;
 | |
|     }
 | |
| 
 | |
| 
 | |
|     /**
 | |
|      * Returns the maximum value of this Spring.
 | |
|      *
 | |
|      * @return the maximum value.
 | |
|      */
 | |
|     public int getMaximumValue()
 | |
|     {
 | |
|       int max1 = s1.getMaximumValue();
 | |
|       int max2 = s2.getMaximumValue();
 | |
|       return Math.max(max1, max2);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns the minimum value of this Spring.
 | |
|      *
 | |
|      * @return the minimum value.
 | |
|      */
 | |
|     public int getMinimumValue()
 | |
|     {
 | |
|       int min1 = s1.getMinimumValue();
 | |
|       int min2 = s2.getMinimumValue();
 | |
|       return Math.max(min1, min2);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns the preferred value of this Spring.
 | |
|      *
 | |
|      * @return the preferred value.
 | |
|      */
 | |
|     public int getPreferredValue()
 | |
|     {
 | |
|       int pref1 = s1.getPreferredValue();
 | |
|       int pref2 = s2.getPreferredValue();
 | |
|       return Math.max(pref1, pref2);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns the actual value of this Spring.
 | |
|      *
 | |
|      * @return the current value.
 | |
|      */
 | |
|     public int getValue()
 | |
|     {
 | |
|       if (value == Spring.UNSET)
 | |
|       {
 | |
|           int val1 = s1.getValue();
 | |
|           int val2 = s2.getValue();
 | |
|           value = Math.max(val1, val2);
 | |
|       }
 | |
|       return value;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Sets the current value.
 | |
|      *
 | |
|      * @param val the value to be set.
 | |
|      */
 | |
|     public void setValue(int val)
 | |
|     {
 | |
|       if (val == Spring.UNSET)
 | |
|       {
 | |
|         if (value != Spring.UNSET)
 | |
|         {
 | |
|           s1.setValue(Spring.UNSET);
 | |
|           s2.setValue(Spring.UNSET);
 | |
|         }
 | |
|         value = Spring.UNSET;
 | |
|         return;
 | |
|       }
 | |
| 
 | |
|       value = val;
 | |
| 
 | |
|       int p1 = s1.getPreferredValue();
 | |
|       int p2 = s2.getPreferredValue();
 | |
| 
 | |
|       if (p1 < p2)
 | |
|       {
 | |
|         s1.setValue(Math.min(val, p1));
 | |
|         s2.setValue(val);
 | |
|       }
 | |
|       else
 | |
|       {
 | |
|         s1.setValue(val);
 | |
|         s2.setValue(Math.min(val, p2));
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| }
 |