diff options
Diffstat (limited to 'plugins/org.eclipse.emf.compare.rcp.ui/src/org')
13 files changed, 786 insertions, 6 deletions
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/EMFCompareRCPUIPlugin.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/EMFCompareRCPUIPlugin.java index c0fe60a61..807904c6a 100644 --- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/EMFCompareRCPUIPlugin.java +++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/EMFCompareRCPUIPlugin.java @@ -31,6 +31,8 @@ import org.eclipse.emf.compare.rcp.ui.internal.configuration.ui.ConfigurationUIR 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; @@ -87,6 +89,11 @@ public class EMFCompareRCPUIPlugin extends AbstractUIPlugin { 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; @@ -118,6 +125,10 @@ public class EMFCompareRCPUIPlugin extends AbstractUIPlugin { private ConfigurationUIRegistryEventListener matchEngineConfiguratorRegistryListener; + private AbstractRegistryEventListener contentMergeViewerCustomizationRegistryListener; + + private ContentMergeViewerCustomizationRegistry contentMergeViewerCustomizationRegistry; + @Deprecated private IEMFCompareConfiguration compareConfiguration; @@ -188,6 +199,13 @@ public class EMFCompareRCPUIPlugin extends AbstractUIPlugin { 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); } /* @@ -304,6 +322,17 @@ public class EMFCompareRCPUIPlugin extends AbstractUIPlugin { } /** + * 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> diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/contentmergeviewer/customization/ContentMergeViewerCustomizationDescriptor.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/contentmergeviewer/customization/ContentMergeViewerCustomizationDescriptor.java new file mode 100644 index 000000000..fd2812bdb --- /dev/null +++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/contentmergeviewer/customization/ContentMergeViewerCustomizationDescriptor.java @@ -0,0 +1,171 @@ +/******************************************************************************* + * Copyright (c) 2016 EclipseSource Muenchen GmbH 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: + * Stefan Dirix - initial API and implementation + *******************************************************************************/ +package org.eclipse.emf.compare.rcp.ui.internal.contentmergeviewer.customization; + +import static com.google.common.base.Preconditions.checkNotNull; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IConfigurationElement; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.emf.compare.adapterfactory.context.IContextTester; +import org.eclipse.emf.compare.rcp.ui.EMFCompareRCPUIPlugin; +import org.eclipse.emf.compare.rcp.ui.internal.EMFCompareRCPUIMessages; + +/** + * The generic descriptor for content merge viewer customizations. + * + * @author Stefan Dirix <sdirix@eclipsesource.com> + * @param <T> + * the type of object produced by the descriptor. + */ +public class ContentMergeViewerCustomizationDescriptor<T> { + + /** + * Underlying {@link IConfigurationElement} describing this customization. + */ + private final IConfigurationElement configurationElement; + + /** + * Ranking of this handler. + */ + private final int ranking; + + /** + * Qualified class name of the provider from this {@link #configurationElement}. Will be used as + * identifier. + */ + private final String providerClassName; + + private final String providerAttributeName; + + /** + * Qualified class name of the context class + */ + private final String contextClassName; + + private final String contextAttributeName; + + /** + * Don't log the same error multiple times. + */ + private boolean logOnce; + + /** + * Don't log the same error multiple times. + */ + private boolean logOnceContext; + + /** + * The provider provided by this descriptor. + */ + private T provider; + + /** + * The context tester provided by this descriptor. + */ + private IContextTester contextTester; + + /** + * Default constructor. + * + * @param configurationElement + * Configuration element that served to populate this descriptor. + * @param contentProviderClass + * The contentProvider which + * @param mergeViewerItemProviderClass + * @param contextClass + * @param ranking + * Ranking of this handler. High-priority handlers take precedence over low-priority ones. + */ + ContentMergeViewerCustomizationDescriptor(IConfigurationElement configurationElement, + String providerClass, String providerAttributeName, String contextClass, + String contextAttributeName, int ranking) { + this.configurationElement = checkNotNull(configurationElement); + this.providerClassName = checkNotNull(providerClass); + this.contextClassName = contextClass; + this.ranking = ranking; + this.providerAttributeName = providerAttributeName; + this.contextAttributeName = contextAttributeName; + } + + /** + * {@inheritDoc} + * + * @see org.eclipse.emf.compare.ide.ui.internal.logical.view.ILogicalModelViewHandler#getRanking() + */ + public int getRanking() { + return ranking; + } + + /** + * Get the qualified class name of the described provider. + * + * @return the qualified class name of the described provider. + */ + public String getProviderClassName() { + return providerClassName; + } + + /** + * Create an instance of this provider. + * + * @return a new instance of this provider + */ + @SuppressWarnings("unchecked") + T getProvider() { + if (provider == null) { + try { + provider = (T)configurationElement.createExecutableExtension(providerAttributeName); + } catch (CoreException e) { + // Shouldn't happen since the registry listener should have checked that. + // log anyway. + if (!logOnce) { + logOnce = true; + final String message = EMFCompareRCPUIMessages + .getString("ContentCustomizationRegistry.invalidProvider", providerClassName); //$NON-NLS-1$ + final IStatus status = new Status(IStatus.ERROR, + configurationElement.getDeclaringExtension().getContributor().getName(), message, + e); + EMFCompareRCPUIPlugin.getDefault().getLog().log(status); + } + } + } + return provider; + } + + /** + * Create an instance of this tester. + * + * @return a new instance of this tester. + */ + IContextTester getContextTester() { + if (contextClassName != null && contextTester == null) { + try { + contextTester = (IContextTester)configurationElement + .createExecutableExtension(contextAttributeName); + } catch (CoreException e) { + // Shouldn't happen since the registry listener should have checked that. + // log anyway. + if (!logOnceContext) { + logOnceContext = true; + final String message = EMFCompareRCPUIMessages + .getString("ContentCustomizationRegistry.invalidContextTester", contextClassName); //$NON-NLS-1$ + final IStatus status = new Status(IStatus.ERROR, + configurationElement.getDeclaringExtension().getContributor().getName(), message, + e); + EMFCompareRCPUIPlugin.getDefault().getLog().log(status); + } + } + } + return contextTester; + } +} diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/contentmergeviewer/customization/ContentMergeViewerCustomizationRegistry.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/contentmergeviewer/customization/ContentMergeViewerCustomizationRegistry.java new file mode 100644 index 000000000..1ae18bbf0 --- /dev/null +++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/contentmergeviewer/customization/ContentMergeViewerCustomizationRegistry.java @@ -0,0 +1,159 @@ +/******************************************************************************* + * Copyright (c) 2016 EclipseSource Muenchen GmbH 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: + * Stefan Dirix - initial API and implementation + *******************************************************************************/ +package org.eclipse.emf.compare.rcp.ui.internal.contentmergeviewer.customization; + +import java.util.Collection; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; + +import org.eclipse.emf.compare.Comparison; +import org.eclipse.emf.compare.adapterfactory.context.IContextTester; +import org.eclipse.emf.compare.rcp.ui.mergeviewer.item.provider.IMergeViewerItemContentProvider; +import org.eclipse.emf.compare.rcp.ui.mergeviewer.item.provider.IMergeViewerItemProvider; +import org.eclipse.emf.compare.rcp.ui.mergeviewer.item.provider.IOptionalProvider; + +/** + * The registry responsible for managing the content merge viewer customizations. + * + * @author Stefan Dirix <sdirix@eclipsesource.com> + */ +public class ContentMergeViewerCustomizationRegistry { + /** Keeps track of the extensions providing {@link IMergeViewerItemProvider}s. */ + private final Map<String, ContentMergeViewerCustomizationDescriptor<IMergeViewerItemProvider>> registeredDescriptors; + + /** Keeps track of the extensions providing {@link IMergeViewerItemContentProvider}s. */ + private final Map<String, ContentMergeViewerCustomizationDescriptor<IMergeViewerItemContentProvider>> registeredTreeDescriptors; + + /** + * Constructs and initialized this registry. + */ + public ContentMergeViewerCustomizationRegistry() { + registeredDescriptors = new LinkedHashMap<String, ContentMergeViewerCustomizationDescriptor<IMergeViewerItemProvider>>(); + registeredTreeDescriptors = new LinkedHashMap<String, ContentMergeViewerCustomizationDescriptor<IMergeViewerItemContentProvider>>(); + } + + /** + * Adds the given {@link ContentMergeViewerCustomizationDescriptor} to this registry, using the given + * {@code className} as the identifier. + * + * @param className + * The identifier for the given {@link ContentMergeViewerCustomizationDescriptor}. + * @param descriptor + * The {@link ContentMergeViewerCustomizationDescriptor} which is to be added to this registry. + */ + public void addCustomization(String className, + ContentMergeViewerCustomizationDescriptor<IMergeViewerItemProvider> descriptor) { + registeredDescriptors.put(className, descriptor); + } + + /** + * Adds the given {@link ContentMergeViewerCustomizationDescriptor} to this registry, using the given + * {@code className} as the identifier. + * + * @param className + * The identifier for the given {@link ContentMergeViewerCustomizationDescriptor}. + * @param descriptor + * The {@link ContentMergeViewerCustomizationDescriptor} which is to be added to this registry. + */ + public void addTreeCustomization(String className, + ContentMergeViewerCustomizationDescriptor<IMergeViewerItemContentProvider> descriptor) { + registeredTreeDescriptors.put(className, descriptor); + } + + /** + * Removes the {@link ContentMergeViewerCustomizationDescriptor} and its managed + * {@link IDependencyProvider} identified by the given {@code className} from this registry. + * + * @param className + * Identifier of the provider we are to remove from this registry. + */ + public void removeDescriptor(String className) { + registeredDescriptors.remove(className); + registeredTreeDescriptors.remove(className); + } + + /** Clears out all registered listeners from this registry. */ + public void clear() { + registeredDescriptors.clear(); + registeredTreeDescriptors.clear(); + } + + private <T extends IOptionalProvider> T getBestFittingProvider( + Collection<ContentMergeViewerCustomizationDescriptor<T>> descriptors, Comparison comparison, + Object object) { + ContentMergeViewerCustomizationDescriptor<T> bestDescriptor = null; + final Map<Object, Object> context = createContext(comparison); + + for (ContentMergeViewerCustomizationDescriptor<T> descriptor : descriptors) { + IContextTester contextTester = descriptor.getContextTester(); + // check context + if (contextTester != null && !contextTester.apply(context)) { + continue; + } + // check ranking + if (bestDescriptor != null && bestDescriptor.getRanking() > descriptor.getRanking()) { + continue; + } + // check provider + if (descriptor.getProvider().canHandle(object)) { + bestDescriptor = descriptor; + } + } + + if (bestDescriptor != null) { + return bestDescriptor.getProvider(); + } + + return null; + } + + /** + * Creates the context for the {@link IContextTester}s. + * + * @param comparison + * the {@link Comparison}. + * @return the created context. + */ + private Map<Object, Object> createContext(Comparison comparison) { + final Map<Object, Object> context = new HashMap<Object, Object>(); + context.put(IContextTester.CTX_COMPARISON, comparison); + return context; + } + + /** + * Returns the best fitting {@link IMergeViewerItemProvider}. + * + * @param comparison + * the {@link Comparison} is used to check the context. + * @param object + * the {@link Object} for which the {@link IMergeViewerItemProvider} is responsible. + * @return the determined {@link IMergeViewerItemProvider} if one exists, {@code null} otherwise. + */ + public IMergeViewerItemProvider getBestFittingMergeViewerItemProvider(Comparison comparison, + Object object) { + return getBestFittingProvider(registeredDescriptors.values(), comparison, object); + } + + /** + * Returns the best fitting {@link IMergeViewerItemContentProvider}. + * + * @param comparison + * the {@link Comparison} is used to check the context. + * @param object + * the {@link Object} for which the {@link IMergeViewerItemContentProvider} is responsible. + * @return the determined {@link IMergeViewerItemContentProvider} if one exists, {@code null} otherwise. + */ + public IMergeViewerItemContentProvider getBestFittingMergeViewerItemContentProvider(Comparison comparison, + Object object) { + return getBestFittingProvider(registeredTreeDescriptors.values(), comparison, object); + } +} diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/contentmergeviewer/customization/ContentMergeViewerCustomizationRegistryListener.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/contentmergeviewer/customization/ContentMergeViewerCustomizationRegistryListener.java new file mode 100644 index 000000000..3e27edd34 --- /dev/null +++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/contentmergeviewer/customization/ContentMergeViewerCustomizationRegistryListener.java @@ -0,0 +1,158 @@ +/******************************************************************************* + * Copyright (c) 2016 EclipseSource Muenchen GmbH 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: + * Stefan Dirix - initial API and implementation + *******************************************************************************/ +package org.eclipse.emf.compare.rcp.ui.internal.contentmergeviewer.customization; + +import org.eclipse.core.runtime.IConfigurationElement; +import org.eclipse.core.runtime.ILog; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.emf.compare.rcp.extension.AbstractRegistryEventListener; +import org.eclipse.emf.compare.rcp.ui.internal.EMFCompareRCPUIMessages; +import org.eclipse.emf.compare.rcp.ui.mergeviewer.item.provider.IMergeViewerItemContentProvider; +import org.eclipse.emf.compare.rcp.ui.mergeviewer.item.provider.IMergeViewerItemProvider; + +/** + * The listener responsible for handling registration events regarding content merge viewer customizations. + * + * @author Stefan Dirix <sdirix@eclipsesource.com> + */ +public class ContentMergeViewerCustomizationRegistryListener extends AbstractRegistryEventListener { + + /** The content customization tag of our extension point. */ + private static final String TAG_CONTENT_CUSTOMIZATION = "contentCustomization"; //$NON-NLS-1$ + + /** The tree content customization tag of our extension point. */ + private static final String TAG_TREE_CONTENT_CUSTOMIZATION = "treeContentCustomization"; //$NON-NLS-1$ + + /** The "contentProvider" attribute of the tree content customization tag. */ + private static final String ATTRIBUTE_CONTENTPROVIDER = "contentProvider"; //$NON-NLS-1$ + + /** The "mergeViewerItemProvider" attribute of the tree content customization tag. */ + private static final String ATTRIBUTE_MERGEVIEWERITEMPROVIDER = "mergeViewerItemProvider"; //$NON-NLS-1$ + + /** The "context" attribute of the tree content customization tag. */ + private static final String ATTRIBUTE_CONTEXT = "context"; //$NON-NLS-1$ + + /** The "ranking" attribute of the tree content customization tag. */ + private static final String ATTRIBUTE_RANKING = "ranking"; //$NON-NLS-1$ + + /** The actual registry this listener will alter. */ + private final ContentMergeViewerCustomizationRegistry registry; + + /** + * Initialize a registry event listener for our handlers. + * + * @param pluginID + * ID of the plugin contributing the extension point to monitor. + * @param extensionPointID + * Actual id of the extension point to monitor. + * @param log + * Log in which errors/warning should be logged. + * @param contentMergeViewerCustomizationRegistry + * The actual store of handlers this registry will alter. + */ + public ContentMergeViewerCustomizationRegistryListener(String pluginID, String extensionPointID, ILog log, + ContentMergeViewerCustomizationRegistry contentMergeViewerCustomizationRegistry) { + super(pluginID, extensionPointID, log); + this.registry = contentMergeViewerCustomizationRegistry; + } + + @Override + protected boolean addedValid(IConfigurationElement element) { + if (element.getName().equals(TAG_CONTENT_CUSTOMIZATION)) { + final String mergeViewerItemProvider = element.getAttribute(ATTRIBUTE_MERGEVIEWERITEMPROVIDER); + + final String context = element.getAttribute(ATTRIBUTE_CONTEXT); + + final String rankingStr = element.getAttribute(ATTRIBUTE_RANKING); + int ranking = -1; + try { + ranking = Integer.parseInt(rankingStr); + } catch (NumberFormatException e) { + log(IStatus.ERROR, element, EMFCompareRCPUIMessages.getString( + "ContentCustomizationRegistry.invalidRanking", mergeViewerItemProvider, rankingStr)); //$NON-NLS-1$ + } + + final ContentMergeViewerCustomizationDescriptor<IMergeViewerItemProvider> descriptor = new ContentMergeViewerCustomizationDescriptor<IMergeViewerItemProvider>( + element, mergeViewerItemProvider, ATTRIBUTE_MERGEVIEWERITEMPROVIDER, context, + ATTRIBUTE_CONTEXT, ranking); + registry.addCustomization(mergeViewerItemProvider, descriptor); + return true; + } + if (element.getName().equals(TAG_TREE_CONTENT_CUSTOMIZATION)) { + final String contentProvider = element.getAttribute(ATTRIBUTE_CONTENTPROVIDER); + + final String context = element.getAttribute(ATTRIBUTE_CONTEXT); + + final String rankingStr = element.getAttribute(ATTRIBUTE_RANKING); + int ranking = -1; + try { + ranking = Integer.parseInt(rankingStr); + } catch (NumberFormatException e) { + log(IStatus.ERROR, element, EMFCompareRCPUIMessages.getString( + "ContentCustomizationRegistry.invalidRanking", contentProvider, rankingStr)); //$NON-NLS-1$ + } + + final ContentMergeViewerCustomizationDescriptor<IMergeViewerItemContentProvider> descriptor = new ContentMergeViewerCustomizationDescriptor<IMergeViewerItemContentProvider>( + element, contentProvider, ATTRIBUTE_CONTENTPROVIDER, context, ATTRIBUTE_CONTEXT, ranking); + registry.addTreeCustomization(contentProvider, descriptor); + return true; + } + return false; + } + + /** + * Returns the attribute with the {@code attributeName} from the given {@code element}. + * + * @param element + * the {@link IConfigurationElement}. + * @param attributeName + * the name of the attribute which's value is to be determined. + * @param defaultResult + * the result of this method if the attribute does not exist. + * @return The determined value of the attribute if it exists, {@code defaultResult} otherwise. + */ + protected String getAttribute(IConfigurationElement element, String attributeName, String defaultResult) { + String attribute = element.getAttribute(attributeName); + if (attribute != null) { + return attribute; + } + return defaultResult; + } + + /** + * {@inheritDoc} + * + * @see org.eclipse.emf.compare.rcp.extension.AbstractRegistryEventListener#removedValid(org.eclipse.core.runtime.IConfigurationElement) + */ + @Override + protected boolean removedValid(IConfigurationElement element) { + final String className; + if (element.getName().equals(TAG_CONTENT_CUSTOMIZATION)) { + className = element.getAttribute(ATTRIBUTE_MERGEVIEWERITEMPROVIDER); + } else { + className = element.getAttribute(ATTRIBUTE_CONTENTPROVIDER); + } + registry.removeDescriptor(className); + return true; + } + + /** + * {@inheritDoc} + * + * @see org.eclipse.emf.compare.rcp.extension.AbstractRegistryEventListener#validateExtensionElement(org.eclipse.core.runtime.IConfigurationElement) + */ + @Override + protected boolean validateExtensionElement(IConfigurationElement element) { + // Don't work twice as much, validate as we add. + // Removing cannot fail. + return true; + } +} diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/emfcomparercpuimessages.properties b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/emfcomparercpuimessages.properties index fd77e3408..e552d8194 100644 --- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/emfcomparercpuimessages.properties +++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/emfcomparercpuimessages.properties @@ -103,3 +103,8 @@ DefaultMatchEngineConfiguratorUI.useIdentifier.label = Select if identifiers sh DefaultMatchEngineConfiguratorUI.whenAvailable.label = When available: The engine will use some heuristics when identifiers are missing DefaultMatchEngineConfiguratorUI.only.label = Only: Objects without identifiers will never be matched. DefaultMatchEngineConfiguratorUI.never.label = Never: Objects will be matched with some heuristics regardless of having identifiers. + +ContentCustomizationRegistry.invalidRanking = Ranking of resolver ''{0}'' is not a valid integer : ''{1}''. +ContentCustomizationRegistry.invalidContextTester = IContextTester named ''{0}'' could not be instantiated. +ContentCustomizationRegistry.invalidProvider = Provider named ''{0}'' could not be instantiated. + diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/mergeviewer/impl/AbstractTableOrTreeMergeViewer.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/mergeviewer/impl/AbstractTableOrTreeMergeViewer.java index 4f5ba6157..084034863 100644 --- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/mergeviewer/impl/AbstractTableOrTreeMergeViewer.java +++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/mergeviewer/impl/AbstractTableOrTreeMergeViewer.java @@ -148,10 +148,7 @@ public abstract class AbstractTableOrTreeMergeViewer extends AbstractStructuredM IMergeViewerItem mergeViewerItem = ((IMergeViewerItem)data); Diff diff = mergeViewerItem.getDiff(); if (diff != null) { - if (MergeViewerUtil.isVisibleInMergeViewer(diff, getDifferenceGroupProvider(), - getDifferenceFilter()) - && !MergeViewerUtil.isMarkAsMerged(diff, mergeViewerItem, - getCompareConfiguration())) { + if (!MergeViewerUtil.isMarkAsMerged(diff, mergeViewerItem, getCompareConfiguration())) { if (mergeViewerItem.isInsertionPoint()) { paintItemDiffBox(event, itemWrapper, diff, getBoundsForInsertionPoint(event, itemWrapper)); diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/mergeviewer/item/impl/MergeViewerItem.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/mergeviewer/item/impl/MergeViewerItem.java index 1e790a75f..4d9e3ff11 100644 --- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/mergeviewer/item/impl/MergeViewerItem.java +++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/mergeviewer/item/impl/MergeViewerItem.java @@ -193,7 +193,6 @@ public class MergeViewerItem extends AdapterImpl implements IMergeViewerItem { ret = createBasicContainer((EObject)parent); } } - return ret; } @@ -255,7 +254,7 @@ public class MergeViewerItem extends AdapterImpl implements IMergeViewerItem { /** * @return the fComparison */ - protected final Comparison getComparison() { + public final Comparison getComparison() { return fComparison; } @@ -266,6 +265,7 @@ public class MergeViewerItem extends AdapterImpl implements IMergeViewerItem { return fAdapterFactory; } + @Deprecated protected final IMergeViewerItem.Container createBasicContainer(EObject eObject) { IMergeViewerItem.Container ret = null; Match parentMatch = fComparison.getMatch(eObject); @@ -337,6 +337,7 @@ public class MergeViewerItem extends AdapterImpl implements IMergeViewerItem { * the given {@link ResourceAttachmentChange}. * @return an IMergeViewerItem. */ + @Deprecated protected final IMergeViewerItem.Container createBasicContainer(ResourceAttachmentChange diff) { final Comparison comparison = getComparison(); Resource left = MergeViewerUtil.getResource(comparison, MergeViewerSide.LEFT, diff); @@ -347,6 +348,7 @@ public class MergeViewerItem extends AdapterImpl implements IMergeViewerItem { return ret; } + @Deprecated protected final List<IMergeViewerItem> createInsertionPoints(Comparison comparison, EStructuralFeature eStructuralFeature, final List<? extends IMergeViewerItem> values, List<? extends Diff> differences) { @@ -487,6 +489,7 @@ public class MergeViewerItem extends AdapterImpl implements IMergeViewerItem { return insertionPoint; } + @Deprecated protected final List<IMergeViewerItem> createMergeViewerItemFrom(Collection<?> values) { List<IMergeViewerItem> ret = newArrayListWithCapacity(values.size()); for (EObject value : filter(values, EObject.class)) { @@ -501,6 +504,7 @@ public class MergeViewerItem extends AdapterImpl implements IMergeViewerItem { return ret; } + @Deprecated protected boolean yieldsMergeViewerItem(Collection<?> values) { Iterable<EObject> elements = filter(values, EObject.class); if (fDiff != null && !Iterables.isEmpty(elements)) { @@ -517,6 +521,7 @@ public class MergeViewerItem extends AdapterImpl implements IMergeViewerItem { return false; } + @Deprecated protected boolean yieldsInsertionPoint(Iterable<Diff> diffs) { return Iterables.any(diffs, new Predicate<Diff>() { public boolean apply(Diff diff) { @@ -572,6 +577,7 @@ public class MergeViewerItem extends AdapterImpl implements IMergeViewerItem { * the given eObject. * @return an IMergeViewerItem. */ + @Deprecated protected IMergeViewerItem createMergeViewerItemFrom(EObject eObject) { Match match = getComparison().getMatch(eObject); @@ -610,11 +616,13 @@ public class MergeViewerItem extends AdapterImpl implements IMergeViewerItem { * the active group provider * @return a list of the filtered diffs */ + @Deprecated protected List<? extends Diff> filteredDiffs(Iterable<? extends Diff> unfilteredDiffs, Predicate<? super EObject> predicate, IDifferenceGroupProvider groupProvider) { return Lists.newArrayList(filter(unfilteredDiffs, visibleInMergeViewer(predicate, groupProvider))); } + @Deprecated protected Predicate<Diff> visibleInMergeViewer(final Predicate<? super EObject> predicate, final IDifferenceGroupProvider groupProvider) { if (predicate == null) { @@ -628,6 +636,7 @@ public class MergeViewerItem extends AdapterImpl implements IMergeViewerItem { }; } + @Deprecated public static class Container extends MergeViewerItem implements IMergeViewerItem.Container { /** diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/mergeviewer/item/impl/ResourceAttachmentChangeProvider.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/mergeviewer/item/impl/ResourceAttachmentChangeProvider.java new file mode 100644 index 000000000..c1b3c1b7c --- /dev/null +++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/mergeviewer/item/impl/ResourceAttachmentChangeProvider.java @@ -0,0 +1,53 @@ +/******************************************************************************* + * Copyright (c) 2016 EclipseSource Muenchen GmbH 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: + * Stefan Dirix - initial API and implementation + *******************************************************************************/ +package org.eclipse.emf.compare.rcp.ui.internal.mergeviewer.item.impl; + +import org.eclipse.emf.compare.rcp.ui.mergeviewer.item.provider.IMergeViewerItemContentProvider; +import org.eclipse.emf.compare.rcp.ui.mergeviewer.item.provider.IMergeViewerItemProviderConfiguration; + +/** + * Legacy Provider to keep backward compatibility with {@link ResourceAttachmentChangeMergeViewerItem}. + * + * @author Stefan Dirix <sdirix@eclipsesource.com> + */ +public class ResourceAttachmentChangeProvider implements IMergeViewerItemContentProvider { + + /** + * {@inheritDoc} + */ + public Object getParent(Object object, IMergeViewerItemProviderConfiguration configuration) { + return ((ResourceAttachmentChangeMergeViewerItem)object).getParent(); + } + + /** + * {@inheritDoc} + */ + public Object[] getChildren(Object object, IMergeViewerItemProviderConfiguration configuration) { + return ((ResourceAttachmentChangeMergeViewerItem)object).getChildren( + configuration.getDifferenceGroupProvider(), configuration.getDifferenceFilterPredicate()); + } + + /** + * {@inheritDoc} + */ + public boolean hasChildren(Object object, IMergeViewerItemProviderConfiguration configuration) { + return ((ResourceAttachmentChangeMergeViewerItem)object).hasChildren( + configuration.getDifferenceGroupProvider(), configuration.getDifferenceFilterPredicate()); + } + + /** + * {@inheritDoc} + */ + public boolean canHandle(Object object) { + return object instanceof ResourceAttachmentChangeMergeViewerItem; + } + +} diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/mergeviewer/item/IMergeViewerItem.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/mergeviewer/item/IMergeViewerItem.java index 03c10bed6..350a1305b 100644 --- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/mergeviewer/item/IMergeViewerItem.java +++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/mergeviewer/item/IMergeViewerItem.java @@ -100,7 +100,11 @@ public interface IMergeViewerItem extends Adapter { * * @author <a href="mailto:mikael.barbero@obeo.fr">Mikael Barbero</a> * @since 4.0 + * @deprecated IMergeViewerItem.Container is no longer needed since its functionality is now provided by + * {@link org.eclipse.emf.compare.rcp.ui.mergeviewer.item.provider.IMergeViewerItemContentProvider + * IMergeViewerItemContentProvider}. Use an {@link IMergeViewerItem} instead. */ + @Deprecated interface Container extends IMergeViewerItem { /** * Returns whether this container has at least one child. In some cases this methods avoids having to diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/mergeviewer/item/provider/IMergeViewerItemContentProvider.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/mergeviewer/item/provider/IMergeViewerItemContentProvider.java new file mode 100644 index 000000000..4e2475a3f --- /dev/null +++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/mergeviewer/item/provider/IMergeViewerItemContentProvider.java @@ -0,0 +1,56 @@ +/******************************************************************************* + * Copyright (c) 2016 EclipseSource Muenchen GmbH 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: + * Alexandra Buzila - initial API and implementation + *******************************************************************************/ +package org.eclipse.emf.compare.rcp.ui.mergeviewer.item.provider; + +import org.eclipse.jface.viewers.ITreeContentProvider; + +/** + * Interface for specialized {@link ITreeContentProvider tree content providers} for the comparison content + * merge viewer. + * + * @author Stefan Dirix <sdirix@eclipsesource.com> + * @since 4.4 + */ +public interface IMergeViewerItemContentProvider extends IOptionalProvider { + + /** + * Determine the parent of the given {@code object}. + * + * @param object + * the {@link Object} for which the parent is to be determined. + * @param configuration + * the {@link IMergeViewerItemProviderConfiguration}. + * @return the determined parent object, {@code null} if there is none. + */ + public Object getParent(Object object, IMergeViewerItemProviderConfiguration configuration); + + /** + * Determine the children of the given {@code object} + * + * @param object + * the {@link Object} for which the children are to be determined. + * @param configuration + * the {@link IMergeViewerItemProviderConfiguration}. + * @return an array with the determined children, an empty array if there are none. + */ + public Object[] getChildren(Object object, IMergeViewerItemProviderConfiguration configuration); + + /** + * Indicates whether the given {@code object} has children. + * + * @param object + * the {@link Object} for which it is indicated whether it has children. + * @param configuration + * the {@link IMergeViewerItemProviderConfiguration}. + * @return {@code true} if the given object has children, {@code false} otherwise. + */ + public boolean hasChildren(Object object, IMergeViewerItemProviderConfiguration configuration); +} diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/mergeviewer/item/provider/IMergeViewerItemProvider.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/mergeviewer/item/provider/IMergeViewerItemProvider.java new file mode 100644 index 000000000..694b136fd --- /dev/null +++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/mergeviewer/item/provider/IMergeViewerItemProvider.java @@ -0,0 +1,48 @@ +/******************************************************************************* + * Copyright (c) 2016 EclipseSource Muenchen GmbH 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: + * Stefan Dirix - initial API and implementation + *******************************************************************************/ +package org.eclipse.emf.compare.rcp.ui.mergeviewer.item.provider; + +import java.util.List; + +import org.eclipse.emf.compare.rcp.ui.mergeviewer.item.IMergeViewerItem; + +/** + * The contract for providers responsible for determining root elements in merge viewers. Typically these are + * {@link IMergeViewerItem}s but they not necessarily have to be. + * + * @author Stefan Dirix <sdirix@eclipsesource.com> + * @since 4.4 + */ +public interface IMergeViewerItemProvider extends IOptionalProvider { + + /** + * Determine the root merge viewer items for the given {@code object}. + * + * @param object + * the {@link Object} for which the root merge viewer items are to be determined. + * @param configuration + * the {@link IMergeViewerItemProviderConfiguration}. + * @return a list of the root elements. + */ + public List<Object> getMergeViewerItems(Object object, + IMergeViewerItemProviderConfiguration configuration); + + /** + * Determine the merge viewer item which shall be selected. + * + * @param object + * the {@link Object} for which the selected merge viewer item is to be determined. + * @param configuration + * the {@link IMergeViewerItemProviderConfiguration}. + * @return the merge viewer item to select. + */ + public Object getItemToSelect(Object object, IMergeViewerItemProviderConfiguration configuration); +} diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/mergeviewer/item/provider/IMergeViewerItemProviderConfiguration.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/mergeviewer/item/provider/IMergeViewerItemProviderConfiguration.java new file mode 100644 index 000000000..313a1602f --- /dev/null +++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/mergeviewer/item/provider/IMergeViewerItemProviderConfiguration.java @@ -0,0 +1,63 @@ +/******************************************************************************* + * Copyright (c) 2016 EclipseSource Muenchen GmbH 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: + * Stefan Dirix - initial API and implementation + *******************************************************************************/ +package org.eclipse.emf.compare.rcp.ui.mergeviewer.item.provider; + +import com.google.common.base.Predicate; + +import org.eclipse.emf.common.notify.AdapterFactory; +import org.eclipse.emf.compare.Comparison; +import org.eclipse.emf.compare.rcp.ui.mergeviewer.IMergeViewer.MergeViewerSide; +import org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider; +import org.eclipse.emf.ecore.EObject; + +/** + * The configuration used by {@link IMergeViewerItemContentProvider}s. + * + * @author Stefan Dirix <sdirix@eclipsesource.com> + * @since 4.4 + */ +public interface IMergeViewerItemProviderConfiguration { + + /** + * Get the {@link AdapterFactory}. + * + * @return the {@link AdapterFactory}, + */ + public AdapterFactory getAdapterFactory(); + + /** + * Get the {@link IDifferenceGroupProvider}. + * + * @return the {@link IDifferenceGroupProvider}. + */ + public IDifferenceGroupProvider getDifferenceGroupProvider(); + + /** + * Get the difference filter {@link Predicate}. + * + * @return the difference filter {@link Predicate}. + */ + public Predicate<? super EObject> getDifferenceFilterPredicate(); + + /** + * Get the {@link Comparison}. + * + * @return the {@link Comparison}. + */ + public Comparison getComparison(); + + /** + * Get the {@link MergeViewerSide}. + * + * @return the {@link MergeViewerSide}. + */ + public MergeViewerSide getSide(); +} diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/mergeviewer/item/provider/IOptionalProvider.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/mergeviewer/item/provider/IOptionalProvider.java new file mode 100644 index 000000000..31c2d9884 --- /dev/null +++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/mergeviewer/item/provider/IOptionalProvider.java @@ -0,0 +1,28 @@ +/******************************************************************************* + * Copyright (c) 2016 EclipseSource Muenchen GmbH 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: + * Stefan Dirix - initial API and implementation + *******************************************************************************/ +package org.eclipse.emf.compare.rcp.ui.mergeviewer.item.provider; + +/** + * A contract for a provider which can indicate whether it wants to handle a certain object. + * + * @author Stefan Dirix <sdirix@eclipsesource.com> + * @since 4.4 + */ +public interface IOptionalProvider { + /** + * Indicates whether this provider wants to handle the given {@code object}. + * + * @param object + * the {@link Object}. + * @return {@code true} if the provider wants to handle the given {@code object}, {@code false} otherwise. + */ + boolean canHandle(Object object); +} |