blob: 914b204f282cfbbb50f66998ca7f7dd57229d3e2 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2009 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
* Brock Janiczak <brockj@tpg.com.au> - Bug 166333 [Wizards] Show diff in CVS commit dialog
*******************************************************************************/
package org.eclipse.team.internal.ccvs.ui.wizards;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.action.*;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.widgets.Display;
import org.eclipse.team.core.mapping.provider.SynchronizationContext;
import org.eclipse.team.internal.ccvs.ui.CVSDecoration;
import org.eclipse.team.internal.ccvs.ui.Policy;
import org.eclipse.team.internal.ccvs.ui.mappings.WorkspaceChangeSetCapability;
import org.eclipse.team.internal.ccvs.ui.mappings.WorkspaceModelParticipant;
import org.eclipse.team.internal.ccvs.ui.subscriber.CVSParticipantLabelDecorator;
import org.eclipse.team.internal.ui.Utils;
import org.eclipse.team.internal.ui.synchronize.ChangeSetCapability;
import org.eclipse.team.internal.ui.synchronize.SynchronizePageConfiguration;
import org.eclipse.team.ui.mapping.SynchronizationActionProvider;
import org.eclipse.team.ui.synchronize.*;
/**
* A participant that uses our decorator instead of the standard one.
*/
public class CommitWizardParticipant extends WorkspaceModelParticipant {
/**
* The actions to be displayed in the context menu.
*/
private class ActionContribution extends SynchronizePageActionGroup {
@Override
public void modelChanged(final ISynchronizeModelElement root) {
super.modelChanged(root);
Display.getDefault().asyncExec(() -> {
final CommitWizardCommitPage page = fWizard.getCommitPage();
if (page != null)
page.updateForModelChange();
});
}
}
private WorkspaceChangeSetCapability capability;
@Override
public ChangeSetCapability getChangeSetCapability() {
if (capability == null) {
capability = new WorkspaceChangeSetCapability() {
@Override
public boolean supportsCheckedInChangeSets() {
return false;
}
@Override
public boolean enableActiveChangeSetsFor(ISynchronizePageConfiguration configuration) {
return false;
};
};
}
return capability;
}
/**
* An extension of the standard label decorator which configures the keyword substitution
* mode according to the settings on the file type wizard page.
*/
private static class Decorator extends CVSParticipantLabelDecorator {
private final CommitWizard fWizard;
public Decorator(ISynchronizePageConfiguration configuration, CommitWizard wizard) {
super(configuration);
fWizard= wizard;
}
@Override
protected CVSDecoration getDecoration(IResource resource) throws CoreException {
final CVSDecoration decoration= super.getDecoration(resource);
final CommitWizardFileTypePage page= fWizard.getFileTypePage();
if (page != null && resource instanceof IFile)
decoration.setKeywordSubstitution(page.getOption((IFile)resource).getShortDisplayText());
return decoration;
}
}
protected static final String ACTION_GROUP = "org.eclipse.tam.cvs.ui.CommitActions"; //$NON-NLS-1$
final CommitWizard fWizard;
protected Action showComparePaneAction;
public CommitWizardParticipant(SynchronizationContext context, CommitWizard wizard) {
super(context);
fWizard= wizard;
}
@Override
protected ILabelDecorator getLabelDecorator(ISynchronizePageConfiguration configuration) {
return new Decorator(configuration, fWizard);
}
@Override
protected void initializeConfiguration(final ISynchronizePageConfiguration configuration) {
super.initializeConfiguration(configuration);
configuration.setProperty(ISynchronizePageConfiguration.P_TOOLBAR_MENU, new String[] {ACTION_GROUP, ISynchronizePageConfiguration.NAVIGATE_GROUP});
configuration.setProperty(ISynchronizePageConfiguration.P_CONTEXT_MENU, ISynchronizePageConfiguration.DEFAULT_CONTEXT_MENU);
configuration.addMenuGroup(
ISynchronizePageConfiguration.P_CONTEXT_MENU,
CONTEXT_MENU_CONTRIBUTION_GROUP_3);
configuration.addActionContribution(new ActionContribution());
// Wrap the container so that we can update the enablements after the runnable
// (i.e. the container resets the state to what it was at the beginning of the
// run even if the state of the page changed. Remove from View changes the state)
configuration.setRunnableContext((fork, cancelable, runnable) -> {
fWizard.getContainer().run(fork, cancelable, runnable);
final CommitWizardCommitPage page = fWizard.getCommitPage();
if (page != null)
page.updateEnablements();
});
configuration.setSupportedModes(ISynchronizePageConfiguration.OUTGOING_MODE);
configuration.setMode(ISynchronizePageConfiguration.OUTGOING_MODE);
configuration.addActionContribution(new SynchronizePageActionGroup() {
@Override
public void initialize(ISynchronizePageConfiguration configuration) {
super.initialize(configuration);
showComparePaneAction = new Action(null, Action.AS_CHECK_BOX) {
@Override
public void run() {
fWizard.getCommitPage().showComparePane(this.isChecked());
}
};
Utils.initAction(showComparePaneAction, "ComnitWizardComparePaneToggle.", Policy.getActionBundle()); //$NON-NLS-1$
showComparePaneAction.setChecked(isComparePaneVisible());
appendToGroup(ISynchronizePageConfiguration.P_TOOLBAR_MENU, ACTION_GROUP, showComparePaneAction);
}
});
configuration.setProperty(SynchronizePageConfiguration.P_OPEN_ACTION, new Action() {
@Override
public void run() {
ISelection selection = configuration.getSite().getSelectionProvider().getSelection();
if(selection instanceof IStructuredSelection) {
final Object obj = ((IStructuredSelection) selection).getFirstElement();
if (fWizard.getParticipant().hasCompareInputFor(obj)) {
fWizard.getCommitPage().showComparePane(true);
showComparePaneAction.setChecked(true);
}
}
}
});
}
@Override
public boolean doesSupportSynchronize() {
return false;
}
private boolean isComparePaneVisible() {
IDialogSettings section = fWizard.getDialogSettings().getSection(CommitWizard.COMMIT_WIZARD_DIALOG_SETTINGS);
return section == null ? false : section.getBoolean(CommitWizardCommitPage.SHOW_COMPARE);
}
@Override
protected ModelSynchronizeParticipantActionGroup createMergeActionGroup() {
return new WorkspaceMergeActionGroup() {
@Override
protected void addToContextMenu(String mergeActionId, Action action, IMenuManager manager) {
if (mergeActionId == SynchronizationActionProvider.MERGE_ACTION_ID
|| mergeActionId == SynchronizationActionProvider.OVERWRITE_ACTION_ID
|| mergeActionId == SynchronizationActionProvider.MARK_AS_MERGE_ACTION_ID) {
// skip merge actions
return;
}
super.addToContextMenu(mergeActionId, action, manager);
}
@Override
protected void appendToGroup(String menuId, String groupId, IAction action) {
if (menuId == ISynchronizePageConfiguration.P_CONTEXT_MENU
&& groupId == WorkspaceModelParticipant.CONTEXT_MENU_COMMIT_GROUP_1) {
// skip commit action
return;
}
super.appendToGroup(menuId, groupId, action);
}
};
}
}