zotero/chrome/chromeFiles/content/scholar/overlay.js
David Norton 0b552c5fdb Closes #153, When deleting an item, don't give option to erase attached notes and files when there are none
Also, the default option (when applicable) is to delete attached notes and files.
2006-08-04 14:36:04 +00:00

495 lines
No EOL
15 KiB
JavaScript

/*
Scholar
Copyright (C) 2006 Center for History and New Media, George Mason University, Fairfax, VA
http://chnm.gmu.edu/
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
/*
* This object contains the various functions for the interface
*/
var ScholarPane = new function()
{
var collectionsView;
var itemsView;
//Privileged methods
this.onLoad = onLoad;
this.onUnload = onUnload;
this.toggleDisplay = toggleDisplay;
this.fullScreen = fullScreen;
this.newItem = newItem;
this.newCollection = newCollection;
this.onCollectionSelected = onCollectionSelected;
this.itemSelected = itemSelected;
this.deleteSelectedItem = deleteSelectedItem;
this.deleteSelectedCollection = deleteSelectedCollection;
this.renameSelectedCollection = renameSelectedCollection;
this.search = search;
this.getCollectionsView = getCollectionsView;
this.getItemsView = getItemsView;
this.selectItem = selectItem;
this.getSelectedCollection = getSelectedCollection;
this.getSelectedItems = getSelectedItems;
this.buildCollectionContextMenu = buildCollectionContextMenu;
this.buildItemContextMenu = buildItemContextMenu;
this.onDoubleClick = onDoubleClick;
this.openNoteWindow = openNoteWindow;
this.newNote = newNote;
this.addFileFromDialog = addFileFromDialog;
this.addFileFromPage = addFileFromPage;
/*
* Called when the window is open
*/
function onLoad()
{
if(Scholar.Prefs.get("scholarPaneOnTop"))
{
var oldPane = document.getElementById('scholar-pane');
var oldSplitter = document.getElementById('scholar-splitter');
var appContent = document.getElementById('appcontent');
var newPane = document.createElement('hbox');
newPane.setAttribute('id','scholar-pane');
newPane.setAttribute('collapsed',true);
newPane.setAttribute('flex','1');
newPane.height = oldPane.height;
while(oldPane.hasChildNodes())
newPane.appendChild(oldPane.firstChild);
appContent.removeChild(oldPane);
appContent.insertBefore(newPane, document.getElementById('content'));
var newSplitter = document.createElement('splitter');
newSplitter.setAttribute('id','scholar-splitter');
newSplitter.setAttribute('collapsed',true);
newSplitter.setAttribute('resizebefore','closest');
newSplitter.setAttribute('resizeafter','closest');
appContent.removeChild(oldSplitter);
appContent.insertBefore(newSplitter, document.getElementById('content'));
document.getElementById('tb-fullscreen').setAttribute('scholartop','true');
}
//Initialize collections view
collectionsView = new Scholar.CollectionTreeView();
var collectionsTree = document.getElementById('collections-tree');
collectionsTree.view = collectionsView;
collectionsTree.controllers.appendController(new Scholar.CollectionTreeCommandController(collectionsTree));
var itemsTree = document.getElementById('items-tree');
itemsTree.controllers.appendController(new Scholar.ItemTreeCommandController(itemsTree));
//Create the add menu with each item type
var addMenu = document.getElementById('tb-add').firstChild;
var itemTypes = Scholar.ItemTypes.getTypes();
for(var i = 0; i<itemTypes.length; i++)
{
var menuitem = document.createElement("menuitem");
menuitem.setAttribute("label", Scholar.getString("itemTypes."+itemTypes[i]['name']));
menuitem.setAttribute("oncommand","ScholarPane.newItem("+itemTypes[i]['id']+")");
addMenu.appendChild(menuitem);
}
}
/*
* Called when the window closes
*/
function onUnload()
{
collectionsView.unregister();
if(itemsView)
itemsView.unregister();
}
/*
* Hides/displays the Scholar interface
*/
function toggleDisplay()
{
var visible = document.getElementById('scholar-pane').getAttribute('collapsed') == 'true';
document.getElementById('scholar-pane').setAttribute('collapsed',!visible);
document.getElementById('scholar-splitter').setAttribute('collapsed',!visible);
if(!visible)
{
document.getElementById('content').setAttribute('collapsed', false);
document.getElementById('tb-fullscreen').setAttribute('fullscreenmode', false);
}
}
function fullScreen()
{
var visible = document.getElementById('content').getAttribute('collapsed') == 'true';
document.getElementById('content').setAttribute('collapsed', !visible);
document.getElementById('scholar-splitter').setAttribute('collapsed', !visible);
document.getElementById('tb-fullscreen').setAttribute('fullscreenmode', !visible);
}
/*
* Create a new item
*/
function newItem(typeID)
{
if(document.getElementById('tb-search').value != "")
{
document.getElementById('tb-search').value = "";
document.getElementById('tb-search').doCommand();
}
var item = new Scholar.Item(typeID);
item.save();
if(itemsView && itemsView._itemGroup.isCollection())
itemsView._itemGroup.ref.addItem(item.getID());
//set to Info tab
document.getElementById('scholar-view-item').selectedIndex = 0;
return item;
}
function newCollection()
{
Scholar.Collections.add(Scholar.getString('pane.collections.untitled'));
}
function onCollectionSelected()
{
if(itemsView)
itemsView.unregister();
document.getElementById('tb-search').value = "";
document.getElementById('scholar-search-options').hidden = true;
if(collectionsView.selection.count == 1 && collectionsView.selection.currentIndex != -1)
{
var collection = collectionsView._getItemAtRow(collectionsView.selection.currentIndex);
collection.setSearch('');
itemsView = new Scholar.ItemTreeView(collection);
document.getElementById('items-tree').view = itemsView;
document.getElementById('tb-collection-rename').disabled = collection.isLibrary();
itemsView.selection.clearSelection();
}
else
{
document.getElementById('items-tree').view = itemsView = null;
document.getElementById('tb-collection-rename').disabled = true;
}
}
function itemSelected()
{
if(itemsView && itemsView.selection.count == 1 && itemsView.selection.currentIndex != -1)
{
var item = itemsView._getItemAtRow(itemsView.selection.currentIndex);
if(item.isNote())
{
var noteEditor = document.getElementById('scholar-note-editor');
noteEditor.item = null;
noteEditor.note = item.ref;
document.getElementById('scholar-view-note-button').setAttribute('noteID',item.ref.getID());
if(item.ref.getSource() != null)
document.getElementById('scholar-view-note-button').setAttribute('sourceID',item.ref.getSource());
else
document.getElementById('scholar-view-note-button').removeAttribute('sourceID');
document.getElementById('item-pane').selectedIndex = 2;
}
else if(item.isFile())
{
document.getElementById('scholar-file-label').setAttribute('value',item.getField('title'));
document.getElementById('scholar-file-links').item = item.ref;
document.getElementById('item-pane').selectedIndex = 3;
}
else
{
ScholarItemPane.viewItem(item.ref);
document.getElementById('item-pane').selectedIndex = 1;
}
}
else
{
document.getElementById('item-pane').selectedIndex = 0;
var label = document.getElementById('scholar-view-selected-label');
if(itemsView && itemsView.selection.count)
label.value = Scholar.getString('pane.item.selected.multiple').replace('%1', itemsView.selection.count);
else
label.value = Scholar.getString('pane.item.selected.zero');
}
}
function deleteSelectedItem()
{
if(itemsView && itemsView.selection.count > 0)
{
var eraseChildren = {value: true};
var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
.getService(Components.interfaces.nsIPromptService);
var hasChildren;
var start = new Object();
var end = new Object();
for (var i=0, len=itemsView.selection.getRangeCount(); i<len && !hasChildren; i++)
{
itemsView.selection.getRangeAt(i,start,end);
for (var j=start.value; j<=end.value && !hasChildren; j++)
if(itemsView._getItemAtRow(j).numNotes() || itemsView._getItemAtRow(j).numFiles())
hasChildren = true;
}
if(promptService.confirmCheck(window, Scholar.getString('pane.items.delete.title'), Scholar.getString('pane.items.delete'), ( hasChildren ? Scholar.getString('pane.items.delete.attached') : ''), eraseChildren))
itemsView.deleteSelection(eraseChildren.value);
}
}
function deleteSelectedCollection()
{
if(collectionsView.selection.count > 0 && confirm(Scholar.getString('pane.collections.delete')))
collectionsView.deleteSelection();
}
function renameSelectedCollection()
{
if(collectionsView.selection.count > 0)
{
var collection = collectionsView._getItemAtRow(collectionsView.selection.currentIndex);
var newName = prompt(Scholar.getString('pane.collections.rename'),collection.getName());
if(newName)
collection.ref.rename(newName);
}
}
function search()
{
if(itemsView)
{
searchVal = document.getElementById('tb-search').value;
itemsView.searchText(searchVal);
//do something about granularity
//document.getElementById('scholar-search-options').getElementsByAttribute('checked','true')[0].label
document.getElementById('scholar-search-options').hidden = searchVal == "";
document.getElementById('tb-search-cancel').hidden = searchVal == "";
}
}
function getCollectionsView()
{
return collectionsView;
}
function getItemsView()
{
return itemsView;
}
function selectItem(id)
{
if(itemsView)
{
if(!itemsView._itemGroup.isLibrary())
{
//select the Library if the item is not in the current collection
var item = Scholar.Items.get(id);
var collectionID = itemsView._itemGroup.ref.getID();
if(!item.isRegularItem())
{
if(!Scholar.Items.get(item.getSource()).inCollection(collectionID))
collectionsView.selection.select(0);
}
else if(!item.inCollection(collectionID))
collectionsView.selection.select(0);
}
itemsView.selectItem(id);
}
}
function getSelectedCollection()
{
if(collectionsView.selection.count > 0 && collectionsView.selection.currentIndex != -1)
{
collection = collectionsView._getItemAtRow(collectionsView.selection.currentIndex);
if(collection && collection.isCollection())
return collection.ref;
}
}
function getSelectedItems()
{
if(itemsView)
{
var items = new Array();
var start = new Object();
var end = new Object();
for (var i=0, len=itemsView.selection.getRangeCount(); i<len; i++)
{
itemsView.selection.getRangeAt(i,start,end);
for (var j=start.value; j<=end.value; j++)
items.push(itemsView._getItemAtRow(j).ref);
}
}
return items;
}
function buildCollectionContextMenu()
{
var menu = document.getElementById('scholar-collectionmenu');
if(collectionsView.selection.count == 1 && !collectionsView._getItemAtRow(collectionsView.selection.currentIndex).isLibrary())
{
menu.childNodes[2].removeAttribute('disabled');
menu.childNodes[3].removeAttribute('disabled');
menu.childNodes[5].removeAttribute('disabled');
menu.childNodes[6].removeAttribute('disabled');
}
else
{
menu.childNodes[2].setAttribute('disabled', true);
menu.childNodes[3].setAttribute('disabled', true);
menu.childNodes[5].setAttribute('disabled', true);
menu.childNodes[6].setAttribute('disabled', true);
}
}
function buildItemContextMenu()
{
var menu = document.getElementById('scholar-itemmenu');
if(itemsView && itemsView.selection.count > 0)
{
menu.childNodes[2].removeAttribute('disabled');
menu.childNodes[4].removeAttribute('disabled');
menu.childNodes[5].removeAttribute('disabled');
}
else
{
menu.childNodes[2].setAttribute('disabled', true);
menu.childNodes[4].setAttribute('disabled', true);
menu.childNodes[5].setAttribute('disabled', true);
}
if(itemsView && itemsView.selection.count > 1)
{
menu.childNodes[2].setAttribute('label', Scholar.getString('pane.items.menu.remove.multiple'));
menu.childNodes[4].setAttribute('label', Scholar.getString('pane.items.menu.export.multiple'));
menu.childNodes[5].setAttribute('label', Scholar.getString('pane.items.menu.createBib.multiple'));
}
else
{
menu.childNodes[2].setAttribute('label', Scholar.getString('pane.items.menu.remove'));
menu.childNodes[4].setAttribute('label', Scholar.getString('pane.items.menu.export'));
menu.childNodes[5].setAttribute('label', Scholar.getString('pane.items.menu.createBib'));
}
}
// Adapted from: http://www.xulplanet.com/references/elemref/ref_tree.html#cmnote-9
function onDoubleClick(event, tree)
{
if (event && tree && (event.type == "click" || event.type == "dblclick"))
{
var row = {}, col = {}, obj = {};
tree.treeBoxObject.getCellAt(event.clientX, event.clientY, row, col, obj);
if (obj.value && itemsView && itemsView.selection.currentIndex > -1)
{
var item = getSelectedItems()[0];
if(item && item.isNote())
{
document.getElementById('scholar-view-note-button').doCommand();
}
}
}
}
function newNote()
{
var c = getSelectedCollection();
if(c)
openNoteWindow(null, c.getID());
else
openNoteWindow();
}
function openNoteWindow(id, parent)
{
window.open('chrome://scholar/content/note.xul?v=1'+(id ? '&id='+id : '')+(parent ? '&coll='+parent : ''),'','chrome,resizable,centerscreen');
}
function addFileFromDialog(link, id)
{
var nsIFilePicker = Components.interfaces.nsIFilePicker;
var fp = Components.classes["@mozilla.org/filepicker;1"]
.createInstance(nsIFilePicker);
fp.init(window, Scholar.getString('pane.item.files.select'), nsIFilePicker.modeOpen);
if(fp.show() == nsIFilePicker.returnOK)
{
var fileID;
if(link)
fileID = Scholar.Files.linkFromFile(fp.file, id);
else
fileID = Scholar.Files.importFromFile(fp.file, id);
if(fileID && !id)
{
var c = getSelectedCollection();
if(c)
c.addItem(fileID);
}
}
}
function addFileFromPage(link, id)
{
var item;
if(id == null)
{
item = newItem(Scholar.ItemTypes.getID('website'));
if(item)
id = item.getID();
}
var fileID;
if(link)
fileID = Scholar.Files.linkFromDocument(window.content.document, id);
else
fileID = Scholar.Files.importFromDocument(window.content.document, id);
if(fileID)
{
var file = Scholar.Items.get(fileID);
if(!item)
item = Scholar.Items.get(id);
if(file && item)
{
item.setField('title',file.getField('title'));
item.save();
}
}
}
}
window.addEventListener("load", function(e) { ScholarPane.onLoad(e); }, false);
window.addEventListener("unload", function(e) { ScholarPane.onUnload(e); }, false);