/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package de.cismet.cismap.commons.util;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DropTargetDropEvent;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import javax.swing.TransferHandler;
/**
* DOCUMENT ME!
*
* @author spuhl
* @version $Revision$, $Date$
*/
public class DnDUtils {
//~ Static fields/initializers ---------------------------------------------
// TODO Best position for this code snippet ?
public static DataFlavor URI_LIST_FLAVOR;
static {
try {
URI_LIST_FLAVOR = new DataFlavor("text/uri-list;class=java.lang.String"); // NOI18N
} catch (ClassNotFoundException e) { // can't happen
e.printStackTrace();
}
}
//~ Methods ----------------------------------------------------------------
/**
* DOCUMENT ME!
*
* @param data DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public static List textURIListToFileList(final String data) {
final java.util.List list = new java.util.ArrayList(1);
for (final java.util.StringTokenizer st = new java.util.StringTokenizer(data, "\r\n"); // NOI18N
st.hasMoreTokens();) {
final String s = st.nextToken();
if (s.startsWith("#")) { // NOI18N
// the line is a comment (as per the RFC 2483)
continue;
}
try {
final java.net.URI uri = new java.net.URI(s);
final java.io.File file = new java.io.File(uri);
list.add(file);
} catch (java.net.URISyntaxException e) {
// malformed URI
} catch (IllegalArgumentException e) {
// the URI is not a valid 'file:' URI
}
}
return list;
}
/**
* DOCUMENT ME!
*
* @param dtde DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public static final boolean isFilesOrUriList(final DropTargetDropEvent dtde) {
return isFilesOrUriList(new TransferSupportWrapper(dtde));
}
/**
* DOCUMENT ME!
*
* @param tsw DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public static final boolean isFilesOrUriList(final TransferSupportWrapper tsw) {
if (tsw == null) {
return false;
}
return tsw.isDataFlavorSupported(DataFlavor.javaFileListFlavor)
|| tsw.isDataFlavorSupported(DnDUtils.URI_LIST_FLAVOR);
}
/**
* DOCUMENT ME!
*
* @param dtde DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws UnsupportedFlavorException DOCUMENT ME!
* @throws IOException DOCUMENT ME!
*/
public static List<File> getFilesFrom(final DropTargetDropEvent dtde) throws UnsupportedFlavorException,
IOException {
return getFilesFrom(new TransferSupportWrapper(dtde));
}
/**
* DOCUMENT ME!
*
* @param tsw DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws UnsupportedFlavorException DOCUMENT ME!
* @throws IOException DOCUMENT ME!
*/
public static List<File> getFilesFrom(final TransferSupportWrapper tsw) throws UnsupportedFlavorException,
IOException {
if (tsw == null) {
return null;
}
List<File> data = null;
final Transferable transferable = tsw.getTransferable();
if (tsw.isDataFlavorSupported(DnDUtils.URI_LIST_FLAVOR)) {
try {
data = (java.util.List)transferable.getTransferData(DataFlavor.javaFileListFlavor);
} catch (final Exception ex) {
if (data == null) {
data = DnDUtils.textURIListToFileList((String)transferable.getTransferData(
DnDUtils.URI_LIST_FLAVOR));
}
}
} else {
data = (java.util.List)transferable.getTransferData(DataFlavor.javaFileListFlavor);
}
return data;
}
//~ Inner Classes ----------------------------------------------------------
/**
* This class wraps a DropTargetDropEvent or TransferSupport.
*
* @version $Revision$, $Date$
*/
public static class TransferSupportWrapper {
//~ Instance fields ----------------------------------------------------
private DropTargetDropEvent event;
private TransferHandler.TransferSupport transfer;
//~ Constructors -------------------------------------------------------
/**
* Creates a new TransferSupportWrapper object.
*
* @param event DOCUMENT ME!
*/
public TransferSupportWrapper(final DropTargetDropEvent event) {
this.event = event;
}
/**
* Creates a new TransferSupportWrapper object.
*
* @param transfer DOCUMENT ME!
*/
public TransferSupportWrapper(final TransferHandler.TransferSupport transfer) {
this.transfer = transfer;
}
//~ Methods ------------------------------------------------------------
/**
* DOCUMENT ME!
*
* @param df DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public boolean isDataFlavorSupported(final DataFlavor df) {
if (event != null) {
return event.isDataFlavorSupported(df);
} else {
return transfer.isDataFlavorSupported(df);
}
}
/**
* DOCUMENT ME!
*
* @param action DOCUMENT ME!
*/
public void acceptDrop(final int action) {
if (event != null) {
event.acceptDrop(action);
}
}
/**
* DOCUMENT ME!
*
* @param success DOCUMENT ME!
*/
public void dropComplete(final boolean success) {
if (event != null) {
event.dropComplete(success);
}
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public Transferable getTransferable() {
if (event != null) {
return event.getTransferable();
} else {
return transfer.getTransferable();
}
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public List<DataFlavor> getCurrentDataFlavorsAsList() {
if (event != null) {
return event.getCurrentDataFlavorsAsList();
} else {
return Arrays.asList(transfer.getDataFlavors());
}
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public DataFlavor[] getCurrentDataFlavors() {
if (event != null) {
return event.getCurrentDataFlavors();
} else {
return transfer.getDataFlavors();
}
}
}
}