/*******************************************************************************
* 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 static com.eclipsesource.tabris.internal.Clauses.whenNull;
import static com.eclipsesource.tabris.internal.Constants.CUSTOM_VARIANT_TABRIS_UI;
import static com.eclipsesource.tabris.internal.ui.ImageUtil.getImage;
import org.eclipse.rap.rwt.RWT;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import com.eclipsesource.tabris.internal.ui.Controller;
import com.eclipsesource.tabris.internal.ui.PageDescriptor;
import com.eclipsesource.tabris.internal.ui.rendering.PageRenderer;
import com.eclipsesource.tabris.internal.ui.rendering.UIRenderer;
import com.eclipsesource.tabris.ui.UI;
public class WebUI implements UIRenderer {
private static final int BACK_BUTTON_SIZE = 32;
private static final String BACK_BUTTON_CUSTOM_VARIANT = CUSTOM_VARIANT_TABRIS_UI + "_back";
private static final String DATA_ACTIVATED = "activated";
private final Shell shell;
private UI ui;
private Composite pageParent;
private Composite uiParent;
private Button backButton;
private Listener backButtonSelectionListener;
private ToolBar pageSwitcher;
private Menu pageSwitcherMenu;
private Composite actionsBar;
public WebUI( Shell shell ) {
this.shell = shell;
init();
createUIParent();
createPageParent();
createBackButton();
createPageSwitcher();
createSeparator();
createActionsBar();
}
@Override
public void setUi( UI ui ) {
this.ui = ui;
}
@Override
public void setController( Controller controller ) {
}
@Override
public void activate( PageRenderer page ) {
whenNull( page ).throwIllegalArgument( "Page must not be null" );
updatePageNavigationBar( page.getDescriptor() );
( ( WebPage )page ).pageActivated();
layout();
}
@Override
public void setForeground( Color color ) {
// has no effect on web
}
@Override
public void setBackground( Color color ) {
// has no effect on web
}
@Override
public void setImage( Image image ) {
// has no effect on web
}
@Override
public Composite getPageParent() {
return pageParent;
}
@Override
public Composite getActionsParent() {
return actionsBar;
}
void pageCreated( WebPage page ) {
if( page.getDescriptor().isTopLevel() ) {
addMenuItem( page.getDescriptor() );
}
}
void pageDestroyed( WebPage page ) {
if( page.getDescriptor().isTopLevel() ) {
removeMenuItem( page.getDescriptor() );
}
}
void layout() {
actionsBar.layout();
uiParent.layout();
}
Button getBackButton() {
return backButton;
}
ToolBar getPageSwitcher() {
return pageSwitcher;
}
Menu getPageSwitcherMenu() {
return pageSwitcherMenu;
}
private void init() {
shell.setLayout( createShellLayout() );
}
private GridLayout createShellLayout() {
GridLayout layout = new GridLayout( 1, false );
layout.marginHeight = 0;
layout.marginWidth = 0;
layout.verticalSpacing = 0;
return layout;
}
private void createPageParent() {
pageParent = new Composite( shell, SWT.NONE );
pageParent.setLayoutData( new GridData( GridData.FILL, GridData.FILL, true, true ) );
}
private void createUIParent() {
uiParent = new Composite( shell, SWT.NONE );
uiParent.setData( RWT.CUSTOM_VARIANT, CUSTOM_VARIANT_TABRIS_UI );
uiParent.setLayoutData( new GridData( GridData.FILL, GridData.CENTER, true, false ) );
uiParent.setBackgroundMode( SWT.INHERIT_DEFAULT );
GridLayout layout = new GridLayout( 4, false );
layout.marginHeight = 0;
layout.marginWidth = 10;
layout.verticalSpacing = 0;
uiParent.setLayout( layout );
}
private void createBackButton() {
backButton = new Button( uiParent, SWT.PUSH );
backButton.setData( RWT.CUSTOM_VARIANT, BACK_BUTTON_CUSTOM_VARIANT );
backButton.setLayoutData( new GridData( BACK_BUTTON_SIZE, BACK_BUTTON_SIZE ) );
backButton.setEnabled( false );
backButtonSelectionListener = new BackButtonSelectionListener();
}
private void createPageSwitcher() {
pageSwitcher = new ToolBar( uiParent, SWT.NONE );
pageSwitcher.setData( RWT.CUSTOM_VARIANT, CUSTOM_VARIANT_TABRIS_UI );
pageSwitcher.setLayoutData( new GridData( GridData.FILL, GridData.CENTER, false, false ) );
ToolItem pageSwitcherDropDown = new ToolItem( pageSwitcher, SWT.DROP_DOWN );
pageSwitcherDropDown.setData( RWT.CUSTOM_VARIANT, CUSTOM_VARIANT_TABRIS_UI );
pageSwitcherDropDown.addListener( SWT.Selection, new PageSwitcherSelectionListener() );
pageSwitcherMenu = new Menu( uiParent.getShell(), SWT.POP_UP );
pageSwitcherMenu.setData( RWT.CUSTOM_VARIANT, CUSTOM_VARIANT_TABRIS_UI );
}
private void createSeparator() {
Composite separator = new Composite( uiParent, SWT.NONE );
GridData layoutData = new GridData( GridData.FILL, GridData.CENTER, true, false );
layoutData.heightHint = 1;
separator.setLayoutData( layoutData );
}
private void createActionsBar() {
actionsBar = new Composite( uiParent, SWT.NONE );
actionsBar.setLayoutData( new GridData( GridData.FILL, GridData.CENTER, false, false ) );
RowLayout layout = new RowLayout();
layout.wrap = false;
layout.center = true;
actionsBar.setLayout( layout );
}
private void updatePageNavigationBar( PageDescriptor pageDescriptor ) {
if( pageDescriptor.isTopLevel() ) {
backButton.removeListener( SWT.Selection, backButtonSelectionListener );
backButton.setEnabled( false );
notifyMenuItemSelected( pageDescriptor );
} else {
if( !backButton.isListening( SWT.Selection ) ) {
backButton.addListener( SWT.Selection, backButtonSelectionListener );
}
backButton.setEnabled( true );
}
}
private void notifyMenuItemSelected( PageDescriptor pageDescriptor ) {
for( MenuItem item : pageSwitcherMenu.getItems() ) {
Object itemData = item.getData();
if( itemData == pageDescriptor ) {
Event event = new Event();
event.data = DATA_ACTIVATED;
item.notifyListeners( SWT.Selection, event );
break;
}
}
}
private void addMenuItem( PageDescriptor pageDescriptor ) {
MenuItem item = new MenuItem( pageSwitcherMenu, SWT.PUSH );
item.setData( RWT.CUSTOM_VARIANT, CUSTOM_VARIANT_TABRIS_UI );
String title = pageDescriptor.getTitle();
item.setText( title == null ? "" : title );
item.setImage( getImage( uiParent.getDisplay(), pageDescriptor.getImage() ) );
item.setData( pageDescriptor );
item.addListener( SWT.Selection, new MenuItemSelectionListener() );
}
private void removeMenuItem( PageDescriptor pageDescriptor ) {
for( MenuItem item : pageSwitcherMenu.getItems() ) {
Object itemData = item.getData();
if( pageDescriptor == itemData ) {
item.dispose();
break;
}
}
}
void updatePageSwitcher( PageDescriptor descriptor, String title ) {
updateMenuItems( descriptor, title );
updateToolItems( descriptor, title );
}
private void updateMenuItems( PageDescriptor descriptor, String title ) {
for( MenuItem menuItem : pageSwitcherMenu.getItems() ) {
if( menuItem.getData() == descriptor ) {
menuItem.setText( title );
}
}
}
private void updateToolItems( PageDescriptor descriptor, String title ) {
for( ToolItem toolItem : pageSwitcher.getItems() ) {
if( toolItem.getData() == descriptor ) {
toolItem.setText( title );
toolItem.getParent().getParent().layout( true, true );
}
}
}
private final class BackButtonSelectionListener implements Listener {
@Override
public void handleEvent( Event event ) {
ui.getPageOperator().closeCurrentPage();
}
}
private final class PageSwitcherSelectionListener implements Listener {
@Override
public void handleEvent( Event event ) {
ToolItem item = ( ToolItem )event.widget;
Rectangle bounds = item.getBounds();
bounds.y += bounds.height;
Point point = pageSwitcher.toDisplay( bounds.x + 10, bounds.y );
pageSwitcherMenu.setLocation( point );
pageSwitcherMenu.setVisible( true );
}
}
private final class MenuItemSelectionListener implements Listener {
@Override
public void handleEvent( Event event ) {
MenuItem item = ( MenuItem )event.widget;
PageDescriptor pageDescriptor = ( PageDescriptor )item.getData();
ToolItem dropDown = pageSwitcher.getItem( 0 );
dropDown.setText( item.getText() );
dropDown.setData( pageDescriptor );
dropDown.setImage( item.getImage() );
if( !DATA_ACTIVATED.equals( event.data ) ) {
ui.getPageOperator().openPage( pageDescriptor.getId() );
}
}
}
}