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