blob: bbfef3e6d4889953a28ccce49d9704ea9a3c19a3 [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2012, 2016 Obeo 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:
* Obeo - initial API and implementation
* Mathias Schaefer - preferences refactoring
*******************************************************************************/
package org.eclipse.emf.compare.rcp.ui;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.preferences.ConfigurationScope;
import org.eclipse.core.runtime.preferences.DefaultScope;
import org.eclipse.core.runtime.preferences.IScopeContext;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.emf.compare.rcp.EMFCompareRCPPlugin;
import org.eclipse.emf.compare.rcp.extension.AbstractRegistryEventListener;
import org.eclipse.emf.compare.rcp.internal.extension.IItemRegistry;
import org.eclipse.emf.compare.rcp.internal.extension.impl.ItemRegistry;
import org.eclipse.emf.compare.rcp.ui.contentmergeviewer.accessor.factory.IAccessorFactory;
import org.eclipse.emf.compare.rcp.ui.internal.configuration.ui.ConfigurationUIRegistryEventListener;
import org.eclipse.emf.compare.rcp.ui.internal.configuration.ui.IConfigurationUIFactory;
import org.eclipse.emf.compare.rcp.ui.internal.contentmergeviewer.accessor.factory.impl.AccessorFactoryExtensionRegistryListener;
import org.eclipse.emf.compare.rcp.ui.internal.contentmergeviewer.accessor.factory.impl.AccessorFactoryRegistryImpl;
import org.eclipse.emf.compare.rcp.ui.internal.contentmergeviewer.customization.ContentMergeViewerCustomizationRegistry;
import org.eclipse.emf.compare.rcp.ui.internal.contentmergeviewer.customization.ContentMergeViewerCustomizationRegistryListener;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.impl.DifferenceFilterExtensionRegistryListener;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.impl.DifferenceFilterManager;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.impl.DifferenceFilterRegistryImpl;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.extender.DifferenceGroupExtenderRegistryImpl;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.extender.DifferenceGroupExtenderRegistryListener;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.impl.DifferenceGroupManager;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.impl.DifferenceGroupProviderExtensionRegistryListener;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.impl.DifferenceGroupRegistryImpl;
import org.eclipse.emf.compare.rcp.ui.structuremergeviewer.filters.IDifferenceFilter;
import org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider;
import org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.extender.IDifferenceGroupExtender;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.eclipse.ui.preferences.ScopedPreferenceStore;
import org.osgi.framework.BundleContext;
/**
* The activator class controls the plug-in life cycle.
*
* @since 3.0
*/
public class EMFCompareRCPUIPlugin extends AbstractUIPlugin {
/**
* The plug-in ID.
*/
public static final String PLUGIN_ID = "org.eclipse.emf.compare.rcp.ui"; //$NON-NLS-1$
public static final String GROUP_PROVIDER_PPID = "groups"; //$NON-NLS-1$
public static final String FILTER_PROVIDER_PPID = "filters"; //$NON-NLS-1$
public static final String ACCESSOR_FACTORY_PPID = "accessorFactory"; //$NON-NLS-1$
/**
* @since 4.0
*/
public static final String DIFFERENCE_GROUP_EXTENDER_PPID = "differenceGroupExtender"; //$NON-NLS-1$
/**
* @since 4.0
*/
private static final String MATCH_ENGINE_FACTORY_CONFIGURATION_UI_PPID = "matchEngineFactoryConfigurationUI";//$NON-NLS-1$
/**
* @since 4.4
*/
private static final String CONTENT_CUSTOMIZATION_PPID = "contentMergeViewerCustomization"; //$NON-NLS-1$
/**
* the shared instance.
*/
private static EMFCompareRCPUIPlugin plugin;
/** keep track of resources that should be freed when exiting. */
private static Map<String, Image> resourcesMapper = new HashMap<String, Image>();
private AbstractRegistryEventListener groupProviderRegistryListener;
private IItemRegistry<IDifferenceGroupProvider.Descriptor> groupItemRegistry;
private IDifferenceGroupProvider.Descriptor.Registry groupProviderRegistry;
private AbstractRegistryEventListener filterRegistryListener;
private IDifferenceFilter.Registry filterRegistry;
private DifferenceFilterManager filterManager;
private AbstractRegistryEventListener accessorFactoryRegistryListener;
private IAccessorFactory.Registry accessorFactoryRegistry;
private AbstractRegistryEventListener differenceGroupExtenderRegistryListener;
private IDifferenceGroupExtender.Registry differenceGroupExtenderRegistry;
private Map<String, IConfigurationUIFactory> matchEngineConfiguratorRegistry;
private ConfigurationUIRegistryEventListener matchEngineConfiguratorRegistryListener;
private AbstractRegistryEventListener contentMergeViewerCustomizationRegistryListener;
private ContentMergeViewerCustomizationRegistry contentMergeViewerCustomizationRegistry;
/**
* The constructor.
*/
public EMFCompareRCPUIPlugin() {
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
*/
@Override
public void start(BundleContext context) throws Exception {
super.start(context);
plugin = this;
IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
groupItemRegistry = new ItemRegistry<IDifferenceGroupProvider.Descriptor>();
DifferenceGroupManager groupManager = new DifferenceGroupManager(groupItemRegistry,
getPreferenceStore());
groupProviderRegistry = new DifferenceGroupRegistryImpl(groupManager, groupItemRegistry);
groupProviderRegistryListener = new DifferenceGroupProviderExtensionRegistryListener(PLUGIN_ID,
GROUP_PROVIDER_PPID, getLog(), groupItemRegistry);
extensionRegistry.addListener(groupProviderRegistryListener, PLUGIN_ID + "." + GROUP_PROVIDER_PPID); //$NON-NLS-1$
groupProviderRegistryListener.readRegistry(extensionRegistry);
filterManager = new DifferenceFilterManager(getPreferenceStore());
filterRegistry = new DifferenceFilterRegistryImpl(filterManager);
filterRegistryListener = new DifferenceFilterExtensionRegistryListener(PLUGIN_ID,
FILTER_PROVIDER_PPID, getLog(), filterManager);
extensionRegistry.addListener(filterRegistryListener, PLUGIN_ID + "." + FILTER_PROVIDER_PPID); //$NON-NLS-1$
filterRegistryListener.readRegistry(extensionRegistry);
accessorFactoryRegistry = new AccessorFactoryRegistryImpl();
accessorFactoryRegistryListener = new AccessorFactoryExtensionRegistryListener(PLUGIN_ID,
ACCESSOR_FACTORY_PPID, getLog(), accessorFactoryRegistry);
extensionRegistry.addListener(accessorFactoryRegistryListener,
PLUGIN_ID + "." + ACCESSOR_FACTORY_PPID); //$NON-NLS-1$
accessorFactoryRegistryListener.readRegistry(extensionRegistry);
differenceGroupExtenderRegistry = new DifferenceGroupExtenderRegistryImpl();
differenceGroupExtenderRegistryListener = new DifferenceGroupExtenderRegistryListener(PLUGIN_ID,
DIFFERENCE_GROUP_EXTENDER_PPID, getLog(), differenceGroupExtenderRegistry);
extensionRegistry.addListener(differenceGroupExtenderRegistryListener,
PLUGIN_ID + "." + DIFFERENCE_GROUP_EXTENDER_PPID); //$NON-NLS-1$
differenceGroupExtenderRegistryListener.readRegistry(extensionRegistry);
matchEngineConfiguratorRegistry = new ConcurrentHashMap<String, IConfigurationUIFactory>();
matchEngineConfiguratorRegistryListener = new ConfigurationUIRegistryEventListener(PLUGIN_ID,
MATCH_ENGINE_FACTORY_CONFIGURATION_UI_PPID, getLog(), matchEngineConfiguratorRegistry,
EMFCompareRCPPlugin.getDefault().getMatchEngineFactoryDescriptorRegistry());
extensionRegistry.addListener(matchEngineConfiguratorRegistryListener,
PLUGIN_ID + '.' + MATCH_ENGINE_FACTORY_CONFIGURATION_UI_PPID);
matchEngineConfiguratorRegistryListener.readRegistry(extensionRegistry);
contentMergeViewerCustomizationRegistry = new ContentMergeViewerCustomizationRegistry();
contentMergeViewerCustomizationRegistryListener = new ContentMergeViewerCustomizationRegistryListener(
PLUGIN_ID, CONTENT_CUSTOMIZATION_PPID, getLog(), contentMergeViewerCustomizationRegistry);
extensionRegistry.addListener(contentMergeViewerCustomizationRegistryListener,
PLUGIN_ID + '.' + CONTENT_CUSTOMIZATION_PPID);
contentMergeViewerCustomizationRegistryListener.readRegistry(extensionRegistry);
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
*/
@Override
public void stop(BundleContext context) throws Exception {
IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
extensionRegistry.removeListener(matchEngineConfiguratorRegistryListener);
matchEngineConfiguratorRegistry = null;
matchEngineConfiguratorRegistryListener = null;
extensionRegistry.removeListener(differenceGroupExtenderRegistryListener);
differenceGroupExtenderRegistryListener = null;
differenceGroupExtenderRegistry = null;
extensionRegistry.removeListener(accessorFactoryRegistryListener);
accessorFactoryRegistryListener = null;
accessorFactoryRegistry = null;
extensionRegistry.removeListener(filterRegistryListener);
filterRegistryListener = null;
filterRegistry = null;
filterManager = null;
extensionRegistry.removeListener(groupProviderRegistryListener);
groupProviderRegistryListener = null;
groupItemRegistry = null;
groupProviderRegistry = null;
plugin = null;
disposeCachedImages();
super.stop(context);
}
/**
* Returns the shared instance.
*
* @return the shared instance
*/
public static EMFCompareRCPUIPlugin getDefault() {
return plugin;
}
/**
* Log an {@link Exception} in the {@link #getLog() current logger}.
*
* @param e
* the exception to be logged.
*/
public void log(Throwable e) {
getLog().log(new Status(IStatus.ERROR, PLUGIN_ID, e.getMessage(), e));
}
/**
* Log the given message with the give severity level. Severity is one of {@link IStatus#INFO},
* {@link IStatus#WARNING} and {@link IStatus#ERROR}.
*
* @param severity
* the severity of the message
* @param message
* the message
*/
public void log(int severity, String message) {
getLog().log(new Status(severity, PLUGIN_ID, message));
}
/**
* @return the groupProviderRegistry
* @since 4.0
*/
public IDifferenceGroupProvider.Descriptor.Registry getDifferenceGroupProviderRegistry() {
return groupProviderRegistry;
}
/**
* @return the item registry for group providers.
* @since 4.0
*/
public IItemRegistry<IDifferenceGroupProvider.Descriptor> getItemDifferenceGroupProviderRegistry() {
return groupItemRegistry;
}
/**
* @since 4.0
*/
public IDifferenceFilter.Registry getDifferenceFilterRegistry() {
return filterRegistry;
}
/**
* @return The Difference Filter manager.
* @since 4.0
*/
public DifferenceFilterManager getDifferenceFilterManager() {
return filterManager;
}
/**
* @return the registry
*/
public IAccessorFactory.Registry getAccessorFactoryRegistry() {
return accessorFactoryRegistry;
}
/**
* @return the sub tree registry
* @since 4.0
*/
public IDifferenceGroupExtender.Registry getDifferenceGroupExtenderRegistry() {
return differenceGroupExtenderRegistry;
}
/**
* Returns the registry containing all known content merge viewer customizations.
*
* @return the {@link ContentMergeViewerCustomizationRegistry} containing all known content merge viewer
* customizations.
* @since 4.4
*/
public ContentMergeViewerCustomizationRegistry getContentMergeViewerCustomizationRegistry() {
return contentMergeViewerCustomizationRegistry;
}
/**
* <p>
* returns a plugin image. The returned image does not need to be explicitly disposed.
* </p>
*
* @param imagePath
* : plugin relative path to the image
* @return Image : plugin hosted image
*/
public static Image getImage(String imagePath) {
Image image = resourcesMapper.get(imagePath);
if (image == null) {
ImageDescriptor imageDescriptor = imageDescriptorFromPlugin(PLUGIN_ID, imagePath);
image = imageDescriptor.createImage();
resourcesMapper.put(imagePath, image);
}
return image;
}
/**
* <p>
* returns a plugin image descriptor.
* </p>
*
* @param imagePath
* : plugin relative path to the image
* @return ImageDescriptor : image descriptor.
*/
public static ImageDescriptor getImageDescriptor(String imagePath) {
return imageDescriptorFromPlugin(PLUGIN_ID, imagePath);
}
/**
* Dispose image with the given id.
*
* @param id
* : dispose system resources associated with the image with the given id.
*/
public static void disposeImage(String id) {
Image image = resourcesMapper.remove(id);
if (image != null) {
image.dispose();
}
}
/**
* dispose system resources associated with cached images.
*/
public static void disposeCachedImages() {
Iterator<Image> iterator = resourcesMapper.values().iterator();
while (iterator.hasNext()) {
iterator.next().dispose();
}
resourcesMapper.clear();
}
/**
* Get the Match Engine Configurator Registry
*
* @return Map<String, IConfigurationUIFactory>
* @since 4.0
*/
public Map<String, IConfigurationUIFactory> getMatchEngineConfiguratorRegistry() {
return matchEngineConfiguratorRegistry;
}
/**
* Provide this plug-in's preference store, which searches values in {@link InstanceScope}, then
* {@link ConfigurationScope}, and then {@link DefaultScope}.
*/
@Override
public IPreferenceStore getPreferenceStore() {
ScopedPreferenceStore store = (ScopedPreferenceStore)super.getPreferenceStore();
store.setSearchContexts(new IScopeContext[] {InstanceScope.INSTANCE, ConfigurationScope.INSTANCE });
return store;
}
}