diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 17:32:43 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 17:32:43 +0000 |
commit | 6bf0a5cb5034a7e684dcc3500e841785237ce2dd (patch) | |
tree | a68f146d7fa01f0134297619fbe7e33db084e0aa /comm/mailnews/addrbook/content/abDragDrop.js | |
parent | Initial commit. (diff) | |
download | thunderbird-upstream.tar.xz thunderbird-upstream.zip |
Adding upstream version 1:115.7.0.upstream/1%115.7.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'comm/mailnews/addrbook/content/abDragDrop.js')
-rw-r--r-- | comm/mailnews/addrbook/content/abDragDrop.js | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/comm/mailnews/addrbook/content/abDragDrop.js b/comm/mailnews/addrbook/content/abDragDrop.js new file mode 100644 index 0000000000..56cbee0e08 --- /dev/null +++ b/comm/mailnews/addrbook/content/abDragDrop.js @@ -0,0 +1,124 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* import-globals-from abResultsPane.js */ + +// Returns the load context for the current window +function getLoadContext() { + return window.docShell.QueryInterface(Ci.nsILoadContext); +} + +var abFlavorDataProvider = { + QueryInterface: ChromeUtils.generateQI(["nsIFlavorDataProvider"]), + + getFlavorData(aTransferable, aFlavor, aData) { + if (aFlavor == "application/x-moz-file-promise") { + var primitive = {}; + aTransferable.getTransferData("text/vcard", primitive); + var vCard = primitive.value.QueryInterface(Ci.nsISupportsString).data; + aTransferable.getTransferData( + "application/x-moz-file-promise-dest-filename", + primitive + ); + var leafName = primitive.value.QueryInterface(Ci.nsISupportsString).data; + aTransferable.getTransferData( + "application/x-moz-file-promise-dir", + primitive + ); + var localFile = primitive.value.QueryInterface(Ci.nsIFile).clone(); + localFile.append(leafName); + + var ofStream = Cc[ + "@mozilla.org/network/file-output-stream;1" + ].createInstance(Ci.nsIFileOutputStream); + ofStream.init(localFile, -1, -1, 0); + var converter = Cc[ + "@mozilla.org/intl/converter-output-stream;1" + ].createInstance(Ci.nsIConverterOutputStream); + converter.init(ofStream, null); + converter.writeString(vCard); + converter.close(); + + aData.value = localFile; + } + }, +}; + +let abResultsPaneObserver = { + onDragStart(event) { + let selectedRows = GetSelectedRows(); + + if (!selectedRows) { + return; + } + + let selectedAddresses = GetSelectedAddresses(); + + event.dataTransfer.setData("moz/abcard", selectedRows); + event.dataTransfer.setData("moz/abcard", selectedRows); + event.dataTransfer.setData("text/x-moz-address", selectedAddresses); + event.dataTransfer.setData("text/plain", selectedAddresses); + + let card = GetSelectedCard(); + if (card && card.displayName && !card.isMailList) { + try { + // A card implementation may throw NS_ERROR_NOT_IMPLEMENTED. + // Don't break drag-and-drop if that happens. + let vCard = card.translateTo("vcard"); + event.dataTransfer.setData("text/vcard", decodeURIComponent(vCard)); + event.dataTransfer.setData( + "application/x-moz-file-promise-dest-filename", + `${card.displayName}.vcf`.replace(/(.{74}).*(.{10})$/u, "$1...$2") + ); + event.dataTransfer.setData( + "application/x-moz-file-promise-url", + "data:text/vcard," + vCard + ); + event.dataTransfer.setData( + "application/x-moz-file-promise", + abFlavorDataProvider + ); + } catch (ex) { + console.error(ex); + } + } + + event.dataTransfer.effectAllowed = "copyMove"; + // a drag targeted at a tree should instead use the treechildren so that + // the current selection is used as the drag feedback + event.dataTransfer.addElement(event.target); + event.stopPropagation(); + }, +}; + +function DragAddressOverTargetControl(event) { + var dragSession = Cc["@mozilla.org/widget/dragservice;1"] + .getService(Ci.nsIDragService) + .getCurrentSession(); + + if (!dragSession.isDataFlavorSupported("text/x-moz-address")) { + return; + } + + var trans = Cc["@mozilla.org/widget/transferable;1"].createInstance( + Ci.nsITransferable + ); + trans.init(getLoadContext()); + trans.addDataFlavor("text/x-moz-address"); + + var canDrop = true; + + for (var i = 0; i < dragSession.numDropItems; ++i) { + dragSession.getData(trans, i); + var dataObj = {}; + var bestFlavor = {}; + try { + trans.getAnyTransferData(bestFlavor, dataObj); + } catch (ex) { + canDrop = false; + break; + } + } + dragSession.canDrop = canDrop; +} |