blob: 315f0249b1f0d7d4b456c82c3b5d869f75810cfb [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2008 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.team.internal.ccvs.ui.mappings;
import org.eclipse.core.resources.mapping.ResourceMapping;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.action.*;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.osgi.util.NLS;
import org.eclipse.team.core.diff.IThreeWayDiff;
import org.eclipse.team.core.mapping.*;
import org.eclipse.team.core.mapping.provider.MergeContext;
import org.eclipse.team.core.mapping.provider.SynchronizationContext;
import org.eclipse.team.internal.ccvs.ui.*;
import org.eclipse.team.internal.ccvs.ui.actions.*;
import org.eclipse.team.internal.ccvs.ui.mappings.WorkspaceSubscriberContext.ChangeSetSubscriberScopeManager;
import org.eclipse.team.internal.ccvs.ui.subscriber.CVSActionDelegateWrapper;
import org.eclipse.team.internal.ui.TeamUIPlugin;
import org.eclipse.team.internal.ui.Utils;
import org.eclipse.team.internal.ui.mapping.MergeAllActionHandler;
import org.eclipse.team.internal.ui.synchronize.*;
import org.eclipse.team.ui.TeamUI;
import org.eclipse.team.ui.mapping.ITeamContentProviderManager;
import org.eclipse.team.ui.mapping.SynchronizationActionProvider;
import org.eclipse.team.ui.synchronize.ISynchronizePageConfiguration;
import org.eclipse.team.ui.synchronize.ModelSynchronizeParticipantActionGroup;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.PartInitException;
public class WorkspaceModelParticipant extends
CVSModelSynchronizeParticipant implements IChangeSetProvider {
public static final String VIEWER_ID = "org.eclipse.team.cvs.ui.workspaceSynchronization"; //$NON-NLS-1$
public static final String CONTEXT_MENU_UPDATE_GROUP_1 = "update"; //$NON-NLS-1$
public static final String CONTEXT_MENU_COMMIT_GROUP_1 = "commit"; //$NON-NLS-1$
public static final String CONTEXT_MENU_CONTRIBUTION_GROUP_2 = "overrideActions"; //$NON-NLS-1$
public static final String CONTEXT_MENU_CONTRIBUTION_GROUP_3 = "otherActions1"; //$NON-NLS-1$
public static final String CONTEXT_MENU_CONTRIBUTION_GROUP_4 = "otherActions2"; //$NON-NLS-1$
public static final String ID = "org.eclipse.team.cvs.ui.workspace-participant"; //$NON-NLS-1$
private static final String CTX_CONSULT_CHANGE_SETS = "consultChangeSets"; //$NON-NLS-1$
/**
* CVS workspace action contribution
*/
public class WorkspaceMergeActionGroup extends ModelSynchronizeParticipantActionGroup {
private WorkspaceCommitAction commitToolbar;
@Override
public void initialize(ISynchronizePageConfiguration configuration) {
configuration.setProperty(MERGE_ALL_ACTION_ID, new MergeAllActionHandler(configuration) {
@Override
protected String getJobName() {
String name = getConfiguration().getParticipant().getName();
return NLS.bind(CVSUIMessages.WorkspaceModelParticipant_0, Utils.shortenText(SynchronizeView.MAX_NAME_LENGTH, name));
}
@Override
protected boolean promptToUpdate() {
final IResourceDiffTree tree = getMergeContext().getDiffTree();
if (tree.isEmpty()) {
return false;
}
final long count = tree.countFor(IThreeWayDiff.INCOMING, IThreeWayDiff.DIRECTION_MASK) + tree.countFor(IThreeWayDiff.CONFLICTING, IThreeWayDiff.DIRECTION_MASK);
if (count == 0)
return false;
final boolean[] result = new boolean[] {true};
TeamUIPlugin.getStandardDisplay().syncExec(() -> {
String sizeString = Long.toString(count);
String message = tree.size() > 1
? NLS.bind(CVSUIMessages.UpdateAction_promptForUpdateSeveral,
new String[] { sizeString })
: NLS.bind(CVSUIMessages.UpdateAction_promptForUpdateOne, new String[] { sizeString }); //
result[0] = MessageDialog.openQuestion(getConfiguration().getSite().getShell(),
NLS.bind(CVSUIMessages.UpdateAction_promptForUpdateTitle, new String[] { sizeString }),
message);
});
return result[0];
}
private IMergeContext getMergeContext() {
return ((IMergeContext)getConfiguration().getProperty(ITeamContentProviderManager.P_SYNCHRONIZATION_CONTEXT));
}
@Override
protected boolean needsToSaveDirtyEditors() {
int option = CVSUIPlugin.getPlugin().getPreferenceStore().getInt(ICVSUIConstants.PREF_SAVE_DIRTY_EDITORS);
return option != ICVSUIConstants.OPTION_NEVER;
}
@Override
protected boolean confirmSaveOfDirtyEditor() {
int option = CVSUIPlugin.getPlugin().getPreferenceStore().getInt(ICVSUIConstants.PREF_SAVE_DIRTY_EDITORS);
return option == ICVSUIConstants.OPTION_PROMPT;
}
});
super.initialize(configuration);
int modes = configuration.getSupportedModes();
if ((modes & (ISynchronizePageConfiguration.OUTGOING_MODE | ISynchronizePageConfiguration.BOTH_MODE)) != 0) {
appendToGroup(
ISynchronizePageConfiguration.P_CONTEXT_MENU,
CONTEXT_MENU_COMMIT_GROUP_1,
new CommitAction(configuration));
commitToolbar = new WorkspaceCommitAction(configuration);
appendToGroup(
ISynchronizePageConfiguration.P_TOOLBAR_MENU,
MERGE_ACTION_GROUP,
commitToolbar);
// TODO: let's leave off override and commit for now
// appendToGroup(
// ISynchronizePageConfiguration.P_CONTEXT_MENU,
// CONTEXT_MENU_CONTRIBUTION_GROUP_2,
// new OverrideAndCommitAction(configuration));
appendToGroup(
ISynchronizePageConfiguration.P_CONTEXT_MENU,
CONTEXT_MENU_CONTRIBUTION_GROUP_3,
new CVSActionDelegateWrapper(new IgnoreAction(), configuration));
}
if (!configuration.getSite().isModal()) {
appendToGroup(
ISynchronizePageConfiguration.P_CONTEXT_MENU,
CONTEXT_MENU_CONTRIBUTION_GROUP_3,
new CreatePatchAction(configuration));
appendToGroup(
ISynchronizePageConfiguration.P_CONTEXT_MENU,
CONTEXT_MENU_CONTRIBUTION_GROUP_3,
new ApplyPatchAction(configuration));
appendToGroup(
ISynchronizePageConfiguration.P_CONTEXT_MENU,
CONTEXT_MENU_CONTRIBUTION_GROUP_3,
new CVSActionDelegateWrapper(new BranchAction(), configuration));
appendToGroup(
ISynchronizePageConfiguration.P_CONTEXT_MENU,
CONTEXT_MENU_CONTRIBUTION_GROUP_3,
new CVSActionDelegateWrapper(new ShowAnnotationAction(), configuration));
appendToGroup(
ISynchronizePageConfiguration.P_CONTEXT_MENU,
CONTEXT_MENU_CONTRIBUTION_GROUP_3,
new CVSActionDelegateWrapper(new ShowResourceInHistoryAction(), configuration));
appendToGroup(
ISynchronizePageConfiguration.P_CONTEXT_MENU,
CONTEXT_MENU_CONTRIBUTION_GROUP_3,
new CVSActionDelegateWrapper(new SetKeywordSubstitutionAction(), configuration));
}
}
@Override
protected void configureMergeAction(String mergeActionId, Action action) {
if (mergeActionId == SynchronizationActionProvider.MERGE_ACTION_ID) {
Utils.initAction(action, "WorkspaceUpdateAction.", Policy.getActionBundle()); //$NON-NLS-1$
action.setId(ICVSUIConstants.CMD_UPDATE);
action.setActionDefinitionId(ICVSUIConstants.CMD_UPDATE);
} else if (mergeActionId == SynchronizationActionProvider.OVERWRITE_ACTION_ID) {
Utils.initAction(action, "OverrideAndUpdateAction.", Policy.getActionBundle()); //$NON-NLS-1$
} else if (mergeActionId == SynchronizationActionProvider.MARK_AS_MERGE_ACTION_ID) {
Utils.initAction(action, "ConfirmMergedAction.", Policy.getActionBundle()); //$NON-NLS-1$
} else if (mergeActionId == MERGE_ALL_ACTION_ID) {
Utils.initAction(action, "WorkspaceToolbarUpdateAction.", Policy.getActionBundle()); //$NON-NLS-1$
action.setId(ICVSUIConstants.CMD_UPDATE_ALL);
action.setActionDefinitionId(ICVSUIConstants.CMD_UPDATE_ALL);
} else {
super.configureMergeAction(mergeActionId, action);
}
}
@Override
protected void addToContextMenu(String mergeActionId, Action action, IMenuManager manager) {
IContributionItem group = null;;
if (mergeActionId == SynchronizationActionProvider.MERGE_ACTION_ID) {
group = manager.find(CONTEXT_MENU_UPDATE_GROUP_1);
} else if (mergeActionId == SynchronizationActionProvider.OVERWRITE_ACTION_ID) {
group = manager.find(CONTEXT_MENU_CONTRIBUTION_GROUP_2);
} else if (mergeActionId == SynchronizationActionProvider.MARK_AS_MERGE_ACTION_ID) {
group = manager.find(CONTEXT_MENU_CONTRIBUTION_GROUP_2);
} else {
super.addToContextMenu(mergeActionId, action, manager);
return;
}
if (group != null) {
manager.appendToGroup(group.getId(), action);
} else {
manager.add(action);
}
}
}
private WorkspaceChangeSetCapability capability;
private boolean isConsultChangeSets;
public WorkspaceModelParticipant() {
}
public WorkspaceModelParticipant(SynchronizationContext context) {
super(context);
try {
setInitializationData(TeamUI.getSynchronizeManager().getParticipantDescriptor("org.eclipse.team.cvs.ui.workspace-participant")); //$NON-NLS-1$
} catch (CoreException e) {
TeamUIPlugin.log(e);
}
setSecondaryId(Long.toString(System.currentTimeMillis()));
isConsultChangeSets = isConsultChangeSets(context.getScopeManager());
}
@Override
protected void initializeConfiguration(ISynchronizePageConfiguration configuration) {
configuration.setProperty(ISynchronizePageConfiguration.P_VIEWER_ID, VIEWER_ID);
super.initializeConfiguration(configuration);
}
@Override
protected ModelSynchronizeParticipantActionGroup createMergeActionGroup() {
return new WorkspaceMergeActionGroup();
}
@Override
protected MergeContext restoreContext(ISynchronizationScopeManager manager) {
return WorkspaceSubscriberContext.createContext(manager, ISynchronizationContext.THREE_WAY);
}
@Override
protected ISynchronizationScopeManager createScopeManager(ResourceMapping[] mappings) {
return WorkspaceSubscriberContext.createWorkspaceScopeManager(mappings, true, isConsultChangeSets);
}
@Override
public ChangeSetCapability getChangeSetCapability() {
if (capability == null) {
capability = new WorkspaceChangeSetCapability();
}
return capability;
}
@Override
public void saveState(IMemento memento) {
super.saveState(memento);
memento.putString(CTX_CONSULT_CHANGE_SETS, Boolean.toString(isConsultChangeSets));
}
@Override
public void init(String secondaryId, IMemento memento) throws PartInitException {
try {
String consult = memento.getString(CTX_CONSULT_CHANGE_SETS);
if (consult != null)
isConsultChangeSets = Boolean.valueOf(consult).booleanValue();
} finally {
super.init(secondaryId, memento);
}
}
private boolean isConsultChangeSets(ISynchronizationScopeManager manager) {
if (manager instanceof ChangeSetSubscriberScopeManager) {
ChangeSetSubscriberScopeManager man = (ChangeSetSubscriberScopeManager) manager;
return man.isConsultSets();
}
return false;
}
}