1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.log4j.chainsaw.dnd;
18
19
20 import org.apache.log4j.Logger;
21
22 import javax.swing.*;
23 import java.awt.*;
24 import java.awt.datatransfer.DataFlavor;
25 import java.awt.datatransfer.Transferable;
26 import java.awt.dnd.*;
27 import java.beans.PropertyChangeListener;
28 import java.beans.PropertyChangeSupport;
29 import java.util.HashMap;
30 import java.util.List;
31 import java.util.Map;
32
33
34
35
36
37
38
39
40
41
42
43 public class FileDnDTarget implements DropTargetListener {
44
45
46
47 private static final Logger LOG = Logger.getLogger(FileDnDTarget.class);
48
49 protected int acceptableActions = DnDConstants.ACTION_COPY;
50
51 private List fileList;
52
53 private JComponent guiTarget;
54 private Map<JComponent, DropTarget> dropTargets = new HashMap<>();
55
56
57 private PropertyChangeSupport propertySupport = new PropertyChangeSupport(this);
58
59
60
61
62 public FileDnDTarget(JComponent c) {
63 this.guiTarget = c;
64 }
65
66 public void addDropTargetToComponent(JComponent c) {
67 dropTargets.put(c, new DropTarget(c, this));
68 }
69
70
71
72
73 public void addPropertyChangeListener(PropertyChangeListener listener) {
74 propertySupport.addPropertyChangeListener(listener);
75 }
76
77
78
79
80
81 public void addPropertyChangeListener(String propertyName,
82 PropertyChangeListener listener) {
83 propertySupport.addPropertyChangeListener(propertyName, listener);
84 }
85
86
87
88
89 private void decorateComponent() {
90
91 guiTarget.setBorder(BorderFactory.createLineBorder(Color.black));
92 }
93
94
95 public void dragEnter(DropTargetDragEvent e) {
96
97 if (isDragOk(e) == false) {
98 e.rejectDrag();
99 return;
100 }
101 decorateComponent();
102
103 e.acceptDrag(acceptableActions);
104 }
105
106
107 public void dragExit(DropTargetEvent dte) {
108 removeComponentDecoration();
109 }
110
111
112 public void dragOver(DropTargetDragEvent e) {
113
114
115 if (isDragOk(e) == false) {
116 e.rejectDrag();
117 return;
118 }
119 e.acceptDrag(acceptableActions);
120 }
121
122 public void drop(DropTargetDropEvent dtde) {
123 Transferable transferable = dtde.getTransferable();
124 LOG.debug(transferable);
125 dtde.acceptDrop(acceptableActions);
126 try {
127 List list = (List) transferable.getTransferData(DataFlavor.javaFileListFlavor);
128 LOG.debug(list);
129 setFileList(list);
130 dtde.getDropTargetContext().dropComplete(true);
131 removeComponentDecoration();
132
133 } catch (Exception e) {
134 LOG.error("Error with DnD", e);
135 }
136
137 }
138
139 public void dropActionChanged(DropTargetDragEvent dtde) {
140
141 }
142
143
144
145
146 public final List getFileList() {
147 return fileList;
148 }
149
150 private boolean isDragOk(DropTargetDragEvent e) {
151 DataFlavor[] flavors = new DataFlavor[]{DataFlavor.javaFileListFlavor};
152 DataFlavor chosen = null;
153 for (DataFlavor flavor : flavors) {
154 if (e.isDataFlavorSupported(flavor)) {
155 chosen = flavor;
156 break;
157 }
158 }
159
160
161
162 if (chosen == null) {
163 return false;
164 }
165
166
167 int sa = e.getSourceActions();
168
169
170 return (sa & acceptableActions) != 0;
171 }
172
173
174
175
176 private void removeComponentDecoration() {
177 this.guiTarget.setBorder(null);
178 }
179
180
181
182
183 public void removePropertyChangeListener(PropertyChangeListener listener) {
184 propertySupport.removePropertyChangeListener(listener);
185 }
186
187
188
189
190
191 public void removePropertyChangeListener(String propertyName,
192 PropertyChangeListener listener) {
193 propertySupport.removePropertyChangeListener(propertyName, listener);
194 }
195
196
197
198
199 private final void setFileList(List fileList) {
200 Object oldValue = this.fileList;
201 this.fileList = fileList;
202 propertySupport.firePropertyChange("fileList", oldValue, this.fileList);
203 }
204 }