001package jmri.jmrit.throttle; 002 003import java.awt.Cursor; 004import java.awt.datatransfer.*; 005import java.awt.dnd.DragSource; 006import java.io.IOException; 007import java.util.ArrayList; 008 009import javax.activation.DataHandler; 010import javax.swing.*; 011 012import jmri.jmrit.roster.RosterEntry; 013import jmri.util.datatransfer.RosterEntrySelection; 014 015import org.slf4j.Logger; 016import org.slf4j.LoggerFactory; 017 018/** 019 * 020 * @author lionel 021 */ 022public class ThrottlesTableTransferHandler extends TransferHandler { 023 024 private final DataFlavor throttleControlObjectFlavor = new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType + ";class=" + ThrottleFrame.class.getName(), "JMRI Throttle Controller UI"); 025 private JTable table = null; 026 027 public ThrottlesTableTransferHandler(JTable throttleControllers) { 028 this.table = throttleControllers; 029 } 030 031 @Override 032 protected Transferable createTransferable(JComponent c) { 033 assert (c == table); 034 ThrottleControllerUI tf = ((ThrottlesTableModel)table.getModel()).getValueAt(table.getSelectedRow(), table.getSelectedColumn()); 035 return new DataHandler(tf, throttleControlObjectFlavor.getMimeType()); 036 } 037 038 @Override 039 public boolean canImport(TransferHandler.TransferSupport info) { 040 boolean b = info.getComponent() == table && info.isDrop() && ( 041 info.isDataFlavorSupported(throttleControlObjectFlavor) || info.isDataFlavorSupported(RosterEntrySelection.rosterEntryFlavor)); 042 table.setCursor(b ? DragSource.DefaultMoveDrop : DragSource.DefaultMoveNoDrop); 043 return b; 044 } 045 046 @Override 047 public int getSourceActions(JComponent c) { 048 return TransferHandler.MOVE; 049 } 050 051 @Override 052 public boolean importData(TransferHandler.TransferSupport info) { 053 try { 054 JTable target = (JTable) info.getComponent(); 055 JTable.DropLocation dl = (JTable.DropLocation) info.getDropLocation(); 056 target.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); 057 if (info.isDataFlavorSupported(throttleControlObjectFlavor)) { 058 try { 059 ThrottleControllerUI tf = (ThrottleControllerUI) info.getTransferable().getTransferData(throttleControlObjectFlavor); 060 if (tf != null) { 061 ((ThrottlesTableModel) table.getModel()).moveThrottleController(tf, dl.getRow(), dl.getColumn()); 062 return true; 063 } 064 } catch (UnsupportedFlavorException | IOException e) { 065 log.error("Could not drag'n drop throttle frame.", e); 066 } 067 } 068 if (info.isDataFlavorSupported(RosterEntrySelection.rosterEntryFlavor)) { 069 try { 070 ArrayList<RosterEntry> REs = RosterEntrySelection.getRosterEntries(info.getTransferable()); 071 ThrottleControllersUIContainer tw = ((ThrottlesTableModel) table.getModel()).getThrottleControllersContainerAt(dl.getColumn()); 072 for (RosterEntry re : REs) { 073 ThrottleControllerUI tf = tw.newThrottleController(); 074 tf.toFront(); 075 tf.setRosterEntry(re); 076 } 077 return true; 078 } catch (UnsupportedFlavorException | IOException e) { 079 log.error("Could not drag'n drop roster entry.", e); 080 } 081 } 082 } catch (ClassCastException e) { 083 log.error("CastException ", e); 084 } 085 return false; 086 } 087 088 @Override 089 protected void exportDone(JComponent c, Transferable t, int act) { 090 if ((act == TransferHandler.MOVE) || (act == TransferHandler.NONE)) { 091 table.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); 092 } 093 } 094 095 private final static Logger log = LoggerFactory.getLogger(ThrottlesTableTransferHandler.class); 096}