package com.revolsys.swing.dnd.transferhandler; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.lang.ref.Reference; import java.lang.ref.WeakReference; import java.util.Arrays; import java.util.Map; import javax.swing.JComponent; import javax.swing.TransferHandler; import com.revolsys.logging.Logs; import com.revolsys.swing.dnd.transferable.MapTransferable; import com.revolsys.swing.dnd.transferable.RecordTransferable; import com.revolsys.swing.map.form.LayerRecordForm; public class RecordLayerFormTransferHandler extends TransferHandler { private static final long serialVersionUID = 1L; private final Reference<LayerRecordForm> form; public RecordLayerFormTransferHandler(final LayerRecordForm form) { this.form = new WeakReference<>(form); } @Override public boolean canImport(final JComponent comp, final DataFlavor[] transferFlavors) { for (final DataFlavor dataFlavor : transferFlavors) { if (MapTransferable.MAP_FLAVOR.equals(dataFlavor)) { return true; } else if (RecordTransferable.DATA_OBJECT_FLAVOR.equals(dataFlavor)) { return true; } } return false; } @Override protected Transferable createTransferable(final JComponent component) { final Map<String, Object> values = getForm().getValues(); final Transferable transferable = new MapTransferable(values); return transferable; } public LayerRecordForm getForm() { return this.form.get(); } @Override public int getSourceActions(final JComponent component) { return COPY; } @Override public boolean importData(final JComponent comp, final Transferable transferable) { for (final DataFlavor dataFlavor : Arrays.asList(RecordTransferable.DATA_OBJECT_FLAVOR, MapTransferable.MAP_FLAVOR)) { if (pasteValues(transferable, dataFlavor)) { return true; } } return false; } @SuppressWarnings("unchecked") public boolean pasteValues(final Transferable transferable, final DataFlavor dataFlavor) { if (transferable.isDataFlavorSupported(dataFlavor)) { try { final Map<String, Object> map = (Map<String, Object>)transferable .getTransferData(dataFlavor); getForm().pasteValues(map); return true; } catch (final Throwable e) { Logs.error(this, "Unable to paste data:", e); return false; } } else { return false; } } }