mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-20 07:17:32 +09:00
178 lines
5 KiB
JavaScript
178 lines
5 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 file is charged with providing you a way to have a pretty gloda-backed
|
|
* nsIMsgDBView.
|
|
*/
|
|
|
|
this.EXPORTED_SYMBOLS = ["GlodaSyntheticView"];
|
|
|
|
var Cc = Components.classes;
|
|
var Ci = Components.interfaces;
|
|
var Cr = Components.results;
|
|
var Cu = Components.utils;
|
|
|
|
Cu.import("resource://gre/modules/Services.jsm");
|
|
Cu.import("resource:///modules/gloda/log4moz.js");
|
|
|
|
Cu.import("resource:///modules/gloda/public.js");
|
|
Cu.import("resource:///modules/gloda/msg_search.js");
|
|
|
|
/**
|
|
* Create a synthetic view suitable for passing to |FolderDisplayWidget.show|.
|
|
* You must pass a query, collection, or conversation in.
|
|
*
|
|
* @param {GlodaQuery} [aArgs.query] A gloda query to run.
|
|
* @param {GlodaCollection} [aArgs.collection] An already-populated collection
|
|
* to display. Do not call getCollection on a query and hand us that. We
|
|
* will not register ourselves as a listener and things will not work.
|
|
* @param {GlodaConversation} [aArgs.conversation] A conversation whose messages
|
|
* you want to display.
|
|
*/
|
|
function GlodaSyntheticView(aArgs) {
|
|
if ("query" in aArgs) {
|
|
this.query = aArgs.query;
|
|
this.collection = this.query.getCollection(this);
|
|
this.completed = false;
|
|
this.viewType = "global";
|
|
}
|
|
else if ("collection" in aArgs) {
|
|
this.query = null;
|
|
this.collection = aArgs.collection;
|
|
this.completed = true;
|
|
this.viewType = "global";
|
|
}
|
|
else if ("conversation" in aArgs) {
|
|
this.collection = aArgs.conversation.getMessagesCollection(this);
|
|
this.query = this.collection.query;
|
|
this.completed = false;
|
|
this.viewType = "conversation";
|
|
}
|
|
else {
|
|
throw new Error("You need to pass a query or collection");
|
|
}
|
|
|
|
this.customColumns = [];
|
|
}
|
|
GlodaSyntheticView.prototype = {
|
|
defaultSort: [[Ci.nsMsgViewSortType.byDate, Ci.nsMsgViewSortOrder.descending]],
|
|
|
|
/**
|
|
* Request the search be performed and notification provided to
|
|
* aSearchListener. If results are already available, they should
|
|
* be provided to aSearchListener without re-performing the search.
|
|
*/
|
|
search: function(aSearchListener, aCompletionCallback) {
|
|
this.searchListener = aSearchListener;
|
|
this.completionCallback = aCompletionCallback;
|
|
|
|
this.searchListener.onNewSearch();
|
|
if (this.completed) {
|
|
this.reportResults(this.collection.items);
|
|
// we're not really aborting, but it closes things out nicely
|
|
this.abortSearch();
|
|
return;
|
|
}
|
|
},
|
|
|
|
abortSearch: function() {
|
|
if (this.searchListener)
|
|
this.searchListener.onSearchDone(Cr.NS_OK);
|
|
if (this.completionCallback)
|
|
this.completionCallback();
|
|
this.searchListener = null;
|
|
this.completionCallback = null;
|
|
},
|
|
|
|
reportResults: function(aItems) {
|
|
for (let item of aItems) {
|
|
let hdr = item.folderMessage;
|
|
if (hdr)
|
|
this.searchListener.onSearchHit(hdr, hdr.folder);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Helper function used by |DBViewWrapper.getMsgHdrForMessageID| since there
|
|
* are no actual backing folders for it to check.
|
|
*/
|
|
getMsgHdrForMessageID: function(aMessageId) {
|
|
for (let item of this.collection.items) {
|
|
if (item.headerMessageID == aMessageId) {
|
|
let hdr = item.folderMessage;
|
|
if (hdr)
|
|
return hdr;
|
|
}
|
|
}
|
|
return null;
|
|
},
|
|
|
|
/**
|
|
* The default set of columns to show.
|
|
*/
|
|
DEFAULT_COLUMN_STATES: {
|
|
threadCol: {
|
|
visible: true,
|
|
},
|
|
flaggedCol: {
|
|
visible: true,
|
|
},
|
|
subjectCol: {
|
|
visible: true,
|
|
},
|
|
correspondentCol: {
|
|
visible: Services.prefs.getBoolPref("mail.threadpane.use_correspondents"),
|
|
},
|
|
senderCol: {
|
|
visible: !Services.prefs.getBoolPref("mail.threadpane.use_correspondents"),
|
|
},
|
|
dateCol: {
|
|
visible: true,
|
|
},
|
|
locationCol: {
|
|
visible: true,
|
|
},
|
|
},
|
|
|
|
// --- settings persistence
|
|
getPersistedSetting: function(aSetting) {
|
|
try {
|
|
return JSON.parse(Services.prefs.getCharPref(
|
|
"mailnews.database.global.views." + this.viewType + "." + aSetting
|
|
));
|
|
}
|
|
catch (e) {
|
|
return this.getDefaultSetting(aSetting);
|
|
}
|
|
},
|
|
setPersistedSetting: function(aSetting, aValue) {
|
|
Services.prefs.setCharPref(
|
|
"mailnews.database.global.views." + this.viewType + "." + aSetting,
|
|
JSON.stringify(aValue)
|
|
);
|
|
},
|
|
getDefaultSetting: function(aSetting) {
|
|
if (aSetting == "columns")
|
|
return this.DEFAULT_COLUMN_STATES;
|
|
else
|
|
return undefined;
|
|
},
|
|
|
|
// --- collection listener
|
|
onItemsAdded: function(aItems, aCollection) {
|
|
if (this.searchListener)
|
|
this.reportResults(aItems);
|
|
},
|
|
onItemsModified: function(aItems, aCollection) {
|
|
},
|
|
onItemsRemoved: function(aItems, aCollection) {
|
|
},
|
|
onQueryCompleted: function(aCollection) {
|
|
this.completed = true;
|
|
this.searchListener.onSearchDone(Cr.NS_OK);
|
|
if (this.completionCallback)
|
|
this.completionCallback();
|
|
},
|
|
};
|