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

source: chrome/content/v_identity/vI_rdfDataTree.js @ 94d32f

ng_0.8ng_0.9
Last change on this file since 94d32f was 94d32f, checked in by rene <rene@…>, 11 years ago

bugfix, lost 'vI_' in last changes

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