/******************************************************************************* * Copyright (c) 2013, 2014 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.demo.controls; import java.lang.reflect.Field; import java.util.Arrays; import org.eclipse.rap.rwt.scripting.ClientListener; import org.eclipse.rap.rwt.widgets.WidgetUtil; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Canvas; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.List; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.Widget; public class ScriptingTab extends ExampleTab { private static final String[] WIDGETS = new String[]{ "Text", "Button", "Label", "Canvas" }; private static final int WIDGET_TEXT = 0; private static final int WIDGET_BUTTON = 1; private static final int WIDGET_LABEL = 2; private static final int WIDGET_CANVAS = 3; private static final String[] EVENT_TYPES = new String[] { "KeyDown", "KeyUp", "MouseDown", "MouseUp", "MouseMove", "MouseEnter", "MouseExit", "MouseDoubleClick", "Paint", "Selection", "DefaultSelection", "FocusIn", "FocusOut", "Show", "Hide", "Modify", "Verify", "MouseWheel" }; private Button button; private String buttonScript; private int[] buttonEventTypeIndex; private Text text; private String textScript; private int[] textEventTypeIndex; private Label label; private String labelScript; private int[] labelEventTypeIndex; private Canvas canvas; private String canvasScript; private int[] canvasEventTypeIndex; private Text script; private Combo widgetCombo; private List typeList; public ScriptingTab() { super( "Scripting" ); WidgetUtil.registerDataKeys( "text", "button", "label", "canvas" ); initListener(); } @Override protected void createStyleControls( Composite parent ) { parent.setLayout( new GridLayout( 1, false ) ); widgetCombo = new Combo( parent, SWT.DROP_DOWN | SWT.READ_ONLY ); widgetCombo.setItems( WIDGETS ); widgetCombo.select( 1 ); widgetCombo.addListener( SWT.Selection, new Listener() { public void handleEvent( Event event ) { fillStyleControls(); } } ); script = new Text( parent, SWT.MULTI | SWT.BORDER ); script.setLayoutData( new GridData( 500, 300 ) ); script.setFont( new Font( script.getDisplay(), "Courier New", 12, SWT.NORMAL ) ); script.addListener( SWT.Modify, new Listener() { public void handleEvent( Event event ) { storeScript(); } } ); typeList = new List( parent, SWT.BORDER | SWT.V_SCROLL | SWT.MULTI ); typeList.setItems( EVENT_TYPES ); typeList.addListener( SWT.Selection, new Listener() { public void handleEvent( Event event ) { storeEventType(); } } ); typeList.setLayoutData( new GridData( SWT.DEFAULT, 100 ) ); Button set = new Button( parent, SWT.PUSH ); set.setText( "set" ); set.addListener( SWT.Selection, new Listener() { public void handleEvent( Event event ) { createNew(); } } ); fillStyleControls(); } private void connectWidgets() { Widget[] widgets = new Widget[]{ text, button, label, canvas }; for( Widget widget : widgets ) { widget.setData( "text", WidgetUtil.getId( text ) ); widget.setData( "label", WidgetUtil.getId( label ) ); widget.setData( "button", WidgetUtil.getId( button ) ); widget.setData( "canvs", WidgetUtil.getId( canvas ) ); } } @Override protected void createExampleControls( Composite parent ) { parent.setLayout( new GridLayout( 1, false ) ); text = new Text( parent, SWT.BORDER | SWT.SINGLE ); text.setText( "Text" ); text.setLayoutData( new GridData( 150, 25 ) ); attachTextListener(); button = new Button( parent, getStyle() | SWT.PUSH ); button.setText( "Button" ); button.setLayoutData( new GridData( 150, 25 ) ); attachButtonListener(); label = new Label( parent, SWT.BORDER ); label.setLayoutData( new GridData( 150, 25 ) ); label.setText( "Label" ); attachLabelListener(); canvas = new Canvas( parent, SWT.BORDER ); canvas.setLayoutData( new GridData( 300, 300 ) ); attachCanvasListener(); connectWidgets(); } private void fillStyleControls() { switch( widgetCombo.getSelectionIndex() ) { case WIDGET_TEXT: script.setText( textScript ); typeList.setSelection( textEventTypeIndex ); break; case WIDGET_BUTTON: script.setText( buttonScript ); typeList.setSelection( buttonEventTypeIndex ); break; case WIDGET_LABEL: script.setText( labelScript ); typeList.setSelection( labelEventTypeIndex ); break; case WIDGET_CANVAS: script.setText( canvasScript ); typeList.setSelection( canvasEventTypeIndex ); break; } typeList.showSelection(); } private void storeEventType() { switch( widgetCombo.getSelectionIndex() ) { case WIDGET_TEXT: textEventTypeIndex = typeList.getSelectionIndices(); break; case WIDGET_BUTTON: buttonEventTypeIndex = typeList.getSelectionIndices(); break; case WIDGET_LABEL: labelEventTypeIndex = typeList.getSelectionIndices(); break; case WIDGET_CANVAS: canvasEventTypeIndex = typeList.getSelectionIndices(); break; } } private void storeScript() { switch( widgetCombo.getSelectionIndex() ) { case WIDGET_TEXT: textScript = script.getText(); break; case WIDGET_BUTTON: buttonScript = script.getText(); break; case WIDGET_LABEL: labelScript = script.getText(); break; case WIDGET_CANVAS: canvasScript = script.getText(); break; } } private void attachCanvasListener() { ClientListener listener = new ClientListener( canvasScript ); for( int eventTypeIndex : canvasEventTypeIndex ) { canvas.addListener( getEventType( eventTypeIndex ), listener ); } } private void attachLabelListener() { ClientListener listener = new ClientListener( labelScript ); for( int eventTypeIndex : labelEventTypeIndex ) { label.addListener( getEventType( eventTypeIndex ), listener ); } } private void attachButtonListener() { ClientListener listener = new ClientListener( buttonScript ); for( int eventTypeIndex : buttonEventTypeIndex ) { button.addListener( getEventType( eventTypeIndex ), listener ); } } private void attachTextListener() { ClientListener listener = new ClientListener( textScript ); for( int eventTypeIndex : textEventTypeIndex ) { text.addListener( getEventType( eventTypeIndex ), listener ); } } private int getEventType( int typeIndex ) { String typeString = EVENT_TYPES[ typeIndex ]; try { Field field = SWT.class.getField( typeString ); return field.getInt( null ); } catch( SecurityException e ) { throw new RuntimeException( e ); } catch( NoSuchFieldException e ) { throw new RuntimeException( e ); } catch( IllegalArgumentException e ) { throw new RuntimeException( e ); } catch( IllegalAccessException e ) { throw new RuntimeException( e ); } } private void initListener() { initTextListener(); initButtonListener(); initLabelListener(); initCanvasListener(); } private void initTextListener() { textScript = "var handleEvent = function( event ) {\n" + " event.doit = isNumber( event.character ) || event.text.length == 0;\n" + "};\n" + "\n" + "var isNumber = function( character ) {\n" + " var charCode = character.charCodeAt( 0 );\n" + " return charCode >=48 && charCode <= 57;\n" + "};"; textEventTypeIndex = new int[] { Arrays.asList( EVENT_TYPES ).indexOf( "Verify" ) }; } private void initButtonListener() { buttonScript = "var handleEvent = function( event ) {\n" + " var widget = event.widget;\n" + " var label = rap.getObject( widget.getData( \"label\" ) );\n" + " label.setBackground( [ randomByte(), randomByte(), randomByte() ] );\n" + "};\n" + "\n" + "var randomByte = function() {\n" + " return Math.round( Math.random() * 255 );\n" + "}\n"; buttonEventTypeIndex = new int[] { Arrays.asList( EVENT_TYPES ).indexOf( "MouseDown" ) }; } private void initCanvasListener() { canvasScript = "var points = [];\n" + "\n" + "var handleEvent = function( event ) {\n" + " switch( event.type ) {\n" + " case SWT.MouseMove:\n" + " points.push( [ event.x, event.y ] );\n" + " event.widget.redraw();\n" + " break;\n" + " case SWT.Paint:\n" + " if( points.length > 1 ) {\n" + " event.gc.lineWidth = 4;\n" + " event.gc.beginPath();\n" + " event.gc.moveTo( points[ 0 ][ 0 ], points[ 0 ][ 1 ] );\n" + " for( var i = 1; i < points.length; i++ ) {\n" + " event.gc.lineTo( points[ i ][ 0 ] , points[ i ][ 1 ] );\n" + " }\n" + " event.gc.stroke();\n" + " }\n" + " break;\n" + " }\n" + "};"; canvasEventTypeIndex = new int[] { Arrays.asList( EVENT_TYPES ).indexOf( "Paint" ), Arrays.asList( EVENT_TYPES ).indexOf( "MouseMove" ) }; } private void initLabelListener() { labelScript = "function handleEvent( event ){\n" + " var color = event.type == SWT.MouseEnter ? [ 255, 0, 0 ] : null;\n" + " event.widget.setForeground( color );\n" + "}\n"; labelEventTypeIndex = new int[] { Arrays.asList( EVENT_TYPES ).indexOf( "MouseEnter" ), Arrays.asList( EVENT_TYPES ).indexOf( "MouseExit" ) }; } }