]> source.dussan.org Git - vaadin-framework.git/commitdiff
Updated Audio and Video to use state
authorArtur Signell <artur@vaadin.com>
Thu, 3 May 2012 19:15:40 +0000 (22:15 +0300)
committerArtur Signell <artur@vaadin.com>
Fri, 11 May 2012 19:18:25 +0000 (22:18 +0300)
src/com/vaadin/terminal/gwt/client/ui/AbstractMediaState.java [new file with mode: 0644]
src/com/vaadin/terminal/gwt/client/ui/MediaBaseConnector.java
src/com/vaadin/terminal/gwt/client/ui/VMediaBase.java
src/com/vaadin/terminal/gwt/client/ui/audio/AudioConnector.java
src/com/vaadin/terminal/gwt/client/ui/audio/VAudio.java
src/com/vaadin/terminal/gwt/client/ui/video/VVideo.java
src/com/vaadin/terminal/gwt/client/ui/video/VideoConnector.java
src/com/vaadin/terminal/gwt/client/ui/video/VideoState.java [new file with mode: 0644]
src/com/vaadin/ui/AbstractMedia.java
src/com/vaadin/ui/Video.java

diff --git a/src/com/vaadin/terminal/gwt/client/ui/AbstractMediaState.java b/src/com/vaadin/terminal/gwt/client/ui/AbstractMediaState.java
new file mode 100644 (file)
index 0000000..0ecb715
--- /dev/null
@@ -0,0 +1,79 @@
+package com.vaadin.terminal.gwt.client.ui;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.vaadin.terminal.gwt.client.ComponentState;
+import com.vaadin.terminal.gwt.client.communication.URLReference;
+
+public class AbstractMediaState extends ComponentState {
+    private boolean showControls;
+
+    private String altText;
+
+    private boolean htmlContentAllowed;
+
+    private boolean autoplay;
+
+    private boolean muted;
+
+    private List<URLReference> sources = new ArrayList<URLReference>();
+    private List<String> sourceTypes = new ArrayList<String>();
+
+    public boolean isShowControls() {
+        return showControls;
+    }
+
+    public void setShowControls(boolean showControls) {
+        this.showControls = showControls;
+    }
+
+    public String getAltText() {
+        return altText;
+    }
+
+    public void setAltText(String altText) {
+        this.altText = altText;
+    }
+
+    public boolean isHtmlContentAllowed() {
+        return htmlContentAllowed;
+    }
+
+    public void setHtmlContentAllowed(boolean htmlContentAllowed) {
+        this.htmlContentAllowed = htmlContentAllowed;
+    }
+
+    public boolean isAutoplay() {
+        return autoplay;
+    }
+
+    public void setAutoplay(boolean autoplay) {
+        this.autoplay = autoplay;
+    }
+
+    public boolean isMuted() {
+        return muted;
+    }
+
+    public void setMuted(boolean muted) {
+        this.muted = muted;
+    }
+
+    public List<URLReference> getSources() {
+        return sources;
+    }
+
+    public void setSources(List<URLReference> sources) {
+        this.sources = sources;
+    }
+
+    public List<String> getSourceTypes() {
+        return sourceTypes;
+    }
+
+    public void setSourceTypes(List<String> sourceTypes) {
+        this.sourceTypes = sourceTypes;
+    }
+
+}
index 1e067bf6fbf92ef037b85815685aae93876260a0..42027f911bbe5954cd9732280d0d314219d4304b 100644 (file)
@@ -3,24 +3,12 @@
  */
 package com.vaadin.terminal.gwt.client.ui;
 
-import com.vaadin.terminal.gwt.client.ApplicationConnection;
-import com.vaadin.terminal.gwt.client.Paintable;
-import com.vaadin.terminal.gwt.client.UIDL;
 import com.vaadin.terminal.gwt.client.Util;
 import com.vaadin.terminal.gwt.client.communication.ClientRpc;
+import com.vaadin.terminal.gwt.client.communication.StateChangeEvent;
+import com.vaadin.terminal.gwt.client.communication.URLReference;
 
-public abstract class MediaBaseConnector extends AbstractComponentConnector
-        implements Paintable {
-
-    public static final String TAG_SOURCE = "src";
-
-    public static final String ATTR_MUTED = "muted";
-    public static final String ATTR_CONTROLS = "ctrl";
-    public static final String ATTR_AUTOPLAY = "auto";
-    public static final String ATTR_RESOURCE = "res";
-    public static final String ATTR_RESOURCE_TYPE = "type";
-    public static final String ATTR_HTML = "html";
-    public static final String ATTR_ALT_TEXT = "alt";
+public abstract class MediaBaseConnector extends AbstractComponentConnector {
 
     /**
      * Server to client RPC interface for controlling playback of the media.
@@ -54,40 +42,24 @@ public abstract class MediaBaseConnector extends AbstractComponentConnector
         });
     }
 
-    public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
-        if (!isRealUpdate(uidl)) {
-            return;
-        }
-
-        getWidget().setControls(shouldShowControls(uidl));
-        getWidget().setAutoplay(shouldAutoplay(uidl));
-        getWidget().setMuted(isMediaMuted(uidl));
-
-        // Add all sources
-        for (int ix = 0; ix < uidl.getChildCount(); ix++) {
-            UIDL child = uidl.getChildUIDL(ix);
-            if (TAG_SOURCE.equals(child.getTag())) {
-                getWidget()
-                        .addSource(getSourceUrl(child), getSourceType(child));
-            }
-        }
-        setAltText(uidl);
-    }
-
-    protected boolean shouldShowControls(UIDL uidl) {
-        return uidl.getBooleanAttribute(ATTR_CONTROLS);
-    }
-
-    private boolean shouldAutoplay(UIDL uidl) {
-        return uidl.getBooleanAttribute(ATTR_AUTOPLAY);
-    }
-
-    private boolean isMediaMuted(UIDL uidl) {
-        return uidl.getBooleanAttribute(ATTR_MUTED);
+    @Override
+    public AbstractMediaState getState() {
+        return (AbstractMediaState) super.getState();
     }
 
-    private boolean allowHtmlContent(UIDL uidl) {
-        return uidl.getBooleanAttribute(ATTR_HTML);
+    @Override
+    public void onStateChanged(StateChangeEvent stateChangeEvent) {
+        super.onStateChanged(stateChangeEvent);
+
+        getWidget().setControls(getState().isShowControls());
+        getWidget().setAutoplay(getState().isAutoplay());
+        getWidget().setMuted(getState().isMuted());
+        for (int i = 0; i < getState().getSources().size(); i++) {
+            URLReference source = getState().getSources().get(i);
+            String sourceType = getState().getSourceTypes().get(i);
+            getWidget().addSource(source.getURL(), sourceType);
+        }
+        setAltText(getState().getAltText());
     }
 
     @Override
@@ -95,36 +67,20 @@ public abstract class MediaBaseConnector extends AbstractComponentConnector
         return (VMediaBase) super.getWidget();
     }
 
-    /**
-     * @param uidl
-     * @return the URL of a resource to be used as a source for the media
-     */
-    private String getSourceUrl(UIDL uidl) {
-        String url = getConnection().translateVaadinUri(
-                uidl.getStringAttribute(MediaBaseConnector.ATTR_RESOURCE));
-        if (url == null) {
-            return "";
+    private void setAltText(String altText) {
+
+        if (altText == null || "".equals(altText)) {
+            altText = getDefaultAltHtml();
+        } else if (!getState().isHtmlContentAllowed()) {
+            altText = Util.escapeHTML(altText);
         }
-        return url;
+        getWidget().setAltText(altText);
     }
 
     /**
-     * @param uidl
-     * @return the mime type of the media
+     * @return the default HTML to show users with browsers that do not support
+     *         HTML5 media markup.
      */
-    private String getSourceType(UIDL uidl) {
-        return uidl.getStringAttribute(MediaBaseConnector.ATTR_RESOURCE_TYPE);
-    }
-
-    private void setAltText(UIDL uidl) {
-        String alt = uidl.getStringAttribute(MediaBaseConnector.ATTR_ALT_TEXT);
-
-        if (alt == null || "".equals(alt)) {
-            alt = getWidget().getDefaultAltHtml();
-        } else if (!allowHtmlContent(uidl)) {
-            alt = Util.escapeHTML(alt);
-        }
-        getWidget().setAltText(alt);
-    }
+    protected abstract String getDefaultAltHtml();
 
 }
index 6c5fbc2ef08244e99918b6b212b0f47ccb2d292d..40696ccec5d3f8cb234cc6ff75b28a7e9d45e02e 100644 (file)
@@ -23,12 +23,6 @@ public abstract class VMediaBase extends Widget {
         media = element;
     }
 
-    /**
-     * @return the default HTML to show users with browsers that do not support
-     *         HTML5 media markup.
-     */
-    protected abstract String getDefaultAltHtml();
-
     public void play() {
         media.play();
     }
index d55e66dbd5f53f4c16e96fbd645865b4aec61c41..1c7feb132a6f9f09132cd405a650baa487aa80ae 100644 (file)
@@ -7,9 +7,8 @@ import com.google.gwt.core.client.GWT;
 import com.google.gwt.dom.client.Style;
 import com.google.gwt.dom.client.Style.Unit;
 import com.google.gwt.user.client.ui.Widget;
-import com.vaadin.terminal.gwt.client.ApplicationConnection;
 import com.vaadin.terminal.gwt.client.BrowserInfo;
-import com.vaadin.terminal.gwt.client.UIDL;
+import com.vaadin.terminal.gwt.client.communication.StateChangeEvent;
 import com.vaadin.terminal.gwt.client.ui.Connect;
 import com.vaadin.terminal.gwt.client.ui.MediaBaseConnector;
 import com.vaadin.ui.Audio;
@@ -18,15 +17,13 @@ import com.vaadin.ui.Audio;
 public class AudioConnector extends MediaBaseConnector {
 
     @Override
-    public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
-        super.updateFromUIDL(uidl, client);
-        if (!isRealUpdate(uidl)) {
-            return;
-        }
+    public void onStateChanged(StateChangeEvent stateChangeEvent) {
+        super.onStateChanged(stateChangeEvent);
+
         Style style = getWidget().getElement().getStyle();
 
         // Make sure that the controls are not clipped if visible.
-        if (shouldShowControls(uidl)
+        if (getState().isShowControls()
                 && (style.getHeight() == null || "".equals(style.getHeight()))) {
             if (BrowserInfo.get().isChrome()) {
                 style.setHeight(32, Unit.PX);
@@ -41,4 +38,8 @@ public class AudioConnector extends MediaBaseConnector {
         return GWT.create(VAudio.class);
     }
 
+    @Override
+    protected String getDefaultAltHtml() {
+        return "Your browser does not support the <code>audio</code> element.";
+    }
 }
index 7d5d1fe034c98d5df4f3b214893eb8ce1a8d9a25..08bc95ba165c471d8e1198fed38c6fedecc10d1f 100644 (file)
@@ -19,9 +19,4 @@ public class VAudio extends VMediaBase {
         setStyleName(CLASSNAME);
     }
 
-    @Override
-    protected String getDefaultAltHtml() {
-        return "Your browser does not support the <code>audio</code> element.";
-    }
-
 }
index 484000b8d11088213f856837b4c2ea1791638003..a2a4cd0ce38bf911f3725f74449849931244408d 100644 (file)
@@ -52,11 +52,6 @@ public class VVideo extends VMediaBase {
         Util.notifyParentOfSizeChange(this, true);
     }
 
-    @Override
-    protected String getDefaultAltHtml() {
-        return "Your browser does not support the <code>video</code> element.";
-    }
-
     public void setPoster(String poster) {
         video.setPoster(poster);
     }
index ec763fff07b84c6de06d03a6d9895518280b43d8..da1631c44d9fdd87b888756d8658356509eaf4dd 100644 (file)
@@ -5,31 +5,28 @@ package com.vaadin.terminal.gwt.client.ui.video;
 
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.user.client.ui.Widget;
-import com.vaadin.terminal.gwt.client.ApplicationConnection;
-import com.vaadin.terminal.gwt.client.UIDL;
+import com.vaadin.terminal.gwt.client.communication.StateChangeEvent;
+import com.vaadin.terminal.gwt.client.communication.URLReference;
 import com.vaadin.terminal.gwt.client.ui.Connect;
 import com.vaadin.terminal.gwt.client.ui.MediaBaseConnector;
 import com.vaadin.ui.Video;
 
 @Connect(Video.class)
 public class VideoConnector extends MediaBaseConnector {
-    public static final String ATTR_POSTER = "poster";
 
     @Override
-    public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
-        super.updateFromUIDL(uidl, client);
-        if (!isRealUpdate(uidl)) {
-            return;
-        }
-        super.updateFromUIDL(uidl, client);
-        setPosterFromUIDL(uidl);
+    public VideoState getState() {
+        return (VideoState) super.getState();
     }
 
-    private void setPosterFromUIDL(UIDL uidl) {
-        if (uidl.hasAttribute(ATTR_POSTER)) {
-            getWidget().setPoster(
-                    getConnection().translateVaadinUri(
-                            uidl.getStringAttribute(ATTR_POSTER)));
+    @Override
+    public void onStateChanged(StateChangeEvent stateChangeEvent) {
+        super.onStateChanged(stateChangeEvent);
+        URLReference poster = getState().getPoster();
+        if (poster != null) {
+            getWidget().setPoster(poster.getURL());
+        } else {
+            getWidget().setPoster(null);
         }
     }
 
@@ -43,4 +40,9 @@ public class VideoConnector extends MediaBaseConnector {
         return GWT.create(VVideo.class);
     }
 
+    @Override
+    protected String getDefaultAltHtml() {
+        return "Your browser does not support the <code>video</code> element.";
+    }
+
 }
diff --git a/src/com/vaadin/terminal/gwt/client/ui/video/VideoState.java b/src/com/vaadin/terminal/gwt/client/ui/video/VideoState.java
new file mode 100644 (file)
index 0000000..ab37c4d
--- /dev/null
@@ -0,0 +1,17 @@
+package com.vaadin.terminal.gwt.client.ui.video;
+
+import com.vaadin.terminal.gwt.client.communication.URLReference;
+import com.vaadin.terminal.gwt.client.ui.AbstractMediaState;
+
+public class VideoState extends AbstractMediaState {
+    private URLReference poster;
+
+    public URLReference getPoster() {
+        return poster;
+    }
+
+    public void setPoster(URLReference poster) {
+        this.poster = poster;
+    }
+
+}
index 09cfd5ff123be46814ddf91fcb1e728c5f2e9650..760d9878cae8d306e40e3a76847dd84217fad926 100644 (file)
@@ -5,37 +5,25 @@
 package com.vaadin.ui;
 
 import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
-import java.util.Map;
 
-import com.vaadin.terminal.PaintException;
-import com.vaadin.terminal.PaintTarget;
 import com.vaadin.terminal.Resource;
-import com.vaadin.terminal.Vaadin6Component;
-import com.vaadin.terminal.gwt.client.ui.MediaBaseConnector;
+import com.vaadin.terminal.gwt.client.communication.URLReference;
+import com.vaadin.terminal.gwt.client.ui.AbstractMediaState;
 import com.vaadin.terminal.gwt.client.ui.MediaBaseConnector.MediaControl;
+import com.vaadin.terminal.gwt.server.ResourceReference;
 
 /**
  * Abstract base class for the HTML5 media components.
  * 
  * @author Vaadin Ltd
  */
-public class AbstractMedia extends AbstractComponent implements
-        Vaadin6Component {
+public class AbstractMedia extends AbstractComponent {
 
-    private List<Resource> sources = new ArrayList<Resource>();
-
-    private boolean showControls;
-
-    private String altText;
-
-    private boolean htmlContentAllowed;
-
-    private boolean autoplay;
-
-    private boolean muted;
+    @Override
+    public AbstractMediaState getState() {
+        return (AbstractMediaState) super.getState();
+    }
 
     /**
      * Sets a single media file as the source of the media component.
@@ -43,10 +31,16 @@ public class AbstractMedia extends AbstractComponent implements
      * @param source
      */
     public void setSource(Resource source) {
-        sources.clear();
+        clearSources();
+
         addSource(source);
     }
 
+    private void clearSources() {
+        getState().getSources().clear();
+        getState().getSourceTypes().clear();
+    }
+
     /**
      * Adds an alternative media file to the sources list. Which of the sources
      * is used is selected by the browser depending on which file formats it
@@ -58,7 +52,8 @@ public class AbstractMedia extends AbstractComponent implements
      */
     public void addSource(Resource source) {
         if (source != null) {
-            sources.add(source);
+            getState().getSources().add(new ResourceReference(source));
+            getState().getSourceTypes().add(source.getMIMEType());
             requestRepaint();
         }
     }
@@ -72,15 +67,21 @@ public class AbstractMedia extends AbstractComponent implements
      * @param sources
      */
     public void setSources(Resource... sources) {
-        this.sources.addAll(Arrays.asList(sources));
-        requestRepaint();
+        clearSources();
+        for (Resource source : sources) {
+            addSource(source);
+        }
     }
 
     /**
      * @return The sources pointed to in this media.
      */
     public List<Resource> getSources() {
-        return Collections.unmodifiableList(sources);
+        ArrayList<Resource> sources = new ArrayList<Resource>();
+        for (URLReference ref : getState().getSources()) {
+            sources.add(((ResourceReference) ref).getResource());
+        }
+        return sources;
     }
 
     /**
@@ -89,7 +90,7 @@ public class AbstractMedia extends AbstractComponent implements
      * @param showControls
      */
     public void setShowControls(boolean showControls) {
-        this.showControls = showControls;
+        getState().setShowControls(showControls);
         requestRepaint();
     }
 
@@ -97,7 +98,7 @@ public class AbstractMedia extends AbstractComponent implements
      * @return true if the browser is to show native media controls.
      */
     public boolean isShowControls() {
-        return showControls;
+        return getState().isShowControls();
     }
 
     /**
@@ -109,10 +110,10 @@ public class AbstractMedia extends AbstractComponent implements
      * "https://developer.mozilla.org/En/Using_audio_and_video_in_Firefox#Using_Flash"
      * >Mozilla Developer Network</a> for details.
      * 
-     * @param text
+     * @param altText
      */
-    public void setAltText(String text) {
-        altText = text;
+    public void setAltText(String altText) {
+        getState().setAltText(altText);
         requestRepaint();
     }
 
@@ -121,7 +122,7 @@ public class AbstractMedia extends AbstractComponent implements
      *         HTML5.
      */
     public String getAltText() {
-        return altText;
+        return getState().getAltText();
     }
 
     /**
@@ -131,7 +132,7 @@ public class AbstractMedia extends AbstractComponent implements
      * @param htmlContentAllowed
      */
     public void setHtmlContentAllowed(boolean htmlContentAllowed) {
-        this.htmlContentAllowed = htmlContentAllowed;
+        getState().setHtmlContentAllowed(htmlContentAllowed);
         requestRepaint();
     }
 
@@ -140,7 +141,7 @@ public class AbstractMedia extends AbstractComponent implements
      *         be rendered as HTML.
      */
     public boolean isHtmlContentAllowed() {
-        return htmlContentAllowed;
+        return getState().isHtmlContentAllowed();
     }
 
     /**
@@ -150,7 +151,7 @@ public class AbstractMedia extends AbstractComponent implements
      * @param autoplay
      */
     public void setAutoplay(boolean autoplay) {
-        this.autoplay = autoplay;
+        getState().setAutoplay(autoplay);
         requestRepaint();
     }
 
@@ -158,7 +159,7 @@ public class AbstractMedia extends AbstractComponent implements
      * @return true if the media is set to automatically start playback.
      */
     public boolean isAutoplay() {
-        return autoplay;
+        return getState().isAutoplay();
     }
 
     /**
@@ -167,7 +168,7 @@ public class AbstractMedia extends AbstractComponent implements
      * @param muted
      */
     public void setMuted(boolean muted) {
-        this.muted = muted;
+        getState().setMuted(muted);
         requestRepaint();
     }
 
@@ -175,7 +176,7 @@ public class AbstractMedia extends AbstractComponent implements
      * @return true if the audio is muted.
      */
     public boolean isMuted() {
-        return muted;
+        return getState().isMuted();
     }
 
     /**
@@ -192,25 +193,4 @@ public class AbstractMedia extends AbstractComponent implements
         getRpcProxy(MediaControl.class).play();
     }
 
-    public void paintContent(PaintTarget target) throws PaintException {
-        target.addAttribute(MediaBaseConnector.ATTR_CONTROLS, isShowControls());
-        if (getAltText() != null) {
-            target.addAttribute(MediaBaseConnector.ATTR_ALT_TEXT, getAltText());
-        }
-        target.addAttribute(MediaBaseConnector.ATTR_HTML,
-                isHtmlContentAllowed());
-        target.addAttribute(MediaBaseConnector.ATTR_AUTOPLAY, isAutoplay());
-        for (Resource r : getSources()) {
-            target.startTag(MediaBaseConnector.TAG_SOURCE);
-            target.addAttribute(MediaBaseConnector.ATTR_RESOURCE, r);
-            target.addAttribute(MediaBaseConnector.ATTR_RESOURCE_TYPE,
-                    r.getMIMEType());
-            target.endTag(MediaBaseConnector.TAG_SOURCE);
-        }
-        target.addAttribute(MediaBaseConnector.ATTR_MUTED, isMuted());
-    }
-
-    public void changeVariables(Object source, Map<String, Object> variables) {
-        // TODO Remove once Vaadin6Component is no longer implemented
-    }
 }
index 28fbfb054762632aff0137a461b30506b73b9e70..0a2eccca0fbd4cbb6eabc8170fb0a620d576f38c 100644 (file)
@@ -4,10 +4,9 @@
 
 package com.vaadin.ui;
 
-import com.vaadin.terminal.PaintException;
-import com.vaadin.terminal.PaintTarget;
 import com.vaadin.terminal.Resource;
-import com.vaadin.terminal.gwt.client.ui.video.VideoConnector;
+import com.vaadin.terminal.gwt.client.ui.video.VideoState;
+import com.vaadin.terminal.gwt.server.ResourceReference;
 
 /**
  * The Video component translates into an HTML5 &lt;video&gt; element and as
@@ -32,7 +31,10 @@ import com.vaadin.terminal.gwt.client.ui.video.VideoConnector;
  */
 public class Video extends AbstractMedia {
 
-    private Resource poster;
+    @Override
+    public VideoState getState() {
+        return (VideoState) super.getState();
+    }
 
     public Video() {
         this("", null);
@@ -65,21 +67,15 @@ public class Video extends AbstractMedia {
      * @param poster
      */
     public void setPoster(Resource poster) {
-        this.poster = poster;
+        getState().setPoster(new ResourceReference(poster));
+        requestRepaint();
     }
 
     /**
      * @return The poster image.
      */
     public Resource getPoster() {
-        return poster;
+        return ((ResourceReference) getState().getPoster()).getResource();
     }
 
-    @Override
-    public void paintContent(PaintTarget target) throws PaintException {
-        super.paintContent(target);
-        if (getPoster() != null) {
-            target.addAttribute(VideoConnector.ATTR_POSTER, getPoster());
-        }
-    }
 }