locateManager.xul (8669B)
1 <?xml version="1.0"?> 2 <!-- 3 ***** BEGIN LICENSE BLOCK ***** 4 5 Copyright © 2009 Center for History and New Media 6 George Mason University, Fairfax, Virginia, USA 7 http://zotero.org 8 9 This file is part of Zotero. 10 11 Zotero is free software: you can redistribute it and/or modify 12 it under the terms of the GNU Affero General Public License as published by 13 the Free Software Foundation, either version 3 of the License, or 14 (at your option) any later version. 15 16 Zotero is distributed in the hope that it will be useful, 17 but WITHOUT ANY WARRANTY; without even the implied warranty of 18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19 GNU Affero General Public License for more details. 20 21 You should have received a copy of the GNU Affero General Public License 22 along with Zotero. If not, see <http://www.gnu.org/licenses/>. 23 24 ***** END LICENSE BLOCK ***** 25 --> 26 <!DOCTYPE prefwindow SYSTEM "chrome://zotero/locale/preferences.dtd"> 27 28 <?xml-stylesheet href="chrome://global/skin/global.css"?> 29 <?xml-stylesheet href="chrome://browser/skin/preferences/preferences.css"?> 30 <?xml-stylesheet href="chrome://zotero/skin/preferences.css"?> 31 32 <!-- 33 34 To add a new preference: 35 1) Add a new <preference> to <preferences> 36 2) Add a XUL control with a 'preference' attribute 37 3) (Optional) Add additional setup/change logic to preferences.js 38 4) (Optional) To add an observer for a preference change, 39 add an appropriate case in the switch statement 40 in Zotero.Prefs.observe() 41 42 --> 43 <prefwindow id="zotero-locate-manager-prefs" title="&zotero.preferences.title;" onload="refreshLocateEnginesList()" 44 windowtype="zotero:pref" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> 45 46 <prefpane id="zotero-prefpane-locate" 47 label="&zotero.preferences.prefpane.locate;" 48 image="chrome://zotero/skin/prefs-styles.png"> 49 <!-- TODO: pic for locate pane --> 50 <!-- TODO: create labels in dtd --> 51 52 <preferences> 53 <preference id="pref-locate-activeEngines" name="extensions.zotero.locate.activeEngines" type="string"/> 54 </preferences> 55 56 <groupbox flex="1"> 57 <caption label="&zotero.preferences.locate.locateEngineManager;"/> 58 59 <label id="locateEngineDescription" width="45em" style="font-size: 10px"> 60 &zotero.preferences.locate.locateEnginedescription; 61 </label> 62 63 <separator class="thin"/> 64 65 <hbox> 66 <tree flex="1" id="locateManager" hidecolumnpicker="true" rows="10" 67 onselect="document.getElementById('locateManager-delete').disabled = undefined" 68 editable="false"> 69 <treecols> 70 <treecol type="checkbox" id="locateManager-checkbox" editable="true" flex="0.5"/> 71 <treecol id="locateManager-name" label="&zotero.preferences.locate.name;" flex="1"/> 72 <treecol id="locateManager-description" label="&zotero.preferences.locate.description;" flex="2"/> 73 </treecols> 74 <treechildren id="locateManager-rows"/> 75 </tree> 76 </hbox> 77 78 <separator class="thin"/> 79 80 <hbox align="center"> 81 <hbox pack="start" flex="1"> 82 <button label="Toggle" onclick="toggleLocateEngines()" flex="1"/> 83 <button id="locateManager-restoreDefaults" label="&zotero.preferences.locate.restoreDefaults;" onclick="restoreDefaultLocateEngines()" flex="1"/> 84 </hbox> 85 <hbox pack="end" flex="2"> 86 <button disabled="true" id="locateManager-delete" label="-" onclick="deleteLocateEngine()" flex="0.5"/> 87 </hbox> 88 </hbox> 89 90 <separator class="thin"/> 91 92 <!-- 93 TODO: Restore a way to add these 94 <label id="addLocateEngineDescription" style="font-size: 10px; width: 45em; height: 6em"> 95 &zotero.preferences.locate.addDescription; 96 </label> 97 --> 98 </groupbox> 99 </prefpane> 100 101 <script src="chrome://zotero/content/include.js"></script> 102 <script type="application/javascript"> 103 <![CDATA[ 104 function treeClick(event) { 105 // We only care about primary button double and triple clicks 106 if (!event || (event.detail != 2 && event.detail != 3) || event.button != 0) { 107 return; 108 } 109 var t = event.originalTarget; 110 111 if (t.localName != 'treechildren') { 112 return; 113 } 114 115 var tree = t.parentNode; 116 117 var row = {}, col = {}, obj = {}; 118 var cell = tree.treeBoxObject.getCellAt(event.clientX, event.clientY, row, col, obj); 119 120 var treechildren = document.getElementById('locateManager-rows'); 121 var treeitem = treechildren.children[row.value]; 122 123 treeitem.engine.hidden = !treeitem.engine.hidden; 124 125 refreshLocateEnginesList() 126 } 127 128 /** 129 * Refreshes the list of locate engines in the locate pane 130 * @param {String} name of locate engine to select 131 */ 132 function refreshLocateEnginesList() { 133 var tree = document.getElementById('locateManager'); 134 var treechildren = document.getElementById('locateManager-rows'); 135 136 // add click listener 137 tree.addEventListener("click", treeClick, false); 138 139 // store ranges 140 var nRanges = tree.view.selection.getRangeCount(); 141 var start = {}; 142 var end = {}; 143 var ranges = []; 144 for(var i=0; i<nRanges; i++) { 145 tree.view.selection.getRangeAt(i, start, end); 146 ranges.push([start.value, end.value]); 147 } 148 149 // clear tree 150 while (treechildren.hasChildNodes()) { 151 treechildren.removeChild(treechildren.firstChild); 152 } 153 154 // repopulate tree with available engines 155 var engines = Zotero.LocateManager.getEngines(); 156 var i = 0; 157 for (let engine of engines) { 158 var treeitem = document.createElement('treeitem'); 159 var treerow = document.createElement('treerow'); 160 var checkboxCell = document.createElement('treecell'); 161 var nameCell = document.createElement('treecell'); 162 var descriptionCell = document.createElement('treecell'); 163 164 treeitem.engine = engine; 165 nameCell.setAttribute('label', engine.name); 166 descriptionCell.setAttribute('label', engine.description); 167 if( !engine.hidden ) { 168 checkboxCell.setAttribute('value', 'true'); 169 } 170 171 treerow.appendChild(checkboxCell); 172 treerow.appendChild(nameCell); 173 treerow.appendChild(descriptionCell); 174 treeitem.appendChild(treerow); 175 treechildren.appendChild(treeitem); 176 177 i++; 178 } 179 180 // restore ranges 181 for (let range of ranges) { 182 if(range[1] <= engines.length-1) { 183 tree.view.selection.rangedSelect(range[0], range[1], true); 184 } 185 } 186 } 187 188 /** 189 * Adds a new Locate Engine to the locate pane 190 **/ 191 /* 192 function addLocateEngine() { 193 // alert(Zotero.LocateManager.activeLocateEngines.join(" || ")); 194 var textbox = document.getElementById('locate-add-textbox'); 195 Zotero.LocateManager.addLocateEngine(textbox.value); 196 197 refreshLocateEnginesList(); 198 } 199 */ 200 201 function toggleLocateEngines() { 202 // get selected engines names 203 var tree = document.getElementById('locateManager'); 204 var treeItems = tree.lastChild.childNodes; 205 var engineNames = []; 206 var start = {}; 207 var end = {}; 208 var nRanges = tree.view.selection.getRangeCount(); 209 var numStatuses = 0; 210 var engineStatusesSum = 0; 211 for(var i=0; i<nRanges; i++) { 212 tree.view.selection.getRangeAt(i, start, end); 213 for(var j=start.value; j<=end.value; j++) { 214 var engineStatus = treeItems[j].engine.hidden ? 0 : 1; 215 numStatuses += 1; 216 engineStatusesSum += engineStatus; 217 } 218 } 219 220 var hidden; 221 switch( engineStatusesSum ) { 222 case 0: 223 // all off, turn all on 224 hidden = false; 225 break; 226 227 case numStatuses: 228 // all on, turn all off 229 hidden = true; 230 break; 231 232 default: 233 // some on, some off. turn all on 234 hidden = false; 235 } 236 237 Zotero.LocateManager.getEngines().forEach(engine => engine.hidden = hidden); 238 239 refreshLocateEnginesList(); 240 } 241 242 /** 243 * Deletes selected Locate Engines from the locate pane 244 **/ 245 function deleteLocateEngine() { 246 // get selected engines names 247 var tree = document.getElementById('locateManager'); 248 var treeItems = tree.lastChild.childNodes; 249 var engineNames = []; 250 var start = {}; 251 var end = {}; 252 var nRanges = tree.view.selection.getRangeCount(); 253 for(var i=0; i<nRanges; i++) { 254 tree.view.selection.getRangeAt(i, start, end); 255 for(var j=start.value; j<=end.value; j++) { 256 Zotero.LocateManager.removeEngine(treeItems[j].engine); 257 } 258 } 259 260 for(var i=0; i<engineNames.length; i++) { 261 Zotero.LocateManager.removeLocateEngine(engineNames[i]); 262 } 263 264 tree.view.selection.clearSelection(); 265 refreshLocateEnginesList(); 266 } 267 268 /** 269 * Restores Default Locate Engines 270 **/ 271 function restoreDefaultLocateEngines() { 272 Zotero.LocateManager.restoreDefaultEngines(); 273 refreshLocateEnginesList(); 274 } 275 276 277 278 ]]> 279 </script> 280 </prefwindow>