/**
* Copyright (c) 2002-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 - Initial API and implementation
*/
package org.eclipse.emf.edit.ui;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.common.EMFPlugin;
import org.eclipse.emf.common.ui.EclipseUIPlugin;
import org.eclipse.emf.common.util.ResourceLocator;
import org.eclipse.emf.ecore.plugin.RegistryReader;
import org.eclipse.emf.edit.ui.util.QueryDelegateTextViewer;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
/**
* The <b>Plugin</b> for the model EMF.Edit.UI library.
* EMF must run
* within an Eclipse workbench,
* within a headless Eclipse workspace,
* or just stand-alone as part of some other application.
* To support this, all resource access should be directed to the resource locator,
* which can redirect the service as appropriate to the runtime.
* During stand-alone invocation no plugin initialization takes place.
* In this case, emf.edit.resources.jar must be on the CLASSPATH.
* @see #INSTANCE
*/
public final class EMFEditUIPlugin extends EMFPlugin
{
/**
* The singleton instance of the plugin.
*/
public static final EMFEditUIPlugin INSTANCE = new EMFEditUIPlugin();
/**
* The one instance of this class.
*/
private static Implementation plugin;
public static final String QUERY_DELEGATE_TEXT_VIEWER_FACTORIES_PPID = "queryDelegateTextViewerFactories";
/**
* Creates the singleton instance.
*/
private EMFEditUIPlugin()
{
super(new ResourceLocator []{});
}
/*
* Javadoc copied from base class.
*/
@Override
public ResourceLocator getPluginResourceLocator()
{
return plugin;
}
/**
* Returns the singleton instance of the Eclipse plugin.
* @return the singleton instance.
*/
public static Implementation getPlugin()
{
return plugin;
}
/**
* The actual implementation of the Eclipse <b>Plugin</b>.
*/
public static class Implementation extends EclipseUIPlugin
{
/**
* Creates an instance.
*/
public Implementation()
{
super();
// Remember the static instance.
//
plugin = this;
}
/**
* Starts up this plugin by reading some extensions and populating the relevant registries.
* <p>
* @throws Exception if there is a show stopping problem.
*/
@Override
public void start(BundleContext context) throws Exception
{
super.start(context);
Bundle bundle = Platform.getBundle("org.eclipse.jface.text");
if (bundle != null && (bundle.getState() & (Bundle.ACTIVE | Bundle.STARTING | Bundle.RESOLVED)) != 0)
{
new RegistryReader(
Platform.getExtensionRegistry(),
EMFEditUIPlugin.getPlugin().getBundle().getSymbolicName(),
QUERY_DELEGATE_TEXT_VIEWER_FACTORIES_PPID)
{
@Override
protected boolean readElement(IConfigurationElement element, boolean add)
{
if (element.getName().equals("factory"))
{
String uri = element.getAttribute("uri");
if (uri == null)
{
logMissingAttribute(element, "uri");
}
else if (element.getAttribute("class") == null)
{
logMissingAttribute(element, "class");
}
class FactoryDescriptor extends PluginClassDescriptor implements QueryDelegateTextViewer.Factory.Descriptor
{
protected QueryDelegateTextViewer.Factory factory;
public FactoryDescriptor(IConfigurationElement e, String attrName)
{
super(e, attrName);
}
public QueryDelegateTextViewer.Factory getFactory()
{
if (factory == null)
{
factory = (QueryDelegateTextViewer.Factory)createInstance();
}
return factory;
}
public IConfigurationElement getElement()
{
return element;
}
}
if (add)
{
Object previous = QueryDelegateTextViewer.Factory.Registry.INSTANCE.put(uri, new FactoryDescriptor(element, "class"));
if (previous instanceof FactoryDescriptor)
{
FactoryDescriptor descriptor = (FactoryDescriptor)previous;
EMFEditUIPlugin.INSTANCE.log("Both '" + descriptor.getElement().getContributor().getName() + "' and '"
+ element.getContributor().getName() + "' register a query delegate text viewer factory for '" + uri + "'");
}
return true;
}
else
{
QueryDelegateTextViewer.Factory.Registry.INSTANCE.remove(uri);
return true;
}
}
return false;
}
}.readRegistry();
}
}
}
}