blob: 81f465cf4f10bd3d5cad2945e2fb26c0edf47e39 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2003, 2005 IBM 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ui.navigator.internal.dnd;
import java.util.ArrayList;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.FileTransfer;
import org.eclipse.swt.dnd.TransferData;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.navigator.CommonViewer;
import org.eclipse.ui.navigator.ICommonDropAdapter;
import org.eclipse.ui.navigator.internal.NavigatorPlugin;
import org.eclipse.ui.part.PluginDropAdapter;
import org.eclipse.ui.part.PluginTransfer;
import org.eclipse.ui.part.PluginTransferData;
/**
*
* <p>
* <strong>EXPERIMENTAL</strong>. This class or interface has been added as part of a work in
* progress. There is a guarantee neither that this API will work nor that it will remain the same.
* Please do not use this API without consulting with the Platform/UI team.
* </p>
*
* @since 3.2
*/
public class CommonNavigatorDropAdapter extends PluginDropAdapter implements ICommonDropAdapter {
private ISerializer serializer;
private final CommonViewer commonViewer;
/**
* @param viewer
*/
public CommonNavigatorDropAdapter(CommonViewer aViewer) {
super(aViewer);
commonViewer = aViewer;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.ViewerDropAdapter#performDrop(java.lang.Object)
*/
public boolean performDrop(Object data) {
boolean result = false;
if (PluginTransfer.getInstance().isSupportedType(getCurrentTransfer()))
result = super.performDrop(data);
else {
Object target = getCurrentTarget();
Object draggedObject = getSelectedObject(getCurrentTransfer(), data);
if (getCurrentTarget() == draggedObject)
return false;
IDropValidator dropValidator = null;
CommonDropHandlerService registry = CommonDropHandlerService.getInstance(commonViewer.getNavigatorContentService().getViewerId());
DropHandlerDescriptor[] descriptors = registry.getDropHandlersEnabledFor(draggedObject, target);
ArrayList validatedList = new ArrayList();
/* there may be multiple drop handler descriptors */
for (int i = 0; i < descriptors.length; i++) {
/*
* if a drop validator is defined, allow it to perform further validations --
* otherwise, run the action
*/
dropValidator = registry.getDropValidator(commonViewer, descriptors[i]);
if (dropValidator == null || dropValidator.validateDrop(this, getCurrentTarget(), getCurrentOperation(), getCurrentTransfer())) {
validatedList.add(descriptors[i]);
}
}
boolean skipOnSingle = NavigatorPlugin.getDefault().getDialogSettings().getBoolean(NavigatorDropSelectionDialog.SKIP_ON_SINGLE_SELECTION);
if (validatedList.size() > 0) {
DropHandlerDescriptor[] validatedDescriptors = new DropHandlerDescriptor[validatedList.size()];
validatedList.toArray(validatedDescriptors);
DropHandlerDescriptor descriptorToUse = validatedDescriptors[0];
if (validatedDescriptors.length != 1 || !skipOnSingle) {
Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
NavigatorDropSelectionDialog dialog = new NavigatorDropSelectionDialog(shell, validatedDescriptors);
if (Window.OK == dialog.open()) {
descriptorToUse = dialog.getSelectedDescriptor();
} else {
descriptorToUse = null;
}
}
if (null != descriptorToUse) {
/* when at least one action runs, we will return true */
result |= registry.getDropActionDelegate(commonViewer, descriptorToUse).run(this, data, target);
}
}
}
return result;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.ViewerDropAdapter#validateDrop(java.lang.Object, int,
* org.eclipse.swt.dnd.TransferData)
*/
public boolean validateDrop(Object target, int operation, TransferData transferType) {
/*
* should be called first sense the currentTransfer field is set in the parent in this
* method
*/
if (super.validateDrop(target, operation, transferType)) {
// System.out.println(getClass().getName()+".validateDrop(Object target=\""+target+"\",
// int operation=\""+operation+"\", TransferData transferType=\""+transferType+"\"):
// Validating for PluginTransfer");
return true;
}
// System.out.println(getClass().getName()+".validateDrop(Object target=\""+target+"\", int
// operation=\""+operation+"\", TransferData transferType=\""+transferType+"\"): Validating
// for ExtensibleTransfer");
Object source = getSelectedObject(transferType);
if (source == target)
return false;
IDropValidator dropValidator = null;
CommonDropHandlerService registry = CommonDropHandlerService.getInstance(commonViewer.getNavigatorContentService().getViewerId());
DropHandlerDescriptor[] descriptors = registry.getDropHandlersEnabledFor(source, target);
boolean result = false;
for (int i = 0; i < descriptors.length; i++) {
try {
dropValidator = registry.getDropValidator(commonViewer, descriptors[i]);
if (dropValidator == null || dropValidator.validateDrop(this, target, operation, transferType)) {
result = true;
break;
}
} catch (Throwable t) {
t.printStackTrace();
}
}
return result;
}
/* (non-Javadoc)
* @see org.eclipse.ui.navigator.internal.dnd.ICommonDropAdapter#getSelectedObject(org.eclipse.swt.dnd.TransferData)
*/
public Object getSelectedObject(TransferData transferType) {
IStructuredSelection selection = null;
if (LocalSelectionTransfer.getInstance().isSupportedType(transferType))
selection = (IStructuredSelection) LocalSelectionTransfer.getInstance().nativeToJava(transferType);
if (selection != null)
return selection.getFirstElement();
return null;
}
/* (non-Javadoc)
* @see org.eclipse.ui.navigator.internal.dnd.ICommonDropAdapter#getSelectedObject(org.eclipse.swt.dnd.TransferData, java.lang.Object)
*/
public Object getSelectedObject(TransferData transferType, Object data) {
IStructuredSelection selection = null;
if (LocalSelectionTransfer.getInstance().isSupportedType(transferType))
selection = (IStructuredSelection) LocalSelectionTransfer.getInstance().nativeToJava(transferType);
if (selection != null)
return selection.getFirstElement();
return null;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.ViewerDropAdapter#dragEnter(org.eclipse.swt.dnd.DropTargetEvent)
*/
public void dragEnter(DropTargetEvent event) {
super.dragEnter(event);
for (int i = 0; i < event.dataTypes.length; i++) {
if (LocalSelectionTransfer.getInstance().isSupportedType(event.dataTypes[i])) {
event.data = LocalSelectionTransfer.getInstance().getSelection();
//System.out.println(getClass().getName()+".dragEnter(DropTargetEvent
// event=\""+event+"\"): Setting LocalSelectionTransfer");
break;
} else if (PluginTransfer.getInstance().isSupportedType(event.dataTypes[i])) {
IStructuredSelection selection = (IStructuredSelection) LocalSelectionTransfer.getInstance().getSelection();
byte data[] = getSerializer().toByteArray(selection);
event.data = new PluginTransferData("org.eclipse.ui.navigator.PluginDropAction", data); //$NON-NLS-1$
//System.out.println(getClass().getName()+".dragEnter(DropTargetEvent
// event=\""+event+"\"): Setting PluginTransfer");
break;
} else if (FileTransfer.getInstance().isSupportedType(event.dataTypes[i])) {
event.data = FileTransfer.getInstance().nativeToJava(event.dataTypes[i]);
// FileTransfer from outside the workbench only allows a Copy action
event.detail = DND.DROP_COPY;
//System.out.println(getClass().getName()+".dragEnter(DropTargetEvent
// event=\""+event+"\"): Setting FileTransfer");
//System.out.println("Data: " + ((String[])event.data)[0]);
break;
}
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.swt.dnd.DropTargetAdapter#dragLeave(org.eclipse.swt.dnd.DropTargetEvent)
*/
public void dragLeave(DropTargetEvent event) {
super.dragLeave(event);
if (LocalSelectionTransfer.getInstance().isSupportedType(event.currentDataType)) {
IStructuredSelection selection = (IStructuredSelection) LocalSelectionTransfer.getInstance().getSelection();
byte data[] = getSerializer().toByteArray(selection);
event.data = new PluginTransferData("org.eclipse.ui.navigator.GenericDropAction", data); //$NON-NLS-1$
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.ViewerDropAdapter#getCurrentLocation()
*/
/* (non-Javadoc)
* @see org.eclipse.ui.navigator.internal.dnd.ICommonDropAdapter#getCurrentLocation()
*/
public int getCurrentLocation() {
return super.getCurrentLocation();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.ViewerDropAdapter#getCurrentOperation()
*/
/* (non-Javadoc)
* @see org.eclipse.ui.navigator.internal.dnd.ICommonDropAdapter#getCurrentOperation()
*/
public int getCurrentOperation() {
return super.getCurrentOperation();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.ViewerDropAdapter#getCurrentTarget()
*/
/* (non-Javadoc)
* @see org.eclipse.ui.navigator.internal.dnd.ICommonDropAdapter#getCurrentTarget()
*/
public Object getCurrentTarget() {
return super.getCurrentTarget();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.part.PluginDropAdapter#getCurrentTransfer()
*/
/* (non-Javadoc)
* @see org.eclipse.ui.navigator.internal.dnd.ICommonDropAdapter#getCurrentTransfer()
*/
public TransferData getCurrentTransfer() {
return super.getCurrentTransfer();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.ViewerDropAdapter#getSelectedObject()
*/
/* (non-Javadoc)
* @see org.eclipse.ui.navigator.internal.dnd.ICommonDropAdapter#getSelectedObject()
*/
public Object getSelectedObject() {
return super.getSelectedObject();
}
/**
* @return
*/
protected ISerializer getSerializer() {
if (serializer == null)
serializer = new NavigatorSelectionSerializer(commonViewer.getNavigatorContentService().getViewerId());
return serializer;
}
}