/****************************************************************************** * Copyright (c) 2008 Versant Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Remy Chi Jian Suen (Versant Corporation) - initial API and implementation ******************************************************************************/ package org.eclipse.team.internal.ecf.ui.handlers; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.List; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.*; import org.eclipse.ecf.core.IContainer; import org.eclipse.ecf.core.identity.ID; import org.eclipse.ecf.core.user.IUser; import org.eclipse.ecf.core.util.ECFException; import org.eclipse.ecf.presence.roster.IRoster; import org.eclipse.ecf.presence.roster.IRosterEntry; import org.eclipse.ecf.presence.ui.menu.AbstractRosterMenuHandler; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.widgets.Shell; import org.eclipse.team.internal.ecf.core.RemoteShare; import org.eclipse.team.internal.ecf.core.TeamSynchronization; import org.eclipse.team.internal.ecf.ui.Messages; import org.eclipse.team.internal.ecf.ui.subscriber.RemoteSubscriberParticipant; import org.eclipse.team.internal.ecf.ui.wizards.RemotePeerSynchronizeWizard; import org.eclipse.team.ui.TeamUI; import org.eclipse.team.ui.synchronize.ISynchronizeParticipant; import org.eclipse.ui.*; import org.eclipse.ui.handlers.HandlerUtil; class SynchronizeWithHandler extends AbstractRosterMenuHandler { SynchronizeWithHandler(IRosterEntry entry) { super(entry); } public Object execute(ExecutionEvent event) throws ExecutionException { IRosterEntry selectedEntry = getRosterEntry(); IRoster roster = selectedEntry.getRoster(); final IUser remoteUser = roster.getUser(); final ID localId = remoteUser.getID(); final ID remoteId = selectedEntry.getUser().getID(); IContainer container = (IContainer) roster.getPresenceContainerAdapter().getAdapter(IContainer.class); final IResource[] resources = getResources(event); final RemoteShare share = TeamSynchronization.getShare(container.getID()); IWorkbenchPart part = HandlerUtil.getActivePart(event); final IWorkbenchPartSite site = part == null ? null : part.getSite(); final Shell shell = HandlerUtil.getActiveShellChecked(event); ProgressMonitorDialog dialog = new ProgressMonitorDialog(shell); final boolean[] response = {true}; IRunnableWithProgress runnable = new IRunnableWithProgress() { public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { if (resources.length == 1) { monitor.beginTask(NLS.bind(Messages.SynchronizeWithHandler_SynchronizeResourceTaskName, resources[0].getName()), IProgressMonitor.UNKNOWN); } else { monitor.beginTask(Messages.SynchronizeWithHandler_SynchronizeResourcesTaskName, IProgressMonitor.UNKNOWN); } try { if (share.sendShareRequest(localId, remoteId, resources, monitor)) { scheduleRefreshJob(share, localId, remoteId, resources, remoteUser, site); } else { response[0] = false; } } catch (ECFException e) { throw new InvocationTargetException(e); } catch (OperationCanceledException e) { // we should only have thrown this if the user canceled the // operation, but check for this just in case if (!monitor.isCanceled()) { throw e; } } } }; try { dialog.run(true, true, runnable); if (!response[0]) { MessageDialog.openInformation(shell, null, Messages.SynchronizeWithHandler_SynchronizeRequestDenial); } } catch (InvocationTargetException e) { Throwable cause = e.getCause(); if (cause instanceof ECFException) { MessageDialog.openError(shell, null, Messages.SynchronizeWithHandler_SynchronizeRequestError); } TeamSynchronization.log("Failed to contact remote peer", cause); //$NON-NLS-1$ } catch (InterruptedException e) { Thread.interrupted(); MessageDialog.openError(shell, null, Messages.SynchronizeWithHandler_SynchronizeRequestInterrupted); TeamSynchronization.log("Synchronization request operation was interrupted", e); //$NON-NLS-1$ } return null; } void scheduleRefreshJob(RemoteShare share, ID localId, ID remoteId, IResource[] resources, IUser remoteUser, IWorkbenchPartSite site) { RemoteSubscriberParticipant participant = RemotePeerSynchronizeWizard.getSubscriberParticipant(share, localId, remoteId); participant.setResources(resources); TeamUI.getSynchronizeManager().addSynchronizeParticipants(new ISynchronizeParticipant[] {participant}); if (resources.length == 1) { participant.refresh(resources, NLS.bind(Messages.SynchronizeWithHandler_RemoteSynchronizationTaskName, remoteUser.getNickname()), NLS.bind(Messages.SynchronizeWithHandler_RemoteSynchronizationResourceDescription, resources[0].getName(), remoteUser.getNickname()), site); } else { participant.refresh(resources, NLS.bind(Messages.SynchronizeWithHandler_RemoteSynchronizationTaskName, remoteUser.getNickname()), NLS.bind(Messages.SynchronizeWithHandler_RemoteSynchronizationResourcesDescription, remoteUser.getNickname()), site); } } public IResource[] getResources(ExecutionEvent event) throws ExecutionException { ISelection selection = HandlerUtil.getCurrentSelectionChecked(event); if (selection instanceof IStructuredSelection) { List workspaceSelection = new ArrayList(((IStructuredSelection) selection).toList()); for (int i = 0; i < workspaceSelection.size(); i++) { IResource resourceOne = (IResource) ((IAdaptable) workspaceSelection.get(i)).getAdapter(IResource.class); IPath pathOne = resourceOne.getFullPath(); for (int j = i + 1; j < workspaceSelection.size(); j++) { IResource resourceTwo = (IResource) ((IAdaptable) workspaceSelection.get(j)).getAdapter(IResource.class); IPath pathTwo = resourceTwo.getFullPath(); if (pathOne.isPrefixOf(pathTwo)) { workspaceSelection.remove(j); i--; break; } else if (pathTwo.isPrefixOf(pathOne)) { workspaceSelection.remove(i); i--; break; } } } IResource[] resources = new IResource[workspaceSelection.size()]; for (int i = 0; i < resources.length; i++) { resources[i] = (IResource) ((IAdaptable) workspaceSelection.get(i)).getAdapter(IResource.class); } return resources; } IEditorPart editor = HandlerUtil.getActiveEditorChecked(event); IFile file = (IFile) editor.getEditorInput().getAdapter(IFile.class); return file == null ? new IResource[0] : new IResource[] {file}; } }