diff options
author | Arthur Daussy | 2014-03-10 13:20:24 +0000 |
---|---|---|
committer | Arthur Daussy | 2014-03-13 11:51:14 +0000 |
commit | 8538ce3ddd29ad2248400e18734649e84e8da7f6 (patch) | |
tree | 8a5f192dd7a3142ab7d482d9483dd4a41cd09950 | |
parent | 56582547fa8979f9b28442498267b9d1e3d3cd60 (diff) | |
download | org.eclipse.emf.compare-8538ce3ddd29ad2248400e18734649e84e8da7f6.tar.gz org.eclipse.emf.compare-8538ce3ddd29ad2248400e18734649e84e8da7f6.tar.xz org.eclipse.emf.compare-8538ce3ddd29ad2248400e18734649e84e8da7f6.zip |
[429636] Refactoring of IDifferenceGroupProvider
Replace "defaultSelected" by a rank mechanism.
Move description attribute to IDifferenceGroupProvider.Descriptor
Bug: 429636
Change-Id: I5daab85c14a9c0bfc4856f84af2ac2b336481ac0
Signed-off-by: Arthur Daussy <arthur.daussy@obeo.fr>
21 files changed, 562 insertions, 432 deletions
diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/configuration/EMFCompareConfiguration.java b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/configuration/EMFCompareConfiguration.java index 212331d6f..7b188adbf 100644 --- a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/configuration/EMFCompareConfiguration.java +++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/configuration/EMFCompareConfiguration.java @@ -1,5 +1,5 @@ /*******************************************************************************
- * Copyright (c) 2013 Obeo.
+ * Copyright (c) 2013, 2014 Obeo.
* 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
@@ -31,8 +31,10 @@ import org.eclipse.emf.compare.rcp.ui.internal.configuration.impl.EMFComparatorC import org.eclipse.emf.compare.rcp.ui.internal.configuration.impl.MergePreviewModeChange;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.StructureMergeViewerFilter;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.StructureMergeViewerGrouper;
+import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.impl.DefaultGroupProvider;
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.IDifferenceGroupProvider.Descriptor;
import org.eclipse.emf.compare.scope.IComparisonScope;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
@@ -200,8 +202,16 @@ public class EMFCompareConfiguration extends ForwardingCompareConfiguration impl EMFCompareRCPUIPlugin plugin = EMFCompareRCPUIPlugin.getDefault();
IDifferenceGroupProvider.Descriptor.Registry groupProviderRegistry = plugin
.getDifferenceGroupProviderRegistry();
- getStructureMergeViewerGrouper().setProvider(
- groupProviderRegistry.getDefaultGroupProvider(comparisonScope, comparison));
+ Descriptor defaultGroupProvider = groupProviderRegistry.getDefaultGroupProvider(comparisonScope,
+ comparison);
+ IDifferenceGroupProvider defaultGroup = null;
+ if (defaultGroupProvider != null) {
+ defaultGroup = defaultGroupProvider.createGroupProvider();
+ }
+ if (defaultGroup == null) {
+ defaultGroup = new DefaultGroupProvider();
+ }
+ getStructureMergeViewerGrouper().setProvider(defaultGroup);
}
protected void initStructureMergeViewerFilter(Comparison comparison, IComparisonScope comparisonScope) {
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/plugin.properties b/plugins/org.eclipse.emf.compare.rcp.ui/plugin.properties index e20a38042..969954641 100644 --- a/plugins/org.eclipse.emf.compare.rcp.ui/plugin.properties +++ b/plugins/org.eclipse.emf.compare.rcp.ui/plugin.properties @@ -1,5 +1,5 @@ ################################################################################ -# Copyright (c) 2012, 2013 Obeo. +# Copyright (c) 2012, 2014 Obeo. # 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 @@ -10,7 +10,7 @@ ################################################################################ pluginName = EMF Compare RCP UI providerName = Eclipse Modeling Project -emf.compare.no.group = No Group +emf.compare.default = Default emf.compare.kind.groups = By Kind emf.compare.side.groups = By Side emf.compare.resource.group = By Resource diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/plugin.xml b/plugins/org.eclipse.emf.compare.rcp.ui/plugin.xml index 4d522fe50..550e39a9d 100644 --- a/plugins/org.eclipse.emf.compare.rcp.ui/plugin.xml +++ b/plugins/org.eclipse.emf.compare.rcp.ui/plugin.xml @@ -21,24 +21,25 @@ <extension point="org.eclipse.emf.compare.rcp.ui.groups"> <group - activeByDefault="true" class="org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.impl.DefaultGroupProvider" - label="%emf.compare.no.group"> + label="%emf.compare.default" + rank="100"> </group> <group - activeByDefault="false" class="org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.impl.KindGroupProvider" - label="%emf.compare.kind.groups"> + label="%emf.compare.kind.groups" + rank="80"> </group> <group - activeByDefault="true" class="org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.impl.ThreeWayComparisonGroupProvider" - label="%emf.compare.side.groups"> + label="%emf.compare.side.groups" + rank="120" + type="THREE_WAY"> </group> <group - activeByDefault="false" class="org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.impl.ByResourceGroupProvider" - label="%emf.compare.resource.group"> + label="%emf.compare.resource.group" + rank="60"> </group> </extension> <extension diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/schema/groups.exsd b/plugins/org.eclipse.emf.compare.rcp.ui/schema/groups.exsd index 6bfbe2f84..0928bbf9b 100644 --- a/plugins/org.eclipse.emf.compare.rcp.ui/schema/groups.exsd +++ b/plugins/org.eclipse.emf.compare.rcp.ui/schema/groups.exsd @@ -57,7 +57,7 @@ You can provide your own groups by adding an extension of type <samp>org.e A class that implements <samp>org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider</samp>.
</documentation>
<appinfo>
- <meta.attribute kind="java" basedOn=":org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider"/>
+ <meta.attribute kind="java" basedOn=":org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.IDifferenceGroupProvider"/>
</appinfo>
</annotation>
</attribute>
@@ -68,12 +68,53 @@ You can provide your own groups by adding an extension of type <samp>org.e </documentation>
</annotation>
</attribute>
- <attribute name="activeByDefault" type="boolean" use="required">
+ <attribute name="activeByDefault" type="boolean">
<annotation>
<documentation>
- The initial activation state of the filter.
+ The initial activation state of the group. (Deprecated use rank instead)
+ </documentation>
+ <appinfo>
+ <meta.attribute deprecated="true"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ <attribute name="description" type="string">
+ <annotation>
+ <documentation>
+ A description of the group. (Used in interface)
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="rank" type="string">
+ <annotation>
+ <documentation>
+ The rank of the group. The highest rank enabled for a comparison is used.
+
+ Default value : 0
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="type">
+ <annotation>
+ <documentation>
+ Type of comparison this group can handle.
+ THREE_WAY: This group can only handle three way comparison.
+ TWO_WAY: This group can handle two way comparison
+ BOTH: This group can handle two and three way comparison.
+
+ Default value: BOTH
</documentation>
</annotation>
+ <simpleType>
+ <restriction base="string">
+ <enumeration value="THREE_WAY">
+ </enumeration>
+ <enumeration value="TWO_WAY">
+ </enumeration>
+ <enumeration value="BOTH">
+ </enumeration>
+ </restriction>
+ </simpleType>
</attribute>
</complexType>
</element>
@@ -83,7 +124,7 @@ You can provide your own groups by adding an extension of type <samp>org.e <meta.section type="since"/>
</appinfo>
<documentation>
- 4.0
+ 3.0.0
</documentation>
</annotation>
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 dbf92b78a..84fba16c9 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 @@ -19,8 +19,12 @@ 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.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.internal.preferences.EMFComparePreferences; 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; @@ -78,6 +82,8 @@ public class EMFCompareRCPUIPlugin extends AbstractUIPlugin { private AbstractRegistryEventListener groupProviderRegistryListener; + private IItemRegistry<IDifferenceGroupProvider.Descriptor> groupItemRegistry; + private IDifferenceGroupProvider.Descriptor.Registry groupProviderRegistry; private AbstractRegistryEventListener filterRegistryListener; @@ -97,6 +103,17 @@ public class EMFCompareRCPUIPlugin extends AbstractUIPlugin { private ConfigurationUIRegistryEventListener matchEngineConfiguratorRegistryListener; /** + * Instance scope for preferences. + * <p> + * Do not use singleton to respect Helios compatibility + * </p> + * + * @see org.eclipse.core.runtime.preferences.InstanceScope#INSTANCE + */ + @SuppressWarnings("deprecation") + private InstanceScope instanceScope = new InstanceScope(); + + /** * The constructor. */ public EMFCompareRCPUIPlugin() { @@ -114,9 +131,13 @@ public class EMFCompareRCPUIPlugin extends AbstractUIPlugin { IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry(); - groupProviderRegistry = new DifferenceGroupRegistryImpl(); + groupItemRegistry = new ItemRegistry<IDifferenceGroupProvider.Descriptor>(); + groupProviderRegistry = new DifferenceGroupRegistryImpl(groupItemRegistry, instanceScope + .getNode(PLUGIN_ID), EMFComparePreferences.TWO_WAY_GROUP_RANKING, + EMFComparePreferences.THREE_WAY_GROUP_RANKING); groupProviderRegistryListener = new DifferenceGroupProviderExtensionRegistryListener(PLUGIN_ID, - GROUP_PROVIDER_PPID, getLog(), groupProviderRegistry); + GROUP_PROVIDER_PPID, getLog(), groupItemRegistry); + extensionRegistry.addListener(groupProviderRegistryListener, PLUGIN_ID + "." + GROUP_PROVIDER_PPID); //$NON-NLS-1$ groupProviderRegistryListener.readRegistry(extensionRegistry); @@ -176,6 +197,7 @@ public class EMFCompareRCPUIPlugin extends AbstractUIPlugin { extensionRegistry.removeListener(groupProviderRegistryListener); groupProviderRegistryListener = null; + groupItemRegistry = null; groupProviderRegistry = null; plugin = null; 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 a825559f3..5445147ca 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 @@ -17,8 +17,6 @@ FilterActionMenu.tooltip = Filters GroupActionMenu.tooltip = Groups -DefaultGroupProvider.label = Default - KindGroupProvider.addition.label = Additions KindGroupProvider.deletion.label = Deletions KindGroupProvider.change.label = Changes diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/actions/GroupAction.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/actions/GroupAction.java index 041887e5d..b96e54282 100644 --- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/actions/GroupAction.java +++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/actions/GroupAction.java @@ -40,8 +40,8 @@ public class GroupAction extends Action { * The group provider associated with this action. */ public GroupAction(StructureMergeViewerGrouper structureMergeViewerGrouper, - IDifferenceGroupProvider provider) { - super(provider.getLabel(), IAction.AS_RADIO_BUTTON); + IDifferenceGroupProvider provider, String label) { + super(label, IAction.AS_RADIO_BUTTON); this.structureMergeViewerGrouper = structureMergeViewerGrouper; this.provider = provider; } diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/actions/GroupActionMenu.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/actions/GroupActionMenu.java index 06562ac20..4f80b46be 100644 --- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/actions/GroupActionMenu.java +++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/actions/GroupActionMenu.java @@ -71,11 +71,14 @@ public class GroupActionMenu extends Action implements IMenuCreator { public void updateMenu(IComparisonScope scope, Comparison comparison) { menuManager.removeAll(); - for (IDifferenceGroupProvider dgp : registry.getGroupProviders(scope, comparison)) { - IAction action = new GroupAction(structureMergeViewerGrouper, dgp); - menuManager.add(action); - if (dgp == structureMergeViewerGrouper.getProvider()) { - action.setChecked(true); + for (IDifferenceGroupProvider.Descriptor dgp : registry.getGroupProviders(scope, comparison)) { + IDifferenceGroupProvider gp = dgp.createGroupProvider(); + if (gp != null) { + IAction action = new GroupAction(structureMergeViewerGrouper, gp, dgp.getLabel()); + menuManager.add(action); + if (dgp == structureMergeViewerGrouper.getProvider()) { + action.setChecked(true); + } } } } diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/ByResourceGroupProvider.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/ByResourceGroupProvider.java index 91c3c6233..e54974b82 100644 --- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/ByResourceGroupProvider.java +++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/ByResourceGroupProvider.java @@ -47,9 +47,6 @@ import org.eclipse.emf.edit.tree.TreeNode; */ public class ByResourceGroupProvider extends AbstractDifferenceGroupProvider { - /** A human-readable label for this group provider. This will be displayed in the EMF Compare UI. */ - private String label; - /** The initial activation state of the group provider. */ private boolean activeByDefault; @@ -76,42 +73,6 @@ public class ByResourceGroupProvider extends AbstractDifferenceGroupProvider { /** * {@inheritDoc} * - * @see org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider#getLabel() - */ - public String getLabel() { - return label; - } - - /** - * {@inheritDoc} - * - * @see org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider#setLabel(java.lang.String) - */ - public void setLabel(String label) { - this.label = label; - } - - /** - * {@inheritDoc} - * - * @see org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider#defaultSelected() - */ - public boolean defaultSelected() { - return activeByDefault; - } - - /** - * {@inheritDoc} - * - * @see org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider#setDefaultSelected(boolean) - */ - public void setDefaultSelected(boolean active) { - this.activeByDefault = active; - } - - /** - * {@inheritDoc} - * * @see org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider#isEnabled(org * .eclipse.emf.compare.scope.IComparisonScope, org.eclipse.emf.compare.Comparison) */ diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/DefaultGroupProvider.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/DefaultGroupProvider.java index af34926aa..efa6d0bff 100644 --- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/DefaultGroupProvider.java +++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/DefaultGroupProvider.java @@ -17,7 +17,6 @@ import com.google.common.collect.ImmutableList; import java.util.Collection; import org.eclipse.emf.compare.Comparison; -import org.eclipse.emf.compare.rcp.ui.internal.EMFCompareRCPUIMessages; import org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.AbstractDifferenceGroupProvider; import org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroup; import org.eclipse.emf.compare.scope.IComparisonScope; @@ -55,42 +54,6 @@ public class DefaultGroupProvider extends AbstractDifferenceGroupProvider { /** * {@inheritDoc} * - * @see org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider#getLabel() - */ - public String getLabel() { - return EMFCompareRCPUIMessages.getString("DefaultGroupProvider.label"); //$NON-NLS-1$ - } - - /** - * {@inheritDoc} - * - * @see org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider#setLabel(java.lang.String) - */ - public void setLabel(String label) { - - } - - /** - * {@inheritDoc} - * - * @see org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider#defaultSelected() - */ - public boolean defaultSelected() { - return true; - } - - /** - * {@inheritDoc} - * - * @see org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider#setDefaultSelected(boolean) - */ - public void setDefaultSelected(boolean defaultSelected) { - - } - - /** - * {@inheritDoc} - * * @see org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider#isEnabled(org * .eclipse.emf.compare.scope.IComparisonScope, org.eclipse.emf.compare.Comparison) */ diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/DifferenceGroupDescriptorWrapper.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/DifferenceGroupDescriptorWrapper.java new file mode 100644 index 000000000..3ea376952 --- /dev/null +++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/DifferenceGroupDescriptorWrapper.java @@ -0,0 +1,88 @@ +/****************************************************************************** + * Copyright (c) 2014 Obeo. + * 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 + *******************************************************************************/ +package org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.impl; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IConfigurationElement; +import org.eclipse.emf.compare.rcp.internal.extension.impl.AbstractItemDescriptor; +import org.eclipse.emf.compare.rcp.ui.EMFCompareRCPUIPlugin; +import org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider; +import org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider.ComparisonType; +import org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider.Descriptor; + +/** + * Implementation of {@link IDifferenceGroupProvider.Descriptor}. + * + * @author <a href="mailto:arthur.daussy@obeo.fr">Arthur Daussy</a> + */ +public class DifferenceGroupDescriptorWrapper extends AbstractItemDescriptor<IDifferenceGroupProvider.Descriptor> implements IDifferenceGroupProvider.Descriptor { + + /** {@link IConfigurationElement} used to instantiate the {@link IDifferenceGroupProvider} */ + private final IConfigurationElement element; + + /** Type of comparison the {@link IDifferenceGroupProvider} can handle. */ + private final ComparisonType type; + + /** + * Constructor. + * + * @param label + * Human-readable label of the underlying group provider. + * @param description + * A more detailed description that can be displayed to the user for this group. + * @param elem + * {@link IConfigurationElement} used to instantiate the {@link IDifferenceGroupProvider} + * @param rank + * Rank of the descriptor + * @param comparisonType + * Type of comparison the wrapped {@link IDifferenceGroupProvider} can handle. + */ + public DifferenceGroupDescriptorWrapper(String label, String description, IConfigurationElement elem, + int rank, ComparisonType comparisonType) { + super(label, description, rank, elem + .getAttribute(DifferenceGroupProviderExtensionRegistryListener.ATT_CLASS)); + this.element = elem; + this.type = comparisonType; + } + + /** + * {@inheritDoc} + */ + public Descriptor getItem() { + return this; + } + + /** + * {@inheritDoc} + */ + public ComparisonType getType() { + return type; + } + + /** + * {@inheritDoc} + */ + public IDifferenceGroupProvider createGroupProvider() { + Object instance; + try { + instance = element + .createExecutableExtension(DifferenceGroupProviderExtensionRegistryListener.ATT_CLASS); + if (instance instanceof IDifferenceGroupProvider) { + IDifferenceGroupProvider groupProvider = (IDifferenceGroupProvider)instance; + return groupProvider; + } + } catch (CoreException e) { + EMFCompareRCPUIPlugin.getDefault().log(e); + } + return null; + } + +} diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/DifferenceGroupProviderDescriptorImpl.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/DifferenceGroupProviderDescriptorImpl.java deleted file mode 100644 index 6387f947c..000000000 --- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/DifferenceGroupProviderDescriptorImpl.java +++ /dev/null @@ -1,60 +0,0 @@ -/*******************************************************************************
- * Copyright (c) 2013, 2014 Obeo.
- * 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
- *******************************************************************************/
-package org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.impl;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.emf.compare.rcp.extension.PluginClassDescriptor;
-import org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider;
-
-/**
- * Default implementation of {@link IDifferenceGroupProvider.Descriptor}.
- *
- * @author <a href="mailto:axel.richard@obeo.fr">Axel Richard</a>
- * @since 4.0
- */
-public class DifferenceGroupProviderDescriptorImpl extends PluginClassDescriptor<IDifferenceGroupProvider> implements IDifferenceGroupProvider.Descriptor {
-
- /** The label of the group provider. */
- private String label;
-
- /** The state of the default selection of the group provider. */
- private boolean defaultSelected;
-
- /**
- * Creates a descriptor corresponding to the information of the given <em>element</em>.
- *
- * @param element
- * Configuration element from which to create this descriptor.
- * @param label
- * The label of the group provider.
- * @param defaultSelected
- * The state of the default selection of the group provider.
- */
- public DifferenceGroupProviderDescriptorImpl(IConfigurationElement element, String label,
- boolean defaultSelected) {
- super(element, DifferenceGroupProviderExtensionRegistryListener.ATT_CLASS);
- this.label = label;
- this.defaultSelected = defaultSelected;
- }
-
- /**
- * {@inheritDoc}
- *
- * @see IDifferenceGroupProvider.Descriptor#createGroupProvider()
- */
- public IDifferenceGroupProvider createGroupProvider() {
- IDifferenceGroupProvider differenceGroupProvider = this.createInstance();
- differenceGroupProvider.setLabel(label);
- differenceGroupProvider.setDefaultSelected(defaultSelected);
- return differenceGroupProvider;
- }
-
-}
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/DifferenceGroupProviderExtensionRegistryListener.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/DifferenceGroupProviderExtensionRegistryListener.java index 8c96449bd..b50f8afa9 100644 --- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/DifferenceGroupProviderExtensionRegistryListener.java +++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/DifferenceGroupProviderExtensionRegistryListener.java @@ -14,7 +14,11 @@ 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.internal.extension.IItemDescriptor;
+import org.eclipse.emf.compare.rcp.internal.extension.IItemRegistry;
import org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider;
+import org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider.ComparisonType;
+import org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider.Descriptor;
/**
* Utility class to listen to the {@link IDifferenceGroupProvider.Descriptor.Registry}.
@@ -24,20 +28,29 @@ import org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGro */
public class DifferenceGroupProviderExtensionRegistryListener extends AbstractRegistryEventListener {
+ /** Default value for the rank attribute if not specified. */
+ private static final int DEFAULT_RANK_VALUE = 0;
+
/** TAG_GROUP_PROVIDER. */
static final String TAG_GROUP_PROVIDER = "group"; //$NON-NLS-1$
- /** ATT_CLASS. */
- static final String ATT_CLASS = "class"; //$NON-NLS-1$
-
/** ATT_LABEL. */
static final String ATT_LABEL = "label"; //$NON-NLS-1$
- /** ATT_ACTIVE. */
- static final String ATT_ACTIVE = "activeByDefault"; //$NON-NLS-1$
+ /** ATT_DESCRIPTION. */
+ static final String ATT_DESCRIPTION = "description"; //$NON-NLS-1$
+
+ /** ATT_COMPARISON_TYPE. */
+ static final String ATT_COMPARISON_TYPE = "type"; //$NON-NLS-1$
+
+ /** ATT_RANK. */
+ static final String ATT_RANK = "rank"; //$NON-NLS-1$
+
+ /** ATT_CLASS. */
+ static final String ATT_CLASS = "class"; //$NON-NLS-1$
/** The IDifferenceGroupProvider.Descriptor.Registry to listen. */
- private final IDifferenceGroupProvider.Descriptor.Registry groupProviderRegistry;
+ private final IItemRegistry<IDifferenceGroupProvider.Descriptor> groupProviderRegistry;
/**
* Default constructor.
@@ -52,7 +65,7 @@ public class DifferenceGroupProviderExtensionRegistryListener extends AbstractRe * The {@link IDifferenceGroupProvider.Descriptor.Registry} to listen.
*/
public DifferenceGroupProviderExtensionRegistryListener(String pluginID, String extensionPointID,
- ILog log, IDifferenceGroupProvider.Descriptor.Registry registry) {
+ ILog log, IItemRegistry<IDifferenceGroupProvider.Descriptor> registry) {
super(pluginID, extensionPointID, log);
this.groupProviderRegistry = registry;
}
@@ -65,7 +78,6 @@ public class DifferenceGroupProviderExtensionRegistryListener extends AbstractRe @Override
protected boolean validateExtensionElement(IConfigurationElement element) {
final boolean valid;
-
if (element.getName().equals(TAG_GROUP_PROVIDER)) {
if (element.getAttribute(ATT_CLASS) == null) {
logMissingAttribute(element, ATT_CLASS);
@@ -73,9 +85,22 @@ public class DifferenceGroupProviderExtensionRegistryListener extends AbstractRe } else if (element.getAttribute(ATT_LABEL) == null) {
logMissingAttribute(element, ATT_LABEL);
valid = false;
- } else if (element.getAttribute(ATT_ACTIVE) == null) {
- logMissingAttribute(element, ATT_ACTIVE);
- valid = false;
+ } else if (element.getAttribute(ATT_RANK) != null) {
+ try {
+ Integer.valueOf(element.getAttribute(ATT_RANK));
+ } catch (NumberFormatException e) {
+ log(element, e);
+ return false;
+ }
+ valid = true;
+ } else if (element.getAttribute(ATT_COMPARISON_TYPE) != null) {
+ try {
+ ComparisonType.valueOf(element.getAttribute(ATT_COMPARISON_TYPE));
+ valid = true;
+ } catch (IllegalArgumentException e) {
+ log(element, e);
+ return false;
+ }
} else {
valid = true;
}
@@ -92,11 +117,26 @@ public class DifferenceGroupProviderExtensionRegistryListener extends AbstractRe */
@Override
protected boolean addedValid(IConfigurationElement element) {
- IDifferenceGroupProvider.Descriptor providerDescriptor = new DifferenceGroupProviderDescriptorImpl(
- element, element.getAttribute(ATT_LABEL), Boolean.valueOf(element.getAttribute(ATT_ACTIVE))
- .booleanValue());
- IDifferenceGroupProvider.Descriptor previous = groupProviderRegistry.add(providerDescriptor, element
- .getAttribute(ATT_CLASS));
+ String rankValue = element.getAttribute(ATT_RANK);
+ final int rank;
+ if (rankValue == null) {
+ rank = DEFAULT_RANK_VALUE;
+ } else {
+ rank = Integer.valueOf(rankValue).intValue();
+ }
+ String typeAttribute = element.getAttribute(ATT_COMPARISON_TYPE);
+ final ComparisonType type;
+ if (typeAttribute != null) {
+ type = ComparisonType.valueOf(typeAttribute);
+ } else {
+ type = ComparisonType.BOTH;
+ }
+ String label = element.getAttribute(ATT_LABEL);
+ String description = element.getAttribute(ATT_DESCRIPTION);
+ DifferenceGroupDescriptorWrapper itemDescriptor = new DifferenceGroupDescriptorWrapper(label, description,
+ element, rank, type);
+
+ IItemDescriptor<Descriptor> previous = groupProviderRegistry.add(itemDescriptor);
if (previous != null) {
log(IStatus.WARNING, element, "The group provider descriptor'" + element.getAttribute(ATT_CLASS) //$NON-NLS-1$
+ "' is registered twice."); //$NON-NLS-1$
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/DifferenceGroupRegistryImpl.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/DifferenceGroupRegistryImpl.java index 3875a8d39..ad757210d 100644 --- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/DifferenceGroupRegistryImpl.java +++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/DifferenceGroupRegistryImpl.java @@ -10,23 +10,32 @@ *******************************************************************************/
package org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.impl;
-import static com.google.common.base.Predicates.instanceOf;
-import static com.google.common.collect.Iterables.indexOf;
import static com.google.common.collect.Lists.newArrayList;
import com.google.common.base.Preconditions;
+import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import java.util.Collections;
import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
+import java.util.ListIterator;
import org.eclipse.emf.compare.Comparison;
+import org.eclipse.emf.compare.rcp.internal.extension.IItemDescriptor;
+import org.eclipse.emf.compare.rcp.internal.extension.IItemRegistry;
+import org.eclipse.emf.compare.rcp.internal.extension.impl.ItemUtil;
+import org.eclipse.emf.compare.rcp.internal.extension.impl.WrapperItemDescriptor;
import org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider;
+import org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider.ComparisonType;
+import org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider.Descriptor;
import org.eclipse.emf.compare.scope.IComparisonScope;
+import org.osgi.service.prefs.Preferences;
/**
- * The default implementation of the {@link IDifferenceGroupProvider.Descriptor.Registry}.
+ * Implementation of the {@link IDifferenceGroupProvider.Descriptor.Registry}. This implementation allow user
+ * to override ranking of each group using preferences.
*
* @author <a href="mailto:axel.richard@obeo.fr">Axel Richard</a>
* @since 4.0
@@ -34,13 +43,46 @@ import org.eclipse.emf.compare.scope.IComparisonScope; public class DifferenceGroupRegistryImpl implements IDifferenceGroupProvider.Descriptor.Registry {
/** A map that associates the class name to theirs {@link IDifferenceGroupProvider.Descriptor}s. */
- private final Map<String, IDifferenceGroupProvider.Descriptor> map;
+ private final IItemRegistry<IDifferenceGroupProvider.Descriptor> registry;
+
+ /** Preference key for two way comparison group ranking. */
+ private final String twoWayPreferenceKey;
+
+ /** Preference key for three way comparison group ranking. */
+ private final String threeWayPrefenceKey;
+
+ /** Preferences holding ranked descriptors. */
+ private Preferences preferences;
/**
* Constructs the registry.
+ *
+ * @param twoWaygroupProviderDescriptors
+ */
+ public DifferenceGroupRegistryImpl(IItemRegistry<IDifferenceGroupProvider.Descriptor> registry,
+ Preferences preferences, String twoWayPreferenceKey, String threeWayPrefenceKey) {
+ this.registry = registry;
+ this.twoWayPreferenceKey = twoWayPreferenceKey;
+ this.threeWayPrefenceKey = threeWayPrefenceKey;
+ this.preferences = preferences;
+ }
+
+ /**
+ * Return an ordered list of IItemDescriptor<IDifferenceGroupProvider.Descriptor>.
+ *
+ * @return Ordered list of IItemDescriptor<IDifferenceGroupProvider.Descriptor>.
*/
- public DifferenceGroupRegistryImpl() {
- map = new ConcurrentHashMap<String, IDifferenceGroupProvider.Descriptor>();
+ private List<IItemDescriptor<IDifferenceGroupProvider.Descriptor>> getOrderedGroupProviderDescriptors(
+ final Comparison comparison) {
+ final List<IItemDescriptor<Descriptor>> items;
+ if (comparison.isThreeWay()) {
+ items = ItemUtil.getOrderedItems(getDefaultThreeWayDescriptors(), registry, threeWayPrefenceKey,
+ preferences);
+ } else {
+ items = ItemUtil.getOrderedItems(getDefaultTwoWayDescriptors(), registry, twoWayPreferenceKey,
+ preferences);
+ }
+ return items;
}
/**
@@ -49,20 +91,23 @@ public class DifferenceGroupRegistryImpl implements IDifferenceGroupProvider.Des * @see org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider.Descriptor.Registry#getGroupProviders(IComparisonScope,
* Comparison)
*/
- public List<IDifferenceGroupProvider> getGroupProviders(IComparisonScope scope, Comparison comparison) {
- List<IDifferenceGroupProvider> providers = newArrayList();
- for (IDifferenceGroupProvider.Descriptor desc : map.values()) {
- IDifferenceGroupProvider groupProvider = desc.createGroupProvider();
- if (isGroupProviderActivable(groupProvider, scope, comparison)) {
- providers.add(groupProvider);
+ public List<IDifferenceGroupProvider.Descriptor> getGroupProviders(IComparisonScope scope,
+ Comparison comparison) {
+ if (comparison != null) {
+ List<IDifferenceGroupProvider.Descriptor> providers = newArrayList();
+ List<IItemDescriptor<Descriptor>> groupProviderDescriptors = getOrderedGroupProviderDescriptors(comparison);
+ ListIterator<IItemDescriptor<Descriptor>> groupIterator = groupProviderDescriptors.listIterator();
+ while (groupIterator.hasNext()) {
+ IItemDescriptor<Descriptor> desc = groupIterator.next();
+ IDifferenceGroupProvider.Descriptor groupProviderDescriptor = desc.getItem();
+ IDifferenceGroupProvider gp = groupProviderDescriptor.createGroupProvider();
+ if (gp != null && isGroupProviderActivable(gp, scope, comparison)) {
+ providers.add(groupProviderDescriptor);
+ }
}
+ return ImmutableList.copyOf(providers);
}
- int indexOfDefault = indexOf(providers, instanceOf(DefaultGroupProvider.class));
- if (indexOfDefault >= 0) {
- IDifferenceGroupProvider defaultGroupProvider = providers.remove(indexOfDefault);
- providers.add(0, defaultGroupProvider);
- }
- return ImmutableList.copyOf(providers);
+ return Collections.emptyList();
}
/**
@@ -71,16 +116,13 @@ public class DifferenceGroupRegistryImpl implements IDifferenceGroupProvider.Des * @see org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider.Descriptor.Registry#getDefaultGroupProvider(org.eclipse.emf.compare.scope.IComparisonScope,
* org.eclipse.emf.compare.Comparison)
*/
- public IDifferenceGroupProvider getDefaultGroupProvider(IComparisonScope scope, Comparison comparison) {
- IDifferenceGroupProvider selectedGroupProvider = null;
- for (IDifferenceGroupProvider dgp : getGroupProviders(scope, comparison)) {
- if (dgp.defaultSelected()) {
- if (selectedGroupProvider == null || !(dgp instanceof DefaultGroupProvider)) {
- selectedGroupProvider = dgp;
- }
- }
+ public IDifferenceGroupProvider.Descriptor getDefaultGroupProvider(IComparisonScope scope,
+ Comparison comparison) {
+ List<IDifferenceGroupProvider.Descriptor> descriptors = getGroupProviders(scope, comparison);
+ if (!descriptors.isEmpty()) {
+ return descriptors.get(0);
}
- return selectedGroupProvider;
+ return null;
}
/**
@@ -108,7 +150,16 @@ public class DifferenceGroupRegistryImpl implements IDifferenceGroupProvider.Des public IDifferenceGroupProvider.Descriptor add(IDifferenceGroupProvider.Descriptor providerDescriptor,
String className) {
Preconditions.checkNotNull(providerDescriptor);
- return map.put(className, providerDescriptor);
+ IDifferenceGroupProvider groupProvider = providerDescriptor.createGroupProvider();
+ WrapperItemDescriptor<IDifferenceGroupProvider.Descriptor> descriptor = new WrapperItemDescriptor<IDifferenceGroupProvider.Descriptor>(
+ providerDescriptor.getLabel(), providerDescriptor.getDescription(), providerDescriptor
+ .getRank(), groupProvider.getClass().getName(), providerDescriptor);
+
+ IItemDescriptor<Descriptor> oldValue = registry.add(descriptor);
+ if (oldValue != null) {
+ return oldValue.getItem();
+ }
+ return null;
}
/**
@@ -117,7 +168,11 @@ public class DifferenceGroupRegistryImpl implements IDifferenceGroupProvider.Des * @see org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider.Descriptor.Registry#remove(java.lang.String)
*/
public IDifferenceGroupProvider.Descriptor remove(String className) {
- return map.remove(className);
+ IItemDescriptor<IDifferenceGroupProvider.Descriptor> oldValue = registry.remove(className);
+ if (oldValue != null) {
+ return oldValue.getItem();
+ }
+ return null;
}
/**
@@ -126,6 +181,51 @@ public class DifferenceGroupRegistryImpl implements IDifferenceGroupProvider.Des * @see org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider.Descriptor.Registry#clear()
*/
public void clear() {
- map.clear();
+ registry.clear();
+ }
+
+ /**
+ * Get an ordered list of default descriptors for a three way comparison.
+ *
+ * @return
+ */
+ private List<IItemDescriptor<Descriptor>> getDefaultTwoWayDescriptors() {
+ Iterable<IItemDescriptor<Descriptor>> threeWayGroups = Iterables.filter(
+ registry.getItemDescriptors(), new Predicate<IItemDescriptor<Descriptor>>() {
+
+ public boolean apply(IItemDescriptor<Descriptor> descriptor) {
+ if (descriptor == null) {
+ return false;
+ }
+ ComparisonType type = descriptor.getItem().getType();
+ return type == ComparisonType.BOTH || type == ComparisonType.TWO_WAY;
+ }
+ });
+ List<IItemDescriptor<Descriptor>> result = Lists.newArrayList(threeWayGroups);
+ Collections.sort(result, Collections.reverseOrder());
+ return result;
+ }
+
+ /**
+ * Get an ordered list of default descriptors for a three way comparison.
+ *
+ * @return
+ */
+ private List<IItemDescriptor<Descriptor>> getDefaultThreeWayDescriptors() {
+ Iterable<IItemDescriptor<Descriptor>> twoWayComparison = Iterables.filter(registry
+ .getItemDescriptors(), new Predicate<IItemDescriptor<Descriptor>>() {
+
+ public boolean apply(IItemDescriptor<Descriptor> descriptor) {
+ if (descriptor == null) {
+ return false;
+ }
+ ComparisonType type = descriptor.getItem().getType();
+ return type == ComparisonType.BOTH || type == ComparisonType.THREE_WAY;
+ }
+ });
+ List<IItemDescriptor<Descriptor>> result = Lists.newArrayList(twoWayComparison);
+ Collections.sort(result, Collections.reverseOrder());
+ return result;
}
+
}
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/EmptyDifferenceGroupProvider.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/EmptyDifferenceGroupProvider.java index 45af3a00d..d7516675c 100644 --- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/EmptyDifferenceGroupProvider.java +++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/EmptyDifferenceGroupProvider.java @@ -1,98 +1,59 @@ -/*******************************************************************************
- * Copyright (c) 2014 Obeo.
- * 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
- *******************************************************************************/
-package org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.impl;
-
-import com.google.common.collect.ImmutableList;
-
-import java.util.Collection;
-
-import org.eclipse.emf.compare.Comparison;
-import org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.AbstractDifferenceGroupProvider;
-import org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroup;
-import org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider;
-import org.eclipse.emf.compare.scope.IComparisonScope;
-
-/**
- * An empty difference group provider.
- *
- * @author <a href="mailto:axel.richard@obeo.fr">Axel Richard</a>
- * @since 4.0
- */
-public class EmptyDifferenceGroupProvider extends AbstractDifferenceGroupProvider {
-
- /**
- * {@inheritDoc}
- *
- * @see org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider#getGroups(org.eclipse.emf.compare.Comparison)
- */
- public Collection<? extends IDifferenceGroup> getGroups(Comparison comparison) {
- return ImmutableList.of();
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider#getLabel()
- */
- public String getLabel() {
- return IDifferenceGroupProvider.class.getName() + ".EMPTY"; //$NON-NLS-1$
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider#setLabel(java.lang.String)
- */
- public void setLabel(String label) {
- // do nothing
-
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider#defaultSelected()
- */
- public boolean defaultSelected() {
- return true;
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider#setDefaultSelected(boolean)
- */
- public void setDefaultSelected(boolean defaultSelected) {
- // do nothing;
-
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider#isEnabled(Open
- * Declaration org.eclipse.emf.compare.scope.IComparisonScope, org.eclipse.emf.compare.Comparison)
- */
- public boolean isEnabled(IComparisonScope scope, Comparison comparison) {
- return true;
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider#dispose()
- */
- public void dispose() {
- // do nothing;
-
- }
-
-}
+/******************************************************************************* + * Copyright (c) 2014 Obeo. + * 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 + *******************************************************************************/ +package org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.impl; + +import com.google.common.collect.ImmutableList; + +import java.util.Collection; + +import org.eclipse.emf.compare.Comparison; +import org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.AbstractDifferenceGroupProvider; +import org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroup; +import org.eclipse.emf.compare.scope.IComparisonScope; + +/** + * An empty difference group provider. + * + * @author <a href="mailto:axel.richard@obeo.fr">Axel Richard</a> + * @since 4.0 + */ +public class EmptyDifferenceGroupProvider extends AbstractDifferenceGroupProvider { + + /** + * {@inheritDoc} + * + * @see org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider#getGroups(org.eclipse.emf.compare.Comparison) + */ + public Collection<? extends IDifferenceGroup> getGroups(Comparison comparison) { + return ImmutableList.of(); + } + + /** + * {@inheritDoc} + * + * @see org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider#isEnabled(Open + * Declaration org.eclipse.emf.compare.scope.IComparisonScope, org.eclipse.emf.compare.Comparison) + */ + public boolean isEnabled(IComparisonScope scope, Comparison comparison) { + return true; + } + + /** + * {@inheritDoc} + * + * @see org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider#dispose() + */ + public void dispose() { + // do nothing; + + } + +} diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/KindGroupProvider.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/KindGroupProvider.java index 500ad626d..e3c4d84d0 100644 --- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/KindGroupProvider.java +++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/KindGroupProvider.java @@ -34,12 +34,6 @@ import org.eclipse.emf.compare.scope.IComparisonScope; */ public class KindGroupProvider extends AbstractDifferenceGroupProvider { - /** A human-readable label for this group provider. This will be displayed in the EMF Compare UI. */ - private String label; - - /** The initial activation state of the group provider. */ - private boolean activeByDefault; - /** The groups provided by this provider. */ private ImmutableList<IDifferenceGroup> differenceGroups; @@ -88,42 +82,6 @@ public class KindGroupProvider extends AbstractDifferenceGroupProvider { /** * {@inheritDoc} * - * @see org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider#getLabel() - */ - public String getLabel() { - return label; - } - - /** - * {@inheritDoc} - * - * @see org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider#setLabel(java.lang.String) - */ - public void setLabel(String label) { - this.label = label; - } - - /** - * {@inheritDoc} - * - * @see org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider#defaultSelected() - */ - public boolean defaultSelected() { - return activeByDefault; - } - - /** - * {@inheritDoc} - * - * @see org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider#setDefaultSelected(boolean) - */ - public void setDefaultSelected(boolean active) { - this.activeByDefault = active; - } - - /** - * {@inheritDoc} - * * @see org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider#isEnabled(org * .eclipse.emf.compare.scope.IComparisonScope, org.eclipse.emf.compare.Comparison) */ diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/ThreeWayComparisonGroupProvider.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/ThreeWayComparisonGroupProvider.java index 8f106dda7..efb1e7f5d 100644 --- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/ThreeWayComparisonGroupProvider.java +++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/ThreeWayComparisonGroupProvider.java @@ -61,12 +61,6 @@ import org.eclipse.emf.edit.tree.TreeNode; */ public class ThreeWayComparisonGroupProvider extends AbstractDifferenceGroupProvider { - /** A human-readable label for this group provider. This will be displayed in the EMF Compare UI. */ - private String label; - - /** The initial activation state of the group provider. */ - private boolean activeByDefault; - /** The groups provided by this provider. */ private ImmutableList<IDifferenceGroup> differenceGroups; @@ -102,42 +96,6 @@ public class ThreeWayComparisonGroupProvider extends AbstractDifferenceGroupProv /** * {@inheritDoc} * - * @see org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider#getLabel() - */ - public String getLabel() { - return label; - } - - /** - * {@inheritDoc} - * - * @see org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider#setLabel(java.lang.String) - */ - public void setLabel(String label) { - this.label = label; - } - - /** - * {@inheritDoc} - * - * @see org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider#defaultSelected() - */ - public boolean defaultSelected() { - return activeByDefault; - } - - /** - * {@inheritDoc} - * - * @see org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider#setDefaultSelected(boolean) - */ - public void setDefaultSelected(boolean active) { - this.activeByDefault = active; - } - - /** - * {@inheritDoc} - * * @see org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider#isEnabled(org * .eclipse.emf.compare.scope.IComparisonScope, org.eclipse.emf.compare.Comparison) */ diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/structuremergeviewer/groups/IDifferenceGroupProvider.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/structuremergeviewer/groups/IDifferenceGroupProvider.java index 019b2f3dd..1c9ccf429 100644 --- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/structuremergeviewer/groups/IDifferenceGroupProvider.java +++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/structuremergeviewer/groups/IDifferenceGroupProvider.java @@ -41,37 +41,6 @@ public interface IDifferenceGroupProvider extends Adapter { Collection<? extends IDifferenceGroup> getGroups(Comparison comparison); /** - * A human-readable label for this group. This will be displayed in the EMF Compare UI. - * - * @return The label for this group. - */ - String getLabel(); - - /** - * Set the label for this group. This will be displayed in the EMF Compare UI. - * - * @param label - * A human-readable label for this group. - */ - void setLabel(String label); - - /** - * Returns the initial activation state that the group should have. - * - * @return The initial activation state that the group should have. - */ - boolean defaultSelected(); - - /** - * Set the initial activation state that the group should have. - * - * @param defaultSelected - * The initial activation state that the group should have (true if the group should be active - * by default). - */ - void setDefaultSelected(boolean defaultSelected); - - /** * Returns the activation condition based on the scope and comparison objects. * * @param scope @@ -109,15 +78,43 @@ public interface IDifferenceGroupProvider extends Adapter { /** * Creates a group provider. * - * @return the newly created group provider. + * @return the newly created group provider or null if error. */ IDifferenceGroupProvider createGroupProvider(); /** + * A human-readable label for this group. This will be displayed in the EMF Compare UI. + * + * @return The label for this group. + */ + public String getLabel(); + + /** + * A human-readable description for this group. This will be displayed in EMF Compare UI. + * + * @return + */ + public String getDescription(); + + /** + * Rank of this group. The highest rank enabled {@link IDifferenceGroupProvider} will be used as + * default group provider. + * + * @return the rank. + */ + public int getRank(); + + /** + * Return the type of Comparison this group provider can handle. + * + * @return {@link ComparisonType} + */ + public ComparisonType getType(); + + /** * A registry of {@link IDifferenceGroupProvider}. */ interface Registry { - /** * Returns the list of {@link IDifferenceGroupProvider} contained in the registry. * @@ -127,7 +124,7 @@ public interface IDifferenceGroupProvider extends Adapter { * The comparison which is to be displayed in the structural view. * @return The list of {@link IDifferenceGroupProvider} contained in the registry. */ - Collection<IDifferenceGroupProvider> getGroupProviders(IComparisonScope scope, + Collection<IDifferenceGroupProvider.Descriptor> getGroupProviders(IComparisonScope scope, Comparison comparison); /** @@ -137,9 +134,10 @@ public interface IDifferenceGroupProvider extends Adapter { * The scope on which the group providers will be applied. * @param comparison * The comparison which is to be displayed in the structural view. - * @return the default group provider. + * @return the default group provider or null if none. */ - IDifferenceGroupProvider getDefaultGroupProvider(IComparisonScope scope, Comparison comparison); + IDifferenceGroupProvider.Descriptor getDefaultGroupProvider(IComparisonScope scope, + Comparison comparison); /** * Add to the registry the given {@link IDifferenceGroupProvider}. @@ -171,4 +169,18 @@ public interface IDifferenceGroupProvider extends Adapter { void clear(); } } + + /** + * Type of comparison a {@link IDifferenceGroupProvider} can handle. + * + * @author <a href="mailto:arthur.daussy@obeo.fr">Arthur Daussy</a> + */ + public static enum ComparisonType { + /** Only three way comparison. */ + THREE_WAY, // + /** Only two way comparison. */ + TWO_WAY, // Two way comparison + /** Can handle both comparison type. */ + BOTH + } } diff --git a/plugins/org.eclipse.emf.compare.rcp/src/org/eclipse/emf/compare/rcp/internal/extension/impl/AbstractItemDescriptor.java b/plugins/org.eclipse.emf.compare.rcp/src/org/eclipse/emf/compare/rcp/internal/extension/impl/AbstractItemDescriptor.java index 03a226137..013537e65 100644 --- a/plugins/org.eclipse.emf.compare.rcp/src/org/eclipse/emf/compare/rcp/internal/extension/impl/AbstractItemDescriptor.java +++ b/plugins/org.eclipse.emf.compare.rcp/src/org/eclipse/emf/compare/rcp/internal/extension/impl/AbstractItemDescriptor.java @@ -128,4 +128,9 @@ public abstract class AbstractItemDescriptor<T> implements IItemDescriptor<T> { };
}
+ @Override
+ public String toString() {
+ return "StaticItemDescriptor [Label=" + getLabel() + ", Description=" + getDescription() + ", rank=" //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
+ + getRank() + ", id=" + getID() + "]"; //$NON-NLS-1$ //$NON-NLS-2$
+ }
}
diff --git a/plugins/org.eclipse.emf.compare.rcp/src/org/eclipse/emf/compare/rcp/internal/extension/impl/ItemUtil.java b/plugins/org.eclipse.emf.compare.rcp/src/org/eclipse/emf/compare/rcp/internal/extension/impl/ItemUtil.java index 63c7493d8..2497c746d 100644 --- a/plugins/org.eclipse.emf.compare.rcp/src/org/eclipse/emf/compare/rcp/internal/extension/impl/ItemUtil.java +++ b/plugins/org.eclipse.emf.compare.rcp/src/org/eclipse/emf/compare/rcp/internal/extension/impl/ItemUtil.java @@ -10,9 +10,12 @@ *******************************************************************************/ package org.eclipse.emf.compare.rcp.internal.extension.impl; +import com.google.common.collect.Iterables; import com.google.common.collect.Sets; +import com.google.common.collect.Sets.SetView; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Set; @@ -121,13 +124,13 @@ public final class ItemUtil { * @param preferenceKey * Key for this {@link IItemDescriptor} in preferences * @param itemPreferences - * {@link IEclipsePreferences} where are stored {@link IItemDescriptor} values + * {@link Preferences} where are stored {@link IItemDescriptor} values * @param <T> * Type of {@link IItemDescriptor} * @return List of {@link IItemDescriptor} or null if nothing in preferences */ public static <T> List<IItemDescriptor<T>> getItemsDescriptor(IItemRegistry<T> registry, - String preferenceKey, IEclipsePreferences itemPreferences) { + String preferenceKey, Preferences itemPreferences) { String diffEngineKey = itemPreferences.get(preferenceKey, null); List<IItemDescriptor<T>> result = null; if (diffEngineKey != null) { @@ -188,4 +191,49 @@ public final class ItemUtil { return activeFactory; } + + /** + * Return an ordered list of {@link IItemDescriptor}. The order in the list is either define by the rank + * in the registry or from preference is the rank has been overloaded. If any descriptor has been added or + * removed from last modification in the preference. This method will merge the modification. + * + * @param orderedDefaultDescriptor + * List of ordered default {@link IItemDescriptor}. + * @param descriptorRegistry + * Registry of descriptor. + * @param orderedItemPreferenceKey + * Key in preferences where are stored the new order of descriptor + * @param preferences + * holding user preferences. + * @return Ordered list of descriptor. + * @param <T> + * Descriptor type. + */ + public static <T> List<IItemDescriptor<T>> getOrderedItems( + List<IItemDescriptor<T>> orderedDefaultDescriptor, IItemRegistry<T> descriptorRegistry, + String orderedItemPreferenceKey, Preferences preferences) { + List<IItemDescriptor<T>> itemsDescriptor = ItemUtil.getItemsDescriptor(descriptorRegistry, + orderedItemPreferenceKey, preferences); + + if (itemsDescriptor == null) { + itemsDescriptor = orderedDefaultDescriptor; + } else { + HashSet<IItemDescriptor<T>> descriptorFromPrefSet = Sets.newLinkedHashSet(itemsDescriptor); + HashSet<IItemDescriptor<T>> defaultDescriptorSet = Sets + .newLinkedHashSet(orderedDefaultDescriptor); + + // Remove descriptor + SetView<IItemDescriptor<T>> descriptorToRemove = Sets.difference(descriptorFromPrefSet, + defaultDescriptorSet); + Iterables.removeAll(itemsDescriptor, descriptorToRemove); + + // Add new descriptor + SetView<IItemDescriptor<T>> descriptorToAdd = Sets.difference(defaultDescriptorSet, + descriptorFromPrefSet); + Iterables.addAll(itemsDescriptor, descriptorToAdd); + + } + return itemsDescriptor; + } + } diff --git a/plugins/org.eclipse.emf.compare.rcp/src/org/eclipse/emf/compare/rcp/internal/preferences/EMFComparePreferences.java b/plugins/org.eclipse.emf.compare.rcp/src/org/eclipse/emf/compare/rcp/internal/preferences/EMFComparePreferences.java index b3a82e1ef..49ad5463d 100644 --- a/plugins/org.eclipse.emf.compare.rcp/src/org/eclipse/emf/compare/rcp/internal/preferences/EMFComparePreferences.java +++ b/plugins/org.eclipse.emf.compare.rcp/src/org/eclipse/emf/compare/rcp/internal/preferences/EMFComparePreferences.java @@ -35,6 +35,12 @@ public final class EMFComparePreferences { /** Disabled post processors preference. */
public static final String DISABLED_POST_PROCESSOR = "org.eclipse.emf.compare.preference.postprocessor.disabled"; //$NON-NLS-1$
+ /** Ordered list of groups for two way comparison. */
+ public static final String TWO_WAY_GROUP_RANKING = "org.eclipse.emf.compare.preference.groups.2way"; //$NON-NLS-1$
+
+ /** Ordered list of groups for three way comparison. */
+ public static final String THREE_WAY_GROUP_RANKING = "org.eclipse.emf.compare.preference.groups.3way"; //$NON-NLS-1$
+
/**
* Private constructor. Not to be called.
*/
@@ -42,4 +48,19 @@ public final class EMFComparePreferences { // Hide default constructor.
}
+ /**
+ * Value of {@link EMFComparePreferences#THREE_WAY_COMPARISON_AUTOMATIC_BEHAVIOR} and
+ * {@link EMFComparePreferences#TWO_WAY_COMPARISON_AUTOMATIC_BEHAVIOR}.
+ *
+ * @author <a href="mailto:arthur.daussy@obeo.fr">Arthur Daussy</a>
+ */
+ public static enum GroupAutomaticBehavior {
+ /** Never synchronize current selected group with preferences. */
+ NEVER,
+ /** Always synchronize current selected group with preferences. */
+ ALWAYS,
+ /** Ask each time the user if he want to synchronize. */
+ ASK_EACH_TIME
+ }
+
}
|