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); } }