This is just some static backup of the original site, don't expect every link to work!

source: content/vI_rdfDataTree.js @ 85fa10

ng_0.9
Last change on this file since 85fa10 was 85fa10, checked in by rene <rene@…>, 4 years ago

removed everything related to smtp-storage

  • Property mode set to 100644
File size: 21.7 KB
Line 
1/* ***** BEGIN LICENSE BLOCK *****
2    This program is free software; you can redistribute it and/or modify
3    it under the terms of the GNU General Public License as published by
4    the Free Software Foundation; either version 2 of the License, or
5    (at your option) any later version.
6
7    This program is distributed in the hope that it will be useful,
8    but WITHOUT ANY WARRANTY; without even the implied warranty of
9    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10    GNU General Public License for more details.
11
12    You should have received a copy of the GNU General Public License
13    along with this program; if not, write to the Free Software
14    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
15
16    The Original Code is the Virtual Identity Extension.
17
18    The Initial Developer of the Original Code is Rene Ejury.
19    Portions created by the Initial Developer are Copyright (C) 2007
20    the Initial Developer. All Rights Reserved.
21
22    Contributor(s):
23 * ***** END LICENSE BLOCK ***** */
24
25/*  Parts of this code taken from
26    http://developer.mozilla.org/en/docs/Sorting_and_filtering_a_custom_tree_view
27    under MIT license
28    http://www.ibiblio.org/pub/Linux/LICENSES/mit.license
29*/
30
31Components.utils.import("resource://v_identity/vI_nameSpaceWrapper.js");
32virtualIdentityExtension.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") {
44        field = "changed"
45      }
46      if (field == "usedCol") {
47        field = "used"
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)
85          topVisibleRow = this.treeElem.treeBoxObject.getFirstVisibleRow();
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 = "";
124        var format = vI.prefroot.getCharPref("extensions.virtualIdentity.storage_timeFormat")
125        if (format != "") {
126          if (used) usedDate = new Date(parseFloat(used)).toLocaleFormat(format);
127          if (changed) changedDate = new Date(parseFloat(changed)).toLocaleFormat(format);
128        } else {
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            idCol: localIdentityData.id.value,
137            usedCol: usedDate,
138            used: used,
139            changedCol: changedDate,
140            changed: changed,
141            //              idKey : localIdentityData.id.key,
142            resource: resource,
143            identityData: localIdentityData
144          }
145          //        Log.debug("addNewDatum.");
146        localIdentityData.extras.addPrefs(pref);
147        idData.push(pref);
148      },
149      sort: function (columnName) {
150        //      Log.debug("sort: " + columnName);
151        var order = this.treeElem.getAttribute("sortDirection") == "ascending" ? 1 : -1;
152        // if the column is passed and it's already sorted by that column, reverse sort
153        if (columnName && (this.treeElem.getAttribute("sortResource") == columnName)) {
154          order *= -1;
155        }
156
157        function columnSort(a, b) {
158          try {
159            if (prepareForComparison(a, columnName) >
160              prepareForComparison(b, columnName)) return 1 * order;
161            if (prepareForComparison(a, columnName) <
162              prepareForComparison(b, columnName)) return -1 * order;
163          } catch (e) {};
164          return 0;
165        }
166
167        if (!columnName)
168          columnName = this.treeElem.getAttribute("sortResource")
169
170        this.idTable.sort(columnSort);
171
172        //setting these will make the sort option persist
173        this.treeElem.setAttribute("sortDirection", order == 1 ? "ascending" : "descending");
174        this.treeElem.setAttribute("sortResource", columnName);
175
176        this.treeElem.view = new rdfDataTreeCollection.treeView(this.idTable);
177
178        //set the appropriate attributes to show to indicator
179        var cols = this.treeElem.getElementsByTagName("treecol");
180        for (var i = 0; i < cols.length; i++) {
181          cols[i].removeAttribute("sortDirection");
182          if (cols[i].id.match(columnName))
183            cols[i].setAttribute("sortDirection", order == 1 ? "ascending" : "descending");
184        }
185      }
186    };
187
188    var rdfDataTreeCollection = {
189      promptService: Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
190        .getService(Components.interfaces.nsIPromptService),
191
192      treeTypes: Array("email", "maillist", "newsgroup", "filter"),
193
194      trees: {},
195      tabbox: null,
196
197      _strings: null,
198      _rdfDatasource: null,
199
200      onTabSelect: function () {
201        rdfDataTreeCollection.hideInfoBox();
202        if (rdfDataTreeCollection.tabbox) {
203          rdfDataTreeCollection.moveConstraints();
204          rdfDataTreeCollection.updateButtonMenu();
205        }
206      },
207
208      onselect: function () {
209        rdfDataTreeCollection.moveConstraints();
210        rdfDataTreeCollection.updateButtonMenu();
211
212        var tree = rdfDataTreeCollection.trees[rdfDataTreeCollection.tabbox.selectedPanel.id];
213        var htmlBox = document.getElementById("rdfDataTreeCollectionInfoBox")
214        if (tree.treeElem.view.selection.count != 1) {
215          rdfDataTreeCollection.hideInfoBox();
216          return;
217        }
218
219        var identityData = tree.idTable[tree.treeElem.currentIndex]["identityData"];
220        var _identityInfo =
221          "<div id='recipientLabel'>" +
222          tree.idTable[tree.treeElem.currentIndex]["recipientCol"].replace(/>/g, "&gt;").replace(/</g, "&lt;") +
223          "</div><div id='vICard'>" +
224          "<table><tr>" +
225          "<td class='image'><img src='chrome://v_identity/skin/vi-info.png' /></td>" +
226          "<td class='identityTable'>" +
227          "<div class='name'>" + identityData.combinedNameHtml + "</div>" +
228          "<table><tbody>" + identityData.getMatrix() + "</tbody></table>" +
229          "</td>" +
230          "</tr></table></div>"
231
232        htmlBox.outputString = _identityInfo;
233        rdfDataTreeCollection.infoBoxHidden = false;
234        htmlBox.setAttribute("style", "height:" + htmlBox.contentDocument.lastChild.scrollHeight + "px");
235        rdfDataTreeCollection.overflow(); // better resize one time too much, mozilla is still magic  :)
236      },
237
238      init: function () {
239        rdfDataTreeCollection.tabbox = document.getElementById("TreeTabbox");
240        rdfDataTreeCollection._strings = Components.classes["@mozilla.org/intl/stringbundle;1"]
241          .getService(Components.interfaces.nsIStringBundleService)
242          .createBundle("chrome://v_identity/locale/vI_rdfDataEditor.properties");
243
244        rdfDataTreeCollection._rdfDatasource = new vI.rdfDatasource(window, "virtualIdentity_0.10.rdf");
245
246        for (var treeType of rdfDataTreeCollection.treeTypes)
247        rdfDataTreeCollection.trees[treeType] = new rdfDataTree(treeType, rdfDataTreeCollection._rdfDatasource);
248      },
249
250      clean: function () {
251        if (rdfDataTreeCollection._rdfDatasource) rdfDataTreeCollection._rdfDatasource.clean();
252      },
253
254      get _texttospeach() {
255        return "true"; // can't get icons drawn in tree - changed behavior of treechildren::-moz-tree-cell
256        //return vI.prefroot.getCharPref("accessibility.usetexttospeech");
257      },
258
259      // generic custom tree view stuff
260      treeView: function (table) {
261        this.rowCount = table.length;
262        this.getCellText = function (row, col) {
263          var retValue = table[row][col.id.substr(0, col.id.indexOf("_"))];
264          if (!rdfDataTreeCollection._texttospeach && (retValue == "no" || retValue == "yes"))
265            return ""; // image will be used as indicator
266          else return retValue;
267        };
268        this.getCellValue = function (row, col) {
269          return this.getCellText(row, col);
270        };
271        this.setTree = function (treebox) {
272          this.treebox = treebox;
273        };
274        this.isEditable = function (row, col) {
275          return col.editable;
276        };
277        this.isContainer = function (row) {
278          return false;
279        };
280        this.isSeparator = function (row) {
281          return false;
282        };
283        this.isSorted = function () {
284          return false;
285        };
286        this.getLevel = function (row) {
287          return 0;
288        };
289        this.getImageSrc = function (row, col) {
290          return null;
291        };
292        this.getRowProperties = function (row, props) {};
293        this.getCellProperties = function (row, col, props) {};
294        this.getColumnProperties = function (colid, col, props) {};
295        this.cycleHeader = function (col, elem) {
296          var treeType = rdfDataTreeCollection.tabbox.selectedPanel.id;
297          if (treeType != "filter")
298            rdfDataTreeCollection.trees[treeType].sort(col.id.substr(0, col.id.indexOf("_")));
299        };
300      },
301
302      __setFilter: function (text) {
303        // loop trough all trees
304        for (var treeType of rdfDataTreeCollection.treeTypes) {
305          var tree = rdfDataTreeCollection.trees[treeType];
306          tree.filterText = text;
307          tree.loadTable();
308        }
309      },
310
311      inputFilter: function (event) {
312        var value = "";
313        if (typeof event.target.value == "string") {
314          value = event.target.value.toLowerCase().replace(/\"/g, "");
315        }
316        rdfDataTreeCollection.__setFilter(value);
317        document.getElementById("clearFilter").disabled = value.length == 0;
318      },
319
320      clearFilter: function () {
321        document.getElementById("clearFilter").disabled = true;
322        var filterElement = document.getElementById("filter");
323        filterElement.focus();
324        filterElement.value = "";
325        rdfDataTreeCollection.__setFilter("");
326      },
327
328      __updateMenu: function (modifySelected, removeSelected) {
329        var tree = rdfDataTreeCollection.trees[rdfDataTreeCollection.tabbox.selectedPanel.id];
330        var noSelections = (tree.treeElem.view.selection.count == 0)
331        modifySelected.setAttribute("disabled", noSelections)
332        removeSelected.setAttribute("disabled", noSelections)
333      },
334
335      updateButtonMenu: function () {
336        rdfDataTreeCollection.__updateMenu(
337          document.getElementById("editButton_" + rdfDataTreeCollection.tabbox.selectedPanel.id),
338          document.getElementById("deleteButton_" + rdfDataTreeCollection.tabbox.selectedPanel.id))
339      },
340
341      updateContextMenu: function () {
342        rdfDataTreeCollection.__updateMenu(
343          document.getElementById("context_modifySelected"),
344          document.getElementById("context_removeSelected"))
345      },
346
347      updateMenu: function () {
348        rdfDataTreeCollection.__updateMenu(
349          document.getElementById("menu_modifySelected"),
350          document.getElementById("menu_removeSelected"))
351      },
352
353      modifySelected: function () {
354        var treeType = rdfDataTreeCollection.tabbox.selectedPanel.id;
355        var tree = rdfDataTreeCollection.trees[treeType];
356        if (tree.treeElem.view.selection.count == 0) return;
357        if (tree.treeElem.view.selection.count > 5) {
358          var warning = rdfDataTreeCollection._strings.GetStringFromName("vI_rdfDataTree.modify.Warning1") + " " +
359            tree.treeElem.view.selection.count + " " +
360            rdfDataTreeCollection._strings.GetStringFromName("vI_rdfDataTree.modify.Warning2")
361          if (!rdfDataTreeCollection.promptService.confirm(window, "Warning", warning)) return;
362        }
363
364        var start = new Object();
365        var end = new Object();
366        var numRanges = tree.treeElem.view.selection.getRangeCount();
367
368        var retVar = {
369          treeType: null
370        };
371        for (var t = 0; t < numRanges; t++) {
372          tree.treeElem.view.selection.getRangeAt(t, start, end);
373          for (var v = start.value; v <= end.value; v++)
374            window.openDialog("chrome://v_identity/content/vI_rdfDataEditor.xul", 0,
375              "chrome, dialog, modal, alwaysRaised, resizable=yes",
376              tree.idTable[v], treeType,
377              rdfDataTreeCollection._rdfDatasource, retVar).focus();
378        }
379
380        // reload all trees (multiple types might have changed)
381        for (var treeType of rdfDataTreeCollection.treeTypes) {
382          rdfDataTreeCollection.trees[treeType].idData = null;
383          rdfDataTreeCollection.trees[treeType].loadTable()
384        }
385        rdfDataTreeCollection.tabbox.selectedTab = document.getElementById(retVar.treeType + "Tab");
386        rdfDataTreeCollection.hideInfoBox();
387      },
388
389      removeSelected: function () {
390        var treeType = rdfDataTreeCollection.tabbox.selectedPanel.id;
391        var tree = rdfDataTreeCollection.trees[treeType];
392        if (tree.treeElem.view.selection.count == 0) return;
393        var warning = rdfDataTreeCollection._strings.GetStringFromName("vI_rdfDataTree.remove.Warning1") + " " +
394          tree.treeElem.view.selection.count + " " +
395          rdfDataTreeCollection._strings.GetStringFromName("vI_rdfDataTree.remove.Warning2")
396
397        if (!rdfDataTreeCollection.promptService.confirm(window, "Warning", warning)) return;
398
399        var start = new Object();
400        var end = new Object();
401        var numRanges = tree.treeElem.view.selection.getRangeCount();
402
403        for (var t = 0; t < numRanges; t++) {
404          tree.treeElem.view.selection.getRangeAt(t, start, end);
405          for (var v = start.value; v <= end.value; v++) {
406            rdfDataTreeCollection._rdfDatasource.removeVIdentityFromRDF(tree.idTable[v]["resource"], treeType)
407          }
408        }
409
410        tree.idData = null;
411        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();
426        var end = new Object();
427        var numRanges = tree.treeElem.view.selection.getRangeCount();
428        if (numRanges > 1) {
429          document.getElementById("reorderUpButton_filter").setAttribute("disabled", "true");
430          document.getElementById("reorderDownButton_filter").setAttribute("disabled", "true");
431          return;
432        }
433        tree.treeElem.view.selection.getRangeAt(0, start, end);
434        if (start.value > 0)
435          document.getElementById("reorderUpButton_filter").removeAttribute("disabled");
436        else document.getElementById("reorderUpButton_filter").setAttribute("disabled", "true");
437        if (end.value < tree.idTable.length - 1)
438          document.getElementById("reorderDownButton_filter").removeAttribute("disabled");
439        else document.getElementById("reorderDownButton_filter").setAttribute("disabled", "true");
440      },
441
442      moveUpSelected: function () {
443        var treeType = rdfDataTreeCollection.tabbox.selectedPanel.id;
444        if (treeType != "filter") return; // just to be safe, button should be disabled
445        var tree = rdfDataTreeCollection.trees[treeType];
446        if (tree.treeElem.view.selection.count == 0) return; // just to be safe, button should be disabled
447
448        var start = new Object();
449        var end = new Object();
450        var numRanges = tree.treeElem.view.selection.getRangeCount();
451        if (numRanges > 1) return; // just to be safe, button should be disabled
452
453        tree.treeElem.view.selection.getRangeAt(0, start, end);
454        for (var v = start.value; v <= end.value; v++) {
455          var resource = rdfDataTreeCollection._rdfDatasource.filterContainer.RemoveElementAt(v + 1, true);
456          rdfDataTreeCollection._rdfDatasource.filterContainer.InsertElementAt(resource, v, true);
457        }
458        tree.idData = null;
459        tree.idTable = null;
460        tree.loadTable();
461        tree.treeElem.view.selection.rangedSelect(start.value - 1, end.value - 1, false);
462      },
463
464      moveDownSelected: function () {
465        var treeType = rdfDataTreeCollection.tabbox.selectedPanel.id;
466        if (treeType != "filter") return; // just to be safe, button should be disabled
467        var tree = rdfDataTreeCollection.trees[treeType];
468        if (tree.treeElem.view.selection.count == 0) return; // just to be safe, button should be disabled
469
470        var start = new Object();
471        var end = new Object();
472        var numRanges = tree.treeElem.view.selection.getRangeCount();
473        if (numRanges > 1) return; // just to be safe, button should be disabled
474
475        tree.treeElem.view.selection.getRangeAt(0, start, end);
476        for (var v = end.value; v >= start.value; v--) {
477          var resource = rdfDataTreeCollection._rdfDatasource.filterContainer.RemoveElementAt(v + 1, true);
478          rdfDataTreeCollection._rdfDatasource.filterContainer.InsertElementAt(resource, v + 2, true);
479        }
480        tree.idData = null;
481        tree.idTable = null;
482        tree.loadTable();
483        tree.treeElem.view.selection.rangedSelect(start.value + 1, end.value + 1, false);
484      },
485
486      infoBoxHidden: true,
487      overflow: function () {
488        if (rdfDataTreeCollection.infoBoxHidden) return;
489        var htmlBox = document.getElementById("rdfDataTreeCollectionInfoBox")
490        htmlBox.setAttribute("style", "height:" + htmlBox.contentDocument.lastChild.scrollHeight + "px");
491      },
492
493      hideInfoBox: function () {
494        rdfDataTreeCollection.infoBoxHidden = true;
495        document.getElementById("rdfDataTreeCollectionInfoBox").setAttribute("style", "height:0px");
496        for (var treeType of rdfDataTreeCollection.treeTypes) {
497          try {
498            if (rdfDataTreeCollection.trees[treeType])
499              rdfDataTreeCollection.trees[treeType].treeElem.view.selection.selectNone()
500          } catch (e) {}
501        }
502      },
503
504      selectAll: function () {
505        var treeType = rdfDataTreeCollection.tabbox.selectedPanel.id;
506        var tree = rdfDataTreeCollection.trees[treeType];
507        tree.treeElem.view.selection.selectAll();
508      },
509
510      newItem: function () {
511        var treeType = rdfDataTreeCollection.tabbox.selectedPanel.id;
512        var newItemPreset = {
513          identityData: new vI.identityData(window, "", null, null, null, null)
514        };
515        var retVar = {
516          treeType: null
517        };
518
519        window.openDialog("chrome://v_identity/content/vI_rdfDataEditor.xul", 0,
520          "chrome, dialog, modal, alwaysRaised, resizable=yes",
521          newItemPreset, treeType,
522          rdfDataTreeCollection._rdfDatasource, retVar).focus();
523
524        // reload all trees (multiple types might have changed)
525        for (var treeType of rdfDataTreeCollection.treeTypes) {
526          rdfDataTreeCollection.trees[treeType].idData = null;
527          rdfDataTreeCollection.trees[treeType].idTable = null;
528          rdfDataTreeCollection.trees[treeType].loadTable()
529        }
530        rdfDataTreeCollection.tabbox.selectedTab = document.getElementById(retVar.treeType + "Tab");
531        rdfDataTreeCollection.hideInfoBox();
532      }
533    };
534
535    vI.rdfDataTreeCollection = rdfDataTreeCollection;
536    vI.rdfDataTree = rdfDataTree;
537  }
538});
Note: See TracBrowser for help on using the repository browser.