diff --git a/TODO b/TODO index e034510..9cfbd66 100644 --- a/TODO +++ b/TODO @@ -1,6 +1,7 @@ =TODO= -* gdk_visual_get_depth not provided before Gtk 2.22 +* make accounts_to_exclude a tree that is modified by server_types_to_exclude, + or include accounts into server_types' tree ? * add "enable biff notification" option. And if true: diff --git a/src/chrome/content/options.js b/src/chrome/content/options.js index 5b24432..f4cc3c3 100644 --- a/src/chrome/content/options.js +++ b/src/chrome/content/options.js @@ -36,8 +36,8 @@ firetray.UIOptions = { let items = document.getElementById("ui_server_types").childNodes; for (let i=0; i < items.length; i++) { let cells = items[i].getElementsByTagName("treecell"); - // col 1 and 3: server_type_excluded, server_type_order - [cells[0], cells[2]].map( + // col 2 and 3: server_type_excluded, server_type_order + [cells[1], cells[2]].map( function(c) { LOG("i: "+i+", cell:"+c); c.removeEventListener( @@ -101,6 +101,99 @@ firetray.UIOptions = { } }, + /** + * needed for triggering actual preference change and saving + */ + _userChangeValueTreeServerTypes: function(event) { + if (event.attrName == "label") LOG("label changed!"); + if (event.attrName == "value") LOG("value changed!"); + document.getElementById("pane1") + .userChangedValue(document.getElementById("ui_tree_server_types")); + }, + + populateTreeServerTypes: function() { + let that = this; + let prefPane = document.getElementById("pane1"); + + let prefStr = firetray.Utils.prefService.getCharPref("server_types"); + LOG("PREF="+prefStr); + let serverTypes = JSON.parse(prefStr); + let accountsByServerType = firetray.Messaging.accountsByServerType(); + LOG(JSON.stringify(accountsByServerType)); + + let target = document.getElementById("ui_server_types"); + for (let serverTypeName in serverTypes) { + let name = serverTypes[serverTypeName]; + + let item = document.createElement('treeitem'); + item.setAttribute("container",true); + item.setAttribute("open",true); + + let row = document.createElement('treerow'); + item.appendChild(row); + + // server_type_name + let cell = document.createElement('treecell'); + cell.setAttribute('label',serverTypeName); + cell.setAttribute('editable',false); + row.appendChild(cell); + + // server_type_excluded => checkbox + cell = document.createElement('treecell'); + cell.setAttribute('value',serverTypes[serverTypeName].excluded); + // CAUTION: removeEventListener in onQuit() + cell.addEventListener( + 'DOMAttrModified', function(e) { + that._userChangeValueTreeServerTypes(e); + firetray.Messaging.updateUnreadMsgCount(); + }, true); + row.appendChild(cell); + + // server_type_order + cell = document.createElement('treecell'); + cell.setAttribute('label',serverTypes[serverTypeName].order); + cell.addEventListener( + 'DOMAttrModified', that._userChangeValueTreeServerTypes, true); + row.appendChild(cell); + + target.appendChild(item); + + // add actual accounts as children + let subChildren = document.createElement('treechildren'); + let typeAccounts = accountsByServerType[serverTypeName]; + LOG("type: "+serverTypeName+", Accounts: "+JSON.stringify(typeAccounts)); + if (typeof(typeAccounts) == "undefined") + continue; + for (let i=0; i checkbox + let cell = document.createElement('treecell'); + subRow.appendChild(cell); + + // server_type_order - UNUSED (added for consistency) + cell = document.createElement('treecell'); + cell.setAttribute('editable',false); + subRow.appendChild(cell); + + subItem.appendChild(subRow); + subChildren.appendChild(subItem); + } + item.appendChild(subChildren); + + } + + let tree = document.getElementById("ui_tree_server_types"); + tree.addEventListener("keypress", that.onKeyPressTreeServerTypes, true); + }, + /* * Save the "server_types" preference. This is called by the pref's system * when the GUI element is altered. @@ -111,6 +204,9 @@ firetray.UIOptions = { LOG("VIEW="+ tree.view + ", rowCount="+tree.view.rowCount); let prefObj = {}; for (let i=0; i < tree.view.rowCount; i++) { + if (tree.view.getLevel(i)>0) + continue; + let serverTypeExcluded = ( tree.view.getCellValue( i, tree.columns.getNamedColumn("server_type_excluded")) @@ -131,63 +227,6 @@ firetray.UIOptions = { return prefStr; }, - /** - * needed for triggering actual preference change and saving - */ - _userChangeValueTreeServerTypes: function(event) { - if (event.attrName == "label") LOG("label changed!"); - if (event.attrName == "value") LOG("value changed!"); - document.getElementById("pane1") - .userChangedValue(document.getElementById("ui_tree_server_types")); - }, - - populateTreeServerTypes: function() { - let that = this; - let prefPane = document.getElementById("pane1"); - - let prefStr = firetray.Utils.prefService.getCharPref("server_types"); - LOG("PREF="+prefStr); - let prefObj = JSON.parse(prefStr); - - let target = document.getElementById("ui_server_types"); - for (serverTypeName in prefObj) { - let name = prefObj[serverTypeName]; - - let item = document.createElement('treeitem'); - let row = document.createElement('treerow'); - item.appendChild(row); - - // server_type_excluded => checkbox - let cell = document.createElement('treecell'); - cell.setAttribute('value',prefObj[serverTypeName].excluded); - // CAUTION: removeEventListener in onQuit() - cell.addEventListener( - 'DOMAttrModified', function(e) { - that._userChangeValueTreeServerTypes(e); - firetray.Messaging.updateUnreadMsgCount(); - }, true); - row.appendChild(cell); - - // server_type_name - cell = document.createElement('treecell'); - cell.setAttribute('label',serverTypeName); - cell.setAttribute('editable',false); - row.appendChild(cell); - - // server_type_order - cell = document.createElement('treecell'); - cell.setAttribute('label',prefObj[serverTypeName].order); - cell.addEventListener( - 'DOMAttrModified', that._userChangeValueTreeServerTypes, true); - row.appendChild(cell); - - target.appendChild(item); - } - - let tree = document.getElementById("ui_tree_server_types"); - tree.addEventListener("keypress", that.onKeyPressTreeServerTypes, true); - }, - onKeyPressTreeServerTypes: function(event) { LOG("TREE KEYPRESS: "+event.originalTarget); let tree = document.getElementById("ui_tree_server_types"); diff --git a/src/chrome/content/options.xul b/src/chrome/content/options.xul index cc94dab..368d75c 100644 --- a/src/chrome/content/options.xul +++ b/src/chrome/content/options.xul @@ -41,7 +41,7 @@ - + - + diff --git a/src/modules/FiretrayMessaging.jsm b/src/modules/FiretrayMessaging.jsm index c1b1543..114aad7 100644 --- a/src/modules/FiretrayMessaging.jsm +++ b/src/modules/FiretrayMessaging.jsm @@ -174,3 +174,23 @@ firetray.Messaging.Accounts.prototype.__iterator__ = function() { yield accountServers[i]; } }; + +/** + * return accounts grouped by server_types. + * + * ex: { movemail: {"server1", "server2"}, imap: {"server3"} } + */ +firetray.Messaging.accountsByServerType = function() { + let accountsByServerType = {}; + let accounts = new firetray.Messaging.Accounts(false); + for (let accountServer in accounts) { + let accountServerKey = accountServer.key.toString(); + let accountServerName = accountServer.prettyName; + let accountServerType = accountServer.type; + if (typeof(accountsByServerType[accountServerType]) == "undefined") + accountsByServerType[accountServerType] = []; + accountsByServerType[accountServerType].push( + { key: accountServerKey, name: accountServerName }); + } + return accountsByServerType; +}; diff --git a/src/modules/commons.js b/src/modules/commons.js index f5288a3..c27d080 100644 --- a/src/modules/commons.js +++ b/src/modules/commons.js @@ -66,18 +66,6 @@ firetray.Utils = { this.setObjPref(prefStr, aArray); }, - dumpObj: function(obj) { - let str = ""; - for(i in obj) { - try { - str += "obj["+i+"]: " + obj[i] + "\n"; - } catch(e) { - str += "obj["+i+"]: Unavailable\n"; - } - } - LOG(str); - }, - QueryInterfaces: function(obj) { for each (i in Components.interfaces) { try {