You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pivot.apache.org by gb...@apache.org on 2009/07/13 18:33:01 UTC

svn commit: r793618 - in /incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra: TerraExpanderSkin.java TerraRollupSkin.java TerraSheetSkin.java

Author: gbrown
Date: Mon Jul 13 16:33:01 2009
New Revision: 793618

URL: http://svn.apache.org/viewvc?rev=793618&view=rev
Log:
Resolve issue PIVOT-124 by updating TerraRollupSkin to call setExpanded() when the transition is complete; take advantage of Transition reversal in TerraExpanderSkin; minor updates to TerraSheetSkin.

Modified:
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraExpanderSkin.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraRollupSkin.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraSheetSkin.java

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraExpanderSkin.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraExpanderSkin.java?rev=793618&r1=793617&r2=793618&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraExpanderSkin.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraExpanderSkin.java Mon Jul 13 16:33:01 2009
@@ -50,21 +50,23 @@
 import org.apache.pivot.wtk.media.Image;
 import org.apache.pivot.wtk.skin.ContainerSkin;
 
-
 /**
- * Expander skin.
+ * Terra expander skin.
  *
  * @author gbrown
  */
 public class TerraExpanderSkin extends ContainerSkin
     implements ButtonPressListener, ExpanderListener {
+    /**
+     * Expand/collapse transition.
+     *
+     * @author gbrown
+     */
     public class ExpandTransition extends Transition {
-        private boolean expand;
         private Easing easing = new Quadratic();
 
-        public ExpandTransition(boolean expand, int duration, int rate) {
-            super(duration, rate, false);
-            this.expand = expand;
+        public ExpandTransition(boolean reversed) {
+            super(EXPAND_DURATION, EXPAND_RATE, false, reversed);
         }
 
         public float getScale() {
@@ -72,10 +74,10 @@
             int duration = getDuration();
 
             float scale;
-            if (expand) {
-                scale = easing.easeOut(elapsedTime, 0, 1, duration);
+            if (isReversed()) {
+                scale = easing.easeIn(elapsedTime, 0, 1, duration);
             } else {
-                scale = easing.easeIn(elapsedTime, 1, -1, duration);
+                scale = easing.easeOut(elapsedTime, 0, 1, duration);
             }
 
             return scale;
@@ -167,29 +169,6 @@
         }
     }
 
-    private class TitleBarMouseHandler
-        implements ComponentMouseButtonListener {
-        public boolean mouseDown(Component component, Mouse.Button button, int x, int y) {
-            return false;
-        }
-
-        public boolean mouseUp(Component component, Mouse.Button button, int x, int y) {
-            return false;
-        }
-
-        public boolean mouseClick(Component component, Mouse.Button button, int x, int y, int count) {
-            boolean consumed = false;
-
-            if (count == 2) {
-                Expander expander = (Expander)getComponent();
-                expander.setExpanded(!expander.isExpanded());
-                consumed = true;
-            }
-
-            return consumed;
-        }
-    }
-
     private Image collapseImage = new CollapseImage();
     private Image expandImage = new ExpandImage();
 
@@ -200,8 +179,6 @@
     private Label titleLabel = new Label();
     private ShadeButton shadeButton = null;
 
-    private TitleBarMouseHandler titleBarMouseHandler = new TitleBarMouseHandler();
-
     private Color titleBarBackgroundColor;
     private Color titleBarBorderColor;
     private Color shadeButtonColor;
@@ -209,11 +186,24 @@
     private Color borderColor;
     private Insets padding;
 
-    // Derived colors
     private Color titleBarBevelColor;
 
     private ExpandTransition expandTransition = null;
 
+    private ComponentMouseButtonListener titleBarMouseListener = new ComponentMouseButtonListener.Adapter() {
+        public boolean mouseClick(Component component, Mouse.Button button, int x, int y, int count) {
+            boolean consumed = false;
+
+            if (count == 2) {
+                Expander expander = (Expander)getComponent();
+                expander.setExpanded(!expander.isExpanded());
+                consumed = true;
+            }
+
+            return consumed;
+        }
+    };
+
     private static final int EXPAND_DURATION = 250;
     private static final int EXPAND_RATE = 30;
 
@@ -232,7 +222,7 @@
         titleBarBevelColor = TerraTheme.brighten(titleBarBackgroundColor);
 
         titleBarBoxPane = new BoxPane(Orientation.HORIZONTAL);
-        titleBarBoxPane.getComponentMouseButtonListeners().add(titleBarMouseHandler);
+        titleBarBoxPane.getComponentMouseButtonListeners().add(titleBarMouseListener);
 
         titleBarBoxPane.getStyles().put("horizontalAlignment", HorizontalAlignment.JUSTIFY);
         titleBarBoxPane.getStyles().put("verticalAlignment", VerticalAlignment.CENTER);
@@ -321,7 +311,7 @@
         if (content != null
             && (expander.isExpanded()
                 || (expandTransition != null
-                    && expandTransition.expand))) {
+                    && !expandTransition.isReversed()))) {
             // Title bar border is only drawn when content is non-null and
             // expander is expanded or expanding
             preferredHeight += 1;
@@ -363,7 +353,7 @@
 
             if (expander.isExpanded()
                 || (expandTransition != null
-                    && expandTransition.expand)) {
+                    && !expandTransition.isReversed())) {
                 // Title bar border is only drawn when expander is expanded
                 // or expanding
                 preferredHeight += 1;
@@ -397,7 +387,7 @@
 
         if ((expander.isExpanded()
             || (expandTransition != null
-                && expandTransition.expand))
+                && !expandTransition.isReversed()))
             && content != null) {
             int contentWidth = Math.max(width - (2 + padding.left + padding.right), 0);
             int contentHeight = Math.max(height - (3 + padding.top + padding.bottom + titleBarHeight), 0);
@@ -419,7 +409,7 @@
         Expander expander = (Expander)getComponent();
         if (expander.isExpanded()
             || (expandTransition != null
-                && expandTransition.expand)) {
+                && !expandTransition.isReversed())) {
             int titleBarHeight = titleBarBoxPane.getPreferredHeight(-1);
             graphics.setPaint(titleBarBorderColor);
             GraphicsUtilities.drawLine(graphics, 0, 1 + titleBarHeight, width, Orientation.HORIZONTAL);
@@ -611,13 +601,13 @@
         if (expander.isShowing()
             && expandTransition == null
             && expander.getContent() != null) {
-            final boolean expand = !expander.isExpanded();
-            shadeButton.setButtonData(expand ? collapseImage : expandImage);
-            expandTransition = new ExpandTransition(expand, EXPAND_DURATION, EXPAND_RATE);
+            final boolean expanded = expander.isExpanded();
+            shadeButton.setButtonData(expanded ? collapseImage : expandImage);
+            expandTransition = new ExpandTransition(expanded);
 
             expandTransition.start(new TransitionListener() {
                 public void transitionCompleted(Transition transition) {
-                    expander.setExpanded(expand);
+                    expander.setExpanded(!expanded);
                     expandTransition = null;
                 }
             });

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraRollupSkin.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraRollupSkin.java?rev=793618&r1=793617&r2=793618&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraRollupSkin.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraRollupSkin.java Mon Jul 13 16:33:01 2009
@@ -23,7 +23,6 @@
 import java.awt.geom.RoundRectangle2D;
 
 import org.apache.pivot.util.Vote;
-import org.apache.pivot.wtk.ApplicationContext;
 import org.apache.pivot.wtk.Component;
 import org.apache.pivot.wtk.ComponentMouseButtonListener;
 import org.apache.pivot.wtk.Cursor;
@@ -39,74 +38,54 @@
 import org.apache.pivot.wtk.skin.ComponentSkin;
 import org.apache.pivot.wtk.skin.RollupSkin;
 
-
 /**
- * Terra theme's rollup skin.
+ * Terra rollup skin.
  *
  * @author tvolkert
+ * @author gbrown
  */
 public class TerraRollupSkin extends RollupSkin {
     /**
-     * Provides expand/collapse animation.
+     * Expand/collapse transition.
      *
-     * @author tvolkert
+     * @author gbrown
      */
     public class ExpandTransition extends Transition {
-        private int height1;
-        private int height2;
-        private boolean collapse;
-
-        private int originalPreferredHeight;
-        private int height;
-
         private Easing easing = new Quadratic();
 
-        public ExpandTransition(int height1, int height2, boolean collapse, int duration, int rate) {
-            super(duration, rate, false);
-
-            this.height1 = height1;
-            this.height2 = height2;
-            this.collapse = collapse;
+        public ExpandTransition(boolean reversed) {
+            super(EXPAND_DURATION, EXPAND_RATE, false, reversed);
         }
 
-        public int getHeight() {
-            return height;
+        public float getScale() {
+            int elapsedTime = getElapsedTime();
+            int duration = getDuration();
+
+            float scale;
+            if (isReversed()) {
+                scale = easing.easeIn(elapsedTime, 0, 1, duration);
+            } else {
+                scale = easing.easeOut(elapsedTime, 0, 1, duration);
+            }
+
+            return scale;
         }
 
         @Override
         public void start(TransitionListener transitionListener) {
-            Rollup rollup = (Rollup)getComponent();
-            originalPreferredHeight = rollup.isPreferredHeightSet() ?
-                rollup.getPreferredHeight() : -1;
-
+            getComponent().setEnabled(false);
             super.start(transitionListener);
         }
 
         @Override
         public void stop() {
-            Rollup rollup = (Rollup)getComponent();
-            rollup.setPreferredHeight(originalPreferredHeight);
-
+            getComponent().setEnabled(true);
             super.stop();
         }
 
         @Override
         protected void update() {
-            float percentComplete = getPercentComplete();
-
-            if (percentComplete < 1f) {
-                int elapsedTime = getElapsedTime();
-                int duration = getDuration();
-
-                height = (int)(height1 + (height2 - height1) * percentComplete);
-                if (collapse) {
-                    height = (int)easing.easeIn(elapsedTime, height1, height2 - height1, duration);
-                } else {
-                    height = (int)easing.easeOut(elapsedTime, height1, height2 - height1, duration);
-                }
-
-                getComponent().setPreferredHeight(height);
-            }
+            invalidateComponent();
         }
     }
 
@@ -184,22 +163,19 @@
         }
     }
 
-    /**
-     * Responsible for expanding and collapsing the rollup when the user clicks
-     * on the heading component. This only applies if <tt>headingToggles</tt>
-     * is <tt>true</tt>.
-     *
-     * @author tvolkert
-     */
-    private class HeadingMouseButtonHandler implements ComponentMouseButtonListener {
-        public boolean mouseDown(Component component, Mouse.Button button, int x, int y) {
-            return false;
-        }
+    private RollupButton rollupButton = null;
 
-        public boolean mouseUp(Component component, Mouse.Button button, int x, int y) {
-            return false;
-        }
+    // Styles
+    private Color buttonColor;
+    private int spacing;
+    private int buffer;
+    private boolean justify;
+    private boolean headingToggles;
+    private boolean useBullet;
 
+    private ExpandTransition expandTransition = null;
+
+    private ComponentMouseButtonListener headingMouseButtonListener = new ComponentMouseButtonListener.Adapter() {
         public boolean mouseClick(Component component, Mouse.Button button, int x, int y, int count) {
             boolean consumed = false;
 
@@ -211,25 +187,7 @@
 
             return consumed;
         }
-    }
-
-    // Skin components
-    private RollupButton rollupButton = null;
-
-    // Internal handlers
-    private HeadingMouseButtonHandler headingMouseButtonHandler = new HeadingMouseButtonHandler();
-
-    // Animation support
-    private ExpandTransition expandTransition = null;
-    private ExpandTransition collapseTransition = null;
-
-    // Styles
-    private Color buttonColor;
-    private int spacing;
-    private int buffer;
-    private boolean justify;
-    private boolean headingToggles;
-    private boolean useBullet;
+    };
 
     private static final int EXPAND_DURATION = 250;
     private static final int EXPAND_RATE = 30;
@@ -267,7 +225,7 @@
         // Uninitialize state
         Component heading = rollup.getHeading();
         if (heading != null) {
-            heading.getComponentMouseButtonListeners().remove(headingMouseButtonHandler);
+            heading.getComponentMouseButtonListeners().remove(headingMouseButtonListener);
         }
 
         // Remove the rollup button
@@ -290,7 +248,10 @@
             preferredWidth = heading.getPreferredWidth(-1);
         }
 
-        if (rollup.isExpanded() && content != null) {
+        if (content != null
+            && (rollup.isExpanded()
+                || (expandTransition != null
+                    && !expandTransition.isReversed()))) {
             preferredWidth = Math.max(preferredWidth, content.getPreferredWidth(-1));
         }
 
@@ -302,23 +263,6 @@
     @Override
     public int getPreferredHeight(int width) {
         Rollup rollup = (Rollup)getComponent();
-        return getPreferredHeight(width, rollup.isExpanded());
-    }
-
-    /**
-     * Gets the preferred height of the rollup assuming the specified expansion
-     * state. We use this to transition from one expansion state to another
-     * because it allows us to have foreknowledge of the height value to which
-     * we are transitioning.
-     *
-     * @param width
-     * The width constraint.
-     *
-     * @param expanded
-     * The supposed expansion state.
-     */
-    private int getPreferredHeight(int width, boolean expanded) {
-        Rollup rollup = (Rollup)getComponent();
 
         Component heading = rollup.getHeading();
         Component content = rollup.getContent();
@@ -336,8 +280,15 @@
             preferredHeight += heading.getPreferredHeight(width);
         }
 
-        if (expanded && content != null) {
-            preferredHeight += spacing + content.getPreferredHeight(width);
+        if (content != null) {
+            if (expandTransition == null) {
+                if (rollup.isExpanded()) {
+                    preferredHeight += spacing + content.getPreferredHeight(width);
+                }
+            } else {
+                float scale = expandTransition.getScale();
+                preferredHeight += (int)(scale * (spacing + content.getPreferredHeight(width)));
+            }
         }
 
         preferredHeight = Math.max(preferredHeight, rollupButton.getPreferredHeight(-1));
@@ -377,7 +328,9 @@
         }
 
         if (content != null) {
-            if (rollup.isExpanded()) {
+            if (rollup.isExpanded()
+                || (expandTransition != null
+                    && !expandTransition.isReversed())) {
                 int contentWidth, contentHeight;
                 if (justify) {
                     contentWidth = justifiedWidth;
@@ -397,6 +350,7 @@
         }
 
         y = (heading == null ? 0 : (heading.getHeight() - rollupButtonSize.height) / 2 + 1);
+
         rollupButton.setLocation(0, y);
     }
 
@@ -478,13 +432,13 @@
     @Override
     public void headingChanged(Rollup rollup, Component previousHeading) {
         if (previousHeading != null) {
-            previousHeading.getComponentMouseButtonListeners().remove(headingMouseButtonHandler);
+            previousHeading.getComponentMouseButtonListeners().remove(headingMouseButtonListener);
         }
 
         Component heading = rollup.getHeading();
 
         if (heading != null) {
-            heading.getComponentMouseButtonListeners().add(headingMouseButtonHandler);
+            heading.getComponentMouseButtonListeners().add(headingMouseButtonListener);
         }
 
         invalidateComponent();
@@ -505,49 +459,30 @@
         }
     }
 
-    // RollupStateListener methods
-
+    // Rollup state events
     @Override
     public Vote previewExpandedChange(final Rollup rollup) {
-        Vote vote = Vote.APPROVE;
+        Vote vote;
 
-        if (rollup.getDisplay() != null) {
-            if (rollup.isExpanded()) {
-                // Start a collapse transition, return false, and set the
-                // expanded state when the transition is complete
-                if (collapseTransition == null) {
-                    int duration = EXPAND_DURATION;
-                    int height1 = getHeight();
-
-                    if (expandTransition != null) {
-                        // Stop the expand transition
-                        expandTransition.stop();
-
-                        // Record its progress so we can reverse it at the right point
-                        duration = expandTransition.getElapsedTime();
-                        height1 = expandTransition.getHeight();
-
-                        expandTransition = null;
-                    }
-
-                    if (duration > 0) {
-                        int height2 = getPreferredHeight(-1, false);
-
-                        collapseTransition = new ExpandTransition(height1, height2,
-                            true, duration, EXPAND_RATE);
-                        collapseTransition.start(new TransitionListener() {
-                            public void transitionCompleted(Transition transition) {
-                                rollup.setExpanded(false);
-                                collapseTransition = null;
-                            }
-                        });
-
-                        vote = Vote.DEFER;
-                    }
-                } else {
-                    vote = collapseTransition.isRunning() ? Vote.DEFER : Vote.APPROVE;
+        if (rollup.isShowing()
+            && expandTransition == null
+            && rollup.getContent() != null) {
+            final boolean expanded = rollup.isExpanded();
+            expandTransition = new ExpandTransition(expanded);
+
+            expandTransition.start(new TransitionListener() {
+                public void transitionCompleted(Transition transition) {
+                    rollup.setExpanded(!expanded);
+                    expandTransition = null;
                 }
-            }
+            });
+        }
+
+        if (expandTransition == null
+            || !expandTransition.isRunning()) {
+            vote = Vote.APPROVE;
+        } else {
+            vote = Vote.DEFER;
         }
 
         return vote;
@@ -556,36 +491,19 @@
     @Override
     public void expandedChangeVetoed(Rollup rollup, Vote reason) {
         if (reason == Vote.DENY
-            && collapseTransition != null) {
-            collapseTransition.stop();
-            collapseTransition = null;
+            && expandTransition != null) {
+            // NOTE We stop, rather than end, the transition so the completion
+            // event isn't fired; if the event fires, the listener will set
+            // the expanded state
+            expandTransition.stop();
+            expandTransition = null;
+
+            invalidateComponent();
         }
     }
 
     @Override
     public void expandedChanged(final Rollup rollup) {
         invalidateComponent();
-
-        if (rollup.getDisplay() != null) {
-            if (rollup.isExpanded()) {
-                // Start an expansion transition
-                int height1 = getHeight();
-                int height2 = getPreferredHeight(-1, true);
-
-                expandTransition = new ExpandTransition(height1, height2,
-                    false, EXPAND_DURATION, EXPAND_RATE);
-                expandTransition.start(new TransitionListener() {
-                    public void transitionCompleted(Transition transition) {
-                        ApplicationContext.queueCallback(new Runnable() {
-                            public void run() {
-                                rollup.scrollAreaToVisible(0, 0, rollup.getWidth(), rollup.getHeight());
-                            }
-                        });
-
-                        expandTransition = null;
-                    }
-                });
-            }
-        }
     }
 }

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraSheetSkin.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraSheetSkin.java?rev=793618&r1=793617&r2=793618&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraSheetSkin.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraSheetSkin.java Mon Jul 13 16:33:01 2009
@@ -49,24 +49,15 @@
  * @author tvolkert
  */
 public class TerraSheetSkin extends WindowSkin implements SheetStateListener {
-    public class WindowStateTransition extends Transition {
-        private boolean close;
-
-        public WindowStateTransition(boolean close) {
-            super(TRANSITION_DURATION, TRANSITION_RATE, false, close);
-            this.close = close;
+    public class OpenTransition extends Transition {
+        public OpenTransition(boolean reversed) {
+            super(TRANSITION_DURATION, TRANSITION_RATE, false, reversed);
         }
 
         @Override
         public void update() {
             invalidateComponent();
         }
-
-        @Override
-        public void reverse() {
-            super.reverse();
-            close = !close;
-        }
     }
 
     private Color borderColor;
@@ -76,7 +67,7 @@
     // Derived colors
     private Color bevelColor;
 
-    private WindowStateTransition windowStateTransition = null;
+    private OpenTransition openTransition = null;
     private Quadratic easing = new Quadratic();
 
     private ComponentListener ownerComponentListener = new ComponentListener.Adapter() {
@@ -204,15 +195,15 @@
     }
 
     public int getEasedPreferredHeight(int preferredHeight) {
-        if (windowStateTransition != null
-            && windowStateTransition.isRunning()) {
+        if (openTransition != null
+            && openTransition.isRunning()) {
             float scale;
-            if (windowStateTransition.close) {
-                scale = easing.easeIn(windowStateTransition.getElapsedTime(), 0, 1,
-                    windowStateTransition.getDuration());
+            if (openTransition.isReversed()) {
+                scale = easing.easeIn(openTransition.getElapsedTime(), 0, 1,
+                    openTransition.getDuration());
             } else {
-                scale = easing.easeOut(windowStateTransition.getElapsedTime(), 0, 1,
-                    windowStateTransition.getDuration());
+                scale = easing.easeOut(openTransition.getElapsedTime(), 0, 1,
+                    openTransition.getDuration());
             }
 
             preferredHeight = (int)(scale * preferredHeight);
@@ -365,10 +356,10 @@
         Component ownerContent = owner.getContent();
         ownerContent.getComponentListeners().add(ownerContentComponentListener);
 
-        windowStateTransition = new WindowStateTransition(false);
-        windowStateTransition.start(new TransitionListener() {
+        openTransition = new OpenTransition(false);
+        openTransition.start(new TransitionListener() {
             public void transitionCompleted(Transition transition) {
-                windowStateTransition = null;
+                openTransition = null;
             }
         });
     }
@@ -385,24 +376,24 @@
             TransitionListener transitionListener = new TransitionListener() {
                 public void transitionCompleted(Transition transition) {
                     sheet.close(result);
-                    windowStateTransition = null;
+                    openTransition = null;
                 }
             };
 
-            if (windowStateTransition == null) {
+            if (openTransition == null) {
                 // Start the close transition
-                windowStateTransition = new WindowStateTransition(true);
-                windowStateTransition.start(transitionListener);
+                openTransition = new OpenTransition(true);
+                openTransition.start(transitionListener);
             } else {
                 // Reverse the open transition
-                if (!windowStateTransition.close
-                    && windowStateTransition.isRunning()) {
-                    windowStateTransition.reverse(transitionListener);
+                if (!openTransition.isReversed()
+                    && openTransition.isRunning()) {
+                    openTransition.reverse(transitionListener);
                 }
             }
 
-            vote = (windowStateTransition != null
-                && windowStateTransition.isRunning()) ? Vote.DEFER : Vote.APPROVE;
+            vote = (openTransition != null
+                && openTransition.isRunning()) ? Vote.DEFER : Vote.APPROVE;
         }
 
         return vote;
@@ -410,9 +401,9 @@
 
     public void sheetCloseVetoed(Sheet sheet, Vote reason) {
         if (reason == Vote.DENY
-            && windowStateTransition != null) {
-            windowStateTransition.stop();
-            windowStateTransition = null;
+            && openTransition != null) {
+            openTransition.stop();
+            openTransition = null;
         }
     }