/*******************************************************************************
* 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.web;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.rap.rwt.RWT;
import org.eclipse.rap.rwt.client.service.JavaScriptExecutor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import com.eclipsesource.tabris.internal.ui.ActionDescriptor;
import com.eclipsesource.tabris.internal.ui.InstanceCreator;
import com.eclipsesource.tabris.internal.ui.PageDescriptor;
import com.eclipsesource.tabris.internal.ui.rendering.ActionRenderer;
import com.eclipsesource.tabris.internal.ui.rendering.PageRenderer;
import com.eclipsesource.tabris.internal.ui.rendering.RendererFactory;
import com.eclipsesource.tabris.ui.Page;
import com.eclipsesource.tabris.ui.PageData;
import com.eclipsesource.tabris.ui.UI;
public class WebPage implements PageRenderer {
private final UI ui;
private final WebUI uiRenderer;
private final PageData data;
private final Page page;
private final List<ActionRenderer> remoteActions;
private PageDescriptor descriptor;
private Control control;
private String title;
public WebPage( UI ui, WebUI uiRenderer, PageDescriptor descriptor, PageData data ) {
this.ui = ui;
this.descriptor = descriptor;
this.uiRenderer = uiRenderer;
this.data = data;
this.page = InstanceCreator.createInstance( descriptor.getPageType() );
this.remoteActions = new ArrayList<ActionRenderer>();
this.uiRenderer.pageCreated( this );
title = descriptor.getTitle();
}
@Override
public void update( PageDescriptor descriptor, RendererFactory rendererFactory, Composite uiParent ) {
this.descriptor = descriptor;
createActions( rendererFactory, uiParent );
removeOldActions();
}
private void removeOldActions() {
for( ActionRenderer renderer : new ArrayList<ActionRenderer>( remoteActions ) ) {
if( !existInPage( renderer ) ) {
renderer.destroy();
remoteActions.remove( renderer );
}
}
}
private boolean existInPage( ActionRenderer renderer ) {
List<ActionDescriptor> actions = descriptor.getActions();
for( ActionDescriptor actionDescriptor : actions ) {
if( actionDescriptor.getId().equals( renderer.getDescriptor().getId() ) ) {
return true;
}
}
return false;
}
@Override
public void createActions( RendererFactory rendererFactory, Composite uiParent ) {
List<ActionDescriptor> actions = descriptor.getActions();
for( ActionDescriptor actionDescriptor : actions ) {
if( !actionExist( actionDescriptor ) ) {
createAction( rendererFactory, uiParent, actionDescriptor );
}
}
}
private boolean actionExist( ActionDescriptor newAction ) {
for( ActionRenderer renderer : remoteActions ) {
if( renderer.getDescriptor().getId().equals( newAction.getId() ) ) {
return true;
}
}
return false;
}
private void createAction( RendererFactory rendererFactory,
Composite uiParent,
ActionDescriptor actionDescriptor )
{
ActionRenderer renderer = rendererFactory.createActionRenderer( ui, uiRenderer, actionDescriptor );
remoteActions.add( renderer );
renderer.createUi( uiParent );
}
@Override
public void setTitle( String title ) {
this.title = title;
setBrowserTitle();
uiRenderer.updatePageSwitcher( descriptor, title );
}
@Override
public void createControl( Composite parent ) {
if( control == null ) {
Composite container = new Composite( parent, SWT.NONE );
container.setLayout( new FillLayout() );
page.createContent( container, ui );
control = container;
}
}
@Override
public Control getControl() {
return control;
}
@Override
public List<ActionRenderer> getActionRenderers() {
return remoteActions;
}
@Override
public void destroyActions() {
for( ActionRenderer action : remoteActions ) {
action.destroy();
}
remoteActions.clear();
}
@Override
public PageDescriptor getDescriptor() {
return descriptor;
}
@Override
public Page getPage() {
return page;
}
@Override
public PageData getData() {
return data;
}
@Override
public void destroy() {
page.destroy();
if( control != null ) {
control.dispose();
control = null;
}
uiRenderer.pageDestroyed( this );
}
void pageActivated() {
setBrowserTitle();
}
private void setBrowserTitle() {
JavaScriptExecutor executor = RWT.getClient().getService( JavaScriptExecutor.class );
executor.execute( "document.title = \"" + title + "\";" );
}
}