/******************************************************************************* * Copyright (c) 2009 Remy Chi Jian Suen 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 <remy.suen@gmail.com> - initial API and implementation ******************************************************************************/ package org.eclipse.ecf.sync.ui.resources; import java.lang.reflect.InvocationTargetException; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.ecf.core.IContainer; import org.eclipse.ecf.core.util.ECFException; import org.eclipse.ecf.internal.sync.resources.core.ResourcesShare; import org.eclipse.ecf.internal.sync.resources.core.SyncResourcesCore; import org.eclipse.ecf.internal.sync.ui.resources.SyncResourcesUI; import org.eclipse.ecf.presence.IPresenceContainerAdapter; import org.eclipse.ecf.presence.roster.IRosterEntry; import org.eclipse.ecf.presence.roster.IRosterManager; 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.swt.widgets.Shell; import org.eclipse.ui.handlers.HandlerUtil; import org.eclipse.ui.statushandlers.StatusManager; class ResourcesShareHandler extends AbstractRosterMenuHandler { ResourcesShareHandler(IRosterEntry entry) { super(entry); } public Object execute(ExecutionEvent event) throws ExecutionException { ISelection selection = HandlerUtil.getCurrentSelectionChecked(event); if (!(selection instanceof IStructuredSelection)) { return null; } IStructuredSelection iss = (IStructuredSelection) selection; Object o = iss.getFirstElement(); IResource resource = null; if (o instanceof IAdaptable) { resource = (IResource) ((IAdaptable) o).getAdapter(IResource.class); } else { return null; } IPresenceContainerAdapter ipca = getRosterEntry().getRoster() .getPresenceContainerAdapter(); IContainer container = (IContainer) ipca.getAdapter(IContainer.class); ResourcesShare sender = SyncResourcesCore.getResourcesShare(container .getID()); IProject project = resource.getProject(); String projectName = project.getName(); if (!SyncResourcesCore.isSharing(projectName)) { run(HandlerUtil.getActiveShellChecked(event), sender, projectName); } else { sender.stopSharing(projectName); } return null; } private void run(Shell shell, final ResourcesShare share, final String projectName) { final boolean[] ret = { false }; try { ProgressMonitorDialog dialog = new ProgressMonitorDialog(shell); dialog.open(); dialog.run(true, true, new IRunnableWithProgress() { public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { try { monitor.beginTask("Sharing " + projectName, IProgressMonitor.UNKNOWN); monitor.subTask("Sending request..."); share.startShare(getRosterEntry().getRoster().getUser() .getID(), getRosterEntry().getUser().getID(), projectName); monitor.subTask("Waiting for acknowledgement..."); while (true) { if (monitor.isCanceled()) { throw new InterruptedException(); } Thread.sleep(50); Boolean response = share.getResponse(); if (response != null) { ret[0] = response.booleanValue(); return; } } } catch (ECFException e) { throw new InvocationTargetException(e); } finally { monitor.done(); } } }); } catch (InvocationTargetException e) { IStatus status = new Status(IStatus.ERROR, SyncResourcesUI.PLUGIN_ID, "Could not send share request", e.getCause()); StatusManager.getManager().handle(status); SyncResourcesUI.log(status); } catch (InterruptedException e) { // operation canceled, stop sharing this project share.stopSharing(projectName); return; } if (ret[0]) { IRosterManager manager = getRosterEntry().getRoster() .getPresenceContainerAdapter().getRosterManager(); manager.addRosterListener(new RosterListener(share, projectName, getRosterEntry())); } else { MessageDialog.openInformation(shell, null, "Sharing request denied."); } } }