1 //
2 // $Id: DnDListener.java 1715 2015-03-10 19:59:42Z etienne_sf $
3 //
4 // jupload - A file upload applet.
5 // Copyright 2007 The JUpload Team
6 //
7 // Created: ?
8 // Creator: William JinHua Kwong
9 // Last modified: $Date: 2015-03-10 20:59:42 +0100 (mar., 10 mars 2015) $
10 //
11 // This program is free software; you can redistribute it and/or modify it under
12 // the terms of the GNU General Public License as published by the Free Software
13 // Foundation; either version 2 of the License, or (at your option) any later
14 // version. This program is distributed in the hope that it will be useful, but
15 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
17 // details. You should have received a copy of the GNU General Public License
18 // along with this program; if not, write to the Free Software Foundation, Inc.,
19 // 675 Mass Ave, Cambridge, MA 02139, USA.
20
21 package wjhk.jupload2.gui;
22
23 import java.awt.datatransfer.DataFlavor;
24 import java.awt.datatransfer.UnsupportedFlavorException;
25 import java.awt.dnd.DnDConstants;
26 import java.awt.dnd.DropTargetDragEvent;
27 import java.awt.dnd.DropTargetDropEvent;
28 import java.awt.dnd.DropTargetEvent;
29 import java.awt.dnd.DropTargetListener;
30 import java.io.File;
31 import java.io.IOException;
32 import java.net.URI;
33 import java.net.URISyntaxException;
34 import java.util.ArrayList;
35 import java.util.List;
36
37 import wjhk.jupload2.policies.UploadPolicy;
38
39 /**
40 * Our implementation of DND.
41 *
42 * @author William JinHua Kwong
43 * @version $Release$
44 */
45 public class DnDListener implements DropTargetListener {
46
47 private JUploadPanel uploadPanel;
48
49 private UploadPolicy uploadPolicy;
50
51 /**
52 * Creates a new instance.
53 *
54 * @param uploadPanel The corresponding upload panel.
55 * @param uploadPolicy
56 */
57 public DnDListener(JUploadPanel uploadPanel, UploadPolicy uploadPolicy) {
58 this.uploadPanel = uploadPanel;
59 this.uploadPolicy = uploadPolicy;
60 }
61
62 // DataFlavor javaFileListFlavor = createConstant("application/x-java-file-list;class=java.util.List", null);
63
64 DataFlavor uriListFlavor = new DataFlavor("text/uri-list;class=java.lang.String", null);
65
66 /**
67 * @see java.awt.dnd.DropTargetListener#dragEnter(java.awt.dnd.DropTargetDragEvent)
68 */
69 public void dragEnter(DropTargetDragEvent e) {
70 // System.out.println(e);
71 // System.out.println(e.getCurrentDataFlavorsAsList());
72
73 if (!e.isDataFlavorSupported(DataFlavor.javaFileListFlavor) && !e.isDataFlavorSupported(uriListFlavor)) {
74 e.rejectDrag();
75 }
76 }
77
78 /**
79 * @see java.awt.dnd.DropTargetListener#dragOver(java.awt.dnd.DropTargetDragEvent)
80 */
81 public void dragOver(DropTargetDragEvent e) {
82 // Nothing to do.
83 }
84
85 /**
86 * @see java.awt.dnd.DropTargetListener#dropActionChanged(java.awt.dnd.DropTargetDragEvent)
87 */
88 public void dropActionChanged(DropTargetDragEvent e) {
89 // Nothing to do.
90 }
91
92 /**
93 * @see java.awt.dnd.DropTargetListener#drop(java.awt.dnd.DropTargetDropEvent)
94 */
95 @SuppressWarnings("unchecked")
96 public void drop(DropTargetDropEvent e) {
97 if (!e.isDataFlavorSupported(DataFlavor.javaFileListFlavor) && !e.isDataFlavorSupported(uriListFlavor)) {
98 e.rejectDrop();
99 } else {
100 e.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
101 try {
102 File[] fileArray;
103
104 if (e.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
105 List<File> fileList = (List<File>) e.getTransferable().getTransferData(
106 DataFlavor.javaFileListFlavor);
107
108 fileArray = (File[]) (fileList.toArray());
109 } else {
110 // uriListFlavor; attempt to convert URIs to files
111 String strList = (String) e.getTransferable().getTransferData(uriListFlavor);
112 // System.out.println(strList);
113 List<File> fileList = new ArrayList<File>();
114 for (String s : strList.split("\n"))
115 try {
116 fileList.add(new File(new URI(s.trim())));
117 } catch (URISyntaxException ex) {
118 ex.printStackTrace();
119 e.rejectDrop();
120 return;
121 }
122 fileArray = (File[]) (fileList.toArray(new File[fileList.size()]));
123 // System.out.println("fileArray="+Arrays.toString(fileArray));
124 }
125 this.uploadPanel.getFilePanel().addFiles(fileArray);
126
127 e.getDropTargetContext().dropComplete(true);
128
129 // Let's communicate this to the upload policy: there may be
130 // something to do now.
131 this.uploadPolicy.afterFileDropped(e);
132
133 } catch (IOException ioe) {
134 this.uploadPolicy.displayErr("DnDListener.drop()", ioe);
135 e.rejectDrop();
136 } catch (UnsupportedFlavorException ufe) {
137 this.uploadPolicy.displayErr("DnDListener.drop()", ufe);
138 e.rejectDrop();
139 }
140
141 }
142 }
143
144 /**
145 * @see java.awt.dnd.DropTargetListener#dragExit(java.awt.dnd.DropTargetEvent)
146 */
147 public void dragExit(DropTargetEvent e) {
148 // Nothing to do.
149 }
150 }