| /******************************************************************************* |
| * Copyright (c) 2000, 2010 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.resources.IResource; |
| import org.eclipse.jface.action.IAction; |
| import org.eclipse.jface.dialogs.IDialogConstants; |
| import org.eclipse.jface.dialogs.MessageDialogWithToggle; |
| import org.eclipse.jface.preference.IPreferenceStore; |
| import org.eclipse.osgi.util.NLS; |
| import org.eclipse.team.internal.ccvs.core.*; |
| import org.eclipse.team.internal.ccvs.core.client.listeners.LogEntry; |
| import org.eclipse.team.internal.ccvs.core.filehistory.CVSFileRevision; |
| import org.eclipse.team.internal.ccvs.core.syncinfo.ResourceSyncInfo; |
| import org.eclipse.team.internal.ccvs.ui.*; |
| import org.eclipse.team.internal.ccvs.ui.operations.ShowAnnotationOperation; |
| |
| public class ShowAnnotationAction extends WorkspaceAction { |
| |
| /** |
| * Action to open a CVS Annotate View |
| */ |
| public void execute(IAction action) throws InvocationTargetException, InterruptedException { |
| final ICVSResource resource= getSingleSelectedCVSResource(); |
| if (resource == null) |
| return; |
| execute(resource); |
| } |
| |
| /** |
| * Fetch the revision number of a CVS resource and perform a ShowAnnotationOperation |
| * in the background. |
| * |
| * @param cvsResource The CVS resource (must not be null) |
| * |
| * @throws InvocationTargetException |
| * @throws InterruptedException |
| */ |
| public void execute(final ICVSResource cvsResource) throws InvocationTargetException, InterruptedException { |
| final String revision= getRevision(cvsResource); |
| if (revision == null) |
| return; |
| boolean binary = isBinary(cvsResource); |
| if (binary) { |
| final IPreferenceStore store = CVSUIPlugin.getPlugin().getPreferenceStore(); |
| final String option = store.getString(ICVSUIConstants.PREF_ANNOTATE_PROMPTFORBINARY); |
| if (option.equals(MessageDialogWithToggle.PROMPT)) { |
| final MessageDialogWithToggle dialog = (MessageDialogWithToggle.openYesNoQuestion(getShell(), CVSUIMessages.ShowAnnotationAction_2, NLS.bind(CVSUIMessages.ShowAnnotationAction_3, new String[] {cvsResource.getName()}), CVSUIMessages.ShowAnnotationOperation_4, false, store, ICVSUIConstants.PREF_ANNOTATE_PROMPTFORBINARY)); |
| final int result = dialog.getReturnCode(); |
| switch (result) { |
| case IDialogConstants.NO_ID : |
| return; |
| } |
| } else if (option.equals(MessageDialogWithToggle.NEVER)) |
| return; |
| } |
| |
| new ShowAnnotationOperation(getTargetPart(), cvsResource, revision, binary).run(); |
| } |
| |
| private boolean isBinary(ICVSResource cvsResource) { |
| if (cvsResource.isFolder()) return false; |
| |
| try { |
| byte[] syncBytes = ((ICVSFile)cvsResource).getSyncBytes(); |
| if (syncBytes == null) |
| return false; |
| return ResourceSyncInfo.isBinary(syncBytes); |
| } catch (CVSException e) { |
| return false; |
| } |
| } |
| |
| /** |
| * Only enabled for single resource selection |
| */ |
| public boolean isEnabled() { |
| ICVSResource resource = getSingleSelectedCVSResource(); |
| try { |
| return (resource != null && ! resource.isFolder() && resource.isManaged()); |
| } catch (CVSException e) { |
| return isEnabledForException(e); |
| } |
| } |
| |
| /** |
| * This action is called from one of a Resource Navigator a CVS Resource |
| * Navigator or a History Log Viewer. Return the selected resource as an |
| * ICVSResource |
| * |
| * @return ICVSResource |
| */ |
| private ICVSResource getSingleSelectedCVSResource() { |
| // Selected from a CVS Resource Navigator |
| final ICVSResource[] cvsResources = getSelectedCVSResources(); |
| if (cvsResources.length == 1) { |
| return cvsResources[0]; |
| } |
| |
| // Selected from a History Viewer |
| final Object[] logEntries = getAdaptedSelection(LogEntry.class); |
| if (logEntries.length == 1) { |
| final LogEntry aLogEntry = (LogEntry) logEntries[0]; |
| final ICVSRemoteFile cvsRemoteFile = aLogEntry.getRemoteFile(); |
| return cvsRemoteFile; |
| } |
| |
| //Selected from the CVS History Page |
| final Object[] fileRevisions = getAdaptedSelection(CVSFileRevision.class); |
| if (fileRevisions.length == 1) { |
| final ICVSRemoteFile cvsRemoteFile =((CVSFileRevision) fileRevisions[0]).getCVSRemoteFile(); |
| return cvsRemoteFile; |
| } |
| |
| |
| // Selected from a Resource Navigator |
| final IResource[] resources = getSelectedResources(); |
| if (resources.length == 1) { |
| return getCVSResourceFor(resources[0]); |
| } |
| return null; |
| } |
| |
| |
| /** |
| * Get the revision for the CVS resource. Throws an InvocationTargetException |
| * if the revision could not be determined. |
| * |
| * @param cvsResource The CVS resource |
| * @return The revision of the resource. |
| * @throws InvocationTargetException |
| */ |
| private String getRevision(ICVSResource cvsResource) throws InvocationTargetException { |
| final ResourceSyncInfo info; |
| try { |
| info= cvsResource.getSyncInfo(); |
| if (info == null) |
| throw new CVSException(NLS.bind(CVSUIMessages.ShowAnnotationAction_noSyncInfo, new String[] { cvsResource.getName() })); |
| } catch (CVSException e) { |
| throw new InvocationTargetException(e); |
| } |
| return info.getRevision(); |
| } |
| |
| public String getId() { |
| return ICVSUIConstants.CMD_ANNOTATE; |
| } |
| } |