/**
* Copyright (c) 2005-2008 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 - Initial API and implementation
*/
package org.eclipse.emf.converter.ui.contribution;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.wizard.IWizard;
import org.eclipse.jface.wizard.IWizardNode;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.emf.common.util.URI;
/**
* @since 2.2.0
*/
public abstract class ModelConverterManager<D extends ModelConverterDescriptor>
{
public static class ModelConverterDescriptorImpl implements ModelConverterDescriptor
{
protected String id;
protected String name;
protected Image icon;
protected String description;
protected IConfigurationElement configurationElement;
public String getID()
{
return id;
}
public void setID(String id)
{
this.id = id;
}
public Image getIcon()
{
return icon;
}
public void setIcon(Image icon)
{
this.icon = icon;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getDescription()
{
return description;
}
public void setDescription(String description)
{
this.description = description;
}
protected Object createExecutableExtension(String attribute)
{
if (configurationElement != null)
{
try
{
return configurationElement.createExecutableExtension(attribute);
}
catch (Exception e)
{
// Ignore
}
}
return null;
}
}
public static class ModelConverterDescriptorLabelProvider extends LabelProvider
{
@Override
public Image getImage(Object element)
{
if (element instanceof ModelConverterDescriptor)
{
return ((ModelConverterDescriptor)element).getIcon();
}
else
{
return super.getImage(element);
}
}
@Override
public String getText(Object element)
{
if (element instanceof ModelConverterDescriptor)
{
return ((ModelConverterDescriptor)element).getName();
}
else
{
return super.getText(element);
}
}
}
public static abstract class ModelConverterDescriptorWizardNode implements IWizardNode
{
protected boolean contentCreated = false;
protected ModelConverterDescriptor descriptor;
protected IWizard wizard;
protected Point point;
public ModelConverterDescriptorWizardNode(ModelConverterDescriptor descriptor)
{
this.descriptor = descriptor;
}
public void dispose()
{
wizard = null;
descriptor = null;
point = null;
}
public IWizard getWizard()
{
if (wizard == null)
{
if (descriptor != null)
{
wizard = createWizard();
}
}
return wizard;
}
abstract protected IWizard createWizard();
public boolean isContentCreated()
{
return contentCreated;
}
public void setContentCreated(boolean contentCreated)
{
this.contentCreated = contentCreated;
}
public Point getExtent()
{
if (point == null)
{
point = new Point(-1, -1);
}
return point;
}
}
protected List<D> descriptors;
public void dispose()
{
if (descriptors != null)
{
descriptors.clear();
descriptors = null;
}
}
abstract protected ModelConverterDescriptorWizardNode createModelConverterDescriptorWizardNode(D descriptor);
/**
* @return a map in which the key is a {@link ModelConverterDescriptor} and
* the value is a {@link ModelConverterDescriptorWizardNode}
*/
public Map<D, ModelConverterDescriptorWizardNode> createModelConverterDescriptorWizardNodeMap()
{
if (descriptors != null)
{
Map<D, ModelConverterDescriptorWizardNode> map = new HashMap<D, ModelConverterDescriptorWizardNode>();
for (D descriptor : descriptors)
{
ModelConverterDescriptorWizardNode wizardNode = createModelConverterDescriptorWizardNode(descriptor);
map.put(descriptor, wizardNode);
}
return map;
}
else
{
return Collections.emptyMap();
}
}
public List<D> getModelConverterDescriptors()
{
if (descriptors == null)
{
descriptors = retrieveContributedModelConverterDescriptors();
}
return descriptors;
}
public D getModelConverterDescriptor(String id)
{
if (id != null)
{
for (D descriptor : getModelConverterDescriptors())
{
if (id.equals(descriptor.getID()))
{
return descriptor;
}
}
}
return null;
}
abstract protected String getPluginId();
abstract protected String getExtensionPointId();
public List<D> retrieveContributedModelConverterDescriptors()
{
List<D> descriptors = new ArrayList<D>();
IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(getPluginId(), getExtensionPointId());
IConfigurationElement[] configurationElements = extensionPoint.getConfigurationElements();
for (int i = 0; i < configurationElements.length; i++)
{
D descriptor = createFromContribution(configurationElements[i]);
if (descriptor != null)
{
descriptors.add(descriptor);
}
}
return descriptors;
}
abstract protected String getElementName();
abstract protected ModelConverterDescriptorImpl createModelConverterDescriptorImpl();
protected D createFromContribution(IConfigurationElement configurationElement)
{
if (getElementName().equals(configurationElement.getName()))
{
String id = configurationElement.getAttribute("id");
String name = configurationElement.getAttribute("name");
String wizard = configurationElement.getAttribute("wizard");
if (id != null && name != null && wizard != null)
{
ModelConverterDescriptorImpl descriptorImpl = createModelConverterDescriptorImpl();
descriptorImpl.setID(id);
descriptorImpl.setName(name);
descriptorImpl.setDescription(configurationElement.getAttribute("description"));
descriptorImpl.configurationElement = configurationElement;
String iconValue = configurationElement.getAttribute("icon");
if (iconValue != null)
{
URI iconURI = URI.createURI(iconValue);
if (iconURI.isRelative())
{
URI pluginURI = URI.createPlatformPluginURI(configurationElement.getContributor().getName() + "/", true);
iconURI = iconURI.resolve(pluginURI);
}
try
{
ImageDescriptor imageDescriptor = ImageDescriptor.createFromURL(new URL(iconURI.toString()));
descriptorImpl.setIcon(imageDescriptor.createImage());
}
catch (Exception e)
{
// Ignore
}
}
@SuppressWarnings("unchecked")
D descriptor = (D)descriptorImpl;
return descriptor;
}
}
return null;
}
}