package net.filebot.ui.transfer;
import static net.filebot.Logging.*;
import java.awt.datatransfer.Transferable;
import java.awt.dnd.InvalidDnDOperationException;
import java.util.logging.Level;
import javax.swing.TransferHandler;
import javax.swing.TransferHandler.TransferSupport;
public abstract class TransferablePolicy {
public abstract boolean accept(Transferable tr) throws Exception;
public abstract void handleTransferable(Transferable tr, TransferAction action) throws Exception;
public boolean canImport(TransferSupport support) {
if (support.isDrop()) {
support.setShowDropLocation(false);
}
try {
return accept(support.getTransferable());
} catch (InvalidDnDOperationException e) {
// final drop may cause this exception because, the transfer data can only be accessed
// *after* the drop has been accepted, but canImport is called before that
// just assume that the transferable will be accepted, accept will be called in importData again anyway
return true;
} catch (Exception e) {
debug.log(Level.WARNING, e.getMessage(), e);
return false;
}
}
public boolean importData(TransferSupport support) {
Transferable transferable = support.getTransferable();
try {
if (accept(transferable)) {
handleTransferable(transferable, getTransferAction(support));
return true;
}
} catch (Exception e) {
debug.log(Level.WARNING, e.getMessage(), e);
}
// transferable was not accepted, or transfer failed
return false;
}
protected TransferAction getTransferAction(TransferSupport support) {
if (support.isDrop()) {
return TransferAction.fromDnDConstant(support.getDropAction());
}
// use PUT by default (e.g. clipboard transfers)
return TransferAction.PUT;
}
public static enum TransferAction {
PUT(TransferHandler.MOVE), ADD(TransferHandler.COPY), LINK(TransferHandler.LINK);
private final int dndConstant;
private TransferAction(int dndConstant) {
this.dndConstant = dndConstant;
}
public int getDnDConstant() {
return dndConstant;
}
public static TransferAction fromDnDConstant(int dndConstant) {
for (TransferAction action : values()) {
if (dndConstant == action.dndConstant)
return action;
}
throw new IllegalArgumentException("Unsupported dndConstant: " + dndConstant);
}
}
}