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 @ 919c17

lite_0.1multiEditng_0.6ng_0.6_helpng_0.8ng_0.9
Last change on this file since 919c17 was 919c17, checked in by rene <rene@…>, 14 years ago

repaired filter

  • Property mode set to 100644
File size: 12.1 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
31
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    return "";
36};
37
38
39function rdfDataTree(treeType) {
40    this.treeType = treeType;
41    this.filterText = "";
42    this.loadTable();
43}
44rdfDataTree.prototype = {
45    idTable : null,
46    idData : null,
47    filterText : null,
48    treeType : null,
49
50    get treeElem() { return document.getElementById("rdfDataTree_" + this.treeType); },
51    get tabElem() { return document.getElementById(this.treeType + "Tab"); },
52   
53    //this function is called every time the tree is sorted, filtered, or reloaded
54    loadTable : function() {
55        //remember scroll position. this is useful if this is an editable table
56        //to prevent the user from losing the row they edited
57        var topVisibleRow = null;
58        if (this.idTable) { topVisibleRow = this.treeElem.treeBoxObject.getFirstVisibleRow(); }
59        if (this.idData == null) {
60            this.idData = [];
61            vI_rdfDatasource.readAllEntriesFromRDF(this.addNewDatum, this.treeType, this.idData);
62        }
63        if (this.filterText == "") {
64            //show all of them
65            this.idTable = this.idData;
66        } else {
67            //filter out the ones we want to display
68            var curTable = [];
69            var curFilterText = this.filterText;
70            this.idData.forEach(function(element) {
71                //we'll match on every property
72                for (var i in element) {
73                    if (prepareForComparison(element[i]).indexOf(curFilterText) != -1) {
74                        curTable.push(element);
75                        break;
76                    }
77                }
78            });
79            this.idTable = curTable;
80        }   
81        this.sort();
82       
83        //restore scroll position
84        if (topVisibleRow) {
85            this.treeElem.treeBoxObject.scrollToRow(topVisibleRow);
86        }
87
88        // set Tab label
89        this.tabElem.setAttribute("label", this.treeType + " (" + this.idTable.length + ")");
90    },
91
92    addNewDatum : function(resource, name, localIdentityData, idData) {
93        var pref = {    recipientCol : name,
94                typeCol : "type",
95                senderCol : localIdentityData.combinedName,
96                smtpCol : localIdentityData.smtp.value,
97                smtpKey : localIdentityData.smtp.key,
98                idCol : localIdentityData.id.value,
99                idKey : localIdentityData.id.key,
100                resource : resource,
101                identityData : localIdentityData}
102//      vI_notificationBar.dump("## addNewDatum.\n");
103        localIdentityData.extras.addPrefs(pref);
104        idData.push(pref);
105    },
106    sort : function(column) {
107        var columnName;
108        var order = this.treeElem.getAttribute("sortDirection") == "ascending" ? 1 : -1;
109        //if the column is passed and it's already sorted by that column, reverse sort
110        if (column) {
111            columnName = column.id;
112            if (this.treeElem.getAttribute("sortResource") == columnName) {
113                order *= -1;
114            }
115        } else {
116            columnName = this.treeElem.getAttribute("sortResource");
117        }
118       
119        function columnSort(a, b) {
120            if (prepareForComparison(a[columnName]) > 
121                prepareForComparison(b[columnName])) return 1 * order;
122            if (prepareForComparison(a[columnName]) < 
123                prepareForComparison(b[columnName])) return -1 * order;
124            return 0;
125        }
126        this.idTable.sort(columnSort);
127        //setting these will make the sort option persist
128        this.treeElem.setAttribute("sortDirection", order == 1 ? "ascending" : "descending");
129        this.treeElem.setAttribute("sortResource", columnName);
130        this.treeElem.view = new vI_rdfDataTree.treeView(this.idTable);
131        //set the appropriate attributes to show to indicator
132        var cols = this.treeElem.getElementsByTagName("treecol");
133        for (var i = 0; i < cols.length; i++) {
134            cols[i].removeAttribute("sortDirection");
135        }
136        document.getElementById(columnName).setAttribute("sortDirection", order == 1 ? "ascending" : "descending");
137    },
138
139}
140
141var vI_rdfDataTree = {
142    promptService : Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
143            .getService(Components.interfaces.nsIPromptService),
144
145    treeTypes : Array("email", "maillist", "newsgroup", "filter"),
146
147    trees : {},
148    tabbox : null,
149   
150    _strings : null,
151   
152    onselect : function () {
153        var tree = vI_rdfDataTree.trees[vI_rdfDataTree.tabbox.selectedPanel.id];
154        var htmlBox = document.getElementById("vI_rdfDataTreeInfoBox")
155        if (tree.treeElem.view.selection.count != 1)
156            { vI_rdfDataTree.hideInfoBox(); return; }
157       
158        var identityData = tree.idTable[tree.treeElem.currentIndex]["identityData"];
159        var _identityInfo = 
160            "<div id='recipientLabel'>" +
161                tree.idTable[tree.treeElem.currentIndex]["recipientCol"].replace(/>/g,"&gt;").replace(/</g,"&lt;") +
162            "</div><div id='vICard'>" +
163            "<table><tr>" +
164                "<td class='image'><img src='chrome://v_identity/skin/vi-info.png' /></td>" +
165                "<td class='identityTable'>" +
166                    "<div class='name'>" + identityData.combinedNameHtml + "</div>" +   
167                    "<table><tbody>" + identityData.getMatrix() + "</tbody></table>" +
168                "</td>" +
169            "</tr></table></div>"
170
171        htmlBox.outputString = _identityInfo;
172        vI_rdfDataTree.infoBoxHidden = false;
173        htmlBox.setAttribute("style", "height:" + htmlBox.contentDocument.lastChild.scrollHeight +"px");
174        vI_rdfDataTree.overflow(); // better resize one time too much, mozilla is still magic  :)
175    },
176
177    init : function() {
178        vI_rdfDataTree.tabbox = document.getElementById("TreeTabbox");
179        vI_rdfDataTree._strings = document.getElementById("vI_rdfDataTreeBundle");
180
181        vI_rdfDatasource.init();
182        vI_storageExtrasHelper.hideUnusedTreeCols(); // XXX what happens heree ?? :)
183       
184        for each (var treeType in vI_rdfDataTree.treeTypes) {
185            vI_rdfDataTree.trees[treeType] = new rdfDataTree(treeType);
186        }
187    },
188   
189    //generic custom tree view stuff
190    treeView : function (table) {
191        this.rowCount = table.length;
192        this.getCellText = function(row, col) {
193            return table[row][col.id];
194        };
195        this.getCellValue = function(row, col) {
196            return table[row][col.id];
197        };
198        this.setTree = function(treebox) {
199            this.treebox = treebox;
200        };
201        this.isEditable = function(row, col) {
202            return col.editable;
203        };
204        this.isContainer = function(row){ return false; };
205        this.isSeparator = function(row){ return false; };
206        this.isSorted = function(){ return false; };
207        this.getLevel = function(row){ return 0; };
208        this.getImageSrc = function(row,col){ return null; };
209        this.getRowProperties = function(row,props){};
210        this.getCellProperties = function(row,col,props){};
211        this.getColumnProperties = function(colid,col,props){};
212        this.cycleHeader = function(col, elem) {
213            var tree = vI_rdfDataTree.trees[vI_rdfDataTree.tabbox.selectedPanel.id];
214            tree.sort(col)
215        };
216    },
217
218   
219    __setFilter : function (text) {
220        // loop trough all trees
221        for each (var treeType in vI_rdfDataTree.treeTypes) {
222            var tree = vI_rdfDataTree.trees[treeType];
223            tree.filterText = text;
224            tree.loadTable();
225        }
226    },
227
228    inputFilter : function(event) {
229        //do this now rather than doing it at every comparison
230        var value = prepareForComparison(event.target.value);
231        vI_rdfDataTree.__setFilter(value);
232        document.getElementById("clearFilter").disabled = value.length == 0;
233    },
234   
235    clearFilter : function() {
236        document.getElementById("clearFilter").disabled = true;
237        var filterElement = document.getElementById("filter");
238        filterElement.focus();
239        filterElement.value = "";
240        vI_rdfDataTree.__setFilter("");
241    },
242   
243    __updateMenu : function(modifySelected, removeSelected) {
244        var tree = vI_rdfDataTree.trees[vI_rdfDataTree.tabbox.selectedPanel.id];
245        var noSelections = (tree.treeElem.view.selection.count == 0)
246        modifySelected.setAttribute("disabled", noSelections)
247        removeSelected.setAttribute("disabled", noSelections)   
248    },
249   
250    updateContextMenu : function() {
251        vI_rdfDataTree.__updateMenu(
252            document.getElementById("context_modifySelected"),
253            document.getElementById("context_removeSelected"))
254    },
255   
256    updateMenu : function() {
257        vI_rdfDataTree.__updateMenu(
258            document.getElementById("menu_modifySelected"),
259            document.getElementById("menu_removeSelected"))
260    },
261
262    modifySelected : function() {
263        var treeType = vI_rdfDataTree.tabbox.selectedPanel.id;
264        var tree = vI_rdfDataTree.trees[treeType];
265        if (tree.treeElem.view.selection.count == 0) return;
266        if (tree.treeElem.view.selection.count > 5) {
267            var warning = vI_rdfDataTree._strings.getString("vI_rdfDataTree.modify.Warning1") + " " +
268                tree.treeElem.view.selection.count + " " +
269                vI_rdfDataTree._strings.getString("vI_rdfDataTree.modify.Warning2")
270            if (!vI_rdfDataTree.promptService.confirm(window,"Warning",warning)) return;
271        }
272       
273        var start = new Object(); var end = new Object();
274        var numRanges = tree.treeElem.view.selection.getRangeCount();
275
276        for (var t=0; t<numRanges; t++){
277            tree.treeElem.view.selection.getRangeAt(t,start,end);
278            for (var v=start.value; v<=end.value; v++)
279                window.openDialog("chrome://v_identity/content/vI_rdfDataEditor.xul",0,
280                    "chrome, dialog, modal, alwaysRaised, resizable=yes",
281                    tree.idTable[v],
282                    vI_rdfDatasource).focus();
283        }
284       
285        tree.idData = null; tree.idTable = null;
286        tree.loadTable()
287        vI_rdfDataTree.hideInfoBox();
288    },
289   
290    removeSelected : function() {
291        var treeType = vI_rdfDataTree.tabbox.selectedPanel.id;
292        var tree = vI_rdfDataTree.trees[treeType];
293        if (tree.treeElem.view.selection.count == 0) return;
294        var warning = vI_rdfDataTree._strings.getString("vI_rdfDataTree.remove.Warning1") + " " +
295            tree.treeElem.view.selection.count + " " +
296            vI_rdfDataTree._strings.getString("vI_rdfDataTree.remove.Warning2")
297       
298        if (!vI_rdfDataTree.promptService.confirm(window,"Warning",warning)) return;
299       
300        var start = new Object(); var end = new Object();
301        var numRanges = tree.treeElem.view.selection.getRangeCount();
302
303        for (var t=0; t<numRanges; t++){
304            tree.treeElem.view.selection.getRangeAt(t,start,end);
305            for (var v=start.value; v<=end.value; v++){
306                vI_rdfDatasource.removeBagForResource(tree.idTable[v]["resource"], tree.idTable[v]["type"])
307                vI_rdfDatasource.removeVIdentityFromRDF(tree.idTable[v]["resource"])
308            }
309        }
310       
311        tree.idData = null; tree.idTable = null;
312        tree.loadTable();
313        vI_rdfDataTree.hideInfoBox();
314    },
315   
316
317    infoBoxHidden : true,
318    overflow : function() {
319        if (vI_rdfDataTree.infoBoxHidden) return;
320        var htmlBox = document.getElementById("vI_rdfDataTreeInfoBox")
321        htmlBox.setAttribute("style", "height:" + htmlBox.contentDocument.lastChild.scrollHeight +"px");
322
323    },
324
325    hideInfoBox : function() {
326        vI_rdfDataTree.infoBoxHidden = true;
327        document.getElementById("vI_rdfDataTreeInfoBox").setAttribute("style", "height:0px");
328    },
329
330    selectAll : function() {
331        var treeType = vI_rdfDataTree.tabbox.selectedPanel.id;
332        var tree = vI_rdfDataTree.trees[treeType];
333        tree.treeElem.view.selection.selectAll();
334    },
335   
336    newItem : function() {
337        alert("XXX repair this");
338        var newItemPreset = { 
339                recipientCol : "",
340                typeCol : document.getElementById("vI_rdfDataTreeBundle").getString("vI_rdfDataTree.dataType.email"),
341                senderCol : "",
342                smtpKey : "",
343                idKey : gAccountManager.defaultAccount.defaultIdentity.key,
344                resource : null }
345        window.openDialog("chrome://v_identity/content/vI_rdfDataEditor.xul",0,
346            "chrome, dialog, modal, alwaysRaised, resizable=yes",
347            newItemPreset,
348            vI_rdfDatasource).focus();
349        vI_rdfDataTree.__idData = null; vI_rdfDataTree.__idTable = null;
350        vI_rdfDataTree.loadTable();
351        vI_rdfDataTree.hideInfoBox();
352    }
353};
Note: See TracBrowser for help on using the repository browser.