| 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 |