From 42f2b56bb44c8f5a367ace129de9d663aff22988 Mon Sep 17 00:00:00 2001 From: Dan Stillman Date: Sun, 18 Feb 2007 06:49:13 +0000 Subject: [PATCH] Closes #142, Dragging a URL over an item in the Zotero pane should create an attachment Can drag links, images, or the favicon of the current page Also allows dragging over collections and item pane whitespace to create standalone attachments, but if we want to allow that at all, it would probably be better to create new webpage items with snapshot items (like Create New Item from Current Page) instead. --- .../zotero/xpcom/collectionTreeView.js | 53 +++++---- chrome/content/zotero/xpcom/itemTreeView.js | 105 ++++++++++++------ 2 files changed, 100 insertions(+), 58 deletions(-) diff --git a/chrome/content/zotero/xpcom/collectionTreeView.js b/chrome/content/zotero/xpcom/collectionTreeView.js index 52bd04575..339a00d39 100644 --- a/chrome/content/zotero/xpcom/collectionTreeView.js +++ b/chrome/content/zotero/xpcom/collectionTreeView.js @@ -424,7 +424,8 @@ Zotero.CollectionTreeView.prototype.deleteSelection = function() */ Zotero.CollectionTreeView.prototype._showItem = function(itemGroup, level, beforeRow) { - this._dataItems.splice(beforeRow, 0, [itemGroup, false, level]); this.rowCount++; + this._dataItems.splice(beforeRow, 0, [itemGroup, false, level]); + this.rowCount++; } /* @@ -502,9 +503,16 @@ Zotero.CollectionTreeCommandController.prototype.onEvent = function(evt) */ Zotero.CollectionTreeView.prototype.canDrop = function(row, orient) { - if(typeof row == 'object') //workaround... two different services call canDrop (nsDragAndDrop, and the tree) + // workaround... two different services call canDrop + // (nsDragAndDrop, and the tree) -- this is for the former, + // used when dragging between windows + if (typeof row == 'object') { return false; - + } + + //Zotero.debug('Row is ' + row); + //Zotero.debug('Orient is ' + orient); + try { var dataSet = nsTransferable.get(this.getSupportedFlavours(),nsDragAndDrop.getDragData, true); @@ -529,9 +537,7 @@ Zotero.CollectionTreeView.prototype.canDrop = function(row, orient) { var rowCollection = this._getItemAtRow(row).ref; //the collection we are dragging over - // TODO: Dragging URLs not yet supported - if (dataType == 'zotero/item' || dataType == "text/x-moz-url") - { + if (dataType == 'zotero/item') { var ids = data.data.split(','); for each(var id in ids) { @@ -549,6 +555,11 @@ Zotero.CollectionTreeView.prototype.canDrop = function(row, orient) } return false; } + else if (dataType == 'text/x-moz-url') { + if (!this._getItemAtRow(row).isSearch()) { + return true; + } + } else if (dataType == 'zotero/collection' && data.data != rowCollection.getID() && !Zotero.Collections.get(data.data).hasDescendent('collection', rowCollection.getID())) { @@ -567,10 +578,12 @@ Zotero.CollectionTreeView.prototype.drop = function(row, orient) var data = dataSet.first.first; var dataType = data.flavour.contentType; + if (!this.canDrop(row, orient)) { + return false; + } + if(dataType == 'zotero/collection') { - var oldCount = this.rowCount; - var targetCollectionID; if(this._getItemAtRow(row).isCollection()) targetCollectionID = this._getItemAtRow(row).ref.getID(); @@ -585,10 +598,8 @@ Zotero.CollectionTreeView.prototype.drop = function(row, orient) this.selection.clearSelection(); this.selection.select(selectRow); this.selection.selectEventsSuppressed = false; - } - else if(dataType == 'zotero/item' && this.canDrop(row, orient)) - { + else if (dataType == 'zotero/item') { var ids = data.data.split(','); var targetCollection = this._getItemAtRow(row).ref; for each(var id in ids) @@ -601,16 +612,17 @@ Zotero.CollectionTreeView.prototype.drop = function(row, orient) } } } - else if(dataType == 'text/x-moz-url' && this.canDrop(row, orient)) - { + else if (dataType == 'text/x-moz-url') { var url = data.data.split("\n")[0]; - /* WAITING FOR INGESTER SUPPORT - var newItem = Zotero.Ingester.scrapeURL(url); + if (this._getItemAtRow(row).isCollection()) { + var parentCollectionID = this._getItemAtRow(row).ref.getID(); + } + else { + var parentCollectionID = false; + } - if(newItem) - this._getItemAtRow(row).ref.addItem(newItem.getID()); - */ + Zotero.Attachments.importFromURL(url, false, false, parentCollectionID); } } @@ -631,10 +643,9 @@ Zotero.CollectionTreeView.prototype.onDragStart = function(evt,transferData,acti Zotero.CollectionTreeView.prototype.getSupportedFlavours = function () { var flavors = new FlavourSet(); - // TODO: Dragging of URLs not yet supported - //flavors.appendFlavour("text/x-moz-url"); - flavors.appendFlavour("zotero/item"); flavors.appendFlavour("zotero/collection"); + flavors.appendFlavour("zotero/item"); + flavors.appendFlavour("text/x-moz-url"); return flavors; } diff --git a/chrome/content/zotero/xpcom/itemTreeView.js b/chrome/content/zotero/xpcom/itemTreeView.js index b3d5a566f..e64c58874 100644 --- a/chrome/content/zotero/xpcom/itemTreeView.js +++ b/chrome/content/zotero/xpcom/itemTreeView.js @@ -994,13 +994,16 @@ Zotero.ItemTreeView.prototype.getSupportedFlavours = function () { var flavors = new FlavourSet(); flavors.appendFlavour("zotero/item"); - // TODO: Dragging of URLs not yet supported - //flavors.appendFlavour("text/x-moz-url"); + flavors.appendFlavour("text/x-moz-url"); return flavors; } Zotero.ItemTreeView.prototype.canDrop = function(row, orient) { + if (row == -1 && orient == -1) { + return true; + } + try { var dataSet = nsTransferable.get(this.getSupportedFlavours(), @@ -1017,11 +1020,15 @@ Zotero.ItemTreeView.prototype.canDrop = function(row, orient) var data = dataSet.first.first; var dataType = data.flavour.contentType; - var ids = data.data.split(','); // ids of rows we are dragging in - if (row==-1 && orient==-1) - { - return true; + switch (dataType) { + case 'zotero/item': + var ids = data.data.split(','); // ids of rows we are dragging in + break; + + case 'text/x-moz-url': + var url = data.data.split("\n")[0]; + break; } // workaround... two different services call canDrop @@ -1032,24 +1039,33 @@ Zotero.ItemTreeView.prototype.canDrop = function(row, orient) // If drag to different window if (nsDragAndDrop.mDragSession.sourceNode!=row.target) { - // Check if at least one item (or parent item for children) doesn't - // already exist in target - for each(var id in ids) - { - var item = Zotero.Items.get(id); + if (dataType == 'zotero/item') { + // Check if at least one item (or parent item for children) doesn't + // already exist in target + for each(var id in ids) + { + var item = Zotero.Items.get(id); + + // Skip non-top-level items + if (!item.isRegularItem() && item.getSource()) + { + continue; + } + // DISABLED: move parent on child drag + //var source = item.isRegularItem() ? false : item.getSource(); + //if (!this._itemGroup.ref.hasItem(source ? source : id)) + if (this._itemGroup.ref && !this._itemGroup.ref.hasItem(id)) + { + return true; + } + } + } + else if (dataType == 'text/x-moz-url') { + if (this._itemGroup.isSearch()) { + return false; + } - // Skip non-top-level items - if (!item.isRegularItem() && item.getSource()) - { - continue; - } - // DISABLED: move parent on child drag - //var source = item.isRegularItem() ? false : item.getSource(); - //if (!this._itemGroup.ref.hasItem(source ? source : id)) - if (this._itemGroup.ref && !this._itemGroup.ref.hasItem(id)) - { - return true; - } + return true; } } @@ -1096,12 +1112,19 @@ Zotero.ItemTreeView.prototype.canDrop = function(row, orient) return false; } - /* - else if (dataType == "text/x-moz-url") - { + else if (dataType == "text/x-moz-url") { + // Disallow direct drop on a non-regular item (e.g. note) + if (orient == 0) { + if (!rowItem.isRegularItem()) { + return false; + } + } + else if (this._itemGroup.isSearch()) { + return false; + } + return true; } - */ return false; } @@ -1129,8 +1152,11 @@ Zotero.ItemTreeView.prototype.drop = function(row, orient) var data = dataSet.first.first; var dataType = data.flavour.contentType; - if (dataType == 'zotero/item' && this.canDrop(row, orient)) - { + if (!this.canDrop(row, orient)) { + return false; + } + + if (dataType == 'zotero/item') { var ids = data.data.split(','); // ids of rows we are dragging in // Dropped directly on a row @@ -1138,7 +1164,7 @@ Zotero.ItemTreeView.prototype.drop = function(row, orient) { // If item was a top-level item and it exists in a collection, // replace it in collections with the parent item - rowItem = this._getItemAtRow(row).ref; // the item we are dragging over + var rowItem = this._getItemAtRow(row).ref; // the item we are dragging over for each(var id in ids) { var item = Zotero.Items.get(id); @@ -1184,16 +1210,21 @@ Zotero.ItemTreeView.prototype.drop = function(row, orient) } } } - else if (dataType == 'text/x-moz-url' && this.canDrop(row, orient)) - { + else if (dataType == 'text/x-moz-url') { var url = data.data.split("\n")[0]; - /* WAITING FOR INGESTER SUPPORT - var newItem = Zotero.Ingester.scrapeURL(url); + var sourceItemID = false; + var parentCollectionID = false; - if(newItem) - this._getItemAtRow(row).ref.addItem(newItem.getID()); - */ + if (orient == 0) { + var rowItem = this._getItemAtRow(row).ref; + sourceItemID = rowItem.getID() + } + else if (this._itemGroup.isCollection()) { + var parentCollectionID = this._itemGroup.ref.getID(); + } + + Zotero.Attachments.importFromURL(url, sourceItemID, false, parentCollectionID); } }