www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | Submodules | README | LICENSE

editBibliographyDialog.js (9496B)


      1 /*
      2     ***** BEGIN LICENSE BLOCK *****
      3     
      4     Copyright © 2009 Center for History and New Media
      5                      George Mason University, Fairfax, Virginia, USA
      6                      http://zotero.org
      7     
      8     This file is part of Zotero.
      9     
     10     Zotero is free software: you can redistribute it and/or modify
     11     it under the terms of the GNU Affero General Public License as published by
     12     the Free Software Foundation, either version 3 of the License, or
     13     (at your option) any later version.
     14     
     15     Zotero is distributed in the hope that it will be useful,
     16     but WITHOUT ANY WARRANTY; without even the implied warranty of
     17     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     18     GNU Affero General Public License for more details.
     19     
     20     You should have received a copy of the GNU Affero General Public License
     21     along with Zotero.  If not, see <http://www.gnu.org/licenses/>.
     22     
     23     ***** END LICENSE BLOCK *****
     24 */
     25 
     26 var Zotero_Bibliography_Dialog = new function () {
     27 	var bibEditInterface;
     28 	var _lastSelectedItemID = false;
     29 	var _lastSelectedIndex = false;
     30 	var _lastSelectedValue = false;
     31 	var _accepted = false;
     32 	var _revertButton, _revertAllButton, _addButton, _removeButton;
     33 	var _itemList;
     34 	var _suppressAllSelectEvents = false;
     35 	
     36 	/**
     37 	 * Initializes add citation dialog
     38 	 */
     39 	this.load = function() {
     40 		bibEditInterface = window.arguments[0].wrappedJSObject;
     41 		
     42 		_revertAllButton = document.documentElement.getButton("extra2");
     43 		_revertButton = document.documentElement.getButton("extra1");
     44 		_addButton = document.getElementById("add");
     45 		_removeButton = document.getElementById("remove");
     46 		_itemList = document.getElementById("item-list");
     47 		_itemTree = document.getElementById("zotero-items-tree");
     48 		
     49 		_revertAllButton.label = Zotero.getString("integration.revertAll.button");
     50 		_revertAllButton.disabled = bibEditInterface.isAnyEdited();
     51 		_revertButton.label = Zotero.getString("integration.revert.button");
     52 		_revertButton.disabled = true;
     53 
     54 		document.getElementById('editor').format = "RTF";
     55 		
     56 		// load (from selectItemsDialog.js)
     57 		doLoad();
     58 		
     59 		// load bibliography entires
     60 		_loadItems();
     61 	}
     62 	
     63 	/**
     64 	 * Called when an item in the item selection tree is clicked
     65 	 */
     66 	this.treeItemSelected = function() {
     67 		if(_suppressAllSelectEvents) return;
     68 		var selectedItemIDs = itemsView.getSelectedItems(true); // treeview from selectItemsDialog.js
     69 		
     70 		// if all selected items are available in the list box on the right, select them there
     71 		// otherwise, clear the list box selection
     72 		var clearListItems = false;
     73 		var itemsToSelect = [];
     74 		if(selectedItemIDs.length) {
     75 			for (let itemID of selectedItemIDs) {
     76 				var itemIndexToSelect = false;
     77 				for(var i in bibEditInterface.bib[0].entry_ids) {
     78 					if(bibEditInterface.bib[0].entry_ids[i].indexOf(itemID) !== -1) {
     79 						itemIndexToSelect = i;
     80 						continue;
     81 					}
     82 				}
     83 				
     84 				if(itemIndexToSelect !== false) {
     85 					itemsToSelect.push(_itemList.getItemAtIndex(itemIndexToSelect));
     86 				} else {
     87 					clearListItems = true;
     88 					break;
     89 				}
     90 			}
     91 		}
     92 		
     93 		_suppressAllSelectEvents = true;
     94 		_itemList.clearSelection();
     95 		if(clearListItems) {
     96 			_addButton.disabled = (itemsToSelect.length > 0);
     97 			_revertButton.disabled = _removeButton.disabled = true;
     98 		} else {
     99 			_addButton.disabled = true;
    100 			_removeButton.disabled = false;
    101 			_updateRevertButtonStatus();
    102 			itemsToSelect.forEach(item => _itemList.toggleItemSelection(item));
    103 			_itemList.ensureIndexIsVisible(itemsToSelect[0]);
    104 		}
    105 		_suppressAllSelectEvents = false;
    106 		
    107 		_updatePreview();
    108 	}
    109 	
    110 	/**
    111 	 * Called when an item in the reference list is clicked
    112 	 */
    113 	this.listItemSelected = function() {
    114 		if(_suppressAllSelectEvents) return;
    115 		
    116 		// enable remove if at least one item is selected
    117 		_addButton.disabled = true;
    118 		_removeButton.disabled = !_itemList.selectedItems.length;
    119 		
    120 		if(_itemList.selectedItems.length) {
    121 			_suppressAllSelectEvents = true;
    122 			_itemTree.view.selection.clearSelection();
    123 			_suppressAllSelectEvents = false;
    124 			
    125 			// only show revert button if at least one selected item has been edited
    126 			_updateRevertButtonStatus();
    127 		}
    128 		
    129 		// update preview to blank if no items or multiple items are selected; otherwise show
    130 		// preview for selected items
    131 		_updatePreview();
    132 	}
    133 	
    134 	/**
    135 	 * Adds references to the reference list
    136 	 */
    137 	this.add = function() {
    138 		for (let itemID of itemsView.getSelectedItems(true)) {
    139 			bibEditInterface.add(itemID);
    140 		}
    141 		document.getElementById("add").disabled = true;
    142 		_loadItems();
    143 	}
    144 	
    145 	/**
    146 	 * Clears all customizations
    147 	 */
    148 	this.revertAll = function() {
    149 		var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
    150 										.getService(Components.interfaces.nsIPromptService);
    151 		
    152 		var out = {};
    153 		var regenerate = promptService.confirmEx(
    154 			window,
    155 			Zotero.getString('integration.revertAll.title'),
    156 			Zotero.getString('integration.revertAll.body'),
    157 			promptService.STD_OK_CANCEL_BUTTONS+promptService.BUTTON_POS_1_DEFAULT,
    158 			null, null, null, null, out
    159 		);
    160 		
    161 		if(regenerate != 0) return;
    162 		
    163 		bibEditInterface.revertAll();
    164 		
    165 		_loadItems();
    166 		_updatePreview(true);
    167 	}
    168 	
    169 	/**
    170 	 * Clears customizations to selected entry
    171 	 */
    172 	this.revert = function() {
    173 		var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
    174 										.getService(Components.interfaces.nsIPromptService);
    175 		
    176 		var out = {};
    177 		var regenerate = promptService.confirmEx(
    178 			window,
    179 			Zotero.getString('integration.revert.title'),
    180 			Zotero.getString('integration.revert.body'),
    181 			promptService.STD_OK_CANCEL_BUTTONS+promptService.BUTTON_POS_1_DEFAULT,
    182 			null, null, null, null, out
    183 		);
    184 		
    185 		if(regenerate != 0) return;
    186 		
    187 		for (let itemID of _getSelectedListItemIDs()) {
    188 			bibEditInterface.revert(itemID);
    189 		}
    190 		
    191 		_updatePreview();
    192 	}
    193 	
    194 	/**
    195 	 * Deletes selected references from the reference list
    196 	 */
    197 	this.remove = function() {
    198 		var selectedListItemIDs = _getSelectedListItemIDs();
    199 		
    200 		// if cited in bibliography, warn before removing
    201 		var isCited = false;
    202 		for (let itemID of selectedListItemIDs) {
    203 			isCited |= bibEditInterface.isCited(itemID);
    204 		}
    205 		if(isCited) {			
    206 			var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
    207 											.getService(Components.interfaces.nsIPromptService);
    208 			
    209 			var out = {};
    210 			var regenerate = promptService.confirmEx(
    211 				window,
    212 				Zotero.getString('integration.removeBibEntry.title'),
    213 				Zotero.getString('integration.removeBibEntry.body'),
    214 				promptService.STD_OK_CANCEL_BUTTONS+promptService.BUTTON_POS_1_DEFAULT,
    215 				null, null, null, null, out
    216 			);
    217 			if(regenerate != 0) return;
    218 		}
    219 		
    220 		// remove
    221 		for (let itemID of selectedListItemIDs) {
    222 			bibEditInterface.remove(itemID);
    223 		}
    224 		_loadItems();
    225 	}
    226 	
    227 	/**
    228 	 * Called when the user edits the currently selected bibliography entry
    229 	 */
    230 	this.textChanged = function() {
    231 		_revertButton.disabled = _revertAllButton.disabled = false;
    232 	}
    233 	
    234 	/**
    235 	 * Called when OK button is pressed
    236 	 */
    237 	this.accept = function() {
    238 		if(_accepted) return;
    239 		_updatePreview(true);
    240 		_accepted = true;
    241 	}
    242 	
    243 	/**
    244 	 * Called when Cancel button is pressed
    245 	 */
    246 	this.close = function() {
    247 		if(_accepted) return;
    248 		bibEditInterface.cancel();
    249 		_accepted = true;
    250 	}
    251 	
    252 	/**
    253 	 * Gets selected item IDs from list box on right
    254 	 */
    255 	function _getSelectedListItemIDs() {
    256 		return Array.from(_itemList.selectedItems)
    257 			.map(item => bibEditInterface.bib[0].entry_ids[item.value][0]);
    258 	}
    259 	
    260 	/**
    261 	 * Update status of "Revert" button to match modification status of current item
    262 	 */
    263 	function _updateRevertButtonStatus() {
    264 		_revertButton.disabled = true;
    265 		var selectedListItemIDs = _getSelectedListItemIDs();
    266 		for (let itemID of selectedListItemIDs) {
    267 			if(bibEditInterface.isEdited(itemID)) {
    268 				_revertButton.disabled = false;
    269 				break;
    270 			}
    271 		}
    272 	}
    273 	
    274 	/**
    275 	 * Updates the contents of the preview pane
    276 	 */
    277 	function _updatePreview(ignoreSelection) {
    278 		var index = !ignoreSelection && _itemList.selectedItems.length == 1 ? _itemList.selectedIndex : undefined;
    279 		var editor = document.getElementById('editor');
    280 		
    281 		if(_lastSelectedItemID) {
    282 			var newValue = editor.value;
    283 			if(_lastSelectedValue != newValue) {
    284 				bibEditInterface.setCustomText(_lastSelectedItemID, newValue);
    285 			}
    286 		}
    287 		
    288 		editor.readonly = index === undefined;
    289 		if(index !== undefined) {
    290 			var itemID = bibEditInterface.bib[0].entry_ids[index];
    291 			editor.value = bibEditInterface.bib[1][index];
    292 			_lastSelectedIndex = index;
    293 			_lastSelectedItemID = itemID;
    294 			_lastSelectedValue = editor.value;
    295 		} else {
    296 			editor.value = "";
    297 			_lastSelectedIndex = _lastSelectedItemID = _lastSelectedValue = false;
    298 		}
    299 		
    300 		_revertAllButton.disabled = !bibEditInterface.isAnyEdited();
    301 	}
    302 	
    303 	/*
    304 	 * loads items from itemSet
    305 	 */
    306 	function _loadItems() {
    307 		var itemIDs = bibEditInterface.bib[0].entry_ids;
    308 		var items = itemIDs.map(itemID => Zotero.Cite.getItem(itemID[0]));
    309 		
    310 		// delete all existing items from list
    311 		var itemList = document.getElementById("item-list");
    312 		while(itemList.firstChild) {
    313 			itemList.removeChild(itemList.firstChild);
    314 		}
    315 		
    316 		// add new items
    317 		for(var i=0; i<items.length; i++) {
    318 			var itemNode = document.createElement("listitem");
    319 			itemNode.setAttribute("value", i);
    320 			itemNode.setAttribute("label", items[i].getDisplayTitle());
    321 			itemNode.setAttribute("class", "listitem-iconic");
    322 			itemNode.setAttribute("image", items[i].getImageSrc());
    323 			itemList.appendChild(itemNode);
    324 		}
    325 		
    326 		_updatePreview();
    327 	}
    328 }