/**
*
*/
package org.korsakow.ide.ui.dnd;
import java.awt.Point;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.TooManyListenersException;
import javax.swing.JComponent;
import javax.swing.TransferHandler;
import org.apache.log4j.Logger;
import org.korsakow.ide.resources.WidgetType;
public class WidgetTypeTransferHandler extends TransferHandler
{
private static enum Type
{
Object,
}
@Override
public int getSourceActions(JComponent component)
{
return TransferHandler.COPY;
}
private Point mousePoint = null;
private final DropTargetListener mousePointListener = new DropTargetListener() {
public void dragEnter(DropTargetDragEvent dtde) {
}
public void dragExit(DropTargetEvent dte) {
}
public void dragOver(DropTargetDragEvent dtde) {
mousePoint = dtde.getLocation();
}
public void drop(DropTargetDropEvent dtde) {
}
public void dropActionChanged(DropTargetDragEvent dtde) {
}
};
public Point getDropPoint()
{
return mousePoint;
}
// public boolean canImport(TransferHandler.TransferSupport support)
@Override
public boolean canImport(JComponent comp, DataFlavor[] flavours)
{
try {
comp.getDropTarget().addDropTargetListener(mousePointListener);
} catch (TooManyListenersException e) {
Logger.getLogger(WidgetTypeTransferHandler.class).error(e);
}
for (DataFlavor flavor : flavours)
{
if (flavor.match(DataFlavors.WidgetType))
return true;
}
return false;
}
// public boolean importData(TransferHandler.TransferSupport support)
@Override
public boolean importData(JComponent comp, Transferable t)
{
comp.getDropTarget().removeDropTargetListener(mousePointListener);
try {
Type type = null;
DataFlavor[] flavors = t.getTransferDataFlavors();
DataFlavor flavor = null;
for (DataFlavor f : flavors)
{
if (f.match(DataFlavors.WidgetType))
{
flavor = f;
type = Type.Object;
break;
}
}
assert flavor != null;
Object data = null;
try {
data = t.getTransferData(flavor);
} catch (UnsupportedFlavorException e) {
Logger.getLogger(WidgetTypeTransferHandler.class).error(e);
return false;
} catch (IOException e) {
Logger.getLogger(WidgetTypeTransferHandler.class).error(e);
return false;
}
switch (type)
{
case Object:
List<WidgetType> objects;
if (data instanceof Collection) {
objects = (List<WidgetType>) data;
} else {
objects = new ArrayList<WidgetType>();
objects.add((WidgetType)data);
}
return importWidgetType(t, objects);
default:
return false;
}
} catch (RuntimeException e) {
Logger.getLogger(WidgetTypeTransferHandler.class).error(e);
throw e;
}
}
/**
*/
protected boolean importWidgetType(Transferable t, List<WidgetType> widgets)
{
return true;
}
}