/*
* Copyright (c) 2012, 2013, 2015 Eike Stepper (Berlin, Germany) 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:
* Eike Stepper - initial API and implementation
*/
package org.eclipse.emf.cdo.internal.ui.transfer;
import org.eclipse.emf.cdo.eresource.CDOResourceNode;
import org.eclipse.emf.cdo.transfer.CDOTransferElement;
import org.eclipse.emf.cdo.transfer.CDOTransferSystem;
import org.eclipse.emf.cdo.transfer.spi.repository.RepositoryTransferSystem;
import org.eclipse.emf.cdo.transfer.spi.ui.TransferUIProvider;
import org.eclipse.emf.cdo.transfer.spi.ui.TransferUIProvider.Factory;
import org.eclipse.emf.cdo.transfer.ui.TransferDialog;
import org.eclipse.emf.cdo.view.CDOView;
import org.eclipse.emf.cdo.view.CDOViewRegistry;
import org.eclipse.net4j.util.ObjectUtil;
import org.eclipse.net4j.util.container.IManagedContainer;
import org.eclipse.net4j.util.container.IPluginContainer;
import org.eclipse.net4j.util.io.ExtendedDataInputStream;
import org.eclipse.net4j.util.io.IORuntimeException;
import org.eclipse.net4j.util.ui.UIUtil;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.part.IDropActionDelegate;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* @author Eike Stepper
*/
public class RepositoryPluginDropAdapter implements IDropActionDelegate
{
public static final String DROP_ACTION_ID = "org.eclipse.emf.cdo.ui.RepositoryPluginDropAdapter";
private TransferUIProvider[] uiProviders;
public RepositoryPluginDropAdapter()
{
uiProviders = getUIProviders();
}
protected IManagedContainer getContainer()
{
return IPluginContainer.INSTANCE;
}
protected TransferUIProvider[] getUIProviders()
{
return Factory.getAll(getContainer());
}
public boolean run(Object source, Object target)
{
List<CDOResourceNode> nodes = getResourceNodes(source);
if (ObjectUtil.isEmpty(nodes))
{
return false;
}
CDOView view = nodes.get(0).cdoView();
CDOTransferSystem sourceSystem = new RepositoryTransferSystem(view);
List<CDOTransferElement> sourceElements = new ArrayList<CDOTransferElement>(nodes.size());
for (CDOResourceNode node : nodes)
{
sourceElements.add(sourceSystem.getElement(node.getPath()));
}
CDOTransferElement targetElement = getTargetElement(target);
if (targetElement == null || !targetElement.isDirectory())
{
return false;
}
Shell shell = UIUtil.getShell();
return TransferDialog.open(shell, sourceElements, targetElement);
}
protected CDOTransferElement getTargetElement(Object target)
{
for (TransferUIProvider uiProvider : uiProviders)
{
CDOTransferElement targetElement = uiProvider.convertTransferTarget(target);
if (targetElement != null)
{
return targetElement;
}
}
return null;
}
protected List<CDOResourceNode> getResourceNodes(Object source)
{
try
{
ByteArrayInputStream bais = new ByteArrayInputStream((byte[])source);
@SuppressWarnings("resource")
ExtendedDataInputStream in = new ExtendedDataInputStream(bais);
int viewID = in.readInt();
CDOView view = CDOViewRegistry.INSTANCE.getView(viewID);
if (view == null)
{
return null;
}
List<CDOResourceNode> nodes = new ArrayList<CDOResourceNode>();
for (;;)
{
String path = in.readString();
if (path == null)
{
break;
}
CDOResourceNode node = view.getResourceNode(path);
if (node != null)
{
nodes.add(node);
}
}
return nodes;
}
catch (IOException ex)
{
throw new IORuntimeException(ex);
}
}
}