prevent usage of msg count with type 'new messages'

There seems to be no consistent way to count new messages. Tried with
'BiffState', 'NumNewBiffMessages', 'NewMessages'... either the proper event is
not fired, or the count is incorrect at a specific event... It was even
non-trivial to display an accurate biff.
This commit is contained in:
foudfou 2012-02-21 00:09:40 +01:00
parent c5a66ae05d
commit 0fa7b30674
5 changed files with 112 additions and 58 deletions

View File

@ -58,6 +58,11 @@ KNOWN BUGS
* child windows (compose message, preferences, ...) are not handled by
Firetray. For ex., they are not hidden along with there top-level window.
* because of `getNumNewMessages()`'s
[strange behaviour](https://bugzilla.mozilla.org/show_bug.cgi?id=727460),
it's impossible to display an accurate count of *new messages*. The best we
can do is display a biff icon.
Acknowledgment
--------------

View File

@ -80,6 +80,7 @@ var firetrayUIOptions = {
this.populateExcludedFoldersList();
this.populateTreeAccountsOrServerTypes();
this.initNotificationSettings();
this.initMessageCountSettings();
},
initNotificationSettings: function() {
@ -98,15 +99,19 @@ var firetrayUIOptions = {
radioMailNotify.selectedIndex = this.radioGetIndexByValue(radioMailNotify, prefMailNotificationType);
this.disableNotificationMaybe(prefMailNotificationType);
this.toggleNotifications(firetray.Utils.prefService.getBoolPref("mail_notification_enabled"));
},
initMessageCountSettings: function() {
document.getElementById("ui_message_count_type_unread").value =
FIRETRAY_MESSAGE_COUNT_TYPE_UNREAD;
document.getElementById("ui_message_count_type_new").value =
FIRETRAY_MESSAGE_COUNT_TYPE_NEW;
let prefMgsCountType = firetray.Utils.prefService.getIntPref("message_count_type");
document.getElementById("ui_message_count_type").selectedIndex = prefMgsCountType;
this.toggleNotifications(firetray.Utils.prefService.getBoolPref("mail_notification_enabled"));
let radioMessageCountType = document.getElementById("ui_message_count_type");
let prefMsgCountType = firetray.Utils.prefService.getIntPref("message_count_type");
radioMessageCountType.selectedIndex = this.radioGetIndexByValue(radioMessageCountType, prefMsgCountType);
this.disableMessageCountMaybe(prefMsgCountType);
},
radioGetIndexByValue: function(radio, value) {
@ -124,6 +129,12 @@ var firetrayUIOptions = {
firetray.Messaging.updateMsgCount();
},
updateMessageCountSettings: function() {
let radioMessageCountType = document.getElementById("ui_message_count_type");
let messageCountType = +radioMessageCountType.getItemAtIndex(radioMessageCountType.selectedIndex).value;
this.disableMessageCountMaybe(messageCountType);
},
disableNotificationMaybe: function(notificationSetting) {
let iconTextColor = document.getElementById("icon_text_color");
this.disableGroup(iconTextColor,
@ -132,7 +143,31 @@ var firetrayUIOptions = {
let customIconGroup = document.getElementById("custom_mail_icon");
this.disableGroup(customIconGroup,
(notificationSetting !== FIRETRAY_NOTIFICATION_CUSTOM_ICON));
},
disableMessageCountMaybe: function(msgCountType) {
LOG("disableMessageCountMaybe: "+msgCountType);
let doDisable = (msgCountType === FIRETRAY_MESSAGE_COUNT_TYPE_NEW);
let radioNotificationUnreadCount = document.getElementById("ui_radio_mail_notification_unread_count");
radioNotificationUnreadCount.disabled = doDisable;
let iconTextColor = document.getElementById("icon_text_color");
this.disableGroup(iconTextColor, doDisable);
if (msgCountType === FIRETRAY_MESSAGE_COUNT_TYPE_NEW) {
let radioNotificationNewmailIcon = document.getElementById("ui_radio_mail_notification_newmail_icon");
this.simulateClick(radioNotificationNewmailIcon);
}
},
simulateClick: function(target) {
var evt = document.createEvent("MouseEvents");
evt.initMouseEvent("click", true, true, window,
0, 0, 0, 0, 0, false, false, false, false, 0, null);
var canceled = !target.dispatchEvent(evt);
if(canceled)
ERROR("could not fire click on "+target);
},
toggleNotifications: function(enabled) {
@ -146,6 +181,10 @@ var firetrayUIOptions = {
.setAttribute("disabled", "true"); // UI update
firetray.Messaging.shutdown();
}
let radioMessageCountType = document.getElementById("ui_message_count_type");
let messageCountType = +radioMessageCountType.getItemAtIndex(radioMessageCountType.selectedIndex).value;
this.disableMessageCountMaybe(messageCountType);
},
chooseMailIconFile: function() {

View File

@ -95,7 +95,8 @@
preference="pref_mail_notification_enabled"
oncommand="firetrayUIOptions.toggleNotifications(this.checked)"/>
<radiogroup id="ui_message_count_type" preference="pref_message_count_type">
<radiogroup id="ui_message_count_type" preference="pref_message_count_type"
oncommand="firetrayUIOptions.updateMessageCountSettings()">
<hbox align="center" flex="1">
<label observes="broadcaster-notification-disabled">&message_count_type;</label>
<radio id="ui_message_count_type_unread" label="&message_count_type_unread;"

View File

@ -1,3 +1,4 @@
<!-- if you need multiline/carriage return, use a .properties -->
<!ENTITY prefwindow.title "FireTray preferences">
<!ENTITY pane1.title "FireTray preferences">

View File

@ -57,8 +57,8 @@ firetray.Messaging = {
// Ci.nsIFolderListener.propertyChanged |
// Ci.nsIFolderListener.propertyFlagChanged |
// Ci.nsIFolderListener.event |
Ci.nsIFolderListener.intPropertyChanged |
Ci.nsIFolderListener.boolPropertyChanged,
Ci.nsIFolderListener.boolPropertyChanged |
Ci.nsIFolderListener.intPropertyChanged,
OnItemPropertyChanged: function(item, property, oldValue, newValue) { // NumNewBiffMessages
LOG("OnItemPropertyChanged "+property+" for folder "+item.prettyName+" was "+oldValue+" became "+newValue+" NEW MESSAGES="+item.getNumNewMessages(true));
@ -90,11 +90,12 @@ firetray.Messaging = {
if (!(item.flags & excludedFoldersFlags)) {
let prop = property.toString();
if (msgCountType === FIRETRAY_MESSAGE_COUNT_TYPE_UNREAD &&
prop === "TotalUnreadMessages" ||
msgCountType === FIRETRAY_MESSAGE_COUNT_TYPE_NEW &&
prop === "NewMessages") {
prop === "TotalUnreadMessages") {
firetray.Messaging.updateMsgCount();
} else if (msgCountType === FIRETRAY_MESSAGE_COUNT_TYPE_NEW &&
prop === "NewMessages") {
if (oldValue === true && newValue === false)
item.setNumNewMessages(0);
item.setNumNewMessages(0); // https://bugzilla.mozilla.org/show_bug.cgi?id=727460
firetray.Messaging.updateMsgCount();
}
}
@ -102,59 +103,14 @@ firetray.Messaging = {
},
/**
* computes total unread message count.
* NOTE: new messages can(?) be filtered and mark read, but still be
* considered new, so we may have to use nsMsgFolderFlagType.GotNew on all
* folders
* computes and display new msg count
*/
updateMsgCount: function() {
LOG("updateMsgCount");
if (!this.initialized)
return;
let mailAccounts = firetray.Utils.getObjPref('mail_accounts');
LOG("mail accounts from pref: "+JSON.stringify(mailAccounts));
let serverTypes = mailAccounts["serverTypes"];
let excludedAccounts = mailAccounts["excludedAccounts"];
let excludedFoldersFlags = firetray.Utils.prefService
.getIntPref("excluded_folders_flags");
let msgCountType = firetray.Utils.prefService.getIntPref("message_count_type"),
getNewMessageCount = '';
LOG("msgCountType="+msgCountType);
if (msgCountType === FIRETRAY_MESSAGE_COUNT_TYPE_UNREAD)
getNewMessageCount = 'getNumUnread';
else if (msgCountType === FIRETRAY_MESSAGE_COUNT_TYPE_NEW)
getNewMessageCount = 'getNumNewMessages';
else
ERROR('unknown message count type');
let newMsgCount = 0;
try {
let accounts = new this.Accounts();
for (let accountServer in accounts) {
LOG("is servertype excluded: "+serverTypes[accountServer.type].excluded+", account exclusion index: "+excludedAccounts.indexOf(accountServer.key));
if ( (serverTypes[accountServer.type].excluded)
|| (excludedAccounts.indexOf(accountServer.key) >= 0) )
continue;
let rootFolder = accountServer.rootFolder; // nsIMsgFolder
if (rootFolder.hasSubFolders) {
let subFolders = rootFolder.subFolders; // nsIMsgFolder
while(subFolders.hasMoreElements()) {
let folder = subFolders.getNext().QueryInterface(Ci.nsIMsgFolder);
if (!(folder.flags & excludedFoldersFlags)) {
folderNewMsgCount = folder[getNewMessageCount](true); // includes subfolders
LOG(folder.prettyName+" "+getNewMessageCount+"="+folderNewMsgCount);
newMsgCount += folderNewMsgCount;
}
}
}
}
} catch (x) {
ERROR(x);
}
LOG("Total Unread="+newMsgCount);
let newMsgCount = this.countMessages();
// update icon
if (newMsgCount == 0) {
@ -189,6 +145,58 @@ firetray.Messaging = {
throw "negative message count"; // should never happen
}
},
/**
* computes total unread message count.
* NOTE: new messages can(?) be filtered and mark read, but still be
* considered new, so we may have to use nsMsgFolderFlagType.GotNew on all
* folders
*/
countMessages: function() {
let msgCountType = firetray.Utils.prefService.getIntPref("message_count_type");
LOG("msgCountType="+msgCountType);
if (msgCountType === FIRETRAY_MESSAGE_COUNT_TYPE_UNREAD) {
folderCountFunctionName = 'getNumUnread';
} else if (msgCountType === FIRETRAY_MESSAGE_COUNT_TYPE_NEW) {
folderCountFunctionName = 'getNumNewMessages'; // perfectly bogus if > 0
} else
ERROR('unknown message count type');
let mailAccounts = firetray.Utils.getObjPref('mail_accounts');
LOG("mail accounts from pref: "+JSON.stringify(mailAccounts));
let serverTypes = mailAccounts["serverTypes"];
let excludedAccounts = mailAccounts["excludedAccounts"];
let excludedFoldersFlags = firetray.Utils.prefService
.getIntPref("excluded_folders_flags");
let newMsgCount = 0;
try {
let accounts = new this.Accounts();
for (let accountServer in accounts) {
LOG("is servertype excluded: "+serverTypes[accountServer.type].excluded+", account exclusion index: "+excludedAccounts.indexOf(accountServer.key));
if ( (serverTypes[accountServer.type].excluded)
|| (excludedAccounts.indexOf(accountServer.key) >= 0) )
continue;
let rootFolder = accountServer.rootFolder; // nsIMsgFolder
if (rootFolder.hasSubFolders) {
let subFolders = rootFolder.subFolders; // nsIMsgFolder
while(subFolders.hasMoreElements()) {
let folder = subFolders.getNext().QueryInterface(Ci.nsIMsgFolder);
if (!(folder.flags & excludedFoldersFlags)) {
let folderNewMsgCount = folder[folderCountFunctionName](true); // includes subfolders
LOG(folder.prettyName+" "+folderCountFunctionName+"="+folderNewMsgCount);
newMsgCount += folderNewMsgCount;
}
}
}
}
} catch (x) {
ERROR(x);
}
LOG("Total Unread="+newMsgCount);
return newMsgCount;
}
};