package com.codeaffine.example.rwt.osgi.ui.example.slides; import static org.eclipse.rap.rwt.application.ApplicationConfiguration.RESOURCE_ROOT_LOCATION; import javax.servlet.http.Cookie; import org.eclipse.rap.rwt.RWT; import org.eclipse.rap.rwt.resources.IResourceManager.RegisterOptions; import org.eclipse.swt.SWT; import org.eclipse.swt.browser.Browser; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.layout.RowLayout; import org.eclipse.swt.widgets.Button; 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 com.codeaffine.example.rwt.osgi.ui.platform.UIContributor; public class SlidesUIContributor implements UIContributor { static final String ID = "Slides"; private static final String SLIDE_COOKIE = "slide"; private static String[] slides; private Composite slidesHolder; private Label counter; private Browser slide; NavigationKeyBinding keyBindingListener; int selection; class NavigationKeyBinding implements Listener { private static final long serialVersionUID = 1L; @Override public void handleEvent( Event event ) { if( event.keyCode == SWT.PAGE_DOWN ) { showNextSlide(); } else if( event.keyCode == SWT.PAGE_UP ) { showPreviousSlide(); } } public String[] getActiveKeys() { return new String[] { "PAGE_UP", "PAGE_DOWN" }; } } @Override public String getId() { return ID; } @Override public Control contribute( Composite parent ) { createSlidesHolder( parent ); createSlideNavigation(); selectSlide(); return slidesHolder; } private void createSlidesHolder( Composite parent ) { slidesHolder = new Composite( parent, SWT.NONE ); slidesHolder.setLayout( new FillLayout() ); slide = new Browser( slidesHolder, SWT.NONE ); initializeSelection(); } private void initializeSelection() { Cookie cookie = CookieUtil.getCookie( SLIDE_COOKIE ); if( cookie != null ) { int slideLength = getSlides().length; int cookieSelection = Integer.parseInt( cookie.getValue() ); selection = cookieSelection > slideLength ? 1 : cookieSelection; } else { selection = 1; } } void selectSlide() { String slideHTMLSnippet = getSlides()[ selection - 1 ]; if( slideHTMLSnippet.startsWith( "http://" ) ) { slide.setUrl( slideHTMLSnippet ); } else { slide.setText( slideHTMLSnippet ); } updateCounterLabel(); } private void createSlideNavigation() { final Composite navigation = createNavigationControl(); createNavigationContent( navigation ); layoutNavigation( navigation ); registerKeyBindings( navigation ); addDisposeWatchdog( navigation ); } private void registerKeyBindings( Composite navigation ) { final Display display = navigation.getDisplay(); keyBindingListener = new NavigationKeyBinding(); display.setData( RWT.ACTIVE_KEYS, keyBindingListener.getActiveKeys() ); display.addFilter( SWT.KeyDown, keyBindingListener ); } private void addDisposeWatchdog( final Composite navigation ) { slidesHolder.addDisposeListener( new DisposeListener() { private static final long serialVersionUID = 1L; @Override public void widgetDisposed( DisposeEvent event ) { final Display display = navigation.getDisplay(); display.removeFilter( SWT.KeyDown, keyBindingListener ); if( !navigation.isDisposed() ) { navigation.dispose(); } } } ); } private void layoutNavigation( final Composite navigation ) { FormData data = new FormData(); navigation.setLayoutData( data ); data.height = MenuBar.MENU_BAR_HEIGHT; data.width = 80; data.left = new FormAttachment( 100, -10 - data.width ); data.top = new FormAttachment( 0, 0 ); } private Composite createNavigationControl() { Shell shell = slidesHolder.getShell(); final Composite result = new Composite( shell, SWT.NONE ); RowLayout layout = new RowLayout(); layout.marginTop = 10; result.setLayout( layout ); result.setData( RWT.CUSTOM_VARIANT, "navigation" ); result.moveAbove( null ); return result; } private void createNavigationContent( Composite navigation ) { createBackButton( navigation ); createCounterLabel( navigation ); createForwardButton( navigation ); } private void createForwardButton( Composite navigation ) { Button forward = new Button( navigation, SWT.PUSH ); forward.setText( "+" ); forward.setData( RWT.CUSTOM_VARIANT, "slide_navigation_forward" ); forward.addSelectionListener( new SelectionAdapter() { private static final long serialVersionUID = 1L; @Override public void widgetSelected( SelectionEvent e ) { showNextSlide(); } } ); } private void createCounterLabel( Composite navigation ) { counter = new Label( navigation, SWT.NONE ); updateCounterLabel(); counter.setData( RWT.CUSTOM_VARIANT, "slide_counter" ); } private void createBackButton( Composite navigation ) { final Button back = new Button( navigation, SWT.PUSH ); back.setText( "-" ); back.setData( RWT.CUSTOM_VARIANT, "slide_navigation_back" ); back.addSelectionListener( new SelectionAdapter() { private static final long serialVersionUID = 1L; @Override public void widgetSelected( SelectionEvent e ) { showPreviousSlide(); } } ); } private void updateCounterLabel() { counter.setText( calculateSelection() ); counter.getParent().pack(); CookieUtil.setCookie( SLIDE_COOKIE, String.valueOf( selection ) ); } private String calculateSelection() { return selection + "/" + getSlides().length; } String[] getSlides() { if( slides == null ) { registerImage( "/resources/chart/admin_9090.png" ); registerImage( "/resources/chart/admin_9091.png" ); registerImage( "/resources/chart/admin_app_conf.png" ); registerImage( "/resources/chart/admin_app.png" ); registerImage( "/resources/chart/example_9090.png" ); registerImage( "/resources/chart/example_9091.png" ); registerImage( "/resources/chart/example_app_conf.png" ); registerImage( "/resources/chart/example_app.png" ); registerImage( "/resources/chart/example_bundles.png" ); registerImage( "/resources/chart/http_jetty.png" ); registerImage( "/resources/chart/jetty.png" ); registerImage( "/resources/chart/port_9090.png" ); registerImage( "/resources/chart/port_9091.png" ); registerImage( "/resources/chart/rwt_osgi.png" ); registerImage( "/resources/chart/rwt.png" ); String jQuery = "/resources/jquery-1.5.min.js"; RWT.getResourceManager().register( jQuery, getClass().getClassLoader().getResourceAsStream( jQuery ), "UTF-8", RegisterOptions.NONE ); String chart = "/resources/chart/chart.js"; RWT.getResourceManager().register( chart, getClass().getClassLoader().getResourceAsStream( chart ), "UTF-8", RegisterOptions.NONE ); String chartPage = "/resources/chart/chart.html"; RWT.getResourceManager().register( chartPage, getClass().getClassLoader().getResourceAsStream( chartPage ), "UTF-8", RegisterOptions.NONE ); int localPort = RWT.getRequest().getLocalPort(); slides = new String[] { getHTMLSnippet( registerImage( "start.png" ) ), getHTMLSnippet( registerImage( "web-frameworks-1.png" ) ), getHTMLSnippet( registerImage( "web-frameworks-2.png" ) ), getHTMLSnippet( registerImage( "widget-toolkit.png" ) ), getHTMLSnippet( registerImage( "widgets.png" ) ), getHTMLSnippet( registerImage( "modularity.png" ) ), getHTMLSnippet( registerImage( "chaos.png" ) ), getHTMLSnippet( registerImage( "container.png" ) ), getHTMLSnippet( registerImage( "dynamic.png" ) ), getHTMLSnippet( registerImage( "twitter.png" ) ), getHTMLSnippet( registerImage( "munsters.png" ) ), "http://localhost:" + localPort + "/" + RESOURCE_ROOT_LOCATION + chartPage, getHTMLSnippet( registerImage( "resources.png" ) ) }; } return slides; } private String getHTMLSnippet( String slideName ) { return "<img src=\"" + slideName + "\" width=\"100%\" height=\"100%\" />"; } private String registerImage( String name ) { String result = "/" + RESOURCE_ROOT_LOCATION + "/" + name; if( name.startsWith( "/" ) ) { result = "/" + RESOURCE_ROOT_LOCATION + name; } RWT.getResourceManager().register( name, getClass().getResourceAsStream( name ) ); return result; } void showNextSlide() { if( getSlides().length > selection ) { selection++; selectSlide(); } } void showPreviousSlide() { if( 1 < selection ) { selection--; selectSlide(); } } }