--- /home/cpdev/src/classpath/javax/swing/DefaultButtonModel.java	2005-07-13 17:32:45.000000000 +0000
+++ javax/swing/DefaultButtonModel.java	2005-06-30 05:35:08.000000000 +0000
@@ -51,7 +51,7 @@
 import javax.swing.event.EventListenerList;
 
 /**
- * The pUrpose of this class is to model the dynamic state of an abstract
+ * The purpose of this class is to model the dynamic state of an abstract
  * button. The concrete button type holding this state may be a a "toggle"
  * button (checkbox, radio button) or a "push" button (menu button, button).
  * If the model is disabled, only the "selected" property can be changed. An
@@ -116,6 +116,7 @@
    * this model.
    */
   protected EventListenerList listenerList = new EventListenerList();
+  ;
 
   /** The single ChangeEvent this model (re)uses to call its ChangeListeners. */
   protected ChangeEvent changeEvent = new ChangeEvent(this);
@@ -309,6 +310,55 @@
   }
 
   /**
+   * Helper method to fire a ChangeEvent with the model as the event's source.
+   *
+   * @param stateflag DOCUMENT ME!
+   * @param b DOCUMENT ME!
+   */
+  private void changeState(int stateflag, boolean b)
+  {
+    int oldstate = stateMask;
+    int newstate;
+
+    if (b)
+      newstate = oldstate | stateflag;
+    else
+      newstate = oldstate & ~ stateflag;
+
+    if (oldstate == newstate)
+      return;
+
+    if ((stateflag != SELECTED) && (stateflag != ENABLED)
+        && (stateMask & ENABLED) == 0)
+      return;
+
+    stateMask = newstate;
+
+    fireStateChanged();
+
+    if ((oldstate & SELECTED) == 0 && (newstate & SELECTED) == SELECTED)
+      {
+	fireItemStateChanged(new ItemEvent(this, ItemEvent.ITEM_STATE_CHANGED,
+	                                   null, ItemEvent.SELECTED));
+        if (group != null)
+          group.setSelected(this, true);
+      }
+
+    else if ((oldstate & SELECTED) == SELECTED && (newstate & SELECTED) == 0)
+      {
+	fireItemStateChanged(new ItemEvent(this, ItemEvent.ITEM_STATE_CHANGED,
+	                                   null, ItemEvent.DESELECTED));
+        if (group != null)
+          group.setSelected(this, false);
+      }
+
+    else if (((oldstate & ARMED) == ARMED && (oldstate & PRESSED) == PRESSED)
+             && ((newstate & ARMED) == ARMED && (newstate & PRESSED) == 0))
+      fireActionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED,
+                                          actionCommand));
+  }
+
+  /**
    * Get the value of the model's "armed" property.
    *
    * @return The current "armed" property
@@ -325,22 +375,7 @@
    */
   public void setArmed(boolean a)
   {
-    // if this call does not represent a CHANGE in state, then return
-    if ((a && isArmed()) || (!a && !isArmed()))
-      return;
-    
-    // cannot change ARMED state unless button is enabled
-    if (!isEnabled())
-      return;
-
-    // make the change
-    if (a)
-      stateMask = stateMask | ARMED;
-    else
-      stateMask = stateMask & (~ARMED);
-
-    // notify interested ChangeListeners
-    fireStateChanged();
+    changeState(ARMED, a);
   }
 
   /**
@@ -360,18 +395,7 @@
    */
   public void setEnabled(boolean e)
   {
-    // if this call does not represent a CHANGE in state, then return
-    if ((e && isEnabled()) || (!e && !isEnabled()))
-      return;
-
-    // make the change
-    if (e)
-      stateMask = stateMask | ENABLED;
-    else
-      stateMask = stateMask & (~ENABLED);
-
-    // notify interested ChangeListeners
-    fireStateChanged();
+    changeState(ENABLED, e);
   }
 
   /**
@@ -381,27 +405,7 @@
    */
   public void setPressed(boolean p)
   {
-    // if this call does not represent a CHANGE in state, then return
-    if ((p && isPressed()) || (!p && !isPressed()))
-      return;
-
-    // cannot changed PRESSED state unless button is enabled
-    if (!isEnabled())
-      return;
-
-    // make the change
-    if (p)
-      stateMask = stateMask | PRESSED;
-    else
-      stateMask = stateMask & (~PRESSED);
-
-    // notify interested ChangeListeners
-    fireStateChanged();
-
-    // if button is armed and was released, fire action event
-    if (!p && isArmed())
-      fireActionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED,
-                                          actionCommand));
+    changeState(PRESSED, p);
   }
 
   /**
@@ -421,22 +425,7 @@
    */
   public void setRollover(boolean r)
   {
-    // if this call does not represent a CHANGE in state, then return
-    if ((r && isRollover()) || (!r && !isRollover()))
-      return;
-    
-    // cannot set ROLLOVER property unless button is enabled
-    if (!isEnabled())
-      return;
-
-    // make the change
-    if (r)
-      stateMask = stateMask | ROLLOVER;
-    else
-      stateMask = stateMask & (~ROLLOVER);
-
-    // notify interested ChangeListeners
-    fireStateChanged();
+    changeState(ROLLOVER, r);
   }
 
   /**
@@ -446,34 +435,7 @@
    */
   public void setSelected(boolean s)
   {
-    // if this call does not represent a CHANGE in state, then return
-    if ((s && isSelected()) || (!s && !isSelected()))
-      return;
-    
-    // make the change
-    if (s)
-      stateMask = stateMask | SELECTED;
-    else
-      stateMask = stateMask & (~SELECTED);
-
-    // notify interested ChangeListeners
-    fireStateChanged();
-
-    // fire ItemStateChanged events
-    if (s)
-      {
-        fireItemStateChanged(new ItemEvent(this, ItemEvent.ITEM_STATE_CHANGED,
-                                           null, ItemEvent.SELECTED));
-        if (group != null)
-          group.setSelected(this, true);
-      }
-    else
-      {
-        fireItemStateChanged(new ItemEvent(this, ItemEvent.ITEM_STATE_CHANGED,
-                                           null, ItemEvent.DESELECTED));
-        if (group != null)
-          group.setSelected(this, false);
-      }
+    changeState(SELECTED, s);
   }
 
   /**
@@ -515,8 +477,8 @@
   {
     if (mnemonic != key)
       {
-        mnemonic = key;
-        fireStateChanged();
+	mnemonic = key;
+	fireStateChanged();
       }
   }
 
@@ -531,8 +493,8 @@
   {
     if (actionCommand != s)
       {
-        actionCommand = s;
-        fireStateChanged();
+	actionCommand = s;
+	fireStateChanged();
       }
   }
 
@@ -558,8 +520,8 @@
   {
     if (group != g)
       {
-        group = g;
-        fireStateChanged();
+	group = g;
+	fireStateChanged();
       }
   }
 
