blob: 719b96789e80f75a95fec21e962509fe817c2b06 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2012 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.bpel.ui.factories;
import org.eclipse.bpel.ui.Policy;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gef.requests.CreationFactory;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.graphics.Image;
/**
* Factory that knows how to create one conceptual type of UI object
* (and only the one type of object). The objects created must be EMF model objects
* (i.e. instances of EObject) and the types that represent them must be EMF classes
* (i.e. instances of EClass).
*
* This corresponds to items that you can create with the palette of a DetailsEditor.
*
* NOTE: the object returned by getNewEObject() is NOT necessarily an instance of the
* same EClass as getEClass returns!
*
* Concrete subclasses must still specify where to get icons from, and what the
* human-readable type label of the factory should be.
*/
public abstract class AbstractUIObjectFactory implements CreationFactory {
protected String idString;
/**
* This implementation forms a package identifier for the EClass from its namespace URI.
* Example: for an Invoke object from the BPELPackage (which has a namespace URI of
* "http:///org/eclipse/bpel.ecore") it would return "org.eclipse.bpel.Invoke".
*/
protected String createUniqueIdString() {
// (1) get the namespace URI of the enclosing EPackage,
StringBuffer s = new StringBuffer(getModelType().getEPackage().getNsURI());
// (2) remove colon-prefixes such as "http:" (if any),
for (int i = s.indexOf(":"); i >= 0; i = s.indexOf(":")) s.delete(0,i+1); //$NON-NLS-1$ //$NON-NLS-2$
// (3) remove leading slashes (if any),
while (s.length() > 0 && s.charAt(0) == '/') s.deleteCharAt(0);
// (4) remove ".ecore" suffix (if any), and
if (s.toString().endsWith(".ecore")) s.setLength(s.length()-5); //$NON-NLS-1$
// (5) convert slashes to periods.
for (int i = 0; i<s.length(); i++) if (s.charAt(i)=='/') s.setCharAt(i,'.');
if (s.length() > 0 && s.charAt(s.length()-1) != '.') s.append('.');
s.append(getModelType().getName());
if (Policy.DEBUG) System.out.println("uniqueIdString for "+getModelType().getName()+" is: "+s); //$NON-NLS-1$ //$NON-NLS-2$
return s.toString();
}
/**
* Return the EClass representing the type of model object this factory creates.
*/
public abstract EClass getModelType();
/**
* Return a new instance of the type of model object this factory creates.
* This implementation can create instances of any EClass.
* @param <T> the type of the return object
* @return Return a new instance of the type of model object this factory creates.
*/
@SuppressWarnings("unchecked")
public <T extends EObject> T createInstance() {
EClass modelType = getModelType();
return (T) modelType.getEPackage().getEFactoryInstance().create(modelType);
}
/**
* Return a small image representing the type of model object this factory creates
*/
public abstract ImageDescriptor getSmallImageDescriptor();
/**
* Return a large image representing the type of model object this factory creates
*/
public abstract ImageDescriptor getLargeImageDescriptor();
/**
* Return a small image representing the type of model object this factory creates
*/
public abstract Image getSmallImage();
/**
* Return a large image representing the type of model object this factory creates
*/
public abstract Image getLargeImage();
/**
* Return a string labelling the type of model object this factory creates
*/
public abstract String getTypeLabel();
/**
* Return a string which will be unique across various models for this type of object.
* I.e. a string consisting of a package name reserved to that model and an EClass name
* for the type, e.g: "org.eclipse.bpel.Invoke"
*
* This string is suitable for use in action IDs and other places where non-conflicting
* strings are necessary.
*/
public String getUniqueIdString() {
if (idString == null) {
idString = createUniqueIdString();
}
return idString;
}
public final Object getNewObject() { return createInstance(); }
public final Object getObjectType() { return getModelType(); }
}