/* 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., 59 Temple Place, Suite 330, Boston, MA
02111-1307 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;

/**
 * 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 = -2147483648;

  /**
   * Creates a new Spring object. This constructor is used by the static
   * methods which create Springs.
   */
  protected Spring()
  {
  }

  /**
   * 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);

  /**
   * 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);
  }

  /**
   * 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;

    /**
     * Creates a new SimpleSpring object.
     *
     * @param min the constant minimum value.
     * @param pref the constant preferred value.
     * @param max the constant maximum value.
     */
    public SimpleSpring(int newMin, int newPref, int newMax)
    {
      min = newMin;
      pref = newPref;
      max = newMax;
      value = Spring.UNSET;
    }

    /**
     * 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)
        {
          value = pref;
        }
	    
      return value;
    }
	
    /**
     * Sets the current value.
     *
     * @param val the value to be set.
     */
    public void setValue(int val)
    {

      if (val > max)
        {
          value = max;
	}
      else if (val < min)
        {
          value = min;
	}
      else
        {
          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;

    /**
     * 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 > getMaximumValue())
        {
          value = getMaximumValue();
        }
      else if (val < getMinimumValue())
        {
          value = getMinimumValue();
        }
      else
        {
          value = val;
        }

    }
	
  }


  /**
   * 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;

    /** The current value of this Spring. */
    private int value;

    /**
     * Creates a new MinusSpring object.
     * @param s the Spring from which to calculate the negation.
     */
    protected MinusSpring(Spring s)
    {
      super();
      this.s = s;
      value = Spring.UNSET;
    }

    /** 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()
    {
      if (value == Spring.UNSET)
        {
	  value = -s.getValue();
	}
      return value;
    }

    /**
     * Sets the current value.
     *
     * @param val the value to be set.
     */
    public void setValue(int val)
    {
    
      if (val > getMaximumValue())
        {
          value = getMaximumValue();
	}
      else if (val < getMinimumValue())
	{
          value = getMinimumValue();
        }
      else
	{
	  value = 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;

    /** 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 > getMaximumValue())
        {
          value = getMaximumValue();
	}
      else if (val < getMinimumValue())
        {
          value = getMinimumValue();
        }
      else
        {
          value = val;
        }
    }
  }
}
