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

View File

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