blob: f7eff21d0ad16c85e4bad3dc63848ef177d5addd [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2010 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.gef.palette;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.gef.Tool;
/**
* A factory for returning Tools.
*/
public abstract class ToolEntry extends PaletteEntry {
/** Type Identifier **/
public static final Object PALETTE_TYPE_TOOL = "$Palette Tool";//$NON-NLS-1$
private Map map;
private Class toolClass;
/**
* Creates a new ToolEntry. Any parameter can be <code>null</code>.
*
* @param label
* the entry's name
* @param shortDesc
* the entry's description
* @param iconSmall
* the entry's small icon
* @param iconLarge
* the entry's large icon
*/
public ToolEntry(String label, String shortDesc, ImageDescriptor iconSmall,
ImageDescriptor iconLarge) {
this(label, shortDesc, iconSmall, iconLarge, null);
}
/**
* Constructor to create a new ToolEntry. Any parameter can be
* <code>null</code>.
*
* @param label
* the entry's name
* @param description
* the entry's description
* @param iconSmall
* the entry's small icon
* @param iconLarge
* the entry's large icon
* @param tool
* the type of tool that this entry uses
* @since 3.1
*/
public ToolEntry(String label, String description,
ImageDescriptor iconSmall, ImageDescriptor iconLarge, Class tool) {
super(label, description, iconSmall, iconLarge, PALETTE_TYPE_TOOL);
setToolClass(tool);
}
/**
* Creates the tool of the type specified by {@link #setToolClass(Class)}
* for this ToolEntry. The tool is also configured with the properties set
* in {@link #setToolProperty(Object, Object)}. Sub-classes overriding this
* method should ensure that their tools are also configured with those
* properties.
*
* @return the tool for this entry
*/
public Tool createTool() {
if (toolClass == null)
return null;
Tool tool;
try {
tool = (Tool) toolClass.newInstance();
} catch (IllegalAccessException iae) {
return null;
} catch (InstantiationException ie) {
return null;
}
tool.setProperties(getToolProperties());
return tool;
}
/**
* @return the properties set in {@link #setToolProperty(Object, Object)}
* @since 3.1
*/
protected Map getToolProperties() {
return map;
}
/**
* Returns the property value for the specified property key.
*
* @param key
* the property key
* @return the value for the requested property
* @since 3.1
*/
public Object getToolProperty(Object key) {
if (map != null)
return map.get(key);
return null;
}
/**
* Sets the type of tool to be created. This provides clients with a method
* of specifying a different type of tool to be created without having to
* sub-class. The provided class should have a default constructor for this
* to work successfully.
*
* @param toolClass
* the type of tool to be created by this entry
* @since 3.1
*/
public void setToolClass(Class toolClass) {
if (toolClass != null)
Assert.isTrue(Tool.class.isAssignableFrom(toolClass));
this.toolClass = toolClass;
}
/**
* Clients can use this method to configure the associated tool without
* having to sub-class.
*
* @param key
* the property name
* @param value
* a value of type associated with the given property
* @since 3.1
* @see Tool#setProperties(Map)
*/
public void setToolProperty(Object key, Object value) {
if (map == null)
map = new HashMap();
map.put(key, value);
}
}