summaryrefslogtreecommitdiffstats
path: root/comm/suite/mailnews/content/msgViewPickerOverlay.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/suite/mailnews/content/msgViewPickerOverlay.js')
-rw-r--r--comm/suite/mailnews/content/msgViewPickerOverlay.js413
1 files changed, 413 insertions, 0 deletions
diff --git a/comm/suite/mailnews/content/msgViewPickerOverlay.js b/comm/suite/mailnews/content/msgViewPickerOverlay.js
new file mode 100644
index 0000000000..39b3286b5d
--- /dev/null
+++ b/comm/suite/mailnews/content/msgViewPickerOverlay.js
@@ -0,0 +1,413 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// menuitem value constants
+// tag views have kViewTagMarker + their key as value
+const kViewItemAll = 0;
+const kViewItemUnread = 1;
+const kViewItemTags = 2; // former labels used values 2-6
+const kViewItemNotDeleted = 3;
+const kViewItemVirtual = 7;
+const kViewItemCustomize = 8;
+const kViewItemFirstCustom = 9;
+
+const kViewCurrent = "current-view";
+const kViewCurrentTag = "current-view-tag";
+const kViewTagMarker = ":";
+
+var gMailViewList = null;
+var gCurrentViewValue = kViewItemAll;
+var gCurrentViewLabel = "";
+var gSaveDefaultSVTerms;
+
+var nsMsgSearchScope = Ci.nsMsgSearchScope;
+var nsMsgSearchAttrib = Ci.nsMsgSearchAttrib;
+var nsMsgSearchOp = Ci.nsMsgSearchOp;
+
+
+// perform the view/action requested by the aValue string
+// and set the view picker label to the aLabel string
+function ViewChange(aValue, aLabel)
+{
+ if (aValue == kViewItemCustomize || aValue == kViewItemVirtual)
+ {
+ // restore to the previous view value, in case they cancel
+ UpdateViewPicker(gCurrentViewValue, gCurrentViewLabel);
+ if (aValue == kViewItemCustomize)
+ LaunchCustomizeDialog();
+ else
+ {
+ gFolderTreeController.newVirtualFolder(gCurrentViewLabel,
+ gSaveDefaultSVTerms);
+ }
+ return;
+ }
+
+ // persist the view
+ gCurrentViewValue = aValue;
+ gCurrentViewLabel = aLabel;
+ SetMailViewForFolder(GetFirstSelectedMsgFolder(), gCurrentViewValue)
+ UpdateViewPicker(gCurrentViewValue, gCurrentViewLabel);
+
+ // tag menuitem values are of the form :<keyword>
+ if (isNaN(aValue))
+ {
+ // split off the tag key
+ var tagkey = aValue.substr(kViewTagMarker.length);
+ ViewTagKeyword(tagkey);
+ }
+ else
+ {
+ var numval = Number(aValue);
+ switch (numval)
+ {
+ case kViewItemAll: // View All
+ gDefaultSearchViewTerms = null;
+ break;
+ case kViewItemUnread: // Unread
+ ViewNewMail();
+ break;
+ case kViewItemNotDeleted: // Not deleted
+ ViewNotDeletedMail();
+ break;
+ default:
+ // for legacy reasons, custom views start at index 9
+ LoadCustomMailView(numval - kViewItemFirstCustom);
+ break;
+ }
+ }
+ gSaveDefaultSVTerms = gDefaultSearchViewTerms;
+ onEnterInSearchBar();
+ gQSViewIsDirty = true;
+}
+
+
+function ViewChangeByMenuitem(aMenuitem)
+{
+ // Mac View menu menuitems don't have XBL bindings
+ ViewChange(aMenuitem.getAttribute("value"), aMenuitem.getAttribute("label"));
+}
+
+
+function ViewChangeByValue(aValue)
+{
+ ViewChange(aValue, GetLabelForValue(aValue));
+}
+
+function ViewChangeByFolder(aFolder)
+{
+ var result = GetMailViewForFolder(aFolder);
+ ViewChangeByValue(result);
+}
+
+function GetLabelForValue(aValue)
+{
+ var label = "";
+ var viewPickerPopup = document.getElementById("viewPickerPopup");
+ if (viewPickerPopup)
+ {
+ // grab the label for the menulist from one of its menuitems
+ var selectedItems = viewPickerPopup.getElementsByAttribute("value", aValue);
+ if (!selectedItems || !selectedItems.length)
+ {
+ // we may have a new item
+ RefreshAllViewPopups(viewPickerPopup);
+ selectedItems = viewPickerPopup.getElementsByAttribute("value", aValue);
+ }
+ label = selectedItems && selectedItems.length && selectedItems.item(0).getAttribute("label");
+ }
+ return label;
+}
+
+function UpdateViewPickerByValue(aValue)
+{
+ UpdateViewPicker(aValue, GetLabelForValue(aValue));
+}
+
+function UpdateViewPicker(aValue, aLabel)
+{
+ var viewPicker = document.getElementById("viewPicker");
+ if (viewPicker)
+ {
+ viewPicker.value = aValue;
+ viewPicker.setAttribute("label", aLabel);
+ }
+}
+
+function GetFolderInfo(aFolder)
+{
+ try
+ {
+ var db = aFolder.msgDatabase;
+ if (db)
+ return db.dBFolderInfo;
+ }
+ catch (ex) {}
+ return null;
+}
+
+
+function GetMailViewForFolder(aFolder)
+{
+ var val = "";
+ var folderInfo = GetFolderInfo(aFolder);
+ if (folderInfo)
+ {
+ val = folderInfo.getCharProperty(kViewCurrentTag);
+ if (!val)
+ {
+ // no new view value, thus using the old
+ var numval = folderInfo.getUint32Property(kViewCurrent, kViewItemAll);
+ // and migrate it, if it's a former label view (label views used values 2-6)
+ if ((kViewItemTags <= numval) && (numval < kViewItemVirtual))
+ val = kViewTagMarker + "$label" + (val - 1);
+ else
+ val = numval;
+ }
+ }
+ return val;
+}
+
+
+function SetMailViewForFolder(aFolder, aValue)
+{
+ var folderInfo = GetFolderInfo(aFolder);
+ if (folderInfo)
+ {
+ // we can't map tags back to labels in general,
+ // so set view to all for backwards compatibility in this case
+ folderInfo.setUint32Property (kViewCurrent, isNaN(aValue) ? kViewItemAll : aValue);
+ folderInfo.setCharProperty(kViewCurrentTag, aValue);
+ }
+}
+
+
+function LaunchCustomizeDialog()
+{
+ OpenOrFocusWindow({}, "mailnews:mailviewlist", "chrome://messenger/content/mailViewList.xul");
+}
+
+
+function LoadCustomMailView(index)
+{
+ PrepareForViewChange();
+ var searchTermsArrayForQS = CreateGroupedSearchTerms(gMailViewList.getMailViewAt(index).searchTerms);
+ createSearchTermsWithList(searchTermsArrayForQS);
+ AddVirtualFolderTerms(searchTermsArrayForQS);
+ gDefaultSearchViewTerms = searchTermsArrayForQS;
+}
+
+
+function ViewTagKeyword(keyword)
+{
+ PrepareForViewChange();
+
+ // create an i supports array to store our search terms
+ var searchTermsArray = Cc["@mozilla.org/array;1"]
+ .createInstance(Ci.nsIMutableArray);
+ var term = gSearchSession.createTerm();
+ var value = term.value;
+
+ value.str = keyword;
+ value.attrib = nsMsgSearchAttrib.Keywords;
+ term.value = value;
+ term.attrib = nsMsgSearchAttrib.Keywords;
+ term.op = nsMsgSearchOp.Contains;
+ term.booleanAnd = true;
+
+ searchTermsArray.appendElement(term);
+ AddVirtualFolderTerms(searchTermsArray);
+ createSearchTermsWithList(searchTermsArray);
+ gDefaultSearchViewTerms = searchTermsArray;
+}
+
+
+function ViewNewMail()
+{
+ PrepareForViewChange();
+
+ // create an i supports array to store our search terms
+ var searchTermsArray = Cc["@mozilla.org/array;1"]
+ .createInstance(Ci.nsIMutableArray);
+ var term = gSearchSession.createTerm();
+ var value = term.value;
+
+ value.status = 1;
+ value.attrib = nsMsgSearchAttrib.MsgStatus;
+ term.value = value;
+ term.attrib = nsMsgSearchAttrib.MsgStatus;
+ term.op = nsMsgSearchOp.Isnt;
+ term.booleanAnd = true;
+ searchTermsArray.appendElement(term);
+
+ AddVirtualFolderTerms(searchTermsArray);
+
+ createSearchTermsWithList(searchTermsArray);
+ // not quite right - these want to be just the view terms...but it might not matter.
+ gDefaultSearchViewTerms = searchTermsArray;
+}
+
+
+function ViewNotDeletedMail()
+{
+ PrepareForViewChange();
+
+ // create an i supports array to store our search terms
+ var searchTermsArray = Cc["@mozilla.org/array;1"]
+ .createInstance(Ci.nsIMutableArray);
+ var term = gSearchSession.createTerm();
+ var value = term.value;
+
+ value.status = 0x00200000;
+ value.attrib = nsMsgSearchAttrib.MsgStatus;
+ term.value = value;
+ term.attrib = nsMsgSearchAttrib.MsgStatus;
+ term.op = nsMsgSearchOp.Isnt;
+ term.booleanAnd = true;
+ searchTermsArray.appendElement(term);
+
+ AddVirtualFolderTerms(searchTermsArray);
+
+ createSearchTermsWithList(searchTermsArray);
+ // not quite right - these want to be just the view terms...but it might not matter.
+ gDefaultSearchViewTerms = searchTermsArray;
+}
+
+
+function AddVirtualFolderTerms(searchTermsArray)
+{
+ // add in any virtual folder terms
+ var virtualFolderSearchTerms = (gVirtualFolderTerms || gXFVirtualFolderTerms);
+ if (virtualFolderSearchTerms)
+ {
+ for (let virtualFolderSearchTerm of virtualFolderSearchTerms)
+ {
+ searchTermsArray.appendElement(virtualFolderSearchTerm);
+ }
+ }
+}
+
+
+function PrepareForViewChange()
+{
+ // this is a problem - it saves the current view in gPreQuickSearchView
+ // then we eventually call onEnterInSearchBar, and we think we need to restore the pre search view!
+ initializeSearchBar();
+ ClearThreadPaneSelection();
+ ClearMessagePane();
+}
+
+
+// refresh view popup and its subpopups
+function RefreshAllViewPopups(aViewPopup)
+{
+ var menupopups = aViewPopup.getElementsByTagName("menupopup");
+ if (menupopups.length > 1)
+ {
+ // when we have menupopups, we assume both tags and custom views are there
+ RefreshTagsPopup(menupopups[0]);
+ RefreshCustomViewsPopup(menupopups[1]);
+ }
+}
+
+
+function RefreshViewPopup(aViewPopup)
+{
+ // mark default views if selected
+ let viewAll = aViewPopup.getElementsByAttribute("value", kViewItemAll)[0];
+ viewAll.setAttribute("checked", gCurrentViewValue == kViewItemAll);
+ let viewUnread =
+ aViewPopup.getElementsByAttribute("value", kViewItemUnread)[0];
+ viewUnread.setAttribute("checked", gCurrentViewValue == kViewItemUnread);
+
+ let viewNotDeleted =
+ aViewPopup.getElementsByAttribute("value", kViewItemNotDeleted)[0];
+ var folderArray = GetSelectedMsgFolders();
+ if (folderArray.length == 0)
+ return;
+
+ // Only show the "Not Deleted" item for IMAP servers
+ // that are using the IMAP delete model.
+ viewNotDeleted.setAttribute("hidden", true);
+ var msgFolder = folderArray[0];
+ var server = msgFolder.server;
+ if (server.type == "imap")
+ {
+ let imapServer =
+ server.QueryInterface(Ci.nsIImapIncomingServer);
+ if (imapServer.deleteModel == Ci.nsMsgImapDeleteModels.IMAPDelete)
+ {
+ viewNotDeleted.setAttribute("hidden", false);
+ viewNotDeleted.setAttribute("checked",
+ gCurrentViewValue == kViewItemNotDeleted);
+ }
+ }
+}
+
+
+function RefreshCustomViewsPopup(aMenupopup)
+{
+ // for each mail view in the msg view list, add an entry in our combo box
+ if (!gMailViewList)
+ gMailViewList = Cc["@mozilla.org/messenger/mailviewlist;1"]
+ .getService(Ci.nsIMsgMailViewList);
+ // remove all menuitems
+ while (aMenupopup.hasChildNodes())
+ aMenupopup.lastChild.remove();
+
+ // now rebuild the list
+ var currentView = isNaN(gCurrentViewValue) ? kViewItemAll : Number(gCurrentViewValue);
+ var numItems = gMailViewList.mailViewCount;
+ for (var i = 0; i < numItems; ++i)
+ {
+ var viewInfo = gMailViewList.getMailViewAt(i);
+ var menuitem = document.createElement("menuitem");
+ menuitem.setAttribute("label", viewInfo.prettyName);
+ menuitem.setAttribute("value", kViewItemFirstCustom + i);
+ menuitem.setAttribute("name", "viewmessages");
+ menuitem.setAttribute("type", "radio");
+ if (kViewItemFirstCustom + i == currentView)
+ menuitem.setAttribute("checked", true);
+ aMenupopup.appendChild(menuitem);
+ }
+}
+
+
+function RefreshTagsPopup(aMenupopup)
+{
+ // remove all menuitems
+ while (aMenupopup.hasChildNodes())
+ aMenupopup.lastChild.remove();
+
+ // create tag menuitems
+ var currentTagKey = isNaN(gCurrentViewValue) ? gCurrentViewValue.substr(kViewTagMarker.length) : "";
+ var tagArray = MailServices.tags.getAllTags();
+ for (var i = 0; i < tagArray.length; ++i)
+ {
+ var tagInfo = tagArray[i];
+ var menuitem = document.createElement("menuitem");
+ menuitem.setAttribute("label", tagInfo.tag);
+ menuitem.setAttribute("value", kViewTagMarker + tagInfo.key);
+ menuitem.setAttribute("name", "viewmessages");
+ menuitem.setAttribute("type", "radio");
+ if (tagInfo.key == currentTagKey)
+ menuitem.setAttribute("checked", true);
+ var color = tagInfo.color;
+ if (color)
+ menuitem.setAttribute("class", "lc-" + color.substr(1));
+ aMenupopup.appendChild(menuitem);
+ }
+}
+
+
+function ViewPickerOnLoad()
+{
+ var viewPickerPopup = document.getElementById("viewPickerPopup");
+ if (viewPickerPopup)
+ RefreshAllViewPopups(viewPickerPopup);
+}
+
+
+window.addEventListener("load", ViewPickerOnLoad);