As discussed on IRC, this patch improves the design by moving
Toggle-specific code to JToggleButton.ToggleButtonModel and by
eliminating the ugly helper method in DefaultButtonModel and instead
putting code in the proper place so that it can more easily adapted by
child classes.

Patch caused no regressions in javax/swing.

Patch is attached.

2005-07-13  Anthony Balkissoon  <[EMAIL PROTECTED]>

* javax/swing/DefaultButtonModel.java:
(changeState): Removed this helper method.
(setArmed): Replaced call to changeState by code specific to setArmed.
(setEnabled): Likewise, for setEnabled.
(setPressed): Likewise, for setPressed.
(setRollover): Likewise, for setRollover.
(setSelected): Likewise, for setSelected.
* javax/swing/JToggleButton.java:
(ToggleButtonModel.setPressed): Replaced call to super.setPressed with
Toggle-specific code.
(ToggleButtonModel.setSelected): New method.  Fire an ActionEvent in
addition to calling super.setSelected.

-Tony
Index: javax/swing/DefaultButtonModel.java
===================================================================
RCS file: /cvsroot/classpath/classpath/javax/swing/DefaultButtonModel.java,v
retrieving revision 1.21
diff -u -r1.21 DefaultButtonModel.java
--- javax/swing/DefaultButtonModel.java	12 Jul 2005 20:19:08 -0000	1.21
+++ javax/swing/DefaultButtonModel.java	13 Jul 2005 15:22:58 -0000
@@ -309,68 +309,6 @@
   }
 
   /**
-   * 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;
-    boolean toggle = (this instanceof JToggleButton.ToggleButtonModel);
-
-    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 the button is a toggle button then we fire action performed when
-        // the button changes state (selected/deselected), not when it changes
-        // from pressed to unpressed
-        if (toggle)
-          fireActionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED,
-                                              actionCommand));
-        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 the button is a toggle button then we fire action performed when
-        // the button changes state (selected/deselected), not when it changes
-        // from pressed to unpressed
-        if (toggle)
-          fireActionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED,
-                                              actionCommand));
-        if (group != null)
-          group.setSelected(this, false);
-      }
-
-    else if (((oldstate & ARMED) == ARMED && (oldstate & PRESSED) == PRESSED)
-             && ((newstate & ARMED) == ARMED && (newstate & PRESSED) == 0) && (!toggle))
-      fireActionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED,
-                                          actionCommand));
-  }
-
-  /**
    * Get the value of the model's "armed" property.
    *
    * @return The current "armed" property
@@ -387,7 +325,22 @@
    */
   public void setArmed(boolean a)
   {
-    changeState(ARMED, 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();
   }
 
   /**
@@ -407,7 +360,18 @@
    */
   public void setEnabled(boolean e)
   {
-    changeState(ENABLED, 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();
   }
 
   /**
@@ -417,7 +381,27 @@
    */
   public void setPressed(boolean p)
   {
-    changeState(PRESSED, 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));
   }
 
   /**
@@ -437,7 +421,22 @@
    */
   public void setRollover(boolean r)
   {
-    changeState(ROLLOVER, 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();
   }
 
   /**
@@ -447,7 +446,34 @@
    */
   public void setSelected(boolean s)
   {
-    changeState(SELECTED, 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);
+      }
   }
 
   /**
Index: javax/swing/JToggleButton.java
===================================================================
RCS file: /cvsroot/classpath/classpath/javax/swing/JToggleButton.java,v
retrieving revision 1.21
diff -u -r1.21 JToggleButton.java
--- javax/swing/JToggleButton.java	13 Jul 2005 01:18:42 -0000	1.21
+++ javax/swing/JToggleButton.java	13 Jul 2005 15:22:58 -0000
@@ -38,6 +38,7 @@
 
 package javax.swing;
 
+import java.awt.event.ActionEvent;
 import java.awt.event.ItemEvent;
 import java.awt.event.ItemListener;
 
@@ -132,20 +133,46 @@
     /**
      * Sets the pressed state of the button.  The selected state
      * of the button also changes follwing the button being pressed.
+     * Unlike DefaultButtonModel, does not fire an ActionEvent.
      *
      * @param b true if the button is pressed down.
      */
-    public void setPressed(boolean b)  
+    public void setPressed(boolean p)  
     {
+      // cannot change PRESSED state unless button is enabled
       if (! isEnabled())
         return;
       
-      super.setPressed(b);
+      // if this call does not represent a CHANGE in state, then return
+      if ((p && isPressed()) || (!p && !isPressed()))
+        return;
+      
+      // make the change
+      if (p)
+        stateMask = stateMask | PRESSED;
+      else
+        stateMask = stateMask & (~PRESSED);
+      
+      // notify interested ChangeListeners
+      fireStateChanged();
       
       // setPressed(false) == mouse release on us,
       // if we were armed, we flip the selected state.
-      if (!b && isArmed())
+      if (!p && isArmed())
         setSelected(! isSelected());
+    }
+
+    /**
+     * Sets the selected state of the button.  Unlike DefaultButtonModel,
+     * fires an ActionEvent.
+     *
+     * @param s true if button is selected
+     */
+    public void setSelected(boolean s)
+    {
+      super.setSelected(s);
+      fireActionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED,
+                                          actionCommand));
     }
   }
 
_______________________________________________
Classpath-patches mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/classpath-patches

Reply via email to