package com.revolsys.swing.dnd.transferhandler;
import java.awt.Cursor;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.dnd.DragSource;
import javax.activation.DataHandler;
import javax.swing.JComponent;
import javax.swing.JTable;
import javax.swing.TransferHandler;
import javax.swing.table.TableModel;
import com.revolsys.logging.Logs;
import com.revolsys.util.Reorderable;
public class TableRowTransferHandler extends TransferHandler {
private static final long serialVersionUID = 1L;
private final DataFlavor localObjectFlavor = new DataFlavor(Integer.class, "Integer Row Index");
private final String mimeType = this.localObjectFlavor.getMimeType();
private final JTable table;
public TableRowTransferHandler(final JTable table) {
this.table = table;
}
@Override
public boolean canImport(final TransferHandler.TransferSupport info) {
if (info.getComponent() == this.table) {
if (info.isDrop()) {
if (info.isDataFlavorSupported(this.localObjectFlavor)) {
this.table.setCursor(DragSource.DefaultMoveDrop);
return true;
}
}
}
this.table.setCursor(DragSource.DefaultMoveNoDrop);
return false;
}
@Override
protected Transferable createTransferable(final JComponent c) {
assert c == this.table;
final int selectedRow = this.table.getSelectedRow();
if (c == this.table) {
return new DataHandler(selectedRow, this.mimeType);
} else {
return null;
}
}
@Override
protected void exportDone(final JComponent c, final Transferable t, final int action) {
if (action == TransferHandler.MOVE) {
this.table.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
}
@Override
public int getSourceActions(final JComponent c) {
return TransferHandler.COPY_OR_MOVE;
}
@Override
public boolean importData(final TransferHandler.TransferSupport info) {
final JTable target = (JTable)info.getComponent();
final JTable.DropLocation dropLocation = (JTable.DropLocation)info.getDropLocation();
int index = dropLocation.getRow();
final TableModel model = this.table.getModel();
final int max = model.getRowCount();
if (index < 0 || index > max) {
index = max;
}
target.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
try {
final Transferable transferable = info.getTransferable();
final Integer rowFrom = (Integer)transferable.getTransferData(this.localObjectFlavor);
if (rowFrom != -1 && rowFrom != index) {
((Reorderable)model).reorder(rowFrom, index);
if (index > rowFrom) {
index--;
}
target.getSelectionModel().addSelectionInterval(index, index);
return true;
}
} catch (final Exception e) {
Logs.error(this, "Unexpected error", e);
}
return false;
}
}