diff options
author | Michael Valenta | 2005-11-18 03:11:59 +0000 |
---|---|---|
committer | Michael Valenta | 2005-11-18 03:11:59 +0000 |
commit | 7c94124e5eeec9b23d63979c13adc2940c3f7ffa (patch) | |
tree | 62fab92a80926cb93a3ab046aada4b9409d01868 | |
parent | 23b3d2d0e3f0f8244edda7799a9f1d6d50095e1b (diff) | |
download | eclipse.platform.team-7c94124e5eeec9b23d63979c13adc2940c3f7ffa.tar.gz eclipse.platform.team-7c94124e5eeec9b23d63979c13adc2940c3f7ffa.tar.xz eclipse.platform.team-7c94124e5eeec9b23d63979c13adc2940c3f7ffa.zip |
Added mark-as-merged for files and fixed save
10 files changed, 234 insertions, 94 deletions
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/actions/actions.properties b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/actions/actions.properties index ed78c54e2..2f55ed2b8 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/actions/actions.properties +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/actions/actions.properties @@ -97,4 +97,6 @@ action.removeFromView.label=&Remove from View action.merge.label=Merge action.merge.tooltip=Merge All Incoming Changes action.merge.description=Merge All Incoming Changes -action.merge.image=checkout_action.gif
\ No newline at end of file +action.merge.image=checkout_action.gif + +action.markAsMerged.label=Mark &as Merged diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/CommonViewerAdvisor.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/CommonViewerAdvisor.java index 2f7fa022d..fb0a13b1b 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/CommonViewerAdvisor.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/CommonViewerAdvisor.java @@ -35,7 +35,9 @@ public class CommonViewerAdvisor extends StructuredViewerAdvisor implements INav * @return a newly created common viewer */ private static CommonViewer createViewer(Composite parent, ISynchronizePageConfiguration configuration) { - return new CommonViewer(TEAM_NAVIGATOR_CONTENT, parent, SWT.NONE); + CommonViewer v = new CommonViewer(TEAM_NAVIGATOR_CONTENT, parent, SWT.NONE); + configuration.getSite().setSelectionProvider(v); + return v; } /** diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/MarkAsMergedAction.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/MarkAsMergedAction.java new file mode 100644 index 000000000..0074816fe --- /dev/null +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/MarkAsMergedAction.java @@ -0,0 +1,107 @@ +/******************************************************************************* + * Copyright (c) 2000, 2005 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.team.internal.ui.mapping; + +import java.lang.reflect.InvocationTargetException; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.runtime.*; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.team.core.synchronize.SyncInfo; +import org.eclipse.team.internal.ui.Utils; +import org.eclipse.team.ui.mapping.IMergeContext; +import org.eclipse.team.ui.mapping.ISynchronizationContext; +import org.eclipse.team.ui.operations.ModelProviderOperation; +import org.eclipse.team.ui.synchronize.ISynchronizePageConfiguration; +import org.eclipse.ui.IContributorResourceAdapter; + +/** + * Action contributed by the {@link ModelSynchronizeParticipant} that + * will mark a file as merged. + */ +public class MarkAsMergedAction extends ModelProviderAction { + + public MarkAsMergedAction(ISynchronizePageConfiguration configuration) { + super(null, configuration); + Utils.initAction(this, "action.markAsMerged."); //$NON-NLS-1$ + } + + /* (non-Javadoc) + * @see org.eclipse.jface.action.Action#run() + */ + public void run() { + final IMergeContext context = (IMergeContext)((ModelSynchronizeParticipant)getConfiguration().getParticipant()).getContext(); + try { + new ModelProviderOperation(getConfiguration()) { + public void run(IProgressMonitor monitor) throws InvocationTargetException, + InterruptedException { + try { + SyncInfo[] infos = getSelectedSyncInfos(getStructuredSelection()); + for (int i = 0; i < infos.length; i++) { + SyncInfo info = infos[i]; + // TODO: mark as merged should support batching + IStatus status = context.markAsMerged((IFile)info.getLocal(), monitor); + if (!status.isOK()) + throw new CoreException(status); + } + } catch (CoreException e) { + throw new InvocationTargetException(e); + } + } + + }.run(); + } catch (InvocationTargetException e) { + Utils.handle(e); + } catch (InterruptedException e) { + // Ignore + } + } + + /* (non-Javadoc) + * @see org.eclipse.team.internal.ui.mapping.ModelProviderAction#isEnabledForSelection(org.eclipse.jface.viewers.IStructuredSelection) + */ + protected boolean isEnabledForSelection(IStructuredSelection selection) { + return getSelectedSyncInfos(selection).length > 0; + } + + protected SyncInfo[] getSelectedSyncInfos(IStructuredSelection selection) { + // TODO: for now, just enable for files + if (selection.size() == 1) { + Object o = selection.getFirstElement(); + IResource resource = null; + if (o instanceof IResource) { + resource = (IResource) o; + } else if (o instanceof IAdaptable) { + IAdaptable adaptable = (IAdaptable) o; + resource = (IResource)adaptable.getAdapter(IResource.class); + if (resource == null) { + IContributorResourceAdapter adapter = (IContributorResourceAdapter)adaptable.getAdapter(IContributorResourceAdapter.class); + if (adapter != null) + resource = adapter.getAdaptedResource(adaptable); + } + } + if (resource != null && resource.getType() == IResource.FILE) { + ISynchronizationContext context = getContext(); + SyncInfo info = context.getSyncInfoTree().getSyncInfo(resource); + if (info != null && SyncInfo.getDirection(info.getKind()) == SyncInfo.CONFLICTING) { + return new SyncInfo[] { info }; + } + } + } + return new SyncInfo[0]; + } + + private ISynchronizationContext getContext() { + return ((ModelSynchronizeParticipant)getConfiguration().getParticipant()).getContext(); + } + +} diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/OptimisticUpdateAction.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/MergeIncomingChangesAction.java index 1571c4e2b..bf1470608 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/OptimisticUpdateAction.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/MergeIncomingChangesAction.java @@ -14,7 +14,7 @@ import java.lang.reflect.InvocationTargetException; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.jface.action.Action; +import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.team.internal.ui.Utils; import org.eclipse.team.ui.mapping.IMergeContext; import org.eclipse.team.ui.operations.ModelProviderOperation; @@ -23,12 +23,10 @@ import org.eclipse.team.ui.synchronize.ISynchronizePageConfiguration; /** * Action that performs an optimistic merge */ -public class OptimisticUpdateAction extends Action { +public class MergeIncomingChangesAction extends ModelProviderAction { - private final ISynchronizePageConfiguration configuration; - - public OptimisticUpdateAction(ISynchronizePageConfiguration configuration) { - this.configuration = configuration; + public MergeIncomingChangesAction(ISynchronizePageConfiguration configuration) { + super(null, configuration); Utils.initAction(this, "action.merge."); //$NON-NLS-1$ } @@ -36,9 +34,9 @@ public class OptimisticUpdateAction extends Action { * @see org.eclipse.jface.action.Action#run() */ public void run() { - final IMergeContext context = (IMergeContext)((ModelSynchronizeParticipant)configuration.getParticipant()).getContext(); + final IMergeContext context = (IMergeContext)((ModelSynchronizeParticipant)getConfiguration().getParticipant()).getContext(); try { - new ModelProviderOperation(configuration) { + new ModelProviderOperation(getConfiguration()) { public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { try { @@ -55,6 +53,14 @@ public class OptimisticUpdateAction extends Action { // Ignore } } + + /* (non-Javadoc) + * @see org.eclipse.team.internal.ui.mapping.ModelProviderAction#isEnabledForSelection(org.eclipse.jface.viewers.IStructuredSelection) + */ + protected boolean isEnabledForSelection(IStructuredSelection selection) { + // This action is always enabled + return true; + } } diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/ModelProviderAction.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/ModelProviderAction.java new file mode 100644 index 000000000..802560489 --- /dev/null +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/ModelProviderAction.java @@ -0,0 +1,78 @@ +/******************************************************************************* + * Copyright (c) 2000, 2005 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.team.internal.ui.mapping; + +import org.eclipse.jface.viewers.*; +import org.eclipse.swt.events.DisposeEvent; +import org.eclipse.swt.events.DisposeListener; +import org.eclipse.team.ui.synchronize.ISynchronizePageConfiguration; +import org.eclipse.ui.actions.BaseSelectionListenerAction; + +/** + * Model provider actions for use with a {@link ModelSynchronizeParticipant}. + * + * @since 3.2 + */ +public abstract class ModelProviderAction extends BaseSelectionListenerAction { + + private final ISynchronizePageConfiguration configuration; + + public ModelProviderAction(String text, ISynchronizePageConfiguration configuration) { + super(text); + this.configuration = configuration; + initialize(configuration); + } + + /** + * @param configuration + */ + private void initialize(ISynchronizePageConfiguration configuration) { + configuration.getSite().getSelectionProvider().addSelectionChangedListener(this); + configuration.getPage().getViewer().getControl().addDisposeListener(new DisposeListener() { + public void widgetDisposed(DisposeEvent e) { + getConfiguration().getSite().getSelectionProvider().removeSelectionChangedListener(ModelProviderAction.this); + } + }); + } + + protected ISynchronizePageConfiguration getConfiguration() { + return configuration; + } + + /** + * Set the selection of this action to the given selection + * + * @param selection the selection + */ + public void selectionChanged(ISelection selection) { + if (selection instanceof IStructuredSelection) { + super.selectionChanged((IStructuredSelection)selection); + } else { + super.selectionChanged(StructuredSelection.EMPTY); + } + + } + + /* (non-Javadoc) + * @see org.eclipse.ui.actions.BaseSelectionListenerAction#updateSelection(org.eclipse.jface.viewers.IStructuredSelection) + */ + protected boolean updateSelection(IStructuredSelection selection) { + super.updateSelection(selection); + return isEnabledForSelection(selection); + } + + /** + * @param selection + * @return + */ + protected abstract boolean isEnabledForSelection(IStructuredSelection selection); + +} diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/ModelSynchronizeParticipant.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/ModelSynchronizeParticipant.java index c59b73970..428170db3 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/ModelSynchronizeParticipant.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/ModelSynchronizeParticipant.java @@ -26,11 +26,8 @@ import org.eclipse.ui.part.IPageBookViewPage; public class ModelSynchronizeParticipant extends AbstractSynchronizeParticipant { - /** - * The id of a workspace action group to which additions actions can - * be added. - */ public static final String TOOLBAR_CONTRIBUTION_GROUP = "toolbar_group_1"; //$NON-NLS-1$ + public static final String CONTEXT_MENU_CONTRIBUTION_GROUP = "context_menu_group_1"; //$NON-NLS-1$ private ISynchronizationContext context; @@ -38,24 +35,24 @@ public class ModelSynchronizeParticipant extends * CVS workspace action contribution */ public class ModelActionContribution extends SynchronizePageActionGroup { - private OptimisticUpdateAction updateToolbarAction; + private MergeIncomingChangesAction updateToolbarAction; public void initialize(ISynchronizePageConfiguration configuration) { super.initialize(configuration); ISynchronizationContext context = ((ModelSynchronizeParticipant)configuration.getParticipant()).getContext(); if (context instanceof IMergeContext) { - updateToolbarAction = new OptimisticUpdateAction(configuration); + updateToolbarAction = new MergeIncomingChangesAction(configuration); appendToGroup( ISynchronizePageConfiguration.P_TOOLBAR_MENU, TOOLBAR_CONTRIBUTION_GROUP, updateToolbarAction); } -// appendToGroup( -// ISynchronizePageConfiguration.P_CONTEXT_MENU, -// CONTEXT_MENU_CONTRIBUTION_GROUP_1, -// new WorkspaceUpdateAction(configuration)); + appendToGroup( + ISynchronizePageConfiguration.P_CONTEXT_MENU, + CONTEXT_MENU_CONTRIBUTION_GROUP, + new MarkAsMergedAction(configuration)); // appendToGroup( // ISynchronizePageConfiguration.P_CONTEXT_MENU, // CONTEXT_MENU_CONTRIBUTION_GROUP_1, @@ -126,7 +123,7 @@ public class ModelSynchronizeParticipant extends ISynchronizePageConfiguration configuration) { configuration.setProperty(ISynchronizePageConfiguration.P_TOOLBAR_MENU, new String[] {ISynchronizePageConfiguration.MODE_GROUP, TOOLBAR_CONTRIBUTION_GROUP}); configuration.addActionContribution(new ModelActionContribution()); - configuration.setProperty(ISynchronizePageConfiguration.P_CONTEXT_MENU, new String[0]); + configuration.setProperty(ISynchronizePageConfiguration.P_CONTEXT_MENU, new String[] { CONTEXT_MENU_CONTRIBUTION_GROUP }); configuration.setSupportedModes(ISynchronizePageConfiguration.ALL_MODES); configuration.setMode(ISynchronizePageConfiguration.INCOMING_MODE); } diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/operations/ModelProviderOperation.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/operations/ModelProviderOperation.java index de7aea707..1afa636c8 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/operations/ModelProviderOperation.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/operations/ModelProviderOperation.java @@ -25,10 +25,9 @@ import org.eclipse.team.ui.synchronize.ISynchronizePageSite; import org.eclipse.ui.IWorkbenchPart; /** - * @author Administrator - * - * TODO To change the template for this generated type comment go to - * Window - Preferences - Java - Code Style - Code Templates + * An operation for performing model provider based operations. + * + * @since 3.2 */ public abstract class ModelProviderOperation extends TeamOperation { @@ -46,9 +45,16 @@ public abstract class ModelProviderOperation extends TeamOperation { } protected ModelProviderOperation(ISynchronizePageConfiguration configuration) { - super(getPart(configuration)); + this(getPart(configuration)); } + /** + * @param part + */ + public ModelProviderOperation(IWorkbenchPart part) { + super(part); + } + protected void performMerge(IMergeContext context, IProgressMonitor monitor) throws CoreException { monitor.beginTask(null, IProgressMonitor.UNKNOWN); ModelProvider[] providers = context.getScope().getModelProviders(); diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/operations/ResourceMappingMergeOperation.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/operations/ResourceMappingMergeOperation.java index 799e34585..4a678c107 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/operations/ResourceMappingMergeOperation.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/operations/ResourceMappingMergeOperation.java @@ -16,13 +16,14 @@ import java.util.List; import org.eclipse.compare.CompareConfiguration; import org.eclipse.core.resources.mapping.*; -import org.eclipse.core.runtime.*; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.swt.widgets.Display; -import org.eclipse.team.core.TeamException; import org.eclipse.team.internal.ui.Policy; import org.eclipse.team.internal.ui.TeamUIPlugin; import org.eclipse.team.internal.ui.mapping.*; -import org.eclipse.team.ui.mapping.*; +import org.eclipse.team.ui.mapping.IMergeContext; +import org.eclipse.team.ui.mapping.ISynchronizationContext; import org.eclipse.team.ui.synchronize.ParticipantPageDialog; import org.eclipse.ui.IWorkbenchPart; @@ -192,49 +193,6 @@ public abstract class ResourceMappingMergeOperation extends ResourceMappingOpera * @return a merge context for merging the mappings of the input */ protected abstract IMergeContext buildMergeContext(IProgressMonitor monitor); - - /** - * Merge all the mappings that come from the given provider. By default, - * an automatic merge is attempted. After this, a manual merge (i.e. with user - * intervention) is attempted on any mappings that could not be merged - * automatically. - * @param provider the model provider - * @param mappings the mappings to be merged - * @param monitor a progress monitor - * @throws CoreException - */ - protected boolean performMerge(ModelProvider provider, IMergeContext mergeContext, IProgressMonitor monitor) throws CoreException { - try { - monitor.beginTask(null, 100); - IStatus status = performAutoMerge(provider, mergeContext, Policy.subMonitorFor(monitor, 95)); - if (!status.isOK()) { - if (status.getCode() == IMergeStatus.CONFLICTS) { - return false; - } else { - throw new TeamException(status); - } - } - } finally { - monitor.done(); - } - return true; - } - - /** - * Attempt to merge automatically. The returned status will indicate which - * mappings could not be merged automatically. - * @param provider the provider for the mappings being merged - * @param mergeContext the context for the merge - * @param monitor a progress monitor - * @return a status indicating success or failure. A failure status - * will be a MergeStatus that includes the mappings that could not be merged. - * @throws CoreException if errors occurred - */ - protected IStatus performAutoMerge(ModelProvider provider, IMergeContext mergeContext, IProgressMonitor monitor) throws CoreException { - IResourceMappingMerger merger = getMerger(provider); - IStatus status = merger.merge(mergeContext, monitor); - return status; - } /* (non-Javadoc) * @see org.eclipse.team.ui.operations.ResourceMappingOperation#getContext() diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/operations/ResourceMappingOperation.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/operations/ResourceMappingOperation.java index ca1a40ad8..83fc87061 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/operations/ResourceMappingOperation.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/operations/ResourceMappingOperation.java @@ -12,13 +12,13 @@ package org.eclipse.team.ui.operations; import java.lang.reflect.InvocationTargetException; -import org.eclipse.core.resources.mapping.*; +import org.eclipse.core.resources.mapping.ResourceMapping; +import org.eclipse.core.resources.mapping.ResourceMappingContext; import org.eclipse.core.runtime.*; import org.eclipse.jface.window.Window; import org.eclipse.team.internal.ui.dialogs.AdditionalMappingsDialog; -import org.eclipse.team.internal.ui.mapping.DefaultResourceMappingMerger; -import org.eclipse.team.ui.TeamOperation; -import org.eclipse.team.ui.mapping.*; +import org.eclipse.team.ui.mapping.IResourceMappingScope; +import org.eclipse.team.ui.mapping.ISynchronizationContext; import org.eclipse.ui.IWorkbenchPart; /** @@ -60,7 +60,7 @@ import org.eclipse.ui.IWorkbenchPart; * * @since 3.2 */ -public abstract class ResourceMappingOperation extends TeamOperation { +public abstract class ResourceMappingOperation extends ModelProviderOperation { private static final ScopeGenerator DEFAULT_SCOPE_BUILDER = new ScopeGenerator(); private final ResourceMapping[] selectedMappings; @@ -151,23 +151,6 @@ public abstract class ResourceMappingOperation extends TeamOperation { protected abstract void execute(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException; - /** - * Return the auto-merger associated with the given model provider - * view the adaptable mechanism. - * If the model provider does not have a merger associated with - * it, a default merger that performs the merge at the file level - * is returned. - * @param provider the model provider of the elements to be merged - * @return a merger - */ - protected IResourceMappingMerger getMerger(ModelProvider provider) { - Object o = provider.getAdapter(IResourceMappingMerger.class); - if (o instanceof IResourceMappingMerger) { - return (IResourceMappingMerger) o; - } - return new DefaultResourceMappingMerger(provider); - } - public IResourceMappingScope getScope() { return scope; } diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/synchronize/ParticipantPageSaveablePart.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/synchronize/ParticipantPageSaveablePart.java index 3dd5c943f..93f83883e 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/synchronize/ParticipantPageSaveablePart.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/synchronize/ParticipantPageSaveablePart.java @@ -313,6 +313,7 @@ public class ParticipantPageSaveablePart extends SaveablePartAdapter implements } } ); + hookContentChangeListener((ICompareInput)input); } return newViewer; } |