Package com.sshtools.ui.swing.dnd

Source Code of com.sshtools.ui.swing.dnd.FileDropListener

        /*
*  Adito
*
*  Copyright (C) 2003-2006 3SP LTD. All Rights Reserved
*
*  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 (at your option) 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., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
     
package com.sshtools.ui.swing.dnd;

import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.Reader;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public abstract class FileDropListener implements DropTargetListener {

    public FileDropListener() {
    }
   
    public abstract void fileDropped(File[] files);

    public void drop(DropTargetDropEvent dtde) {
        try {
            doDrop(dtde);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    void doDrop(DropTargetDropEvent dtde) throws Exception {
        // System.out.println("doDrop(" + dtde + ")");
        DataFlavor[] flavors = dtde.getCurrentDataFlavors();
        if (canImport(flavors)) {
            // System.out.println("can import");
            for (int i = 0; i < flavors.length; i++) {
                // System.out.println("flavor " + flavors[i]);
                // Drop from Windows
                if (DataFlavor.javaFileListFlavor.equals(flavors[i])) {
                    dtde.acceptDrop(DnDConstants.ACTION_COPY);
                    Transferable t = dtde.getTransferable();
                    if (t.getTransferData(DataFlavor.javaFileListFlavor) instanceof java.util.List) {
                        java.util.List fileList = (java.util.List) t.getTransferData(DataFlavor.javaFileListFlavor);
                        if (fileList.get(0) instanceof File) {
                            File[] f = new File[fileList.size()];
                            fileList.toArray(f);
                            fileDropped(f);
                        }
                    }
                    return;
                }
                // Drop from GNOME
                else if (flavors[i].getMimeType().startsWith("text/uri-list") && flavors[i].getRepresentationClass()
                                .equals(Reader.class)) {
                    dtde.acceptDrop(DnDConstants.ACTION_COPY);
                    Transferable t = dtde.getTransferable();
                    BufferedReader r = new BufferedReader((Reader) t.getTransferData(flavors[i]));
                    String s = null;
                    List l = new ArrayList();
                    while ((s = r.readLine()) != null) {
                        if (s.startsWith("file://")) {
                            s = s.substring(7);
                        }
                        l.add(new File(URLDecoder.decode(s, "UTF-8")));
                    }
                    File[] f = new File[l.size()];
                    l.toArray(f);
                    fileDropped(f);
                    return;
                }
                // Drop from GNOME
                else if (DataFlavor.stringFlavor.equals(flavors[i])) {
                    dtde.acceptDrop(DnDConstants.ACTION_COPY);
                    Transferable t = dtde.getTransferable();
                    Object o = t.getTransferData(DataFlavor.stringFlavor);
                    if (o instanceof String) {
                        // System.out.println("string uri list = " + o);
                        List l = new ArrayList();
                        StringTokenizer tz = new StringTokenizer(o.toString(), "\n\r");
                        while (tz.hasMoreTokens()) {
                            String path = (String) tz.nextToken();
                            if (path.startsWith("file://")) {
                                path = path.substring(7);
                            }
                            l.add(new File((URLDecoder.decode(path, "UTF-8"))));
                        }
                        File[] f = new File[l.size()];
                        l.toArray(f);
                        fileDropped(f);
                    }
                    return;
                }
            }
        }
        dtde.rejectDrop();
    }

    boolean canImport(DataFlavor[] flavors) {
        // System.out.println("Testing if can import");
        for (int i = 0; i < flavors.length; i++) {
            if (DataFlavor.javaFileListFlavor.equals(flavors[i])) {
                // System.out.println("Yes, " + flavors[i] + " is
                // importable");
                return true;
            } else if (DataFlavor.stringFlavor.equals(flavors[i])) {
                // System.out.println("Yes, " + flavors[i] + " is
                // importable");
                return true;
            } else {
                if (flavors[i].getMimeType().startsWith("text/uri-list")) {
                    // System.out.println("Yes, " + flavors[i] + " is
                    // importable");
                    return true;
                }
                // System.out.println("Mime = " + flavors[i].getMimeType());
                // System.out.println("Class = " +
                // flavors[i].getRepresentationClass());
                //                   
                // System.out.println("No, " + flavors[i] + " is not
                // importable");
            }
        }
        return false;
    }

    public void dragEnter(DropTargetDragEvent dtde) {
        System.out.println("dragEnter(" + dtde + ")");
        dtde.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE);
    }

    /*
     * (non-Javadoc)
     *
     * @see java.awt.dnd.DropTargetListener#dragOver(java.awt.dnd.DropTargetDragEvent)
     */
    public void dragOver(DropTargetDragEvent dtde) {
    }

    /*
     * (non-Javadoc)
     *
     * @see java.awt.dnd.DropTargetListener#dropActionChanged(java.awt.dnd.DropTargetDragEvent)
     */
    public void dropActionChanged(DropTargetDragEvent dtde) {
    }

    /*
     * (non-Javadoc)
     *
     * @see java.awt.dnd.DropTargetListener#dragExit(java.awt.dnd.DropTargetEvent)
     */
    public void dragExit(DropTargetEvent dte) {
    }


}
TOP

Related Classes of com.sshtools.ui.swing.dnd.FileDropListener

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.