* re-introduce dumpObj() useful for DOM elements

* merge server_types and excluded_accounts into one mail_accounts pref

This is visually more intuitive. So do we use the same tree for both. But we
store them into 2 different "branches" of the corresponding preference
object. We need to keep track of them separately because of account
creation/deletion.
This commit is contained in:
foudfou 2011-11-02 01:48:41 +01:00
parent 4d4c21b9f9
commit 5ad5b3c3d4
7 changed files with 87 additions and 98 deletions

3
TODO
View File

@ -1,7 +1,6 @@
=TODO= =TODO=
* make accounts_to_exclude a tree that is modified by server_types_to_exclude, * options: in mail_accounts, have serverTypes interact with excludedAccounts
or include accounts into server_types' tree ?
* add "enable biff notification" option. And if true: * add "enable biff notification" option. And if true:

View File

@ -15,7 +15,6 @@ if ("undefined" == typeof(firetray)) {
}; };
firetray.UIOptions = { firetray.UIOptions = {
accountBoxId: "ui_accounts_box",
onLoad: function() { onLoad: function() {
if(firetray.Handler.inMailApp) { if(firetray.Handler.inMailApp) {
@ -33,7 +32,7 @@ firetray.UIOptions = {
// cleaning: removeEventListener on cells // cleaning: removeEventListener on cells
// NOTE: not sure this is necessary on window close // NOTE: not sure this is necessary on window close
let items = document.getElementById("ui_server_types").childNodes; let items = document.getElementById("ui_mail_accounts").childNodes;
for (let i=0; i < items.length; i++) { for (let i=0; i < items.length; i++) {
let cells = items[i].getElementsByTagName("treecell"); let cells = items[i].getElementsByTagName("treecell");
// col 2 and 3: server_type_excluded, server_type_order // col 2 and 3: server_type_excluded, server_type_order
@ -51,47 +50,6 @@ firetray.UIOptions = {
targetNode.hidden = true; targetNode.hidden = true;
}, },
insertMailAccountsExcluded: function(parentId) {
// the DOM parent where we do appendChild
let targetNode = document.getElementById(parentId);
let serverTypes = firetray.Utils.getObjPref('server_types');
let accounts = new firetray.Messaging.Accounts(true);
for (let accountServer in accounts) {
if (serverTypes[accountServer.type].excluded)
continue;
let nodeAccount = document.createElement("checkbox");
let accountServerKey = accountServer.key.toString();
nodeAccount.setAttribute('id', accountServerKey);
nodeAccount.setAttribute('label', accountServer.rootFolder.name);
nodeAccount.setAttribute('checked',
(firetray.Utils.getArrayPref('accounts_to_exclude').indexOf(accountServerKey) >= 0));
let that = this;
nodeAccount.addEventListener('command', function(e){
that.updateMailAccountsExcluded(that.accountBoxId);}, true);
targetNode.appendChild(nodeAccount);
}
// let disable_notify=prefManager.getIntPref("extensions.firetray.show_mail_notification")==0;
// this._disableGroup(targetNode,disable_notify);
},
updateMailAccountsExcluded: function(parentId) {
let targetNode = document.getElementById(parentId);
let prefValue = [];
for (let i=1; i < targetNode.childNodes.length; i++) {
if (targetNode.childNodes[i].checked)
prefValue.push(targetNode.childNodes[i].getAttribute('id'));
}
LOG("accounts_to_exclude:"+prefValue);
firetray.Utils.setArrayPref('accounts_to_exclude', prefValue);
firetray.Messaging.updateUnreadMsgCount();
},
_disableGroup: function(group, disableval) { _disableGroup: function(group, disableval) {
try { try {
for (let i=0; i< group.childNodes.length; i++) for (let i=0; i< group.childNodes.length; i++)
@ -108,20 +66,26 @@ firetray.UIOptions = {
if (event.attrName == "label") LOG("label changed!"); if (event.attrName == "label") LOG("label changed!");
if (event.attrName == "value") LOG("value changed!"); if (event.attrName == "value") LOG("value changed!");
document.getElementById("pane1") document.getElementById("pane1")
.userChangedValue(document.getElementById("ui_tree_server_types")); .userChangedValue(document.getElementById("ui_tree_mail_accounts"));
}, },
/**
* NOTE: account exceptions for unread messages count are *stored* in
* preferences as excluded, but *shown* as "not included"
*/
populateTreeServerTypes: function() { populateTreeServerTypes: function() {
let that = this; let that = this;
let prefPane = document.getElementById("pane1"); let prefPane = document.getElementById("pane1");
let prefStr = firetray.Utils.prefService.getCharPref("server_types"); let prefStr = firetray.Utils.prefService.getCharPref("mail_accounts");
LOG("PREF="+prefStr); LOG("PREF="+prefStr);
let serverTypes = JSON.parse(prefStr); let mailAccounts = JSON.parse(prefStr);
let serverTypes = mailAccounts["serverTypes"];
let accountsExcluded = mailAccounts["excludedAccounts"];
let accountsByServerType = firetray.Messaging.accountsByServerType(); let accountsByServerType = firetray.Messaging.accountsByServerType();
LOG(JSON.stringify(accountsByServerType)); LOG(JSON.stringify(accountsByServerType));
let target = document.getElementById("ui_server_types"); let target = document.getElementById("ui_mail_accounts");
for (let serverTypeName in serverTypes) { for (let serverTypeName in serverTypes) {
let name = serverTypes[serverTypeName]; let name = serverTypes[serverTypeName];
@ -140,9 +104,8 @@ firetray.UIOptions = {
// server_type_excluded => checkbox // server_type_excluded => checkbox
cell = document.createElement('treecell'); cell = document.createElement('treecell');
cell.setAttribute('value',serverTypes[serverTypeName].excluded); cell.setAttribute('value',!serverTypes[serverTypeName].excluded);
// CAUTION: removeEventListener in onQuit() cell.addEventListener( // CAUTION: removeEventListener in onQuit()
cell.addEventListener(
'DOMAttrModified', function(e) { 'DOMAttrModified', function(e) {
that._userChangeValueTreeServerTypes(e); that._userChangeValueTreeServerTypes(e);
firetray.Messaging.updateUnreadMsgCount(); firetray.Messaging.updateUnreadMsgCount();
@ -152,7 +115,7 @@ firetray.UIOptions = {
// server_type_order // server_type_order
cell = document.createElement('treecell'); cell = document.createElement('treecell');
cell.setAttribute('label',serverTypes[serverTypeName].order); cell.setAttribute('label',serverTypes[serverTypeName].order);
cell.addEventListener( cell.addEventListener( // CAUTION: removeEventListener in onQuit()
'DOMAttrModified', that._userChangeValueTreeServerTypes, true); 'DOMAttrModified', that._userChangeValueTreeServerTypes, true);
row.appendChild(cell); row.appendChild(cell);
@ -164,18 +127,26 @@ firetray.UIOptions = {
LOG("type: "+serverTypeName+", Accounts: "+JSON.stringify(typeAccounts)); LOG("type: "+serverTypeName+", Accounts: "+JSON.stringify(typeAccounts));
if (typeof(typeAccounts) == "undefined") if (typeof(typeAccounts) == "undefined")
continue; continue;
for (let i=0; i<typeAccounts.length; i++) { for (let i=0; i<typeAccounts.length; i++) {
let subItem = document.createElement('treeitem'); let subItem = document.createElement('treeitem');
let subRow = document.createElement('treerow'); let subRow = document.createElement('treerow');
// server_type_name // server_type_name
cell = document.createElement('treecell'); cell = document.createElement('treecell');
cell.setAttribute('id', typeAccounts[i].key);
cell.setAttribute('label',typeAccounts[i].name); cell.setAttribute('label',typeAccounts[i].name);
cell.setAttribute('editable',false); cell.setAttribute('editable',false);
subRow.appendChild(cell); subRow.appendChild(cell);
// server_type_excluded => checkbox // server_type_excluded => checkbox
let cell = document.createElement('treecell'); let cell = document.createElement('treecell');
cell.setAttribute('value',(accountsExcluded.indexOf(typeAccounts[i].key) < 0));
cell.addEventListener( // CAUTION: removeEventListener in onQuit()
'DOMAttrModified', function(e) {
that._userChangeValueTreeServerTypes(e);
firetray.Messaging.updateUnreadMsgCount();
}, true);
subRow.appendChild(cell); subRow.appendChild(cell);
// server_type_order - UNUSED (added for consistency) // server_type_order - UNUSED (added for consistency)
@ -190,34 +161,47 @@ firetray.UIOptions = {
} }
let tree = document.getElementById("ui_tree_server_types"); let tree = document.getElementById("ui_tree_mail_accounts");
tree.addEventListener("keypress", that.onKeyPressTreeServerTypes, true); tree.addEventListener("keypress", that.onKeyPressTreeServerTypes, true);
}, },
/* /*
* Save the "server_types" preference. This is called by the pref's system * Save the "mail_accounts" preference. This is called by the pref's system
* when the GUI element is altered. * when the GUI element is altered.
*/ */
saveTreeServerTypes: function() { saveTreeServerTypes: function() {
let tree = document.getElementById("ui_tree_server_types"); let tree = document.getElementById("ui_tree_mail_accounts");
LOG("VIEW="+ tree.view + ", rowCount="+tree.view.rowCount); LOG("VIEW="+ tree.view + ", rowCount="+tree.view.rowCount);
let prefObj = {}; let prefObj = {"serverTypes":{}, "excludedAccounts":[]};
for (let i=0; i < tree.view.rowCount; i++) { for (let i=0; i < tree.view.rowCount; i++) {
if (tree.view.getLevel(i)>0) // TODO: rename server_type_* to account_or_server_type
continue; let serverTypeName = tree.view.getCellText(
i, tree.columns.getNamedColumn("server_type_name"));
let serverTypeExcluded = ( let serverTypeExcluded = (
tree.view.getCellValue( tree.view.getCellValue(
i, tree.columns.getNamedColumn("server_type_excluded")) i, tree.columns.getNamedColumn("server_type_excluded"))
=== 'true'); !== 'true');
let serverTypeName = tree.view.getCellText(
i, tree.columns.getNamedColumn("server_type_name"));
let serverTypeOrder = parseInt(tree.view.getCellText( let serverTypeOrder = parseInt(tree.view.getCellText(
i, tree.columns.getNamedColumn("server_type_order"))); i, tree.columns.getNamedColumn("server_type_order")));
LOG("SUPER: "+serverTypeName+", "+serverTypeExcluded); LOG("SUPER: "+serverTypeName+", "+serverTypeExcluded);
prefObj[serverTypeName] =
{ order: serverTypeOrder, excluded: serverTypeExcluded }; if (tree.view.getLevel(i) === 0) { // serverTypes
prefObj["serverTypes"][serverTypeName] =
{ order: serverTypeOrder, excluded: serverTypeExcluded };
} else if (tree.view.getLevel(i) === 1) { // excludedAccounts
if (!serverTypeExcluded)
continue;
let rowNode = tree.view.getItemAtIndex(i).firstChild; // treerow
let rowCells = rowNode.getElementsByTagName('treecell');
let serverKey = rowCells[0].id;
prefObj["excludedAccounts"].push(serverKey);
} else
continue;
} }
let prefStr = JSON.stringify(prefObj); let prefStr = JSON.stringify(prefObj);
@ -229,7 +213,7 @@ firetray.UIOptions = {
onKeyPressTreeServerTypes: function(event) { onKeyPressTreeServerTypes: function(event) {
LOG("TREE KEYPRESS: "+event.originalTarget); LOG("TREE KEYPRESS: "+event.originalTarget);
let tree = document.getElementById("ui_tree_server_types"); let tree = document.getElementById("ui_tree_mail_accounts");
let col = tree.editingColumn; // col.index let col = tree.editingColumn; // col.index
// only int allowed // only int allowed

View File

@ -4,7 +4,7 @@
<!DOCTYPE prefwindow SYSTEM "chrome://firetray/locale/options.dtd"> <!DOCTYPE prefwindow SYSTEM "chrome://firetray/locale/options.dtd">
<prefwindow id="firetray-preferences" <prefwindow id="firetray-preferences"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
title="&prefwindow.title;"> title="&prefwindow.title;" minwidth="360px">
<script type="application/x-javascript" src="options.js" /> <script type="application/x-javascript" src="options.js" />
@ -13,8 +13,8 @@
<preferences> <preferences>
<preference id="pref_bool_close_hides" <preference id="pref_bool_close_hides"
name="extensions.firetray.close_hides" type="bool"/> name="extensions.firetray.close_hides" type="bool"/>
<preference id="pref_string_server_types" <preference id="pref_string_mail_accounts"
name="extensions.firetray.server_types" type="string"/> name="extensions.firetray.mail_accounts" type="string"/>
</preferences> </preferences>
@ -42,38 +42,31 @@
<tabpanel id="mail_tabpanel"> <tabpanel id="mail_tabpanel">
<groupbox flex="1"> <groupbox flex="1">
<caption label="&unread_count_account_exceptions;" /> <caption label="&unread_count_account_exceptions;"
tooltiptext="&unread_count_account_exceptions.tooltip;" />
<label value="&mail_account_types_exclude;" /> <tree id="ui_tree_mail_accounts" flex="1" rows="10"
<tree id="ui_tree_server_types" flex="1" rows="6"
seltype="single" editable="true" seltype="single" editable="true"
preference-editable="true" preference-editable="true"
preference="pref_string_server_types" preference="pref_string_mail_accounts"
onsynctopreference="return firetray.UIOptions.saveTreeServerTypes();"> onsynctopreference="return firetray.UIOptions.saveTreeServerTypes();">
<treecols> <treecols>
<treecol id="server_type_name" editable="false" flex="2" <treecol id="server_type_name" editable="false" flex="2"
persist="width" primary="true" label="&server_type_name;" persist="width" primary="true" label="&server_type_name;"
tooltiptext="&server_type_name_tooltip;"/> tooltiptext="&server_type_name.tooltip;"/>
<splitter class="tree-splitter" resizeafter="grow"/> <splitter class="tree-splitter" resizeafter="grow"/>
<treecol id="server_type_excluded" type="checkbox" editable="true" <treecol id="server_type_excluded" type="checkbox" editable="true"
label="&server_type_excluded;" flex="1" persist="width" label="&server_type_excluded;" flex="1" persist="width"
tooltiptext="&server_type_excluded_tooltip;"/> tooltiptext="&server_type_excluded.tooltip;"/>
<splitter class="tree-splitter" resizeafter="grow"/> <splitter class="tree-splitter" resizeafter="grow"/>
<treecol id="server_type_order" editable="true" <treecol id="server_type_order" editable="true"
persist="width" persist="width"
flex="1" hidden= "true" label="&server_type_order;" flex="1" hidden= "true" label="&server_type_order;"
tooltiptext="&server_type_name_tooltip;"/> tooltiptext="&server_type_name.tooltip;"/>
</treecols> </treecols>
<treechildren id="ui_server_types" flex="1" /> <treechildren id="ui_mail_accounts" flex="1" />
</tree> </tree>
<separator class="thin" />
<label value="&mail_accounts_exclude;"/>
<vbox id="ui_accounts_box" /> <!-- firetray.UIOptions.accountBoxId -->
<!-- accounts are dynamically added here with insert_accounts_name()
functions, called at the bottom of this file -->
</groupbox> </groupbox>
</tabpanel> </tabpanel>

View File

@ -8,14 +8,12 @@
<!ENTITY bool_close_hides.label "Closing windows hides to tray"> <!ENTITY bool_close_hides.label "Closing windows hides to tray">
<!ENTITY bool_close_hides.accesskey "C"> <!ENTITY bool_close_hides.accesskey "C">
<!ENTITY unread_count_account_exceptions "Exclude accounts from unread count"> <!ENTITY unread_count_account_exceptions "Included accounts">
<!ENTITY unread_count_account_exceptions.tooltip "Included accounts for unread message count">
<!ENTITY mail_account_types_exclude "Account types to exclude:"> <!ENTITY server_type_name "Account">
<!ENTITY server_type_name.tooltip "FIXME">
<!ENTITY server_type_excluded "Excluded"> <!ENTITY server_type_excluded "Excluded">
<!ENTITY server_type_excluded_tooltip "FIXME"> <!ENTITY server_type_excluded.tooltip "FIXME">
<!ENTITY server_type_name "Type">
<!ENTITY server_type_name_tooltip "FIXME">
<!ENTITY server_type_order "Order"> <!ENTITY server_type_order "Order">
<!ENTITY server_type_order_tooltip "FIXME"> <!ENTITY server_type_order.tooltip "FIXME">
<!ENTITY mail_accounts_exclude "Mail accounts to exclude:">

View File

@ -6,5 +6,5 @@ pref("browser.tabs.warnOnClose", false);
// Extension prefs // Extension prefs
pref("extensions.firetray.close_hides", true); pref("extensions.firetray.close_hides", true);
pref("extensions.firetray.accounts_to_exclude", "[]"); // JSON // exposed in 1 tree, hence 2 branches: serverTypes, excludedAccounts
pref("extensions.firetray.server_types", '{"pop3":{"order":1,"excluded":false}, "imap":{"order":1,"excluded":false}, "movemail":{"order":2,"excluded":true}, "none":{"order":3,"excluded":false}, "rss":{"order":4,"excluded":true}, "nntp":{"order":5,"excluded":true} }'); // JSON pref("extensions.firetray.mail_accounts", '{ "serverTypes": {"pop3":{"order":1,"excluded":false}, "imap":{"order":1,"excluded":false}, "movemail":{"order":2,"excluded":true}, "none":{"order":3,"excluded":false}, "rss":{"order":4,"excluded":true}, "nntp":{"order":5,"excluded":true}}, "excludedAccounts": [] }'); // JSON

View File

@ -78,14 +78,16 @@ firetray.Messaging = {
*/ */
updateUnreadMsgCount: function() { updateUnreadMsgCount: function() {
LOG("unreadMsgCount"); LOG("unreadMsgCount");
let serverTypes = firetray.Utils.getObjPref('server_types'); let mailAccounts = firetray.Utils.getObjPref('mail_accounts');
let serverTypes = mailAccounts["serverTypes"];
let excludedAccounts = mailAccounts["excludedAccounts"];
this._unreadMsgCount = 0; // reset this._unreadMsgCount = 0; // reset
try { try {
let accounts = new this.Accounts(); let accounts = new this.Accounts();
for (let accountServer in accounts) { for (let accountServer in accounts) {
if ( (serverTypes[accountServer.type].excluded) if ( (serverTypes[accountServer.type].excluded)
|| (firetray.Utils.getArrayPref('accounts_to_exclude').indexOf(accountServer.key) >= 0) ) || (excludedAccounts.indexOf(accountServer.key) >= 0) )
continue; continue;
let rootFolder = accountServer.rootFolder; // nsIMsgFolder let rootFolder = accountServer.rootFolder; // nsIMsgFolder
@ -152,7 +154,8 @@ firetray.Messaging.Accounts.prototype.__iterator__ = function() {
accountServers[i] = accountServer; accountServers[i] = accountServer;
} }
let serverTypes = firetray.Utils.getObjPref('server_types'); let mailAccounts = firetray.Utils.getObjPref('mail_accounts');
let serverTypes = mailAccounts["serverTypes"];
if (this.sortByTypeAndName) { if (this.sortByTypeAndName) {
accountServers.sort(function(a,b) { accountServers.sort(function(a,b) {
if (serverTypes[a.type].order if (serverTypes[a.type].order
@ -176,7 +179,7 @@ firetray.Messaging.Accounts.prototype.__iterator__ = function() {
}; };
/** /**
* return accounts grouped by server_types. * return accounts grouped by mail_accounts.
* *
* ex: { movemail: {"server1", "server2"}, imap: {"server3"} } * ex: { movemail: {"server1", "server2"}, imap: {"server3"} }
*/ */

View File

@ -100,6 +100,18 @@ firetray.Utils = {
let protocolHandler = Cc["@mozilla.org/network/protocol;1?name=file"] let protocolHandler = Cc["@mozilla.org/network/protocol;1?name=file"]
.createInstance(Ci.nsIFileProtocolHandler); .createInstance(Ci.nsIFileProtocolHandler);
return protocolHandler.getFileFromURLSpec(aPath).path; return protocolHandler.getFileFromURLSpec(aPath).path;
},
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);
} }
}; };