/**
*
*/
package org.korsakow.ide.ui.dnd;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JComponent;
import javax.swing.TransferHandler;
import org.apache.log4j.Logger;
import org.korsakow.domain.interf.IMedia;
/**
* Typical usage is to simply override "importMedia(TransferSupport support, List<IMedia> media)"
* @author d
*
* @param <IMedia>
*/
public abstract class InternalMediaTransferHandler extends TransferHandler
{
public InternalMediaTransferHandler()
{
}
protected boolean isInternalMediaObjectFlavor(DataFlavor flavor)
{
return (IMedia.class.isAssignableFrom(flavor.getRepresentationClass()));
}
public int getSourceActions(JComponent comp)
{
return TransferHandler.COPY_OR_MOVE;
}
/**
* Identical to canImport except it also returns the desired flavour.
* @param support
* @return null if no flavour matches
*/
protected DataFlavor pickImportFlavor(TransferSupport support)
{
DataFlavor[] flavors = support.getDataFlavors();
for (DataFlavor flavor : flavors)
{
if (isInternalMediaObjectFlavor(flavor))
return flavor;
}
return null;
}
// public boolean canImport(TransferHandler.TransferSupport support)
/**
* Delegates to pickImportFlavor. It is convenient to override pickImportFlavor and not this method.
*/
@Override
public boolean canImport(TransferSupport support)
{
return pickImportFlavor(support) != null;
}
// public boolean importData(TransferHandler.TransferSupport support)
@Override
public boolean importData(TransferSupport support)
{
try {
DataFlavor[] flavors = support.getDataFlavors();
DataFlavor flavor = pickImportFlavor(support);
assert flavor != null;
Object data = null;
try {
data = support.getTransferable().getTransferData(flavor);
} catch (UnsupportedFlavorException e) {
Logger.getLogger(InternalMediaTransferHandler.class).error("", e);
return false;
} catch (IOException e) {
Logger.getLogger(InternalMediaTransferHandler.class).error("", e);
return false;
}
List<IMedia> objects;
if (data instanceof List) {
objects = (List<IMedia>) data;
} else {
objects = new ArrayList<IMedia>();
objects.add((IMedia)data);
}
return importMedia(support, objects);
} catch (RuntimeException e) {
Logger.getLogger(InternalMediaTransferHandler.class).error("", e);
throw e;
}
}
/**
*/
protected boolean importMedia(TransferSupport support, List<? extends IMedia> media)
{
return false;
}
}