This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
[gui][patch] fyi: JProgressBar implemented
- From: Kim Ho <kho at redhat dot com>
- To: java-patches <java-patches at gcc dot gnu dot org>
- Date: 19 Feb 2004 13:56:42 -0500
- Subject: [gui][patch] fyi: JProgressBar implemented
- Organization:
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();