package com.revolsys.swing.tree.dnd; import java.awt.Component; import java.awt.datatransfer.Transferable; import javax.swing.DefaultListModel; import javax.swing.JComponent; import javax.swing.JList; import javax.swing.TransferHandler; import com.revolsys.logging.Logs; import com.revolsys.swing.dnd.transferable.ObjectTransferable; @SuppressWarnings("serial") public class TreePathListTransferHandler extends TransferHandler { /** * */ private static final long serialVersionUID = 1L; @Override public boolean canImport(final TransferSupport support) { if (support.isDataFlavorSupported(TreePathListTransferable.FLAVOR)) { final Component c = support.getComponent(); if (c instanceof JList) { final JList.DropLocation loc = (JList.DropLocation)support.getDropLocation(); final int index = loc.getIndex(); if (index != -1) { final JList list = (JList)c; final DefaultListModel model = (DefaultListModel)list.getModel(); try { final Transferable transferable = support.getTransferable(); final Object data = transferable.getTransferData(TreePathListTransferable.FLAVOR); if (data instanceof ObjectTransferable) { final ObjectTransferable<Object[]> objectTransferable = (ObjectTransferable<Object[]>)data; final Object[] selectedObjects = objectTransferable.getObject(); final Object owner = objectTransferable.getOwner(); for (final Object object : selectedObjects) { return true; } } support.setShowDropLocation(true); return true; } catch (final Exception e) { return false; } } } } return false; } @Override protected Transferable createTransferable(final JComponent c) { if (c instanceof JList) { final JList list = (JList)c; final Object[] selectedPaths = list.getSelectedValues(); return new ObjectTransferable<>(list, selectedPaths); } else { return null; } } @Override protected void exportDone(final JComponent c, final Transferable transferable, final int action) { try { final Object data = transferable.getTransferData(ObjectTransferable.FLAVOR); if (data instanceof ObjectTransferable) { final ObjectTransferable<Object[]> objectTransferable = (ObjectTransferable<Object[]>)data; final Object[] selectedObjects = objectTransferable.getObject(); final Object owner = objectTransferable.getOwner(); for (final Object object : selectedObjects) { if (owner != c) { final JList list = (JList)owner; final DefaultListModel model = (DefaultListModel)list.getModel(); model.removeElement(object); } } } } catch (final Throwable e) { Logs.error(this, "Unexpected error", e); } } @Override public int getSourceActions(final JComponent c) { if (c instanceof JList) { return MOVE; } else { return NONE; } } @Override public boolean importData(final TransferSupport support) { if (support.isDataFlavorSupported(TreePathListTransferable.FLAVOR)) { final Component c = support.getComponent(); if (c instanceof JList) { final JList.DropLocation loc = (JList.DropLocation)support.getDropLocation(); int index = loc.getIndex(); if (index != -1) { final JList list = (JList)c; final DefaultListModel model = (DefaultListModel)list.getModel(); try { final Transferable transferable = support.getTransferable(); final Object data = transferable.getTransferData(TreePathListTransferable.FLAVOR); if (data instanceof ObjectTransferable) { final ObjectTransferable<Object[]> objectTransferable = (ObjectTransferable<Object[]>)data; final Object[] selectedObjects = objectTransferable.getObject(); final Object owner = objectTransferable.getOwner(); for (final Object object : selectedObjects) { final int childIndex = model.indexOf(object); if (childIndex > -1) { model.removeElement(object); } if (index != -1) { if (childIndex > -1 && childIndex < index) { index--; } model.add(index, object); index++; } else { model.addElement(object); } } } return true; } catch (final Exception e) { Logs.error(this, "Unexpected error", e); return false; } } } } return false; } }