package open.dolphin.order;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
import javax.swing.JComponent;
import javax.swing.JTable;
import javax.swing.TransferHandler;
import open.dolphin.table.ListTableModel;
/**
* MasterItemTransferHandler
*
* @author Minagawa,Kazushi. Digital Globe, Inc.
*
*/
public final class MasterItemTransferHandler extends TransferHandler {
private final DataFlavor masterItemFlavor = MasterItemTransferable.masterItemFlavor;
private JTable sourceTable;
private MasterItem dragItem;
private boolean shouldRemove;
@Override
protected Transferable createTransferable(JComponent c) {
sourceTable = (JTable) c;
ListTableModel<MasterItem> tableModel = (ListTableModel<MasterItem>) sourceTable.getModel();
int fromIndex = sourceTable.getSelectedRow();
dragItem = tableModel.getObject(fromIndex);
return dragItem != null ? new MasterItemTransferable(dragItem) : null;
}
@Override
public int getSourceActions(JComponent c) {
return MOVE;
}
@Override
public boolean importData(TransferHandler.TransferSupport support) {
if (!canImport(support)) {
return false;
}
try {
JTable.DropLocation dl = (JTable.DropLocation)support.getDropLocation();
int toIndex = dl.getRow();
if (dl.isInsertRow() && toIndex>-1) {
Transferable t = support.getTransferable();
MasterItem dropItem = (MasterItem) t.getTransferData(masterItemFlavor);
JTable dropTable = (JTable) support.getComponent();
ListTableModel<MasterItem> tableModel = (ListTableModel<MasterItem>) dropTable.getModel();
shouldRemove = dropTable == sourceTable;
if (toIndex<tableModel.getObjectCount()) {
tableModel.addObject(toIndex, dropItem);
} else {
tableModel.addObject(dropItem);
}
return true;
}
} catch (UnsupportedFlavorException | IOException ioe) {
ioe.printStackTrace(System.err);
}
return false;
}
@Override
protected void exportDone(JComponent c, Transferable data, int action) {
if (action==MOVE && shouldRemove && (dragItem!=null)) {
ListTableModel<MasterItem> tableModel = (ListTableModel<MasterItem>) sourceTable.getModel();
tableModel.delete(dragItem);
}
shouldRemove = false;
dragItem = null;
}
@Override
public boolean canImport(TransferHandler.TransferSupport support) {
return (support.isDrop() && support.isDataFlavorSupported(masterItemFlavor));
}
}