/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package bradswebdavclient; import java.awt.*; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import javax.swing.JComponent; import javax.swing.tree.*; import java.awt.dnd.*; import java.awt.event.InputEvent; import javax.swing.TransferHandler; public abstract class ResourceTransferHandler extends TransferHandler implements Unloadable { protected final JComponent component; protected final DragSource dragSource; protected final DropTarget dt; protected abstract TransferableResourceList selectedResources(); protected abstract boolean canPerformAction(JComponent target, Transferable transferable, int action, Point location); protected abstract boolean executeDrop(Transferable transferable, Point pt, int action); ResourceTransferHandler(JComponent component) { this.component = component; component.setTransferHandler(this); dragSource = new DragSource(); dragSource.createDefaultDragGestureRecognizer(component, DnDConstants.ACTION_COPY_OR_MOVE, new ResourceDragGestureListener()); dt = new DropTarget(component, new ResourceDropTargetListener()); component.setDropTarget(dt); } public void unload() { component.setTransferHandler(null); component.setDropTarget(null); } @Override public boolean canImport(JComponent comp, DataFlavor[] transferFlavors) { boolean b = super.canImport(comp, transferFlavors); System.out.println("canImport: " + b); return b; } @Override public void exportAsDrag(JComponent comp, InputEvent e, int action) { System.out.println("export as drag"); super.exportAsDrag(comp, e, action); } @Override public void exportToClipboard(JComponent comp, Clipboard clip, int action) throws IllegalStateException { super.exportToClipboard(comp, clip, action); } @Override protected Transferable createTransferable(JComponent c) { return selectedResources(); } class ResourceDragSourceListener implements DragSourceListener { public void dragDropEnd(DragSourceDropEvent dsde) { } public final void dragEnter(DragSourceDragEvent dsde) { int action = dsde.getDropAction(); if (action == DnDConstants.ACTION_COPY) { dsde.getDragSourceContext().setCursor(DragSource.DefaultCopyDrop); } else { if (action == DnDConstants.ACTION_MOVE) { dsde.getDragSourceContext().setCursor(DragSource.DefaultMoveDrop); } else { dsde.getDragSourceContext().setCursor(DragSource.DefaultMoveNoDrop); } } } public final void dragOver(DragSourceDragEvent dsde) { int action = dsde.getDropAction(); if (action == DnDConstants.ACTION_COPY) { dsde.getDragSourceContext().setCursor(DragSource.DefaultCopyDrop); } else { if (action == DnDConstants.ACTION_MOVE) { dsde.getDragSourceContext().setCursor(DragSource.DefaultMoveDrop); } else { dsde.getDragSourceContext().setCursor(DragSource.DefaultMoveNoDrop); } } } public final void dropActionChanged(DragSourceDragEvent dsde) { int action = dsde.getDropAction(); if (action == DnDConstants.ACTION_COPY) { dsde.getDragSourceContext().setCursor(DragSource.DefaultCopyDrop); } else { if (action == DnDConstants.ACTION_MOVE) { dsde.getDragSourceContext().setCursor(DragSource.DefaultMoveDrop); } else { dsde.getDragSourceContext().setCursor(DragSource.DefaultMoveNoDrop); } } } public final void dragExit(DragSourceEvent dse) { dse.getDragSourceContext().setCursor(DragSource.DefaultMoveNoDrop); } public boolean executeDrop(final Transferable transferable, final Droppable droppable, final int action) { if (action == DnDConstants.ACTION_COPY) { return droppable.acceptCopyDrop(transferable); } else if (action == DnDConstants.ACTION_MOVE) { return droppable.acceptMoveDrop(transferable); } else { return false; } } } class ResourceDropTargetListener implements DropTargetListener { public final void dragEnter(DropTargetDragEvent dtde) { int action = dtde.getDropAction(); dtde.acceptDrag(action); } public final void dragExit(DropTargetEvent dte) { } public final void dragOver(DropTargetDragEvent dtde) { Point pt = dtde.getLocation(); int action = dtde.getDropAction(); if (canPerformAction(component, dtde.getTransferable(), action, pt)) { dtde.acceptDrag(action); } else { dtde.rejectDrag(); } } public final void dropActionChanged(DropTargetDragEvent dtde) { Point pt = dtde.getLocation(); int action = dtde.getDropAction(); if (canPerformAction(component, dtde.getTransferable(), action, pt)) { dtde.acceptDrag(action); } else { dtde.rejectDrag(); } } public final void drop(DropTargetDropEvent dtde) { System.out.println("drop"); try { int action = dtde.getDropAction(); Transferable transferable = dtde.getTransferable(); Point pt = dtde.getLocation(); if (executeDrop(transferable, pt, action)) { dtde.acceptDrop(action); dtde.dropComplete(true); return; } } catch (Exception e) { System.out.println(e); dtde.rejectDrop(); dtde.dropComplete(false); } } } class ResourceDragGestureListener implements DragGestureListener { public final void dragGestureRecognized(DragGestureEvent dge) { TransferableResourceList resources = selectedResources(); System.out.println("dragGestureRecognized: " + resources); if (resources != null && resources.size() > 0) { dragSource.startDrag(dge, DragSource.DefaultMoveNoDrop, resources, new ResourceDragSourceListener()); } } } }