diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..44ce34d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +web-ext-artifacts diff --git a/webextension/_locales/de/messages.json b/_locales/de/messages.json similarity index 90% rename from webextension/_locales/de/messages.json rename to _locales/de/messages.json index c4a676a..9c66f4c 100644 --- a/webextension/_locales/de/messages.json +++ b/_locales/de/messages.json @@ -16,5 +16,8 @@ }, "maxRecentFolders.title": { "message": "Ändert die Anzahl der zuletzt verwendeten Ordner, die angezeigt werden wenn kein Suchtext eingegeben wurde." + }, + "noResults": { + "message": "" } } diff --git a/webextension/_locales/en/messages.json b/_locales/en/messages.json similarity index 90% rename from webextension/_locales/en/messages.json rename to _locales/en/messages.json index 5f9b865..e5ceff2 100644 --- a/webextension/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -16,5 +16,8 @@ }, "maxRecentFolders.title": { "message": "Changes the number of recent folders shown when no search text is entered." + }, + "noResults": { + "message": "" } } diff --git a/webextension/_locales/ru/messages.json b/_locales/ru/messages.json similarity index 89% rename from webextension/_locales/ru/messages.json rename to _locales/ru/messages.json index 4593e0f..9b08f4a 100644 --- a/webextension/_locales/ru/messages.json +++ b/_locales/ru/messages.json @@ -16,5 +16,8 @@ }, "maxRecentFolders.title": { "message": "Изменяет количество последних папок, что отображаются, если не введен текст в поле поиска" + }, + "noResults": { + "message": "<Результаты отсутствуют>" } } diff --git a/webextension/_locales/uk/messages.json b/_locales/uk/messages.json similarity index 90% rename from webextension/_locales/uk/messages.json rename to _locales/uk/messages.json index 348ce4f..bf0aa62 100644 --- a/webextension/_locales/uk/messages.json +++ b/_locales/uk/messages.json @@ -16,5 +16,8 @@ }, "maxRecentFolders.title": { "message": "Змінює кількість останніх папок, що відображуються, коли не ввдено жодного тексту в поле пошуку." + }, + "noResults": { + "message": "<Результати відсутні>" } } diff --git a/bootstrap.js b/bootstrap.js new file mode 100644 index 0000000..6b6929b --- /dev/null +++ b/bootstrap.js @@ -0,0 +1,256 @@ +/* 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/. + * Portions Copyright (C) Philipp Kewisch, 2019 */ + +var { ExtensionSupport } = ChromeUtils.import( + "resource:///modules/ExtensionSupport.jsm" +); + +var { Services } = ChromeUtils.import( + "resource://gre/modules/Services.jsm" +); + +/* exported startup, shutdown, install, uninstall */ + +function initScript(window, document) { + Services.scriptloader.loadSubScript("chrome://quickmove/content/quickmove.js", window); + window.quickmove.cleanup.push(() => { + delete window.quickmove; + }); +} + +function initCSS(window, document) { + let link = document.createElementNS( + "http://www.w3.org/1999/xhtml", + "link" + ); + + link.setAttribute("id", "quickmove-styles"); + link.setAttribute("rel", "stylesheet"); + link.setAttribute("type", "text/css"); + link.setAttribute("href", "chrome://quickmove/content/quickmove.css"); + + document.documentElement.appendChild(link); + window.quickmove.cleanup.push(() => { + document.getElementById("quickmove-styles").remove(); + }); +} + +function initKeys(window, document) { + document.getElementById("mainPopupSet").appendChild( + window.MozXULElement.parseXULToFragment(` + + + + + + + + + + + + + `) + ); + + document.getElementById("mailKeys").appendChild( + window.MozXULElement.parseXULToFragment(` + + + + + + `) + ); + + window.quickmove.cleanup.push(() => { + document.getElementById("quickmove-keyset").remove(); + document.getElementById("quickmove-menupopup").remove(); + document.getElementById("quickmove-copy-menupopup").remove(); + document.getElementById("quickmove-goto-menupopup").remove(); + }); +} + +function initButtonFile(window, document) { + let buttonFile = document.getElementById("button-file") || + document.getElementById("mail-toolbox").palette.querySelector("#button-file"); + + let buttonFilePopup = window.MozXULElement.parseXULToFragment(` + + + + + `); + + let menupopup = buttonFile.querySelector("#button-filePopup"); + + buttonFilePopup.oldPopup = buttonFile.replaceChild(buttonFilePopup, menupopup); + + window.quickmove.cleanup.push(() => { + buttonFile = document.getElementById("button-file") || + document.getElementById("mail-toolbox").palette.querySelector("#button-file"); + + let popup = buttonFile.querySelector("#quickmove-filebutton-menupopup"); + popup.parentNode.replaceChild(popup.oldPopup, popup); + }); +} + +function initContextMenus(window, document) { + let moveMenu = document.getElementById("mailContext-moveMenu"); + let quickMoveFileHere = window.MozXULElement.parseXULToFragment(` + + + + + `); + + let oldMovePopup = moveMenu.replaceChild(quickMoveFileHere, moveMenu.menupopup); + + let copyMenu = document.getElementById("mailContext-copyMenu"); + let quickMoveCopyHere = window.MozXULElement.parseXULToFragment(` + + + + + `); + + let oldCopyPopup = copyMenu.replaceChild(quickMoveCopyHere, copyMenu.menupopup); + + window.quickmove.cleanup.push(() => { + quickMoveFileHere = document.getElementById("quickmove-context-menupopup"); + quickMoveFileHere.parentNode.replaceChild(oldMovePopup, quickMoveFileHere); + + quickMoveCopyHere = document.getElementById("quickmove-context-copy-menupopup"); + quickMoveCopyHere.parentNode.replaceChild(oldCopyPopup, quickMoveCopyHere); + }); +} + +function initFolderLocation(window, document) { + let quickmoveLocationPopup = window.MozXULElement.parseXULToFragment(` + + + + + `); + + let palette = document.getElementById("mail-toolbox").palette; + + let folderLocationPopup = document.getElementById("folderLocationPopup") || + palette.querySelector("#folderLocationPopup"); + folderLocationPopup.setAttribute("hidden", "true"); + + let locationFolders = document.getElementById("locationFolders") || + palette.querySelector("#locationFolders"); + locationFolders.appendChild(quickmoveLocationPopup); + + window.quickmove.cleanup.push(() => { + folderLocationPopup = document.getElementById("folderLocationPopup") || + palette.querySelector("#folderLocationPopup"); + folderLocationPopup.removeAttribute("hidden"); + + quickmoveLocationPopup = document.getElementById("quickmove-folderlocation-menupopup") || + palette.querySelector("#quickmove-folderlocation-menupopup"); + quickmoveLocationPopup.remove(); + }); +} + +function startup(data, reason) { + ExtensionSupport.registerWindowListener("quickmove", { + chromeURLs: [ + "chrome://messenger/content/messageWindow.xul", + "chrome://messenger/content/messenger.xul" + ], + onLoadWindow: async function(window) { + let document = window.document; + + initScript(window, document); + initCSS(window, document); + initKeys(window, document); + + initButtonFile(window, document); + initContextMenus(window, document); + + if (window.location.href == "chrome://messenger/content/messageWindow.xul") { + document.getElementById("quickmove-goto").remove(); + } else if (window.location.href == "chrome://messenger/content/messenger.xul") { + initFolderLocation(window, document); + } + } + }); +} + +function shutdown() { + ExtensionSupport.unregisterWindowListener("quickmove"); + + for (let window of ExtensionSupport.openWindows) { + if (window.quickmove && window.quickmove.cleanup) { + for (let func of window.quickmove.cleanup.reverse()) { + try { + func(); + } catch (e) { + Cu.reportError(e); + } + } + } + } +} + +function install() {} +function uninstall() {} diff --git a/chrome.manifest b/chrome.manifest index d6779f2..f37463e 100644 --- a/chrome.manifest +++ b/chrome.manifest @@ -1,9 +1 @@ -content quickmove chrome/content/ -locale quickmove en-US chrome/locales/en-US/ -locale quickmove de chrome/locales/de/ -locale quickmove uk chrome/locales/uk/ -locale quickmove ru chrome/locales/ru/ -resource quickmove . - -overlay chrome://messenger/content/messenger.xul chrome://quickmove/content/quickmove-overlay.xul -overlay chrome://messenger/content/messageWindow.xul chrome://quickmove/content/quickmove-overlay.xul +content quickmove content/ diff --git a/chrome/content/quickmove-overlay.xul b/chrome/content/quickmove-overlay.xul deleted file mode 100644 index d82fc1f..0000000 --- a/chrome/content/quickmove-overlay.xul +++ /dev/null @@ -1,173 +0,0 @@ - - - - - - - + +
diff --git a/webextension/options/options.js b/options/options.js similarity index 71% rename from webextension/options/options.js rename to options/options.js index 8f3a62d..92be166 100644 --- a/webextension/options/options.js +++ b/options/options.js @@ -1,14 +1,20 @@ /* 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/. - * Portions Copyright (C) Philipp Kewisch, 2018 */ + * Portions Copyright (C) Philipp Kewisch, 2018-2019 */ (async function() { - let storagePrefs = await browser.runtime.sendMessage({ action: "get-prefs" }); - await browser.storage.local.set(storagePrefs); + let prefs = await browser.storage.local.get({ + markAsRead: true, + maxRecentFolders: 15 + }); - for (let [name, value] of Object.entries(storagePrefs)) { + for (let [name, value] of Object.entries(prefs)) { let node = document.getElementById(name); + if (!node) { + continue; + } + if (typeof value == "boolean") { node.checked = value; } else { @@ -28,11 +34,9 @@ } document.body.addEventListener("change", () => { - let prefs = { + browser.storage.local.set({ maxRecentFolders: parseInt(document.getElementById("maxRecentFolders").value, 10), markAsRead: document.getElementById("markAsRead").checked - }; - browser.runtime.sendMessage({ action: "set-prefs", prefs: prefs }); - browser.storage.local.set(prefs); + }); }); })();