diff options
Diffstat (limited to 'examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/model/ui/mapping/ModelMergeActionHandler.java')
-rw-r--r-- | examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/model/ui/mapping/ModelMergeActionHandler.java | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/model/ui/mapping/ModelMergeActionHandler.java b/examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/model/ui/mapping/ModelMergeActionHandler.java new file mode 100644 index 000000000..eb402e606 --- /dev/null +++ b/examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/model/ui/mapping/ModelMergeActionHandler.java @@ -0,0 +1,121 @@ +/******************************************************************************* + * Copyright (c) 2006 IBM Corporation and others. + * 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.team.examples.model.ui.mapping; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.runtime.*; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.team.core.diff.*; +import org.eclipse.team.core.mapping.IMergeContext; +import org.eclipse.team.examples.model.ModelObjectDefinitionFile; +import org.eclipse.team.examples.model.ModelObjectElementFile; +import org.eclipse.team.internal.ui.mapping.ResourceModelProviderOperation; +import org.eclipse.team.ui.mapping.MergeActionHandler; +import org.eclipse.team.ui.mapping.SynchronizationOperation; +import org.eclipse.team.ui.synchronize.ISynchronizePageConfiguration; + +public class ModelMergeActionHandler extends MergeActionHandler { + + /* + * Operation to merge model elements. We're using an internal superclass to save on copying + * code. + */ + private final class ModelSynchronizeOperation extends ResourceModelProviderOperation { + public ModelSynchronizeOperation(ISynchronizePageConfiguration configuration, IStructuredSelection selection) { + super(configuration, selection); + } + + /* (non-Javadoc) + * @see org.eclipse.team.ui.mapping.SynchronizationOperation#execute(org.eclipse.core.runtime.IProgressMonitor) + */ + protected void execute(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { + // We need to perform special handling for any MOE file whose parent MOD is not included in the merge + try { + IMergeContext context = (IMergeContext)getContext(); + IDiff[] diffs = getTargetDiffs(); + ModelObjectElementFile[] moeMerges = getMoeOnlyMerges(); + IStatus status = context.merge(diffs, overwrite, monitor); + if (!status.isOK()) + throw new CoreException(status); + // For now, just cycle through each lonely MOE and update the parent + for (int i = 0; i < moeMerges.length; i++) { + ModelObjectElementFile file = moeMerges[i]; + ModelObjectDefinitionFile modFile = (ModelObjectDefinitionFile)file.getParent(); + if (file.getResource().exists() && !modFile.hasMoe((IFile)file.getResource())) + modFile.addMoe((IFile)file.getResource()); + else + modFile.remove(file); + } + } catch (CoreException e) { + throw new InvocationTargetException(e); + } + } + + private ModelObjectElementFile[] getMoeOnlyMerges() { + List result = new ArrayList(); + Object[] elements = getElements(); + for (int i = 0; i < elements.length; i++) { + Object object = elements[i]; + if (object instanceof ModelObjectElementFile) { + ModelObjectElementFile moeFile = (ModelObjectElementFile) object; + result.add(moeFile); + } + } + return (ModelObjectElementFile[]) result.toArray(new ModelObjectElementFile[result.size()]); + } + + /* (non-Javadoc) + * @see org.eclipse.team.internal.ui.mapping.ResourceModelProviderOperation#getDiffFilter() + */ + protected FastDiffFilter getDiffFilter() { + return new FastDiffFilter() { + public boolean select(IDiff node) { + if (node instanceof IThreeWayDiff) { + IThreeWayDiff twd = (IThreeWayDiff) node; + if ((twd.getDirection() == IThreeWayDiff.OUTGOING && overwrite) || twd.getDirection() == IThreeWayDiff.CONFLICTING || twd.getDirection() == IThreeWayDiff.INCOMING) { + return true; + } + return false; + } + // Overwrite should always be available for two-way diffs + return overwrite; + } + }; + } + } + + final boolean overwrite; + private SynchronizationOperation operation; + + public ModelMergeActionHandler(ISynchronizePageConfiguration configuration, boolean overwrite) { + super(configuration); + this.overwrite = overwrite; + } + + protected SynchronizationOperation getOperation() { + if (operation == null) { + operation = new ModelSynchronizeOperation(getConfiguration(), getStructuredSelection()); + } + return operation; + } + + protected void updateEnablement(IStructuredSelection selection) { + synchronized (this) { + operation = null; + } + super.updateEnablement(selection); + } + +} |