OLD | NEW |
1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | |
5 /** | 4 /** |
6 * @constructor | 5 * @unrestricted |
7 * @param {!Element} element | |
8 * @param {!Array.<string>} transferTypes | |
9 * @param {string} messageText | |
10 * @param {function(!DataTransfer)} handleDrop | |
11 */ | 6 */ |
12 WebInspector.DropTarget = function(element, transferTypes, messageText, handleDr
op) | 7 WebInspector.DropTarget = class { |
13 { | 8 /** |
14 element.addEventListener("dragenter", this._onDragEnter.bind(this), true); | 9 * @param {!Element} element |
15 element.addEventListener("dragover", this._onDragOver.bind(this), true); | 10 * @param {!Array.<string>} transferTypes |
| 11 * @param {string} messageText |
| 12 * @param {function(!DataTransfer)} handleDrop |
| 13 */ |
| 14 constructor(element, transferTypes, messageText, handleDrop) { |
| 15 element.addEventListener('dragenter', this._onDragEnter.bind(this), true); |
| 16 element.addEventListener('dragover', this._onDragOver.bind(this), true); |
16 this._element = element; | 17 this._element = element; |
17 this._transferTypes = transferTypes; | 18 this._transferTypes = transferTypes; |
18 this._messageText = messageText; | 19 this._messageText = messageText; |
19 this._handleDrop = handleDrop; | 20 this._handleDrop = handleDrop; |
20 this._enabled = true; | 21 this._enabled = true; |
| 22 } |
| 23 |
| 24 /** |
| 25 * @param {boolean} enabled |
| 26 */ |
| 27 setEnabled(enabled) { |
| 28 this._enabled = enabled; |
| 29 } |
| 30 |
| 31 /** |
| 32 * @param {!Event} event |
| 33 */ |
| 34 _onDragEnter(event) { |
| 35 if (this._enabled && this._hasMatchingType(event)) |
| 36 event.consume(true); |
| 37 } |
| 38 |
| 39 /** |
| 40 * @param {!Event} event |
| 41 * @return {boolean} |
| 42 */ |
| 43 _hasMatchingType(event) { |
| 44 for (var type of this._transferTypes) { |
| 45 if (event.dataTransfer.types.indexOf(type) !== -1) |
| 46 return true; |
| 47 } |
| 48 return false; |
| 49 } |
| 50 |
| 51 /** |
| 52 * @param {!Event} event |
| 53 */ |
| 54 _onDragOver(event) { |
| 55 if (!this._enabled || !this._hasMatchingType(event)) |
| 56 return; |
| 57 event.dataTransfer.dropEffect = 'copy'; |
| 58 event.consume(true); |
| 59 if (this._dragMaskElement) |
| 60 return; |
| 61 this._dragMaskElement = this._element.createChild('div', ''); |
| 62 var shadowRoot = WebInspector.createShadowRootWithCoreStyles(this._dragMaskE
lement, 'ui/dropTarget.css'); |
| 63 shadowRoot.createChild('div', 'drop-target-message').textContent = this._mes
sageText; |
| 64 this._dragMaskElement.addEventListener('drop', this._onDrop.bind(this), true
); |
| 65 this._dragMaskElement.addEventListener('dragleave', this._onDragLeave.bind(t
his), true); |
| 66 } |
| 67 |
| 68 /** |
| 69 * @param {!Event} event |
| 70 */ |
| 71 _onDrop(event) { |
| 72 event.consume(true); |
| 73 this._removeMask(); |
| 74 if (this._enabled) |
| 75 this._handleDrop(event.dataTransfer); |
| 76 } |
| 77 |
| 78 /** |
| 79 * @param {!Event} event |
| 80 */ |
| 81 _onDragLeave(event) { |
| 82 event.consume(true); |
| 83 this._removeMask(); |
| 84 } |
| 85 |
| 86 _removeMask() { |
| 87 this._dragMaskElement.remove(); |
| 88 delete this._dragMaskElement; |
| 89 } |
21 }; | 90 }; |
22 | 91 |
23 WebInspector.DropTarget.Types = { | 92 WebInspector.DropTarget.Types = { |
24 Files: "Files", | 93 Files: 'Files', |
25 URIList: "text/uri-list" | 94 URIList: 'text/uri-list' |
26 }; | 95 }; |
27 | |
28 WebInspector.DropTarget.prototype = { | |
29 /** | |
30 * @param {boolean} enabled | |
31 */ | |
32 setEnabled: function(enabled) | |
33 { | |
34 this._enabled = enabled; | |
35 }, | |
36 | |
37 /** | |
38 * @param {!Event} event | |
39 */ | |
40 _onDragEnter: function(event) | |
41 { | |
42 if (this._enabled && this._hasMatchingType(event)) | |
43 event.consume(true); | |
44 }, | |
45 | |
46 /** | |
47 * @param {!Event} event | |
48 * @return {boolean} | |
49 */ | |
50 _hasMatchingType: function(event) | |
51 { | |
52 for (var type of this._transferTypes) { | |
53 if (event.dataTransfer.types.indexOf(type) !== -1) | |
54 return true; | |
55 } | |
56 return false; | |
57 }, | |
58 | |
59 /** | |
60 * @param {!Event} event | |
61 */ | |
62 _onDragOver: function(event) | |
63 { | |
64 if (!this._enabled || !this._hasMatchingType(event)) | |
65 return; | |
66 event.dataTransfer.dropEffect = "copy"; | |
67 event.consume(true); | |
68 if (this._dragMaskElement) | |
69 return; | |
70 this._dragMaskElement = this._element.createChild("div", ""); | |
71 var shadowRoot = WebInspector.createShadowRootWithCoreStyles(this._dragM
askElement, "ui/dropTarget.css"); | |
72 shadowRoot.createChild("div", "drop-target-message").textContent = this.
_messageText; | |
73 this._dragMaskElement.addEventListener("drop", this._onDrop.bind(this),
true); | |
74 this._dragMaskElement.addEventListener("dragleave", this._onDragLeave.bi
nd(this), true); | |
75 }, | |
76 | |
77 /** | |
78 * @param {!Event} event | |
79 */ | |
80 _onDrop: function(event) | |
81 { | |
82 event.consume(true); | |
83 this._removeMask(); | |
84 if (this._enabled) | |
85 this._handleDrop(event.dataTransfer); | |
86 }, | |
87 | |
88 /** | |
89 * @param {!Event} event | |
90 */ | |
91 _onDragLeave: function(event) | |
92 { | |
93 event.consume(true); | |
94 this._removeMask(); | |
95 }, | |
96 | |
97 _removeMask: function() | |
98 { | |
99 this._dragMaskElement.remove(); | |
100 delete this._dragMaskElement; | |
101 } | |
102 }; | |
OLD | NEW |