diff options
author | Mikaël Barbero | 2013-04-26 13:56:33 +0000 |
---|---|---|
committer | Mikaël Barbero | 2013-04-26 13:56:33 +0000 |
commit | 99272ad25efb56e19fe65eb9dd58026582475876 (patch) | |
tree | 984a9f2df952974f9be951621a7973bb1a626490 | |
parent | 3d5a02981db7b589ba91b9dec91efeda9aa03e69 (diff) | |
download | org.eclipse.emf.compare-99272ad25efb56e19fe65eb9dd58026582475876.tar.gz org.eclipse.emf.compare-99272ad25efb56e19fe65eb9dd58026582475876.tar.xz org.eclipse.emf.compare-99272ad25efb56e19fe65eb9dd58026582475876.zip |
[406445] copy all should also work in 2 ways
Previously, it was only able to do its work on 3 ways, or on 2 ways from
left to right. The CopyAllNonConflictingCommand has been deprecated as
long as it was containing a broken filter that should be done
externally. Without this filter the Command become unnecessary.
4 files changed, 75 insertions, 15 deletions
diff --git a/plugins/org.eclipse.emf.compare.edit/src/org/eclipse/emf/compare/command/impl/CopyAllNonConflictingCommand.java b/plugins/org.eclipse.emf.compare.edit/src/org/eclipse/emf/compare/command/impl/CopyAllNonConflictingCommand.java index 1c8cfebee..1c989c99b 100644 --- a/plugins/org.eclipse.emf.compare.edit/src/org/eclipse/emf/compare/command/impl/CopyAllNonConflictingCommand.java +++ b/plugins/org.eclipse.emf.compare.edit/src/org/eclipse/emf/compare/command/impl/CopyAllNonConflictingCommand.java @@ -31,8 +31,10 @@ import org.eclipse.emf.ecore.change.util.ChangeRecorder; * LEFT if copying from left to right) and <b>not</b> in a conflicting state.
* </p>
*
+ * @deprecated should use {@link CopyCommand} instead and give already filtered differences.
* @author <a href="mailto:laurent.goubet@obeo.fr">Laurent Goubet</a>
*/
+@Deprecated
public class CopyAllNonConflictingCommand extends AbstractCopyCommand {
/**
diff --git a/plugins/org.eclipse.emf.compare.edit/src/org/eclipse/emf/compare/domain/ICompareEditingDomain.java b/plugins/org.eclipse.emf.compare.edit/src/org/eclipse/emf/compare/domain/ICompareEditingDomain.java index 649d9e833..d798272ed 100644 --- a/plugins/org.eclipse.emf.compare.edit/src/org/eclipse/emf/compare/domain/ICompareEditingDomain.java +++ b/plugins/org.eclipse.emf.compare.edit/src/org/eclipse/emf/compare/domain/ICompareEditingDomain.java @@ -41,6 +41,7 @@ public interface ICompareEditingDomain { /** * @since 3.0 */ + @Deprecated Command createCopyAllNonConflictingCommand(List<? extends Diff> differences, boolean leftToRight, IMerger.Registry mergerRegistry); 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 a2b9b2e1c..56d49d20b 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 @@ -10,9 +10,15 @@ *******************************************************************************/ package org.eclipse.emf.compare.ide.ui.internal.contentmergeviewer; +import static com.google.common.collect.Iterables.filter; + +import com.google.common.base.Predicate; +import com.google.common.collect.ImmutableList; + import java.util.Collection; import java.util.EventObject; import java.util.Iterator; +import java.util.List; import java.util.ResourceBundle; import java.util.concurrent.atomic.AtomicBoolean; @@ -25,9 +31,10 @@ import org.eclipse.compare.internal.Utilities; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.emf.common.command.Command; import org.eclipse.emf.common.command.CommandStackListener; -import org.eclipse.emf.common.util.EList; import org.eclipse.emf.compare.Comparison; import org.eclipse.emf.compare.Diff; +import org.eclipse.emf.compare.DifferenceSource; +import org.eclipse.emf.compare.DifferenceState; import org.eclipse.emf.compare.domain.ICompareEditingDomain; import org.eclipse.emf.compare.ide.ui.internal.contentmergeviewer.util.DynamicObject; import org.eclipse.emf.compare.ide.ui.internal.contentmergeviewer.util.EMFCompareColor; @@ -42,6 +49,7 @@ import org.eclipse.emf.compare.rcp.ui.internal.mergeviewer.IMergeViewer.MergeVie import org.eclipse.emf.compare.rcp.ui.internal.mergeviewer.item.IMergeViewerItem; import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.IDifferenceFilter; import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.impl.SubDiffElementsFilter; +import org.eclipse.emf.compare.utils.EMFComparePredicates; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.ActionContributionItem; import org.eclipse.jface.action.ToolBarManager; @@ -361,14 +369,34 @@ public abstract class EMFCompareContentMergeViewer extends ContentMergeViewer im * @see org.eclipse.compare.contentmergeviewer.ContentMergeViewer#copy(boolean) */ @Override - protected void copy(boolean leftToRight) { - EList<Diff> differences = getComparison().getDifferences(); + protected void copy(final boolean leftToRight) { + final List<Diff> differences; + + if (getComparison().isThreeWay()) { + differences = ImmutableList.copyOf(filter(getComparison().getDifferences(), + new Predicate<Diff>() { + public boolean apply(Diff diff) { + final boolean unresolved = diff.getState() == DifferenceState.UNRESOLVED; + final boolean nonConflictual = diff.getConflict() == null; + final boolean fromLeftToRight = leftToRight + && diff.getSource() == DifferenceSource.LEFT; + final boolean fromRightToLeft = !leftToRight + && diff.getSource() == DifferenceSource.RIGHT; + return unresolved && nonConflictual && (fromLeftToRight || fromRightToLeft); + } + })); + } else { + differences = ImmutableList.copyOf(filter(getComparison().getDifferences(), EMFComparePredicates + .hasState(DifferenceState.UNRESOLVED))); + } - final Command copyCommand = getEditingDomain().createCopyAllNonConflictingCommand(differences, - leftToRight, EMFCompareRCPPlugin.getDefault().getMergerRegistry()); + if (differences.size() > 0) { + final Command copyCommand = getEditingDomain().createCopyCommand(differences, leftToRight, + EMFCompareRCPPlugin.getDefault().getMergerRegistry()); - getEditingDomain().getCommandStack().execute(copyCommand); - refresh(); + getEditingDomain().getCommandStack().execute(copyCommand); + refresh(); + } } /** 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 55a381550..668e7f144 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 @@ -10,10 +10,15 @@ *******************************************************************************/ package org.eclipse.emf.compare.ide.ui.internal.contentmergeviewer.text; +import static com.google.common.collect.Iterables.filter; + +import com.google.common.base.Predicate; +import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import java.util.Collections; import java.util.EventObject; +import java.util.List; import java.util.ResourceBundle; import java.util.Set; @@ -32,6 +37,7 @@ import org.eclipse.emf.compare.AttributeChange; import org.eclipse.emf.compare.Comparison; import org.eclipse.emf.compare.Conflict; import org.eclipse.emf.compare.Diff; +import org.eclipse.emf.compare.DifferenceSource; import org.eclipse.emf.compare.DifferenceState; import org.eclipse.emf.compare.Match; import org.eclipse.emf.compare.command.ICompareCopyCommand; @@ -40,6 +46,7 @@ import org.eclipse.emf.compare.ide.ui.internal.contentmergeviewer.util.DynamicOb import org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.provider.AttributeChangeNode; import org.eclipse.emf.compare.rcp.EMFCompareRCPPlugin; import org.eclipse.emf.compare.rcp.ui.internal.EMFCompareConstants; +import org.eclipse.emf.compare.utils.EMFComparePredicates; import org.eclipse.emf.compare.utils.IEqualityHelper; import org.eclipse.emf.compare.utils.ReferenceUtil; import org.eclipse.emf.ecore.EAttribute; @@ -125,22 +132,44 @@ public class EMFCompareTextMergeViewer extends TextMergeViewer implements IPrope } /** + * @return the fComparison + */ + protected final Comparison getComparison() { + return (Comparison)getCompareConfiguration().getProperty(EMFCompareConstants.COMPARE_RESULT); + } + + /** * {@inheritDoc} * * @see org.eclipse.compare.contentmergeviewer.TextMergeViewer#copy(boolean) */ @Override - protected void copy(boolean leftToRight) { - Object input = getInput(); - if (input instanceof AttributeChangeNode) { - final AttributeChange attributeChange = ((AttributeChangeNode)input).getTarget(); - final Comparison comparison = attributeChange.getMatch().getComparison(); + protected void copy(final boolean leftToRight) { + final List<Diff> differences; + + if (getComparison().isThreeWay()) { + differences = ImmutableList.copyOf(filter(getComparison().getDifferences(), + new Predicate<Diff>() { + public boolean apply(Diff diff) { + final boolean unresolved = diff.getState() == DifferenceState.UNRESOLVED; + final boolean nonConflictual = diff.getConflict() == null; + final boolean fromLeftToRight = leftToRight + && diff.getSource() == DifferenceSource.LEFT; + final boolean fromRightToLeft = !leftToRight + && diff.getSource() == DifferenceSource.RIGHT; + return unresolved && nonConflictual && (fromLeftToRight || fromRightToLeft); + } + })); + } else { + differences = ImmutableList.copyOf(filter(getComparison().getDifferences(), EMFComparePredicates + .hasState(DifferenceState.UNRESOLVED))); + } - final Command copyCommand = getEditingDomain().createCopyAllNonConflictingCommand( - comparison.getDifferences(), leftToRight, + if (differences.size() > 0) { + final Command copyCommand = getEditingDomain().createCopyCommand(differences, leftToRight, EMFCompareRCPPlugin.getDefault().getMergerRegistry()); - getEditingDomain().getCommandStack().execute(copyCommand); + getEditingDomain().getCommandStack().execute(copyCommand); refresh(); } } |