/******************************************************************************* * 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(); } }