/*******************************************************************************
* 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.ui;
import static com.eclipsesource.tabris.internal.Clauses.when;
import static com.eclipsesource.tabris.internal.Clauses.whenNull;
import java.io.InputStream;
import java.io.Serializable;
import org.eclipse.rap.rwt.Adaptable;
import com.eclipsesource.tabris.internal.ui.ActionDescriptor;
import com.eclipsesource.tabris.internal.ui.ImageUtil;
import com.eclipsesource.tabris.internal.ui.InstanceCreator;
/**
* <p>
* {@link Action} objects will be instantiated by the framework. Therefore you need to be able to configure such an
* {@link Action} in a convenient way before it's actually created. This is the single purpose of a
* {@link ActionConfiguration}. It provides methods to define the visual role in a UI e.g. it's image or it's text.
* </p>
* <p>
* {@link ActionConfiguration} objects will be usually added to the {@link UIConfiguration} to have a global scope. Page
* actions needs to be added to a {@link PageConfiguration}.
* </p>
*
* @see Action
* @see UIConfiguration
* @see PageConfiguration
*
* @since 0.11
*/
public class ActionConfiguration implements Adaptable, Serializable {
private final String actionId;
private final Class<? extends Action> actionType;
private String title;
private boolean enabled;
private boolean visible;
private byte[] image;
private PlacementPriority placementPriority;
/**
* <p>
* Creates a new {@link ActionConfiguration} object with the defined id and an {@link Action} type. The id needs to be
* unique within the Tabris UI.
* </p>
*
* @param actionId the unique id of the {@link Action}. Must not be empty or <code>null</code>.
* @param actionType the type of the {@link Action} to be created. Must not be <code>null</code>.
*
* @since 1.0
*/
public ActionConfiguration( String actionId, Class<? extends Action> actionType ) {
whenNull( actionId ).throwIllegalArgument( "ActionId must not be null" );
when( actionId.isEmpty() ).throwIllegalArgument( "ActionId must not be empty" );
whenNull( actionType ).throwIllegalArgument( "Type of Action must not be null" );
this.actionId = actionId;
this.actionType = actionType;
this.title = "";
this.enabled = true;
this.visible = true;
}
/**<p>
* Returns the action id.
* </p>
*
* @since 1.4
*/
public String getId() {
return actionId;
}
/**
* <p>
* Defines the title of the action.
* </p>
*
* @param title the title of the action. Must not be empty or <code>null</code>.
*/
public ActionConfiguration setTitle( String title ) {
whenNull( title ).throwIllegalArgument( "Action Title must not be null" );
this.title = title;
return this;
}
/**
* <p>
* Returns the action title.
* </p>
*
* @since 1.4
*/
public String getTitle() {
return title;
}
/**
* <p>
* Defines the initial visibility of the action.
* </p>
*/
public ActionConfiguration setVisible( boolean visible ) {
this.visible = visible;
return this;
}
/**
* <p>
* Returns if the action is visible or not.
* </p>
*
* @since 1.4
*/
public boolean isVisible() {
return visible;
}
/**
* <p>
* Defines the initial enabled state of the action.
* </p>
*/
public ActionConfiguration setEnabled( boolean enabled ) {
this.enabled = enabled;
return this;
}
/**
* <p>
* Returns if the action is enabled or not.
* </p>
*
* @since 1.4
*/
public boolean isEnabled() {
return enabled;
}
/**
* <p>
* Defines the image of an action.
* </p>
*
* @param image the image of the action. Must not be <code>null</code>.
*
* @since 1.0
*/
public ActionConfiguration setImage( InputStream image ) {
whenNull( image ).throwIllegalArgument( "Action Image must not be null" );
this.image = ImageUtil.getBytes( image );
return this;
}
/**
* <p>
* Returns the action image as bytes.
* </p>
*
* @since 1.4
*/
public byte[] getImage() {
return image;
}
/**
* <p>
* Defines the {@link PlacementPriority} of the action.
* </p>
*
* @param placementPriority the placement priority of the action. Must not be <code>null</code>.
*
* @see PlacementPriority
* @since 1.2
*/
public ActionConfiguration setPlacementPriority( PlacementPriority placementPriority ) {
whenNull( placementPriority ).throwIllegalArgument( "PlacementPriority must not be null" );
this.placementPriority = placementPriority;
return this;
}
/**
* <p>
* Returns the action placement priority.
* </p>
*
* @since 1.4
*/
public PlacementPriority getPlacementPriority() {
return placementPriority;
}
/**
* @since 1.0
*/
@Override
@SuppressWarnings("unchecked")
public <T> T getAdapter( Class<T> adapter ) {
if( adapter == ActionDescriptor.class ) {
return ( T )createDescriptor();
}
return null;
}
private ActionDescriptor createDescriptor() {
Action action = InstanceCreator.createInstance( actionType );
return new ActionDescriptor( actionId, action )
.setTitle( title )
.setImage( image )
.setVisible( visible )
.setEnabled( enabled )
.setPlacementPrority( placementPriority );
}
}