package org.bndtools.utils.dnd; import java.util.ArrayList; import java.util.EnumSet; import java.util.List; import org.eclipse.core.resources.IResource; import org.eclipse.jface.util.LocalSelectionTransfer; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.StructuredViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerDropAdapter; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.DropTargetEvent; import org.eclipse.swt.dnd.FileTransfer; import org.eclipse.swt.dnd.TextTransfer; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.dnd.TransferData; import org.eclipse.ui.part.ResourceTransfer; public class AbstractViewerDropAdapter extends ViewerDropAdapter { private final EnumSet<SupportedTransfer> supportedTransfers; public AbstractViewerDropAdapter(Viewer viewer, EnumSet<SupportedTransfer> supportedTransfers) { super(viewer); this.supportedTransfers = supportedTransfers; } public void install(StructuredViewer viewer) { List<Transfer> transfers = new ArrayList<Transfer>(); if (supportedTransfers.contains(SupportedTransfer.File)) transfers.add(FileTransfer.getInstance()); if (supportedTransfers.contains(SupportedTransfer.Resource)) transfers.add(ResourceTransfer.getInstance()); if (supportedTransfers.contains(SupportedTransfer.Text)) transfers.add(TextTransfer.getInstance()); if (supportedTransfers.contains(SupportedTransfer.LocalSelection)) transfers.add(LocalSelectionTransfer.getTransfer()); viewer.addDropSupport(DND.DROP_COPY | DND.DROP_MOVE, transfers.toArray(new Transfer[0]), this); } // Turn all move events into copy events @Override public void dragEnter(DropTargetEvent event) { super.dragEnter(event); event.detail = DND.DROP_COPY; } @Override public boolean performDrop(Object data) { Object target = getCurrentTarget(); int location = getCurrentLocation(); boolean result = false; if (data instanceof String) { result = performTextDrop((String) data, target, location); } else if (data instanceof String[]) { result = performFileDrop((String[]) data, target, location); } else if (data instanceof IResource[]) { result = performResourceDrop((IResource[]) data, target, location); } else if (data instanceof ISelection) { result = performSelectionDrop((ISelection) data, target, location); } return result; } @SuppressWarnings({ "static-method", "unused" }) protected boolean performTextDrop(String data, Object target, int location) { return false; } @SuppressWarnings({ "static-method", "unused" }) protected boolean performFileDrop(String[] data, Object target, int location) { return false; } @SuppressWarnings({ "static-method", "unused" }) protected boolean performResourceDrop(IResource[] data, Object target, int location) { return false; } @SuppressWarnings({ "static-method", "unused" }) protected boolean performSelectionDrop(ISelection data, Object target, int location) { return false; } @Override public boolean validateDrop(Object target, int operation, TransferData transferType) { if (supportedTransfers.contains(SupportedTransfer.File) && FileTransfer.getInstance().isSupportedType(transferType)) { return validateFileDrop(target); } else if (supportedTransfers.contains(SupportedTransfer.Resource) && ResourceTransfer.getInstance().isSupportedType(transferType)) { return validateResourceDrop(target); } else if (supportedTransfers.contains(SupportedTransfer.Text) && TextTransfer.getInstance().isSupportedType(transferType)) { return validateTextDrop(target); } else if (supportedTransfers.contains(SupportedTransfer.LocalSelection) && LocalSelectionTransfer.getTransfer().isSupportedType(transferType)) { return validateLocalSelectionDrop(target); } else { return false; } } @SuppressWarnings({ "static-method", "unused" }) protected boolean validateFileDrop(Object target) { return true; } @SuppressWarnings({ "static-method", "unused" }) protected boolean validateResourceDrop(Object target) { return true; } @SuppressWarnings({ "static-method", "unused" }) protected boolean validateTextDrop(Object target) { return true; } @SuppressWarnings({ "static-method", "unused" }) protected boolean validateLocalSelectionDrop(Object target) { return true; } }