| /******************************************************************************* |
| * 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; |
| } |
| |
| } |