1 19 20 package com.sshtools.ui.swing.dnd; 21 22 import java.awt.datatransfer.DataFlavor ; 23 import java.awt.datatransfer.Transferable ; 24 import java.awt.dnd.DnDConstants ; 25 import java.awt.dnd.DropTargetDragEvent ; 26 import java.awt.dnd.DropTargetDropEvent ; 27 import java.awt.dnd.DropTargetEvent ; 28 import java.awt.dnd.DropTargetListener ; 29 import java.io.BufferedReader ; 30 import java.io.File ; 31 import java.io.Reader ; 32 import java.util.ArrayList ; 33 import java.util.List ; 34 import java.util.StringTokenizer ; 35 36 public abstract class FileDropListener implements DropTargetListener { 37 38 public FileDropListener() { 39 } 40 41 public abstract void fileDropped(File [] files); 42 43 public void drop(DropTargetDropEvent dtde) { 44 try { 45 doDrop(dtde); 46 } catch (Exception e) { 47 e.printStackTrace(); 48 } 49 } 50 51 void doDrop(DropTargetDropEvent dtde) throws Exception { 52 DataFlavor [] flavors = dtde.getCurrentDataFlavors(); 54 if (canImport(flavors)) { 55 for (int i = 0; i < flavors.length; i++) { 57 if (DataFlavor.javaFileListFlavor.equals(flavors[i])) { 60 dtde.acceptDrop(DnDConstants.ACTION_COPY); 61 Transferable t = dtde.getTransferable(); 62 if (t.getTransferData(DataFlavor.javaFileListFlavor) instanceof java.util.List ) { 63 java.util.List fileList = (java.util.List ) t.getTransferData(DataFlavor.javaFileListFlavor); 64 if (fileList.get(0) instanceof File ) { 65 File [] f = new File [fileList.size()]; 66 fileList.toArray(f); 67 fileDropped(f); 68 } 69 } 70 return; 71 } 72 else if (flavors[i].getMimeType().startsWith("text/uri-list") && flavors[i].getRepresentationClass() 74 .equals(Reader .class)) { 75 dtde.acceptDrop(DnDConstants.ACTION_COPY); 76 Transferable t = dtde.getTransferable(); 77 BufferedReader r = new BufferedReader ((Reader ) t.getTransferData(flavors[i])); 78 String s = null; 79 List l = new ArrayList (); 80 while ((s = r.readLine()) != null) { 81 if (s.startsWith("file://")) { 82 s = s.substring(7); 83 } 84 l.add(new File (s)); 85 } 86 File [] f = new File [l.size()]; 87 l.toArray(f); 88 fileDropped(f); 89 return; 90 } 91 else if (DataFlavor.stringFlavor.equals(flavors[i])) { 93 dtde.acceptDrop(DnDConstants.ACTION_COPY); 94 Transferable t = dtde.getTransferable(); 95 Object o = t.getTransferData(DataFlavor.stringFlavor); 96 if (o instanceof String ) { 97 List l = new ArrayList (); 99 StringTokenizer tz = new StringTokenizer (o.toString(), "\n\r"); 100 while (tz.hasMoreTokens()) { 101 String path = (String ) tz.nextToken(); 102 if (path.startsWith("file://")) { 103 path = path.substring(7); 104 } 105 l.add(new File (path)); 106 } 107 File [] f = new File [l.size()]; 108 l.toArray(f); 109 fileDropped(f); 110 } 111 return; 112 } 113 } 114 } 115 dtde.rejectDrop(); 116 } 117 118 boolean canImport(DataFlavor [] flavors) { 119 for (int i = 0; i < flavors.length; i++) { 121 if (DataFlavor.javaFileListFlavor.equals(flavors[i])) { 122 return true; 125 } else if (DataFlavor.stringFlavor.equals(flavors[i])) { 126 return true; 129 } else { 130 if (flavors[i].getMimeType().startsWith("text/uri-list")) { 131 return true; 134 } 135 } 142 } 143 return false; 144 } 145 146 public void dragEnter(DropTargetDragEvent dtde) { 147 System.out.println("dragEnter(" + dtde + ")"); 148 dtde.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE); 149 } 150 151 156 public void dragOver(DropTargetDragEvent dtde) { 157 } 158 159 164 public void dropActionChanged(DropTargetDragEvent dtde) { 165 } 166 167 172 public void dragExit(DropTargetEvent dte) { 173 } 174 175 176 } 177 | Popular Tags |