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.
This commit is contained in:
Dan Stillman 2007-02-18 06:49:13 +00:00
parent a1485213e4
commit 42f2b56bb4
2 changed files with 100 additions and 58 deletions

View File

@ -424,7 +424,8 @@ Zotero.CollectionTreeView.prototype.deleteSelection = function()
*/ */
Zotero.CollectionTreeView.prototype._showItem = function(itemGroup, level, beforeRow) 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,8 +503,15 @@ Zotero.CollectionTreeCommandController.prototype.onEvent = function(evt)
*/ */
Zotero.CollectionTreeView.prototype.canDrop = function(row, orient) 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; return false;
}
//Zotero.debug('Row is ' + row);
//Zotero.debug('Orient is ' + orient);
try try
{ {
@ -529,9 +537,7 @@ Zotero.CollectionTreeView.prototype.canDrop = function(row, orient)
{ {
var rowCollection = this._getItemAtRow(row).ref; //the collection we are dragging over var rowCollection = this._getItemAtRow(row).ref; //the collection we are dragging over
// TODO: Dragging URLs not yet supported if (dataType == 'zotero/item') {
if (dataType == 'zotero/item' || dataType == "text/x-moz-url")
{
var ids = data.data.split(','); var ids = data.data.split(',');
for each(var id in ids) for each(var id in ids)
{ {
@ -549,6 +555,11 @@ Zotero.CollectionTreeView.prototype.canDrop = function(row, orient)
} }
return false; return false;
} }
else if (dataType == 'text/x-moz-url') {
if (!this._getItemAtRow(row).isSearch()) {
return true;
}
}
else if (dataType == 'zotero/collection' else if (dataType == 'zotero/collection'
&& data.data != rowCollection.getID() && data.data != rowCollection.getID()
&& !Zotero.Collections.get(data.data).hasDescendent('collection', 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 data = dataSet.first.first;
var dataType = data.flavour.contentType; var dataType = data.flavour.contentType;
if (!this.canDrop(row, orient)) {
return false;
}
if(dataType == 'zotero/collection') if(dataType == 'zotero/collection')
{ {
var oldCount = this.rowCount;
var targetCollectionID; var targetCollectionID;
if(this._getItemAtRow(row).isCollection()) if(this._getItemAtRow(row).isCollection())
targetCollectionID = this._getItemAtRow(row).ref.getID(); targetCollectionID = this._getItemAtRow(row).ref.getID();
@ -585,10 +598,8 @@ Zotero.CollectionTreeView.prototype.drop = function(row, orient)
this.selection.clearSelection(); this.selection.clearSelection();
this.selection.select(selectRow); this.selection.select(selectRow);
this.selection.selectEventsSuppressed = false; this.selection.selectEventsSuppressed = false;
} }
else if(dataType == 'zotero/item' && this.canDrop(row, orient)) else if (dataType == 'zotero/item') {
{
var ids = data.data.split(','); var ids = data.data.split(',');
var targetCollection = this._getItemAtRow(row).ref; var targetCollection = this._getItemAtRow(row).ref;
for each(var id in ids) 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]; var url = data.data.split("\n")[0];
/* WAITING FOR INGESTER SUPPORT if (this._getItemAtRow(row).isCollection()) {
var newItem = Zotero.Ingester.scrapeURL(url); var parentCollectionID = this._getItemAtRow(row).ref.getID();
}
else {
var parentCollectionID = false;
}
if(newItem) Zotero.Attachments.importFromURL(url, false, false, parentCollectionID);
this._getItemAtRow(row).ref.addItem(newItem.getID());
*/
} }
} }
@ -631,10 +643,9 @@ Zotero.CollectionTreeView.prototype.onDragStart = function(evt,transferData,acti
Zotero.CollectionTreeView.prototype.getSupportedFlavours = function () Zotero.CollectionTreeView.prototype.getSupportedFlavours = function ()
{ {
var flavors = new FlavourSet(); 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/collection");
flavors.appendFlavour("zotero/item");
flavors.appendFlavour("text/x-moz-url");
return flavors; return flavors;
} }

View File

@ -994,13 +994,16 @@ Zotero.ItemTreeView.prototype.getSupportedFlavours = function ()
{ {
var flavors = new FlavourSet(); var flavors = new FlavourSet();
flavors.appendFlavour("zotero/item"); 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; return flavors;
} }
Zotero.ItemTreeView.prototype.canDrop = function(row, orient) Zotero.ItemTreeView.prototype.canDrop = function(row, orient)
{ {
if (row == -1 && orient == -1) {
return true;
}
try try
{ {
var dataSet = nsTransferable.get(this.getSupportedFlavours(), var dataSet = nsTransferable.get(this.getSupportedFlavours(),
@ -1017,11 +1020,15 @@ Zotero.ItemTreeView.prototype.canDrop = function(row, orient)
var data = dataSet.first.first; var data = dataSet.first.first;
var dataType = data.flavour.contentType; var dataType = data.flavour.contentType;
var ids = data.data.split(','); // ids of rows we are dragging in
if (row==-1 && orient==-1) switch (dataType) {
{ case 'zotero/item':
return true; 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 // workaround... two different services call canDrop
@ -1032,6 +1039,7 @@ Zotero.ItemTreeView.prototype.canDrop = function(row, orient)
// If drag to different window // If drag to different window
if (nsDragAndDrop.mDragSession.sourceNode!=row.target) if (nsDragAndDrop.mDragSession.sourceNode!=row.target)
{ {
if (dataType == 'zotero/item') {
// Check if at least one item (or parent item for children) doesn't // Check if at least one item (or parent item for children) doesn't
// already exist in target // already exist in target
for each(var id in ids) for each(var id in ids)
@ -1052,6 +1060,14 @@ Zotero.ItemTreeView.prototype.canDrop = function(row, orient)
} }
} }
} }
else if (dataType == 'text/x-moz-url') {
if (this._itemGroup.isSearch()) {
return false;
}
return true;
}
}
return false; return false;
} }
@ -1096,12 +1112,19 @@ Zotero.ItemTreeView.prototype.canDrop = function(row, orient)
return false; 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 true;
} }
*/
return false; return false;
} }
@ -1129,8 +1152,11 @@ Zotero.ItemTreeView.prototype.drop = function(row, orient)
var data = dataSet.first.first; var data = dataSet.first.first;
var dataType = data.flavour.contentType; 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 var ids = data.data.split(','); // ids of rows we are dragging in
// Dropped directly on a row // 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, // If item was a top-level item and it exists in a collection,
// replace it in collections with the parent item // 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) for each(var id in ids)
{ {
var item = Zotero.Items.get(id); 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]; var url = data.data.split("\n")[0];
/* WAITING FOR INGESTER SUPPORT var sourceItemID = false;
var newItem = Zotero.Ingester.scrapeURL(url); var parentCollectionID = false;
if(newItem) if (orient == 0) {
this._getItemAtRow(row).ref.addItem(newItem.getID()); 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);
} }
} }