Changeset 509348 for content/vI_rdfDataTree.js
- Timestamp:
- Nov 3, 2014, 12:35:40 PM (8 years ago)
- Branches:
- ng_0.9
- Children:
- 7204cb
- Parents:
- 3c9c29
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
content/vI_rdfDataTree.js
r3c9c29 r509348 30 30 31 31 Components.utils.import("resource://v_identity/vI_nameSpaceWrapper.js"); 32 virtualIdentityExtension.ns(function() { with (virtualIdentityExtension.LIB) { 33 34 let Log = vI.setupLogging("virtualIdentity.rdfDataTree"); 35 36 Components.utils.import("resource://v_identity/vI_identityData.js", virtualIdentityExtension); 37 Components.utils.import("resource://v_identity/vI_rdfDatasource.js", virtualIdentityExtension); 38 Components.utils.import("resource://v_identity/vI_prefs.js", virtualIdentityExtension); 39 40 //prepares an object for easy comparison against another. for strings, lowercases them 41 var prepareForComparison = function(element, field) { 42 if (field == "changedCol") { 32 virtualIdentityExtension.ns(function () { 33 with(virtualIdentityExtension.LIB) { 34 35 let Log = vI.setupLogging("virtualIdentity.rdfDataTree"); 36 37 Components.utils.import("resource://v_identity/vI_identityData.js", virtualIdentityExtension); 38 Components.utils.import("resource://v_identity/vI_rdfDatasource.js", virtualIdentityExtension); 39 Components.utils.import("resource://v_identity/vI_prefs.js", virtualIdentityExtension); 40 41 //prepares an object for easy comparison against another. for strings, lowercases them 42 var prepareForComparison = function (element, field) { 43 if (field == "changedCol") { 43 44 field = "changed" 44 }45 if (field == "usedCol") {45 } 46 if (field == "usedCol") { 46 47 field = "used" 47 } 48 var o = element[field]; 49 if (typeof o == "string") { return o.toLowerCase().replace(/\"/g,""); } 50 return ""; 51 }; 52 53 54 var rdfDataTree = function(treeType, rdfDatasource) { 55 this.treeType = treeType; 56 this._rdfDatasource = rdfDatasource; 57 this.filterText = ""; 58 this.loadTable(); 59 }; 60 61 rdfDataTree.prototype = { 62 idTable : null, 63 idData : null, 64 filterText : null, 65 treeType : null, 66 _rdfDatasource : null, 67 68 get treeElem() { return document.getElementById("rdfDataTree_" + this.treeType); }, 69 get tabElem() { return document.getElementById(this.treeType + "Tab"); }, 70 71 //this function is called every time the tree is sorted, filtered, or reloaded 72 loadTable : function() { 73 // Log.debug("loadTable."); 74 //remember scroll position. this is useful if this is an editable table 75 //to prevent the user from losing the row they edited 76 var topVisibleRow = null; 77 if (this.idTable) 48 } 49 var o = element[field]; 50 if (typeof o == "string") { 51 return o.toLowerCase().replace(/\"/g, ""); 52 } 53 return ""; 54 }; 55 56 57 var rdfDataTree = function (treeType, rdfDatasource) { 58 this.treeType = treeType; 59 this._rdfDatasource = rdfDatasource; 60 this.filterText = ""; 61 this.loadTable(); 62 }; 63 64 rdfDataTree.prototype = { 65 idTable: null, 66 idData: null, 67 filterText: null, 68 treeType: null, 69 _rdfDatasource: null, 70 71 get treeElem() { 72 return document.getElementById("rdfDataTree_" + this.treeType); 73 }, 74 get tabElem() { 75 return document.getElementById(this.treeType + "Tab"); 76 }, 77 78 //this function is called every time the tree is sorted, filtered, or reloaded 79 loadTable: function () { 80 // Log.debug("loadTable."); 81 //remember scroll position. this is useful if this is an editable table 82 //to prevent the user from losing the row they edited 83 var topVisibleRow = null; 84 if (this.idTable) 78 85 topVisibleRow = this.treeElem.treeBoxObject.getFirstVisibleRow(); 79 if (this.idData == null) { 80 this.idData = []; 81 this._rdfDatasource.readAllEntriesFromRDF(this.addNewDatum, this.treeType, this.idData); 82 } 83 if (this.filterText == "") { 84 //show all of them 85 this.idTable = this.idData; 86 } else { 87 //filter out the ones we want to display 88 var curTable = []; 89 var curFilterText = this.filterText; 90 this.idData.forEach(function(element) { 91 //we'll match on every property 92 for (var i in element) { 93 if (prepareForComparison(element, i).indexOf(curFilterText) != -1) { 94 curTable.push(element); 95 break; 96 } 97 } 98 }); 99 this.idTable = curTable; 100 } 101 102 this.sort(); 103 104 //restore scroll position 105 if (topVisibleRow && topVisibleRow <= this.idTable.length) { 106 this.treeElem.treeBoxObject.scrollToRow(topVisibleRow); 107 } 108 109 // set Tab label 110 this.tabElem.setAttribute("label", this.treeType + " (" + this.idTable.length + ")"); 111 // Log.debug("loadTable done."); 112 }, 113 114 addNewDatum : function(resource, name, localIdentityData, idData, used, changed) { 115 var usedDate = "", changedDate = ""; 86 if (this.idData == null) { 87 this.idData = []; 88 this._rdfDatasource.readAllEntriesFromRDF(this.addNewDatum, this.treeType, this.idData); 89 } 90 if (this.filterText == "") { 91 //show all of them 92 this.idTable = this.idData; 93 } else { 94 //filter out the ones we want to display 95 var curTable = []; 96 var curFilterText = this.filterText; 97 this.idData.forEach(function (element) { 98 //we'll match on every property 99 for (var i in element) { 100 if (prepareForComparison(element, i).indexOf(curFilterText) != -1) { 101 curTable.push(element); 102 break; 103 } 104 } 105 }); 106 this.idTable = curTable; 107 } 108 109 this.sort(); 110 111 //restore scroll position 112 if (topVisibleRow && topVisibleRow <= this.idTable.length) { 113 this.treeElem.treeBoxObject.scrollToRow(topVisibleRow); 114 } 115 116 // set Tab label 117 this.tabElem.setAttribute("label", this.treeType + " (" + this.idTable.length + ")"); 118 // Log.debug("loadTable done."); 119 }, 120 121 addNewDatum: function (resource, name, localIdentityData, idData, used, changed) { 122 var usedDate = "", 123 changedDate = ""; 116 124 var format = vI.prefroot.getCharPref("extensions.virtualIdentity.storage_timeFormat") 117 125 if (format != "") { 118 119 126 if (used) usedDate = new Date(parseFloat(used)).toLocaleFormat(format); 127 if (changed) changedDate = new Date(parseFloat(changed)).toLocaleFormat(format); 120 128 } else { 121 if (used) usedDate = new Date(parseFloat(used)).toLocaleString(); 122 if (changed) changedDate = new Date(parseFloat(changed)).toLocaleString(); 123 } 124 var pref = { recipientCol : name, 125 indexCol : idData.length + 1 + ".", 126 senderCol : localIdentityData.combinedName, 127 smtpCol : localIdentityData.smtp.value, 128 // smtpKey : localIdentityData.smtp.key, 129 idCol : localIdentityData.id.value, 130 usedCol : usedDate, 131 used : used, 132 changedCol : changedDate, 133 changed : changed, 134 // idKey : localIdentityData.id.key, 135 resource : resource, 136 identityData : localIdentityData} 137 // Log.debug("addNewDatum."); 138 localIdentityData.extras.addPrefs(pref); 139 idData.push(pref); 140 }, 141 sort : function(columnName) { 142 // Log.debug("sort: " + columnName); 143 var order = this.treeElem.getAttribute("sortDirection") == "ascending" ? 1 : -1; 144 // if the column is passed and it's already sorted by that column, reverse sort 145 if (columnName && (this.treeElem.getAttribute("sortResource") == columnName)) { 146 order *= -1; 147 } 148 149 function columnSort(a, b) { 129 if (used) usedDate = new Date(parseFloat(used)).toLocaleString(); 130 if (changed) changedDate = new Date(parseFloat(changed)).toLocaleString(); 131 } 132 var pref = { 133 recipientCol: name, 134 indexCol: idData.length + 1 + ".", 135 senderCol: localIdentityData.combinedName, 136 smtpCol: localIdentityData.smtp.value, 137 // smtpKey : localIdentityData.smtp.key, 138 idCol: localIdentityData.id.value, 139 usedCol: usedDate, 140 used: used, 141 changedCol: changedDate, 142 changed: changed, 143 // idKey : localIdentityData.id.key, 144 resource: resource, 145 identityData: localIdentityData 146 } 147 // Log.debug("addNewDatum."); 148 localIdentityData.extras.addPrefs(pref); 149 idData.push(pref); 150 }, 151 sort: function (columnName) { 152 // Log.debug("sort: " + columnName); 153 var order = this.treeElem.getAttribute("sortDirection") == "ascending" ? 1 : -1; 154 // if the column is passed and it's already sorted by that column, reverse sort 155 if (columnName && (this.treeElem.getAttribute("sortResource") == columnName)) { 156 order *= -1; 157 } 158 159 function columnSort(a, b) { 150 160 try { 151 if (prepareForComparison(a, columnName) > 152 153 if (prepareForComparison(a, columnName) < 154 155 } catch (e) {};156 157 158 159 161 if (prepareForComparison(a, columnName) > 162 prepareForComparison(b, columnName)) return 1 * order; 163 if (prepareForComparison(a, columnName) < 164 prepareForComparison(b, columnName)) return -1 * order; 165 } catch (e) {}; 166 return 0; 167 } 168 169 if (!columnName) 160 170 columnName = this.treeElem.getAttribute("sortResource") 161 171 162 172 this.idTable.sort(columnSort); 163 164 //setting these will make the sort option persist 165 this.treeElem.setAttribute("sortDirection", order == 1 ? "ascending" : "descending"); 166 this.treeElem.setAttribute("sortResource", columnName); 167 168 this.treeElem.view = new rdfDataTreeCollection.treeView(this.idTable); 169 170 //set the appropriate attributes to show to indicator 171 var cols = this.treeElem.getElementsByTagName("treecol"); 172 for (var i = 0; i < cols.length; i++) { 173 cols[i].removeAttribute("sortDirection"); 174 if (cols[i].id.match(columnName)) 175 cols[i].setAttribute("sortDirection", order == 1 ? "ascending" : "descending"); 176 } 177 } 178 }; 179 180 var rdfDataTreeCollection = { 181 promptService : Components.classes["@mozilla.org/embedcomp/prompt-service;1"] 182 .getService(Components.interfaces.nsIPromptService), 183 184 treeTypes : Array("email", "maillist", "newsgroup", "filter"), 185 186 trees : {}, 187 tabbox : null, 188 189 _strings : null, 190 _rdfDatasource : null, 191 192 onTabSelect : function () { 193 rdfDataTreeCollection.hideInfoBox(); 194 if (rdfDataTreeCollection.tabbox) { 195 rdfDataTreeCollection.moveConstraints(); 196 rdfDataTreeCollection.updateButtonMenu(); 197 } 198 }, 199 200 onselect : function () { 201 rdfDataTreeCollection.moveConstraints(); 202 rdfDataTreeCollection.updateButtonMenu(); 203 204 var tree = rdfDataTreeCollection.trees[rdfDataTreeCollection.tabbox.selectedPanel.id]; 205 var htmlBox = document.getElementById("rdfDataTreeCollectionInfoBox") 206 if (tree.treeElem.view.selection.count != 1) 207 { rdfDataTreeCollection.hideInfoBox(); return; } 208 209 var identityData = tree.idTable[tree.treeElem.currentIndex]["identityData"]; 210 var _identityInfo = 211 "<div id='recipientLabel'>" + 212 tree.idTable[tree.treeElem.currentIndex]["recipientCol"].replace(/>/g,">").replace(/</g,"<") + 213 "</div><div id='vICard'>" + 214 "<table><tr>" + 215 "<td class='image'><img src='chrome://v_identity/skin/vi-info.png' /></td>" + 216 "<td class='identityTable'>" + 217 "<div class='name'>" + identityData.combinedNameHtml + "</div>" + 218 "<table><tbody>" + identityData.getMatrix() + "</tbody></table>" + 219 "</td>" + 220 "</tr></table></div>" 221 222 htmlBox.outputString = _identityInfo; 223 rdfDataTreeCollection.infoBoxHidden = false; 224 htmlBox.setAttribute("style", "height:" + htmlBox.contentDocument.lastChild.scrollHeight +"px"); 225 rdfDataTreeCollection.overflow(); // better resize one time too much, mozilla is still magic :) 226 }, 227 228 init : function() { 229 rdfDataTreeCollection.tabbox = document.getElementById("TreeTabbox"); 230 rdfDataTreeCollection._strings = Components.classes["@mozilla.org/intl/stringbundle;1"] 173 174 //setting these will make the sort option persist 175 this.treeElem.setAttribute("sortDirection", order == 1 ? "ascending" : "descending"); 176 this.treeElem.setAttribute("sortResource", columnName); 177 178 this.treeElem.view = new rdfDataTreeCollection.treeView(this.idTable); 179 180 //set the appropriate attributes to show to indicator 181 var cols = this.treeElem.getElementsByTagName("treecol"); 182 for (var i = 0; i < cols.length; i++) { 183 cols[i].removeAttribute("sortDirection"); 184 if (cols[i].id.match(columnName)) 185 cols[i].setAttribute("sortDirection", order == 1 ? "ascending" : "descending"); 186 } 187 } 188 }; 189 190 var rdfDataTreeCollection = { 191 promptService: Components.classes["@mozilla.org/embedcomp/prompt-service;1"] 192 .getService(Components.interfaces.nsIPromptService), 193 194 treeTypes: Array("email", "maillist", "newsgroup", "filter"), 195 196 trees: {}, 197 tabbox: null, 198 199 _strings: null, 200 _rdfDatasource: null, 201 202 onTabSelect: function () { 203 rdfDataTreeCollection.hideInfoBox(); 204 if (rdfDataTreeCollection.tabbox) { 205 rdfDataTreeCollection.moveConstraints(); 206 rdfDataTreeCollection.updateButtonMenu(); 207 } 208 }, 209 210 onselect: function () { 211 rdfDataTreeCollection.moveConstraints(); 212 rdfDataTreeCollection.updateButtonMenu(); 213 214 var tree = rdfDataTreeCollection.trees[rdfDataTreeCollection.tabbox.selectedPanel.id]; 215 var htmlBox = document.getElementById("rdfDataTreeCollectionInfoBox") 216 if (tree.treeElem.view.selection.count != 1) { 217 rdfDataTreeCollection.hideInfoBox(); 218 return; 219 } 220 221 var identityData = tree.idTable[tree.treeElem.currentIndex]["identityData"]; 222 var _identityInfo = 223 "<div id='recipientLabel'>" + 224 tree.idTable[tree.treeElem.currentIndex]["recipientCol"].replace(/>/g, ">").replace(/</g, "<") + 225 "</div><div id='vICard'>" + 226 "<table><tr>" + 227 "<td class='image'><img src='chrome://v_identity/skin/vi-info.png' /></td>" + 228 "<td class='identityTable'>" + 229 "<div class='name'>" + identityData.combinedNameHtml + "</div>" + 230 "<table><tbody>" + identityData.getMatrix() + "</tbody></table>" + 231 "</td>" + 232 "</tr></table></div>" 233 234 htmlBox.outputString = _identityInfo; 235 rdfDataTreeCollection.infoBoxHidden = false; 236 htmlBox.setAttribute("style", "height:" + htmlBox.contentDocument.lastChild.scrollHeight + "px"); 237 rdfDataTreeCollection.overflow(); // better resize one time too much, mozilla is still magic :) 238 }, 239 240 init: function () { 241 rdfDataTreeCollection.tabbox = document.getElementById("TreeTabbox"); 242 rdfDataTreeCollection._strings = Components.classes["@mozilla.org/intl/stringbundle;1"] 231 243 .getService(Components.interfaces.nsIStringBundleService) 232 244 .createBundle("chrome://v_identity/locale/vI_rdfDataEditor.properties"); 233 245 234 235 236 for each(var treeType in rdfDataTreeCollection.treeTypes)237 238 239 240 clean : function() {246 rdfDataTreeCollection._rdfDatasource = new vI.rdfDatasource("virtualIdentity.rdf"); 247 248 for each(var treeType in rdfDataTreeCollection.treeTypes) 249 rdfDataTreeCollection.trees[treeType] = new rdfDataTree(treeType, rdfDataTreeCollection._rdfDatasource); 250 }, 251 252 clean: function () { 241 253 if (rdfDataTreeCollection._rdfDatasource) rdfDataTreeCollection._rdfDatasource.clean(); 242 }, 243 244 get _braille() { 245 var braille = false; 246 try { braille = (vI.prefroot.getCharPref("accessibility.usebrailledisplay") || 247 vI.prefroot.getCharPref("accessibility.usetexttospeech")); } 248 catch (e) { }; 249 return braille; 250 }, 251 252 // generic custom tree view stuff 253 treeView : function (table) { 254 this.rowCount = table.length; 255 this.getCellText = function(row, col) { 256 var retValue = table[row][col.id.substr(0,col.id.indexOf("_"))]; 257 if (!rdfDataTreeCollection._braille && (retValue == "no" || retValue == "yes")) 258 return ""; // image will be used as indicator 259 else return retValue; 260 }; 261 this.getCellValue = function(row, col) { 262 return this.getCellText(row, col); 263 }; 264 this.setTree = function(treebox) { 265 this.treebox = treebox; 266 }; 267 this.isEditable = function(row, col) { 268 return col.editable; 269 }; 270 this.isContainer = function(row){ return false; }; 271 this.isSeparator = function(row){ return false; }; 272 this.isSorted = function(){ return false; }; 273 this.getLevel = function(row){ return 0; }; 274 this.getImageSrc = function(row,col){ return null; }; 275 this.getRowProperties = function(row,props){}; 276 this.getCellProperties = function(row,col,props){}; 277 this.getColumnProperties = function(colid,col,props){}; 278 this.cycleHeader = function(col, elem) { 279 var treeType = rdfDataTreeCollection.tabbox.selectedPanel.id; 280 if (treeType != "filter") 281 rdfDataTreeCollection.trees[treeType].sort(col.id.substr(0,col.id.indexOf("_"))); 282 }; 283 this.getCellProperties = function(row,col,props){ 284 var returnValue = null; 285 if (!rdfDataTreeCollection._braille) { 286 var aserv=Components.classes["@mozilla.org/atom-service;1"]. 287 getService(Components.interfaces.nsIAtomService); 288 if (typeof props == 'undefined') { 289 // Requires Gecko 22 290 switch (table[row][col.id.substr(0,col.id.indexOf("_"))]) { 291 case "yes": returnValue = aserv.getAtom("yes"); break; 292 case "no": returnValue = aserv.getAtom("no"); break; 293 } 294 } else { 295 // Obsolete since Gecko 22 296 switch (table[row][col.id.substr(0,col.id.indexOf("_"))]) { 297 case "yes": props.AppendElement(aserv.getAtom("yes")); break; 298 case "no": props.AppendElement(aserv.getAtom("no")); break; 299 } 300 } 254 }, 255 256 get _braille() { 257 var braille = false; 258 try { 259 braille = (vI.prefroot.getCharPref("accessibility.usebrailledisplay") || 260 vI.prefroot.getCharPref("accessibility.usetexttospeech")); 261 } catch (e) {}; 262 return braille; 263 }, 264 265 // generic custom tree view stuff 266 treeView: function (table) { 267 this.rowCount = table.length; 268 this.getCellText = function (row, col) { 269 var retValue = table[row][col.id.substr(0, col.id.indexOf("_"))]; 270 if (!rdfDataTreeCollection._braille && (retValue == "no" || retValue == "yes")) 271 return ""; // image will be used as indicator 272 else return retValue; 273 }; 274 this.getCellValue = function (row, col) { 275 return this.getCellText(row, col); 276 }; 277 this.setTree = function (treebox) { 278 this.treebox = treebox; 279 }; 280 this.isEditable = function (row, col) { 281 return col.editable; 282 }; 283 this.isContainer = function (row) { 284 return false; 285 }; 286 this.isSeparator = function (row) { 287 return false; 288 }; 289 this.isSorted = function () { 290 return false; 291 }; 292 this.getLevel = function (row) { 293 return 0; 294 }; 295 this.getImageSrc = function (row, col) { 296 return null; 297 }; 298 this.getRowProperties = function (row, props) {}; 299 this.getCellProperties = function (row, col, props) {}; 300 this.getColumnProperties = function (colid, col, props) {}; 301 this.cycleHeader = function (col, elem) { 302 var treeType = rdfDataTreeCollection.tabbox.selectedPanel.id; 303 if (treeType != "filter") 304 rdfDataTreeCollection.trees[treeType].sort(col.id.substr(0, col.id.indexOf("_"))); 305 }; 306 this.getCellProperties = function (row, col, props) { 307 var returnValue = null; 308 if (!rdfDataTreeCollection._braille) { 309 var aserv = Components.classes["@mozilla.org/atom-service;1"]. 310 getService(Components.interfaces.nsIAtomService); 311 if (typeof props == 'undefined') { 312 // Requires Gecko 22 313 switch (table[row][col.id.substr(0, col.id.indexOf("_"))]) { 314 case "yes": 315 returnValue = aserv.getAtom("yes"); 316 break; 317 case "no": 318 returnValue = aserv.getAtom("no"); 319 break; 320 } 321 } else { 322 // Obsolete since Gecko 22 323 switch (table[row][col.id.substr(0, col.id.indexOf("_"))]) { 324 case "yes": 325 props.AppendElement(aserv.getAtom("yes")); 326 break; 327 case "no": 328 props.AppendElement(aserv.getAtom("no")); 329 break; 330 } 301 331 } 302 return returnValue; 303 }; 304 }, 305 306 307 __setFilter : function (text) { 308 // loop trough all trees 309 for each (var treeType in rdfDataTreeCollection.treeTypes) { 310 var tree = rdfDataTreeCollection.trees[treeType]; 311 tree.filterText = text; 312 tree.loadTable(); 313 } 314 }, 315 316 inputFilter : function(event) { 332 } 333 return returnValue; 334 }; 335 }, 336 337 338 __setFilter: function (text) { 339 // loop trough all trees 340 for each(var treeType in rdfDataTreeCollection.treeTypes) { 341 var tree = rdfDataTreeCollection.trees[treeType]; 342 tree.filterText = text; 343 tree.loadTable(); 344 } 345 }, 346 347 inputFilter: function (event) { 317 348 var value = ""; 318 349 if (typeof event.target.value == "string") { 319 value = event.target.value.toLowerCase().replace(/\"/g,""); 320 } 321 rdfDataTreeCollection.__setFilter(value); 322 document.getElementById("clearFilter").disabled = value.length == 0; 323 }, 324 325 clearFilter : function() { 326 document.getElementById("clearFilter").disabled = true; 327 var filterElement = document.getElementById("filter"); 328 filterElement.focus(); 329 filterElement.value = ""; 330 rdfDataTreeCollection.__setFilter(""); 331 }, 332 333 __updateMenu : function(modifySelected, removeSelected) { 334 var tree = rdfDataTreeCollection.trees[rdfDataTreeCollection.tabbox.selectedPanel.id]; 335 var noSelections = (tree.treeElem.view.selection.count == 0) 336 modifySelected.setAttribute("disabled", noSelections) 337 removeSelected.setAttribute("disabled", noSelections) 338 }, 339 340 updateButtonMenu : function() { 341 rdfDataTreeCollection.__updateMenu( 342 document.getElementById("editButton_" + rdfDataTreeCollection.tabbox.selectedPanel.id), 343 document.getElementById("deleteButton_" + rdfDataTreeCollection.tabbox.selectedPanel.id)) 344 }, 345 346 updateContextMenu : function() { 347 rdfDataTreeCollection.__updateMenu( 348 document.getElementById("context_modifySelected"), 349 document.getElementById("context_removeSelected")) 350 }, 351 352 updateMenu : function() { 353 rdfDataTreeCollection.__updateMenu( 354 document.getElementById("menu_modifySelected"), 355 document.getElementById("menu_removeSelected")) 356 }, 357 358 modifySelected : function() { 359 var treeType = rdfDataTreeCollection.tabbox.selectedPanel.id; 360 var tree = rdfDataTreeCollection.trees[treeType]; 361 if (tree.treeElem.view.selection.count == 0) return; 362 if (tree.treeElem.view.selection.count > 5) { 363 var warning = rdfDataTreeCollection._strings.GetStringFromName("vI_rdfDataTree.modify.Warning1") + " " + 364 tree.treeElem.view.selection.count + " " + 365 rdfDataTreeCollection._strings.GetStringFromName("vI_rdfDataTree.modify.Warning2") 366 if (!rdfDataTreeCollection.promptService.confirm(window,"Warning",warning)) return; 367 } 368 369 var start = new Object(); var end = new Object(); 370 var numRanges = tree.treeElem.view.selection.getRangeCount(); 371 372 var retVar = { treeType: null }; 373 for (var t=0; t<numRanges; t++){ 374 tree.treeElem.view.selection.getRangeAt(t,start,end); 375 for (var v=start.value; v<=end.value; v++) 376 window.openDialog("chrome://v_identity/content/vI_rdfDataEditor.xul",0, 377 "chrome, dialog, modal, alwaysRaised, resizable=yes", 378 tree.idTable[v], treeType, 379 rdfDataTreeCollection._rdfDatasource, retVar).focus(); 380 } 381 382 // reload all trees (multiple types might have changed) 383 for each (var treeType in rdfDataTreeCollection.treeTypes) { 384 rdfDataTreeCollection.trees[treeType].idData = null; 385 rdfDataTreeCollection.trees[treeType].loadTable() 386 } 387 rdfDataTreeCollection.tabbox.selectedTab = document.getElementById(retVar.treeType + "Tab"); 388 rdfDataTreeCollection.hideInfoBox(); 389 }, 390 391 removeSelected : function() { 392 var treeType = rdfDataTreeCollection.tabbox.selectedPanel.id; 393 var tree = rdfDataTreeCollection.trees[treeType]; 394 if (tree.treeElem.view.selection.count == 0) return; 395 var warning = rdfDataTreeCollection._strings.GetStringFromName("vI_rdfDataTree.remove.Warning1") + " " + 396 tree.treeElem.view.selection.count + " " + 397 rdfDataTreeCollection._strings.GetStringFromName("vI_rdfDataTree.remove.Warning2") 398 399 if (!rdfDataTreeCollection.promptService.confirm(window,"Warning",warning)) return; 400 401 var start = new Object(); var end = new Object(); 402 var numRanges = tree.treeElem.view.selection.getRangeCount(); 403 404 for (var t=0; t<numRanges; t++){ 405 tree.treeElem.view.selection.getRangeAt(t,start,end); 406 for (var v=start.value; v<=end.value; v++){ 407 rdfDataTreeCollection._rdfDatasource.removeVIdentityFromRDF(tree.idTable[v]["resource"], treeType) 408 } 409 } 410 411 tree.idData = null; tree.idTable = null; 412 tree.loadTable(); 413 rdfDataTreeCollection.hideInfoBox(); 414 }, 415 416 moveConstraints : function() { 417 var treeType = rdfDataTreeCollection.tabbox.selectedPanel.id; 418 if (treeType != "filter") return; 419 var tree = rdfDataTreeCollection.trees[treeType]; 420 if (tree.treeElem.view.selection.count == 0) { 421 document.getElementById("reorderUpButton_filter").setAttribute("disabled","true"); 422 document.getElementById("reorderDownButton_filter").setAttribute("disabled","true"); 423 return; 424 }; 425 var start = new Object(); var end = new Object(); 426 var numRanges = tree.treeElem.view.selection.getRangeCount(); 427 if (numRanges > 1) { 428 document.getElementById("reorderUpButton_filter").setAttribute("disabled","true"); 429 document.getElementById("reorderDownButton_filter").setAttribute("disabled","true"); 430 return; 431 } 432 tree.treeElem.view.selection.getRangeAt(0,start,end); 433 if (start.value > 0) 434 document.getElementById("reorderUpButton_filter").removeAttribute("disabled"); 435 else document.getElementById("reorderUpButton_filter").setAttribute("disabled","true"); 436 if (end.value < tree.idTable.length - 1) 437 document.getElementById("reorderDownButton_filter").removeAttribute("disabled"); 438 else document.getElementById("reorderDownButton_filter").setAttribute("disabled","true"); 439 }, 440 441 moveUpSelected : function() { 442 var treeType = rdfDataTreeCollection.tabbox.selectedPanel.id; 443 if (treeType != "filter") return; // just to be safe, button should be disabled 444 var tree = rdfDataTreeCollection.trees[treeType]; 445 if (tree.treeElem.view.selection.count == 0) return; // just to be safe, button should be disabled 446 447 var start = new Object(); var end = new Object(); 448 var numRanges = tree.treeElem.view.selection.getRangeCount(); 449 if (numRanges > 1) return; // just to be safe, button should be disabled 450 451 tree.treeElem.view.selection.getRangeAt(0,start,end); 452 for (var v=start.value; v<=end.value; v++){ 453 var resource = rdfDataTreeCollection._rdfDatasource.filterContainer.RemoveElementAt(v+1, true); 454 rdfDataTreeCollection._rdfDatasource.filterContainer.InsertElementAt(resource,v,true); 455 } 456 tree.idData = null; tree.idTable = null; 457 tree.loadTable(); 458 tree.treeElem.view.selection.rangedSelect(start.value-1,end.value-1,false); 459 }, 460 461 moveDownSelected : function() { 462 var treeType = rdfDataTreeCollection.tabbox.selectedPanel.id; 463 if (treeType != "filter") return; // just to be safe, button should be disabled 464 var tree = rdfDataTreeCollection.trees[treeType]; 465 if (tree.treeElem.view.selection.count == 0) return; // just to be safe, button should be disabled 466 467 var start = new Object(); var end = new Object(); 468 var numRanges = tree.treeElem.view.selection.getRangeCount(); 469 if (numRanges > 1) return; // just to be safe, button should be disabled 470 471 tree.treeElem.view.selection.getRangeAt(0,start,end); 472 for (var v=end.value; v>=start.value; v--){ 473 var resource = rdfDataTreeCollection._rdfDatasource.filterContainer.RemoveElementAt(v+1, true); 474 rdfDataTreeCollection._rdfDatasource.filterContainer.InsertElementAt(resource,v+2,true); 475 } 476 tree.idData = null; tree.idTable = null; 477 tree.loadTable(); 478 tree.treeElem.view.selection.rangedSelect(start.value+1,end.value+1,false); 479 }, 480 481 infoBoxHidden : true, 482 overflow : function() { 483 if (rdfDataTreeCollection.infoBoxHidden) return; 484 var htmlBox = document.getElementById("rdfDataTreeCollectionInfoBox") 485 htmlBox.setAttribute("style", "height:" + htmlBox.contentDocument.lastChild.scrollHeight +"px"); 486 }, 487 488 hideInfoBox : function() { 489 rdfDataTreeCollection.infoBoxHidden = true; 490 document.getElementById("rdfDataTreeCollectionInfoBox").setAttribute("style", "height:0px"); 491 for each (var treeType in rdfDataTreeCollection.treeTypes) { 492 try { if (rdfDataTreeCollection.trees[treeType]) 493 rdfDataTreeCollection.trees[treeType].treeElem.view.selection.selectNone() } catch (e) { } 494 } 495 }, 496 497 selectAll : function() { 498 var treeType = rdfDataTreeCollection.tabbox.selectedPanel.id; 499 var tree = rdfDataTreeCollection.trees[treeType]; 500 tree.treeElem.view.selection.selectAll(); 501 }, 502 503 newItem : function() { 504 var treeType = rdfDataTreeCollection.tabbox.selectedPanel.id; 505 var newItemPreset = { identityData : new vI.identityData ("", null, null, vI.NO_SMTP_TAG, null, null) }; 506 var retVar = { treeType: null }; 507 508 window.openDialog("chrome://v_identity/content/vI_rdfDataEditor.xul",0, 509 "chrome, dialog, modal, alwaysRaised, resizable=yes", 510 newItemPreset, treeType, 511 rdfDataTreeCollection._rdfDatasource, retVar).focus(); 512 513 // reload all trees (multiple types might have changed) 514 for each (var treeType in rdfDataTreeCollection.treeTypes) { 515 rdfDataTreeCollection.trees[treeType].idData = null; 516 rdfDataTreeCollection.trees[treeType].idTable = null; 517 rdfDataTreeCollection.trees[treeType].loadTable() 518 } 519 rdfDataTreeCollection.tabbox.selectedTab = document.getElementById(retVar.treeType + "Tab"); 520 rdfDataTreeCollection.hideInfoBox(); 521 } 522 }; 523 524 vI.rdfDataTreeCollection = rdfDataTreeCollection; 525 vI.rdfDataTree = rdfDataTree; 526 }}); 350 value = event.target.value.toLowerCase().replace(/\"/g, ""); 351 } 352 rdfDataTreeCollection.__setFilter(value); 353 document.getElementById("clearFilter").disabled = value.length == 0; 354 }, 355 356 clearFilter: function () { 357 document.getElementById("clearFilter").disabled = true; 358 var filterElement = document.getElementById("filter"); 359 filterElement.focus(); 360 filterElement.value = ""; 361 rdfDataTreeCollection.__setFilter(""); 362 }, 363 364 __updateMenu: function (modifySelected, removeSelected) { 365 var tree = rdfDataTreeCollection.trees[rdfDataTreeCollection.tabbox.selectedPanel.id]; 366 var noSelections = (tree.treeElem.view.selection.count == 0) 367 modifySelected.setAttribute("disabled", noSelections) 368 removeSelected.setAttribute("disabled", noSelections) 369 }, 370 371 updateButtonMenu: function () { 372 rdfDataTreeCollection.__updateMenu( 373 document.getElementById("editButton_" + rdfDataTreeCollection.tabbox.selectedPanel.id), 374 document.getElementById("deleteButton_" + rdfDataTreeCollection.tabbox.selectedPanel.id)) 375 }, 376 377 updateContextMenu: function () { 378 rdfDataTreeCollection.__updateMenu( 379 document.getElementById("context_modifySelected"), 380 document.getElementById("context_removeSelected")) 381 }, 382 383 updateMenu: function () { 384 rdfDataTreeCollection.__updateMenu( 385 document.getElementById("menu_modifySelected"), 386 document.getElementById("menu_removeSelected")) 387 }, 388 389 modifySelected: function () { 390 var treeType = rdfDataTreeCollection.tabbox.selectedPanel.id; 391 var tree = rdfDataTreeCollection.trees[treeType]; 392 if (tree.treeElem.view.selection.count == 0) return; 393 if (tree.treeElem.view.selection.count > 5) { 394 var warning = rdfDataTreeCollection._strings.GetStringFromName("vI_rdfDataTree.modify.Warning1") + " " + 395 tree.treeElem.view.selection.count + " " + 396 rdfDataTreeCollection._strings.GetStringFromName("vI_rdfDataTree.modify.Warning2") 397 if (!rdfDataTreeCollection.promptService.confirm(window, "Warning", warning)) return; 398 } 399 400 var start = new Object(); 401 var end = new Object(); 402 var numRanges = tree.treeElem.view.selection.getRangeCount(); 403 404 var retVar = { 405 treeType: null 406 }; 407 for (var t = 0; t < numRanges; t++) { 408 tree.treeElem.view.selection.getRangeAt(t, start, end); 409 for (var v = start.value; v <= end.value; v++) 410 window.openDialog("chrome://v_identity/content/vI_rdfDataEditor.xul", 0, 411 "chrome, dialog, modal, alwaysRaised, resizable=yes", 412 tree.idTable[v], treeType, 413 rdfDataTreeCollection._rdfDatasource, retVar).focus(); 414 } 415 416 // reload all trees (multiple types might have changed) 417 for each(var treeType in rdfDataTreeCollection.treeTypes) { 418 rdfDataTreeCollection.trees[treeType].idData = null; 419 rdfDataTreeCollection.trees[treeType].loadTable() 420 } 421 rdfDataTreeCollection.tabbox.selectedTab = document.getElementById(retVar.treeType + "Tab"); 422 rdfDataTreeCollection.hideInfoBox(); 423 }, 424 425 removeSelected: function () { 426 var treeType = rdfDataTreeCollection.tabbox.selectedPanel.id; 427 var tree = rdfDataTreeCollection.trees[treeType]; 428 if (tree.treeElem.view.selection.count == 0) return; 429 var warning = rdfDataTreeCollection._strings.GetStringFromName("vI_rdfDataTree.remove.Warning1") + " " + 430 tree.treeElem.view.selection.count + " " + 431 rdfDataTreeCollection._strings.GetStringFromName("vI_rdfDataTree.remove.Warning2") 432 433 if (!rdfDataTreeCollection.promptService.confirm(window, "Warning", warning)) return; 434 435 var start = new Object(); 436 var end = new Object(); 437 var numRanges = tree.treeElem.view.selection.getRangeCount(); 438 439 for (var t = 0; t < numRanges; t++) { 440 tree.treeElem.view.selection.getRangeAt(t, start, end); 441 for (var v = start.value; v <= end.value; v++) { 442 rdfDataTreeCollection._rdfDatasource.removeVIdentityFromRDF(tree.idTable[v]["resource"], treeType) 443 } 444 } 445 446 tree.idData = null; 447 tree.idTable = null; 448 tree.loadTable(); 449 rdfDataTreeCollection.hideInfoBox(); 450 }, 451 452 moveConstraints: function () { 453 var treeType = rdfDataTreeCollection.tabbox.selectedPanel.id; 454 if (treeType != "filter") return; 455 var tree = rdfDataTreeCollection.trees[treeType]; 456 if (tree.treeElem.view.selection.count == 0) { 457 document.getElementById("reorderUpButton_filter").setAttribute("disabled", "true"); 458 document.getElementById("reorderDownButton_filter").setAttribute("disabled", "true"); 459 return; 460 }; 461 var start = new Object(); 462 var end = new Object(); 463 var numRanges = tree.treeElem.view.selection.getRangeCount(); 464 if (numRanges > 1) { 465 document.getElementById("reorderUpButton_filter").setAttribute("disabled", "true"); 466 document.getElementById("reorderDownButton_filter").setAttribute("disabled", "true"); 467 return; 468 } 469 tree.treeElem.view.selection.getRangeAt(0, start, end); 470 if (start.value > 0) 471 document.getElementById("reorderUpButton_filter").removeAttribute("disabled"); 472 else document.getElementById("reorderUpButton_filter").setAttribute("disabled", "true"); 473 if (end.value < tree.idTable.length - 1) 474 document.getElementById("reorderDownButton_filter").removeAttribute("disabled"); 475 else document.getElementById("reorderDownButton_filter").setAttribute("disabled", "true"); 476 }, 477 478 moveUpSelected: function () { 479 var treeType = rdfDataTreeCollection.tabbox.selectedPanel.id; 480 if (treeType != "filter") return; // just to be safe, button should be disabled 481 var tree = rdfDataTreeCollection.trees[treeType]; 482 if (tree.treeElem.view.selection.count == 0) return; // just to be safe, button should be disabled 483 484 var start = new Object(); 485 var end = new Object(); 486 var numRanges = tree.treeElem.view.selection.getRangeCount(); 487 if (numRanges > 1) return; // just to be safe, button should be disabled 488 489 tree.treeElem.view.selection.getRangeAt(0, start, end); 490 for (var v = start.value; v <= end.value; v++) { 491 var resource = rdfDataTreeCollection._rdfDatasource.filterContainer.RemoveElementAt(v + 1, true); 492 rdfDataTreeCollection._rdfDatasource.filterContainer.InsertElementAt(resource, v, true); 493 } 494 tree.idData = null; 495 tree.idTable = null; 496 tree.loadTable(); 497 tree.treeElem.view.selection.rangedSelect(start.value - 1, end.value - 1, false); 498 }, 499 500 moveDownSelected: function () { 501 var treeType = rdfDataTreeCollection.tabbox.selectedPanel.id; 502 if (treeType != "filter") return; // just to be safe, button should be disabled 503 var tree = rdfDataTreeCollection.trees[treeType]; 504 if (tree.treeElem.view.selection.count == 0) return; // just to be safe, button should be disabled 505 506 var start = new Object(); 507 var end = new Object(); 508 var numRanges = tree.treeElem.view.selection.getRangeCount(); 509 if (numRanges > 1) return; // just to be safe, button should be disabled 510 511 tree.treeElem.view.selection.getRangeAt(0, start, end); 512 for (var v = end.value; v >= start.value; v--) { 513 var resource = rdfDataTreeCollection._rdfDatasource.filterContainer.RemoveElementAt(v + 1, true); 514 rdfDataTreeCollection._rdfDatasource.filterContainer.InsertElementAt(resource, v + 2, true); 515 } 516 tree.idData = null; 517 tree.idTable = null; 518 tree.loadTable(); 519 tree.treeElem.view.selection.rangedSelect(start.value + 1, end.value + 1, false); 520 }, 521 522 infoBoxHidden: true, 523 overflow: function () { 524 if (rdfDataTreeCollection.infoBoxHidden) return; 525 var htmlBox = document.getElementById("rdfDataTreeCollectionInfoBox") 526 htmlBox.setAttribute("style", "height:" + htmlBox.contentDocument.lastChild.scrollHeight + "px"); 527 }, 528 529 hideInfoBox: function () { 530 rdfDataTreeCollection.infoBoxHidden = true; 531 document.getElementById("rdfDataTreeCollectionInfoBox").setAttribute("style", "height:0px"); 532 for each(var treeType in rdfDataTreeCollection.treeTypes) { 533 try { 534 if (rdfDataTreeCollection.trees[treeType]) 535 rdfDataTreeCollection.trees[treeType].treeElem.view.selection.selectNone() 536 } catch (e) {} 537 } 538 }, 539 540 selectAll: function () { 541 var treeType = rdfDataTreeCollection.tabbox.selectedPanel.id; 542 var tree = rdfDataTreeCollection.trees[treeType]; 543 tree.treeElem.view.selection.selectAll(); 544 }, 545 546 newItem: function () { 547 var treeType = rdfDataTreeCollection.tabbox.selectedPanel.id; 548 var newItemPreset = { 549 identityData: new vI.identityData("", null, null, vI.NO_SMTP_TAG, null, null) 550 }; 551 var retVar = { 552 treeType: null 553 }; 554 555 window.openDialog("chrome://v_identity/content/vI_rdfDataEditor.xul", 0, 556 "chrome, dialog, modal, alwaysRaised, resizable=yes", 557 newItemPreset, treeType, 558 rdfDataTreeCollection._rdfDatasource, retVar).focus(); 559 560 // reload all trees (multiple types might have changed) 561 for each(var treeType in rdfDataTreeCollection.treeTypes) { 562 rdfDataTreeCollection.trees[treeType].idData = null; 563 rdfDataTreeCollection.trees[treeType].idTable = null; 564 rdfDataTreeCollection.trees[treeType].loadTable() 565 } 566 rdfDataTreeCollection.tabbox.selectedTab = document.getElementById(retVar.treeType + "Tab"); 567 rdfDataTreeCollection.hideInfoBox(); 568 } 569 }; 570 571 vI.rdfDataTreeCollection = rdfDataTreeCollection; 572 vI.rdfDataTree = rdfDataTree; 573 } 574 });
Note: See TracChangeset
for help on using the changeset viewer.