Package org.eclipse.ecf.sync.ui.resources

Source Code of org.eclipse.ecf.sync.ui.resources.ResourcesShareHandler

/*******************************************************************************
* 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.");
    }
  }
}
TOP

Related Classes of org.eclipse.ecf.sync.ui.resources.ResourcesShareHandler

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.