/*******************************************************************************
* Copyright (c) 2016 EclipseSource and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* EclipseSource - initial API and implementation
******************************************************************************/
package com.eclipsesource.tabris.internal;
import static com.eclipsesource.tabris.internal.Constants.EVENT_PLAYBACK;
import static com.eclipsesource.tabris.internal.Constants.METHOD_CLEAR_CACHE;
import static com.eclipsesource.tabris.internal.Constants.METHOD_SKIP_FROM_CURRENT;
import static com.eclipsesource.tabris.internal.Constants.METHOD_STEP_TO_TIME;
import static com.eclipsesource.tabris.internal.Constants.PROPERTY_BOUNDS;
import static com.eclipsesource.tabris.internal.Constants.PROPERTY_PLAYBACK_SPEED;
import static com.eclipsesource.tabris.internal.Constants.PROPERTY_PLAYER_CONTROLS_VISIBLE;
import static com.eclipsesource.tabris.internal.Constants.PROPERTY_TIME;
import static org.eclipse.rap.rwt.remote.JsonMapping.toJson;
import org.eclipse.rap.json.JsonObject;
import org.eclipse.rap.rwt.remote.RemoteObject;
import org.eclipse.swt.graphics.Rectangle;
import com.eclipsesource.tabris.widgets.Video;
public class VideoRemoteAdapter extends TabrisRemoteAdapter<Video> {
private static final float DISABLED = Float.NEGATIVE_INFINITY;
private static final int PLAYER_CONTROLS_VISIBLE = 1;
private static final int PLAYBACK_SPEED = 2;
private static final int BOUNDS = 3;
private static final int PLAYBACK_LISTENER = 4;
private final RemoteObject remoteObject;
private final Runnable renderRunnable;
private transient boolean controlsVisible;
private transient float playbackSpeed;
private transient Rectangle bounds;
private transient boolean playbackListener;
private transient float stepToTime = DISABLED;
private transient float skipFromCurrent = DISABLED;
private transient boolean clearCache;
public VideoRemoteAdapter( Video video, RemoteObject remoteObject ) {
super( video );
this.remoteObject = remoteObject;
renderRunnable = createRenderRunnable();
}
private Runnable createRenderRunnable() {
return new Runnable() {
@Override
public void run() {
renderControlsVisible();
renderPlaybackSpeed();
renderBounds();
renderPlaybackListener();
renderStepToTime();
renderSkipFromCurrent();
renderClearCache();
clear();
}
};
}
public void preserveControlsVisible( boolean visible ) {
if( !hasPreserved( PLAYER_CONTROLS_VISIBLE ) ) {
markPreserved( PLAYER_CONTROLS_VISIBLE );
controlsVisible = visible;
scheduleRender( renderRunnable );
}
}
private void renderControlsVisible() {
if( hasPreserved( PLAYER_CONTROLS_VISIBLE ) ) {
boolean actual = control.hasPlayerControlsVisible();
if( changed( actual, controlsVisible ) ) {
remoteObject.set( PROPERTY_PLAYER_CONTROLS_VISIBLE, actual );
}
}
}
public void preservePlaybackSpeed( float speed ) {
if( !hasPreserved( PLAYBACK_SPEED ) ) {
markPreserved( PLAYBACK_SPEED );
playbackSpeed = speed;
scheduleRender( renderRunnable );
}
}
private void renderPlaybackSpeed() {
if( hasPreserved( PLAYBACK_SPEED ) ) {
float actual = control.getSpeed();
if( actual != playbackSpeed ) {
remoteObject.set( PROPERTY_PLAYBACK_SPEED, actual );
}
}
}
public void preserveBounds( Rectangle bounds ) {
if( !hasPreserved( BOUNDS ) ) {
markPreserved( BOUNDS );
this.bounds = bounds;
scheduleRender( renderRunnable );
}
}
private void renderBounds() {
if( hasPreserved( BOUNDS ) ) {
Rectangle actual = control.getBounds();
if( changed( actual, bounds ) ) {
actual.x = 0;
actual.y = 0;
remoteObject.set( PROPERTY_BOUNDS, toJson( actual ) );
}
}
}
public void preservePlaybackListener( boolean playbackListener ) {
if( !hasPreserved( PLAYBACK_LISTENER ) ) {
markPreserved( PLAYBACK_LISTENER );
this.playbackListener = playbackListener;
scheduleRender( renderRunnable );
}
}
private void renderPlaybackListener() {
if( hasPreserved( PLAYBACK_LISTENER ) ) {
boolean actual = !control.getPlaybackListeners().isEmpty();
if( changed( actual, playbackListener )) {
remoteObject.listen( EVENT_PLAYBACK, actual );
}
}
}
public void setStepToTime( float seconds ) {
stepToTime = Math.max( 0, seconds );
skipFromCurrent = DISABLED;
scheduleRender( renderRunnable );
}
private void renderStepToTime() {
if( stepToTime != DISABLED ) {
JsonObject value = new JsonObject().add( PROPERTY_TIME, stepToTime );
remoteObject.call( METHOD_STEP_TO_TIME, value );
}
}
public void setSkipFromCurrent( float seconds ) {
stepToTime = DISABLED;
skipFromCurrent = seconds;
scheduleRender( renderRunnable );
}
private void renderSkipFromCurrent() {
if( skipFromCurrent != DISABLED ) {
JsonObject value = new JsonObject().add( PROPERTY_TIME, skipFromCurrent );
remoteObject.call( METHOD_SKIP_FROM_CURRENT, value );
}
}
public void setClearCache( boolean clear ) {
clearCache = clear;
scheduleRender( renderRunnable );
}
private void renderClearCache() {
if( clearCache ) {
remoteObject.call( METHOD_CLEAR_CACHE, null );
}
}
@Override
protected void clear() {
super.clear();
stepToTime = DISABLED;
skipFromCurrent = DISABLED;
clearCache = false;
}
}