diff options
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);
+ }
+ }
+}
|