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}