< prev index next >

src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsButtonUI.java

Print this page

        

@@ -33,10 +33,12 @@
 import java.awt.*;
 
 import static com.sun.java.swing.plaf.windows.TMSchema.*;
 import static com.sun.java.swing.plaf.windows.TMSchema.Part.*;
 import static com.sun.java.swing.plaf.windows.XPStyle.Skin;
+import static java.lang.Boolean.FALSE;
+import static java.lang.Boolean.TRUE;
 import sun.awt.AppContext;
 
 
 /**
  * Windows button.

@@ -159,24 +161,55 @@
      * it took paint to run.  Obviously, this method can't be re-entered.
      */
     private Rectangle viewRect = new Rectangle();
 
     public void paint(Graphics g, JComponent c) {
+        AbstractButton b = (AbstractButton)c;
+        
+        if(isStateChangeAnimated(b)) {
+            boolean rollover = b.getModel().isRollover();
+            AnimationController anim = AnimationController.getAnimationController();
+            boolean wasRollover = b.getClientProperty("WindowsButtonUI.wasRollover") == TRUE;
+
+            if(rollover != wasRollover) {
+                State currentState = wasRollover?State.HOT:State.NORMAL;
+                State targetState = rollover?State.HOT:State.NORMAL;
+                anim.startAnimation(c, getXPButtonType(b), currentState, targetState, 250);
+            }
+            
+            b.putClientProperty("WindowsButtonUI.animateToNullState", !rollover);
+            b.putClientProperty("WindowsButtonUI.wasRollover", rollover);
+        }
+        
         if (XPStyle.getXP() != null) {
             WindowsButtonUI.paintXPButtonBackground(g, c);
         }
         super.paint(g, c);
     }
 
+    private static boolean isStateChangeAnimated(AbstractButton button) {
+        final String propName = "WindowsButtonUI.animateStateChange";
+        
+        if(button.getParent() instanceof JToolBar) {
+            JToolBar toolBar = (JToolBar)button.getParent();
+            if(toolBar.getClientProperty(propName)==TRUE)
+                return true;
+        }
+         
+        return button.getClientProperty(propName)==TRUE;
+    }
+    
     static Part getXPButtonType(AbstractButton b) {
         if(b instanceof JCheckBox) {
             return Part.BP_CHECKBOX;
         }
         if(b instanceof JRadioButton) {
             return Part.BP_RADIOBUTTON;
         }
         boolean toolbar = (b.getParent() instanceof JToolBar);
+        if(b.getClientProperty("WindowsButtonUI.displayAsInToolbar") == TRUE)
+            toolbar = true;
         return toolbar ? Part.TP_BUTTON : Part.BP_PUSHBUTTON;
     }
 
     static State getXPButtonState(AbstractButton b) {
         Part part = getXPButtonType(b);

@@ -276,11 +309,15 @@
                 dx += insets.left;
                 dy += insets.top;
                 dw -= (insets.left + insets.right);
                 dh -= (insets.top + insets.bottom);
             }
-            skin.paintSkin(g, dx, dy, dw, dh, state);
+            
+            if(c.getClientProperty("WindowsButtonUI.animateToNullState") == TRUE)
+                state = null;
+            
+            AnimationController.paintSkin(c, skin, g, dx, dy, dw, dh, state);
         }
     }
 
     /**
      * returns - b.getBorderInsets(c) if border is opaque
< prev index next >