package aliview.sequencelist;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.activation.ActivationDataFlavor;
import javax.activation.DataHandler;
import javax.swing.DropMode;
import javax.swing.JComponent;
import javax.swing.JList;
import javax.swing.TransferHandler;
import org.apache.log4j.Logger;
import aliview.AliView;
import aliview.AliViewWindow;
import aliview.sequences.Sequence;
/*
*
* TODO if you want to drag and drop seqs between windows then you have to serializable-them
* // or actually as Fasta strings..... ind import them where dropped
*
*
*/
public class SequenceTransferHandler extends TransferHandler {
private static final Logger logger = Logger.getLogger(SequenceTransferHandler.class);
private int[] rows = null;
private int addIndex = -1;
private int addCount = 0;
private final DataFlavor LOCAL_OBJECT_FLAVOR = new ActivationDataFlavor(Object[].class, DataFlavor.javaJVMLocalObjectMimeType, "Array of items");
private Object[] transferedObjects = null;
private JComponent source = null;
private AliViewWindow aliWindow;
public SequenceTransferHandler(AliViewWindow aliWindow) {
this.aliWindow = aliWindow;
}
@Override
protected Transferable createTransferable(JComponent c) {
logger.info("create Transferable");
source = c;
JList list = (JList) c;
AlignmentListModel model = (AlignmentListModel)list.getModel();
ArrayList<Sequence> transObjs = new ArrayList<Sequence>();
for(Object obj: list.getSelectedValues()){
logger.info(obj);
transObjs.add((Sequence)obj);
}
transferedObjects = transObjs.toArray();
return new DataHandler(transferedObjects,LOCAL_OBJECT_FLAVOR.getMimeType());
}
@Override
public boolean canImport(TransferSupport info) {
// Depending on the datatype also change DropMode which makes drop location line
// or drop location nothing painted properly
boolean isSupported = false;
if(info.isDataFlavorSupported(LOCAL_OBJECT_FLAVOR)){
isSupported = true;
((JList) info.getComponent()).setDropMode(DropMode.INSERT);
}
if(info.isDataFlavorSupported(DataFlavor.javaFileListFlavor)){
isSupported = true;
((JList) info.getComponent()).setDropMode(DropMode.ON);
}
return true;
}
@Override
public int getSourceActions(JComponent c) {
return TransferHandler.COPY_OR_MOVE;
}
@Override
public boolean importData(TransferSupport info) {
try{
Transferable tr = info.getTransferable();
// This if is a small "hack" so that files also can be dropped in the list
if(tr.isDataFlavorSupported(DataFlavor.javaFileListFlavor)){
List<File> fileList = (List<File>) info.getTransferable().getTransferData(DataFlavor.javaFileListFlavor);
aliWindow.fileDropped(fileList, info.getDropAction());
}
else if(tr.isDataFlavorSupported(LOCAL_OBJECT_FLAVOR)){
SequenceJList targetList = (SequenceJList)info.getComponent();
JList.DropLocation dl = (JList.DropLocation)info.getDropLocation();
AlignmentListModel model = (AlignmentListModel)targetList.getModel();
int index = dl.getIndex();
logger.info("drop location index" + index);
logger.info("import");
Object[] values = (Object[])info.getTransferable().getTransferData(LOCAL_OBJECT_FLAVOR);
logger.info("" + source + targetList + values);
logger.info("target index" + targetList.getSelectedIndex());
if(source==targetList){
logger.info("to index" + index);
aliWindow.moveSelectedTo(index);
}
else{
// This is where fasta sequences could be imported
}
}
return true;
}catch(UnsupportedFlavorException ufe) {
ufe.printStackTrace();
}catch(java.io.IOException ioe) {
ioe.printStackTrace();
}
return false;
}
@Override
protected void exportDone(JComponent c, Transferable t, int act) {
logger.info("exportDone");
// here I could call something when done
//cleanup(c, act == MOVE);
}
}