|
DragAndDrop |
|
package ij.plugin; import ij.*; import ij.gui.YesNoCancelDialog; import ij.io.*; import java.io.*; import java.awt.datatransfer.*; import java.awt.dnd.*; import java.util.List; import java.util.Iterator; import java.util.ArrayList; /** This class opens images, roi's, luts and text files dragged and dropped on the "ImageJ" window. It requires Java 1.3.1 or later. Based on the Draw_And_Drop plugin by Eric Kischell (keesh@ieee.org). 10 November 2006: Albert Cardona added Linux support and an option to open all images in a dragged folder as a stack. */ public class DragAndDrop implements PlugIn, DropTargetListener, Runnable { private Iterator iterator; public void run(String arg) { ImageJ ij = IJ.getInstance(); ij.setDropTarget(null); DropTarget dropTarget = new DropTarget(ij, this); } public void drop(DropTargetDropEvent dtde) { dtde.acceptDrop(DnDConstants.ACTION_COPY); try { Transferable t = dtde.getTransferable(); iterator = null; if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { Object data = t.getTransferData(DataFlavor.javaFileListFlavor); iterator = ((List)data).iterator(); } else { // find a String path DataFlavor[] flavors = t.getTransferDataFlavors(); for (int i=0; i<flavors.length; i++) { if (!flavors[i].getRepresentationClass().equals(String.class)) continue; Object ob = t.getTransferData(flavors[i]); if (!(ob instanceof String)) continue; String s = ob.toString().trim(); BufferedReader br = new BufferedReader(new StringReader(s)); String tmp; ArrayList list = new ArrayList(); while (null != (tmp = br.readLine())) { tmp = java.net.URLDecoder.decode(tmp, "UTF-8"); if (tmp.startsWith("file://")) { tmp = tmp.substring(7); } list.add(new File(tmp)); } this.iterator = list.iterator(); break; } } if (null != iterator) { Thread thread = new Thread(this, "DrawAndDrop"); thread.setPriority(Math.max(thread.getPriority()-1, Thread.MIN_PRIORITY)); thread.start(); } } catch(Exception e) { dtde.dropComplete(false); return; } dtde.dropComplete(true); } public void dragEnter(DropTargetDragEvent dtde) { dtde.acceptDrag(DnDConstants.ACTION_COPY); } public void dragOver(DropTargetDragEvent e) {} public void dragExit(DropTargetEvent e) {} public void dropActionChanged(DropTargetDragEvent e) {} public void run() { Iterator iterator = this.iterator; while(iterator.hasNext()) { File file = (File)iterator.next(); openFile(file); } } /** Open a file. If it's a directory, ask to open all images as a sequence in a stack or individually. */ private void openFile(File f) { try { if (null == f) return; String tmp = f.getCanonicalPath(); if (f.exists()) { if (f.isDirectory()) { String[] names = f.list(); YesNoCancelDialog yn = new YesNoCancelDialog(IJ.getInstance(), "Open folder?", "Open all "+names.length+" images in \"" + f.getName() + "\" as a stack?"); if (yn.yesPressed()) { IJ.run("Image Sequence...", "open=[" + tmp + "/]"); } else if (!yn.cancelPressed()) { for (int k=0; k<names.length; k++) { IJ.redirectErrorMessages(); if (!names[k].startsWith(".")) (new Opener()).open(tmp + "/" + names[k]); } } } else { (new Opener()).openAndAddToRecent(tmp); OpenDialog.setLastDirectory(f.getParent()+File.separator); OpenDialog.setLastName(f.getName()); } } else { IJ.log("File not found: " + tmp); } } catch (Exception e) { e.printStackTrace(); } } }
|
DragAndDrop |
|