Updated Branches:
  refs/heads/WICKET-5297-ajax-repaint-with-animation [created] e85a8b3cd


WICKET-5297 Animate ajax DOM manipulation smoothly


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/e85a8b3c
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/e85a8b3c
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/e85a8b3c

Branch: refs/heads/WICKET-5297-ajax-repaint-with-animation
Commit: e85a8b3cd1512cfee79620530c559ea307c2d4d0
Parents: 76b619d
Author: Martin Tzvetanov Grigorov <mgrigo...@apache.org>
Authored: Tue Oct 1 12:15:09 2013 +0200
Committer: Martin Tzvetanov Grigorov <mgrigo...@apache.org>
Committed: Tue Oct 1 12:15:09 2013 +0200

----------------------------------------------------------------------
 .../ajax/effects/DisplayNoneBehavior.java       |  22 ++++
 .../org/apache/wicket/ajax/effects/Effect.java  | 117 +++++++++++++++++++
 .../org/apache/wicket/ajax/effects/Effects.java |  86 ++++++++++++++
 .../wicket/ajax/res/js/wicket-ajax-jquery.js    |  22 ++++
 4 files changed, 247 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/e85a8b3c/wicket-core/src/main/java/org/apache/wicket/ajax/effects/DisplayNoneBehavior.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/ajax/effects/DisplayNoneBehavior.java
 
b/wicket-core/src/main/java/org/apache/wicket/ajax/effects/DisplayNoneBehavior.java
new file mode 100644
index 0000000..d62e8c1
--- /dev/null
+++ 
b/wicket-core/src/main/java/org/apache/wicket/ajax/effects/DisplayNoneBehavior.java
@@ -0,0 +1,22 @@
+package org.apache.wicket.ajax.effects;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.behavior.AttributeAppender;
+import org.apache.wicket.model.Model;
+
+/**
+ * A behavior that hides a component by using CSS <em>display</em> rule
+ */
+class DisplayNoneBehavior extends AttributeAppender
+{
+       DisplayNoneBehavior()
+       {
+               super("style", Model.of("display: none"));
+       }
+
+       @Override
+       public boolean isTemporary(Component component)
+       {
+               return true;
+       }
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/e85a8b3c/wicket-core/src/main/java/org/apache/wicket/ajax/effects/Effect.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/ajax/effects/Effect.java 
b/wicket-core/src/main/java/org/apache/wicket/ajax/effects/Effect.java
new file mode 100644
index 0000000..2110631
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/ajax/effects/Effect.java
@@ -0,0 +1,117 @@
+package org.apache.wicket.ajax.effects;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.util.lang.Args;
+import org.apache.wicket.util.time.Duration;
+
+/**
+ * An effect is responsible to render the JavaScript that should be
+ * used to show the animation effect.
+ */
+public class Effect
+{
+       /**
+        * The default duration of all effects which do not specify
+        * their duration explicitly via {@linkplain 
#setDuration(org.apache.wicket.util.time.Duration)}.
+        *
+        * <p>Non final so the application can specify</p> its own default
+        */
+       public static Duration DEFAULT_DURATION = Duration.milliseconds(300L);
+
+       /**
+        * The name of the effect.
+        */
+       private final String name;
+
+       /**
+        * The duration of the animation. In milliseconds
+        */
+       private Duration duration;
+
+       /**
+        * A flag indicating whether the animation should suspend
+        * the execution of other Ajax response evaluations.
+        * By default effects notify when they are finished and other
+        * evaluations can be executed.
+        */
+       private boolean notify = true;
+
+       /**
+        * Constructor.
+        *
+        * @param name
+        *          The name of the effect
+        */
+       protected Effect(String name)
+       {
+               this(name, DEFAULT_DURATION);
+       }
+
+       /**
+        * Constructor.
+        *
+        * @param name
+        *          The name of the effect
+        * @param duration
+        *          The duration of the animation.
+        */
+       protected Effect(String name, Duration duration)
+       {
+               this.name = Args.notEmpty(name, "name");
+               this.duration = Args.notNull(duration, "duration");
+       }
+
+       public Effect setDuration(Duration duration)
+       {
+               this.duration = duration;
+               return this;
+       }
+
+       public Duration getDuration()
+       {
+               return duration;
+       }
+
+       public String getName()
+       {
+               return name;
+       }
+
+       public boolean isNotify()
+       {
+               return notify;
+       }
+
+       public Effect setNotify(boolean notify)
+       {
+               this.notify = notify;
+               return this;
+       }
+
+       /**
+        * Constructs JavaScript like: 
Wicket.Effect['name']('componentMarkupId', duration)
+        *
+        * @param component
+        * @return the JavaScript used to execute the effect
+        */
+       public CharSequence toJavaScript(Component component)
+       {
+               Args.notNull(component, "component");
+
+               StringBuilder js = new StringBuilder();
+               if (isNotify())
+               {
+                       js.append("notify|");
+               }
+               js.append("Wicket.Effect['").append(name).append("']");
+               js.append("('").append(component.getMarkupId()).append("', ")
+                               .append(getDuration().getMilliseconds());
+               if (isNotify())
+               {
+                       js.append(", notify");
+               }
+               js.append(");");
+
+               return js;
+       }
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/e85a8b3c/wicket-core/src/main/java/org/apache/wicket/ajax/effects/Effects.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/ajax/effects/Effects.java 
b/wicket-core/src/main/java/org/apache/wicket/ajax/effects/Effects.java
new file mode 100644
index 0000000..7020332
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/ajax/effects/Effects.java
@@ -0,0 +1,86 @@
+package org.apache.wicket.ajax.effects;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.util.lang.Args;
+import org.apache.wicket.util.time.Duration;
+
+public class Effects
+{
+       public static void replace(AjaxRequestTarget target, Component 
component)
+       {
+               replace(target, component, new SlideUp(), new SlideDown());
+       }
+
+       public static void replace(AjaxRequestTarget target, Component 
component, Effect in, Effect out)
+       {
+               Args.notNull(target, "target");
+               Args.notNull(component, "component");
+               Args.notNull(in, "in");
+               Args.notNull(out, "out");
+
+               component.add(new DisplayNoneBehavior());
+
+               target.prependJavaScript(in.toJavaScript(component));
+
+               target.add(component);
+
+               target.appendJavaScript(out.toJavaScript(component));
+       }
+
+       /*
+        * Effects provided by jQuery
+        */
+
+       public static class SlideUp extends Effect
+       {
+               public SlideUp()
+               {
+                       super("slideUp");
+               }
+
+               public SlideUp(Duration duration)
+               {
+                       super("slideUp", duration);
+               }
+       }
+
+       public static class SlideDown extends Effect
+       {
+               public SlideDown()
+               {
+                       super("slideDown");
+               }
+
+               public SlideDown(Duration duration)
+               {
+                       super("slideDown", duration);
+               }
+       }
+
+       public static class FadeIn extends Effect
+       {
+               public FadeIn()
+               {
+                       super("fadeIn");
+               }
+
+               public FadeIn(Duration duration)
+               {
+                       super("fadeIn", duration);
+               }
+       }
+
+       public static class FadeOut extends Effect
+       {
+               public FadeOut()
+               {
+                       super("fadeOut");
+               }
+
+               public FadeOut(Duration duration)
+               {
+                       super("fadeOut", duration);
+               }
+       }
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/e85a8b3c/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js 
b/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js
index d5440ee..667f8c6 100644
--- 
a/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js
+++ 
b/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js
@@ -2609,6 +2609,28 @@
                                
Wicket.Focus.setFocusOnElements(document.getElementsByTagName("button"));
                                
Wicket.Focus.setFocusOnElements(document.getElementsByTagName("a"));
                        }
+               },
+
+               Effect: {
+                       slideUp: function(componentId, duration, notify) {
+                               notify = notify || jQuery.noop;
+                               jQuery('#' + componentId).slideUp(duration, 
notify);
+                       },
+
+                       slideDown: function(componentId, duration, notify) {
+                               notify = notify || jQuery.noop;
+                               jQuery('#' + componentId).slideDown(duration, 
notify);
+                       },
+
+                       fadeIn: function(componentId, duration, notify) {
+                               notify = notify || jQuery.noop;
+                               jQuery('#' + componentId).fadeIn(duration, 
notify);
+                       },
+
+                       fadeOut: function(componentId, duration, notify) {
+                               notify = notify || jQuery.noop;
+                               jQuery('#' + componentId).fadeOut(duration, 
notify);
+                       }
                }
        });
 

Reply via email to