/** * */ package org.korsakow.ide.dnd; import java.awt.datatransfer.DataFlavor; import java.awt.dnd.DropTarget; import java.awt.dnd.DropTargetDragEvent; import java.awt.dnd.DropTargetDropEvent; import java.awt.dnd.DropTargetEvent; import java.awt.dnd.DropTargetListener; import java.util.Hashtable; import java.util.List; import java.util.TooManyListenersException; import org.apache.log4j.Logger; public class DropTargetDispatcher extends DropTarget { private final Hashtable<DataFlavor, DropTargetListener> dispatchMap = new Hashtable<DataFlavor, DropTargetListener>(); private DropTargetListener current = null; public void addDropTargetListenerNoThrow(DropTargetListener listener) { try { addDropTargetListener(listener); } catch (TooManyListenersException e) { Logger.getLogger(DropTargetDispatcher.class).error(e); // e.printStackTrace(); } } public void addFlavorHandler(DataFlavor flavor, DropTargetListener handler) { dispatchMap.put(flavor, handler); } @Override public void dragEnter(DropTargetDragEvent dtde) { super.dragEnter(dtde); if (current != null) throw new IllegalStateException(); List<DataFlavor> flavors = dtde.getCurrentDataFlavorsAsList(); for (DataFlavor flavor : flavors) if (dispatchMap.get(flavor) != null) { current = dispatchMap.get(flavor); break; } if (current == null) { dtde.rejectDrag(); return; } current.dragEnter(dtde); } @Override public void dragExit(DropTargetEvent dte) { super.dragExit(dte); if (current != null) current.dragExit(dte); current = null; } @Override public void dragOver(DropTargetDragEvent dtde) { super.dragOver(dtde); if (current != null) current.dragOver(dtde); } @Override public void drop(DropTargetDropEvent dtde) { super.drop(dtde); if (current != null) current.drop(dtde); current = null; } @Override public void dropActionChanged(DropTargetDragEvent dtde) { super.dropActionChanged(dtde); if (current != null) current.dropActionChanged(dtde); } }