diff options
Diffstat (limited to 'plugins/org.eclipse.emf.compare.rcp.ui')
8 files changed, 332 insertions, 1 deletions
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/icons/full/toolb16/accept_change.gif b/plugins/org.eclipse.emf.compare.rcp.ui/icons/full/toolb16/accept_change.gif Binary files differnew file mode 100644 index 000000000..23c97f09e --- /dev/null +++ b/plugins/org.eclipse.emf.compare.rcp.ui/icons/full/toolb16/accept_change.gif diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/icons/full/toolb16/reject_change.gif b/plugins/org.eclipse.emf.compare.rcp.ui/icons/full/toolb16/reject_change.gif Binary files differnew file mode 100644 index 000000000..1aca259db --- /dev/null +++ b/plugins/org.eclipse.emf.compare.rcp.ui/icons/full/toolb16/reject_change.gif diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/plugin.properties b/plugins/org.eclipse.emf.compare.rcp.ui/plugin.properties index f29dc9cca..8dbc9d9dc 100644 --- a/plugins/org.eclipse.emf.compare.rcp.ui/plugin.properties +++ b/plugins/org.eclipse.emf.compare.rcp.ui/plugin.properties @@ -13,4 +13,12 @@ providerName = Eclipse Modeling Project save.model.label = Save Comparison Model save.model.tooltip = Save Comparison Model -save.model.command.name = EMF Compare Save Comparison Model
\ No newline at end of file +save.model.command.name = EMF Compare Save Comparison Model + +accept.change = Accept Change +accept.change.tooltip = Accept Change +accept.change.command.name = EMF Compare Accept Change + +reject.change = Reject Change +reject.change.tooltip = Reject Change +reject.change.command.name = EMF Compare Reject Change
\ No newline at end of file diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/plugin.xml b/plugins/org.eclipse.emf.compare.rcp.ui/plugin.xml index 015ea8072..f56288a62 100644 --- a/plugins/org.eclipse.emf.compare.rcp.ui/plugin.xml +++ b/plugins/org.eclipse.emf.compare.rcp.ui/plugin.xml @@ -89,6 +89,30 @@ allPopups="false" locationURI="toolbar:org.eclipse.emf.compare.structuremergeviewer.toolbar"> <command + commandId="org.eclipse.emf.compare.rcp.ui.acceptChange" + icon="icons/full/toolb16/accept_change.gif" + label="%accept.change" + style="push" + tooltip="%accept.change.tooltip"> + <visibleWhen + checkEnabled="true"> + </visibleWhen> + </command> + <command + commandId="org.eclipse.emf.compare.rcp.ui.rejectChange" + icon="icons/full/toolb16/reject_change.gif" + label="%reject.change" + style="push" + tooltip="%reject.change.tooltip"> + <visibleWhen + checkEnabled="true"> + </visibleWhen> + </command> + <separator + name="org.eclipse.emf.compare.rcp.ui.separatorSaveModel" + visible="true"> + </separator> + <command commandId="org.eclipse.emf.compare.rcp.ui.saveComparisonModel" icon="icons/full/toolb16/saveas_edit.gif" label="%save.model.name" @@ -100,6 +124,14 @@ <extension point="org.eclipse.ui.commands"> <command + id="org.eclipse.emf.compare.rcp.ui.acceptChange" + name="%accept.change.command.name"> + </command> + <command + id="org.eclipse.emf.compare.rcp.ui.rejectChange" + name="%reject.change.command.name"> + </command> + <command id="org.eclipse.emf.compare.rcp.ui.saveComparisonModel" name="%save.model.command.name"> </command> @@ -107,6 +139,30 @@ <extension point="org.eclipse.ui.handlers"> <handler + class="org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.handler.AcceptChange" + commandId="org.eclipse.emf.compare.rcp.ui.acceptChange"> + <activeWhen> + <with + variable="activeEditor"> + <test + property="emfcompare.hasReadOnlySide"> + </test> + </with> + </activeWhen> + </handler> + <handler + class="org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.handler.RejectChange" + commandId="org.eclipse.emf.compare.rcp.ui.rejectChange"> + <activeWhen> + <with + variable="activeEditor"> + <test + property="emfcompare.hasReadOnlySide"> + </test> + </with> + </activeWhen> + </handler> + <handler class="org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.handler.SaveComparisonModel" commandId="org.eclipse.emf.compare.rcp.ui.saveComparisonModel"> <enabledWhen> @@ -129,5 +185,12 @@ properties="isSaveable" type="java.lang.Object"> </propertyTester> + <propertyTester + class="org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.handler.AcceptRejectChangePropertyTester" + id="org.eclipse.emf.compare.rcp.ui.hasReadOnlySide" + namespace="emfcompare" + properties="hasReadOnlySide" + type="java.lang.Object"> + </propertyTester> </extension> </plugin> diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/handler/AcceptChange.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/handler/AcceptChange.java new file mode 100644 index 000000000..ea87eaa89 --- /dev/null +++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/handler/AcceptChange.java @@ -0,0 +1,35 @@ +/******************************************************************************* + * 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.handler; + +import static org.eclipse.emf.compare.utils.EMFComparePredicates.fromSide; + +import org.eclipse.emf.compare.Diff; +import org.eclipse.emf.compare.DifferenceSource; + +/** + * Handler that manages a merge of a difference in case of one side of the comparison is in read-only mode. + * + * @author <a href="mailto:axel.richard@obeo.fr">Axel Richard</a> + * @since 3.0 + */ +public class AcceptChange extends AcceptRejectChange { + + @Override + protected boolean isCopyDiffCase(Diff diff, boolean leftToRight) { + if (leftToRight) { + return fromSide(DifferenceSource.LEFT).apply(diff); + } else { + return fromSide(DifferenceSource.RIGHT).apply(diff); + } + } + +} diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/handler/AcceptRejectChange.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/handler/AcceptRejectChange.java new file mode 100644 index 000000000..cea793d0b --- /dev/null +++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/handler/AcceptRejectChange.java @@ -0,0 +1,164 @@ +package org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.handler; + +import static com.google.common.collect.Iterables.addAll; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import org.eclipse.compare.CompareConfiguration; +import org.eclipse.compare.CompareEditorInput; +import org.eclipse.compare.CompareNavigator; +import org.eclipse.compare.ICompareNavigator; +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; +import org.eclipse.emf.common.command.Command; +import org.eclipse.emf.common.notify.Adapter; +import org.eclipse.emf.common.notify.Notifier; +import org.eclipse.emf.compare.Diff; +import org.eclipse.emf.compare.DifferenceState; +import org.eclipse.emf.compare.command.ICompareCopyCommand; +import org.eclipse.emf.compare.domain.ICompareEditingDomain; +import org.eclipse.emf.compare.internal.merge.IMergeData; +import org.eclipse.emf.compare.internal.merge.MergeDataAdapter; +import org.eclipse.emf.compare.rcp.EMFCompareRCPPlugin; +import org.eclipse.emf.compare.rcp.ui.internal.EMFCompareConstants; +import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.IDifferenceFilter; +import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.impl.CascadingDifferencesFilter; +import org.eclipse.emf.compare.utils.DiffUtil; +import org.eclipse.emf.ecore.change.util.ChangeRecorder; +import org.eclipse.emf.ecore.util.EcoreUtil; +import org.eclipse.emf.edit.command.ChangeCommand; +import org.eclipse.ui.ISources; +import org.eclipse.ui.handlers.HandlerUtil; + +public abstract class AcceptRejectChange extends AbstractHandler { + + /** The compare configuration object used to get the compare model. */ + private CompareConfiguration configuration; + + public Object execute(ExecutionEvent event) throws ExecutionException { + Object editorInput = HandlerUtil.getVariable(event, ISources.ACTIVE_EDITOR_INPUT_NAME); + if (editorInput instanceof CompareEditorInput) { + configuration = ((CompareEditorInput)editorInput).getCompareConfiguration(); + Object diffNode = ((CompareEditorInput)editorInput).getSelectedEdition(); + if (diffNode instanceof Adapter) { + Notifier diff = ((Adapter)diffNode).getTarget(); + if (diff instanceof Diff) { + boolean leftReadOnly = !configuration.isLeftEditable() && configuration.isRightEditable(); + boolean rightReadOnly = configuration.isLeftEditable() + && !configuration.isRightEditable(); + if (rightReadOnly) { + if (isCopyDiffCase((Diff)diff, leftReadOnly)) { + copyDiff((Diff)diff, leftReadOnly); + } else { + changeState((Diff)diff, rightReadOnly); + } + // Select next diff + navigate(true); + } + } + } + } + return null; + } + + protected abstract boolean isCopyDiffCase(Diff diff, boolean leftToRight); + + private void changeState(Diff diffToChangeState, boolean leftToRight) { + if (diffToChangeState != null) { + ICompareEditingDomain compareEditingDomain = (ICompareEditingDomain)configuration + .getProperty(EMFCompareConstants.EDITING_DOMAIN); + Command changeStateCommand = new AcceptRejectChangeCommand(compareEditingDomain + .getChangeRecorder(), diffToChangeState, leftToRight); + compareEditingDomain.getCommandStack().execute(changeStateCommand); + } + } + + private void copyDiff(Diff diffToCopy, boolean leftToRight) { + if (diffToCopy != null) { + List<Diff> diffsToCopy = new ArrayList<Diff>(); + diffsToCopy.add(diffToCopy); + if (isSubDiffFilterActive()) { + addAll(diffsToCopy, DiffUtil.getSubDiffs(leftToRight).apply(diffToCopy)); + } + ICompareEditingDomain editingDomain = (ICompareEditingDomain)configuration + .getProperty(EMFCompareConstants.EDITING_DOMAIN); + Command copyCommand = editingDomain.createCopyCommand(diffsToCopy, leftToRight, + EMFCompareRCPPlugin.getDefault().getMergerRegistry()); + + editingDomain.getCommandStack().execute(copyCommand); + // refresh(); + } + } + + protected boolean isSubDiffFilterActive() { + Object property = configuration.getProperty(EMFCompareConstants.SELECTED_FILTERS); + final Collection<IDifferenceFilter> selectedFilters; + if (property == null) { + return false; + } else { + selectedFilters = (Collection<IDifferenceFilter>)property; + for (IDifferenceFilter iDifferenceFilter : selectedFilters) { + if (iDifferenceFilter instanceof CascadingDifferencesFilter) { + return true; + } + } + } + return false; + } + + /** + * Called by the framework to navigate to the next (or previous) difference. This will open the content + * viewer for the next (or previous) diff displayed in the structure viewer. + * + * @param next + * <code>true</code> if we are to open the next structure viewer's diff, <code>false</code> if + * we should go to the previous instead. + */ + protected void navigate(boolean next) { + // final Control control = getControl(); + // if (control != null && !control.isDisposed()) { + final ICompareNavigator navigator = configuration.getContainer().getNavigator(); + if (navigator instanceof CompareNavigator && ((CompareNavigator)navigator).hasChange(next)) { + navigator.selectChange(next); + } + // } + } + + public class AcceptRejectChangeCommand extends ChangeCommand implements ICompareCopyCommand { + + private Diff difference; + + private boolean leftToRight; + + public AcceptRejectChangeCommand(ChangeRecorder changeRecorder, Diff difference, boolean leftToRight) { + super(changeRecorder, difference); + this.difference = difference; + this.leftToRight = leftToRight; + } + + @Override + public void doExecute() { + Adapter adapter = EcoreUtil.getExistingAdapter(difference, IMergeData.class); + if (adapter != null) { + if (leftToRight) { + ((IMergeData)adapter).setMergedToRight(); + } else { + ((IMergeData)adapter).setMergedToLeft(); + } + } else { + difference.eAdapters().add(new MergeDataAdapter(leftToRight)); + } + difference.setState(DifferenceState.MERGED); + + } + + public boolean isLeftToRight() { + return leftToRight; + } + + } + +} diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/handler/AcceptRejectChangePropertyTester.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/handler/AcceptRejectChangePropertyTester.java new file mode 100644 index 000000000..ef704943f --- /dev/null +++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/handler/AcceptRejectChangePropertyTester.java @@ -0,0 +1,26 @@ +package org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.handler; + +import org.eclipse.compare.CompareConfiguration; +import org.eclipse.compare.CompareEditorInput; +import org.eclipse.core.expressions.PropertyTester; +import org.eclipse.ui.IEditorInput; +import org.eclipse.ui.IEditorPart; + +public class AcceptRejectChangePropertyTester extends PropertyTester { + + public boolean test(Object receiver, String property, Object[] args, Object expectedValue) { + if (receiver instanceof IEditorPart) { + IEditorInput i = ((IEditorPart)receiver).getEditorInput(); + if (i instanceof CompareEditorInput) { + CompareConfiguration configuration = ((CompareEditorInput)i).getCompareConfiguration(); + if (configuration.isLeftEditable() && !configuration.isRightEditable()) { + return true; + } else if (!configuration.isLeftEditable() && configuration.isRightEditable()) { + return true; + } + } + } + return false; + } + +} diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/handler/RejectChange.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/handler/RejectChange.java new file mode 100644 index 000000000..0d0380f37 --- /dev/null +++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/handler/RejectChange.java @@ -0,0 +1,35 @@ +/******************************************************************************* + * 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.handler; + +import static org.eclipse.emf.compare.utils.EMFComparePredicates.fromSide; + +import org.eclipse.emf.compare.Diff; +import org.eclipse.emf.compare.DifferenceSource; + +/** + * Handler that manages a reject of a difference in case of one side of the comparison is in read-only mode. + * + * @author <a href="mailto:axel.richard@obeo.fr">Axel Richard</a> + * @since 3.0 + */ +public class RejectChange extends AcceptRejectChange { + + @Override + protected boolean isCopyDiffCase(Diff diff, boolean leftToRight) { + if (leftToRight) { + return fromSide(DifferenceSource.RIGHT).apply(diff); + } else { + return fromSide(DifferenceSource.LEFT).apply(diff); + } + } + +} |