/******************************************************************************* * Copyright (c) 2006, 2008 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.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; public void initialize(ISynchronizePageConfiguration configuration) { configuration.setProperty(MERGE_ALL_ACTION_ID, new MergeAllActionHandler(configuration) { protected String getJobName() { String name = getConfiguration().getParticipant().getName(); return NLS.bind(CVSUIMessages.WorkspaceModelParticipant_0, Utils.shortenText(SynchronizeView.MAX_NAME_LENGTH, name)); } 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(new Runnable() { public void run() { 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)); } protected boolean needsToSaveDirtyEditors() { int option = CVSUIPlugin.getPlugin().getPreferenceStore().getInt(ICVSUIConstants.PREF_SAVE_DIRTY_EDITORS); return option != ICVSUIConstants.OPTION_NEVER; } 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)); } } /* (non-Javadoc) * @see org.eclipse.team.ui.operations.MergeActionGroup#configureMergeAction(java.lang.String, org.eclipse.jface.action.Action) */ 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); } } 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()); } /* (non-Javadoc) * @see org.eclipse.team.ui.operations.ModelSynchronizeParticipant#initializeConfiguration(org.eclipse.team.ui.synchronize.ISynchronizePageConfiguration) */ protected void initializeConfiguration(ISynchronizePageConfiguration configuration) { configuration.setProperty(ISynchronizePageConfiguration.P_VIEWER_ID, VIEWER_ID); super.initializeConfiguration(configuration); } /* (non-Javadoc) * @see org.eclipse.team.ui.operations.ResourceMappingSynchronizeParticipant#createMergeActionGroup() */ protected ModelSynchronizeParticipantActionGroup createMergeActionGroup() { return new WorkspaceMergeActionGroup(); } /* (non-Javadoc) * @see org.eclipse.team.ui.operations.ModelSynchronizeParticipant#restoreContext(org.eclipse.team.core.mapping.IResourceMappingScope, org.eclipse.core.runtime.IProgressMonitor) */ protected MergeContext restoreContext(ISynchronizationScopeManager manager) { return WorkspaceSubscriberContext.createContext(manager, ISynchronizationContext.THREE_WAY); } /* (non-Javadoc) * @see org.eclipse.team.ui.operations.ModelSynchronizeParticipant#createScopeManager(org.eclipse.core.resources.mapping.ResourceMapping[]) */ protected ISynchronizationScopeManager createScopeManager(ResourceMapping[] mappings) { return WorkspaceSubscriberContext.createWorkspaceScopeManager(mappings, true, isConsultChangeSets); } public ChangeSetCapability getChangeSetCapability() { if (capability == null) { capability = new WorkspaceChangeSetCapability(); } return capability; } public void saveState(IMemento memento) { super.saveState(memento); memento.putString(CTX_CONSULT_CHANGE_SETS, Boolean.toString(isConsultChangeSets)); } 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; } }