releases-comm-central/mail/modules/MailViewManager.sys.mjs

169 строки
5.4 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/. */
/**
* 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.
*/
export 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).
*/
export var MailViewManager = {
_views: {},
_customMailViews: Cc["@mozilla.org/messenger/mailviewlist;1"].getService(
Ci.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 {object} aViewDef - The view definition.
* @param {string} aViewDef.name - Name for the view, for debugging
* purposes only. This should not be localized!
* @param {integer} aViewDef.index - The index to assign to the view.
* @param {Function} aViewDef.makeTerms - A function to invoke that returns
* a list of search terms.
*/
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(aCustomViewIndex) {
const mailView = this._customMailViews.getMailViewAt(aCustomViewIndex);
return {
name: mailView.prettyName, // since the user created it it's localized
index: aCustomViewIndex,
makeTerms() {
return mailView.searchTerms;
},
};
},
_findCustomViewByName(aName) {
const count = this._customMailViews.mailViewCount;
for (let i = 0; i < count; i++) {
const 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 {integer|string} 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(aViewIndex) {
if (typeof aViewIndex == "string") {
return this._findCustomViewByName(aViewIndex);
}
if (aViewIndex < MailViewConstants.kViewItemFirstCustom) {
return this._views[aViewIndex];
}
return this._wrapCustomView(
aViewIndex - MailViewConstants.kViewItemFirstCustom
);
},
};
MailViewManager.defineView({
name: "all mail", // debugging assistance only! not localized!
index: MailViewConstants.kViewItemAll,
makeTerms() {
return null;
},
});
MailViewManager.defineView({
name: "new mail / unread", // debugging assistance only! not localized!
index: MailViewConstants.kViewItemUnread,
makeTerms(aSession) {
const term = aSession.createTerm();
const value = term.value;
value.status = Ci.nsMsgMessageFlags.Read;
value.attrib = Ci.nsMsgSearchAttrib.MsgStatus;
term.value = value;
term.attrib = Ci.nsMsgSearchAttrib.MsgStatus;
term.op = Ci.nsMsgSearchOp.Isnt;
term.booleanAnd = true;
return [term];
},
});
MailViewManager.defineView({
name: "tags", // debugging assistance only! not localized!
index: MailViewConstants.kViewItemTags,
makeTerms(aSession, aKeyword) {
const term = aSession.createTerm();
const value = term.value;
value.str = aKeyword;
value.attrib = Ci.nsMsgSearchAttrib.Keywords;
term.value = value;
term.attrib = Ci.nsMsgSearchAttrib.Keywords;
term.op = Ci.nsMsgSearchOp.Contains;
term.booleanAnd = true;
return [term];
},
});
MailViewManager.defineView({
name: "not deleted", // debugging assistance only! not localized!
index: MailViewConstants.kViewItemNotDeleted,
makeTerms(aSession) {
const term = aSession.createTerm();
const value = term.value;
value.status = Ci.nsMsgMessageFlags.IMAPDeleted;
value.attrib = Ci.nsMsgSearchAttrib.MsgStatus;
term.value = value;
term.attrib = Ci.nsMsgSearchAttrib.MsgStatus;
term.op = Ci.nsMsgSearchOp.Isnt;
term.booleanAnd = true;
return [term];
},
});