diff --git a/mail/base/content/FilterListDialog.js b/mail/base/content/FilterListDialog.js
index 85e6364e59..7ce5accea7 100644
--- a/mail/base/content/FilterListDialog.js
+++ b/mail/base/content/FilterListDialog.js
@@ -41,7 +41,7 @@ const MSG_FOLDER_FLAG_INBOX = 0x1000
var gFilterListMsgWindow = null;
var gCurrentFilterList;
-var gCurrentServer;
+var gCurrentFolder;
var gStatusFeedback = {
progressMeterVisible : false,
@@ -110,28 +110,28 @@ function onLoad()
firstItem = getServerThatCanHaveFilters();
if (firstItem) {
- selectServer(firstItem);
+ selectFolder(firstItem.rootFolder);
}
window.tryToClose = onFilterClose;
}
/**
- * Called when a user selects a server in the list, so we can update the filters
+ * Called when a user selects a folder in the list, so we can update the filters
* that are displayed
*
- * @param aServer the nsIMsgIncomingServer that was selected
+ * @param aFolder the nsIMsgFolder that was selected
*/
-function onFilterServerClick(aServer)
+function onFilterFolderClick(aFolder)
{
- if (!aServer || aServer == gCurrentServer)
+ if (!aFolder || aFolder == gCurrentFolder)
return;
// Save the current filters to disk before switching because
// the dialog may be closed and we'll lose current filters.
gCurrentFilterList.saveToDefaultFile();
- selectServer(aServer);
+ selectFolder(aFolder);
}
function CanRunFiltersAfterTheFact(aServer)
@@ -145,14 +145,12 @@ function CanRunFiltersAfterTheFact(aServer)
return aServer.canSearchMessages;
}
-// roots the tree at the specified server
-function setServer(aServer)
+// roots the tree at the specified folder
+function setFolder(msgFolder)
{
- if (aServer == gCurrentServer)
+ if (msgFolder == gCurrentFolder)
return;
- var msgFolder = aServer.rootFolder;
-
//Calling getFilterList will detect any errors in rules.dat, backup the file, and alert the user
var filterList = msgFolder.getFilterList(gFilterListMsgWindow);
rebuildFilterList(filterList);
@@ -171,6 +169,7 @@ function setServer(aServer)
// for POP3 and IMAP, select the first folder, which is the INBOX
document.getElementById("runFiltersFolder").selectedIndex = 0;
+ runMenu.selectFolder(getFirstFolder(msgFolder));
}
else {
document.getElementById("runFiltersFolder").setAttribute("hidden", "true");
@@ -180,10 +179,9 @@ function setServer(aServer)
// Get the first folder for this server. INBOX for
// imap and pop accts and 1st news group for news.
- runMenu.selectFolder(getFirstFolder(msgFolder));
updateButtons();
- gCurrentServer = aServer;
+ gCurrentFolder = msgFolder;
}
function toggleFilter(aFilter, aIndex)
@@ -204,13 +202,13 @@ function toggleFilter(aFilter, aIndex)
}
// sets up the menulist and the filter list
-function selectServer(aServer)
+function selectFolder(aFolder)
{
// update the server menu
var serverMenu = document.getElementById("serverMenuPopup");
- serverMenu.selectFolder(aServer.rootFolder);
+ serverMenu.selectFolder(aFolder);
- setServer(aServer);
+ setFolder(aFolder);
}
function currentFilter()
diff --git a/mail/base/content/FilterListDialog.xul b/mail/base/content/FilterListDialog.xul
index c22a53f10c..62a47eb08e 100644
--- a/mail/base/content/FilterListDialog.xul
+++ b/mail/base/content/FilterListDialog.xul
@@ -71,8 +71,9 @@
accesskey="&filtersForPrefix.accesskey;" control="serverMenu"/>
diff --git a/mailnews/base/resources/content/folderWidgets.xml b/mailnews/base/resources/content/folderWidgets.xml
index 35532c8b6c..80ccad31b3 100644
--- a/mailnews/base/resources/content/folderWidgets.xml
+++ b/mailnews/base/resources/content/folderWidgets.xml
@@ -395,11 +395,43 @@
if (this._parentFolder)
folders = folders.sort(nameCompare);
+ /* In some cases, the user wants to have a list of subfolders for only
+ * some account types (or maybe all of them). So we use this to
+ * determine what the user wanted.
+ */
+ var shouldExpand;
+ var labels = null;
+ if (this.getAttribute("expandFolders") == "true" ||
+ !this.hasAttribute("expandFolders")) {
+ shouldExpand = function (e) { return true; };
+ } else if (this.getAttribute("expandFolders") == "false") {
+ shouldExpand = function (e) { return false; };
+ } else {
+ /* We want a subfolder list for only some servers. We also may need
+ * to create headers to select the servers. If so, then headlabels
+ * is a comma-delimited list of labels corresponding to the server
+ * types specified in expandFolders.
+ */
+ var types = this.getAttribute("expandFolders").split(/ *, */);
+ // Set the labels. labels[type] = label
+ if (this.hasAttribute("headlabels")) {
+ var labelNames = this.getAttribute("headlabels").split(/ *, */);
+ labels = {};
+ // If the length isn't equal, don't give them any of the labels,
+ // since any combination will probably be wrong.
+ if (labelNames.length == types.length) {
+ for (var index in types)
+ labels[types[index]] = labelNames[index];
+ }
+ }
+ shouldExpand = function (e) { return types.indexOf(e) != -1; };
+ }
+
for each (var folder in folders) {
var node;
// If we're going to add subFolders, we need to make menus, not
// menuitems.
- if (!folder.hasSubFolders || this.getAttribute("expandFolders") == "false") {
+ if (!folder.hasSubFolders || !shouldExpand(folder.server.type)) {
node = document.createElement("menuitem");
// Grumble, grumble, legacy code support
node.setAttribute("id", folder.URI);
@@ -411,8 +443,20 @@
node = document.createElement("menu");
node.setAttribute("class", "folderMenuItem menu-iconic");
this.appendChild(node);
+
+ // Create the submenu
var popup = this.cloneNode(true);
popup._teardown();
+
+ // If there are labels, add the labels now
+ if (labels) {
+ var serverNode = document.createElement("menuitem");
+ serverNode.setAttribute("label", labels[folder.server.type]);
+ serverNode._folder = folder;
+ popup.appendChild(serverNode);
+ popup.appendChild(document.createElement("menuseparator"));
+ }
+
node.appendChild(popup);
popup.parentFolder = folder;
}
@@ -625,6 +669,13 @@
this.parentNode.selectedIndex = i;
return;
}
+ // Is this a subfolder (that we expect to see)?
+ if (child.tagName == "menu" && child._folder.isAncestorOf(aFolder)) {
+ // If this is a subfolder of what's in question, we merely appear
+ // to select this node.
+ this.parentNode.setAttribute("label", aFolder.name);
+ return;
+ }
}
throw "unable to find folder to select!";
]]>