Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/configuration/EMFCompareConfiguration.java327
-rw-r--r--plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/contentmergeviewer/EMFCompareContentMergeViewer.java199
-rw-r--r--plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/contentmergeviewer/table/TableContentMergeViewer.java5
-rw-r--r--plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/contentmergeviewer/text/EMFCompareTextMergeViewer.java28
-rw-r--r--plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/contentmergeviewer/tree/TreeContentMergeViewer.java13
-rw-r--r--plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/editor/ComparisonScopeEditorInput.java2
-rw-r--r--plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/CompareToolBar.java162
-rw-r--r--plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/EMFCompareDiffTreeRuler.java66
-rw-r--r--plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/EMFCompareDiffTreeViewer.java97
-rw-r--r--plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/EMFCompareStructureMergeViewer.java132
-rw-r--r--plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/actions/DropDownMergeMenuAction.java31
-rw-r--r--plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/actions/ExpandAllModelAction.java2
-rw-r--r--plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/util/ExceptionUtil.java1
-rw-r--r--plugins/org.eclipse.emf.compare.rcp.ui/META-INF/MANIFEST.MF1
-rw-r--r--plugins/org.eclipse.emf.compare.rcp.ui/plugin.xml5
-rw-r--r--plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/EMFCompareRCPUIPlugin.java2
-rw-r--r--plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/EMFCompareConfigurationChangeListener.java125
-rw-r--r--plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/IAdapterFactoryChange.java23
-rw-r--r--plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/ICompareEditingDomainChange.java23
-rw-r--r--plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/ICompareEvent.java20
-rw-r--r--plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/IComparisonAndScopeChange.java30
-rw-r--r--plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/IEMFComparatorChange.java23
-rw-r--r--plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/IEMFCompareConfiguration.java76
-rw-r--r--plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/IEMFCompareConfigurationChangeListener.java60
-rw-r--r--plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/IMergePreviewModeChange.java23
-rw-r--r--plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/impl/AdapterFactoryChange.java20
-rw-r--r--plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/impl/CompareEditingDomainChange.java21
-rw-r--r--plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/impl/CompareEvent.java (renamed from plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/util/SWTUtil.java)33
-rw-r--r--plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/impl/ComparisonAndScopeChange.java67
-rw-r--r--plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/impl/EMFComparatorChange.java20
-rw-r--r--plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/impl/MergePreviewModeChange.java20
-rw-r--r--plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/mergeviewer/impl/AbstractMergeViewer.java53
-rw-r--r--plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/mergeviewer/impl/TableOrTreeMergeViewer.java5
-rw-r--r--plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/actions/FilterAction.java4
-rw-r--r--plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/actions/FilterActionMenu.java39
-rw-r--r--plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/actions/GroupActionMenu.java40
-rw-r--r--plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/filters/IDifferenceFilterChange.java31
-rw-r--r--plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/filters/IDifferenceFilterSelectionChangeEvent.java59
-rw-r--r--plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/filters/StructureMergeViewerFilter.java122
-rw-r--r--plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/filters/impl/DifferenceFilterChange.java71
-rw-r--r--plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/filters/impl/DifferenceFilterSelectionChangeEventImpl.java77
-rw-r--r--plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/IDifferenceGroupProvider.java5
-rw-r--r--plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/IDifferenceGroupProviderChange.java21
-rw-r--r--plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/StructureMergeViewerGrouper.java13
-rw-r--r--plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/DifferenceGroupProviderChange.java36
-rw-r--r--plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/DifferenceGroupRegistryImpl.java30
-rw-r--r--plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/provider/GroupItemProviderAdapter.java8
-rw-r--r--plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/util/SWTUtil.java100
48 files changed, 1252 insertions, 1119 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 8f3e0d66a..42a905895 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
@@ -10,15 +10,11 @@
*******************************************************************************/
package org.eclipse.emf.compare.ide.ui.internal.configuration;
-import static com.google.common.base.Predicates.alwaysFalse;
-
import com.google.common.base.Preconditions;
-import com.google.common.base.Predicate;
-import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Lists;
+import com.google.common.eventbus.EventBus;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.Collection;
import org.eclipse.compare.CompareConfiguration;
import org.eclipse.emf.common.notify.AdapterFactory;
@@ -27,12 +23,17 @@ import org.eclipse.emf.compare.EMFCompare;
import org.eclipse.emf.compare.domain.ICompareEditingDomain;
import org.eclipse.emf.compare.ide.ui.internal.EMFCompareIDEUIPlugin;
import org.eclipse.emf.compare.internal.merge.MergeMode;
+import org.eclipse.emf.compare.rcp.ui.EMFCompareRCPUIPlugin;
import org.eclipse.emf.compare.rcp.ui.internal.configuration.IEMFCompareConfiguration;
-import org.eclipse.emf.compare.rcp.ui.internal.configuration.IEMFCompareConfigurationChangeListener;
+import org.eclipse.emf.compare.rcp.ui.internal.configuration.impl.CompareEditingDomainChange;
+import org.eclipse.emf.compare.rcp.ui.internal.configuration.impl.ComparisonAndScopeChange;
+import org.eclipse.emf.compare.rcp.ui.internal.configuration.impl.EMFComparatorChange;
+import org.eclipse.emf.compare.rcp.ui.internal.configuration.impl.MergePreviewModeChange;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.IDifferenceFilter;
+import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.StructureMergeViewerFilter;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.IDifferenceGroupProvider;
+import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.StructureMergeViewerGrouper;
import org.eclipse.emf.compare.scope.IComparisonScope;
-import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
@@ -49,27 +50,16 @@ public class EMFCompareConfiguration extends ForwardingCompareConfiguration impl
private static final String ADAPTER_FACTORY = EMFCompareIDEUIPlugin.PLUGIN_ID + ".ADAPTER_FACTORY"; //$NON-NLS-1$
- private static final String SELECTED_DIFFERENCE_FILTERS = EMFCompareIDEUIPlugin.PLUGIN_ID
- + ".SELECTED_DIFFERENCE_FILTERS"; //$NON-NLS-1$
-
- private static final Set<IDifferenceFilter> SELECTED_DIFFERENCE_FILTERS__DEFAULT_VALUE = ImmutableSet
- .of();
-
- private static final String AGGREGATED_VIEWER_PREDICATE = EMFCompareIDEUIPlugin.PLUGIN_ID
- + ".AGGREGATED_VIEWER_PREDICATE"; //$NON-NLS-1$
-
- private static final Predicate<? super EObject> AGGREGATED_VIEWER_PREDICATE__DEFAULT_VALUE = alwaysFalse();
-
- private static final String SELECTED_DIFFERENCE_GROUP_PROVIDER = EMFCompareIDEUIPlugin.PLUGIN_ID
- + ".SELECTED_DIFFERENCE_GROUP_PROVIDER"; //$NON-NLS-1$
-
- private static final IDifferenceGroupProvider SELECTED_DIFFERENCE_GROUP_PROVIDER__DEFAULT_VALUE = IDifferenceGroupProvider.EMPTY;
-
private static final String PREVIEW_MERGE_MODE = EMFCompareIDEUIPlugin.PLUGIN_ID + ".PREVIEW_MERGE_MODE"; //$NON-NLS-1$
private static final String COMPARISON_SCOPE = EMFCompareIDEUIPlugin.PLUGIN_ID + ".COMPARISON_SCOPE"; //$NON-NLS-1$;
- private final List<IEMFCompareConfigurationChangeListener> listeners;
+ private static final String SMV_FILTERS = EMFCompareIDEUIPlugin.PLUGIN_ID + ".SMV_FILTERS"; //$NON-NLS-1$;
+
+ private static final String EVENT_BUS = EMFCompareIDEUIPlugin.PLUGIN_ID + ".EVENT_BUS"; //$NON-NLS-1$;
+
+ private static final String SMV_GROUP_PROVIDERS = EMFCompareIDEUIPlugin.PLUGIN_ID
+ + ".SMV_GROUP_PROVIDERS"; //$NON-NLS-1$;
private final PropertyChangeListener propertyChangeListener;
@@ -78,37 +68,43 @@ public class EMFCompareConfiguration extends ForwardingCompareConfiguration impl
public EMFCompareConfiguration(CompareConfiguration compareConfiguration) {
this.compareConfiguration = compareConfiguration;
setDefaultValues();
- listeners = new CopyOnWriteArrayList<IEMFCompareConfigurationChangeListener>();
propertyChangeListener = new PropertyChangeListener();
compareConfiguration.addPropertyChangeListener(propertyChangeListener);
}
- public void setDefaultValues() {
- if (compareConfiguration.getProperty(AGGREGATED_VIEWER_PREDICATE) == null) {
- compareConfiguration.setProperty(AGGREGATED_VIEWER_PREDICATE,
- AGGREGATED_VIEWER_PREDICATE__DEFAULT_VALUE);
+ private void setDefaultValues() {
+ if (isLeftEditable() && isRightEditable()) {
+ setProperty(PREVIEW_MERGE_MODE, MergeMode.RIGHT_TO_LEFT);
+ } else {
+ setProperty(PREVIEW_MERGE_MODE, MergeMode.ACCEPT);
}
- if (compareConfiguration.getProperty(SELECTED_DIFFERENCE_FILTERS) == null) {
- compareConfiguration.setProperty(SELECTED_DIFFERENCE_FILTERS,
- SELECTED_DIFFERENCE_FILTERS__DEFAULT_VALUE);
+ EventBus eventBus = new EventBus();
+ if (getProperty(SMV_FILTERS) == null) {
+ setProperty(SMV_FILTERS, new StructureMergeViewerFilter(eventBus));
}
- if (compareConfiguration.getProperty(SELECTED_DIFFERENCE_GROUP_PROVIDER) == null) {
- compareConfiguration.setProperty(SELECTED_DIFFERENCE_GROUP_PROVIDER,
- SELECTED_DIFFERENCE_GROUP_PROVIDER__DEFAULT_VALUE);
+ if (getProperty(SMV_GROUP_PROVIDERS) == null) {
+ setProperty(SMV_GROUP_PROVIDERS, new StructureMergeViewerGrouper(eventBus));
}
- if (compareConfiguration.isLeftEditable() && compareConfiguration.isRightEditable()) {
- compareConfiguration.setProperty(PREVIEW_MERGE_MODE, MergeMode.RIGHT_TO_LEFT);
- } else {
- compareConfiguration.setProperty(PREVIEW_MERGE_MODE, MergeMode.ACCEPT);
+ if (getProperty(EVENT_BUS) == null) {
+ setProperty(EVENT_BUS, eventBus);
}
}
/**
* {@inheritDoc}
*
+ * @see org.eclipse.emf.compare.rcp.ui.internal.configuration.IEMFCompareConfiguration#getEventBus()
+ */
+ public EventBus getEventBus() {
+ return (EventBus)getProperty(EVENT_BUS);
+ }
+
+ /**
+ * {@inheritDoc}
+ *
* @see org.eclipse.emf.compare.ide.ui.internal.configuration.ForwardingCompareConfiguration#delegate()
*/
@Override
@@ -127,228 +123,135 @@ public class EMFCompareConfiguration extends ForwardingCompareConfiguration impl
compareConfiguration.removePropertyChangeListener(propertyChangeListener);
}
- /**
- * {@inheritDoc}
- *
- * @see org.eclipse.emf.compare.rcp.ui.internal.configuration.IEMFCompareConfiguration#addChangeListener(org.eclipse.emf.compare.rcp.ui.internal.configuration.IEMFCompareConfigurationChangeListener)
- */
- public void addChangeListener(IEMFCompareConfigurationChangeListener listener) {
- listeners.add(listener);
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.eclipse.emf.compare.rcp.ui.internal.configuration.IEMFCompareConfiguration#removeChangeListener(org.eclipse.emf.compare.rcp.ui.internal.configuration.IEMFCompareConfigurationChangeListener)
- */
- public void removeChangeListener(IEMFCompareConfigurationChangeListener listener) {
- listeners.remove(listener);
+ public boolean getBooleanProperty(String key, boolean dflt) {
+ final boolean ret;
+ Object value = getProperty(key);
+ if (value instanceof Boolean) {
+ ret = ((Boolean)value).booleanValue();
+ } else {
+ ret = dflt;
+ }
+ return ret;
}
public Comparison getComparison() {
return (Comparison)getProperty(COMPARE_RESULT);
}
- public void setComparison(Comparison comparison) {
- setProperty(COMPARE_RESULT, comparison);
- }
-
- public EMFCompare getComparator() {
+ public EMFCompare getEMFComparator() {
return (EMFCompare)getProperty(COMPARATOR);
}
- public void setComparator(EMFCompare comparator) {
- setProperty(COMPARATOR, comparator);
- }
-
public ICompareEditingDomain getEditingDomain() {
return (ICompareEditingDomain)getProperty(EDITING_DOMAIN);
}
- public void setEditingDomain(ICompareEditingDomain editingDomain) {
- setProperty(EDITING_DOMAIN, editingDomain);
+ public MergeMode getMergePreviewMode() {
+ return (MergeMode)getProperty(PREVIEW_MERGE_MODE);
}
- @SuppressWarnings("unchecked")
- public Set<IDifferenceFilter> getSelectedDifferenceFilters() {
- return (Set<IDifferenceFilter>)getProperty(SELECTED_DIFFERENCE_FILTERS);
+ public AdapterFactory getAdapterFactory() {
+ return (AdapterFactory)getProperty(ADAPTER_FACTORY);
}
- public void setSelectedDifferenceFilters(Set<IDifferenceFilter> differenceFilters) {
- Preconditions.checkNotNull(differenceFilters);
- setProperty(SELECTED_DIFFERENCE_FILTERS, differenceFilters);
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.eclipse.emf.compare.rcp.ui.internal.configuration.IEMFCompareConfiguration#getComparisonScope()
+ */
+ public IComparisonScope getComparisonScope() {
+ return (IComparisonScope)getProperty(COMPARISON_SCOPE);
}
- @SuppressWarnings("unchecked")
- public Predicate<? super EObject> getAggregatedViewerPredicate() {
- return (Predicate<? super EObject>)getProperty(AGGREGATED_VIEWER_PREDICATE);
+ public void setEMFComparator(EMFCompare newComparator) {
+ EMFCompare oldComparator = getEMFComparator();
+ setProperty(COMPARATOR, oldComparator);
+ getEventBus().post(new EMFComparatorChange(oldComparator, newComparator));
}
- public void setAggregatedViewerPredicate(Predicate<? super EObject> predicate) {
- Preconditions.checkNotNull(predicate);
- setProperty(AGGREGATED_VIEWER_PREDICATE, predicate);
+ public void setEditingDomain(ICompareEditingDomain newValue) {
+ ICompareEditingDomain oldValue = getEditingDomain();
+ setProperty(EDITING_DOMAIN, newValue);
+ getEventBus().post(new CompareEditingDomainChange(oldValue, newValue));
}
- public IDifferenceGroupProvider getSelectedDifferenceGroupProvider() {
- return (IDifferenceGroupProvider)getProperty(SELECTED_DIFFERENCE_GROUP_PROVIDER);
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.eclipse.emf.compare.rcp.ui.internal.configuration.IEMFCompareConfiguration#setComparisonAndScope(org.eclipse.emf.compare.scope.IComparisonScope,
+ * org.eclipse.emf.compare.Comparison)
+ */
+ public void setComparisonAndScope(Comparison newComparison, IComparisonScope newComparisonScope) {
+ Comparison oldComparison = getComparison();
+ IComparisonScope oldComparisonScope = getComparisonScope();
+ setProperty(COMPARE_RESULT, newComparison);
+ setProperty(COMPARISON_SCOPE, newComparisonScope);
+
+ initStructureMergeViewerFilter(newComparison, newComparisonScope);
+ initStructureMergeViewerGroupProvider(newComparison, newComparisonScope);
+
+ getEventBus().post(
+ new ComparisonAndScopeChange(oldComparison, newComparison, oldComparisonScope,
+ newComparisonScope));
}
- public void setSelectedDifferenceGroupProvider(IDifferenceGroupProvider groupProvider) {
- Preconditions.checkNotNull(groupProvider);
- setProperty(SELECTED_DIFFERENCE_GROUP_PROVIDER, groupProvider);
+ protected void initStructureMergeViewerGroupProvider(Comparison comparison,
+ IComparisonScope comparisonScope) {
+ EMFCompareRCPUIPlugin plugin = EMFCompareRCPUIPlugin.getDefault();
+ IDifferenceGroupProvider.Registry groupProviderRegistry = plugin.getDifferenceGroupProviderRegistry();
+ getStructureMergeViewerGrouper().setProvider(
+ groupProviderRegistry.getDefaultGroupProviders(comparisonScope, comparison));
}
- public MergeMode getMergePreviewMode() {
- return (MergeMode)getProperty(PREVIEW_MERGE_MODE);
+ protected void initStructureMergeViewerFilter(Comparison comparison, IComparisonScope comparisonScope) {
+ EMFCompareRCPUIPlugin plugin = EMFCompareRCPUIPlugin.getDefault();
+ IDifferenceFilter.Registry filterRegistry = plugin.getDifferenceFilterRegistry();
+ Collection<IDifferenceFilter> filters = filterRegistry.getFilters(comparisonScope, comparison);
+ Collection<IDifferenceFilter> selectedFilters = Lists.newArrayList();
+ Collection<IDifferenceFilter> unselectedFilters = Lists.newArrayList();
+ for (IDifferenceFilter filter : filters) {
+ if (filter.defaultSelected()) {
+ selectedFilters.add(filter);
+ } else {
+ unselectedFilters.add(filter);
+ }
+ }
+ getStructureMergeViewerFilter().init(selectedFilters, unselectedFilters);
}
public void setMergePreviewMode(MergeMode previewMergeMode) {
Preconditions.checkNotNull(previewMergeMode);
+ MergeMode oldValue = getMergePreviewMode();
setProperty(PREVIEW_MERGE_MODE, previewMergeMode);
- }
-
- public AdapterFactory getAdapterFactory() {
- return (AdapterFactory)getProperty(ADAPTER_FACTORY);
+ getEventBus().post(new MergePreviewModeChange(oldValue, previewMergeMode));
}
public void setAdapterFactory(AdapterFactory adapterFactory) {
setProperty(ADAPTER_FACTORY, adapterFactory);
}
- public boolean getBooleanProperty(String key, boolean dflt) {
- final boolean ret;
- Object value = getProperty(key);
- if (value instanceof Boolean) {
- ret = ((Boolean)value).booleanValue();
- } else {
- ret = dflt;
+ private class PropertyChangeListener implements IPropertyChangeListener {
+ public void propertyChange(PropertyChangeEvent event) {
+ fireChange(event.getProperty(), event.getOldValue(), event.getNewValue());
}
- return ret;
}
/**
* {@inheritDoc}
*
- * @see org.eclipse.emf.compare.rcp.ui.internal.configuration.IEMFCompareConfiguration#getComparisonScope()
+ * @see org.eclipse.emf.compare.rcp.ui.internal.configuration.IEMFCompareConfiguration#getStructureMergeViewerGrouper()
*/
- public IComparisonScope getComparisonScope() {
- return (IComparisonScope)getProperty(COMPARISON_SCOPE);
+ public StructureMergeViewerGrouper getStructureMergeViewerGrouper() {
+ return (StructureMergeViewerGrouper)getProperty(SMV_GROUP_PROVIDERS);
}
/**
* {@inheritDoc}
*
- * @see org.eclipse.emf.compare.rcp.ui.internal.configuration.IEMFCompareConfiguration#setComparisonScope(org.eclipse.emf.compare.scope.IComparisonScope)
+ * @see org.eclipse.emf.compare.rcp.ui.internal.configuration.IEMFCompareConfiguration#getStructureMergeViewerFilter()
*/
- public void setComparisonScope(IComparisonScope comparisonScope) {
- setProperty(COMPARISON_SCOPE, comparisonScope);
- }
-
- private class PropertyChangeListener implements IPropertyChangeListener {
-
- /**
- * {@inheritDoc}
- *
- * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
- */
- public void propertyChange(PropertyChangeEvent event) {
- String property = event.getProperty();
- if (EDITING_DOMAIN.equals(property)) {
- handleEditingDomainChange(event);
- } else if (SELECTED_DIFFERENCE_GROUP_PROVIDER.equals(property)) {
- handleSelectedDifferenceGroupProviderChanger(event);
- } else if (SELECTED_DIFFERENCE_FILTERS.equals(property)) {
- handleSelectedDifferenceFiltersChange(event);
- } else if (AGGREGATED_VIEWER_PREDICATE.equals(property)) {
- handleAggregatedViewerPredicateChange(event);
- } else if (COMPARE_RESULT.equals(property)) {
- handleComparisonChange(event);
- } else if (ADAPTER_FACTORY.equals(property)) {
- handleAdapterFactoryChange(event);
- } else if (COMPARATOR.equals(property)) {
- handleComparatorChange(event);
- } else if (PREVIEW_MERGE_MODE.equals(property)) {
- handlePreviewMergeModeChange(event);
- } else if (COMPARISON_SCOPE.equals(property)) {
- handleComparisonScopeChange(event);
- } else {
- fireChange(property, event.getOldValue(), event.getNewValue());
- }
- }
-
- protected void handleAdapterFactoryChange(PropertyChangeEvent event) {
- AdapterFactory oldValue = (AdapterFactory)event.getOldValue();
- AdapterFactory newValue = (AdapterFactory)event.getNewValue();
- for (IEMFCompareConfigurationChangeListener listener : listeners) {
- listener.adapterFactoryChange(oldValue, newValue);
- }
- }
-
- protected void handleComparisonChange(PropertyChangeEvent event) {
- Comparison oldValue = (Comparison)event.getOldValue();
- Comparison newValue = (Comparison)event.getNewValue();
- for (IEMFCompareConfigurationChangeListener listener : listeners) {
- listener.comparisonChange(oldValue, newValue);
- }
- }
-
- @SuppressWarnings("unchecked")
- protected void handleAggregatedViewerPredicateChange(PropertyChangeEvent event) {
- Predicate<? super EObject> oldValue = (Predicate<? super EObject>)event.getOldValue();
- Predicate<? super EObject> newValue = (Predicate<? super EObject>)event.getNewValue();
- for (IEMFCompareConfigurationChangeListener listener : listeners) {
- listener.aggregatedViewerPredicateChange(oldValue, newValue);
- }
- }
-
- @SuppressWarnings("unchecked")
- protected void handleSelectedDifferenceFiltersChange(PropertyChangeEvent event) {
- Set<IDifferenceFilter> oldValue = (Set<IDifferenceFilter>)event.getOldValue();
- Set<IDifferenceFilter> newValue = (Set<IDifferenceFilter>)event.getNewValue();
- for (IEMFCompareConfigurationChangeListener listener : listeners) {
- listener.selectedDifferenceFiltersChange(oldValue, newValue);
- }
- }
-
- protected void handleSelectedDifferenceGroupProviderChanger(PropertyChangeEvent event) {
- IDifferenceGroupProvider oldValue = (IDifferenceGroupProvider)event.getOldValue();
- IDifferenceGroupProvider newValue = (IDifferenceGroupProvider)event.getNewValue();
- for (IEMFCompareConfigurationChangeListener listener : listeners) {
- listener.selectedDifferenceGroupProviderChange(oldValue, newValue);
- }
- }
-
- protected void handleEditingDomainChange(PropertyChangeEvent event) {
- ICompareEditingDomain oldValue = (ICompareEditingDomain)event.getOldValue();
- ICompareEditingDomain newValue = (ICompareEditingDomain)event.getNewValue();
- for (IEMFCompareConfigurationChangeListener listener : listeners) {
- listener.editingDomainChange(oldValue, newValue);
- }
- }
-
- protected void handleComparatorChange(PropertyChangeEvent event) {
- EMFCompare oldValue = (EMFCompare)event.getOldValue();
- EMFCompare newValue = (EMFCompare)event.getNewValue();
- for (IEMFCompareConfigurationChangeListener listener : listeners) {
- listener.comparatorChange(oldValue, newValue);
- }
- }
-
- protected void handlePreviewMergeModeChange(PropertyChangeEvent event) {
- MergeMode oldValue = (MergeMode)event.getOldValue();
- MergeMode newValue = (MergeMode)event.getNewValue();
- for (IEMFCompareConfigurationChangeListener listener : listeners) {
- listener.mergePreviewModeChange(oldValue, newValue);
- }
- }
-
- protected void handleComparisonScopeChange(PropertyChangeEvent event) {
- IComparisonScope oldValue = (IComparisonScope)event.getOldValue();
- IComparisonScope newValue = (IComparisonScope)event.getNewValue();
- for (IEMFCompareConfigurationChangeListener listener : listeners) {
- listener.comparisonScopeChange(oldValue, newValue);
- }
- }
+ public StructureMergeViewerFilter getStructureMergeViewerFilter() {
+ return (StructureMergeViewerFilter)getProperty(SMV_FILTERS);
}
}
diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/contentmergeviewer/EMFCompareContentMergeViewer.java b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/contentmergeviewer/EMFCompareContentMergeViewer.java
index 3a9a9ec6f..05faed21f 100644
--- a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/contentmergeviewer/EMFCompareContentMergeViewer.java
+++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/contentmergeviewer/EMFCompareContentMergeViewer.java
@@ -14,13 +14,13 @@ import static com.google.common.collect.Iterables.filter;
import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableList;
+import com.google.common.eventbus.Subscribe;
import java.util.EventObject;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.ResourceBundle;
-import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
import org.eclipse.compare.contentmergeviewer.ContentMergeViewer;
@@ -39,17 +39,19 @@ import org.eclipse.emf.compare.ide.ui.internal.contentmergeviewer.util.DynamicOb
import org.eclipse.emf.compare.ide.ui.internal.contentmergeviewer.util.EMFCompareColor;
import org.eclipse.emf.compare.ide.ui.internal.contentmergeviewer.util.RedoAction;
import org.eclipse.emf.compare.ide.ui.internal.contentmergeviewer.util.UndoAction;
-import org.eclipse.emf.compare.ide.ui.internal.util.SWTUtil;
import org.eclipse.emf.compare.rcp.EMFCompareRCPPlugin;
-import org.eclipse.emf.compare.rcp.ui.internal.configuration.EMFCompareConfigurationChangeListener;
+import org.eclipse.emf.compare.rcp.ui.internal.configuration.IAdapterFactoryChange;
+import org.eclipse.emf.compare.rcp.ui.internal.configuration.ICompareEditingDomainChange;
import org.eclipse.emf.compare.rcp.ui.internal.contentmergeviewer.accessor.ICompareAccessor;
import org.eclipse.emf.compare.rcp.ui.internal.mergeviewer.ICompareColor;
import org.eclipse.emf.compare.rcp.ui.internal.mergeviewer.IMergeViewer;
import org.eclipse.emf.compare.rcp.ui.internal.mergeviewer.IMergeViewer.MergeViewerSide;
import org.eclipse.emf.compare.rcp.ui.internal.mergeviewer.item.IMergeViewerItem;
import org.eclipse.emf.compare.rcp.ui.internal.mergeviewer.item.impl.MergeViewerItem;
-import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.IDifferenceFilter;
+import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.IDifferenceFilterChange;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.IDifferenceGroupProvider;
+import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.IDifferenceGroupProviderChange;
+import org.eclipse.emf.compare.rcp.ui.internal.util.SWTUtil;
import org.eclipse.emf.compare.utils.EMFComparePredicates;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
@@ -85,97 +87,6 @@ import org.eclipse.ui.views.properties.PropertySheet;
*/
public abstract class EMFCompareContentMergeViewer extends ContentMergeViewer implements ISelectionChangedListener, ICompareColor.Provider, IAdaptable, CommandStackListener {
- /**
- * @author <a href="mailto:mikael.barbero@obeo.fr">Mikael Barbero</a>
- */
- private final class EMFCompareContentMergerViewerConfigurationListener extends EMFCompareConfigurationChangeListener {
-
- /**
- * {@inheritDoc}
- *
- * @see org.eclipse.emf.compare.ide.ui.internal.configuration.EMFCompareConfiguration#editingDomainChange(org.eclipse.emf.compare.domain.ICompareEditingDomain,
- * org.eclipse.emf.compare.domain.ICompareEditingDomain)
- */
- @Override
- public void editingDomainChange(ICompareEditingDomain oldValue, ICompareEditingDomain newValue) {
- if (newValue != oldValue) {
- if (oldValue != null) {
- oldValue.getCommandStack().removeCommandStackListener(EMFCompareContentMergeViewer.this);
- }
-
- if (newValue != null) {
- newValue.getCommandStack().addCommandStackListener(EMFCompareContentMergeViewer.this);
- setLeftDirty(newValue.getCommandStack().isLeftSaveNeeded());
- setRightDirty(newValue.getCommandStack().isRightSaveNeeded());
- }
- if (undoAction != null) {
- undoAction.setEditingDomain(newValue);
- }
- if (redoAction != null) {
- redoAction.setEditingDomain(newValue);
- }
- }
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.eclipse.emf.compare.ide.ui.internal.configuration.EMFCompareConfiguration#aggregatedViewerPredicateChange(com.google.common.base.Predicate,
- * com.google.common.base.Predicate)
- */
- @Override
- public void aggregatedViewerPredicateChange(Predicate<? super EObject> oldValue,
- Predicate<? super EObject> newValue) {
- if (oldValue != newValue) {
- redrawCenterControl();
- }
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.eclipse.emf.compare.ide.ui.internal.configuration.EMFCompareConfiguration#selectedDifferenceFiltersChange(java.util.Set,
- * java.util.Set)
- */
- @Override
- public void selectedDifferenceFiltersChange(Set<IDifferenceFilter> oldValue,
- Set<IDifferenceFilter> newValue) {
- if (oldValue != newValue) {
- redrawCenterControl();
- }
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.eclipse.emf.compare.ide.ui.internal.configuration.EMFCompareConfiguration#selectedDifferenceGroupProviderChange(org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.IDifferenceGroupProvider,
- * org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.IDifferenceGroupProvider)
- */
- @Override
- public void selectedDifferenceGroupProviderChange(IDifferenceGroupProvider oldValue,
- IDifferenceGroupProvider newValue) {
- if (oldValue != newValue) {
- redrawCenterControl();
- }
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.eclipse.emf.compare.ide.ui.internal.configuration.EMFCompareConfiguration#adapterFactoryChange(org.eclipse.emf.common.notify.AdapterFactory,
- * org.eclipse.emf.common.notify.AdapterFactory)
- */
- @Override
- public void adapterFactoryChange(AdapterFactory oldValue, AdapterFactory newValue) {
- if (oldValue != null) {
- fAdapterFactoryContentProvider.dispose();
- }
- if (newValue != oldValue) {
- fAdapterFactoryContentProvider = new AdapterFactoryContentProvider(newValue);
- }
- }
- }
-
private static final String HANDLER_SERVICE = "fHandlerService";
/**
@@ -201,7 +112,9 @@ public abstract class EMFCompareContentMergeViewer extends ContentMergeViewer im
private AdapterFactoryContentProvider fAdapterFactoryContentProvider;
- private final EMFCompareContentMergerViewerConfigurationListener configurationListener;
+ private Predicate<? super EObject> differenceFilterPredicate;
+
+ private IDifferenceGroupProvider differenceGroupProvider;
/**
* @param style
@@ -218,8 +131,87 @@ public abstract class EMFCompareContentMergeViewer extends ContentMergeViewer im
.getAdapterFactory());
}
- configurationListener = new EMFCompareContentMergerViewerConfigurationListener();
- getCompareConfiguration().addChangeListener(configurationListener);
+ editingDomainChange(null, getCompareConfiguration().getEditingDomain());
+ getCompareConfiguration().getEventBus().register(this);
+ }
+
+ @Subscribe
+ public void handleAdapterFactoryChange(IAdapterFactoryChange event) {
+ AdapterFactory oldValue = event.getOldValue();
+ AdapterFactory newValue = event.getNewValue();
+ if (oldValue != null) {
+ fAdapterFactoryContentProvider.dispose();
+ }
+ if (newValue != oldValue) {
+ fAdapterFactoryContentProvider = new AdapterFactoryContentProvider(newValue);
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.eclipse.emf.compare.ide.ui.internal.configuration.EMFCompareConfiguration#editingDomainChange(org.eclipse.emf.compare.domain.ICompareEditingDomain,
+ * org.eclipse.emf.compare.domain.ICompareEditingDomain)
+ */
+ @Subscribe
+ public void handleEditingDomainChange(ICompareEditingDomainChange event) {
+ ICompareEditingDomain oldValue = event.getOldValue();
+ ICompareEditingDomain newValue = event.getNewValue();
+ editingDomainChange(oldValue, newValue);
+ }
+
+ protected void editingDomainChange(ICompareEditingDomain oldValue, ICompareEditingDomain newValue) {
+ if (newValue != oldValue) {
+ if (oldValue != null) {
+ oldValue.getCommandStack().removeCommandStackListener(this);
+ }
+
+ if (newValue != null) {
+ newValue.getCommandStack().addCommandStackListener(this);
+ setLeftDirty(newValue.getCommandStack().isLeftSaveNeeded());
+ setRightDirty(newValue.getCommandStack().isRightSaveNeeded());
+ }
+ if (undoAction != null) {
+ undoAction.setEditingDomain(newValue);
+ }
+ if (redoAction != null) {
+ redoAction.setEditingDomain(newValue);
+ }
+ }
+ }
+
+ @Subscribe
+ public void handleDifferenceFiltersChange(IDifferenceFilterChange event) {
+ differenceFilterPredicate = event.getPredicate();
+ redrawCenterControl();
+ }
+
+ /**
+ * @return the differenceFilterPredicate
+ */
+ protected final Predicate<? super EObject> getDifferenceFilterPredicate() {
+ if (differenceFilterPredicate == null) {
+ differenceFilterPredicate = getCompareConfiguration().getStructureMergeViewerFilter()
+ .getAggregatedPredicate();
+ }
+ return differenceFilterPredicate;
+ }
+
+ @Subscribe
+ public void handleDifferenceGroupProviderChange(IDifferenceGroupProviderChange event) {
+ differenceGroupProvider = event.getDifferenceGroupProvider();
+ redrawCenterControl();
+ }
+
+ /**
+ * @return the differenceGroupProvider
+ */
+ protected final IDifferenceGroupProvider getDifferenceGroupProvider() {
+ if (differenceGroupProvider == null) {
+ differenceGroupProvider = getCompareConfiguration().getStructureMergeViewerGrouper()
+ .getProvider();
+ }
+ return differenceGroupProvider;
}
/**
@@ -332,11 +324,7 @@ public abstract class EMFCompareContentMergeViewer extends ContentMergeViewer im
setRightDirty(getCompareConfiguration().getEditingDomain().getCommandStack().isRightSaveNeeded());
}
- SWTUtil.safeAsyncExec(new Runnable() {
- public void run() {
- refresh();
- }
- });
+ SWTUtil.safeRefresh(this, true);
}
/**
@@ -641,13 +629,14 @@ public abstract class EMFCompareContentMergeViewer extends ContentMergeViewer im
*/
@Override
protected void handleDispose(DisposeEvent event) {
- getCompareConfiguration().removeChangeListener(configurationListener);
+ editingDomainChange(getCompareConfiguration().getEditingDomain(), null);
+ getCompareConfiguration().getEventBus().unregister(this);
super.handleDispose(event);
}
protected final void redrawCenterControl() {
if (getCenterControl() != null) {
- getCenterControl().redraw();
+ SWTUtil.safeRedraw(getCenterControl(), true);
}
}
diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/contentmergeviewer/table/TableContentMergeViewer.java b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/contentmergeviewer/table/TableContentMergeViewer.java
index 701f65233..757669136 100644
--- a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/contentmergeviewer/table/TableContentMergeViewer.java
+++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/contentmergeviewer/table/TableContentMergeViewer.java
@@ -277,9 +277,8 @@ public class TableContentMergeViewer extends EMFCompareContentMergeViewer {
final Diff leftDiff = ((IMergeViewerItem)leftItem.getData()).getDiff();
boolean doPaint = true;
if (leftDiff != null) {
- if (MergeViewerUtil.isVisibleInMergeViewer(leftDiff, getCompareConfiguration()
- .getSelectedDifferenceGroupProvider(), getCompareConfiguration()
- .getAggregatedViewerPredicate())) {
+ if (MergeViewerUtil.isVisibleInMergeViewer(leftDiff, getDifferenceGroupProvider(),
+ getDifferenceFilterPredicate())) {
TableItem rightItem = findRightTableItemFromLeftDiff(rightItems, leftDiff, leftData);
if (rightItem != null) {
diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/contentmergeviewer/text/EMFCompareTextMergeViewer.java b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/contentmergeviewer/text/EMFCompareTextMergeViewer.java
index 13cceb182..c10e9f611 100644
--- a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/contentmergeviewer/text/EMFCompareTextMergeViewer.java
+++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/contentmergeviewer/text/EMFCompareTextMergeViewer.java
@@ -12,6 +12,7 @@ package org.eclipse.emf.compare.ide.ui.internal.contentmergeviewer.text;
import com.google.common.base.Charsets;
import com.google.common.collect.ImmutableSet;
+import com.google.common.eventbus.Subscribe;
import com.google.common.io.ByteStreams;
import com.google.common.io.Closeables;
@@ -51,8 +52,8 @@ import org.eclipse.emf.compare.ide.ui.internal.contentmergeviewer.util.DynamicOb
import org.eclipse.emf.compare.ide.ui.internal.contentmergeviewer.util.RedoAction;
import org.eclipse.emf.compare.ide.ui.internal.contentmergeviewer.util.UndoAction;
import org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.CompareInputAdapter;
-import org.eclipse.emf.compare.ide.ui.internal.util.SWTUtil;
-import org.eclipse.emf.compare.rcp.ui.internal.configuration.EMFCompareConfigurationChangeListener;
+import org.eclipse.emf.compare.rcp.ui.internal.configuration.ICompareEditingDomainChange;
+import org.eclipse.emf.compare.rcp.ui.internal.util.SWTUtil;
import org.eclipse.emf.compare.utils.IEqualityHelper;
import org.eclipse.emf.compare.utils.ReferenceUtil;
import org.eclipse.emf.ecore.EAttribute;
@@ -91,15 +92,6 @@ public class EMFCompareTextMergeViewer extends TextMergeViewer implements Comman
private final ScheduledExecutorService fExecutorService;
- private final ConfigurationChangeListener configurationChangeListener;
-
- private class ConfigurationChangeListener extends EMFCompareConfigurationChangeListener {
- @Override
- public void editingDomainChange(ICompareEditingDomain oldValue, ICompareEditingDomain newValue) {
- EMFCompareTextMergeViewer.this.editingDomainChange(oldValue, newValue);
- }
- }
-
/**
* @param parent
* @param configuration
@@ -113,8 +105,7 @@ public class EMFCompareTextMergeViewer extends TextMergeViewer implements Comman
editingDomainChange(null, configuration.getEditingDomain());
- configurationChangeListener = new ConfigurationChangeListener();
- configuration.addChangeListener(configurationChangeListener);
+ configuration.getEventBus().register(this);
}
/**
@@ -137,7 +128,14 @@ public class EMFCompareTextMergeViewer extends TextMergeViewer implements Comman
* @param oldValue
* @param newValue
*/
- protected void editingDomainChange(ICompareEditingDomain oldValue, ICompareEditingDomain newValue) {
+ @Subscribe
+ public void editingDomainChange(ICompareEditingDomainChange event) {
+ ICompareEditingDomain oldValue = event.getOldValue();
+ ICompareEditingDomain newValue = event.getNewValue();
+ editingDomainChange(oldValue, newValue);
+ }
+
+ public void editingDomainChange(ICompareEditingDomain oldValue, ICompareEditingDomain newValue) {
if (oldValue != null) {
oldValue.getCommandStack().removeCommandStackListener(this);
}
@@ -456,7 +454,7 @@ public class EMFCompareTextMergeViewer extends TextMergeViewer implements Comman
}
fExecutorService.shutdown();
- getCompareConfiguration().removeChangeListener(configurationChangeListener);
+ getCompareConfiguration().getEventBus().unregister(this);
editingDomainChange(getCompareConfiguration().getEditingDomain(), null);
diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/contentmergeviewer/tree/TreeContentMergeViewer.java b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/contentmergeviewer/tree/TreeContentMergeViewer.java
index ac5eb93ca..f34368937 100644
--- a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/contentmergeviewer/tree/TreeContentMergeViewer.java
+++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/contentmergeviewer/tree/TreeContentMergeViewer.java
@@ -207,8 +207,7 @@ public class TreeContentMergeViewer extends EMFCompareContentMergeViewer {
public Object[] getChildren(Object object) {
if (object instanceof IMergeViewerItem.Container) {
IMergeViewerItem[] children = ((IMergeViewerItem.Container)object).getChildren(
- getCompareConfiguration().getSelectedDifferenceGroupProvider(),
- getCompareConfiguration().getAggregatedViewerPredicate());
+ getDifferenceGroupProvider(), getDifferenceFilterPredicate());
return children;
}
@@ -223,9 +222,8 @@ public class TreeContentMergeViewer extends EMFCompareContentMergeViewer {
@Override
public boolean hasChildren(Object object) {
if (object instanceof IMergeViewerItem.Container) {
- return ((IMergeViewerItem.Container)object).hasChildren(getCompareConfiguration()
- .getSelectedDifferenceGroupProvider(), getCompareConfiguration()
- .getAggregatedViewerPredicate());
+ return ((IMergeViewerItem.Container)object).hasChildren(getDifferenceGroupProvider(),
+ getDifferenceFilterPredicate());
}
return super.hasChildren(object);
}
@@ -353,9 +351,8 @@ public class TreeContentMergeViewer extends EMFCompareContentMergeViewer {
IMergeViewerItem leftData = (IMergeViewerItem)leftItem.getData();
final Diff leftDiff = leftData.getDiff();
if (leftDiff != null) {
- if (MergeViewerUtil.isVisibleInMergeViewer(leftDiff, getCompareConfiguration()
- .getSelectedDifferenceGroupProvider(), getCompareConfiguration()
- .getAggregatedViewerPredicate())) {
+ if (MergeViewerUtil.isVisibleInMergeViewer(leftDiff, getDifferenceGroupProvider(),
+ getDifferenceFilterPredicate())) {
TreeItem rightItem = findRightTreeItemFromLeftDiff(rightItems, leftDiff, leftData);
if (rightItem != null) {
diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/editor/ComparisonScopeEditorInput.java b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/editor/ComparisonScopeEditorInput.java
index 282f51632..87e20457d 100644
--- a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/editor/ComparisonScopeEditorInput.java
+++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/editor/ComparisonScopeEditorInput.java
@@ -50,7 +50,7 @@ public class ComparisonScopeEditorInput extends AbstractEMFCompareEditorInput {
@Override
protected Object doPrepareInput(IProgressMonitor monitor) throws InvocationTargetException,
InterruptedException {
- getCompareConfiguration().setComparator(comparator);
+ getCompareConfiguration().setEMFComparator(comparator);
return new ComparisonScopeInput(scope, getAdapterFactory());
}
diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/CompareToolBar.java b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/CompareToolBar.java
index 025f8bf25..9501178ae 100644
--- a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/CompareToolBar.java
+++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/CompareToolBar.java
@@ -14,12 +14,11 @@ import static com.google.common.base.Predicates.instanceOf;
import static com.google.common.collect.Iterables.any;
import static com.google.common.collect.Lists.newArrayListWithCapacity;
+import com.google.common.eventbus.Subscribe;
+
import java.util.EnumSet;
import java.util.List;
-import java.util.Set;
-import org.eclipse.emf.compare.Comparison;
-import org.eclipse.emf.compare.domain.ICompareEditingDomain;
import org.eclipse.emf.compare.ide.ui.internal.configuration.EMFCompareConfiguration;
import org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.actions.CollapseAllModelAction;
import org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.actions.DropDownMergeMenuAction;
@@ -29,22 +28,24 @@ import org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.actions.Merg
import org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.actions.SaveComparisonModelAction;
import org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.actions.SelectNextDiffAction;
import org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.actions.SelectPreviousDiffAction;
-import org.eclipse.emf.compare.ide.ui.internal.util.SWTUtil;
import org.eclipse.emf.compare.internal.merge.MergeMode;
import org.eclipse.emf.compare.merge.IMerger;
import org.eclipse.emf.compare.rcp.EMFCompareRCPPlugin;
-import org.eclipse.emf.compare.rcp.ui.internal.configuration.EMFCompareConfigurationChangeListener;
+import org.eclipse.emf.compare.rcp.ui.EMFCompareRCPUIPlugin;
+import org.eclipse.emf.compare.rcp.ui.internal.configuration.ICompareEditingDomainChange;
+import org.eclipse.emf.compare.rcp.ui.internal.configuration.IComparisonAndScopeChange;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.actions.FilterActionMenu;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.actions.GroupActionMenu;
-import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.IDifferenceFilter;
+import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.IDifferenceFilterChange;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.StructureMergeViewerFilter;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.impl.CascadingDifferencesFilter;
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.scope.IComparisonScope;
+import org.eclipse.emf.compare.rcp.ui.internal.util.SWTUtil;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.viewers.AbstractTreeViewer;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.menus.IMenuService;
import org.eclipse.ui.services.IServiceLocator;
@@ -52,44 +53,46 @@ import org.eclipse.ui.services.IServiceLocator;
/**
* @author <a href="mailto:mikael.barbero@obeo.fr">Mikael Barbero</a>
*/
-public class CompareToolBar {
+public class CompareToolBar implements ISelectionChangedListener {
private final GroupActionMenu groupActionMenu;
private final FilterActionMenu filterActionMenu;
- private final List<MergeAction> mergeActions = newArrayListWithCapacity(2);
-
- private final List<MergeAllNonConflictingAction> mergeAllNonConflictingActions = newArrayListWithCapacity(2);
+ private final List<MergeAction> mergeActions;
- private final CompareConfigurationListener configurationChangeListener;
+ private final List<MergeAllNonConflictingAction> mergeAllNonConflictingActions;
private final EMFCompareConfiguration compareConfiguration;
- private final AbstractTreeViewer viewer;
-
/**
*
*/
- public CompareToolBar(AbstractTreeViewer viewer, ToolBarManager toolbarManager,
- StructureMergeViewerGrouper viewerGrouper, StructureMergeViewerFilter viewerFilter,
+ public CompareToolBar(StructureMergeViewerGrouper viewerGrouper, StructureMergeViewerFilter viewerFilter,
EMFCompareConfiguration compareConfiguration) {
- this.viewer = viewer;
this.compareConfiguration = compareConfiguration;
+ mergeActions = newArrayListWithCapacity(2);
+ mergeAllNonConflictingActions = newArrayListWithCapacity(2);
+
+ groupActionMenu = new GroupActionMenu(viewerGrouper, EMFCompareRCPUIPlugin.getDefault()
+ .getDifferenceGroupProviderRegistry());
+
+ filterActionMenu = new FilterActionMenu(viewerFilter, EMFCompareRCPUIPlugin.getDefault()
+ .getDifferenceFilterRegistry());
+ }
+
+ public final void initToolbar(ToolBarManager toolbarManager, AbstractTreeViewer viewer) {
+ compareConfiguration.getEventBus().register(this);
+
// Add extension point contributions to the structure merge viewer toolbar
IServiceLocator workbench = PlatformUI.getWorkbench();
+
IMenuService menuService = (IMenuService)workbench.getService(IMenuService.class);
if (menuService != null) {
menuService.populateContributionManager(toolbarManager,
"toolbar:org.eclipse.emf.compare.structuremergeviewer.toolbar");
}
- configurationChangeListener = new CompareConfigurationListener();
- compareConfiguration.addChangeListener(configurationChangeListener);
-
- groupActionMenu = new GroupActionMenu(viewerGrouper, new DefaultGroupProvider());
- filterActionMenu = new FilterActionMenu(viewerFilter);
-
boolean leftEditable = compareConfiguration.isLeftEditable();
boolean rightEditable = compareConfiguration.isRightEditable();
@@ -102,10 +105,10 @@ public class CompareToolBar {
toolbarManager.add(new DropDownMergeMenuAction(compareConfiguration, modes));
for (MergeMode mode : modes) {
- toolbarManager.add(createMergeAction(mode));
+ toolbarManager.add(createMergeAction(mode, compareConfiguration));
}
for (MergeMode mode : modes) {
- toolbarManager.add(createMergeAllNonConflictingAction(mode));
+ toolbarManager.add(createMergeAllNonConflictingAction(mode, compareConfiguration));
}
toolbarManager.add(new Separator());
@@ -116,105 +119,80 @@ public class CompareToolBar {
toolbarManager.add(new CollapseAllModelAction(viewer));
toolbarManager.add(new Separator());
toolbarManager.add(groupActionMenu);
+ groupActionMenu.updateMenu(compareConfiguration.getComparisonScope(), compareConfiguration
+ .getComparison());
toolbarManager.add(filterActionMenu);
+ filterActionMenu.updateMenu(compareConfiguration.getComparisonScope(), compareConfiguration
+ .getComparison());
toolbarManager.add(new Separator());
toolbarManager.add(new SaveComparisonModelAction(compareConfiguration));
toolbarManager.update(true);
}
- private MergeAction createMergeAction(MergeMode mergeMode) {
- EMFCompareConfiguration cc = compareConfiguration;
+ private MergeAction createMergeAction(MergeMode mergeMode, EMFCompareConfiguration cc) {
IMerger.Registry mergerRegistry = EMFCompareRCPPlugin.getDefault().getMergerRegistry();
MergeAction mergeAction = new MergeAction(cc.getEditingDomain(), mergerRegistry, mergeMode, cc
.isLeftEditable(), cc.isRightEditable());
- viewer.addSelectionChangedListener(mergeAction);
mergeActions.add(mergeAction);
return mergeAction;
}
- private MergeAction createMergeAllNonConflictingAction(MergeMode mergeMode) {
- EMFCompareConfiguration cc = compareConfiguration;
+ private MergeAction createMergeAllNonConflictingAction(MergeMode mergeMode, EMFCompareConfiguration cc) {
IMerger.Registry mergerRegistry = EMFCompareRCPPlugin.getDefault().getMergerRegistry();
MergeAllNonConflictingAction mergeAction = new MergeAllNonConflictingAction(cc.getEditingDomain(), cc
.getComparison(), mergerRegistry, mergeMode, cc.isLeftEditable(), cc.isRightEditable());
- viewer.addSelectionChangedListener(mergeAction);
mergeAllNonConflictingActions.add(mergeAction);
return mergeAction;
}
public void dispose() {
- compareConfiguration.addChangeListener(configurationChangeListener);
+ compareConfiguration.getEventBus().unregister(this);
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+ */
+ public void selectionChanged(SelectionChangedEvent event) {
+ // forward event to merge actions
+
for (MergeAction mergeAction : mergeActions) {
- viewer.removeSelectionChangedListener(mergeAction);
+ mergeAction.selectionChanged(event);
}
for (MergeAllNonConflictingAction mergeAllNonConflictingAction : mergeAllNonConflictingActions) {
- viewer.removeSelectionChangedListener(mergeAllNonConflictingAction);
+ mergeAllNonConflictingAction.selectionChanged(event);
}
}
- private class CompareConfigurationListener extends EMFCompareConfigurationChangeListener {
- /**
- * {@inheritDoc}
- *
- * @see org.eclipse.emf.compare.rcp.ui.internal.configuration.EMFCompareConfigurationChangeListener#editingDomainChange(org.eclipse.emf.compare.domain.ICompareEditingDomain,
- * org.eclipse.emf.compare.domain.ICompareEditingDomain)
- */
- @Override
- public void editingDomainChange(ICompareEditingDomain oldValue, ICompareEditingDomain newValue) {
- for (MergeAction mergeAction : mergeActions) {
- mergeAction.setEditingDomain(newValue);
- }
+ @Subscribe
+ public void editingDomainChange(ICompareEditingDomainChange event) {
+ for (MergeAction mergeAction : mergeActions) {
+ mergeAction.setEditingDomain(event.getNewValue());
}
+ }
- /**
- * {@inheritDoc}
- *
- * @see org.eclipse.emf.compare.rcp.ui.internal.configuration.EMFCompareConfigurationChangeListener#selectedDifferenceFiltersChange(java.util.Set,
- * java.util.Set)
- */
- @Override
- public void selectedDifferenceFiltersChange(Set<IDifferenceFilter> oldValue,
- Set<IDifferenceFilter> newValue) {
- final boolean enabled = any(newValue, instanceOf(CascadingDifferencesFilter.class));
- for (MergeAction mergeAction : mergeActions) {
- mergeAction.setCascadingDifferencesFilterEnabled(enabled);
- }
+ @Subscribe
+ public void selectedDifferenceFiltersChange(IDifferenceFilterChange event) {
+ final boolean enabled = any(event.getSelectedDifferenceFilters(),
+ instanceOf(CascadingDifferencesFilter.class));
+ for (MergeAction mergeAction : mergeActions) {
+ mergeAction.setCascadingDifferencesFilterEnabled(enabled);
}
+ }
- /**
- * {@inheritDoc}
- *
- * @see org.eclipse.emf.compare.rcp.ui.internal.configuration.EMFCompareConfigurationChangeListener#comparisonChange(org.eclipse.emf.compare.Comparison,
- * org.eclipse.emf.compare.Comparison)
- */
- @Override
- public void comparisonChange(Comparison oldValue, final Comparison newValue) {
- SWTUtil.safeSyncExec(new Runnable() {
- public void run() {
- groupActionMenu.createActions(compareConfiguration.getComparisonScope(), newValue);
- filterActionMenu.createActions(compareConfiguration.getComparisonScope(), newValue);
- }
- });
- for (MergeAllNonConflictingAction mergeAction : mergeAllNonConflictingActions) {
- mergeAction.setComparison(newValue);
+ @Subscribe
+ public void comparisonAndScopeChange(final IComparisonAndScopeChange event) {
+ SWTUtil.safeAsyncExec(new Runnable() {
+ public void run() {
+ filterActionMenu.updateMenu(event.getNewScope(), event.getNewComparison());
+ groupActionMenu.updateMenu(event.getNewScope(), event.getNewComparison());
}
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.eclipse.emf.compare.rcp.ui.internal.configuration.EMFCompareConfigurationChangeListener#comparisonScopeChange(org.eclipse.emf.compare.scope.IComparisonScope,
- * org.eclipse.emf.compare.scope.IComparisonScope)
- */
- @Override
- public void comparisonScopeChange(IComparisonScope oldValue, final IComparisonScope newValue) {
- SWTUtil.safeSyncExec(new Runnable() {
- public void run() {
- groupActionMenu.createActions(newValue, compareConfiguration.getComparison());
- filterActionMenu.createActions(newValue, compareConfiguration.getComparison());
- }
- });
+ });
+ for (MergeAllNonConflictingAction mergeAction : mergeAllNonConflictingActions) {
+ mergeAction.setComparison(event.getNewComparison());
}
}
+
}
diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/EMFCompareDiffTreeRuler.java b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/EMFCompareDiffTreeRuler.java
index daf15d86e..5fc300171 100644
--- a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/EMFCompareDiffTreeRuler.java
+++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/EMFCompareDiffTreeRuler.java
@@ -20,6 +20,7 @@ import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Multimap;
import com.google.common.collect.Sets;
+import com.google.common.eventbus.Subscribe;
import java.util.Collection;
import java.util.LinkedList;
@@ -34,7 +35,10 @@ import org.eclipse.emf.compare.Diff;
import org.eclipse.emf.compare.ide.ui.internal.configuration.EMFCompareConfiguration;
import org.eclipse.emf.compare.internal.merge.MergeMode;
import org.eclipse.emf.compare.internal.utils.DiffUtil;
+import org.eclipse.emf.compare.rcp.ui.internal.configuration.IMergePreviewModeChange;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.IDifferenceFilter;
+import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.IDifferenceFilterChange;
+import org.eclipse.emf.compare.rcp.ui.internal.util.SWTUtil;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.edit.tree.TreeNode;
import org.eclipse.jface.resource.JFaceResources;
@@ -120,12 +124,15 @@ public class EMFCompareDiffTreeRuler extends Canvas {
/** The last cursor used. */
private Cursor lastCursor;
- /** The configuration for this control. */
- private EMFCompareConfiguration fConfiguration;
-
/** The selected diff in the Treeviewer associated with this Treeruler. */
private Diff selectedDiff;
+ private Predicate<? super EObject> differencePredicate;
+
+ private MergeMode mergePreviewMode;
+
+ private final EMFCompareConfiguration compareConfiguration;
+
/**
* Constructor.
*
@@ -145,7 +152,8 @@ public class EMFCompareDiffTreeRuler extends Canvas {
super(parent, style);
fWidth = width;
fTreeViewer = treeViewer;
- fConfiguration = config;
+ this.compareConfiguration = config;
+ compareConfiguration.getEventBus().register(this);
requiredDiffFillColor = JFaceResources.getColorRegistry().get(
EMFCompareDiffTreeViewer.REQUIRED_DIFF_COLOR);
@@ -239,15 +247,54 @@ public class EMFCompareDiffTreeRuler extends Canvas {
public void computeConsequences() {
clearAllData();
if (selectedDiff != null) {
- MergeMode mergePreviewMode = fConfiguration.getMergePreviewMode();
- boolean leftToRigh = mergePreviewMode.isLeftToRight(fConfiguration.isLeftEditable(),
- fConfiguration.isRightEditable());
+ boolean leftToRigh = getMergePreviewMode().isLeftToRight(compareConfiguration.isLeftEditable(),
+ compareConfiguration.isRightEditable());
requires = DiffUtil.getRequires(selectedDiff, leftToRigh);
unmergeables = DiffUtil.getUnmergeables(selectedDiff, leftToRigh);
associateTreeItems(Lists.newLinkedList(Iterables.concat(requires, unmergeables)));
}
}
+ @Subscribe
+ public void handleDifferenceFilterChange(IDifferenceFilterChange event) {
+ differencePredicate = event.getPredicate();
+ SWTUtil.safeAsyncExec(new Runnable() {
+ public void run() {
+ ((EMFCompareDiffTreeViewer)fTreeViewer).createChildrenSilently(fTreeViewer.getTree());
+ computeConsequences();
+ redraw();
+ }
+ });
+ }
+
+ /**
+ * @return the differencePredicate
+ */
+ public Predicate<? super EObject> getDifferencePredicate() {
+ if (differencePredicate == null) {
+ differencePredicate = compareConfiguration.getStructureMergeViewerFilter()
+ .getAggregatedPredicate();
+ }
+ return differencePredicate;
+ }
+
+ @Subscribe
+ public void handleMergePreviewModeChange(IMergePreviewModeChange event) {
+ mergePreviewMode = event.getNewValue();
+ computeConsequences();
+ redraw();
+ }
+
+ /**
+ * @return the mergePreviewMode
+ */
+ public MergeMode getMergePreviewMode() {
+ if (mergePreviewMode == null) {
+ mergePreviewMode = compareConfiguration.getMergePreviewMode();
+ }
+ return mergePreviewMode;
+ }
+
/**
* Maps tree items with the given list of diffs.
*
@@ -257,7 +304,7 @@ public class EMFCompareDiffTreeRuler extends Canvas {
private void associateTreeItems(List<Diff> diffs) {
Tree tree = fTreeViewer.getTree();
if (fTreeViewer instanceof EMFCompareDiffTreeViewer) {
- ((EMFCompareDiffTreeViewer)fTreeViewer).createChildrenSilently(tree);
+ // ((EMFCompareDiffTreeViewer)fTreeViewer).createChildrenSilently(tree);
}
for (TreeItem item : tree.getItems()) {
associateTreeItem(item, diffs);
@@ -302,6 +349,7 @@ public class EMFCompareDiffTreeRuler extends Canvas {
* Handles the dispose event on this control.
*/
public void handleDispose() {
+ compareConfiguration.getEventBus().unregister(this);
removeMouseTrackListener(mouseTrackListener);
removeMouseMoveListener(mouseMoveListener);
removeMouseListener(mouseClickListener);
@@ -316,7 +364,7 @@ public class EMFCompareDiffTreeRuler extends Canvas {
*/
private void handlePaintEvent(PaintEvent e) {
annotationsData.clear();
- Predicate<? super EObject> predicate = fConfiguration.getAggregatedViewerPredicate();
+ Predicate<? super EObject> predicate = differencePredicate;
Collection<? extends Diff> filteredRequires = filteredDiffs(requires, predicate);
Collection<? extends Diff> filteredUnmergeables = filteredDiffs(unmergeables, predicate);
for (Diff diff : filteredRequires) {
diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/EMFCompareDiffTreeViewer.java b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/EMFCompareDiffTreeViewer.java
index 368bd1fbc..553d226d1 100644
--- a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/EMFCompareDiffTreeViewer.java
+++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/EMFCompareDiffTreeViewer.java
@@ -13,6 +13,7 @@ package org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer;
import static com.google.common.collect.Sets.newHashSet;
import com.google.common.base.Predicate;
+import com.google.common.eventbus.Subscribe;
import java.util.Arrays;
import java.util.Collections;
@@ -32,16 +33,20 @@ import org.eclipse.emf.compare.ide.ui.internal.configuration.EMFCompareConfigura
import org.eclipse.emf.compare.ide.ui.internal.util.JFaceUtil;
import org.eclipse.emf.compare.internal.merge.MergeMode;
import org.eclipse.emf.compare.internal.utils.DiffUtil;
-import org.eclipse.emf.compare.rcp.ui.internal.configuration.EMFCompareConfigurationChangeListener;
-import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.IDifferenceFilter;
-import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.IDifferenceGroupProvider;
+import org.eclipse.emf.compare.rcp.ui.internal.configuration.IComparisonAndScopeChange;
+import org.eclipse.emf.compare.rcp.ui.internal.configuration.IMergePreviewModeChange;
+import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.IDifferenceFilterChange;
+import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.IDifferenceGroupProviderChange;
+import org.eclipse.emf.compare.rcp.ui.internal.util.SWTUtil;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.edit.tree.TreeNode;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider;
import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
@@ -81,6 +86,8 @@ public class EMFCompareDiffTreeViewer extends DiffTreeViewer {
private AdapterFactory adapterFactory;
+ private ISelectionChangedListener selectionChangeListener;
+
/**
* @param parent
* @param adapterFactory
@@ -91,6 +98,8 @@ public class EMFCompareDiffTreeViewer extends DiffTreeViewer {
super(parent, configuration);
this.adapterFactory = adapterFactory;
+ getCompareConfiguration().getEventBus().register(this);
+
setLabelProvider(new DelegatingStyledCellLabelProvider(
new EMFCompareStructureMergeViewerLabelProvider(adapterFactory, this)));
setContentProvider(new EMFCompareStructureMergeViewerContentProvider(adapterFactory));
@@ -103,11 +112,18 @@ public class EMFCompareDiffTreeViewer extends DiffTreeViewer {
fEraseItemListener = new Listener() {
public void handleEvent(Event event) {
- EMFCompareDiffTreeViewer.this.handleEraseItemEvent(event);
+ handleEraseItemEvent(event);
}
};
getControl().addListener(SWT.EraseItem, fEraseItemListener);
+ selectionChangeListener = new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ getControl().redraw();
+ }
+ };
+ addSelectionChangedListener(selectionChangeListener);
+
JFaceResources.getColorRegistry().put(REQUIRED_DIFF_COLOR, new RGB(215, 255, 200));
JFaceResources.getColorRegistry().put(REQUIRED_DIFF_BORDER_COLOR, new RGB(195, 235, 180));
JFaceResources.getColorRegistry().put(UNMERGEABLE_DIFF_COLOR, new RGB(255, 205, 180));
@@ -116,46 +132,6 @@ public class EMFCompareDiffTreeViewer extends DiffTreeViewer {
requiredDiffColor = JFaceResources.getColorRegistry().get(REQUIRED_DIFF_COLOR);
unmergeableDiffColor = JFaceResources.getColorRegistry().get(UNMERGEABLE_DIFF_COLOR);
- configurationChangeListener = new EMFCompareConfigurationChangeListener() {
-
- /**
- * {@inheritDoc}
- *
- * @see org.eclipse.emf.compare.rcp.ui.internal.configuration.EMFCompareConfigurationChangeListener#selectedDifferenceFiltersChange(java.util.Set,
- * java.util.Set)
- */
- @Override
- public void selectedDifferenceFiltersChange(Set<IDifferenceFilter> oldValue,
- Set<IDifferenceFilter> newValue) {
- getTree().redraw();
- refreshTitle();
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.eclipse.emf.compare.rcp.ui.internal.configuration.EMFCompareConfigurationChangeListener#selectedDifferenceGroupProviderChange(org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.IDifferenceGroupProvider,
- * org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.IDifferenceGroupProvider)
- */
- @Override
- public void selectedDifferenceGroupProviderChange(IDifferenceGroupProvider oldValue,
- IDifferenceGroupProvider newValue) {
- refreshTitle();
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.eclipse.emf.compare.rcp.ui.internal.configuration.EMFCompareConfigurationChangeListener#mergePreviewModeChange(org.eclipse.emf.compare.internal.merge.MergeMode,
- * org.eclipse.emf.compare.internal.merge.MergeMode)
- */
- @Override
- public void mergePreviewModeChange(MergeMode oldValue, MergeMode newValue) {
- getTree().redraw();
- }
-
- };
- configuration.addChangeListener(configurationChangeListener);
setUseHashlookup(true);
}
@@ -170,7 +146,34 @@ public class EMFCompareDiffTreeViewer extends DiffTreeViewer {
}
};
- private final EMFCompareConfigurationChangeListener configurationChangeListener;
+ @Subscribe
+ public void selectedDifferenceFiltersChange(IDifferenceFilterChange event) {
+ SWTUtil.safeAsyncExec(new Runnable() {
+ public void run() {
+ getTree().redraw();
+ refreshTitle();
+ }
+ });
+ }
+
+ @Subscribe
+ public void handleDifferenceGroupProviderChange(IDifferenceGroupProviderChange event) {
+ SWTUtil.safeAsyncExec(new Runnable() {
+ public void run() {
+ refreshTitle();
+ }
+ });
+ }
+
+ @Subscribe
+ public void mergePreviewModeChange(IMergePreviewModeChange event) {
+ SWTUtil.safeRedraw(getTree(), true);
+ }
+
+ @Subscribe
+ public void comparisonChange(IComparisonAndScopeChange event) {
+ SWTUtil.safeRefresh(this, true);
+ }
/**
* {@inheritDoc}
@@ -233,7 +236,6 @@ public class EMFCompareDiffTreeViewer extends DiffTreeViewer {
return;
}
- refreshTitle();
refresh(root);
}
@@ -287,7 +289,8 @@ public class EMFCompareDiffTreeViewer extends DiffTreeViewer {
@Override
protected void handleDispose(DisposeEvent event) {
getControl().removeListener(SWT.EraseItem, fEraseItemListener);
- getCompareConfiguration().removeChangeListener(configurationChangeListener);
+ removeSelectionChangedListener(selectionChangeListener);
+ getCompareConfiguration().getEventBus().unregister(this);
super.handleDispose(event);
}
diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/EMFCompareStructureMergeViewer.java b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/EMFCompareStructureMergeViewer.java
index 72ff5fe3b..89611fbf9 100644
--- a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/EMFCompareStructureMergeViewer.java
+++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/EMFCompareStructureMergeViewer.java
@@ -11,10 +11,7 @@
package org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer;
import static com.google.common.collect.Iterables.getFirst;
-import static com.google.common.collect.Sets.newLinkedHashSet;
-import com.google.common.base.Predicate;
-import com.google.common.collect.ImmutableSet;
import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
@@ -25,7 +22,6 @@ import java.util.Collection;
import java.util.EventObject;
import java.util.Iterator;
import java.util.List;
-import java.util.Set;
import org.eclipse.compare.CompareConfiguration;
import org.eclipse.compare.CompareUI;
@@ -65,21 +61,16 @@ import org.eclipse.emf.compare.ide.ui.internal.logical.StreamAccessorStorage;
import org.eclipse.emf.compare.ide.ui.internal.logical.SubscriberStorageAccessor;
import org.eclipse.emf.compare.ide.ui.internal.util.ExceptionUtil;
import org.eclipse.emf.compare.ide.ui.internal.util.PlatformElementUtil;
-import org.eclipse.emf.compare.ide.ui.internal.util.SWTUtil;
import org.eclipse.emf.compare.ide.ui.logical.IModelResolver;
import org.eclipse.emf.compare.ide.ui.logical.IStorageProviderAccessor;
-import org.eclipse.emf.compare.internal.merge.MergeMode;
import org.eclipse.emf.compare.internal.utils.ComparisonUtil;
import org.eclipse.emf.compare.rcp.EMFCompareRCPPlugin;
-import org.eclipse.emf.compare.rcp.ui.internal.configuration.EMFCompareConfigurationChangeListener;
-import org.eclipse.emf.compare.rcp.ui.internal.configuration.IEMFCompareConfigurationChangeListener;
-import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.IDifferenceFilter;
-import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.IDifferenceFilterSelectionChangeEvent;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.StructureMergeViewerFilter;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.IDifferenceGroupProvider;
+import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.IDifferenceGroupProviderChange;
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.internal.structuremergeviewer.groups.provider.TreeItemProviderAdapterFactorySpec;
+import org.eclipse.emf.compare.rcp.ui.internal.util.SWTUtil;
import org.eclipse.emf.compare.scope.IComparisonScope;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
@@ -116,31 +107,6 @@ import org.eclipse.ui.actions.ActionFactory;
*/
public class EMFCompareStructureMergeViewer extends AbstractViewerWrapper implements CommandStackListener {
- /**
- * @author <a href="mailto:mikael.barbero@obeo.fr">Mikael Barbero</a>
- */
- private final class EMFCompareStructureMergeViewerConfigurationChangeListener extends EMFCompareConfigurationChangeListener {
- @Override
- public void mergePreviewModeChange(MergeMode oldValue, MergeMode newValue) {
- treeRuler.computeConsequences();
- treeRuler.redraw();
- }
-
- @Override
- public void selectedDifferenceGroupProviderChange(IDifferenceGroupProvider oldValue,
- IDifferenceGroupProvider newValue) {
- treeRuler.computeConsequences();
- treeRuler.redraw();
- }
-
- @Override
- public void aggregatedViewerPredicateChange(Predicate<? super EObject> oldValue,
- Predicate<? super EObject> newValue) {
- treeRuler.computeConsequences();
- treeRuler.redraw();
- }
- }
-
/** The width of the tree ruler. */
private static final int TREE_RULER_WIDTH = 17;
@@ -155,9 +121,6 @@ public class EMFCompareStructureMergeViewer extends AbstractViewerWrapper implem
/** The expand/collapse item listener. */
private ITreeViewerListener fWrappedTreeListener;
- /** The compare configuration property change listener. */
- private IEMFCompareConfigurationChangeListener fCompareConfigurationPropertyChangeListener;
-
/** The tree viewer. */
private EMFCompareDiffTreeViewer diffTreeViewer;
@@ -187,8 +150,7 @@ public class EMFCompareStructureMergeViewer extends AbstractViewerWrapper implem
public EMFCompareStructureMergeViewer(Composite parent, EMFCompareConfiguration config) {
super(parent, config);
- fCompareConfigurationPropertyChangeListener = new EMFCompareStructureMergeViewerConfigurationChangeListener();
- getCompareConfiguration().addChangeListener(fCompareConfigurationPropertyChangeListener);
+ config.getEventBus().register(this);
inputChangedTask.setPriority(Job.LONG);
}
@@ -257,49 +219,61 @@ public class EMFCompareStructureMergeViewer extends AbstractViewerWrapper implem
EventBus eventBus = new EventBus();
eventBus.register(this);
- StructureMergeViewerFilter structureMergeViewerFilter = new StructureMergeViewerFilter(eventBus);
+ StructureMergeViewerFilter structureMergeViewerFilter = getCompareConfiguration()
+ .getStructureMergeViewerFilter();
structureMergeViewerFilter.install(diffTreeViewer);
- StructureMergeViewerGrouper structureMergeViewerGrouper = new StructureMergeViewerGrouper(eventBus);
+ StructureMergeViewerGrouper structureMergeViewerGrouper = getCompareConfiguration()
+ .getStructureMergeViewerGrouper();
structureMergeViewerGrouper.install(diffTreeViewer);
- toolBar = new CompareToolBar(diffTreeViewer, CompareViewerPane.getToolBarManager(parent),
- structureMergeViewerGrouper, structureMergeViewerFilter, getCompareConfiguration());
+ toolBar = new CompareToolBar(structureMergeViewerGrouper, structureMergeViewerFilter,
+ getCompareConfiguration());
+ diffTreeViewer.addSelectionChangedListener(toolBar);
+ toolBar.initToolbar(CompareViewerPane.getToolBarManager(parent), diffTreeViewer);
return control;
}
@Subscribe
- public void recordFilterSelectionChange(IDifferenceFilterSelectionChangeEvent event) {
- final Set<IDifferenceFilter> property = getCompareConfiguration().getSelectedDifferenceFilters();
-
- final Set<IDifferenceFilter> selectedFilters = newLinkedHashSet(property);
- switch (event.getAction()) {
- case SELECTED:
- selectedFilters.add(event.getFilter());
- break;
- case DESELECTED:
- selectedFilters.remove(event.getFilter());
- break;
- default:
- throw new IllegalStateException();
+ public void handleGroupProviderSelectionChange(IDifferenceGroupProviderChange event) {
+ differenceGroupProvider = event.getDifferenceGroupProvider();
+
+ Adapter root = (Adapter)diffTreeViewer.getRoot();
+ if (root != null) {
+ TreeNode target = (TreeNode)root.getTarget();
+ registerDifferenceGroupProvider(target, differenceGroupProvider);
}
- getCompareConfiguration().setSelectedDifferenceFilters(ImmutableSet.copyOf(selectedFilters));
- getCompareConfiguration().setAggregatedViewerPredicate(event.getAggregatedPredicate());
+ SWTUtil.safeAsyncExec(new Runnable() {
+ public void run() {
+ ((EMFCompareDiffTreeViewer)diffTreeViewer).createChildrenSilently(diffTreeViewer.getTree());
+ treeRuler.computeConsequences();
+ treeRuler.redraw();
+ }
+ });
}
- @Subscribe
- public void recordGroupProviderSelectionChange(IDifferenceGroupProvider differenceGroupProvider) {
- List<Adapter> eAdapters = ((Adapter)diffTreeViewer.getRoot()).getTarget().eAdapters();
+ /**
+ * @return the differenceGroupProvider
+ */
+ public IDifferenceGroupProvider getSelectedDifferenceGroupProvider() {
+ if (differenceGroupProvider == null) {
+ differenceGroupProvider = getCompareConfiguration().getStructureMergeViewerGrouper()
+ .getProvider();
+ }
+ return differenceGroupProvider;
+ }
+
+ protected void registerDifferenceGroupProvider(TreeNode treeNode,
+ IDifferenceGroupProvider differenceGroupProvider) {
+ List<Adapter> eAdapters = treeNode.eAdapters();
IDifferenceGroupProvider oldDifferenceGroupProvider = (IDifferenceGroupProvider)EcoreUtil.getAdapter(
eAdapters, IDifferenceGroupProvider.class);
if (oldDifferenceGroupProvider != null) {
eAdapters.remove(oldDifferenceGroupProvider);
}
eAdapters.add(differenceGroupProvider);
-
- getCompareConfiguration().setSelectedDifferenceGroupProvider(differenceGroupProvider);
}
/**
@@ -326,8 +300,8 @@ public class EMFCompareStructureMergeViewer extends AbstractViewerWrapper implem
old.removeCompareInputChangeListener(fCompareInputChangeListener);
}
if (input instanceof ICompareInput) {
- getViewer().setInput(input); // set input of EMFCompareDiffTreeViewer (useful for next/previous
- // diff buttons)
+ // getViewer().setInput(input); // set input of EMFCompareDiffTreeViewer (useful for next/previous
+ // diff buttons)
ICompareInput ci = (ICompareInput)input;
ci.addCompareInputChangeListener(fCompareInputChangeListener);
@@ -349,13 +323,14 @@ public class EMFCompareStructureMergeViewer extends AbstractViewerWrapper implem
if (fHandlerService != null) {
fHandlerService.dispose();
}
- getCompareConfiguration().removeChangeListener(fCompareConfigurationPropertyChangeListener);
+ getCompareConfiguration().getEventBus().unregister(this);
diffTreeViewer.removeTreeListener(fWrappedTreeListener);
Object input = getInput();
if (input instanceof ICompareInput) {
ICompareInput ci = (ICompareInput)input;
ci.removeCompareInputChangeListener(fCompareInputChangeListener);
}
+ diffTreeViewer.removeSelectionChangedListener(toolBar);
compareInputChanged((ICompareInput)null);
treeRuler.handleDispose();
fAdapterFactory.dispose();
@@ -383,6 +358,7 @@ public class EMFCompareStructureMergeViewer extends AbstractViewerWrapper implem
SWTUtil.safeAsyncExec(new Runnable() {
public void run() {
treeRuler.computeConsequences();
+ diffTreeViewer.createChildrenSilently(diffTreeViewer.getTree());
treeRuler.redraw();
}
});
@@ -391,8 +367,7 @@ public class EMFCompareStructureMergeViewer extends AbstractViewerWrapper implem
// org.eclipse.compare.CompareEditorInput#getElement(ISelection))
Object first = getFirst(affectedObjects, null);
if (first instanceof EObject) {
- IDifferenceGroupProvider groupProvider = getCompareConfiguration()
- .getSelectedDifferenceGroupProvider();
+ IDifferenceGroupProvider groupProvider = getSelectedDifferenceGroupProvider();
Iterable<TreeNode> treeNodes = groupProvider.getTreeNodes((EObject)first);
TreeNode treeNode = getFirst(treeNodes, null);
if (treeNode != null) {
@@ -424,6 +399,8 @@ public class EMFCompareStructureMergeViewer extends AbstractViewerWrapper implem
private CompareToolBar toolBar;
+ private IDifferenceGroupProvider differenceGroupProvider;
+
/**
* Triggered by fCompareInputChangeListener and {@link #inputChanged(Object, Object)}.
*/
@@ -450,7 +427,7 @@ public class EMFCompareStructureMergeViewer extends AbstractViewerWrapper implem
ICompareEditingDomain editingDomain = getCompareConfiguration().getEditingDomain();
editingDomain.getCommandStack().addCommandStackListener(this);
- EMFCompare comparator = getCompareConfiguration().getComparator();
+ EMFCompare comparator = getCompareConfiguration().getEMFComparator();
IComparisonScope comparisonScope = input.getComparisonScope();
Comparison comparison = comparator.compare(comparisonScope, BasicMonitor.toMonitor(monitor));
@@ -462,24 +439,18 @@ public class EMFCompareStructureMergeViewer extends AbstractViewerWrapper implem
void compareInputChanged(final IComparisonScope scope, final Comparison comparison) {
if (!getControl().isDisposed()) { // guard against disposal
- IDifferenceGroupProvider selectedGroup = getCompareConfiguration()
- .getSelectedDifferenceGroupProvider();
final TreeNode treeNode = TreeFactory.eINSTANCE.createTreeNode();
treeNode.setData(comparison);
- if (selectedGroup == IDifferenceGroupProvider.EMPTY) {
- selectedGroup = new DefaultGroupProvider();
- }
- treeNode.eAdapters().add(selectedGroup);
+ getCompareConfiguration().setComparisonAndScope(comparison, scope);
+ registerDifferenceGroupProvider(treeNode, getSelectedDifferenceGroupProvider());
diffTreeViewer.setRoot(fAdapterFactory.adapt(treeNode, ICompareInput.class));
- getCompareConfiguration().setComparison(comparison);
- getCompareConfiguration().setComparisonScope(scope);
SWTUtil.safeAsyncExec(new Runnable() {
public void run() {
// Mandatory for the EMFCompareDiffTreeRuler, all TreeItems must have been created
- diffTreeViewer.createChildrenSilently(diffTreeViewer.getTree());
diffTreeViewer.refreshAfterDiff(diffTreeViewer.getRoot());
+ diffTreeViewer.createChildrenSilently(diffTreeViewer.getTree());
diffTreeViewer.initialSelection();
}
});
@@ -500,7 +471,6 @@ public class EMFCompareStructureMergeViewer extends AbstractViewerWrapper implem
});
}
});
-
}
}
diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/actions/DropDownMergeMenuAction.java b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/actions/DropDownMergeMenuAction.java
index 45e3268ff..e36a927a9 100644
--- a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/actions/DropDownMergeMenuAction.java
+++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/actions/DropDownMergeMenuAction.java
@@ -12,6 +12,8 @@ package org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.actions;
import static com.google.common.collect.Lists.newArrayList;
+import com.google.common.eventbus.Subscribe;
+
import java.util.EnumSet;
import java.util.List;
@@ -19,7 +21,7 @@ import org.eclipse.emf.compare.ide.ui.internal.EMFCompareIDEUIMessages;
import org.eclipse.emf.compare.ide.ui.internal.EMFCompareIDEUIPlugin;
import org.eclipse.emf.compare.ide.ui.internal.configuration.EMFCompareConfiguration;
import org.eclipse.emf.compare.internal.merge.MergeMode;
-import org.eclipse.emf.compare.rcp.ui.internal.configuration.EMFCompareConfigurationChangeListener;
+import org.eclipse.emf.compare.rcp.ui.internal.configuration.IMergePreviewModeChange;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IAction;
@@ -45,8 +47,6 @@ public class DropDownMergeMenuAction extends Action implements IMenuCreator {
/** The accept menu item. */
private final List<Action> actions;
- private final EMFCompareConfigurationChangeListener changeListener;
-
/**
* Constructor.
*
@@ -57,20 +57,18 @@ public class DropDownMergeMenuAction extends Action implements IMenuCreator {
this.configuration = configuration;
actions = newArrayList();
- changeListener = new EMFCompareConfigurationChangeListener() {
- @Override
- public void mergePreviewModeChange(MergeMode oldValue, MergeMode newValue) {
- updateMenu(newValue);
- }
- };
- configuration.addChangeListener(changeListener);
-
for (MergeMode mergePreviewMode : previewModes) {
actions.add(new DropDownAction(configuration, mergePreviewMode));
}
- updateMenu(configuration.getMergePreviewMode());
+ setToolTipTextAndImage(this, configuration.getMergePreviewMode());
setMenuCreator(this);
+ configuration.getEventBus().register(this);
+ }
+
+ @Subscribe
+ public void mergePreviewModeChange(IMergePreviewModeChange event) {
+ setToolTipTextAndImage(this, event.getNewValue());
}
/**
@@ -94,7 +92,7 @@ public class DropDownMergeMenuAction extends Action implements IMenuCreator {
fMenu.dispose();
fMenu = null;
}
- configuration.removeChangeListener(changeListener);
+ configuration.getEventBus().unregister(this);
}
/**
@@ -136,13 +134,6 @@ public class DropDownMergeMenuAction extends Action implements IMenuCreator {
item.fill(parent, -1);
}
- /**
- * Update the icon and tooltip of the dropdown menu.
- */
- protected void updateMenu(MergeMode mergeWay) {
- setToolTipTextAndImage(this, mergeWay);
- }
-
static void setToolTipTextAndImage(IAction action, MergeMode mergeMode) {
switch (mergeMode) {
case LEFT_TO_RIGHT:
diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/actions/ExpandAllModelAction.java b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/actions/ExpandAllModelAction.java
index 309cfc7fa..dd5dc8216 100644
--- a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/actions/ExpandAllModelAction.java
+++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/actions/ExpandAllModelAction.java
@@ -37,7 +37,5 @@ public class ExpandAllModelAction extends Action {
@Override
public void run() {
treeViewer.expandToLevel(256);
- // Workaround to force the redraw of the EMFCompareDiffTreeruler
- treeViewer.setSelection(treeViewer.getSelection());
}
}
diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/util/ExceptionUtil.java b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/util/ExceptionUtil.java
index be034400f..1ab1b6077 100644
--- a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/util/ExceptionUtil.java
+++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/util/ExceptionUtil.java
@@ -14,6 +14,7 @@ import com.google.common.base.Throwables;
import org.eclipse.compare.CompareConfiguration;
import org.eclipse.emf.compare.ide.ui.internal.EMFCompareIDEUIPlugin;
+import org.eclipse.emf.compare.rcp.ui.internal.util.SWTUtil;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPart;
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.compare.rcp.ui/META-INF/MANIFEST.MF
index 55c34bfc8..87f565ed5 100644
--- a/plugins/org.eclipse.emf.compare.rcp.ui/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/META-INF/MANIFEST.MF
@@ -17,6 +17,7 @@ Require-Bundle: org.eclipse.core.runtime;bundle-version="3.5.0",
Export-Package: org.eclipse.emf.compare.rcp.ui,
org.eclipse.emf.compare.rcp.ui.internal;x-friends:="org.eclipse.emf.compare.diagram.ide.ui,org.eclipse.emf.compare.ide.ui",
org.eclipse.emf.compare.rcp.ui.internal.configuration;x-internal:=true,
+ org.eclipse.emf.compare.rcp.ui.internal.configuration.impl;x-internal:=true,
org.eclipse.emf.compare.rcp.ui.internal.contentmergeviewer.accessor;x-friends:="org.eclipse.emf.compare.ide.ui",
org.eclipse.emf.compare.rcp.ui.internal.contentmergeviewer.accessor.factory;x-friends:="org.eclipse.emf.compare.ide.ui",
org.eclipse.emf.compare.rcp.ui.internal.contentmergeviewer.accessor.factory.impl;x-internal:=true,
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/plugin.xml b/plugins/org.eclipse.emf.compare.rcp.ui/plugin.xml
index 2778132e2..21f535b42 100644
--- a/plugins/org.eclipse.emf.compare.rcp.ui/plugin.xml
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/plugin.xml
@@ -20,6 +20,11 @@
<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="No Group">
+ </group>
+ <group
activeByDefault="false"
class="org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.impl.KindGroupProvider"
label="By Kind">
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 1ff11ec0f..92a9ef1bf 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
@@ -194,7 +194,7 @@ public class EMFCompareRCPUIPlugin extends AbstractUIPlugin {
return groupProviderRegistry;
}
- public IDifferenceFilter.Registry getFilterActionRegistry() {
+ public IDifferenceFilter.Registry getDifferenceFilterRegistry() {
return filterRegistry;
}
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/EMFCompareConfigurationChangeListener.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/EMFCompareConfigurationChangeListener.java
deleted file mode 100644
index c857da427..000000000
--- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/EMFCompareConfigurationChangeListener.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2013 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.configuration;
-
-import com.google.common.base.Predicate;
-
-import java.util.Set;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.compare.Comparison;
-import org.eclipse.emf.compare.EMFCompare;
-import org.eclipse.emf.compare.domain.ICompareEditingDomain;
-import org.eclipse.emf.compare.internal.merge.MergeMode;
-import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.IDifferenceFilter;
-import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.IDifferenceGroupProvider;
-import org.eclipse.emf.compare.scope.IComparisonScope;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * @author <a href="mailto:mikael.barbero@obeo.fr">Mikael Barbero</a>
- */
-public class EMFCompareConfigurationChangeListener implements IEMFCompareConfigurationChangeListener {
-
- /**
- * {@inheritDoc}
- *
- * @see org.eclipse.emf.compare.rcp.ui.internal.configuration.IEMFCompareConfigurationChangeListener#comparisonChange(org.eclipse.emf.compare.Comparison,
- * org.eclipse.emf.compare.Comparison)
- */
- public void comparisonChange(Comparison oldValue, Comparison newValue) {
-
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.eclipse.emf.compare.rcp.ui.internal.configuration.IEMFCompareConfigurationChangeListener#editingDomainChange(org.eclipse.emf.compare.domain.ICompareEditingDomain,
- * org.eclipse.emf.compare.domain.ICompareEditingDomain)
- */
- public void editingDomainChange(ICompareEditingDomain oldValue, ICompareEditingDomain newValue) {
-
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.eclipse.emf.compare.rcp.ui.internal.configuration.IEMFCompareConfigurationChangeListener#selectedDifferenceGroupProviderChange(org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.IDifferenceGroupProvider,
- * org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.IDifferenceGroupProvider)
- */
- public void selectedDifferenceGroupProviderChange(IDifferenceGroupProvider oldValue,
- IDifferenceGroupProvider newValue) {
-
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.eclipse.emf.compare.rcp.ui.internal.configuration.IEMFCompareConfigurationChangeListener#selectedDifferenceFiltersChange(java.util.Set,
- * java.util.Set)
- */
- public void selectedDifferenceFiltersChange(Set<IDifferenceFilter> oldValue,
- Set<IDifferenceFilter> newValue) {
-
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.eclipse.emf.compare.rcp.ui.internal.configuration.IEMFCompareConfigurationChangeListener#aggregatedViewerPredicateChange(com.google.common.base.Predicate,
- * com.google.common.base.Predicate)
- */
- public void aggregatedViewerPredicateChange(Predicate<? super EObject> oldValue,
- Predicate<? super EObject> newValue) {
-
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.eclipse.emf.compare.rcp.ui.internal.configuration.IEMFCompareConfigurationChangeListener#adapterFactoryChange(org.eclipse.emf.common.notify.AdapterFactory,
- * org.eclipse.emf.common.notify.AdapterFactory)
- */
- public void adapterFactoryChange(AdapterFactory oldValue, AdapterFactory newValue) {
-
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.eclipse.emf.compare.rcp.ui.internal.configuration.IEMFCompareConfigurationChangeListener#comparatorChange(org.eclipse.emf.compare.EMFCompare,
- * org.eclipse.emf.compare.EMFCompare)
- */
- public void comparatorChange(EMFCompare oldValue, EMFCompare newValue) {
-
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.eclipse.emf.compare.rcp.ui.internal.configuration.IEMFCompareConfigurationChangeListener#mergePreviewModeChange(org.eclipse.emf.compare.rcp.ui.internal.configuration.IEMFCompareConfiguration.PreviewMergeMode,
- * org.eclipse.emf.compare.rcp.ui.internal.configuration.IEMFCompareConfiguration.PreviewMergeMode)
- */
- public void mergePreviewModeChange(MergeMode oldValue, MergeMode newValue) {
-
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.eclipse.emf.compare.rcp.ui.internal.configuration.IEMFCompareConfigurationChangeListener#comparisonScopeChange(org.eclipse.emf.compare.scope.IComparisonScope,
- * org.eclipse.emf.compare.scope.IComparisonScope)
- */
- public void comparisonScopeChange(IComparisonScope oldValue, IComparisonScope newValue) {
-
- }
-
-}
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/IAdapterFactoryChange.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/IAdapterFactoryChange.java
new file mode 100644
index 000000000..df9f0e891
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/IAdapterFactoryChange.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2013 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.configuration;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+
+/**
+ * @author <a href="mailto:mikael.barbero@obeo.fr">Mikael Barbero</a>
+ */
+public interface IAdapterFactoryChange extends ICompareEvent {
+
+ AdapterFactory getOldValue();
+
+ AdapterFactory getNewValue();
+}
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/ICompareEditingDomainChange.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/ICompareEditingDomainChange.java
new file mode 100644
index 000000000..3443dbfc5
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/ICompareEditingDomainChange.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2013 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.configuration;
+
+import org.eclipse.emf.compare.domain.ICompareEditingDomain;
+
+/**
+ * @author <a href="mailto:mikael.barbero@obeo.fr">Mikael Barbero</a>
+ */
+public interface ICompareEditingDomainChange extends ICompareEvent {
+
+ ICompareEditingDomain getOldValue();
+
+ ICompareEditingDomain getNewValue();
+}
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/ICompareEvent.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/ICompareEvent.java
new file mode 100644
index 000000000..4bfebcaeb
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/ICompareEvent.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2013 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.configuration;
+
+/**
+ * Marker interface for all events related to EMF Compare.
+ *
+ * @author <a href="mailto:mikael.barbero@obeo.fr">Mikael Barbero</a>
+ */
+public interface ICompareEvent {
+
+}
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/IComparisonAndScopeChange.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/IComparisonAndScopeChange.java
new file mode 100644
index 000000000..805593777
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/IComparisonAndScopeChange.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2013 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.configuration;
+
+import org.eclipse.emf.compare.Comparison;
+import org.eclipse.emf.compare.scope.IComparisonScope;
+
+/**
+ * @author <a href="mailto:mikael.barbero@obeo.fr">Mikael Barbero</a>
+ *
+ */
+public interface IComparisonAndScopeChange {
+
+ Comparison getOldComparison();
+
+ Comparison getNewComparison();
+
+ IComparisonScope getOldScope();
+
+ IComparisonScope getNewScope();
+
+}
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/IEMFComparatorChange.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/IEMFComparatorChange.java
new file mode 100644
index 000000000..09619e3ef
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/IEMFComparatorChange.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2013 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.configuration;
+
+import org.eclipse.emf.compare.EMFCompare;
+
+/**
+ * @author <a href="mailto:mikael.barbero@obeo.fr">Mikael Barbero</a>
+ */
+public interface IEMFComparatorChange extends ICompareEvent {
+
+ EMFCompare getOldValue();
+
+ EMFCompare getNewValue();
+}
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/IEMFCompareConfiguration.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/IEMFCompareConfiguration.java
index 466ea8b29..7fe11461f 100644
--- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/IEMFCompareConfiguration.java
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/IEMFCompareConfiguration.java
@@ -10,101 +10,53 @@
*******************************************************************************/
package org.eclipse.emf.compare.rcp.ui.internal.configuration;
-import com.google.common.base.Predicate;
-
-import java.util.Collection;
-import java.util.Set;
+import com.google.common.eventbus.EventBus;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.compare.Comparison;
import org.eclipse.emf.compare.EMFCompare;
import org.eclipse.emf.compare.domain.ICompareEditingDomain;
import org.eclipse.emf.compare.internal.merge.MergeMode;
-import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.IDifferenceFilter;
-import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.IDifferenceGroupProvider;
+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.scope.IComparisonScope;
-import org.eclipse.emf.ecore.EObject;
/**
* @author <a href="mailto:mikael.barbero@obeo.fr">Mikael Barbero</a>
*/
public interface IEMFCompareConfiguration {
- /**
- * @return the fEditingDomain
- */
+ EventBus getEventBus();
+
ICompareEditingDomain getEditingDomain();
void setEditingDomain(ICompareEditingDomain editingDomain);
- /**
- * Returns the active group.
- *
- * @return the selected group provider.
- */
- IDifferenceGroupProvider getSelectedDifferenceGroupProvider();
-
- /**
- * @param differenceGroupProvider
- */
- void setSelectedDifferenceGroupProvider(IDifferenceGroupProvider differenceGroupProvider);
-
- /**
- * Returns the active filters.
- *
- * @return the selectedFilters.
- */
- Collection<IDifferenceFilter> getSelectedDifferenceFilters();
-
- void setSelectedDifferenceFilters(Set<IDifferenceFilter> filters);
+ StructureMergeViewerGrouper getStructureMergeViewerGrouper();
- /**
- * @return the smvPredicate
- */
- Predicate<? super EObject> getAggregatedViewerPredicate();
-
- void setAggregatedViewerPredicate(Predicate<? super EObject> predicate);
+ StructureMergeViewerFilter getStructureMergeViewerFilter();
AdapterFactory getAdapterFactory();
void setAdapterFactory(AdapterFactory adapterFactory);
- /**
- * @return the fComparison
- */
+ boolean isLeftEditable();
+
+ boolean isRightEditable();
+
Comparison getComparison();
- void setComparison(Comparison comparison);
+ void setComparisonAndScope(Comparison comparison, IComparisonScope comparisonScope);
IComparisonScope getComparisonScope();
- void setComparisonScope(IComparisonScope comparisonScope);
+ EMFCompare getEMFComparator();
- EMFCompare getComparator();
-
- void setComparator(EMFCompare comparator);
+ void setEMFComparator(EMFCompare comparator);
MergeMode getMergePreviewMode();
void setMergePreviewMode(MergeMode mergePreviewMode);
- /**
- * Adds a listener for property changes to this notifier. Has no effect if an identical listener is
- * already registered.
- *
- * @param listener
- * a property change listener
- */
- void addChangeListener(IEMFCompareConfigurationChangeListener listener);
-
- /**
- * Removes the given content change listener from this notifier. Has no effect if the identical listener
- * is not registered.
- *
- * @param listener
- * a property change listener
- */
- void removeChangeListener(IEMFCompareConfigurationChangeListener listener);
-
boolean getBooleanProperty(String key, boolean dflt);
}
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/IEMFCompareConfigurationChangeListener.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/IEMFCompareConfigurationChangeListener.java
deleted file mode 100644
index fde3223d7..000000000
--- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/IEMFCompareConfigurationChangeListener.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2013 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.configuration;
-
-import com.google.common.base.Predicate;
-
-import java.util.Set;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.compare.Comparison;
-import org.eclipse.emf.compare.EMFCompare;
-import org.eclipse.emf.compare.domain.ICompareEditingDomain;
-import org.eclipse.emf.compare.internal.merge.MergeMode;
-import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.IDifferenceFilter;
-import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.IDifferenceGroupProvider;
-import org.eclipse.emf.compare.scope.IComparisonScope;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * @author <a href="mailto:mikael.barbero@obeo.fr">Mikael Barbero</a>
- */
-public interface IEMFCompareConfigurationChangeListener {
-
- void comparisonChange(Comparison oldValue, Comparison newValue);
-
- void editingDomainChange(ICompareEditingDomain oldValue, ICompareEditingDomain newValue);
-
- void selectedDifferenceGroupProviderChange(IDifferenceGroupProvider oldValue,
- IDifferenceGroupProvider newValue);
-
- void selectedDifferenceFiltersChange(Set<IDifferenceFilter> oldValue, Set<IDifferenceFilter> newValue);
-
- void aggregatedViewerPredicateChange(Predicate<? super EObject> oldValue,
- Predicate<? super EObject> newValue);
-
- void adapterFactoryChange(AdapterFactory oldValue, AdapterFactory newValue);
-
- /**
- * @param oldValue
- * @param newValue
- */
- void comparatorChange(EMFCompare oldValue, EMFCompare newValue);
-
- /**
- * @param oldValue
- * @param newValue
- */
- void mergePreviewModeChange(MergeMode oldValue, MergeMode newValue);
-
- void comparisonScopeChange(IComparisonScope oldValue, IComparisonScope newValue);
-
-}
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/IMergePreviewModeChange.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/IMergePreviewModeChange.java
new file mode 100644
index 000000000..41468dc2a
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/IMergePreviewModeChange.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2013 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.configuration;
+
+import org.eclipse.emf.compare.internal.merge.MergeMode;
+
+/**
+ * @author <a href="mailto:mikael.barbero@obeo.fr">Mikael Barbero</a>
+ */
+public interface IMergePreviewModeChange extends ICompareEvent {
+
+ MergeMode getOldValue();
+
+ MergeMode getNewValue();
+}
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/impl/AdapterFactoryChange.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/impl/AdapterFactoryChange.java
new file mode 100644
index 000000000..f16ca53eb
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/impl/AdapterFactoryChange.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2013 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.configuration.impl;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.compare.rcp.ui.internal.configuration.IAdapterFactoryChange;
+
+public class AdapterFactoryChange extends CompareEvent<AdapterFactory> implements IAdapterFactoryChange {
+ public AdapterFactoryChange(AdapterFactory oldValue, AdapterFactory newValue) {
+ super(oldValue, newValue);
+ }
+} \ No newline at end of file
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/impl/CompareEditingDomainChange.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/impl/CompareEditingDomainChange.java
new file mode 100644
index 000000000..32f691955
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/impl/CompareEditingDomainChange.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * Copyright (c) 2013 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.configuration.impl;
+
+import org.eclipse.emf.compare.domain.ICompareEditingDomain;
+import org.eclipse.emf.compare.rcp.ui.internal.configuration.ICompareEditingDomainChange;
+
+public class CompareEditingDomainChange extends CompareEvent<ICompareEditingDomain> implements ICompareEditingDomainChange {
+
+ public CompareEditingDomainChange(ICompareEditingDomain oldValue, ICompareEditingDomain newValue) {
+ super(oldValue, newValue);
+ }
+}
diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/util/SWTUtil.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/impl/CompareEvent.java
index 9e1a64c66..e47d766d9 100644
--- a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/util/SWTUtil.java
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/impl/CompareEvent.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2012, 2013 Obeo.
+ * Copyright (c) 2013 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
@@ -8,28 +8,29 @@
* Contributors:
* Obeo - initial API and implementation
*******************************************************************************/
-package org.eclipse.emf.compare.ide.ui.internal.util;
+package org.eclipse.emf.compare.rcp.ui.internal.configuration.impl;
-import org.eclipse.swt.widgets.Display;
+import org.eclipse.emf.compare.rcp.ui.internal.configuration.ICompareEvent;
/**
* @author <a href="mailto:mikael.barbero@obeo.fr">Mikael Barbero</a>
*/
-public class SWTUtil {
+public class CompareEvent<T> implements ICompareEvent {
- public static void safeAsyncExec(final Runnable runnable) {
- if (Display.getCurrent() != null) {
- runnable.run();
- } else {
- Display.getDefault().asyncExec(runnable);
- }
+ private final T oldValue;
+
+ private final T newValue;
+
+ protected CompareEvent(T oldValue, T newValue) {
+ this.oldValue = oldValue;
+ this.newValue = newValue;
+ }
+
+ public T getOldValue() {
+ return oldValue;
}
- public static void safeSyncExec(final Runnable runnable) {
- if (Display.getCurrent() != null) {
- runnable.run();
- } else {
- Display.getDefault().syncExec(runnable);
- }
+ public T getNewValue() {
+ return newValue;
}
}
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/impl/ComparisonAndScopeChange.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/impl/ComparisonAndScopeChange.java
new file mode 100644
index 000000000..dde533b94
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/impl/ComparisonAndScopeChange.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2013 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.configuration.impl;
+
+import org.eclipse.emf.compare.Comparison;
+import org.eclipse.emf.compare.rcp.ui.internal.configuration.ICompareEvent;
+import org.eclipse.emf.compare.rcp.ui.internal.configuration.IComparisonAndScopeChange;
+import org.eclipse.emf.compare.scope.IComparisonScope;
+
+public class ComparisonAndScopeChange implements ICompareEvent, IComparisonAndScopeChange {
+ private Comparison oldComparison;
+
+ private Comparison newComparison;
+
+ private IComparisonScope oldScope;
+
+ private IComparisonScope newScope;
+
+ public ComparisonAndScopeChange(Comparison oldComparison, Comparison newComparison,
+ IComparisonScope oldPredicate, IComparisonScope newScope) {
+ this.oldComparison = oldComparison;
+ this.newComparison = newComparison;
+ this.oldScope = oldPredicate;
+ this.newScope = newScope;
+ }
+
+ /**
+ * {@inheritDoc}
+ * @see org.eclipse.emf.compare.rcp.ui.internal.configuration.IComparisonAndScopeChange#getOldComparison()
+ */
+ public Comparison getOldComparison() {
+ return oldComparison;
+ }
+
+ /**
+ * {@inheritDoc}
+ * @see org.eclipse.emf.compare.rcp.ui.internal.configuration.IComparisonAndScopeChange#getNewComparison()
+ */
+ public Comparison getNewComparison() {
+ return newComparison;
+ }
+
+ /**
+ * {@inheritDoc}
+ * @see org.eclipse.emf.compare.rcp.ui.internal.configuration.IComparisonAndScopeChange#getOldScope()
+ */
+ public IComparisonScope getOldScope() {
+ return oldScope;
+ }
+
+ /**
+ * {@inheritDoc}
+ * @see org.eclipse.emf.compare.rcp.ui.internal.configuration.IComparisonAndScopeChange#getNewScope()
+ */
+ public IComparisonScope getNewScope() {
+ return newScope;
+ }
+
+} \ No newline at end of file
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/impl/EMFComparatorChange.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/impl/EMFComparatorChange.java
new file mode 100644
index 000000000..e0e230084
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/impl/EMFComparatorChange.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2013 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.configuration.impl;
+
+import org.eclipse.emf.compare.EMFCompare;
+import org.eclipse.emf.compare.rcp.ui.internal.configuration.IEMFComparatorChange;
+
+public class EMFComparatorChange extends CompareEvent<EMFCompare> implements IEMFComparatorChange {
+ public EMFComparatorChange(EMFCompare oldValue, EMFCompare newValue) {
+ super(oldValue, newValue);
+ }
+}
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/impl/MergePreviewModeChange.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/impl/MergePreviewModeChange.java
new file mode 100644
index 000000000..a5b3fe85a
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/configuration/impl/MergePreviewModeChange.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2013 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.configuration.impl;
+
+import org.eclipse.emf.compare.internal.merge.MergeMode;
+import org.eclipse.emf.compare.rcp.ui.internal.configuration.IMergePreviewModeChange;
+
+public class MergePreviewModeChange extends CompareEvent<MergeMode> implements IMergePreviewModeChange {
+ public MergePreviewModeChange(MergeMode oldValue, MergeMode newValue) {
+ super(oldValue, newValue);
+ }
+}
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/mergeviewer/impl/AbstractMergeViewer.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/mergeviewer/impl/AbstractMergeViewer.java
index 812276218..68a0853a5 100644
--- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/mergeviewer/impl/AbstractMergeViewer.java
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/mergeviewer/impl/AbstractMergeViewer.java
@@ -11,11 +11,14 @@
package org.eclipse.emf.compare.rcp.ui.internal.mergeviewer.impl;
import com.google.common.base.Predicate;
+import com.google.common.eventbus.Subscribe;
-import org.eclipse.emf.compare.rcp.ui.internal.configuration.EMFCompareConfigurationChangeListener;
import org.eclipse.emf.compare.rcp.ui.internal.configuration.IEMFCompareConfiguration;
import org.eclipse.emf.compare.rcp.ui.internal.mergeviewer.IMergeViewer;
+import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.IDifferenceFilterChange;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.IDifferenceGroupProvider;
+import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.IDifferenceGroupProviderChange;
+import org.eclipse.emf.compare.rcp.ui.internal.util.SWTUtil;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.viewers.ContentViewer;
import org.eclipse.swt.events.DisposeEvent;
@@ -29,7 +32,9 @@ public abstract class AbstractMergeViewer extends ContentViewer implements IMerg
private final IEMFCompareConfiguration compareConfiguration;
- private EMFCompareMergeViewerConfigurationListener configurationListener;
+ private Predicate<? super EObject> differenceFilter;
+
+ private IDifferenceGroupProvider differenceGroupProvider;
/**
*
@@ -37,8 +42,7 @@ public abstract class AbstractMergeViewer extends ContentViewer implements IMerg
public AbstractMergeViewer(MergeViewerSide side, final IEMFCompareConfiguration compareConfiguration) {
fSide = side;
this.compareConfiguration = compareConfiguration;
- configurationListener = new EMFCompareMergeViewerConfigurationListener();
- compareConfiguration.addChangeListener(configurationListener);
+ getCompareConfiguration().getEventBus().register(this);
}
/**
@@ -64,32 +68,35 @@ public abstract class AbstractMergeViewer extends ContentViewer implements IMerg
*/
@Override
protected void handleDispose(DisposeEvent event) {
- compareConfiguration.removeChangeListener(configurationListener);
+ getCompareConfiguration().getEventBus().unregister(this);
super.handleDispose(event);
}
- protected void handleSelectedDifferenceGroupProviderChange() {
- refresh();
+ @Subscribe
+ public void handleDifferenceGroupProviderChange(IDifferenceGroupProviderChange event) {
+ differenceGroupProvider = event.getDifferenceGroupProvider();
+ SWTUtil.safeRefresh(this, true);
}
- protected void handleAggregatedViewerPredicateChange() {
- refresh();
+ public IDifferenceGroupProvider getDifferenceGroupProvider() {
+ if (differenceGroupProvider == null) {
+ return getCompareConfiguration().getStructureMergeViewerGrouper().getProvider();
+ } else {
+ return differenceGroupProvider;
+ }
}
- /**
- * @author <a href="mailto:mikael.barbero@obeo.fr">Mikael Barbero</a>
- */
- private final class EMFCompareMergeViewerConfigurationListener extends EMFCompareConfigurationChangeListener {
- @Override
- public void selectedDifferenceGroupProviderChange(IDifferenceGroupProvider oldValue,
- IDifferenceGroupProvider newValue) {
- handleSelectedDifferenceGroupProviderChange();
- }
-
- @Override
- public void aggregatedViewerPredicateChange(Predicate<? super EObject> oldValue,
- Predicate<? super EObject> newValue) {
- handleAggregatedViewerPredicateChange();
+ @Subscribe
+ public void handleDifferenceFilterChange(IDifferenceFilterChange event) {
+ differenceFilter = event.getPredicate();
+ SWTUtil.safeRefresh(this, true);
+ }
+
+ protected final Predicate<? super EObject> getDifferenceFilter() {
+ if (differenceFilter == null) {
+ return getCompareConfiguration().getStructureMergeViewerFilter().getAggregatedPredicate();
+ } else {
+ return differenceFilter;
}
}
}
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/mergeviewer/impl/TableOrTreeMergeViewer.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/mergeviewer/impl/TableOrTreeMergeViewer.java
index 78afd788c..495cc3fee 100644
--- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/mergeviewer/impl/TableOrTreeMergeViewer.java
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/mergeviewer/impl/TableOrTreeMergeViewer.java
@@ -118,9 +118,8 @@ public abstract class TableOrTreeMergeViewer extends StructuredMergeViewer {
IMergeViewerItem mergeViewerItem = ((IMergeViewerItem)data);
Diff diff = mergeViewerItem.getDiff();
if (diff != null) {
- if (MergeViewerUtil.isVisibleInMergeViewer(diff, getCompareConfiguration()
- .getSelectedDifferenceGroupProvider(), getCompareConfiguration()
- .getAggregatedViewerPredicate())) {
+ if (MergeViewerUtil.isVisibleInMergeViewer(diff, getDifferenceGroupProvider(),
+ getDifferenceFilter())) {
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/structuremergeviewer/actions/FilterAction.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/actions/FilterAction.java
index 1ab37ea5a..8fc4f99c4 100644
--- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/actions/FilterAction.java
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/actions/FilterAction.java
@@ -30,10 +30,10 @@ import org.eclipse.jface.action.IAction;
public class FilterAction extends Action {
/** The filter associated with this action. */
- private IDifferenceFilter filter;
+ private final IDifferenceFilter filter;
/** The Filter that will be modified by the action. */
- private StructureMergeViewerFilter structureMergeViewerFilter;
+ private final StructureMergeViewerFilter structureMergeViewerFilter;
/**
* The "default" constructor for this action.
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/actions/FilterActionMenu.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/actions/FilterActionMenu.java
index b8d5314b2..2cf2967cd 100644
--- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/actions/FilterActionMenu.java
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/actions/FilterActionMenu.java
@@ -10,13 +10,12 @@
*******************************************************************************/
package org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.actions;
-import com.google.common.collect.Lists;
-
import java.util.Collection;
import org.eclipse.emf.compare.Comparison;
import org.eclipse.emf.compare.rcp.ui.EMFCompareRCPUIPlugin;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.IDifferenceFilter;
+import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.IDifferenceFilter.Registry;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.StructureMergeViewerFilter;
import org.eclipse.emf.compare.scope.IComparisonScope;
import org.eclipse.jface.action.Action;
@@ -38,7 +37,10 @@ public class FilterActionMenu extends Action implements IMenuCreator {
private final StructureMergeViewerFilter structureMergeViewerFilter;
/** Menu Manager that will contain our menu. */
- private MenuManager menuManager;
+ private final MenuManager menuManager;
+
+ /** The registry that will be used to retrieve available filters. */
+ private final Registry registry;
/**
* Constructs our filtering menu.
@@ -48,10 +50,12 @@ public class FilterActionMenu extends Action implements IMenuCreator {
* @param menuManager
* The Menu Manager that will contain our menu.
*/
- public FilterActionMenu(StructureMergeViewerFilter structureMergeViewerFilter) {
+ public FilterActionMenu(StructureMergeViewerFilter structureMergeViewerFilter,
+ IDifferenceFilter.Registry registry) {
super("", IAction.AS_DROP_DOWN_MENU); //$NON-NLS-1$
- this.menuManager = new MenuManager();
this.structureMergeViewerFilter = structureMergeViewerFilter;
+ this.registry = registry;
+ this.menuManager = new MenuManager();
setMenuCreator(this);
setToolTipText("Filters");
setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(EMFCompareRCPUIPlugin.PLUGIN_ID,
@@ -66,21 +70,14 @@ public class FilterActionMenu extends Action implements IMenuCreator {
* @param comparison
* The comparison on which the filters will be applied.
*/
- public void createActions(IComparisonScope scope, Comparison comparison) {
- if (menuManager.isEmpty()) {
- IDifferenceFilter.Registry registry = EMFCompareRCPUIPlugin.getDefault()
- .getFilterActionRegistry();
- Collection<IDifferenceFilter> filters = registry.getFilters(scope, comparison);
- Collection<IDifferenceFilter> filtersSelected = Lists.newArrayList();
- for (IDifferenceFilter filter : filters) {
- FilterAction action = new FilterAction(filter.getLabel(), structureMergeViewerFilter, filter);
- if (filter.defaultSelected()) {
- action.setChecked(true);
- filtersSelected.add(filter);
- }
- menuManager.add(action);
- }
- structureMergeViewerFilter.addFilters(filtersSelected);
+ public void updateMenu(IComparisonScope newScope, Comparison newComparison) {
+ menuManager.removeAll();
+ Collection<IDifferenceFilter> filters = registry.getFilters(newScope, newComparison);
+ for (IDifferenceFilter filter : filters) {
+ FilterAction action = new FilterAction(filter.getLabel(), structureMergeViewerFilter, filter);
+ boolean selected = structureMergeViewerFilter.getSelectedDifferenceFilters().contains(filter);
+ action.setChecked(selected);
+ menuManager.add(action);
}
}
@@ -108,6 +105,6 @@ public class FilterActionMenu extends Action implements IMenuCreator {
* @see IMenuCreator#getMenu(Menu)
*/
public Menu getMenu(Menu parent) {
- return menuManager.getMenu();
+ return null;
}
}
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 49be65361..4fb2b12e8 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
@@ -13,8 +13,8 @@ package org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.actions;
import org.eclipse.emf.compare.Comparison;
import org.eclipse.emf.compare.rcp.ui.EMFCompareRCPUIPlugin;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.IDifferenceGroupProvider;
+import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.IDifferenceGroupProvider.Registry;
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.scope.IComparisonScope;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
@@ -35,10 +35,10 @@ public class GroupActionMenu extends Action implements IMenuCreator {
private final StructureMergeViewerGrouper structureMergeViewerGrouper;
/** Menu Manager that will contain our menu. */
- private MenuManager menuManager;
+ private final MenuManager menuManager;
- /** The default group provider. */
- private DefaultGroupProvider defaultGroupProvider;
+ /** The registry that will be used to retrieve the displayed group providers. */
+ private final Registry registry;
/**
* Constructs our grouping menu.
@@ -51,11 +51,11 @@ public class GroupActionMenu extends Action implements IMenuCreator {
* The default group provider.
*/
public GroupActionMenu(StructureMergeViewerGrouper structureMergeViewerGrouper,
- DefaultGroupProvider defaultGroupProvider) {
+ IDifferenceGroupProvider.Registry registry) {
super("", IAction.AS_DROP_DOWN_MENU); //$NON-NLS-1$
+ this.registry = registry;
this.menuManager = new MenuManager();
this.structureMergeViewerGrouper = structureMergeViewerGrouper;
- this.defaultGroupProvider = defaultGroupProvider;
setToolTipText("Groups");
setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(EMFCompareRCPUIPlugin.PLUGIN_ID,
"icons/full/toolb16/group.gif")); //$NON-NLS-1$
@@ -70,24 +70,14 @@ public class GroupActionMenu extends Action implements IMenuCreator {
* @param comparison
* The comparison which differences are to be split into groups.
*/
- public void createActions(IComparisonScope scope, Comparison comparison) {
- if (menuManager.isEmpty()) {
- final IAction defaultAction = new GroupAction(structureMergeViewerGrouper, defaultGroupProvider);
- defaultAction.setChecked(true);
- defaultAction.run(); // must run to activate the adapter factory
- menuManager.add(defaultAction);
- IDifferenceGroupProvider.Registry registry = EMFCompareRCPUIPlugin.getDefault()
- .getDifferenceGroupProviderRegistry();
- boolean alreadyChecked = false;
- for (IDifferenceGroupProvider dgp : registry.getGroupProviders(scope, comparison)) {
- GroupAction action = new GroupAction(structureMergeViewerGrouper, dgp);
- menuManager.add(action);
- if (dgp.defaultSelected() && !alreadyChecked) {
- defaultAction.setChecked(false);
- action.setChecked(true);
- alreadyChecked = true;
- action.run();
- }
+ 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);
}
}
}
@@ -116,6 +106,6 @@ public class GroupActionMenu extends Action implements IMenuCreator {
* @see IMenuCreator#getMenu(Menu)
*/
public Menu getMenu(Menu parent) {
- return menuManager.getMenu();
+ return null;
}
}
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/filters/IDifferenceFilterChange.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/filters/IDifferenceFilterChange.java
new file mode 100644
index 000000000..8fc106df4
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/filters/IDifferenceFilterChange.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2013 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.filters;
+
+import com.google.common.base.Predicate;
+
+import java.util.Collection;
+
+import org.eclipse.emf.compare.rcp.ui.internal.configuration.ICompareEvent;
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * @author <a href="mailto:mikael.barbero@obeo.fr">Mikael Barbero</a>
+ */
+public interface IDifferenceFilterChange extends ICompareEvent {
+
+ Predicate<? super EObject> getPredicate();
+
+ Collection<IDifferenceFilter> getSelectedDifferenceFilters();
+
+ Collection<IDifferenceFilter> getUnselectedDifferenceFilters();
+
+}
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/filters/IDifferenceFilterSelectionChangeEvent.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/filters/IDifferenceFilterSelectionChangeEvent.java
deleted file mode 100644
index ae78695f8..000000000
--- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/filters/IDifferenceFilterSelectionChangeEvent.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2013 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.filters;
-
-import com.google.common.base.Predicate;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * The {@link IDifferenceFilterSelectionChangeEvent} is type of event that will be posted through an event
- * bus. When clicking on a filter through the EMF Compare UI in order to activate or deactivate it, an event
- * of type {@link IDifferenceFilterSelectionChangeEvent} will be posted through an event bus.
- *
- * @author <a href="mailto:axel.richard@obeo.fr">Axel Richard</a>
- * @since 3.0
- */
-public interface IDifferenceFilterSelectionChangeEvent {
-
- /**
- * The {@link IDifferenceFilter} associated with this event.
- *
- * @return The {@link IDifferenceFilter} associated with this event.
- */
- IDifferenceFilter getFilter();
-
- /**
- * The {@link Action} associated with this event.
- *
- * @return The {@link Action} associated with this event.
- */
- Action getAction();
-
- /**
- * Returns the viewer predicate.
- *
- * @return the viewer predicate.
- */
- Predicate<? super EObject> getAggregatedPredicate();
-
- /**
- * The types of actions which can be associated with the events.
- *
- * @author <a href="mailto:axel.richard@obeo.fr">Axel Richard</a>
- */
- enum Action {
- /** Corresponding to a selection of an {@link IDifferenceFilter}. */
- SELECTED,
- /** Corresponding to a deselection of an {@link IDifferenceFilter}. */
- DESELECTED,
- }
-}
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/filters/StructureMergeViewerFilter.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/filters/StructureMergeViewerFilter.java
index 9f8c360ca..b92d39b2e 100644
--- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/filters/StructureMergeViewerFilter.java
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/filters/StructureMergeViewerFilter.java
@@ -14,11 +14,11 @@ import static com.google.common.base.Predicates.alwaysFalse;
import static com.google.common.base.Predicates.not;
import static com.google.common.base.Predicates.or;
import static com.google.common.collect.Iterables.any;
+import static com.google.common.collect.Lists.newArrayList;
+import static com.google.common.collect.Sets.newLinkedHashSet;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
import com.google.common.eventbus.EventBus;
import java.util.Collection;
@@ -30,9 +30,9 @@ import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.compare.Conflict;
import org.eclipse.emf.compare.Match;
import org.eclipse.emf.compare.MatchResource;
-import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.IDifferenceFilterSelectionChangeEvent.Action;
-import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.impl.DifferenceFilterSelectionChangeEventImpl;
+import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.impl.DifferenceFilterChange;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.provider.GroupItemProviderAdapter;
+import org.eclipse.emf.compare.rcp.ui.internal.util.SWTUtil;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.edit.tree.TreeNode;
import org.eclipse.jface.viewers.TreePath;
@@ -57,9 +57,16 @@ import org.eclipse.swt.events.DisposeListener;
* @since 3.0
*/
public class StructureMergeViewerFilter extends ViewerFilter {
+
+ public static final Predicate<? super EObject> DEFAULT_PREDICATE = alwaysFalse();
+
/** The set of predicates known by this filter. */
private final Set<Predicate<? super EObject>> predicates;
+ private final Set<IDifferenceFilter> selectedDifferenceFilters;
+
+ private final Set<IDifferenceFilter> unselectedDifferenceFilters;
+
/** List of all TreeViewers on which this filter is applied. */
private final List<TreeViewer> viewers;
@@ -93,9 +100,11 @@ public class StructureMergeViewerFilter extends ViewerFilter {
*/
public StructureMergeViewerFilter(EventBus eventBus) {
this.eventBus = eventBus;
- this.predicates = Sets.newLinkedHashSet();
- this.viewers = Lists.newArrayList();
- this.aggregatedPredicate = alwaysFalse();
+ this.predicates = newLinkedHashSet();
+ this.selectedDifferenceFilters = newLinkedHashSet();
+ this.unselectedDifferenceFilters = newLinkedHashSet();
+ this.viewers = newArrayList();
+ this.aggregatedPredicate = DEFAULT_PREDICATE;
}
/**
@@ -130,29 +139,6 @@ public class StructureMergeViewerFilter extends ViewerFilter {
}
/**
- * Add the predicates of the given {@link IDifferenceFilter}s.
- *
- * @param filters
- * The given {@link IDifferenceFilter}s.
- */
- public void addFilters(Collection<IDifferenceFilter> filters) {
- boolean changed = false;
- for (IDifferenceFilter filter : filters) {
- changed |= predicates.remove(filter.getPredicateWhenUnselected());
- changed |= predicates.add(filter.getPredicateWhenSelected());
- }
-
- if (changed) {
- computeAggregatedPredicate();
- for (IDifferenceFilter filter : filters) {
- eventBus.post(new DifferenceFilterSelectionChangeEventImpl(filter, aggregatedPredicate,
- Action.SELECTED));
- }
- refreshViewers();
- }
- }
-
- /**
* Add the predicate of the given {@link IDifferenceFilter}.
*
* @param filter
@@ -161,19 +147,23 @@ public class StructureMergeViewerFilter extends ViewerFilter {
public void addFilter(IDifferenceFilter filter) {
boolean changed = predicates.remove(filter.getPredicateWhenUnselected());
changed |= predicates.add(filter.getPredicateWhenSelected());
+
+ changed |= selectedDifferenceFilters.add(filter);
+ changed |= unselectedDifferenceFilters.remove(filter);
+
if (changed) {
- computeAggregatedPredicate();
- eventBus.post(new DifferenceFilterSelectionChangeEventImpl(filter, aggregatedPredicate,
- Action.SELECTED));
+ aggregatedPredicate = computeAggregatedPredicate();
refreshViewers();
+ eventBus.post(new DifferenceFilterChange(aggregatedPredicate, selectedDifferenceFilters,
+ unselectedDifferenceFilters));
}
}
/**
* @return
*/
- private void computeAggregatedPredicate() {
- aggregatedPredicate = not(or(predicates));
+ private Predicate<? super EObject> computeAggregatedPredicate() {
+ return not(or(predicates));
}
/**
@@ -185,23 +175,71 @@ public class StructureMergeViewerFilter extends ViewerFilter {
public void removeFilter(IDifferenceFilter filter) {
boolean changed = predicates.add(filter.getPredicateWhenUnselected());
changed |= predicates.remove(filter.getPredicateWhenSelected());
+
+ changed |= unselectedDifferenceFilters.add(filter);
+ changed |= selectedDifferenceFilters.remove(filter);
+
if (changed) {
- computeAggregatedPredicate();
- eventBus.post(new DifferenceFilterSelectionChangeEventImpl(filter, aggregatedPredicate,
- Action.DESELECTED));
+ aggregatedPredicate = computeAggregatedPredicate();
refreshViewers();
+ eventBus.post(new DifferenceFilterChange(aggregatedPredicate, selectedDifferenceFilters,
+ unselectedDifferenceFilters));
}
}
+ public void init(Collection<IDifferenceFilter> selectedFilters,
+ Collection<IDifferenceFilter> unselectedFilters) {
+ boolean changed = false;
+
+ if (!predicates.isEmpty()) {
+ predicates.clear();
+ changed = true;
+ }
+
+ for (IDifferenceFilter filter : selectedFilters) {
+ changed |= predicates.add(filter.getPredicateWhenSelected());
+ changed |= selectedDifferenceFilters.add(filter);
+ }
+ for (IDifferenceFilter filter : unselectedFilters) {
+ changed |= predicates.add(filter.getPredicateWhenUnselected());
+ changed |= unselectedDifferenceFilters.add(filter);
+ }
+
+ if (changed) {
+ aggregatedPredicate = computeAggregatedPredicate();
+ refreshViewers();
+ eventBus.post(new DifferenceFilterChange(aggregatedPredicate, selectedDifferenceFilters,
+ unselectedDifferenceFilters));
+ }
+ }
+
+ /**
+ * @return the selectedDifferenceFilters
+ */
+ public Set<IDifferenceFilter> getSelectedDifferenceFilters() {
+ return selectedDifferenceFilters;
+ }
+
+ /**
+ * @return the aggregatedPredicate
+ */
+ public Predicate<? super EObject> getAggregatedPredicate() {
+ return aggregatedPredicate;
+ }
+
/**
* Refreshes the viewers registered with this filter. Will try and conserve the expanded tree paths when
* possible.
*/
private void refreshViewers() {
- for (TreeViewer viewer : viewers) {
- final TreePath[] paths = viewer.getExpandedTreePaths();
- viewer.refresh();
- viewer.setExpandedTreePaths(paths);
+ for (final TreeViewer viewer : viewers) {
+ SWTUtil.safeSyncExec(new Runnable() {
+ public void run() {
+ final TreePath[] paths = viewer.getExpandedTreePaths();
+ viewer.refresh();
+ viewer.setExpandedTreePaths(paths);
+ }
+ });
}
}
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/filters/impl/DifferenceFilterChange.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/filters/impl/DifferenceFilterChange.java
new file mode 100644
index 000000000..94d98f84f
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/filters/impl/DifferenceFilterChange.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2013 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.filters.impl;
+
+import com.google.common.base.Predicate;
+
+import java.util.Collection;
+import java.util.Set;
+
+import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.IDifferenceFilter;
+import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.IDifferenceFilterChange;
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * @author <a href="mailto:mikael.barbero@obeo.fr">Mikael Barbero</a>
+ */
+public class DifferenceFilterChange implements IDifferenceFilterChange {
+
+ private final Predicate<? super EObject> predicate;
+
+ private final Set<IDifferenceFilter> selectedDifferenceFilters;
+
+ private final Set<IDifferenceFilter> unselectedDifferenceFilters;
+
+ /**
+ * Default constructor.
+ */
+ public DifferenceFilterChange(Predicate<? super EObject> predicate,
+ Set<IDifferenceFilter> selectedDifferenceFilters,
+ Set<IDifferenceFilter> unselectedDifferenceFilters) {
+ this.predicate = predicate;
+ this.selectedDifferenceFilters = selectedDifferenceFilters;
+ this.unselectedDifferenceFilters = unselectedDifferenceFilters;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.IDifferenceFilterChange#getPredicate()
+ */
+ public Predicate<? super EObject> getPredicate() {
+ return predicate;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.IDifferenceFilterChange#getSelectedDifferenceFilters()
+ */
+ public Collection<IDifferenceFilter> getSelectedDifferenceFilters() {
+ return selectedDifferenceFilters;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.IDifferenceFilterChange#getUnselectedDifferenceFilters()
+ */
+ public Collection<IDifferenceFilter> getUnselectedDifferenceFilters() {
+ return unselectedDifferenceFilters;
+ }
+
+}
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/filters/impl/DifferenceFilterSelectionChangeEventImpl.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/filters/impl/DifferenceFilterSelectionChangeEventImpl.java
deleted file mode 100644
index b85c7efab..000000000
--- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/filters/impl/DifferenceFilterSelectionChangeEventImpl.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2013 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.filters.impl;
-
-import com.google.common.base.Predicate;
-
-import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.IDifferenceFilter;
-import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.IDifferenceFilterSelectionChangeEvent;
-import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.IDifferenceFilterSelectionChangeEvent.Action;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * A default implementation of the {@link IDifferenceFilterSelectionChangeEvent}.
- *
- * @author <a href="mailto:axel.richard@obeo.fr">Axel Richard</a>
- */
-public class DifferenceFilterSelectionChangeEventImpl implements IDifferenceFilterSelectionChangeEvent {
-
- /** The {@link IDifferenceFilter} associated with this event. */
- private final IDifferenceFilter filter;
-
- /** The {@link Action} associated with this event. */
- private final Action action;
-
- private final Predicate<? super EObject> predicate;
-
- /**
- * Constructs the event.
- *
- * @param filter
- * The {@link IDifferenceFilter} that will be associated with this event.
- * @param action
- * The {@link Action} that will be associated with this event.
- */
- public DifferenceFilterSelectionChangeEventImpl(IDifferenceFilter filter,
- Predicate<? super EObject> predicate, Action action) {
- this.filter = filter;
- this.predicate = predicate;
- this.action = action;
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.IDifferenceFilterSelectionChangeEvent#getFilter()
- */
- public IDifferenceFilter getFilter() {
- return filter;
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.IDifferenceFilterSelectionChangeEvent#getAggregatedPredicate()
- */
- public Predicate<? super EObject> getAggregatedPredicate() {
- return predicate;
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.IDifferenceFilterSelectionChangeEvent#getAction()
- */
- public Action getAction() {
- return action;
- }
-
-} \ No newline at end of file
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/IDifferenceGroupProvider.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/IDifferenceGroupProvider.java
index 57db01bed..6c616e5d5 100644
--- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/IDifferenceGroupProvider.java
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/IDifferenceGroupProvider.java
@@ -18,7 +18,6 @@ import java.util.List;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.compare.Comparison;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.impl.AbstractDifferenceGroupProvider;
-import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.impl.DefaultGroupProvider;
import org.eclipse.emf.compare.scope.IComparisonScope;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.edit.tree.TreeNode;
@@ -33,8 +32,6 @@ import org.eclipse.emf.edit.tree.TreePackage;
*/
public interface IDifferenceGroupProvider extends Adapter {
- public static IDifferenceGroupProvider DEFAULT = new DefaultGroupProvider();
-
public static IDifferenceGroupProvider EMPTY = new AbstractDifferenceGroupProvider() {
public void setLabel(String label) {
@@ -132,6 +129,8 @@ public interface IDifferenceGroupProvider extends Adapter {
*/
Collection<IDifferenceGroupProvider> getGroupProviders(IComparisonScope scope, Comparison comparison);
+ IDifferenceGroupProvider getDefaultGroupProviders(IComparisonScope scope, Comparison comparison);
+
/**
* Add to the registry the given {@link IDifferenceGroupProvider}.
*
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/IDifferenceGroupProviderChange.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/IDifferenceGroupProviderChange.java
new file mode 100644
index 000000000..78ad840d8
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/IDifferenceGroupProviderChange.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * Copyright (c) 2013 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;
+
+import org.eclipse.emf.compare.rcp.ui.internal.configuration.ICompareEvent;
+
+/**
+ * @author <a href="mailto:mikael.barbero@obeo.fr">Mikael Barbero</a>
+ */
+public interface IDifferenceGroupProviderChange extends ICompareEvent {
+
+ IDifferenceGroupProvider getDifferenceGroupProvider();
+}
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/StructureMergeViewerGrouper.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/StructureMergeViewerGrouper.java
index 950f86b4a..f1a88ef96 100644
--- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/StructureMergeViewerGrouper.java
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/StructureMergeViewerGrouper.java
@@ -15,6 +15,8 @@ import com.google.common.eventbus.EventBus;
import java.util.List;
+import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.impl.DifferenceGroupProviderChange;
+import org.eclipse.emf.compare.rcp.ui.internal.util.SWTUtil;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
@@ -58,18 +60,25 @@ public final class StructureMergeViewerGrouper {
public void setProvider(IDifferenceGroupProvider provider) {
if (this.provider != provider) {
this.provider = provider;
- eventBus.post(provider);
refreshViewers();
+ eventBus.post(new DifferenceGroupProviderChange(provider));
}
}
/**
+ * @return the provider
+ */
+ public IDifferenceGroupProvider getProvider() {
+ return provider;
+ }
+
+ /**
* Refreshes the viewers registered with this grouper. Will try and conserve the expanded tree paths when
* possible.
*/
private void refreshViewers() {
for (TreeViewer viewer : viewers) {
- viewer.refresh();
+ SWTUtil.safeRefresh(viewer, false);
}
}
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/DifferenceGroupProviderChange.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/DifferenceGroupProviderChange.java
new file mode 100644
index 000000000..1cb54257c
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/DifferenceGroupProviderChange.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2013 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.emf.compare.rcp.ui.internal.structuremergeviewer.groups.IDifferenceGroupProvider;
+import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.IDifferenceGroupProviderChange;
+
+/**
+ * @author <a href="mailto:mikael.barbero@obeo.fr">Mikael Barbero</a>
+ */
+public class DifferenceGroupProviderChange implements IDifferenceGroupProviderChange {
+
+ private final IDifferenceGroupProvider differenceGroupProvider;
+
+ public DifferenceGroupProviderChange(IDifferenceGroupProvider differenceGroupProvider) {
+ this.differenceGroupProvider = differenceGroupProvider;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.IDifferenceGroupProviderChange#getDifferenceGroupProvider()
+ */
+ public IDifferenceGroupProvider getDifferenceGroupProvider() {
+ return differenceGroupProvider;
+ }
+
+}
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 04c93aa4e..b158c9132 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,7 +10,10 @@
*******************************************************************************/
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.filter;
+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;
@@ -47,12 +50,35 @@ public class DifferenceGroupRegistryImpl implements Registry {
* Comparison)
*/
public List<IDifferenceGroupProvider> getGroupProviders(IComparisonScope scope, Comparison comparison) {
- Iterable<IDifferenceGroupProvider> providers = filter(map.values(), isGroupProviderActivable(scope,
- comparison));
+ List<IDifferenceGroupProvider> providers = newArrayList(filter(map.values(),
+ isGroupProviderActivable(scope, comparison)));
+ int indexOfDefault = indexOf(providers, instanceOf(DefaultGroupProvider.class));
+ if (indexOfDefault >= 0) {
+ IDifferenceGroupProvider defaultGroupProvider = providers.remove(indexOfDefault);
+ providers.add(0, defaultGroupProvider);
+ }
return ImmutableList.copyOf(providers);
}
/**
+ * {@inheritDoc}
+ *
+ * @see org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.IDifferenceGroupProvider.Registry#getDefaultGroupProviders(org.eclipse.emf.compare.scope.IComparisonScope,
+ * org.eclipse.emf.compare.Comparison)
+ */
+ public IDifferenceGroupProvider getDefaultGroupProviders(IComparisonScope scope, Comparison comparison) {
+ IDifferenceGroupProvider selectedGroupProvider = null;
+ for (IDifferenceGroupProvider dgp : getGroupProviders(scope, comparison)) {
+ if (dgp.defaultSelected()) {
+ if (selectedGroupProvider == null || !(dgp instanceof DefaultGroupProvider)) {
+ selectedGroupProvider = dgp;
+ }
+ }
+ }
+ return selectedGroupProvider;
+ }
+
+ /**
* Returns a predicate that represents the activation condition based on the scope and comparison objects.
*
* @param scope
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/provider/GroupItemProviderAdapter.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/provider/GroupItemProviderAdapter.java
index 7845dcd9a..b066c0cc4 100644
--- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/provider/GroupItemProviderAdapter.java
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/provider/GroupItemProviderAdapter.java
@@ -15,8 +15,10 @@ import java.util.List;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.compare.provider.EMFCompareEditPlugin;
import org.eclipse.emf.compare.provider.IItemDescriptionProvider;
import org.eclipse.emf.compare.provider.IItemStyledLabelProvider;
+import org.eclipse.emf.compare.provider.spec.OverlayImageProvider;
import org.eclipse.emf.compare.provider.utils.IStyledString.IComposedStyledString;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.IDifferenceGroup;
import org.eclipse.emf.ecore.EObject;
@@ -41,6 +43,9 @@ public class GroupItemProviderAdapter extends ItemProviderAdapter implements IEd
/** The group for which we want the item provider. */
private IDifferenceGroup group;
+ /** The overlay provider for the group */
+ private OverlayImageProvider overlayProvider;
+
/**
* Constructor.
*/
@@ -48,6 +53,7 @@ public class GroupItemProviderAdapter extends ItemProviderAdapter implements IEd
super(adapterFactory);
this.parent = parent;
this.group = group;
+ this.overlayProvider = new OverlayImageProvider(EMFCompareEditPlugin.INSTANCE);
}
/**
@@ -66,7 +72,7 @@ public class GroupItemProviderAdapter extends ItemProviderAdapter implements IEd
*/
@Override
public Object getImage(Object object) {
- return group.getImage();
+ return overlayProvider.getComposedImage(object, group.getImage());
}
/**
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/util/SWTUtil.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/util/SWTUtil.java
new file mode 100644
index 000000000..f68aa54f3
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/util/SWTUtil.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * Copyright (c) 2013 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.util;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * Utility class for running operation in the UI-Thread if not already within it.
+ *
+ * @author <a href="mailto:mikael.barbero@obeo.fr">Mikael Barbero</a>
+ */
+public final class SWTUtil {
+
+ private SWTUtil() {
+ // prevent instantiation.
+ }
+
+ /**
+ * Causes the run() method of the runnable to be invoked by the user-interface thread at the next
+ * reasonable opportunity. The caller of this method continues to run in parallel, and is not notified
+ * when the runnable has completed.
+ *
+ * @param runnable
+ * runnable code to run on the user-interface thread.
+ */
+ public static void safeAsyncExec(final Runnable runnable) {
+ if (Display.getCurrent() != null) {
+ Display.getCurrent().asyncExec(runnable);
+ } else {
+ Display.getDefault().asyncExec(runnable);
+ }
+ }
+
+ /**
+ * Causes the run() method of the runnable to be invoked by the user-interface thread at the next
+ * reasonable opportunity. The thread which calls this method is suspended until the runnable completes.
+ *
+ * @param runnable
+ * runnable code to run on the user-interface thread.
+ */
+ public static void safeSyncExec(final Runnable runnable) {
+ if (Display.getCurrent() != null) {
+ runnable.run();
+ } else {
+ Display.getDefault().syncExec(runnable);
+ }
+ }
+
+ /**
+ * Run {@link Viewer#refresh()} on the given viewer.
+ *
+ * @param viewer
+ * the viewer to refresh.
+ * @param async
+ * whether the thread which calls this method is not suspended until the runnable completes.
+ */
+ public static void safeRefresh(final Viewer viewer, boolean async) {
+ Runnable runnable = new Runnable() {
+ public void run() {
+ viewer.refresh();
+ }
+ };
+ if (async) {
+ safeAsyncExec(runnable);
+ } else {
+ safeSyncExec(runnable);
+ }
+ }
+
+ /**
+ * Run {@link Control#redraw()} on the given viewer.
+ *
+ * @param redraw
+ * the control to redraw.
+ * @param async
+ * whether the thread which calls this method is not suspended until the runnable completes.
+ */
+ public static void safeRedraw(final Control control, boolean async) {
+ Runnable runnable = new Runnable() {
+ public void run() {
+ control.redraw();
+ }
+ };
+ if (async) {
+ safeAsyncExec(runnable);
+ } else {
+ safeSyncExec(runnable);
+ }
+ }
+}

Back to the top