Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/EMFCompareStructureMergeViewer.java')
-rw-r--r--plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/EMFCompareStructureMergeViewer.java461
1 files changed, 206 insertions, 255 deletions
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 fd2f346a7..a0e6a6ce2 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
@@ -10,13 +10,17 @@
*******************************************************************************/
package org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer;
+import static com.google.common.base.Predicates.notNull;
+import static com.google.common.collect.Iterables.addAll;
import static com.google.common.collect.Iterables.getFirst;
+import static com.google.common.collect.Iterables.transform;
+import static com.google.common.collect.Lists.newArrayList;
+import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
import com.google.common.eventbus.Subscribe;
-import java.lang.reflect.Field;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
import java.util.Collection;
import java.util.EventObject;
import java.util.Iterator;
@@ -24,12 +28,12 @@ import java.util.List;
import org.eclipse.compare.CompareUI;
import org.eclipse.compare.CompareViewerPane;
+import org.eclipse.compare.CompareViewerSwitchingPane;
import org.eclipse.compare.INavigatable;
import org.eclipse.compare.ITypedElement;
import org.eclipse.compare.internal.CompareHandlerService;
import org.eclipse.compare.structuremergeviewer.ICompareInput;
import org.eclipse.compare.structuremergeviewer.ICompareInputChangeListener;
-import org.eclipse.core.resources.IStorage;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
@@ -40,30 +44,28 @@ import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.command.CommandStack;
import org.eclipse.emf.common.command.CommandStackListener;
import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.common.ui.dialogs.DiagnosticDialog;
import org.eclipse.emf.common.util.BasicMonitor;
import org.eclipse.emf.compare.Comparison;
+import org.eclipse.emf.compare.Diff;
import org.eclipse.emf.compare.EMFCompare;
import org.eclipse.emf.compare.Match;
import org.eclipse.emf.compare.command.ICompareCopyCommand;
import org.eclipse.emf.compare.domain.ICompareEditingDomain;
import org.eclipse.emf.compare.domain.impl.EMFCompareEditingDomain;
-import org.eclipse.emf.compare.ide.ui.internal.EMFCompareIDEUIPlugin;
import org.eclipse.emf.compare.ide.ui.internal.configuration.EMFCompareConfiguration;
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.editor.ComparisonScopeInput;
import org.eclipse.emf.compare.ide.ui.internal.logical.ComparisonScopeBuilder;
-import org.eclipse.emf.compare.ide.ui.internal.logical.IdenticalResourceMinimizer;
-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.logical.IModelResolver;
-import org.eclipse.emf.compare.ide.ui.logical.IStorageProviderAccessor;
+import org.eclipse.emf.compare.ide.ui.internal.util.JFaceUtil;
import org.eclipse.emf.compare.internal.utils.ComparisonUtil;
import org.eclipse.emf.compare.rcp.EMFCompareRCPPlugin;
+import org.eclipse.emf.compare.rcp.ui.internal.configuration.ICompareEditingDomainChange;
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.filters.StructureMergeViewerFilter;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.IDifferenceGroupProvider;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.IDifferenceGroupProviderChange;
@@ -74,14 +76,15 @@ import org.eclipse.emf.compare.scope.IComparisonScope;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.edit.provider.IDisposable;
import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory;
import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory;
import org.eclipse.emf.edit.tree.TreeFactory;
import org.eclipse.emf.edit.tree.TreeNode;
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.ITreeViewerListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
@@ -93,11 +96,6 @@ import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.team.core.subscribers.Subscriber;
-import org.eclipse.team.core.subscribers.SubscriberMergeContext;
-import org.eclipse.team.internal.ui.mapping.ModelCompareEditorInput;
-import org.eclipse.team.ui.synchronize.ISynchronizeParticipant;
-import org.eclipse.team.ui.synchronize.ModelSynchronizeParticipant;
import org.eclipse.ui.actions.ActionFactory;
/**
@@ -138,6 +136,19 @@ public class EMFCompareStructureMergeViewer extends AbstractStructuredViewerWrap
*/
private boolean resourcesShouldBeUnload;
+ private ISelectionChangedListener selectionChangeListener;
+
+ private final Job inputChangedTask = new Job("Compute Model Differences") {
+ @Override
+ public IStatus run(IProgressMonitor monitor) {
+ SubMonitor subMonitor = SubMonitor.convert(monitor, "Computing Model Differences", 100);
+ compareInputChanged((ICompareInput)getInput(), subMonitor.newChild(100));
+ return Status.OK_STATUS;
+ }
+ };
+
+ private CompareToolBar toolBar;
+
/**
* Constructor.
*
@@ -149,7 +160,25 @@ public class EMFCompareStructureMergeViewer extends AbstractStructuredViewerWrap
public EMFCompareStructureMergeViewer(Composite parent, EMFCompareConfiguration config) {
super(parent, config);
- config.getEventBus().register(this);
+ StructureMergeViewerFilter structureMergeViewerFilter = getCompareConfiguration()
+ .getStructureMergeViewerFilter();
+ getViewer().addFilter(structureMergeViewerFilter);
+
+ StructureMergeViewerGrouper structureMergeViewerGrouper = getCompareConfiguration()
+ .getStructureMergeViewerGrouper();
+ structureMergeViewerGrouper.install(getViewer());
+
+ toolBar = new CompareToolBar(structureMergeViewerGrouper, structureMergeViewerFilter,
+ getCompareConfiguration());
+ getViewer().addSelectionChangedListener(toolBar);
+ toolBar.initToolbar(CompareViewerPane.getToolBarManager(parent), getViewer());
+
+ selectionChangeListener = new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ handleSelectionChangedEvent(event);
+ }
+ };
+ addSelectionChangedListener(selectionChangeListener);
fHandlerService = CompareHandlerService.createFor(getCompareConfiguration().getContainer(),
getControl().getShell());
@@ -160,7 +189,11 @@ public class EMFCompareStructureMergeViewer extends AbstractStructuredViewerWrap
setContentProvider(new EMFCompareStructureMergeViewerContentProvider(getCompareConfiguration()
.getAdapterFactory()));
+ undoAction = new UndoAction(null);
+ redoAction = new RedoAction(null);
+
inputChangedTask.setPriority(Job.LONG);
+ config.getEventBus().register(this);
}
/**
@@ -200,8 +233,7 @@ public class EMFCompareStructureMergeViewer extends AbstractStructuredViewerWrap
GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
control.setLayout(layout);
control.setLayoutData(data);
- final TreeViewer treeViewer = new EMFCompareDiffTreeViewer(control, fAdapterFactory,
- getCompareConfiguration());
+ final TreeViewer treeViewer = new EMFCompareDiffTreeViewer(control, getCompareConfiguration());
INavigatable nav = new Navigatable(fAdapterFactory, treeViewer);
control.setData(INavigatable.NAVIGATOR_PROPERTY, nav);
control.setData(CompareUI.COMPARE_VIEWER_TITLE, "Model differences");
@@ -233,82 +265,81 @@ public class EMFCompareStructureMergeViewer extends AbstractStructuredViewerWrap
fHandlerService = CompareHandlerService.createFor(getCompareConfiguration().getContainer(),
treeViewer.getControl().getShell());
- StructureMergeViewerFilter structureMergeViewerFilter = getCompareConfiguration()
- .getStructureMergeViewerFilter();
- structureMergeViewerFilter.install(treeViewer);
-
- StructureMergeViewerGrouper structureMergeViewerGrouper = getCompareConfiguration()
- .getStructureMergeViewerGrouper();
- structureMergeViewerGrouper.install(treeViewer);
-
- toolBar = new CompareToolBar(structureMergeViewerGrouper, structureMergeViewerFilter,
- getCompareConfiguration());
- treeViewer.addSelectionChangedListener(toolBar);
- toolBar.initToolbar(CompareViewerPane.getToolBarManager(parent), treeViewer);
-
return ControlAndViewer.create(control, treeViewer);
}
@Subscribe
- public void handleGroupProviderSelectionChange(IDifferenceGroupProviderChange event) {
- differenceGroupProvider = event.getDifferenceGroupProvider();
+ public void handleEditingDomainChange(ICompareEditingDomainChange event) {
+ editingDomainChange(event.getOldValue(), event.getNewValue());
+ }
- Adapter root = (Adapter)getViewer().getInput();
- if (root != null) {
- TreeNode target = (TreeNode)root.getTarget();
- registerDifferenceGroupProvider(target, differenceGroupProvider);
- }
+ protected void editingDomainChange(ICompareEditingDomain oldValue, ICompareEditingDomain newValue) {
+ if (newValue != oldValue) {
+ if (oldValue != null) {
+ oldValue.getCommandStack().removeCommandStackListener(this);
+ }
- SWTUtil.safeAsyncExec(new Runnable() {
- public void run() {
- ((EMFCompareDiffTreeViewer)getViewer()).createChildrenSilently(getViewer().getTree());
- treeRuler.computeConsequences();
- treeRuler.redraw();
+ if (newValue != null) {
+ newValue.getCommandStack().addCommandStackListener(this);
+ // setLeftDirty(newValue.getCommandStack().isLeftSaveNeeded());
+ // setRightDirty(newValue.getCommandStack().isRightSaveNeeded());
}
- });
+
+ undoAction.setEditingDomain(newValue);
+ redoAction.setEditingDomain(newValue);
+ }
}
- /**
- * @return the differenceGroupProvider
- */
- public IDifferenceGroupProvider getSelectedDifferenceGroupProvider() {
- if (differenceGroupProvider == null) {
- differenceGroupProvider = getCompareConfiguration().getStructureMergeViewerGrouper()
- .getProvider();
+ private void refreshTitle() {
+ Composite parent = getControl().getParent();
+ if (parent instanceof CompareViewerSwitchingPane) {
+ int displayedDiff = JFaceUtil.filterVisibleElement(getViewer(), IS_DIFF).size();
+ Comparison comparison = getCompareConfiguration().getComparison();
+ if (comparison != null) {
+ int computedDiff = comparison.getDifferences().size();
+ int filteredDiff = computedDiff - displayedDiff;
+ ((CompareViewerSwitchingPane)parent).setTitleArgument(computedDiff + " differences – "
+ + filteredDiff + " differences filtered from view");
+ }
}
- 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);
+ private static final Predicate<? super Object> IS_DIFF = new Predicate<Object>() {
+ public boolean apply(Object object) {
+ return getDataOfTreeNodeOfAdapter(object) instanceof Diff;
}
- eAdapters.add(differenceGroupProvider);
+ };
- treeRuler.computeConsequences();
- SWTUtil.safeRedraw(treeRuler, true);
+ private static EObject getDataOfTreeNodeOfAdapter(Object object) {
+ EObject data = null;
+ if (object instanceof Adapter) {
+ Notifier target = ((Adapter)object).getTarget();
+ if (target instanceof TreeNode) {
+ data = ((TreeNode)target).getData();
+ }
+ }
+ return data;
}
+ private static final Function<Object, EObject> ADAPTER__TARGET__DATA = new Function<Object, EObject>() {
+ public EObject apply(Object object) {
+ return getDataOfTreeNodeOfAdapter(object);
+ }
+ };
+
@Subscribe
public void mergePreviewModeChange(IMergePreviewModeChange event) {
- treeRuler.computeConsequences();
- treeRuler.redraw();
+ redrawFromSelection(getSelection());
}
- /**
- * {@inheritDoc}
- *
- * @see org.eclipse.jface.viewers.Viewer#fireSelectionChanged(SelectionChangedEvent)
- */
- @Override
- protected void fireSelectionChanged(SelectionChangedEvent event) {
- super.fireSelectionChanged(event);
- treeRuler.selectionChanged(event);
- treeRuler.redraw();
+ @Subscribe
+ public void handleDifferenceFilterChange(IDifferenceFilterChange event) {
+ SWTUtil.safeRefresh(this, true);
+ }
+
+ @Subscribe
+ public void handleDifferenceGroupProviderChange(IDifferenceGroupProviderChange event) {
+ SWTUtil.safeRefresh(this, true);
}
/**
@@ -351,6 +382,7 @@ public class EMFCompareStructureMergeViewer extends AbstractStructuredViewerWrap
ICompareInput ci = (ICompareInput)input;
ci.removeCompareInputChangeListener(fCompareInputChangeListener);
}
+ removeSelectionChangedListener(selectionChangeListener);
getViewer().removeSelectionChangedListener(toolBar);
compareInputChanged((ICompareInput)null);
treeRuler.handleDispose();
@@ -376,19 +408,13 @@ public class EMFCompareStructureMergeViewer extends AbstractStructuredViewerWrap
if (mostRecentCommand instanceof ICompareCopyCommand) {
Collection<?> affectedObjects = mostRecentCommand.getAffectedObjects();
- SWTUtil.safeAsyncExec(new Runnable() {
- public void run() {
- treeRuler.computeConsequences();
- ((EMFCompareDiffTreeViewer)getViewer()).createChildrenSilently(getViewer().getTree());
- treeRuler.redraw();
- }
- });
if (!affectedObjects.isEmpty()) {
// MUST NOT call a setSelection with a list, o.e.compare does not handle it (cf
// org.eclipse.compare.CompareEditorInput#getElement(ISelection))
Object first = getFirst(affectedObjects, null);
if (first instanceof EObject) {
- IDifferenceGroupProvider groupProvider = getSelectedDifferenceGroupProvider();
+ IDifferenceGroupProvider groupProvider = getCompareConfiguration()
+ .getStructureMergeViewerGrouper().getProvider();
Iterable<TreeNode> treeNodes = groupProvider.getTreeNodes((EObject)first);
TreeNode treeNode = getFirst(treeNodes, null);
if (treeNode != null) {
@@ -409,19 +435,6 @@ public class EMFCompareStructureMergeViewer extends AbstractStructuredViewerWrap
}
- private Job inputChangedTask = new Job("Compute Model Differences") {
- @Override
- public IStatus run(IProgressMonitor monitor) {
- SubMonitor subMonitor = SubMonitor.convert(monitor, "Computing Model Differences", 100);
- compareInputChanged((ICompareInput)getInput(), subMonitor.newChild(100));
- return Status.OK_STATUS;
- }
- };
-
- private CompareToolBar toolBar;
-
- private IDifferenceGroupProvider differenceGroupProvider;
-
/**
* Triggered by fCompareInputChangeListener and {@link #inputChanged(Object, Object)}.
*/
@@ -438,16 +451,10 @@ public class EMFCompareStructureMergeViewer extends AbstractStructuredViewerWrap
}
void compareInputChanged(CompareInputAdapter input, IProgressMonitor monitor) {
- ICompareEditingDomain editingDomain = getCompareConfiguration().getEditingDomain();
- editingDomain.getCommandStack().addCommandStackListener(this);
-
compareInputChanged(null, (Comparison)input.getComparisonObject());
}
void compareInputChanged(ComparisonScopeInput input, IProgressMonitor monitor) {
- ICompareEditingDomain editingDomain = getCompareConfiguration().getEditingDomain();
- editingDomain.getCommandStack().addCommandStackListener(this);
-
EMFCompare comparator = getCompareConfiguration().getEMFComparator();
IComparisonScope comparisonScope = input.getComparisonScope();
@@ -466,8 +473,13 @@ public class EMFCompareStructureMergeViewer extends AbstractStructuredViewerWrap
// this will set to the EMPTY difference group provider, but necessary to avoid NPE while setting
// input.
- treeNode.eAdapters().add(getSelectedDifferenceGroupProvider());
+ IDifferenceGroupProvider groupProvider = getCompareConfiguration()
+ .getStructureMergeViewerGrouper().getProvider();
+ treeNode.eAdapters().add(groupProvider);
+ // must set the input now in a synchronous mean. It will be used in the #setComparisonAndScope
+ // afterwards during the initialization of StructureMergeViewerFilter and
+ // StructureMergeViewerGrouper.
SWTUtil.safeSyncExec(new Runnable() {
public void run() {
getViewer().setInput(input);
@@ -478,15 +490,18 @@ public class EMFCompareStructureMergeViewer extends AbstractStructuredViewerWrap
SWTUtil.safeAsyncExec(new Runnable() {
public void run() {
- ((EMFCompareDiffTreeViewer)getViewer()).createChildrenSilently(getViewer().getTree());
- ((EMFCompareDiffTreeViewer)getViewer()).initialSelection();
- }
- });
+ // the tree has now a proper group provider and its input, so we can create the child
+ // silently.
+ ((EMFCompareDiffTreeViewer)getViewer()).createChildrenSilently();
- ICompareEditingDomain editingDomain = getCompareConfiguration().getEditingDomain();
+ // title is not initialized as the comparison was set after the refresh caused by the
+ // initialization of the viewer filters and the groupe providers.
+ refreshTitle();
- undoAction = new UndoAction(editingDomain);
- redoAction = new RedoAction(editingDomain);
+ // XXX: fixme!!
+ // ((EMFCompareDiffTreeViewer)getViewer()).initialSelection();
+ }
+ });
SWTUtil.safeAsyncExec(new Runnable() {
public void run() {
@@ -520,7 +535,8 @@ public class EMFCompareStructureMergeViewer extends AbstractStructuredViewerWrap
IComparisonScope scope = null;
try {
- scope = buildComparisonScope(left, right, origin, subMonitor.newChild(85));
+ scope = ComparisonScopeBuilder.create(getCompareConfiguration().getContainer(), left,
+ right, origin, subMonitor.newChild(85));
} catch (Exception e) {
ExceptionUtil.handleException(e, getCompareConfiguration(), true);
return;
@@ -538,79 +554,64 @@ public class EMFCompareStructureMergeViewer extends AbstractStructuredViewerWrap
final ResourceSet rightResourceSet = (ResourceSet)scope.getRight();
final ResourceSet originResourceSet = (ResourceSet)scope.getOrigin();
- if (getCompareConfiguration() != null) {
- ICompareEditingDomain editingDomain = getCompareConfiguration().getEditingDomain();
- if (editingDomain != null) {
- editingDomain.getCommandStack().removeCommandStackListener(this);
- if (editingDomain instanceof IDisposable) {
- ((IDisposable)editingDomain).dispose();
- }
- }
-
- editingDomain = EMFCompareEditingDomain.create(leftResourceSet, rightResourceSet,
- originResourceSet);
- editingDomain.getCommandStack().addCommandStackListener(this);
- getCompareConfiguration().setEditingDomain(editingDomain);
- }
+ ICompareEditingDomain editingDomain = EMFCompareEditingDomain.create(leftResourceSet,
+ rightResourceSet, originResourceSet);
+ getCompareConfiguration().setEditingDomain(editingDomain);
compareInputChanged(scope, compareResult);
}
} else {
- ResourceSet leftResourceSet = null;
- ResourceSet rightResourceSet = null;
- ResourceSet originResourceSet = null;
-
- if (getCompareConfiguration().getComparison() != null) {
- Comparison comparison = getCompareConfiguration().getComparison();
- Iterator<Match> matchIt = comparison.getMatches().iterator();
- if (comparison.isThreeWay()) {
- while (matchIt.hasNext()
- && (leftResourceSet == null || rightResourceSet == null || originResourceSet == null)) {
- Match match = matchIt.next();
- if (leftResourceSet == null) {
- leftResourceSet = getResourceSet(match.getLeft());
- }
- if (rightResourceSet == null) {
- rightResourceSet = getResourceSet(match.getRight());
- }
- if (originResourceSet == null) {
- originResourceSet = getResourceSet(match.getOrigin());
- }
+ compareInputChangedToNull();
+ }
+ }
+
+ private void compareInputChangedToNull() {
+ ResourceSet leftResourceSet = null;
+ ResourceSet rightResourceSet = null;
+ ResourceSet originResourceSet = null;
+
+ if (getCompareConfiguration().getComparison() != null) {
+ Comparison comparison = getCompareConfiguration().getComparison();
+ Iterator<Match> matchIt = comparison.getMatches().iterator();
+ if (comparison.isThreeWay()) {
+ while (matchIt.hasNext()
+ && (leftResourceSet == null || rightResourceSet == null || originResourceSet == null)) {
+ Match match = matchIt.next();
+ if (leftResourceSet == null) {
+ leftResourceSet = getResourceSet(match.getLeft());
}
- } else {
- while (matchIt.hasNext() && (leftResourceSet == null || rightResourceSet == null)) {
- Match match = matchIt.next();
- if (leftResourceSet == null) {
- leftResourceSet = getResourceSet(match.getLeft());
- }
- if (rightResourceSet == null) {
- rightResourceSet = getResourceSet(match.getRight());
- }
+ if (rightResourceSet == null) {
+ rightResourceSet = getResourceSet(match.getRight());
+ }
+ if (originResourceSet == null) {
+ originResourceSet = getResourceSet(match.getOrigin());
}
}
- }
-
- ICompareEditingDomain editingDomain = getCompareConfiguration().getEditingDomain();
- if (editingDomain != null) {
- editingDomain.getCommandStack().removeCommandStackListener(this);
- getCompareConfiguration().setEditingDomain(null);
- if (editingDomain instanceof IDisposable) {
- ((IDisposable)editingDomain).dispose();
+ } else {
+ while (matchIt.hasNext() && (leftResourceSet == null || rightResourceSet == null)) {
+ Match match = matchIt.next();
+ if (leftResourceSet == null) {
+ leftResourceSet = getResourceSet(match.getLeft());
+ }
+ if (rightResourceSet == null) {
+ rightResourceSet = getResourceSet(match.getRight());
+ }
}
- editingDomain = null;
}
+ }
- if (resourcesShouldBeUnload) {
- unload(leftResourceSet);
- unload(rightResourceSet);
- unload(originResourceSet);
- }
+ editingDomainChange(getCompareConfiguration().getEditingDomain(), null);
- if (getCompareConfiguration() != null) {
- getCompareConfiguration().dispose();
- }
- getViewer().setInput(null);
+ if (resourcesShouldBeUnload) {
+ unload(leftResourceSet);
+ unload(rightResourceSet);
+ unload(originResourceSet);
}
+
+ if (getCompareConfiguration() != null) {
+ getCompareConfiguration().dispose();
+ }
+ getViewer().setInput(null);
}
private void reportErrors(final Comparison comparison) {
@@ -624,86 +625,6 @@ public class EMFCompareStructureMergeViewer extends AbstractStructuredViewerWrap
}
}
- /**
- * Constructs the comparison scope corresponding to the given typed elements.
- *
- * @param left
- * Left of the compared elements.
- * @param right
- * Right of the compared elements.
- * @param origin
- * Common ancestor of the <code>left</code> and <code>right</code> compared elements.
- * @param monitor
- * Monitor to report progress on.
- * @return The created comparison scope.
- */
- private IComparisonScope buildComparisonScope(ITypedElement left, ITypedElement right,
- ITypedElement origin, IProgressMonitor monitor) {
- IStorageProviderAccessor storageAccessor = null;
- if (getSubscriber() != null) {
- storageAccessor = new SubscriberStorageAccessor(getSubscriber());
- }
- IStorage leftStorage = PlatformElementUtil.findFile(left);
- if (leftStorage == null) {
- leftStorage = StreamAccessorStorage.fromTypedElement(left);
- }
- IModelResolver resolver = EMFCompareIDEUIPlugin.getDefault().getModelResolverRegistry()
- .getBestResolverFor(leftStorage);
- final ComparisonScopeBuilder scopeBuilder = new ComparisonScopeBuilder(resolver,
- new IdenticalResourceMinimizer(), storageAccessor);
- return scopeBuilder.build(left, right, origin, monitor);
- }
-
- /**
- * Team left us with absolutely no way to determine whether our supplied input is the result of a
- * synchronization or not.
- * <p>
- * In order to properly resolve the logical model of the resource currently being compared we need to know
- * what "other" resources were part of its logical model, and we need to know the revisions of these
- * resources we are to load. All of this has already been computed by Team, but it would not let us know.
- * This method uses discouraged means to get around this "black box" locking from Team.
- * </p>
- * <p>
- * The basic need here is to retrieve the Subscriber from this point. We have a lot of accessible
- * variables, the two most important being the CompareConfiguration and ICompareInput... I could find no
- * way around the privileged access to the private ModelCompareEditorInput.participant field. There does
- * not seem to be any adapter (or Platform.getAdapterManager().getAdapter(...)) that would allow for this,
- * so I'm taking the long way 'round.
- * </p>
- *
- * @return The subscriber used for this comparison if any could be found, <code>null</code> otherwise.
- */
- @SuppressWarnings("restriction")
- private Subscriber getSubscriber() {
- if (getCompareConfiguration().getContainer() instanceof ModelCompareEditorInput) {
- final ModelCompareEditorInput modelInput = (ModelCompareEditorInput)getCompareConfiguration()
- .getContainer();
- ISynchronizeParticipant participant = null;
- try {
- final Field field = ModelCompareEditorInput.class.getDeclaredField("participant"); //$NON-NLS-1$
- AccessController.doPrivileged(new PrivilegedAction<Object>() {
- public Object run() {
- field.setAccessible(true);
- return null;
- }
- });
- participant = (ISynchronizeParticipant)field.get(modelInput);
- } catch (NoSuchFieldException e) {
- // Swallow this, this private field was there at least from 3.5 to 4.3
- } catch (IllegalArgumentException e) {
- // Cannot happen
- } catch (IllegalAccessException e) {
- // "Should" not happen, but ignore it anyway
- }
- if (participant instanceof ModelSynchronizeParticipant
- && ((ModelSynchronizeParticipant)participant).getContext() instanceof SubscriberMergeContext) {
- return ((SubscriberMergeContext)((ModelSynchronizeParticipant)participant).getContext())
- .getSubscriber();
- }
- }
- return null;
- }
-
private static void unload(ResourceSet resourceSet) {
if (resourceSet != null) {
for (Resource resource : resourceSet.getResources()) {
@@ -730,7 +651,37 @@ public class EMFCompareStructureMergeViewer extends AbstractStructuredViewerWrap
*/
@Override
protected void internalRefresh(Object element) {
- getViewer().refresh();
+ SWTUtil.safeSyncExec(new Runnable() {
+ public void run() {
+ getViewer().refresh();
+ refreshTitle();
+
+ ((EMFCompareDiffTreeViewer)getViewer()).createChildrenSilently();
+ redrawFromSelection(getSelection());
+ }
+ });
+ }
+
+ private void handleSelectionChangedEvent(SelectionChangedEvent event) {
+ redrawFromSelection(event.getSelection());
+ }
+
+ protected void redrawFromSelection(ISelection selection) {
+ EObject eObject = getFirst(getSelectedComparisonObject(selection), null);
+ if (eObject != null) {
+ treeRuler.computeConsequences(eObject);
+ getControl().redraw();
+ }
+ }
+ private static List<EObject> getSelectedComparisonObject(ISelection selection) {
+ List<EObject> ret = newArrayList();
+ if (selection instanceof IStructuredSelection) {
+ List<?> selectedObjects = ((IStructuredSelection)selection).toList();
+ Iterable<EObject> data = transform(selectedObjects, ADAPTER__TARGET__DATA);
+ Iterable<EObject> notNullData = Iterables.filter(data, notNull());
+ addAll(ret, notNullData);
+ }
+ return ret;
}
}

Back to the top