/******************************************************************************* * 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.demos.ui.dynamic; import java.io.InputStream; import java.math.BigInteger; import java.security.SecureRandom; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.rap.rwt.RWT; import org.eclipse.rap.rwt.widgets.DialogUtil; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.MessageBox; import com.eclipsesource.tabris.ui.AbstractPage; import com.eclipsesource.tabris.ui.ActionConfiguration; import com.eclipsesource.tabris.ui.PageConfiguration; import com.eclipsesource.tabris.ui.PageData; public class DynamicPage extends AbstractPage { private final List<String> globalActiondIds; private final List<String> pageActiondIds; private final List<String> rootPageIds; private Color COLOR_RED; private Color COLOR_GREEN; private Color COLOR_WHITE; public DynamicPage() { globalActiondIds = getSessionList( "globalActions" ); rootPageIds = getSessionList( "rootPages" ); pageActiondIds = new ArrayList<String>(); } @SuppressWarnings("unchecked") private List<String> getSessionList( String attributeId ) { Object attribute = RWT.getUISession().getAttribute( attributeId ); if( attribute == null ) { List<String> result = new ArrayList<String>(); RWT.getUISession().setAttribute( attributeId, result ); return result; } return ( List<String> )attribute; } @Override public void createContent( Composite parent, PageData data ) { initColors(); GridLayout layout = new GridLayout(); parent.setLayout( layout ); createButtons( parent ); } private void initColors() { COLOR_RED = new Color( getUI().getDisplay(), new RGB( 210, 50, 20 ) ); COLOR_WHITE = new Color( getUI().getDisplay(), new RGB( 255, 255, 255 ) ); COLOR_GREEN = getUI().getDisplay().getSystemColor( SWT.COLOR_DARK_GREEN ); } private void createButtons( Composite parent ) { createAddRootPageButton( parent ); createAddPageButton( parent ); createAddGlobalActionButton( parent ); createAddActionButton( parent ); createSeparator( parent ); createRemoveRootPageButton( parent ); createRemoveGlobalActionButton( parent ); createRemoveActionButton( parent ); } private void createSeparator( Composite parent ) { Composite separator = new Composite( parent, SWT.NONE ); separator.setLayoutData( GridDataFactory.fillDefaults().grab( true, true ).create() ); } private void createAddRootPageButton( Composite parent ) { Button addRootPageButton = new Button( parent, SWT.PUSH ); addRootPageButton.setText( "Add Root Page" ); colorAddButton( addRootPageButton ); addRootPageButton.setLayoutData( GridDataFactory.fillDefaults().align( SWT.FILL, SWT.TOP ).grab( true, false ).create() ); applyImage( "/add_root_page.png", addRootPageButton ); addRootPageButton.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( SelectionEvent e ) { String id = createId(); InputStream image = DynamicPage.class.getResourceAsStream( "/action_share.png" ); ActionConfiguration actionConfiguration = new ActionConfiguration( id, DynamicAction.class ).setImage( image ); PageConfiguration pageConfiguration = new PageConfiguration( id, DynamicPage.class ) .setTitle( "Root Page: " + id ) .setTopLevel( true ); pageConfiguration.addActionConfiguration( actionConfiguration ); getUIConfiguration().addPageConfiguration( pageConfiguration ); PageData pageData = new PageData(); pageData.set( "id", id ); rootPageIds.add( id ); openPage( id, pageData ); } } ); } private void createRemoveRootPageButton( final Composite parent ) { Button removeRootPageButton = new Button( parent, SWT.PUSH ); removeRootPageButton.setText( "Remove Last Root Page" ); removeRootPageButton.setLayoutData( GridDataFactory.fillDefaults().align( SWT.FILL, SWT.TOP ).grab( true, false ).create() ); colorRemoveButton( removeRootPageButton ); applyImage( "/remove_root_page.png", removeRootPageButton ); removeRootPageButton.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( SelectionEvent e ) { if( !rootPageIds.isEmpty() ) { String lastId = rootPageIds.get( rootPageIds.size() - 1 ); try { getUIConfiguration().removePageConfiguration( lastId ); rootPageIds.remove( rootPageIds.size() - 1 ); } catch( IllegalStateException ise ) { MessageBox messageBox = new MessageBox( parent.getShell() ); messageBox.setMessage( "Can not remove active page with id " + lastId ); messageBox.setText( "Not Allowed" ); DialogUtil.open( messageBox, null ); } } } } ); } private void createAddPageButton( Composite parent ) { Button addPageButton = new Button( parent, SWT.PUSH ); addPageButton.setText( "Add Page" ); colorAddButton( addPageButton ); addPageButton.setLayoutData( GridDataFactory.fillDefaults().align( SWT.FILL, SWT.TOP ).grab( true, false ).create() ); applyImage( "/add_page.png", addPageButton ); addPageButton.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( SelectionEvent e ) { String id = createId(); PageConfiguration pageConfiguration = new PageConfiguration( id, DynamicPage.class ) .setTitle( "Page: " + id ) .setTopLevel( false ); getUIConfiguration().addPageConfiguration( pageConfiguration ); PageData pageData = new PageData(); pageData.set( "id", id ); openPage( id, pageData ); } } ); } private void createAddActionButton( Composite parent ) { Button addActionButton = new Button( parent, SWT.PUSH ); addActionButton.setText( "Add Page Action" ); addActionButton.setLayoutData( GridDataFactory.fillDefaults().align( SWT.FILL, SWT.TOP ).grab( true, false ).create() ); colorAddButton( addActionButton ); applyImage( "/action.png", addActionButton ); addActionButton.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( SelectionEvent e ) { String id = createId(); pageActiondIds.add( id ); InputStream image = DynamicPage.class.getResourceAsStream( "/action_theme.png" ); ActionConfiguration actionConfiguration = new ActionConfiguration( id, DynamicAction.class ).setImage( image ); getUIConfiguration().getPageConfiguration( getPageId() ).addActionConfiguration( actionConfiguration ); } } ); } private void createRemoveActionButton( Composite parent ) { Button removeLastActionButton = new Button( parent, SWT.PUSH ); removeLastActionButton.setText( "Remove Last Page Action" ); colorRemoveButton( removeLastActionButton ); removeLastActionButton.setLayoutData( GridDataFactory.fillDefaults().align( SWT.FILL, SWT.TOP ).grab( true, false ).create() ); applyImage( "/action.png", removeLastActionButton ); removeLastActionButton.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( SelectionEvent e ) { if( !pageActiondIds.isEmpty() ) { String lastId = pageActiondIds.get( pageActiondIds.size() - 1 ); pageActiondIds.remove( pageActiondIds.size() - 1 ); getUIConfiguration().getPageConfiguration( getPageId() ).removeActionConfiguration( lastId ); } } } ); } private void createAddGlobalActionButton( Composite parent ) { Button addGlobalActionButton = new Button( parent, SWT.PUSH ); addGlobalActionButton.setText( "Add Global Action" ); addGlobalActionButton.setLayoutData( GridDataFactory.fillDefaults().align( SWT.FILL, SWT.TOP ).grab( true, false ).create() ); colorAddButton( addGlobalActionButton ); applyImage( "/global_action.png", addGlobalActionButton ); addGlobalActionButton.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( SelectionEvent e ) { String id = createId(); globalActiondIds.add( id ); InputStream image = DynamicPage.class.getResourceAsStream( "/action_settings.png" ); ActionConfiguration actionConfiguration = new ActionConfiguration( id, DynamicAction.class ).setImage( image ); getUIConfiguration().addActionConfiguration( actionConfiguration ); } } ); } private void createRemoveGlobalActionButton( Composite parent ) { Button removeLastGlobalActionButton = new Button( parent, SWT.PUSH ); removeLastGlobalActionButton.setText( "Remove Last Global Action" ); colorRemoveButton( removeLastGlobalActionButton ); removeLastGlobalActionButton.setLayoutData( GridDataFactory.fillDefaults().align( SWT.FILL, SWT.TOP ).grab( true, false ).create() ); applyImage( "/global_action.png", removeLastGlobalActionButton ); removeLastGlobalActionButton.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( SelectionEvent e ) { if( !globalActiondIds.isEmpty() ) { String lastId = globalActiondIds.get( globalActiondIds.size() - 1 ); globalActiondIds.remove( globalActiondIds.size() - 1 ); getUIConfiguration().removeActionConfiguration( lastId ); } } } ); } private void colorAddButton( Button button ) { button.setBackground( COLOR_GREEN ); button.setForeground( COLOR_WHITE ); } private void colorRemoveButton( Button button ) { button.setBackground( COLOR_RED ); button.setForeground( COLOR_WHITE ); } private String getPageId() { return getUI().getPageOperator().getCurrentPageId(); } private String createId() { SecureRandom random = new SecureRandom(); return new BigInteger( 12, random ).toString( 6 ); } private void applyImage( String file, Button button ) { button.setImage( new Image( button.getDisplay(), DynamicPage.class.getResourceAsStream( file ) ) ); } }