diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 17:32:43 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 17:32:43 +0000 |
commit | 6bf0a5cb5034a7e684dcc3500e841785237ce2dd (patch) | |
tree | a68f146d7fa01f0134297619fbe7e33db084e0aa /comm/mailnews/base/content/virtualFolderProperties.js | |
parent | Initial commit. (diff) | |
download | thunderbird-upstream.tar.xz thunderbird-upstream.zip |
Adding upstream version 1:115.7.0.upstream/1%115.7.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'comm/mailnews/base/content/virtualFolderProperties.js')
-rw-r--r-- | comm/mailnews/base/content/virtualFolderProperties.js | 383 |
1 files changed, 383 insertions, 0 deletions
diff --git a/comm/mailnews/base/content/virtualFolderProperties.js b/comm/mailnews/base/content/virtualFolderProperties.js new file mode 100644 index 0000000000..10429ec3d6 --- /dev/null +++ b/comm/mailnews/base/content/virtualFolderProperties.js @@ -0,0 +1,383 @@ +/* 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/. */ + +/* import-globals-from ../../search/content/searchTerm.js */ + +var gPickedFolder; +var gMailView = null; +var msgWindow; // important, don't change the name of this variable. it's really a global used by commandglue.js +var gSearchTermSession; // really an in memory temporary filter we use to read in and write out the search terms +var gSearchFolderURIs = ""; +var gMessengerBundle = null; +var gFolderBundle = null; +var gDefaultColor = ""; +var gMsgFolder; + +var { FolderTreeProperties } = ChromeUtils.import( + "resource:///modules/FolderTreeProperties.jsm" +); +var { FolderUtils } = ChromeUtils.import("resource:///modules/FolderUtils.jsm"); +var { MailServices } = ChromeUtils.import( + "resource:///modules/MailServices.jsm" +); +var { MailUtils } = ChromeUtils.import("resource:///modules/MailUtils.jsm"); +var { PluralForm } = ChromeUtils.importESModule( + "resource://gre/modules/PluralForm.sys.mjs" +); +var { VirtualFolderHelper } = ChromeUtils.import( + "resource:///modules/VirtualFolderWrapper.jsm" +); + +window.addEventListener("DOMContentLoaded", onLoad); + +document.addEventListener("dialogaccept", onOK); +document.addEventListener("dialogcancel", onCancel); + +function onLoad() { + var windowArgs = window.arguments[0]; + var acceptButton = document.querySelector("dialog").getButton("accept"); + + gMessengerBundle = Services.strings.createBundle( + "chrome://messenger/locale/messenger.properties" + ); + + gFolderBundle = Services.strings.createBundle( + "chrome://messenger/locale/folderWidgets.properties" + ); + + // call this when OK is pressed + msgWindow = windowArgs.msgWindow; // eslint-disable-line no-global-assign + + initializeSearchWidgets(); + + setSearchScope(Ci.nsMsgSearchScope.offlineMail); + if (windowArgs.editExistingFolder) { + acceptButton.label = document + .querySelector("dialog") + .getAttribute("editFolderAcceptButtonLabel"); + acceptButton.accesskey = document + .querySelector("dialog") + .getAttribute("editFolderAcceptButtonAccessKey"); + InitDialogWithVirtualFolder(windowArgs.folder); + } else { + // we are creating a new virtual folder + acceptButton.label = document + .querySelector("dialog") + .getAttribute("newFolderAcceptButtonLabel"); + acceptButton.accesskey = document + .querySelector("dialog") + .getAttribute("newFolderAcceptButtonAccessKey"); + // it is possible that we were given arguments to pre-fill the dialog with... + gSearchTermSession = Cc[ + "@mozilla.org/messenger/searchSession;1" + ].createInstance(Ci.nsIMsgSearchSession); + + if (windowArgs.searchTerms) { + // then add them to our search session + for (let searchTerm of windowArgs.searchTerms) { + gSearchTermSession.appendTerm(searchTerm); + } + } + if (windowArgs.folder) { + // pre select the folderPicker, based on what they selected in the folder pane + gPickedFolder = windowArgs.folder; + try { + document + .getElementById("msgNewFolderPopup") + .selectFolder(windowArgs.folder); + } catch (ex) { + document + .getElementById("msgNewFolderPicker") + .setAttribute("label", windowArgs.folder.prettyName); + } + + // if the passed in URI is not a server then pre-select it as the folder to search + if (!windowArgs.folder.isServer) { + gSearchFolderURIs = windowArgs.folder.URI; + } + } + + let folderNameField = document.getElementById("name"); + folderNameField.removeAttribute("hidden"); + folderNameField.focus(); + if (windowArgs.newFolderName) { + folderNameField.value = windowArgs.newFolderName; + } + if (windowArgs.searchFolderURIs) { + gSearchFolderURIs = windowArgs.searchFolderURIs; + } + + setupSearchRows(gSearchTermSession.searchTerms); + doEnabling(); // we only need to disable/enable the OK button for new virtual folders + } + + if (typeof windowArgs.searchOnline != "undefined") { + document.getElementById("searchOnline").checked = windowArgs.searchOnline; + } + updateOnlineSearchState(); + updateFoldersCount(); +} + +function setupSearchRows(aSearchTerms) { + if (aSearchTerms && aSearchTerms.length > 0) { + // Load the search terms for the folder. + initializeSearchRows(Ci.nsMsgSearchScope.offlineMail, aSearchTerms); + } else { + onMore(null); + } +} + +function updateOnlineSearchState() { + var enableCheckbox = false; + var checkbox = document.getElementById("searchOnline"); + // only enable the checkbox for selection, for online servers + var srchFolderUriArray = gSearchFolderURIs.split("|"); + if (srchFolderUriArray[0]) { + var realFolder = MailUtils.getOrCreateFolder(srchFolderUriArray[0]); + enableCheckbox = realFolder.server.offlineSupportLevel; // anything greater than 0 is an online server like IMAP or news + } + + if (enableCheckbox) { + checkbox.removeAttribute("disabled"); + } else { + checkbox.setAttribute("disabled", true); + checkbox.checked = false; + } +} + +function InitDialogWithVirtualFolder(aVirtualFolder) { + let virtualFolderWrapper = VirtualFolderHelper.wrapVirtualFolder( + window.arguments[0].folder + ); + gMsgFolder = window.arguments[0].folder; + + let styles = getComputedStyle(document.body); + let folderColors = { + Inbox: styles.getPropertyValue("--folder-color-inbox"), + Sent: styles.getPropertyValue("--folder-color-sent"), + Outbox: styles.getPropertyValue("--folder-color-outbox"), + Drafts: styles.getPropertyValue("--folder-color-draft"), + Trash: styles.getPropertyValue("--folder-color-trash"), + Archive: styles.getPropertyValue("--folder-color-archive"), + Templates: styles.getPropertyValue("--folder-color-template"), + Junk: styles.getPropertyValue("--folder-color-spam"), + Virtual: styles.getPropertyValue("--folder-color-folder-filter"), + RSS: styles.getPropertyValue("--folder-color-rss"), + Newsgroup: styles.getPropertyValue("--folder-color-newsletter"), + }; + gDefaultColor = styles.getPropertyValue("--folder-color-folder"); + + // when editing an existing folder, hide the folder picker that stores the parent location of the folder + document.getElementById("msgNewFolderPicker").collapsed = true; + let items = document.getElementsByClassName("chooseFolderLocation"); + for (let item of items) { + item.setAttribute("hidden", true); + } + let folderNameField = document.getElementById("existingName"); + folderNameField.removeAttribute("hidden"); + + // Show the icon color options. + document.getElementById("iconColorContainer").collapsed = false; + + let folderType = FolderUtils.getSpecialFolderString(gMsgFolder); + if (folderType in folderColors) { + gDefaultColor = folderColors[folderType]; + } + + let colorInput = document.getElementById("color"); + colorInput.value = + FolderTreeProperties.getColor(aVirtualFolder.URI) || gDefaultColor; + colorInput.addEventListener("input", event => { + // Preview the chosen color. + Services.obs.notifyObservers( + gMsgFolder, + "folder-color-preview", + colorInput.value + ); + }); + let resetColorButton = document.getElementById("resetColor"); + resetColorButton.addEventListener("click", function () { + colorInput.value = gDefaultColor; + // Preview the default color. + Services.obs.notifyObservers( + gMsgFolder, + "folder-color-preview", + gDefaultColor + ); + }); + + gSearchFolderURIs = virtualFolderWrapper.searchFolderURIs; + updateFoldersCount(); + document.getElementById("searchOnline").checked = + virtualFolderWrapper.onlineSearch; + gSearchTermSession = virtualFolderWrapper.searchTermsSession; + + setupSearchRows(gSearchTermSession.searchTerms); + + // set the name of the folder + let name = gFolderBundle.formatStringFromName("verboseFolderFormat", [ + aVirtualFolder.prettyName, + aVirtualFolder.server.prettyName, + ]); + folderNameField.setAttribute("value", name); + // update the window title based on the name of the saved search + document.title = gMessengerBundle.formatStringFromName( + "editVirtualFolderPropertiesTitle", + [aVirtualFolder.prettyName] + ); +} + +function onFolderPick(aEvent) { + gPickedFolder = aEvent.target._folder; + document.getElementById("msgNewFolderPopup").selectFolder(gPickedFolder); +} + +function onOK(event) { + var name = document.getElementById("name").value; + var searchOnline = document.getElementById("searchOnline").checked; + + if (!gSearchFolderURIs) { + Services.prompt.alert( + window, + null, + gMessengerBundle.GetStringFromName("alertNoSearchFoldersSelected") + ); + event.preventDefault(); + return; + } + + if (window.arguments[0].editExistingFolder) { + // update the search terms + gSearchTermSession.searchTerms = saveSearchTerms( + gSearchTermSession.searchTerms, + gSearchTermSession + ); + // save the settings + let virtualFolderWrapper = VirtualFolderHelper.wrapVirtualFolder( + window.arguments[0].folder + ); + virtualFolderWrapper.searchTerms = gSearchTermSession.searchTerms; + virtualFolderWrapper.searchFolders = gSearchFolderURIs; + virtualFolderWrapper.onlineSearch = searchOnline; + virtualFolderWrapper.cleanUpMessageDatabase(); + + MailServices.accounts.saveVirtualFolders(); + + let color = document.getElementById("color").value; + if (color == gDefaultColor) { + color = undefined; + } + FolderTreeProperties.setColor(gMsgFolder.URI, color); + // Tell 3-pane tabs to update the folder's color. + Services.obs.notifyObservers(gMsgFolder, "folder-color-changed", color); + + if (window.arguments[0].onOKCallback) { + window.arguments[0].onOKCallback(); + } + + return; + } + + var uri = gPickedFolder.URI; + if (name && uri) { + // create a new virtual folder + // check to see if we already have a folder with the same name and alert the user if so... + var parentFolder = MailUtils.getOrCreateFolder(uri); + + // sanity check the name based on the logic used by nsMsgBaseUtils.cpp. It can't start with a '.', it can't end with a '.', '~' or ' '. + // it can't contain a ';' or '#'. + if (/^\.|[\.\~ ]$|[\;\#]/.test(name)) { + Services.prompt.alert( + window, + null, + gMessengerBundle.GetStringFromName("folderCreationFailed") + ); + event.preventDefault(); + return; + } else if (parentFolder.containsChildNamed(name)) { + Services.prompt.alert( + window, + null, + gMessengerBundle.GetStringFromName("folderExists") + ); + event.preventDefault(); + return; + } + + gSearchTermSession.searchTerms = saveSearchTerms( + gSearchTermSession.searchTerms, + gSearchTermSession + ); + VirtualFolderHelper.createNewVirtualFolder( + name, + parentFolder, + gSearchFolderURIs, + gSearchTermSession.searchTerms, + searchOnline + ); + } +} + +function onCancel(event) { + if (gMsgFolder) { + // Clear any previewed color. + Services.obs.notifyObservers(gMsgFolder, "folder-color-preview"); + } +} + +function doEnabling() { + var acceptButton = document.querySelector("dialog").getButton("accept"); + acceptButton.disabled = !document.getElementById("name").value; +} + +function chooseFoldersToSearch() { + // if we have some search folders already, then root the folder picker dialog off the account + // for those folders. Otherwise fall back to the preselectedfolderURI which is the parent folder + // for this new virtual folder. + window.openDialog( + "chrome://messenger/content/virtualFolderListEdit.xhtml", + "", + "chrome,titlebar,modal,centerscreen,resizable", + { + searchFolderURIs: gSearchFolderURIs, + okCallback: onFolderListDialogCallback, + } + ); +} + +// callback routine from chooseFoldersToSearch +function onFolderListDialogCallback(searchFolderURIs) { + gSearchFolderURIs = searchFolderURIs; + updateFoldersCount(); + updateOnlineSearchState(); // we may have changed the server type we are searching... +} + +function updateFoldersCount() { + let srchFolderUriArray = gSearchFolderURIs.split("|"); + let folderCount = gSearchFolderURIs ? srchFolderUriArray.length : 0; + let foldersList = document.getElementById("chosenFoldersCount"); + foldersList.textContent = PluralForm.get( + folderCount, + gMessengerBundle.GetStringFromName("virtualFolderSourcesChosen") + ).replace("#1", folderCount); + if (folderCount > 0) { + let folderNames = []; + for (let folderURI of srchFolderUriArray) { + let folder = MailUtils.getOrCreateFolder(folderURI); + let name = this.gMessengerBundle.formatStringFromName( + "verboseFolderFormat", + [folder.prettyName, folder.server.prettyName] + ); + folderNames.push(name); + } + foldersList.setAttribute("tooltiptext", folderNames.join("\n")); + } else { + foldersList.removeAttribute("tooltiptext"); + } +} + +function onEnterInSearchTerm() { + // stub function called by the core search widget code... + // nothing for us to do here +} |