/*******************************************************************************
* Copyright (c) 2011, 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 org.eclipse.rap.examples.internal;
import java.io.IOException;
import java.io.InputStream;
import org.eclipse.rap.examples.ExampleUtil;
import org.eclipse.rap.examples.IExampleContribution;
import org.eclipse.rap.examples.IExamplePage;
import org.eclipse.rap.rwt.RWT;
import org.eclipse.rap.rwt.application.AbstractEntryPoint;
import org.eclipse.rap.rwt.client.service.BrowserNavigation;
import org.eclipse.rap.rwt.client.service.BrowserNavigationEvent;
import org.eclipse.rap.rwt.client.service.BrowserNavigationListener;
import org.eclipse.rap.rwt.client.service.JavaScriptExecutor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.Version;
public class MainUi extends AbstractEntryPoint {
private final static String SHELL_RESIZE_NEEDED = "shellResizeNeeded";
private static final String RAP_PAGE_URL = "http://eclipse.org/rap/";
private static final int HEADER_HEIGHT = 140;
private static final int CENTER_AREA_WIDTH = 998;
private Composite centerArea;
private Navigation navigation;
private Composite navBar;
@Override
protected Shell createShell( Display display ) {
Shell shell = super.createShell( display );
shell.setData( RWT.CUSTOM_VARIANT, "mainshell" );
Listener shellResizeListener = new Listener() {
@Override
public void handleEvent( Event event ) {
updateShellSize( shell );
}
};
display.addListener( SWT.Resize, shellResizeListener );
shell.addListener( SWT.Resize, shellResizeListener );
return shell;
}
private static void updateShellSize( Shell shell ) {
if( !Boolean.TRUE.equals( shell.getData( SHELL_RESIZE_NEEDED ) ) ) {
shell.setData( SHELL_RESIZE_NEEDED, Boolean.TRUE );
Display display = shell.getDisplay();
display.asyncExec( new Runnable() {
@Override
public void run() {
Rectangle displayBounds = display.getBounds();
Point size = shell.computeSize( displayBounds.width, SWT.DEFAULT );
shell.setSize( size.x, Math.max( size.y, displayBounds.height ) );
shell.setData( SHELL_RESIZE_NEEDED, Boolean.FALSE );
}
} );
}
}
@Override
protected void createContents( Composite parent ) {
parent.setLayout( new FillLayout() );
createContent( parent );
attachHistoryListener();
selectInitialContribution();
removeSplash();
}
private void attachHistoryListener() {
BrowserNavigation history = RWT.getClient().getService( BrowserNavigation.class );
if( history != null ) {
history.addBrowserNavigationListener( new BrowserNavigationListener() {
@Override
public void navigated( BrowserNavigationEvent event ) {
Examples examples = Examples.getInstance();
IExampleContribution contribution = examples.getContribution( event.getState() );
if( contribution != null ) {
selectContribution( contribution );
}
}
} );
}
}
private void selectInitialContribution() {
IExampleContribution contribution = Examples.getInstance().findInitialContribution();
if( contribution != null ) {
selectContribution( contribution );
}
}
private void removeSplash() {
JavaScriptExecutor executor = RWT.getClient().getService( JavaScriptExecutor.class );
if( executor != null ) {
executor.execute( "document.body.removeChild( document.getElementById( \"splash\" ) );" );
}
}
private Composite createContent( Composite parent ) {
Composite comp = new Composite( parent, SWT.NONE );
comp.setLayout( new FormLayout() );
Composite header = createHeader( comp );
header.setLayoutData( createHeaderFormData() );
createContentBody( comp, header );
return comp;
}
private Composite createHeader( Composite parent ) {
Composite comp = new Composite( parent, SWT.NONE );
comp.setData( RWT.CUSTOM_VARIANT, "header" );
comp.setBackgroundMode( SWT.INHERIT_DEFAULT );
comp.setLayout( new FormLayout() );
Composite headerCenterArea = createHeaderCenterArea( comp );
createLogo( headerCenterArea );
createTitle( headerCenterArea );
return comp;
}
private FormData createHeaderFormData() {
FormData data = new FormData();
data.top = new FormAttachment( 0 );
data.left = new FormAttachment( 0 );
data.right = new FormAttachment( 100 );
data.height = HEADER_HEIGHT;
return data;
}
private Composite createHeaderCenterArea( Composite parent ) {
Composite headerCenterArea = new Composite( parent, SWT.NONE );
headerCenterArea.setLayout( new FormLayout() );
headerCenterArea.setLayoutData( createHeaderCenterAreaFormData() );
return headerCenterArea;
}
private FormData createHeaderCenterAreaFormData() {
FormData data = new FormData();
data.left = new FormAttachment( 50, -CENTER_AREA_WIDTH / 2 );
data.top = new FormAttachment( 0 );
data.bottom = new FormAttachment( 100 );
data.width = CENTER_AREA_WIDTH;
return data;
}
private void createLogo( Composite headerComp ) {
Label logoLabel = new Label( headerComp, SWT.NONE );
Image rapLogo = MainUi.getImage( headerComp.getDisplay(), "RAP-logo.png" );
logoLabel.setImage( rapLogo );
logoLabel.setLayoutData( createLogoFormData( rapLogo ) );
makeLink( logoLabel, RAP_PAGE_URL );
}
private void createTitle( Composite headerComp ) {
Label title = new Label( headerComp, SWT.NONE );
title.setText( "Demo" );
title.setLayoutData( createTitleFormData() );
title.setData( RWT.CUSTOM_VARIANT, "title" );
}
private void createContentBody( Composite parent, Composite header ) {
Composite composite = new Composite( parent, SWT.NONE );
composite.setData( RWT.CUSTOM_VARIANT, "mainContentArea" );
composite.setLayout( new FormLayout() );
composite.setLayoutData( createContentBodyFormData( header ) );
navigation = createNavigation( composite );
Composite footer = createFooter( composite );
centerArea = createCenterArea( composite, footer );
}
private Composite createCenterArea( Composite parent, Composite footer ) {
Composite centerArea = new Composite( parent, SWT.NONE );
centerArea.setLayout( new FillLayout() );
centerArea.setLayoutData( createCenterAreaFormData( footer ) );
centerArea.setData( RWT.CUSTOM_VARIANT, "centerArea" );
return centerArea;
}
private FormData createCenterAreaFormData( Composite footer ) {
FormData data = new FormData();
data.top = new FormAttachment( navBar, 0, SWT.BOTTOM );
data.bottom = new FormAttachment( footer, 0, SWT.TOP );
data.left = new FormAttachment( 50, ( -CENTER_AREA_WIDTH / 2 ) -10 );
data.width = CENTER_AREA_WIDTH + 10;
return data;
}
private Composite createFooter( Composite contentComposite ) {
Composite footer = new Composite( contentComposite, SWT.NONE );
footer.setBackgroundMode( SWT.INHERIT_DEFAULT );
footer.setLayout( new FormLayout() );
footer.setData( RWT.CUSTOM_VARIANT, "footer" );
footer.setLayoutData( createFooterFormData() );
Label label = new Label( footer, SWT.NONE );
label.setData( RWT.CUSTOM_VARIANT, "footerLabel" );
label.setText( "RAP version: " + getRapVersion() );
label.setLayoutData( createFooterLabelFormData( footer ) );
return footer;
}
private FormData createFooterFormData() {
FormData data = new FormData();
data.left = new FormAttachment( 50, ( -CENTER_AREA_WIDTH / 2 ) );
data.top = new FormAttachment( 100, -40 );
data.bottom = new FormAttachment( 100 );
data.width = CENTER_AREA_WIDTH -10 - 2;
return data;
}
private FormData createFooterLabelFormData( Composite footer ) {
FormData data = new FormData();
data.top = new FormAttachment( 50, -10 );
data.right = new FormAttachment( 100, -15 );
return data;
}
private FormData createContentBodyFormData( Composite header ) {
FormData data = new FormData();
data.top = new FormAttachment( header, 0 );
data.left = new FormAttachment( 0, 0 );
data.right = new FormAttachment( 100, 0 );
data.bottom = new FormAttachment( 100, 0 );
return data;
}
private Navigation createNavigation( Composite parent ) {
navBar = new Composite( parent, SWT.NONE );
navBar.setLayout( new FormLayout() );
navBar.setLayoutData( createNavBarFormData() );
navBar.setData( RWT.CUSTOM_VARIANT, "nav-bar" );
Navigation navigation = new Navigation( navBar ) {
@Override
protected void selectContribution( IExampleContribution contribution ) {
MainUi.this.selectContribution( contribution );
}
};
Control navigationControl = navigation.getControl();
navigationControl.setLayoutData( createNavigationFormData() );
navigationControl.setData( RWT.CUSTOM_VARIANT, "navigation" );
return navigation;
}
private void selectContribution( IExampleContribution contribution ) {
navigation.selectNavigationEntry( contribution );
activate( contribution );
updateShellSize( getShell() );
}
private void activate( IExampleContribution contribution ) {
IExamplePage examplePage = contribution.createPage();
if( examplePage != null ) {
BrowserNavigation history = RWT.getClient().getService( BrowserNavigation.class );
if( history != null ) {
history.pushState( contribution.getId(), contribution.getTitle() );
}
Control[] children = centerArea.getChildren();
for( Control child : children ) {
child.dispose();
}
Composite contentComp = ExampleUtil.initPage( contribution.getTitle(), centerArea );
examplePage.createControl( contentComp );
centerArea.layout( true, true );
}
}
private static FormData createLogoFormData( Image rapLogo ) {
FormData data = new FormData();
data.left = new FormAttachment( 0 );
int logoHeight = rapLogo.getBounds().height;
data.top = new FormAttachment( 50, -( logoHeight / 2 ) );
return data;
}
private static FormData createTitleFormData() {
FormData data = new FormData();
data.bottom = new FormAttachment( 100, -26 );
data.left = new FormAttachment( 0, 250 );
return data;
}
private static FormData createNavBarFormData() {
FormData data = new FormData();
data.top = new FormAttachment( 0 );
data.left = new FormAttachment( 0 );
data.right = new FormAttachment( 100 );
return data;
}
private static FormData createNavigationFormData() {
FormData data = new FormData();
data.left = new FormAttachment( 50, ( -CENTER_AREA_WIDTH / 2 ) - 7 );
data.top = new FormAttachment( 0 );
data.bottom = new FormAttachment( 100 );
data.width = CENTER_AREA_WIDTH;
return data;
}
public static Image getImage( Display display, String path ) {
ClassLoader classLoader = MainUi.class.getClassLoader();
InputStream inputStream = classLoader.getResourceAsStream( "resources/" + path );
Image result = null;
if( inputStream != null ) {
try {
result = new Image( display, inputStream );
} finally {
try {
inputStream.close();
} catch( IOException e ) {
// ignore
}
}
}
return result;
}
private static String getRapVersion() {
Version version = FrameworkUtil.getBundle( RWT.class ).getVersion();
StringBuilder resultBuffer = new StringBuilder( 20 );
resultBuffer.append( version.getMajor() );
resultBuffer.append( '.' );
resultBuffer.append( version.getMinor() );
resultBuffer.append( '.' );
resultBuffer.append( version.getMicro() );
resultBuffer.append( " (Build " );
resultBuffer.append( version.getQualifier() );
resultBuffer.append( ')' );
return resultBuffer.toString();
}
private static void makeLink( Label control, final String url ) {
control.setCursor( control.getDisplay().getSystemCursor( SWT.CURSOR_HAND ) );
control.addMouseListener( new MouseAdapter() {
@Override
public void mouseDown( MouseEvent e ) {
JavaScriptExecutor executor = RWT.getClient().getService( JavaScriptExecutor.class );
if( executor != null ) {
executor.execute( "window.location.href = '" + url + "'" );
}
}
} );
}
}