This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[gui][patch] fyi: JProgressBar implemented


Hi,

Committing this to gui branch. Implements JProgressBar and
BasicProgressBarUI. Also moved some things around in BasicSliderUI.

Cheers,

Kim

2004-02-19  Kim Ho  <kho@redhat.com>

	* Makefile.am: Add BasicProgressBarUI
	* Makefile.in: Regenerate.
	* javax/swing/JProgressBar.java: 
	Re-implement.
	* javax/swing/plaf/basic/BasicLookAndFeel.java
	Add constants for JProgressBar.
	* javax/swing/plaf/basic/BasicProgressBarUI.java
	Implement.
	* javax/swing/plaf/basic/BasicSliderUI.java
	Change comments.
	(calculateGeometry): New method
	(paint): Remove unnecessary size calculations.
	
Index: Makefile.am
===================================================================
RCS file: /cvs/gcc/gcc/libjava/Makefile.am,v
retrieving revision 1.361.2.1
diff -u -r1.361.2.1 Makefile.am
--- Makefile.am	13 Feb 2004 16:21:44 -0000	1.361.2.1
+++ Makefile.am	19 Feb 2004 18:52:18 -0000
@@ -1295,6 +1295,7 @@
 javax/swing/plaf/basic/BasicListUI.java \
 javax/swing/plaf/basic/BasicOptionPaneUI.java \
 javax/swing/plaf/basic/BasicPanelUI.java \
+javax/swing/plaf/basic/BasicProgressBarUI.java \
 javax/swing/plaf/basic/BasicRootPaneUI.java \
 javax/swing/plaf/basic/BasicRadioButtonUI.java \
 javax/swing/plaf/basic/BasicScrollPaneUI.java \
Index: javax/swing/JProgressBar.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/javax/swing/JProgressBar.java,v
retrieving revision 1.3
diff -u -r1.3 JProgressBar.java
--- javax/swing/JProgressBar.java	9 Jan 2004 10:18:47 -0000	1.3
+++ javax/swing/JProgressBar.java	19 Feb 2004 18:52:18 -0000
@@ -47,442 +47,608 @@
 import javax.accessibility.AccessibleValue;
 import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;
+import javax.swing.event.EventListenerList;
 import javax.swing.plaf.ProgressBarUI;
 
+
 /**
- * JProgressBar
- * @author	Andrew Selkirk
- * @version	1.0
+ * <p>
+ * The ProgressBar is a widget that displays in two modes. In 
+ * determinate mode, it displays fills a percentage of its bar
+ * based on its current value. In indeterminate mode, it creates
+ * box and bounces it between its bounds.
+ * </p>
+ *
+ * <p>
+ * JProgressBars have the following properties:
+ * </p>
+ * 
+ * <table>
+ * <tr><th> Property         </td><th> Stored in   </td><th> Bound? </td></tr>
+ * <tr><td> borderPainted    </td><td> progressBar </td><td> yes    </td></tr>
+ * <tr><td> changeListeners  </td><td> progressBar </td><td> no     </td></tr>
+ * <tr><td> indeterminate    </td><td> progressBar </td><td> yes    </td></tr> 
+ * <tr><td> maximum          </td><td> model       </td><td> no     </td></tr>
+ * <tr><td> minimum          </td><td> model       </td><td> no     </td></tr>
+ * <tr><td> model            </td><td> progressBar </td><td> no     </td></tr> 
+ * <tr><td> orientation      </td><td> progressBar </td><td> yes    </td></tr>
+ * <tr><td> percentComplete  </td><td> progressBar </td><td> no     </td></tr>
+ * <tr><td> string           </td><td> progressBar </td><td> yes    </td></tr>
+ * <tr><td> stringPainted    </td><td> progressBar </td><td> yes    </td></tr>
+ * <tr><td> value            </td><td> model       </td><td> no     </td></tr>
+ * </table>
  */
-public class JProgressBar extends JComponent implements SwingConstants, Accessible
+public class JProgressBar extends JComponent implements SwingConstants,
+                                                        Accessible
 {
-
-	//-------------------------------------------------------------
-	// Classes ----------------------------------------------------
-	//-------------------------------------------------------------
-
-
-	/**
-	 * AccessibleJProgressBar
-	 */
-	protected class AccessibleJProgressBar extends AccessibleJComponent 
-			implements AccessibleValue {
-
-		//-------------------------------------------------------------
-		// Variables --------------------------------------------------
-		//-------------------------------------------------------------
-
-
-		//-------------------------------------------------------------
-		// Initialization ---------------------------------------------
-		//-------------------------------------------------------------
-
-		/**
-		 * Constructor AccessibleJProgressBar
-		 * @param component TODO
-		 */
-		protected AccessibleJProgressBar(JProgressBar component) {
-			super(component);
-			// TODO
-		} // AccessibleJProgressBar()
-
-
-		//-------------------------------------------------------------
-		// Methods ----------------------------------------------------
-		//-------------------------------------------------------------
-
-		/**
-		 * getAccessibleStateSet
-		 * @returns AccessibleStateSet
-		 */
-		public AccessibleStateSet getAccessibleStateSet() {
-			return null; // TODO
-		} // getAccessibleStateSet()
-
-		/**
-		 * getAccessibleRole
-		 * @returns AccessibleRole
-		 */
-		public AccessibleRole getAccessibleRole() {
-			return AccessibleRole.PROGRESS_BAR;
-		} // getAccessibleRole()
-
-		/**
-		 * getAccessibleValue
-		 * @returns AccessibleValue
-		 */
-		public AccessibleValue getAccessibleValue() {
-			return null; // TODO
-		} // getAccessibleValue()
-
-		/**
-		 * getCurrentAccessibleValue
-		 * @returns Number
-		 */
-		public Number getCurrentAccessibleValue() {
-			return null; // TODO
-		} // getCurrentAccessibleValue()
-
-		/**
-		 * setCurrentAccessibleValue
-		 * @param value0 TODO
-		 * @returns boolean
-		 */
-		public boolean setCurrentAccessibleValue(Number value0) {
-			return false; // TODO
-		} // setCurrentAccessibleValue()
-
-		/**
-		 * getMinimumAccessibleValue
-		 * @returns Number
-		 */
-		public Number getMinimumAccessibleValue() {
-			return null; // TODO
-		} // getMinimumAccessibleValue()
-
-		/**
-		 * getMaximumAccessibleValue
-		 * @returns Number
-		 */
-		public Number getMaximumAccessibleValue() {
-			return null; // TODO
-		} // getMaximumAccessibleValue()
-
-
-	} // AccessibleJProgressBar
-
-
-	//-------------------------------------------------------------
-	// Variables --------------------------------------------------
-	//-------------------------------------------------------------
-
-	/**
-	 * uiClassID
-	 */
-	private static final String uiClassID = "ProgressBarUI";
-
-	/**
-	 * orientation
-	 */
-	protected int orientation;
-
-	/**
-	 * paintBorder
-	 */
-	protected boolean paintBorder;
-
-	/**
-	 * model
-	 */
-	protected BoundedRangeModel model;
-
-	/**
-	 * progressString
-	 */
-	protected String progressString;
-
-	/**
-	 * paintString
-	 */
-	protected boolean paintString;
-
-	/**
-	 * changeEvent
-	 */
-	protected transient ChangeEvent changeEvent;
-
-	/**
-	 * changeListener
-	 */
-	protected ChangeListener changeListener;
-
-
-	//-------------------------------------------------------------
-	// Initialization ---------------------------------------------
-	//-------------------------------------------------------------
-
-	/**
-	 * Constructor JProgressBar
-	 */
-	public JProgressBar() {
-		// TODO
-	} // JProgressBar()
-
-	/**
-	 * Constructor JProgressBar
-	 * @param orientation TODO
-	 */
-	public JProgressBar(int orientation) {
-		// TODO
-	} // JProgressBar()
-
-	/**
-	 * Constructor JProgressBar
-	 * @param minimum TODO
-	 * @param maximum TODO
-	 */
-	public JProgressBar(int minimum, int maximum) {
-		// TODO
-	} // JProgressBar()
-
-	/**
-	 * Constructor JProgressBar
-	 * @param minimum TODO
-	 * @param maximum TODO
-	 * @param orientation TODO
-	 */
-	public JProgressBar(int minimum, int maximum, int orientation) {
-		// TODO
-	} // JProgressBar()
-
-	/**
-	 * Constructor JProgressBar
-	 * @param model TODO
-	 */
-	public JProgressBar(BoundedRangeModel model) {
-		// TODO
-	} // JProgressBar()
-
-
-	//-------------------------------------------------------------
-	// Methods ----------------------------------------------------
-	//-------------------------------------------------------------
-
-	/**
-	 * writeObject
-	 * @param stream TODO
-	 * @exception IOException TODO
-	 */
-	private void writeObject(ObjectOutputStream stream) throws IOException {
-		// TODO
-	} // writeObject()
-
-	/**
-	 * getValue
-	 * @returns int
-	 */
-	public int getValue() {
-		return 0; // TODO
-	} // getValue()
-
-	/**
-	 * setValue
-	 * @param value TODO
-	 */
-	public void setValue(int value) {
-		// TODO
-	} // setValue()
-
-	/**
-	 * paintBorder
-	 * @param graphics TODO
-	 */
-	protected void paintBorder(Graphics graphics) {
-		// TODO
-	} // paintBorder()
-
-	/**
-	 * getOrientation
-	 * @returns int
-	 */
-	public int getOrientation() {
-		return 0; // TODO
-	} // getOrientation()
-
-	/**
-	 * setOrientation
-	 * @param orientation TODO
-	 */
-	public void setOrientation(int orientation) {
-		// TODO
-	} // setOrientation()
-
-	/**
-	 * isStringPainted
-	 * @returns boolean
-	 */
-	public boolean isStringPainted() {
-		return false; // TODO
-	} // isStringPainted()
-
-	/**
-	 * setStringPainted
-	 * @param painted TODO
-	 */
-	public void setStringPainted(boolean painted) {
-		// TODO
-	} // setStringPainted()
-
-	/**
-	 * getString
-	 * @returns String
-	 */
-	public String getString() {
-		return null; // TODO
-	} // getString()
-
-	/**
-	 * setString
-	 * @param string TODO
-	 */
-	public void setString(String string) {
-		// TODO
-	} // setString()
-
-	/**
-	 * getPercentComplete
-	 * @returns double
-	 */
-	public double getPercentComplete() {
-		return 0.0; // TODO
-	} // getPercentComplete()
-
-	/**
-	 * isBorderPainted
-	 * @returns boolean
-	 */
-	public boolean isBorderPainted() {
-		return false; // TODO
-	} // isBorderPainted()
-
-	/**
-	 * setBorderPainted
-	 * @param painted TODO
-	 */
-	public void setBorderPainted(boolean painted) {
-		// TODO
-	} // setBorderPainted()
-
-	/**
-	 * getUI
-	 * @returns ProgressBarUI
-	 */
-	public ProgressBarUI getUI() {
-		return (ProgressBarUI) ui;
-	} // getUI()
-
-	/**
-	 * setUI
-	 * @param ui TODO
-	 */
-	public void setUI(ProgressBarUI ui) {
-		super.setUI(ui);
-		// TODO
-	} // setUI()
-
-	/**
-	 * updateUI
-	 */
-	public void updateUI() {
-		setUI((ProgressBarUI) UIManager.get(this));
-		invalidate();
-	} // updateUI()
-
-	/**
-	 * getUIClassID
-	 * @returns String
-	 */
-	public String getUIClassID() {
-		return uiClassID;
-	} // getUIClassID()
-
-	/**
-	 * createChangeListener
-	 * @returns ChangeListener
-	 */
-	protected ChangeListener createChangeListener() {
-		return null; // TODO
-	} // createChangeListener()
-
-	/**
-	 * addChangeListener
-	 * @param listener TODO
-	 */
-	public void addChangeListener(ChangeListener listener) {
-		// TODO
-	} // addChangeListener()
-
-	/**
-	 * removeChangeListener
-	 * @param listener TODO
-	 */
-	public void removeChangeListener(ChangeListener valulistener) {
-		// TODO
-	} // removeChangeListener()
-
-	/**
-	 * fireStateChanged
-	 */
-	protected void fireStateChanged() {
-		// TODO
-	} // fireStateChanged()
-
-	/**
-	 * getModel
-	 * @returns BoundedRangeModel
-	 */
-	public BoundedRangeModel getModel() {
-		return null; // TODO
-	} // getModel()
-
-	/**
-	 * setModel
-	 * @param model TODO
-	 */
-	public void setModel(BoundedRangeModel model) {
-		// TODO
-	} // setModel()
-
-	/**
-	 * getMinimum
-	 * @returns int
-	 */
-	public int getMinimum() {
-		return 0; // TODO
-	} // getMinimum()
-
-	/**
-	 * setMinimum
-	 * @param minimum TODO
-	 */
-	public void setMinimum(int minimum) {
-		// TODO
-	} // setMinimum()
-
-	/**
-	 * getMaximum
-	 * @returns int
-	 */
-	public int getMaximum() {
-		return 0; // TODO
-	} // getMaximum()
-
-	/**
-	 * setMaximum
-	 * @param maximum TODO
-	 */
-	public void setMaximum(int maximum) {
-		// TODO
-	} // setMaximum()
-
-	/**
-	 * paramString
-	 * @returns String
-	 */
-	protected String paramString() {
-		return null; // TODO
-	} // paramString()
-
-	/**
-	 * getAccessibleContext
-	 * @returns AccessibleContext
-	 */
-	public AccessibleContext getAccessibleContext() {
-		if (accessibleContext == null) {
-			accessibleContext = new AccessibleJProgressBar(this);
-		} // if
-		return accessibleContext;
-	} // getAccessibleContext()
-
-
-} // JProgressBar
+  /**
+   * AccessibleJProgressBar
+   */
+  protected class AccessibleJProgressBar extends AccessibleJComponent
+    implements AccessibleValue
+  {
+    /**
+     * Constructor AccessibleJProgressBar
+     *
+     * @param component TODO
+     */
+    protected AccessibleJProgressBar(JProgressBar component)
+    {
+      super(component);
+    } 
+
+    /**
+     * getAccessibleStateSet
+     *
+     * @return AccessibleStateSet
+     */
+    public AccessibleStateSet getAccessibleStateSet()
+    {
+      return null; 
+    } 
+
+    /**
+     * getAccessibleRole
+     *
+     * @return AccessibleRole
+     */
+    public AccessibleRole getAccessibleRole()
+    {
+      return AccessibleRole.PROGRESS_BAR;
+    } 
+
+    /**
+     * getAccessibleValue
+     *
+     * @return AccessibleValue
+     */
+    public AccessibleValue getAccessibleValue()
+    {
+      return null;
+    } 
+
+    /**
+     * getCurrentAccessibleValue
+     *
+     * @return Number
+     */
+    public Number getCurrentAccessibleValue()
+    {
+      return null;
+    } 
+
+    /**
+     * setCurrentAccessibleValue
+     *
+     * @param value0 TODO
+     *
+     * @return boolean
+     */
+    public boolean setCurrentAccessibleValue(Number value0)
+    {
+      return false; 
+    } 
+
+    /**
+     * getMinimumAccessibleValue
+     *
+     * @return Number
+     */
+    public Number getMinimumAccessibleValue()
+    {
+      return null; 
+    } 
+
+    /**
+     * getMaximumAccessibleValue
+     *
+     * @return Number
+     */
+    public Number getMaximumAccessibleValue()
+    {
+      return null; 
+    } 
+  } 
+
+  /** Fired in a PropertyChangeEvent when the "borderPainted" property changes. */
+  public static final String BORDER_PAINTED_CHANGED_PROPERTY = "borderPainted";
+  
+  /** Fired in a PropertyChangeEvent when the "orientation" property changes. */
+  public static final String ORIENTATION_CHANGED_PROPERTY = "orientation";
+  
+  /** Fired in a PropertyChangeEvent when the "string" property changes. */
+  public static final String STRING_CHANGED_PROPERTY = "string";
+  
+  /** Fired in a PropertyChangeEvent when the "stringPainted" property changes. */
+  public static final String STRING_PAINTED_CHANGED_PROPERTY = "stringPainted";
+  
+  /** Fired in a PropertyChangeEvent when the "indeterminate" property changes. */
+  public static final String INDETERMINATE_CHANGED_PROPERTY = "indeterminate";
+
+  /** A list of ChangeListeners registered with this ProgressBar. */
+  private transient EventListenerList changeListenerList;
+
+  /** Whether the ProgressBar is determinate. */
+  private transient boolean indeterminate = false;
+
+  /** The orientation of the ProgressBar */
+  protected int orientation = HORIZONTAL;
+
+  /** Whether borders should be painted. */
+  protected boolean paintBorder = true;
+
+  /** The model describing this ProgressBar. */
+  protected BoundedRangeModel model;
+
+  /** The string that is displayed by the ProgressBar. */
+  protected String progressString;
+
+  /** Whether the string should be painted. */
+  protected boolean paintString = false;
+
+  /** The static changeEvent passed to all ChangeListeners. */
+  protected transient ChangeEvent changeEvent;
+
+  /** The ChangeListener that listens to the model. */
+  protected ChangeListener changeListener;
+
+  /**
+   * Creates a new horizontally oriented JProgressBar object 
+   * with a minimum of 0 and a maximum of 100.
+   */
+  public JProgressBar()
+  {
+    this(0, 100, HORIZONTAL);
+  }
+
+  /**
+   * Creates a new JProgressBar object with a minimum of 0,
+   * a maximum of 100, and the given orientation.
+   *
+   * @param orientation The orientation of the JProgressBar.
+   */
+  public JProgressBar(int orientation)
+  {
+    this(0, 100, orientation);
+  }
+
+  /**
+   * Creates a new horizontally oriented JProgressBar object
+   * with the given minimum and maximum.
+   *
+   * @param minimum The minimum of the JProgressBar.
+   * @param maximum The maximum of the JProgressBar.
+   */
+  public JProgressBar(int minimum, int maximum)
+  {
+    this(minimum, maximum, HORIZONTAL);
+  }
+
+  /**
+   * Creates a new JProgressBar object with the given minimum,
+   * maximum, and orientation.
+   *
+   * @param minimum The minimum of the JProgressBar.
+   * @param maximum The maximum of the JProgressBar.
+   * @param orientation The orientation of the JProgressBar.
+   */
+  public JProgressBar(int minimum, int maximum, int orientation)
+  {
+    model = new DefaultBoundedRangeModel(minimum, 0, minimum, maximum);
+    this.orientation = orientation;
+    changeListener = createChangeListener();
+    model.addChangeListener(changeListener);
+    changeListenerList = new EventListenerList();
+    updateUI();
+  }
+
+  /**
+   * Creates a new horizontally oriented JProgressBar object 
+   * with the given model.
+   *
+   * @param model The model to be used with the JProgressBar.
+   */
+  public JProgressBar(BoundedRangeModel model)
+  {
+    this.model = model;
+  }
+
+  /**
+   * This method returns the current value of the JProgressBar.
+   *
+   * @return The current value of the JProgressBar.
+   */
+  public int getValue()
+  {
+    return model.getValue();
+  }
+
+  /**
+   * This method sets the value of the JProgressBar.
+   *
+   * @param value The value of the JProgressBar.
+   */
+  public void setValue(int value)
+  {
+    model.setValue(value);
+  }
+
+  /**
+   * This method paints the border of the JProgressBar
+   *
+   * @param graphics The graphics object to paint with.
+   */
+  protected void paintBorder(Graphics graphics)
+  {
+    getBorder().paintBorder(this, graphics, 0, 0,
+                            getWidth(),
+                            getHeight());
+  }
+
+  /**
+   * This method returns the orientation of the JProgressBar.
+   *
+   * @return The orientation of the JProgressBar.
+   */
+  public int getOrientation()
+  {
+    return orientation;
+  }
+
+  /**
+   * This method changes the orientation property. The orientation of the 
+   * JProgressBar can be either horizontal or vertical.
+   *
+   * @param orientation The orientation of the JProgressBar.
+   */
+  public void setOrientation(int orientation)
+  {
+    if (orientation != VERTICAL && orientation != HORIZONTAL)
+      throw new IllegalArgumentException("orientation must be one of VERTICAL or HORIZONTAL");
+    if (this.orientation != orientation)
+      {
+	int oldOrientation = this.orientation;
+	this.orientation = orientation;
+	firePropertyChange(ORIENTATION_CHANGED_PROPERTY, oldOrientation,
+	                   this.orientation);
+      }
+  }
+
+  /**
+   * This method returns whether the progressString will be painted.
+   *
+   * @return Whether the string is painted.
+   */
+  public boolean isStringPainted()
+  {
+    return paintString;
+  }
+
+  /**
+   * This method changes the stringPainted property.
+   *
+   * @param painted Whether the string is painted.
+   */
+  public void setStringPainted(boolean painted)
+  {
+    if (paintString != painted)
+      {
+	boolean oldPainted = paintString;
+	paintString = painted;
+	firePropertyChange(STRING_PAINTED_CHANGED_PROPERTY, oldPainted,
+	                   paintString);
+      }
+  }
+
+  /**
+   * This method returns the string that is painted if the 
+   * stringPainted property is set to true. If there is no
+   * string set, it will return a string containing the 
+   * JProgressBar's value as a percent.
+   *
+   * @return The string that is painted.
+   */
+  public String getString()
+  {
+    if (progressString != null)
+      return progressString;
+    else
+      return (int) (getPercentComplete() * 100) + "%";
+  }
+
+  /**
+   * This method changes the string property. The string
+   * given will be the one painted. If you want to 
+   * revert to the default string given, set the
+   * string to null.
+   *
+   * @param string The string to be painted.
+   */
+  public void setString(String string)
+  {
+    if ((string == null || progressString == null &&
+        string != progressString) || ! string.equals(progressString))
+      {
+	String oldString = progressString;
+	progressString = string;
+	firePropertyChange(STRING_CHANGED_PROPERTY, oldString, progressString);
+      }
+  }
+
+  /**
+   * This method returns the percent of the bar
+   * that is "complete". (This is the amount value / (max - min)).
+   *
+   * @return DOCUMENT ME!
+   */
+  public double getPercentComplete()
+  {
+    if (getMaximum() == getMinimum())
+      return 1.0;
+    else
+      return (double) (model.getValue() - model.getMinimum()) / (model
+                                                                 .getMaximum()
+             - model.getMinimum());
+  }
+
+  /**
+   * This method returns whether the border is painted.
+   *
+   * @return Whether the border is painted.
+   */
+  public boolean isBorderPainted()
+  {
+    return paintBorder;
+  }
+
+  /**
+   * This method changes the borderPainted property.
+   *
+   * @param painted Whether the border is painted.
+   */
+  public void setBorderPainted(boolean painted)
+  {
+    if (painted != paintBorder)
+      {
+	boolean oldPainted = paintBorder;
+	paintBorder = painted;
+	firePropertyChange(BORDER_PAINTED_CHANGED_PROPERTY, oldPainted,
+	                   paintBorder);
+      }
+  }
+
+  /**
+   * This method returns the JProgressBar's UI delegate.
+   *
+   * @return This JProgressBar's UI delegate.
+   */
+  public ProgressBarUI getUI()
+  {
+    return (ProgressBarUI) ui;
+  }
+
+  /**
+   * This method changes the UI property for this JProgressBar.
+   *
+   * @param ui The new UI delegate.
+   */
+  public void setUI(ProgressBarUI ui)
+  {
+    super.setUI(ui);
+  }
+
+  /**
+   * This method reverts the UI delegate for this JProgressBar
+   * to the default for this Look and Feel.
+   */
+  public void updateUI()
+  {
+    setUI((ProgressBarUI) UIManager.getUI(this));
+    invalidate();
+  }
+
+  /**
+   * This method returns the identifier to allow the UIManager
+   * to pick the correct class to act as the UI for
+   * this JProgressBar.
+   *
+   * @return The UIClassID: "ProgressBarUI".
+   */
+  public String getUIClassID()
+  {
+    return "ProgressBarUI";
+  }
+
+  /**
+   * This method returns a ChangeListener that gets registered
+   * model. By default, the ChangeListener, propagates the 
+   * ChangeEvents to the ChangeListeners of the JProgressBar.
+   *
+   * @return A new ChangeListener.
+   */
+  protected ChangeListener createChangeListener()
+  {
+    return new ChangeListener()
+      {
+	public void stateChanged(ChangeEvent ce)
+	{
+	  fireStateChanged();
+	}
+      };
+  }
+
+  /**
+   * This method adds a ChangeListener to this JProgressBar.
+   *
+   * @param listener The ChangeListener to add to this JProgressBar.
+   */
+  public void addChangeListener(ChangeListener listener)
+  {
+    changeListenerList.add(ChangeListener.class, listener);
+  }
+
+  /**
+   * This method removes a ChangeListener from this JProgressBar.
+   *
+   * @param listener The ChangeListener to remove from this JProgressBar.
+   */
+  public void removeChangeListener(ChangeListener listener)
+  {
+    changeListenerList.remove(ChangeListener.class, listener);
+  }
+
+  /**
+   * This method is called when the JProgressBar receives a ChangeEvent
+   * from its model. This simply propagates the event (changing the source
+   * to the JProgressBar) to the JProgressBar's listeners.
+   */
+  protected void fireStateChanged()
+  {
+    Object[] changeListeners = changeListenerList.getListenerList();
+    if (changeEvent == null)
+      changeEvent = new ChangeEvent(this);
+    for (int i = changeListeners.length - 2; i >= 0; i -= 2)
+      {
+	if (changeListeners[i] == ChangeListener.class)
+	  ((ChangeListener) changeListeners[i + 1]).stateChanged(changeEvent);
+      }
+  }
+
+  /**
+   * This method returns the model used with this JProgressBar.
+   *
+   * @return The model used with this JProgressBar.
+   */
+  public BoundedRangeModel getModel()
+  {
+    return model;
+  }
+
+  /**
+   * This method changes the model property for this JProgressBar.
+   *
+   * @param model The model to use with this JProgressBar.
+   */
+  public void setModel(BoundedRangeModel model)
+  {
+    if (model != this.model)
+      {
+	this.model = model;
+	fireStateChanged();
+      }
+  }
+
+  /**
+   * This method returns the minimum value of this JProgressBar.
+   *
+   * @return The minimum value of this JProgressBar.
+   */
+  public int getMinimum()
+  {
+    return model.getMinimum();
+  }
+
+  /**
+   * This method sets the minimum value of this JProgressBar.
+   *
+   * @param minimum The minimum value of this JProgressBar.
+   */
+  public void setMinimum(int minimum)
+  {
+    model.setMinimum(minimum);
+  }
+
+  /**
+   * This method returns the maximum value of this JProgressBar.
+   *
+   * @return The maximum value of this JProgressBar.
+   */
+  public int getMaximum()
+  {
+    return model.getMaximum();
+  }
+
+  /**
+   * This method sets the maximum value of this JProgressBar.
+   *
+   * @param maximum The maximum value of this JProgressBar.
+   */
+  public void setMaximum(int maximum)
+  {
+    model.setMaximum(maximum);
+  }
+
+  /**
+   * This method returns a string that can be used to 
+   * describe this JProgressBar. This method is usually
+   * only used for debugging purposes.
+   *
+   * @return A string that describes this JProgressBar.
+   */
+  protected String paramString()
+  {
+    return "JProgressBar";
+  }
+
+  /**
+   * This method changes the indeterminate property. If the
+   * JProgressBar is determinate, it paints a percentage
+   * of the bar described by its value. If it is indeterminate,
+   * it simply bounces a box between the ends of the bar; the 
+   * value of the JProgressBar is ignored.
+   *
+   * @param newValue Whether the JProgressBar is indeterminate.
+   */
+  public void setIndeterminate(boolean newValue)
+  {
+    if (indeterminate != newValue)
+      {
+	boolean olddeter = indeterminate;
+	indeterminate = newValue;
+	firePropertyChange(INDETERMINATE_CHANGED_PROPERTY, olddeter,
+	                   indeterminate);
+      }
+  }
+
+  /**
+   * This method returns whether the JProgressBar is indeterminate.
+   *
+   * @return Whether this JProgressBar is indeterminate.
+   */
+  public boolean isIndeterminate()
+  {
+    return indeterminate;
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  public AccessibleContext getAccessibleContext()
+  {
+    if (accessibleContext == null)
+      accessibleContext = new AccessibleJProgressBar(this);
+    return accessibleContext;
+  } 
+}
Index: javax/swing/plaf/basic/BasicLookAndFeel.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/javax/swing/plaf/basic/BasicLookAndFeel.java,v
retrieving revision 1.4.2.3
diff -u -r1.4.2.3 BasicLookAndFeel.java
--- javax/swing/plaf/basic/BasicLookAndFeel.java	17 Feb 2004 01:44:46 -0000	1.4.2.3
+++ javax/swing/plaf/basic/BasicLookAndFeel.java	19 Feb 2004 18:52:19 -0000
@@ -561,6 +561,8 @@
       "ProgressBar.foreground", new ColorUIResource(0, 0, 128),
       "ProgressBar.selectionBackground", new ColorUIResource(0, 0, 128),
       "ProgressBar.selectionForeground", new ColorUIResource(Color.lightGray),
+      "ProgressBar.repaintInterval", new Integer(250),
+      "ProgressBar.cycleTime", new Integer(6000),
       "RadioButton.background", new ColorUIResource(Color.lightGray),
       "RadioButton.border", new BorderUIResource.CompoundBorderUIResource(null,
                                                                           null),
Index: javax/swing/plaf/basic/BasicProgressBarUI.java
===================================================================
RCS file: javax/swing/plaf/basic/BasicProgressBarUI.java
diff -N javax/swing/plaf/basic/BasicProgressBarUI.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ javax/swing/plaf/basic/BasicProgressBarUI.java	19 Feb 2004 18:52:19 -0000
@@ -0,0 +1,820 @@
+/* BasicProgressBarUI.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.plaf.basic;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.FontMetrics;
+import java.awt.Graphics;
+import java.awt.Insets;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import javax.swing.JComponent;
+import javax.swing.JProgressBar;
+import javax.swing.SwingConstants;
+import javax.swing.SwingUtilities;
+import javax.swing.Timer;
+import javax.swing.UIDefaults;
+import javax.swing.UIManager;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import javax.swing.plaf.ComponentUI;
+import javax.swing.plaf.ProgressBarUI;
+
+
+/**
+ * The Basic Look and Feel UI delegate for the 
+ * JProgressBar.
+ */
+public class BasicProgressBarUI extends ProgressBarUI
+{
+  /**
+   * A helper class that listens for ChangeEvents 
+   * from the progressBar's model.
+   */
+  protected class ChangeHandler implements ChangeListener
+  {
+    /**
+     * Called every time the state of the model changes.
+     *
+     * @param e The ChangeEvent given by the model.
+     */
+    public void stateChanged(ChangeEvent e)
+    {
+      // Nothing to do but repaint.
+      progressBar.repaint();
+    }
+  }
+
+  /**
+   * This helper class is used to listen for 
+   * PropertyChangeEvents from the progressBar.
+   */
+  private class PropertyChangeHandler implements PropertyChangeListener
+  {
+    /**
+     * Called every time the properties of the 
+     * progressBar change.
+     *
+     * @param e The PropertyChangeEvent given by the progressBar.
+     */
+    public void propertyChange(PropertyChangeEvent e)
+    {
+      // Only need to listen for indeterminate changes.
+      // All other things are done on a repaint.
+      if (e.getPropertyName().equals(JProgressBar.INDETERMINATE_CHANGED_PROPERTY))
+	if (((Boolean) e.getNewValue()).booleanValue())
+	  startAnimationTimer();
+	else
+	  stopAnimationTimer();
+      else
+        progressBar.repaint();
+    }
+  }
+
+  /**
+   * This helper class is used to listen for 
+   * the animationTimer's intervals. On every interval,
+   * the bouncing box should move.
+   */
+  private class Animator implements ActionListener
+  {
+    /**
+     * Called every time the animationTimer reaches
+     * its interval.
+     *
+     * @param e The ActionEvent given by the timer.
+     */
+    public void actionPerformed(ActionEvent e)
+    {
+      // Incrementing the animation index will cause
+      // a repaint.
+      incrementAnimationIndex();
+    }
+  }
+
+  /** The timer used to move the bouncing box. */
+  private transient Timer animationTimer = new Timer();
+
+
+  // The total number of frames must be an even number.
+  // The total number of frames is calculated from
+  // the cycleTime and repaintInterval given by
+  // the basic L&F's defaults.
+  //
+  // +-----------------------------------------------+
+  // | frame0 | frame1 | frame2 | frame 3 | frame 4  |
+  // |        | frame7 | frame6 | frame 5 |          |
+  // +-----------------------------------------------+
+  
+  /** The current animation index. */
+  private transient int animationIndex;
+
+  /** The total number of frames.*/
+  private transient int numFrames;
+
+  /** The helper that moves the bouncing box. */
+  private transient Animator animation;
+
+  /** The helper that listens for property change events. */
+  private transient PropertyChangeHandler propertyListener;
+
+  /** The Listener for the model. */
+  protected ChangeListener changeListener;
+
+  /** The progressBar for this UI. */
+  protected JProgressBar progressBar;
+
+  /** The length of the cell. The cell is the painted part. */
+  private transient int cellLength;
+
+  /** The gap between cells. */
+  private transient int cellSpacing;
+
+  /** The color of the text when the bar is not over it.*/
+  private transient Color selectionBackground;
+
+  /** The color of the text when the bar is over it. */
+  private transient Color selectionForeground;
+
+  /**
+   * Creates a new BasicProgressBarUI object.
+   */
+  public BasicProgressBarUI()
+  {
+    super();
+  }
+
+  /**
+   * Creates a new BasicProgressBarUI for the component.
+   *
+   * @param x The JComponent to create the UI for.
+   *
+   * @return A new BasicProgressBarUI.
+   */
+  public static ComponentUI createUI(JComponent x)
+  {
+    return new BasicProgressBarUI();
+  }
+
+  /**
+   * This method returns the length of the bar (from the minimum)
+   * in pixels (or units that the Graphics object draws in) based
+   * on the progressBar's getPercentComplete() value.
+   *
+   * @param b The insets of the progressBar.
+   * @param width The width of the progressBar.
+   * @param height The height of the progressBar.
+   *
+   * @return The length of the bar that should be painted in pixels.
+   */
+  protected int getAmountFull(Insets b, int width, int height)
+  {
+    double percentDone = progressBar.getPercentComplete();
+    if (progressBar.getOrientation() == JProgressBar.HORIZONTAL)
+      return (int) (percentDone * (width - b.left - b.right));
+    else
+      return (int) (percentDone * (height - b.top - b.bottom));
+  }
+
+  /**
+   * The current animation index.
+   *
+   * @return The current animation index.
+   */
+  protected int getAnimationIndex()
+  {
+    return animationIndex;
+  }
+
+  /**
+   * This method returns the size and position of the bouncing box
+   * for the current animation index. It stores the values in the 
+   * given rectangle and returns it. It returns null if no box should
+   * be drawn.
+   *
+   * @param r The bouncing box rectangle.
+   *
+   * @return The bouncing box rectangle.
+   */
+  protected Rectangle getBox(Rectangle r)
+  {
+    if (!progressBar.isIndeterminate())
+      return null;
+    //numFrames has to be an even number as defined by spec.
+    int iterations = numFrames / 2 + 1;
+
+    double boxDependent;
+    double boxIndependent;
+
+    if (progressBar.getOrientation() == JProgressBar.HORIZONTAL)
+      {
+	Dimension dims = getPreferredInnerHorizontal();
+	boxDependent = (double) dims.width / iterations;
+	boxIndependent = dims.height;
+      }
+    else
+      {
+	Dimension dims = getPreferredInnerVertical();
+	boxDependent = (double) dims.height / iterations;
+	boxIndependent = dims.width;
+      }
+
+    Rectangle vr = new Rectangle();
+    SwingUtilities.calculateInnerArea(progressBar, vr);
+
+    int index = getAnimationIndex();
+    if (animationIndex > (numFrames + 1) / 2)
+      index = numFrames - getAnimationIndex();
+
+    if (progressBar.getOrientation() == JProgressBar.HORIZONTAL)
+      {
+	r.x = vr.x + (int) (index * boxDependent);
+	r.y = vr.y;
+	r.width = (int) boxDependent;
+	r.height = (int) boxIndependent;
+      }
+    else
+      {
+	index++;
+	r.x = vr.x;
+	r.y = vr.height - (int) (index * boxDependent) + vr.y;
+	r.width = (int) boxIndependent;
+	r.height = (int) boxDependent;
+      }
+
+    return r;
+  }
+
+  /**
+   * This method returns the length of the cells.
+   *
+   * @return The cell length.
+   */
+  protected int getCellLength()
+  {
+    return cellLength;
+  }
+
+  /**
+   * This method returns the spacing between cells.
+   *
+   * @return The cell gap.
+   */
+  protected int getCellSpacing()
+  {
+    return cellSpacing;
+  }
+
+  /**
+   * This method returns the maximum size of the JComponent.
+   * If it returns null, it is up to the LayoutManager
+   * to give it a size.
+   *
+   * @param c The component to find a maximum size for.
+   *
+   * @return The maximum size.
+   */
+  public Dimension getMaximumSize(JComponent c)
+  {
+    return getPreferredSize(c);
+  }
+
+  /**
+   * This method returns the minimum size of the JComponent.
+   * If it returns null, it is up to the LayoutManager to
+   * give it a size.
+   *
+   * @param c The component to find a minimum size for.
+   *
+   * @return The minimum size.
+   */
+  public Dimension getMinimumSize(JComponent c)
+  {
+    return getPreferredSize(c);
+  }
+
+  /**
+   * This method returns the preferred size of the inner
+   * rectangle (the bounds without the insets) if the
+   * progressBar is horizontal.
+   *
+   * @return The preferred size of the progressBar minus 
+   *         insets if it's horizontal.
+   */
+  protected Dimension getPreferredInnerHorizontal()
+  {
+    Rectangle vr = new Rectangle();
+
+    SwingUtilities.calculateInnerArea(progressBar, vr);
+
+    return new Dimension(vr.width, vr.height);
+  }
+
+  /**
+   * This method returns the preferred size of the inner
+   * rectangle (the bounds without insets) if the 
+   * progressBar is vertical.
+   *
+   * @return The preferred size of the progressBar minus
+   *         insets if it's vertical.
+   */
+  protected Dimension getPreferredInnerVertical()
+  {
+    Rectangle vr = new Rectangle();
+
+    SwingUtilities.calculateInnerArea(progressBar, vr);
+
+    return new Dimension(vr.width, vr.height);
+  }
+
+  /**
+   * This method returns the preferred size of the 
+   * given JComponent. If it returns null, then it
+   * is up to the LayoutManager to give it a size.
+   *
+   * @param c The component to find the preferred size for.
+   *
+   * @return The preferred size of the component.
+   */
+  public Dimension getPreferredSize(JComponent c)
+  {
+    // The only thing we need to worry about is
+    // the text size.
+    Graphics g = progressBar.getGraphics();
+
+    Insets insets = c.getInsets();
+
+    FontMetrics fm = g.getFontMetrics(c.getFont());
+
+    int textW = fm.stringWidth(progressBar.getString());
+    int textH = fm.getHeight();
+
+    g.dispose();
+
+    if (progressBar.getOrientation() == JProgressBar.HORIZONTAL)
+      {
+	if (textH < 20)
+	  textH = 20;
+	if (textW < 200)
+	  textW = 200;
+      }
+    else
+      {
+	if (textH < 200)
+	  textH = 200;
+	if (textW < 20)
+	  textW = 20;
+      }
+    textW += insets.left + insets.right;
+    textH += insets.top + insets.bottom;
+    return new Dimension(textW, textH);
+  }
+
+  /**
+   * This method returns the Color that the text is shown in when the bar is
+   * not over the text.
+   *
+   * @return The color of the text when the bar is not over it.
+   */
+  protected Color getSelectionBackground()
+  {
+    return selectionBackground;
+  }
+
+  /**
+   * This method returns the Color that the text is shown in  when the bar is
+   * over the text.
+   *
+   * @return The color of the text when the bar is over it.
+   */
+  protected Color getSelectionForeground()
+  {
+    return selectionForeground;
+  }
+
+  /**
+   * This method returns the point (the top left of the bounding box)
+   * where the text should be painted. 
+   *
+   * @param g The Graphics object to measure FontMetrics with.
+   * @param progressString The string to paint.
+   * @param x The x coordinate of the overall bounds box.
+   * @param y The y coordinate of the overall bounds box.
+   * @param width The width of the overall bounds box.
+   * @param height The height of the overall bounds box.
+   *
+   * @return The top left of the bounding box where text should be painted.
+   */
+  protected Point getStringPlacement(Graphics g, String progressString, int x,
+                                     int y, int width, int height)
+  {
+    Rectangle tr = new Rectangle();
+    Rectangle vr = new Rectangle(x, y, width, height);
+    Rectangle ir = new Rectangle();
+
+    Font f = g.getFont();
+    FontMetrics fm = g.getFontMetrics(f);
+
+    SwingUtilities.layoutCompoundLabel(progressBar, fm, progressString, null,
+                                       SwingConstants.CENTER,
+                                       SwingConstants.CENTER,
+                                       SwingConstants.CENTER,
+                                       SwingConstants.CENTER, vr, ir, tr, 0);
+    return new Point(tr.x, tr.y);
+  }
+
+  /**
+   * This method increments the animation index.
+   */
+  public void incrementAnimationIndex()
+  {
+    animationIndex++;
+    //numFrames is like string length, it should be named numFrames or something
+    if (animationIndex >= numFrames)
+      animationIndex = 0;
+    progressBar.repaint();
+  }
+
+  /**
+   * This method paints the progressBar. It delegates its responsibilities
+   * to paintDeterminate and paintIndeterminate.
+   *
+   * @param g The Graphics object to paint with.
+   * @param c The JComponent to paint.
+   */
+  public void paint(Graphics g, JComponent c)
+  {
+    if (! progressBar.isIndeterminate())
+      paintDeterminate(g, c);
+    else
+      paintIndeterminate(g, c);
+      
+    if (progressBar.isBorderPainted())
+      progressBar.getBorder().paintBorder(progressBar, g, 0, 0,
+                                          progressBar.getWidth(),
+					  progressBar.getHeight());
+  }
+
+  /**
+   * This method is called if the painting to be done is 
+   * for a determinate progressBar.
+   *
+   * @param g The Graphics object to paint with.
+   * @param c The JComponent to paint.
+   */
+  protected void paintDeterminate(Graphics g, JComponent c)
+  {
+    Color saved = g.getColor();
+    int space = getCellSpacing();
+    int len = getCellLength();
+    int max = progressBar.getMaximum();
+    int min = progressBar.getMinimum();
+    int value = progressBar.getValue();
+
+    Rectangle vr = new Rectangle();
+    SwingUtilities.calculateInnerArea(c, vr);
+
+    Rectangle or = c.getBounds();
+
+    Insets insets = c.getInsets();
+
+    int amountFull = getAmountFull(insets, or.width, or.height);
+
+    g.setColor(c.getBackground());
+    g.fill3DRect(vr.x, vr.y, vr.width, vr.height, false);
+
+    if (max != min && len != 0 && value > min)
+      {
+	int iterations = value / (space + len);
+
+	if (progressBar.getOrientation() == JProgressBar.HORIZONTAL)
+	  {
+	    double spaceInUnits = space * (double) vr.width / (max - min);
+	    double lenInUnits = len * (double) vr.width / (max - min);
+	    double currX = vr.x;
+
+	    g.setColor(c.getForeground());
+	    g.fill3DRect(vr.x, vr.y, amountFull, vr.height, true);
+
+	    g.setColor(c.getBackground());
+	    if (spaceInUnits != 0)
+	      {
+		for (int i = 0; i < iterations; i++)
+		  {
+		    currX += lenInUnits;
+		    g.fill3DRect((int) currX, vr.y, (int) spaceInUnits,
+		                 vr.height, true);
+		    currX += spaceInUnits;
+		  }
+	      }
+	  }
+	else
+	  {
+	    double currY = vr.y;
+	    double spaceInUnits = space * (double) vr.height / (max - min);
+	    double lenInUnits = len * (double) vr.height / (max - min);
+
+	    g.setColor(c.getForeground());
+	    g.fill3DRect(vr.x, vr.y + vr.height - amountFull, vr.width,
+	                 amountFull, true);
+
+	    g.setColor(c.getBackground());
+
+	    if (spaceInUnits != 0)
+	      {
+		for (int i = 0; i < iterations; i++)
+		  {
+		    currY -= lenInUnits + spaceInUnits;
+		    g.fill3DRect(vr.x, (int) currY, vr.width,
+		                 (int) spaceInUnits, true);
+		  }
+	      }
+	  }
+      }
+
+    if (progressBar.isStringPainted())
+      paintString(g, 0, 0, or.width, or.height, amountFull, insets);
+    g.setColor(saved);
+  }
+
+  /**
+   * This method is called if the painting to be done is for
+   * an indeterminate progressBar.
+   *
+   * @param g The Graphics object to paint with.
+   * @param c The JComponent to paint.
+   */
+  protected void paintIndeterminate(Graphics g, JComponent c)
+  {
+    //need to paint the box at it's current position. no text is painted since
+    //all we're doing is bouncing back and forth
+    Color saved = g.getColor();
+    Insets insets = c.getInsets();
+
+    Rectangle or = c.getBounds();
+    Rectangle vr = new Rectangle();
+    SwingUtilities.calculateInnerArea(c, vr);
+
+    g.setColor(c.getBackground());
+    g.fill3DRect(vr.x, vr.y, vr.width, vr.height, false);
+
+    Rectangle box = new Rectangle();
+    getBox(box);
+
+    g.setColor(c.getForeground());
+    g.fill3DRect(box.x, box.y, box.width, box.height, true);
+
+    if (progressBar.isStringPainted())
+      paintString(g, 0, 0, or.width, or.height,
+                  getAmountFull(insets, or.width, or.height), insets);
+
+    g.setColor(saved);
+  }
+
+  /**
+   * This method paints the string for the progressBar.
+   *
+   * @param g The Graphics object to paint with.
+   * @param x The x coordinate of the progressBar.
+   * @param y The y coordinate of the progressBar.
+   * @param width The width of the progressBar.
+   * @param height The height of the progressBar.
+   * @param amountFull The amount of the progressBar that has its bar filled.
+   * @param b The insets of the progressBar.
+   */
+  protected void paintString(Graphics g, int x, int y, int width, int height,
+                             int amountFull, Insets b)
+  {
+    // We want to place in the exact center of the bar.
+    Point placement = getStringPlacement(g, progressBar.getString(),
+                                         x + b.left, y + b.top,
+                                         width - b.left - b.right,
+                                         height - b.top - b.bottom);
+    Color saved = g.getColor();
+
+    // FIXME: The Color of the text should use selectionForeground and selectionBackground
+    // but that can't be done right now, so we'll use white in the mean time.
+    g.setColor(Color.WHITE);
+
+    FontMetrics fm = g.getFontMetrics(progressBar.getFont());
+
+    g.drawString(progressBar.getString(), placement.x,
+                 placement.y + fm.getAscent());
+
+    g.setColor(saved);
+  }
+
+  /**
+   * This method sets the current animation index. If the index
+   * is greater than the number of frames, it resets to 0.
+   *
+   * @param newValue The new animation index.
+   */
+  protected void setAnimationIndex(int newValue)
+  {
+    animationIndex = (newValue <= numFrames) ? newValue : 0;
+    progressBar.repaint();
+  }
+
+  /**
+   * This method sets the cell length.
+   *
+   * @param cellLen The cell length.
+   */
+  protected void setCellLength(int cellLen)
+  {
+    cellLength = cellLen;
+  }
+
+  /**
+   * This method sets the cell spacing.
+   *
+   * @param cellSpace The cell spacing.
+   */
+  protected void setCellSpacing(int cellSpace)
+  {
+    cellSpacing = cellSpace;
+  }
+
+  /**
+   * This method starts the animation timer. It is called
+   * when the propertyChangeListener detects that the progressBar
+   * has changed to indeterminate mode.
+   */
+  protected void startAnimationTimer()
+  {
+    if (animationTimer != null)
+      animationTimer.start();
+  }
+
+  /**
+   * This method stops the animation timer. It is called when
+   * the propertyChangeListener detects that the progressBar
+   * has changed to determinate mode.
+   */
+  protected void stopAnimationTimer()
+  {
+    if (animationTimer != null)
+      animationTimer.stop();
+    setAnimationIndex(0);
+  }
+
+  /**
+   * This method changes the settings for the progressBar to
+   * the defaults provided by the current Look and Feel.
+   */
+  protected void installDefaults()
+  {
+    UIDefaults defaults = UIManager.getLookAndFeelDefaults();
+
+    progressBar.setFont(defaults.getFont("ProgressBar.font"));
+    progressBar.setForeground(defaults.getColor("ProgressBar.foreground"));
+    progressBar.setBackground(defaults.getColor("ProgressBar.background"));
+    progressBar.setBorder(defaults.getBorder("ProgressBar.border"));
+
+    selectionForeground = defaults.getColor("ProgressBar.selectionForeground");
+    selectionBackground = defaults.getColor("ProgressBar.selectionBackground");
+    cellLength = defaults.getInt("ProgressBar.cellLength");
+    cellSpacing = defaults.getInt("ProgressBar.cellSpacing");
+
+    int repaintInterval = defaults.getInt("ProgressBar.repaintInterval");
+    int cycleTime = defaults.getInt("ProgressBar.cycleTime");
+
+    if (cycleTime % repaintInterval != 0
+        && (cycleTime / repaintInterval) % 2 != 0)
+      {
+	int div = (cycleTime / repaintInterval) + 2;
+	div /= 2;
+	div *= 2;
+	cycleTime = div * repaintInterval;
+      }
+    setAnimationIndex(0);
+    numFrames = cycleTime / repaintInterval;
+    animationTimer.setDelay(repaintInterval);
+  }
+
+  /**
+   * The method uninstalls any defaults that were
+   * set by the current Look and Feel.
+   */
+  protected void uninstallDefaults()
+  {
+    progressBar.setFont(null);
+    progressBar.setForeground(null);
+    progressBar.setBackground(null);
+
+    selectionForeground = null;
+    selectionBackground = null;
+  }
+
+  /**
+   * This method registers listeners to all the 
+   * components that this UI delegate needs to listen to.
+   */
+  protected void installListeners()
+  {
+    changeListener = new ChangeHandler();
+    propertyListener = new PropertyChangeHandler();
+    animation = new Animator();
+
+    progressBar.addChangeListener(changeListener);
+    progressBar.addPropertyChangeListener(propertyListener);
+    animationTimer.addActionListener(animation);
+  }
+
+  /**
+   * This method unregisters listeners to all the 
+   * components that were listened to.
+   */
+  protected void uninstallListeners()
+  {
+    progressBar.removeChangeListener(changeListener);
+    progressBar.removePropertyChangeListener(propertyListener);
+    animationTimer.removeActionListener(animation);
+
+    changeListener = null;
+    propertyListener = null;
+    animation = null;
+  }
+
+  /**
+   * This method installs the UI for the given JComponent.
+   * This includes setting up defaults and listeners as
+   * well as initializing any values or objects that
+   * the UI may need.
+   *
+   * @param c The JComponent that is having this UI installed.
+   */
+  public void installUI(JComponent c)
+  {
+    super.installUI(c);
+    if (c instanceof JProgressBar)
+      {
+	progressBar = (JProgressBar) c;
+
+	animationTimer = new Timer();
+	animationTimer.setRepeats(true);
+
+	installDefaults();
+	installListeners();
+      }
+  }
+
+  /**
+   * This method removes the UI for the given JComponent.
+   * This includes removing any listeners or defaults
+   * that the installUI may have set up.
+   *
+   * @param c The JComponent that is having this UI uninstalled.
+   */
+  public void uninstallUI(JComponent c)
+  {
+    super.uninstallUI(c);
+    uninstallListeners();
+    uninstallDefaults();
+
+    animationTimer = null;
+    progressBar = null;
+  }
+}
Index: javax/swing/plaf/basic/BasicSliderUI.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/javax/swing/plaf/basic/Attic/BasicSliderUI.java,v
retrieving revision 1.1.2.3
diff -u -r1.1.2.3 BasicSliderUI.java
--- javax/swing/plaf/basic/BasicSliderUI.java	17 Feb 2004 17:32:44 -0000	1.1.2.3
+++ javax/swing/plaf/basic/BasicSliderUI.java	19 Feb 2004 18:52:19 -0000
@@ -175,9 +175,7 @@
      */
     public void componentResized(ComponentEvent e)
     {
-      // The component being resized is equivalent to 
-      // our insets changing.
-      recalculateIfInsetsChanged();
+      calculateGeometry();
 
       slider.revalidate();
       slider.repaint();
@@ -229,6 +227,13 @@
       // Check for orientation changes.
       if (e.getPropertyName().equals(JSlider.ORIENTATION_CHANGED_PROPERTY))
 	recalculateIfOrientationChanged();
+      // elif the componentOrientation changes (this is a bound property,
+      // just undocumented) we change leftToRightCache. In Sun's 
+      // implementation, the LTR cache changes on a repaint. This is strange
+      // since there is no need to do so. We could events here and 
+      // update the cache. 
+      
+      // elif the border/insets change, we recalculateInsets.
       slider.repaint();
     }
   }
@@ -972,6 +977,22 @@
     else
       return getPreferredVerticalSize();
   }
+  
+  /**
+   * This method calculates all the sizes of the rectangles by delegating
+   * to the helper methods calculateXXXRect.
+   */
+   protected void calculateGeometry()
+   {
+     calculateFocusRect();
+     calculateContentRect();
+     calculateThumbSize();
+     calculateTrackBuffer();
+     calculateTrackRect();
+     calculateTickRect();
+     calculateLabelRect();
+     calculateThumbLocation();
+   }
 
   /**
    * This method calculates the size and position of the focusRect. This
@@ -1361,23 +1382,10 @@
    */
   public void paint(Graphics g, JComponent c)
   {
-    // FIXME: Unfortunately, with no way to tell that the 
-    // componentOrientation is switched from underneath us, 
-    // this still needs to stay for now.
-    calculateFocusRect();
-
-    calculateContentRect();
-    calculateThumbSize();
-    calculateTrackBuffer();
-    calculateTrackRect();
-    calculateThumbLocation();
-
-    calculateTickRect();
-    calculateLabelRect();
-
-    // FIXME: Move this somewhere more appropriate. Unfortunately, there
-    // are no events fired that we can receive.
+    // FIXME: Move this to propertyChangeEvent handler, when we get those.
     leftToRightCache = slider.getComponentOrientation() != ComponentOrientation.RIGHT_TO_LEFT;
+    // FIXME: This next line is only here because the above line is here.
+    calculateThumbLocation();
     
     if (slider.getPaintTrack())
       paintTrack(g);
@@ -1396,11 +1404,8 @@
    */
   protected void recalculateIfInsetsChanged()
   {
-    // The focus rectangle needs to be calculated again and since
-    // the focus rectangle is an outer bounds for all other rectangles,
-    // they must be recalculated as well.
-    // This method is able to calculate on component resize changes as well
-    // since the rectangles all need to be recalculated anyway.
+    // Examining a test program shows that either Sun calls private
+    // methods that we don't know about, or these don't do anything.
     calculateFocusRect();
 
     calculateContentRect();
@@ -1419,6 +1424,8 @@
    */
   protected void recalculateIfOrientationChanged()
   {
+    // Examining a test program shows that either Sun calls private
+    // methods that we don't know about, or these don't do anything.  
     calculateThumbSize();
     calculateTrackBuffer();
     calculateTrackRect();

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]