blob: a0a65a4135b351ca515dedac62d7e1a6626c3d18 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2003 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.team.internal.ccvs.ui.actions;
import java.lang.reflect.InvocationTargetException;
import org.eclipse.compare.CompareUI;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.team.core.TeamException;
import org.eclipse.team.core.subscribers.Subscriber;
import org.eclipse.team.core.synchronize.SyncInfo;
import org.eclipse.team.internal.ccvs.core.*;
import org.eclipse.team.internal.ccvs.ui.Policy;
import org.eclipse.team.internal.ccvs.ui.subscriber.WorkspaceSynchronizeParticipant;
import org.eclipse.team.internal.ui.Utils;
import org.eclipse.team.ui.TeamUI;
import org.eclipse.team.ui.synchronize.*;
import org.eclipse.ui.PlatformUI;
/**
* Action to initiate a CVS workspace synchronize
*/
public class SyncAction extends WorkspaceAction {
public void execute(IAction action) throws InvocationTargetException {
final IResource[] resources = getResourcesToSync();
if (resources == null || resources.length == 0) return;
if(isSingleFile(resources)) {
showSingleFileComparison(getShell(), CVSProviderPlugin.getPlugin().getCVSWorkspaceSubscriber(), resources[0]);
} else {
// First check if there is an existing matching participant
WorkspaceSynchronizeParticipant participant = (WorkspaceSynchronizeParticipant)SubscriberParticipant.getMatchingParticipant(WorkspaceSynchronizeParticipant.ID, resources);
// If there isn't, create one and add to the manager
if (participant == null) {
participant = new WorkspaceSynchronizeParticipant(new ResourceScope(resources));
TeamUI.getSynchronizeManager().addSynchronizeParticipants(new ISynchronizeParticipant[] {participant});
}
participant.refresh(resources, Policy.bind("Participant.synchronizing"), Policy.bind("Participant.synchronizingDetail", participant.getName()), getTargetPart().getSite()); //$NON-NLS-1$ //$NON-NLS-2$
}
}
/**
* Refresh the subscriber directly and show the resulting synchronization state in a compare editor. If there
* is no difference the user is prompted.
*
* @param resources the file to refresh and compare
*/
public static void showSingleFileComparison(final Shell shell, final Subscriber subscriber, final IResource resource) {
try {
PlatformUI.getWorkbench().getProgressService().busyCursorWhile(new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
try {
subscriber.refresh(new IResource[]{resource}, IResource.DEPTH_ZERO, monitor);
final SyncInfo info = subscriber.getSyncInfo(resource);
shell.getDisplay().syncExec(new Runnable() {
public void run() {
if (info.getKind() == SyncInfo.IN_SYNC) {
MessageDialog.openInformation(shell, Policy.bind("SyncAction.noChangesTitle"), Policy.bind("SyncAction.noChangesMessage")); //$NON-NLS-1$ //$NON-NLS-2$
} else {
SyncInfoCompareInput input = new SyncInfoCompareInput(subscriber.getName(), info);
CompareUI.openCompareEditor(input);
}
}
});
} catch (TeamException e) {
throw new InvocationTargetException(e);
}
}
});
} catch (InvocationTargetException e) {
Utils.handle(e);
} catch (InterruptedException e) {
}
}
public static boolean isSingleFile(IResource[] resources) {
return resources.length == 1 && resources[0].getType() == IResource.FILE;
}
protected IResource[] getResourcesToSync() {
return getSelectedResources();
}
/**
* Enable for resources that are managed (using super) or whose parent is a
* CVS folder.
*
* @see org.eclipse.team.internal.ccvs.ui.actions.WorkspaceAction#isEnabledForCVSResource(org.eclipse.team.internal.ccvs.core.ICVSResource)
*/
protected boolean isEnabledForCVSResource(ICVSResource cvsResource) throws CVSException {
return super.isEnabledForCVSResource(cvsResource) || cvsResource.getParent().isCVSFolder();
}
}