/*******************************************************************************
* Copyright (c) 2013 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.ui;
import static com.eclipsesource.tabris.internal.Clauses.whenNull;
import static com.eclipsesource.tabris.internal.Constants.EVENT_SHOW_PAGE;
import static com.eclipsesource.tabris.internal.Constants.EVENT_SHOW_PREVIOUS_PAGE;
import static com.eclipsesource.tabris.internal.Constants.PROPERTY_ACTIVE_PAGE;
import static com.eclipsesource.tabris.internal.Constants.PROPERTY_BACKGROUND;
import static com.eclipsesource.tabris.internal.Constants.PROPERTY_FOREGROUND;
import static com.eclipsesource.tabris.internal.Constants.PROPERTY_IMAGE;
import static com.eclipsesource.tabris.internal.Constants.PROPERTY_PAGE_ID;
import static com.eclipsesource.tabris.internal.Constants.PROPERTY_SHELL;
import static org.eclipse.rap.rwt.RWT.getUISession;
import static org.eclipse.rap.rwt.internal.lifecycle.WidgetUtil.getId;
import static org.eclipse.rap.rwt.remote.JsonMapping.toJson;
import java.util.List;
import org.eclipse.rap.json.JsonArray;
import org.eclipse.rap.json.JsonObject;
import org.eclipse.rap.rwt.remote.AbstractOperationHandler;
import org.eclipse.rap.rwt.remote.RemoteObject;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
import com.eclipsesource.tabris.internal.ui.rendering.PageRenderer;
import com.eclipsesource.tabris.internal.ui.rendering.UIRenderer;
import com.eclipsesource.tabris.ui.UI;
@SuppressWarnings("restriction")
public class RemoteUI extends AbstractOperationHandler implements UIRenderer {
private final RemoteObject remoteObject;
private final Shell shell;
private UI ui;
private Controller controller;
public RemoteUI( Shell shell ) {
this.shell = shell;
this.remoteObject = getUISession().getConnection().createRemoteObject( "tabris.UI" );
this.remoteObject.setHandler( this );
this.remoteObject.set( PROPERTY_SHELL, getId( shell ) );
}
@Override
public void setUi( UI ui ) {
this.ui = ui;
}
@Override
public void setController( Controller controller ) {
this.controller = controller;
}
@Override
public Composite getPageParent() {
return shell;
}
@Override
public Composite getActionsParent() {
return shell;
}
@Override
public void activate( PageRenderer page ) {
whenNull( page ).throwIllegalArgument( "Page must not be null" );
remoteObject.set( PROPERTY_ACTIVE_PAGE, ( ( RemotePage )page ).getId() );
}
@Override
public void handleNotify( String event, JsonObject properties ) {
if( event.equals( EVENT_SHOW_PAGE ) ) {
String pageId = getPageId( properties.get( PROPERTY_PAGE_ID ).asString() );
ui.getPageOperator().openPage( pageId );
} else if( event.equals( EVENT_SHOW_PREVIOUS_PAGE ) ) {
ui.getPageOperator().closeCurrentPage();
}
}
@Override
public void setForeground( Color color ) {
setColor( PROPERTY_FOREGROUND, color );
}
@Override
public void setBackground( Color color ) {
setColor( PROPERTY_BACKGROUND, color );
}
@Override
public void setImage( Image image ) {
remoteObject.set( PROPERTY_IMAGE, toJson( image ) );
}
String getRemoteUIId() {
return remoteObject.getId();
}
String getPageId( String pageRendererId ) {
List<PageRenderer> pageRenderers = controller.getAllPages();
for( PageRenderer pageRenderer : pageRenderers ) {
RemotePage remotePage = ( RemotePage )pageRenderer;
if( remotePage.getId().equals( pageRendererId ) ) {
return remotePage.getDescriptor().getId();
}
}
throw new IllegalStateException( "RemotePage with id " + pageRendererId + " does not exist." );
}
private void setColor( String name, Color color ) {
JsonArray jsonArray = new JsonArray();
jsonArray.add( color.getRed() );
jsonArray.add( color.getGreen() );
jsonArray.add( color.getBlue() );
remoteObject.set( name, jsonArray );
}
}