| /******************************************************************************* |
| * Copyright (c) 2000, 2006 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.actions; |
| |
| import java.lang.reflect.InvocationTargetException; |
| |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.runtime.NullProgressMonitor; |
| import org.eclipse.jface.action.IAction; |
| import org.eclipse.jface.dialogs.IDialogConstants; |
| import org.eclipse.jface.dialogs.MessageDialogWithToggle; |
| import org.eclipse.jface.operation.IRunnableWithProgress; |
| import org.eclipse.jface.preference.IPreferenceStore; |
| import org.eclipse.jface.window.Window; |
| import org.eclipse.osgi.util.NLS; |
| import org.eclipse.team.internal.ccvs.core.*; |
| import org.eclipse.team.internal.ccvs.ui.*; |
| import org.eclipse.team.internal.ccvs.ui.operations.ITagOperation; |
| import org.eclipse.team.internal.ccvs.ui.repo.RepositoryManager; |
| import org.eclipse.team.internal.ccvs.ui.tags.TagAsVersionDialog; |
| |
| /** |
| * TagAction tags the selected resources with a version tag specified by the user. |
| */ |
| public abstract class TagAction extends WorkspaceTraversalAction { |
| |
| // remember if the execute action was cancelled |
| private boolean wasCancelled = false; |
| |
| @Override |
| public void execute(IAction action) throws InvocationTargetException, InterruptedException { |
| setWasCancelled(false); |
| |
| // Prompt for the tag name |
| final ITagOperation[] result = new ITagOperation[1]; |
| getShell().getDisplay().syncExec(() -> { |
| result[0] = configureOperation(); |
| if (result[0] == null) { |
| return; |
| } |
| }); |
| |
| if (result[0] == null) { |
| setWasCancelled(true); |
| return; |
| } |
| |
| result[0].run(); |
| } |
| |
| protected boolean performPrompting(ITagOperation operation) { |
| return true; |
| } |
| |
| /** |
| * Prompts the user for a tag name. |
| * Note: This method is designed to be overridden by test cases. |
| * @return the operation, or null to cancel |
| */ |
| protected ITagOperation configureOperation() { |
| IPreferenceStore store = CVSUIPlugin.getPlugin().getPreferenceStore(); |
| ITagOperation operation = createTagOperation(); |
| if (operation.isEmpty()) { |
| return null; |
| } |
| if (!performPrompting(operation)) { |
| return null; |
| } |
| TagAsVersionDialog dialog = new TagAsVersionDialog(getShell(), |
| CVSUIMessages.TagAction_tagResources, |
| operation); |
| if (dialog.open() != Window.OK) return null; |
| |
| // The user has indicated they want to force a move. Make sure they really do. |
| if (dialog.shouldMoveTag() && store.getBoolean(ICVSUIConstants.PREF_CONFIRM_MOVE_TAG)) { |
| MessageDialogWithToggle confirmDialog = MessageDialogWithToggle.openYesNoQuestion(getShell(), |
| CVSUIMessages.TagAction_moveTagConfirmTitle, |
| NLS.bind(CVSUIMessages.TagAction_moveTagConfirmMessage, new String[] { dialog.getTagName() }), |
| null, |
| false, |
| null, |
| null); |
| |
| if (confirmDialog.getReturnCode() == IDialogConstants.YES_ID) { |
| store.setValue(ICVSUIConstants.PREF_CONFIRM_MOVE_TAG, !confirmDialog.getToggleState()); |
| } else { |
| return null; |
| } |
| } |
| |
| // The user is a cowboy and wants to do it. |
| return dialog.getOperation(); |
| } |
| |
| protected abstract ITagOperation createTagOperation(); |
| |
| @Override |
| protected String getErrorTitle() { |
| return CVSUIMessages.TagAction_tagErrorTitle; |
| } |
| |
| @Override |
| protected String getWarningTitle() { |
| return CVSUIMessages.TagAction_tagWarningTitle; |
| } |
| |
| @Override |
| protected boolean isEnabledForAddedResources() { |
| return false; |
| } |
| |
| public boolean wasCancelled() { |
| return wasCancelled; |
| } |
| |
| public void setWasCancelled(boolean b) { |
| wasCancelled = b; |
| } |
| |
| public static void broadcastTagChange(final ICVSResource[] resources, final CVSTag tag) throws InvocationTargetException, InterruptedException { |
| final RepositoryManager manager = CVSUIPlugin.getPlugin().getRepositoryManager(); |
| manager.run(new IRunnableWithProgress() { |
| @Override |
| public void run(IProgressMonitor monitor) { |
| try { |
| for (int i = 0; i < resources.length; i++) { |
| ICVSResource resource = resources[i]; |
| // Cache the new tag creation even if the tag may have had warnings. |
| manager.addTags(getRootParent(resource), new CVSTag[] {tag}); |
| } |
| } catch (CVSException e) { |
| CVSUIPlugin.log(e); |
| } |
| } |
| private ICVSResource getRootParent(ICVSResource resource) throws CVSException { |
| if (!resource.isManaged()) return resource; |
| ICVSFolder parent = resource.getParent(); |
| if (parent == null) return resource; |
| // Special check for a parent which is the repository itself |
| if (parent.getName().length() == 0) return resource; |
| return getRootParent(parent); |
| } |
| }, new NullProgressMonitor()); |
| } |
| } |
| |