blob: e0f53fc75e49c297f024fb7138354d7d5fd6a20e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2011 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
* Sebastian Davids <sdavids@gmx.de> - bug 69926
*******************************************************************************/
package org.eclipse.team.internal.ccvs.ui.subscriber;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.compare.CompareConfiguration;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener;
import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.viewers.ILabelDecorator;
import org.eclipse.jface.window.Window;
import org.eclipse.team.core.TeamException;
import org.eclipse.team.core.diff.IDiff;
import org.eclipse.team.core.mapping.provider.ResourceDiffTree;
import org.eclipse.team.core.synchronize.*;
import org.eclipse.team.internal.ccvs.core.CVSProviderPlugin;
import org.eclipse.team.internal.ccvs.ui.*;
import org.eclipse.team.internal.ccvs.ui.actions.*;
import org.eclipse.team.internal.core.subscribers.ActiveChangeSet;
import org.eclipse.team.internal.core.subscribers.ActiveChangeSetManager;
import org.eclipse.team.internal.ui.synchronize.*;
import org.eclipse.team.ui.TeamUI;
import org.eclipse.team.ui.synchronize.*;
import org.eclipse.ui.*;
public class WorkspaceSynchronizeParticipant extends ScopableSubscriberParticipant implements IChangeSetProvider, IPreferenceChangeListener {
public static final String ID = "org.eclipse.team.cvs.ui.cvsworkspace-participant"; //$NON-NLS-1$
/**
* 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_1 = "context_group_1"; //$NON-NLS-1$
public static final String CONTEXT_MENU_CONTRIBUTION_GROUP_2 = "context_group_2"; //$NON-NLS-1$
public static final String CONTEXT_MENU_CONTRIBUTION_GROUP_3 = "context_group_3"; //$NON-NLS-1$
public static final String CONTEXT_MENU_CONTRIBUTION_GROUP_4 = "context_group_4"; //$NON-NLS-1$
private WorkspaceChangeSetCapability capability;
/**
* CVS workspace action contribution
*/
public class WorkspaceActionContribution extends SynchronizePageActionGroup {
private WorkspaceCommitAction commitToolbar;
private WorkspaceUpdateAction updateToolbar;
@Override
public void initialize(ISynchronizePageConfiguration configuration) {
super.initialize(configuration);
updateToolbar = new WorkspaceUpdateAction(
configuration,
getVisibleRootsSelectionProvider(),
"WorkspaceToolbarUpdateAction."); //$NON-NLS-1$
updateToolbar.setPromptBeforeUpdate(true);
appendToGroup(
ISynchronizePageConfiguration.P_TOOLBAR_MENU,
TOOLBAR_CONTRIBUTION_GROUP,
updateToolbar);
commitToolbar = new WorkspaceCommitAction(
configuration,
getVisibleRootsSelectionProvider(),
"WorkspaceToolbarCommitAction."); //$NON-NLS-1$
appendToGroup(
ISynchronizePageConfiguration.P_TOOLBAR_MENU,
TOOLBAR_CONTRIBUTION_GROUP,
commitToolbar);
appendToGroup(
ISynchronizePageConfiguration.P_CONTEXT_MENU,
CONTEXT_MENU_CONTRIBUTION_GROUP_1,
new WorkspaceUpdateAction(configuration));
appendToGroup(
ISynchronizePageConfiguration.P_CONTEXT_MENU,
CONTEXT_MENU_CONTRIBUTION_GROUP_1,
new WorkspaceCommitAction(configuration));
appendToGroup(
ISynchronizePageConfiguration.P_CONTEXT_MENU,
CONTEXT_MENU_CONTRIBUTION_GROUP_2,
new OverrideAndUpdateAction(configuration));
appendToGroup(
ISynchronizePageConfiguration.P_CONTEXT_MENU,
CONTEXT_MENU_CONTRIBUTION_GROUP_2,
new OverrideAndCommitAction(configuration));
appendToGroup(
ISynchronizePageConfiguration.P_CONTEXT_MENU,
CONTEXT_MENU_CONTRIBUTION_GROUP_2,
new ConfirmMergedAction(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));
}
appendToGroup(
ISynchronizePageConfiguration.P_CONTEXT_MENU,
CONTEXT_MENU_CONTRIBUTION_GROUP_4,
new RefreshDirtyStateAction(configuration));
}
}
public class WorkspaceChangeSetCapability extends CVSChangeSetCapability {
@Override
public ActiveChangeSet createChangeSet(ISynchronizePageConfiguration configuration, IDiff[] infos) {
ActiveChangeSet set = getActiveChangeSetManager().createSet(CVSUIMessages.WorkspaceChangeSetCapability_1, new IDiff[0]);
CommitSetDialog dialog = new CommitSetDialog(configuration.getSite().getShell(), set, getResources(infos), CommitSetDialog.NEW);
dialog.open();
if (dialog.getReturnCode() != Window.OK) return null;
set.add(infos);
return set;
}
private IResource[] getResources(IDiff[] diffs) {
Set<IResource> result = new HashSet<>();
for (int i = 0; i < diffs.length; i++) {
IDiff diff = diffs[i];
IResource resource = ResourceDiffTree.getResourceFor(diff);
if (resource != null)
result.add(resource);
}
return result.toArray(new IResource[result.size()]);
}
@Override
public void editChangeSet(ISynchronizePageConfiguration configuration, ActiveChangeSet set) {
CommitSetDialog dialog = new CommitSetDialog(configuration.getSite().getShell(), set, set.getResources(), CommitSetDialog.EDIT);
dialog.open();
if (dialog.getReturnCode() != Window.OK) return;
// Nothing to do here as the set was updated by the dialog
}
@Override
public ActiveChangeSetManager getActiveChangeSetManager() {
return CVSUIPlugin.getPlugin().getChangeSetManager();
}
}
/**
* No-arg constructor used for
* creation of persisted participant after startup
*/
public WorkspaceSynchronizeParticipant() {
}
public WorkspaceSynchronizeParticipant(ISynchronizeScope scope) {
super(scope);
setSubscriber(CVSProviderPlugin.getPlugin().getCVSWorkspaceSubscriber());
SyncInfoFilter filter = createSyncInfoFilter();
if (filter != null) {
setSyncInfoFilter(filter);
}
((IEclipsePreferences) CVSUIPlugin.getPlugin().getInstancePreferences().node("")).addPreferenceChangeListener(this); //$NON-NLS-1$
}
private boolean isConsiderContents() {
return CVSUIPlugin.getPlugin().getPreferenceStore().getBoolean(ICVSUIConstants.PREF_CONSIDER_CONTENTS);
}
private SyncInfoFilter contentComparison = new SyncInfoFilter() {
private SyncInfoFilter contentCompare = new SyncInfoFilter.ContentComparisonSyncInfoFilter();
@Override
public boolean select(SyncInfo info, IProgressMonitor monitor) {
IResource local = info.getLocal();
// don't select folders
if (local.getType() != IResource.FILE) return false;
// Want to select infos whose contents do not match
return !contentCompare.select(info, monitor);
}
};
private SyncInfoFilter createSyncInfoFilter() {
final SyncInfoFilter regexFilter = createRegexFilter();
if (isConsiderContents() && regexFilter != null) {
return new SyncInfoFilter() {
@Override
public boolean select(SyncInfo info, IProgressMonitor monitor) {
return contentComparison.select(info, monitor)
&& !regexFilter.select(info, monitor);
}
};
} else if (isConsiderContents()) {
return new SyncInfoFilter() {
@Override
public boolean select(SyncInfo info, IProgressMonitor monitor) {
return contentComparison.select(info, monitor);
}
};
} else if (regexFilter != null) {
return new SyncInfoFilter() {
@Override
public boolean select(SyncInfo info, IProgressMonitor monitor) {
// want to select infos which contain at least one unmatched difference
return !regexFilter.select(info, monitor);
}
};
}
return null;
}
private SyncInfoFilter createRegexFilter() {
if (isConsiderContents()) {
String pattern = CVSUIPlugin.getPlugin().getPreferenceStore().getString(ICVSUIConstants.PREF_SYNCVIEW_REGEX_FILTER_PATTERN);
if (pattern != null && !pattern.equals("")) { //$NON-NLS-1$
return new RegexSyncInfoFilter(pattern);
}
}
return null;
}
@Override
public void init(String secondaryId, IMemento memento) throws PartInitException {
super.init(secondaryId, memento);
setSubscriber(CVSProviderPlugin.getPlugin().getCVSWorkspaceSubscriber());
}
@Override
protected void initializeConfiguration(ISynchronizePageConfiguration configuration) {
super.initializeConfiguration(configuration);
ILabelDecorator labelDecorator = getLabelDecorator(configuration);
configuration.addLabelDecorator(labelDecorator);
configuration.addMenuGroup(ISynchronizePageConfiguration.P_TOOLBAR_MENU, TOOLBAR_CONTRIBUTION_GROUP);
configuration.addActionContribution(new WorkspaceActionContribution());
configuration.setSupportedModes(ISynchronizePageConfiguration.ALL_MODES);
configuration.setMode(ISynchronizePageConfiguration.BOTH_MODE);
// Add context menu groups here to give the client displaying the
// page a chance to remove the context menu
configuration.addMenuGroup(
ISynchronizePageConfiguration.P_CONTEXT_MENU,
CONTEXT_MENU_CONTRIBUTION_GROUP_1);
configuration.addMenuGroup(
ISynchronizePageConfiguration.P_CONTEXT_MENU,
CONTEXT_MENU_CONTRIBUTION_GROUP_2);
configuration.addMenuGroup(
ISynchronizePageConfiguration.P_CONTEXT_MENU,
CONTEXT_MENU_CONTRIBUTION_GROUP_3);
configuration.addMenuGroup(
ISynchronizePageConfiguration.P_CONTEXT_MENU,
CONTEXT_MENU_CONTRIBUTION_GROUP_4);
}
protected ILabelDecorator getLabelDecorator(ISynchronizePageConfiguration configuration) {
return new CVSParticipantLabelDecorator(configuration);
}
@Override
protected ISynchronizeParticipantDescriptor getDescriptor() {
return TeamUI.getSynchronizeManager().getParticipantDescriptor(ID);
}
@Override
public void prepareCompareInput(ISynchronizeModelElement element, CompareConfiguration config, IProgressMonitor monitor) throws TeamException {
monitor.beginTask(null, 100);
CVSParticipant.deriveBaseContentsFromLocal(element, Policy.subMonitorFor(monitor, 10));
super.prepareCompareInput(element, config, Policy.subMonitorFor(monitor, 80));
CVSParticipant.updateLabelsForCVS(element, config, Policy.subMonitorFor(monitor, 10));
monitor.done();
}
@Override
public PreferencePage[] getPreferencePages() {
return CVSParticipant.addCVSPreferencePages(super.getPreferencePages());
}
@Override
public ChangeSetCapability getChangeSetCapability() {
if (capability == null) {
capability = new WorkspaceChangeSetCapability();
}
return capability;
}
@Override
protected boolean isViewerContributionsSupported() {
return true;
}
public void refresh(IResource[] resources, IWorkbenchPartSite site) {
refresh(resources, getShortTaskName(), getLongTaskName(resources), site);
}
@Override
public void dispose() {
super.dispose();
((IEclipsePreferences) CVSUIPlugin.getPlugin().getInstancePreferences().node("")).removePreferenceChangeListener(this); //$NON-NLS-1$
}
@Override
public void preferenceChange(PreferenceChangeEvent event) {
if (event.getKey().equals(ICVSUIConstants.PREF_CONSIDER_CONTENTS) || event.getKey().equals(ICVSUIConstants.PREF_SYNCVIEW_REGEX_FILTER_PATTERN)) {
SyncInfoFilter filter = createSyncInfoFilter();
if (filter != null) {
setSyncInfoFilter(filter);
} else {
setSyncInfoFilter(new FastSyncInfoFilter());
}
}
}
}