import java.awt.*; import java.awt.event.*; import java.io.*; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.dnd.DnDConstants; import java.awt.dnd.DropTarget; import java.awt.dnd.DropTargetDragEvent; import java.awt.dnd.DropTargetDropEvent; import java.awt.dnd.DropTargetEvent; import java.awt.dnd.DropTargetListener; import java.util.Iterator; import java.util.List; import ij.*; import ij.plugin.PlugIn; import ij.gui.GenericDialog; import ij.io.ImportDialog; // RS (salgado@physics.syr.edu) -05/06/2002 - for RAW support in DropHandler::handleDroppedFile import ij.io.FileInfo; // RS (salgado@physics.syr.edu) -05/06/2002 - for RAW support in DropHandler::handleDroppedFile import ij.io.FileOpener; // RS (salgado@physics.syr.edu) -05/06/2002 - for RAW support in DropHandler::handleDroppedFile /** Drag and Drop images onto the ImageJ main frame. Requires Java 2, v1.3.1. * * @author keesh (orig example author Greg Merrill) * * keesh created 05/01/2002 * Known Issues * .Currently opens tiff, bmp, dicom, fits, pgm, gif or jpeg images and ROI, LUT, text and Java source files. * .Does not traverse image "directories". * .May not detach drag and drop support when ImageJ exits. * Under JDK v1.3.1 need to drop near ImageJ menubar or titlebar. */ public class Drag_And_Drop implements PlugIn { protected static ImageJ ij = null; // the "ImageJ" frame private static boolean enableDND = true; private static String vers; public Drag_And_Drop() { vers = System.getProperty("java.version"); if (vers.compareTo("1.3.1") < 0) { IJ.error ("This plugin will only run using Java 2, v1.3.1 or higher"); return; } ij = IJ.getInstance(); } // ctor public void run(String arg) { if (arg.equals("about")) {showAbout(); return;} if (vers.compareTo("1.3.1") < 0) { return; } // getClass should be OK for public members String title = "Setup " + getClass().getName() ; GenericDialog gd = new GenericDialog(title); gd.addCheckbox("Enable Drag and Drop", enableDND); gd.showDialog(); if (gd.wasCanceled()) return; enableDND = gd.getNextBoolean(); // we really would like to detach the drop target // when the application is exiting too if(ij != null) { ij.setDropTarget(null); } if(enableDND) { if(ij != null) { // We would like to add a DropHandler when the main image frame is created. DropTarget dropTarget = new DropTarget( ij, new DropHandler(ij)); } } // register class to prevent garbage collect IJ.register(Drag_And_Drop.class); } // run void showAbout() { String title = "About " + getClass().getName() + "..."; IJ.showMessage(title, "This plugin hooks into ImageJ in order to\n" + "support drag and drop of images to the ImageJ frame." ); } /** * Modified class to handle drag'n'drop events for ImageJ's ImageJ. * * @author keesh (orig example author Greg Merrill) * * Planned Enhancements * .handle image directories. * .handle more image types via 'opener' */ /* * Credits: * Example from JEdit: JEdit home * DragAndDropPlugin.java - Drag-and-Drop plugin * Copyright (C) 2000 Greg Merrill * Other contributors: Denis Lambot * Carmine Lucarelli * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ static class DropHandler implements DropTargetListener { protected ImageJ mainFrame; protected DataFlavor dFlavor; /** * @param mainFrame The main imaging frame we're handling */ DropHandler(ImageJ mainFrame) { this.mainFrame = mainFrame; } public void drop(DropTargetDropEvent dtde) { dtde.acceptDrop(DnDConstants.ACTION_COPY); try { Transferable t = dtde.getTransferable(); if(t.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { // file object(s) have been dropped Object data = t.getTransferData(DataFlavor.javaFileListFlavor); Iterator iterator = ((List)data).iterator(); while(iterator.hasNext()) { File file = (File)iterator.next(); if( !file.isDirectory() ) // don't handle directories for now handleDroppedFile(file.getAbsolutePath()); } } } catch(Exception e) { e.printStackTrace(); IJ.error( "Error in drop() method. Reason: " + e.getMessage() ); dtde.dropComplete(false); return; } dtde.dropComplete(true); } // drop public void dragEnter(DropTargetDragEvent dtde) { // check if there is at least one File Type in the list DataFlavor[] flavors = dtde.getCurrentDataFlavors(); for(int i = 0; i < flavors.length; i++) { String mimeType = flavors[i].getMimeType(); //System.out.println(flavors[i].toString()); // mimeType= application/x-java-file-list if(flavors[i].isFlavorJavaFileListType()) { dtde.acceptDrag(DnDConstants.ACTION_COPY); return; } } dtde.rejectDrag(); } public void dragOver(DropTargetDragEvent e) { } public void dragExit(DropTargetEvent e) { } public void dropActionChanged(DropTargetDragEvent e) { } private void handleDroppedFile(String path) { // quick & dirty method to open/display an image // tiff, bmp, dicom, fits, pgm, gif or jpeg image if( !Macro.open(path) ) { //IJ.write("Could not open image from: " + path); // RS (salgado@physics.syr.edu) -05/06/2002 - for RAW support in DropHandler::handleDroppedFile // // using some code ideas from // Wayne Rasband's Raw_File_Opener plugin // ImportDialog d = new ImportDialog(); FileInfo fi = d.getFileInfo(); if (fi==null) return; int p1=path.lastIndexOf('\\'); String fDir =path.substring(0,p1+1); String fName =path.substring(p1+1); //IJ.write("["+fDir+"]["+fName+"]"); fi.directory=fDir; fi.fileName=fName; FileOpener fo = new FileOpener(fi); fo.open(); // ************ // } } } // class DropHandler } // Drag_And_Drop