/******************************************************************************* * 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.layout.RowData; 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 com.eclipsesource.tabris.internal.ui.ActionDescriptor; import com.eclipsesource.tabris.internal.ui.UIDescriptor; import com.eclipsesource.tabris.internal.ui.rendering.ActionRenderer; import com.eclipsesource.tabris.ui.Action; import com.eclipsesource.tabris.ui.ActionListener; import com.eclipsesource.tabris.ui.UI; public class WebAction implements ActionRenderer { private final UI ui; private final WebUI uiRenderer; private final ActionDescriptor descriptor; private Button control; public WebAction( UI ui, WebUI uiRenderer, ActionDescriptor descriptor ) { this.ui = ui; this.uiRenderer = uiRenderer; this.descriptor = descriptor; } @Override public void createUi( Composite uiParent ) { if( control == null ) { control = new Button( uiParent, SWT.PUSH ); control.setData( RWT.CUSTOM_VARIANT, CUSTOM_VARIANT_TABRIS_UI ); control.setEnabled( descriptor.isEnabled() ); control.setVisible( descriptor.isVisible() ); control.setToolTipText( descriptor.getTitle() ); control.setImage( getImage( control.getDisplay(), descriptor.getImage() ) ); control.addListener( SWT.Selection, new ActionSelectionListener() ); } } @Override public void setEnabled( boolean enabled ) { whenNull( control ).throwIllegalState( "UI is not created" ); control.setEnabled( enabled ); } @Override public void setVisible( boolean visible ) { whenNull( control ).throwIllegalState( "UI is not created" ); control.setLayoutData( createRowData( SWT.DEFAULT, SWT.DEFAULT, visible ) ); control.setVisible( visible ); layoutWebUI(); } @Override public void destroy() { if( control != null ) { control.dispose(); control = null; } } @Override public ActionDescriptor getDescriptor() { return descriptor; } @Override public UI getUI() { return ui; } Button getControl() { return control; } protected void layoutWebUI() { uiRenderer.layout(); } protected void actionExecuted() { // might be implemented by subclasses } protected RowData createRowData( int width, int height, boolean visible ) { RowData data = new RowData( width, height ); data.exclude = !visible; return data; } private final class ActionSelectionListener implements Listener { @Override public void handleEvent( Event event ) { Action action = descriptor.getAction(); action.execute( ui ); actionExecuted(); notifyActionListeners( action ); } } private void notifyActionListeners( Action action ) { UIDescriptor uiDescriptor = ui.getConfiguration().getAdapter( UIDescriptor.class ); for( ActionListener listener : uiDescriptor.getActionListeners() ) { listener.executed( ui, action ); } } }