Files
binoc-central-mirror/mail/modules/mailViewManager.js
T
2020-05-10 13:52:36 -04:00

177 lines
5.9 KiB
JavaScript

/* 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/. */
this.EXPORTED_SYMBOLS = ['MailViewManager', 'MailViewConstants'];
var Cc = Components.classes;
var Ci = Components.interfaces;
var Cr = Components.results;
var Cu = Components.utils;
var nsMsgSearchScope = Ci.nsMsgSearchScope;
var nsMsgSearchAttrib = Ci.nsMsgSearchAttrib;
var nsMsgSearchOp = Ci.nsMsgSearchOp;
var nsMsgMessageFlags = Ci.nsMsgMessageFlags;
/**
* Put the MailViewConstants in an object so we can export them to
* msgViewPickerOverlay in one blob without contaminating everyone's address
* space who might want to import us.
*/
var MailViewConstants = {
// tag views have kViewTagMarker + their key as value
kViewItemAll: 0,
kViewItemUnread: 1,
kViewItemTags: 2, // former labels used values 2-6
kViewItemNotDeleted: 3,
// not a real view! a sentinel value to pop up a dialog
kViewItemVirtual: 7,
// not a real view! a sentinel value to pop up a dialog
kViewItemCustomize: 8,
kViewItemFirstCustom: 9,
kViewCurrent: "current-view",
kViewCurrentTag: "current-view-tag",
kViewTagMarker: ":",
};
/**
* MailViews are view 'filters' implemented using search terms. DBViewWrapper
* uses the SearchSpec class to combine the search terms of the mailview with
* those of the virtual folder (if applicable) and the quicksearch (if
* applicable).
*/
var MailViewManager = {
_views: {},
_customMailViews: Cc["@mozilla.org/messenger/mailviewlist;1"]
.getService(Components.interfaces.nsIMsgMailViewList),
/**
* Define one of the built-in mail-views. If you want to define your own
* view, you need to define a custom view using nsIMsgMailViewList.
*
* We define our own little view definition abstraction because some day this
* functionality may want to be generalized to be usable by gloda as well.
*
* @param aViewDef The view definition, three attributes are required:
* - name: A string name for the view, for debugging purposes only. This
* should not be localized!
* - index: The index to assign to the view.
* - makeTerms: A function to invoke that returns a list of search terms.
*/
defineView: function MailViewManager_defineView(aViewDef) {
this._views[aViewDef.index] = aViewDef;
},
/**
* Wrap a custom view into our cute little view abstraction. We do not cache
* these because views should not change often enough for it to matter from
* a performance perspective, but they will change enough to make stale
* caches a potential issue.
*/
_wrapCustomView: function MailViewManager_wrapCustomView(aCustomViewIndex) {
let mailView = this._customMailViews.getMailViewAt(aCustomViewIndex);
return {
name: mailView.prettyName, // since the user created it it's localized
index: aCustomViewIndex,
makeTerms: function(aSession, aData) {
return mailView.searchTerms;
}
};
},
_findCustomViewByName: function MailViewManager_findCustomViewByName(aName) {
let count = this._customMailViews.mailViewCount;
for (let i = 0; i < count; i++) {
let mailView = this._customMailViews.getMailViewAt(i);
if (mailView.mailViewName == aName)
return this._wrapCustomView(i);
}
throw new Error("No custom view with name: " + aName);
},
/**
* Return the view definition associated with the given view index.
*
* @param aViewIndex If the value is an integer it references the built-in
* view with the view index from MailViewConstants, or if the index
* is >= MailViewConstants.kViewItemFirstCustom, it is a reference to
* a custom view definition. If the value is a string, it is the name
* of a custom view. The string case is mainly intended for testing
* purposes.
*/
getMailViewByIndex: function MailViewManager_getMailViewByIndex(aViewIndex) {
if (typeof(aViewIndex) == "string")
return this._findCustomViewByName(aViewIndex);
if (aViewIndex < MailViewConstants.kViewItemFirstCustom)
return this._views[aViewIndex];
else
return this._wrapCustomView(aViewIndex -
MailViewConstants.kViewItemFirstCustom);
},
};
MailViewManager.defineView({
name: "all mail", // debugging assistance only! not localized!
index: MailViewConstants.kViewItemAll,
makeTerms: function(aSession, aData) {
return null;
}
});
MailViewManager.defineView({
name: "new mail / unread", // debugging assistance only! not localized!
index: MailViewConstants.kViewItemUnread,
makeTerms: function(aSession, aData) {
let term = aSession.createTerm();
let value = term.value;
value.status = nsMsgMessageFlags.Read;
value.attrib = nsMsgSearchAttrib.MsgStatus;
term.value = value;
term.attrib = nsMsgSearchAttrib.MsgStatus;
term.op = nsMsgSearchOp.Isnt;
term.booleanAnd = true;
return [term];
}
});
MailViewManager.defineView({
name: "tags", // debugging assistance only! not localized!
index: MailViewConstants.kViewItemTags,
makeTerms: function(aSession, aKeyword) {
let term = aSession.createTerm();
let value = term.value;
value.str = aKeyword;
value.attrib = nsMsgSearchAttrib.Keywords;
term.value = value;
term.attrib = nsMsgSearchAttrib.Keywords;
term.op = nsMsgSearchOp.Contains;
term.booleanAnd = true;
return [term];
}
});
MailViewManager.defineView({
name: "not deleted", // debugging assistance only! not localized!
index: MailViewConstants.kViewItemNotDeleted,
makeTerms: function(aSession, aKeyword) {
let term = aSession.createTerm();
let value = term.value;
value.status = nsMsgMessageFlags.IMAPDeleted;
value.attrib = nsMsgSearchAttrib.MsgStatus;
term.value = value;
term.attrib = nsMsgSearchAttrib.MsgStatus;
term.op = nsMsgSearchOp.Isnt;
term.booleanAnd = true;
return [term];
}
});