forked from CinemaMod/java-cef
-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy pathCefDropTargetListener.java
More file actions
127 lines (111 loc) · 4.48 KB
/
CefDropTargetListener.java
File metadata and controls
127 lines (111 loc) · 4.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
// Copyright (c) 2019 The Chromium Embedded Framework Authors. All rights
// reserved. Use of this source code is governed by a BSD-style license that
// can be found in the LICENSE file.
package org.cef.browser;
import org.cef.callback.CefDragData;
import org.cef.misc.EventFlags;
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.io.File;
import java.util.List;
class CefDropTargetListener implements DropTargetListener {
private CefBrowser_N browser_;
private CefDragData dragData_ = null;
private int dragOperations_ = CefDragData.DragOperations.DRAG_OPERATION_COPY;
private int dragModifiers_ = EventFlags.EVENTFLAG_NONE;
private int acceptOperations_ = DnDConstants.ACTION_COPY;
CefDropTargetListener(CefBrowser_N browser) {
browser_ = browser;
}
@Override
public void dragEnter(DropTargetDragEvent event) {
CreateDragData(event);
browser_.dragTargetDragEnter(
dragData_, event.getLocation(), dragModifiers_, dragOperations_);
}
@Override
public void dragExit(DropTargetEvent event) {
AssertDragData();
browser_.dragTargetDragLeave();
ClearDragData();
}
@Override
public void dragOver(DropTargetDragEvent event) {
AssertDragData();
browser_.dragTargetDragOver(event.getLocation(), dragModifiers_, dragOperations_);
}
@Override
public void dropActionChanged(DropTargetDragEvent event) {
AssertDragData();
acceptOperations_ = event.getDropAction();
switch (acceptOperations_) {
case DnDConstants.ACTION_LINK:
dragOperations_ = CefDragData.DragOperations.DRAG_OPERATION_LINK;
dragModifiers_ =
EventFlags.EVENTFLAG_CONTROL_DOWN | EventFlags.EVENTFLAG_SHIFT_DOWN;
break;
case DnDConstants.ACTION_COPY:
dragOperations_ = CefDragData.DragOperations.DRAG_OPERATION_COPY;
dragModifiers_ = EventFlags.EVENTFLAG_CONTROL_DOWN;
break;
case DnDConstants.ACTION_MOVE:
dragOperations_ = CefDragData.DragOperations.DRAG_OPERATION_MOVE;
dragModifiers_ = EventFlags.EVENTFLAG_SHIFT_DOWN;
break;
case DnDConstants.ACTION_NONE:
// The user did not select an action, so use COPY as the default.
dragOperations_ = CefDragData.DragOperations.DRAG_OPERATION_COPY;
dragModifiers_ = EventFlags.EVENTFLAG_NONE;
acceptOperations_ = DnDConstants.ACTION_COPY;
break;
}
}
@Override
public void drop(DropTargetDropEvent event) {
AssertDragData();
browser_.dragTargetDrop(event.getLocation(), dragModifiers_);
event.acceptDrop(acceptOperations_);
event.dropComplete(true);
ClearDragData();
}
private void CreateDragData(DropTargetDragEvent event) {
assert dragData_ == null;
dragData_ = createDragData(event);
dropActionChanged(event);
}
private void AssertDragData() {
assert dragData_ != null;
}
private void ClearDragData() {
dragData_ = null;
}
private static CefDragData createDragData(DropTargetDragEvent event) {
CefDragData dragData = CefDragData.create();
Transferable transferable = event.getTransferable();
DataFlavor[] flavors = transferable.getTransferDataFlavors();
for (DataFlavor flavor : flavors) {
try {
if (flavor.isFlavorTextType()) {
Object ob = transferable.getTransferData(flavor);
if (!(ob instanceof String)) continue;
dragData.setFragmentText((String) ob);
} else if (flavor.isFlavorJavaFileListType()) {
List<File> files = (List<File>) transferable.getTransferData(flavor);
for (File file : files) {
dragData.addFile(file.getPath(), file.getName());
}
}
} catch (Exception e) {
// Data is no longer available or of unsupported flavor.
e.printStackTrace();
}
}
return dragData;
}
}