From ff8a653d7767be2f6c6af8b297d408c5eafcfa77 Mon Sep 17 00:00:00 2001 From: RealRaven2000 Date: Wed, 20 Mar 2024 11:48:46 +0000 Subject: [PATCH] issue #253 - removed legacy code - added support for refreshing from settings - update the "Last item" and MRU list to be always current - improved css selector for hidden label --- chrome/content/scripts/st-messagePane.js | 65 +++----- chrome/content/scripts/st-messenger.js | 20 ++- chrome/content/settings.js | 18 ++- .../skin/common/smartTemplate-toolButton.css | 4 +- chrome/content/smartTemplate-fileTemplates.js | 68 ++++++-- chrome/content/smartTemplate-main.js | 5 +- manifest.json | 2 +- revision.txt | 2 +- st-background.js | 153 +++++++++++------- 9 files changed, 209 insertions(+), 128 deletions(-) diff --git a/chrome/content/scripts/st-messagePane.js b/chrome/content/scripts/st-messagePane.js index f7777a820..cc81c8ac1 100644 --- a/chrome/content/scripts/st-messagePane.js +++ b/chrome/content/scripts/st-messagePane.js @@ -1,11 +1,11 @@ var { MailServices } = ChromeUtils.import("resource:///modules/MailServices.jsm"); -let patchHeaderMenu; // listener - +/* obsolete +let patchHeaderMenu; var reactNotification; +*/ async function onLoad(activatedWhileWindowOpen) { - // copy namespace (we are in 3pane or about:message) switch (window.parent.document.URL) { case "about:3pane": @@ -18,7 +18,7 @@ async function onLoad(activatedWhileWindowOpen) { if (window.document.URL == "about:message") { window.SmartTemplate4 = window.parent.SmartTemplate4; } - } + } window.SmartTemplate4_WLM = WL; // keep a reference to the correct WindowListener. [issue 271] // it can only patch stuff in its own window! @@ -27,10 +27,27 @@ async function onLoad(activatedWhileWindowOpen) { WL.injectCSS("chrome://smartTemplate4/content/skin/common/smartTemplate-toolButton.css"); - const HEADERBARID = "smarttemplate4_thunderbird_extension-messageDisplayAction-toolbarbutton"; const contentDoc = window.document; - let headerButton = contentDoc.getElementById(HEADERBARID); + const HEADERSELECTOR = '[data-extensionid="smarttemplate4@thunderbird.extension"].message-header-view-button'; + // [data-extensionid="smarttemplate4@thunderbird.extension"].message-header-view-button + let headerButton = contentDoc.querySelector(HEADERSELECTOR); // getElementById(HEADERBARID); + if (!headerButton) return; + if (window.SmartTemplate4.Preferences.getMyBoolPref("toolbar.hideLabel")) { + headerButton.classList.add("force-label-hidden"); + } else { + headerButton.classList.remove("force-label-hidden"); + } + // early exit + if (window.SmartTemplate4?.fileTemplates.isAPIpatched) { + return; + } + + /* obsolete + // ================================================================== + // old code... + const HEADERBARID = "smarttemplate4_thunderbird_extension-messageDisplayAction-toolbarbutton"; + headerButton = contentDoc.getElementById(HEADERBARID); if (headerButton) { // patch button window.setTimeout( (win = window) => { @@ -79,46 +96,12 @@ async function onLoad(activatedWhileWindowOpen) { patchHeaderMenu = async (win = window) => { win.SmartTemplate4_WLM = WL; if (win.SmartTemplate4.patchHeaderPane.bind(win.SmartTemplate4)) { - // to do - recreate through API [issue 253] await win.SmartTemplate4.fileTemplates.initMenus(true, {toolbarType:"messageheader"}); } } window.SmartTemplate4.Util.notifyTools.registerListener(reactNotification); - - // messenger.messageDisplayAction.setTitle("SmartTemplates") - /* - https://webextension-api.thunderbird.net/en/latest/messageDisplayAction.html#seticon-details - messenger.messageDisplayAction.setIcon( - { - imageData:ImageDataType, - path: IconPath - } - ) - - - John: - The menus are populated via the menus API. The context you need is message_display_action_menu - - For the first level you use the mentioned context in menus.create(). - You also define an id for each entry. For the sublevels you use the parentId - property to define the menu entries to be children of the previously defined - top level entries. You probably do not need to specify a context for - sublevel entries. - - You can hide/show entries in the onShown event, if you need dynamic menu entries, - depending on the current message or UI state. - - Or actually update the entries. - - For patching, work in main: patchHeaderPane - - // access all browsers in 3pane: - window[3].document.childNodes[1].querySelectorAll("browser") - - // access messageHeader - window[3].document.childNodes[1].querySelectorAll("browser")[1].contentDocument.querySelector("#messageHeader") - */ + } function onUnload(isAddOnShutDown) { diff --git a/chrome/content/scripts/st-messenger.js b/chrome/content/scripts/st-messenger.js index c1562617a..35eb11518 100644 --- a/chrome/content/scripts/st-messenger.js +++ b/chrome/content/scripts/st-messenger.js @@ -118,9 +118,6 @@ async function onLoad(activatedWhileWindowOpen) { case "smartTemplates-templatemenus": SmartTemplates.Util.notifyTools.notifyBackground({ func: "updateTemplateMenus" }); break; - case "smartTemplates-patchHeaderTools": - SmartTemplates.Util.notifyTools.notifyBackground({ func: "patchHeaderMenu" }); - break; case "smartTemplates-headerMenuAPI": // to test, first remove the old xul menu items: if (!SmartTemplates.fileTemplates.isAPIpatched) { @@ -198,17 +195,34 @@ async function onLoad(activatedWhileWindowOpen) { window.SmartTemplate4.WL = WL; // we need this in patchUnifiedToolbar(); window.SmartTemplate4.Util.notifyTools.enable(); + util.logDebug("Util.init..."); await window.SmartTemplate4.Util.init(); + util.logDebug("startUp..."); window.SmartTemplate4.startUp(); + // read custom templates data from disc + await window.SmartTemplate4.fileTemplates.loadCustomMenu(false); await window.SmartTemplate4.fileTemplates.loadMRU(); + await window.SmartTemplate4.Util.notifyTools.notifyBackground({ + func: "updateFileTemplates", + Entries: window.SmartTemplate4.fileTemplates.Entries, + MRU_Entries: window.SmartTemplate4.fileTemplates.MRU_Entries + }); + // The following will only work if we are currently in a mail pane (ATN update) // otherwise, we need to call this again in a tab listener if (window.SmartTemplate4.patchUnifiedToolbar()) { await window.SmartTemplate4.fileTemplates.initMenus(true, { toolbarType:"unified", isMessenger: true }); } + + // [issue 253] update message action menu (API based) - default to this method from now! + await window.SmartTemplate4.Util.notifyTools.notifyBackground({ + func: "patchHeaderMenuAPI" + }); + window.SmartTemplate4.fileTemplates.isAPIpatched = true; + window.SmartTemplate4.addTabEventListener(); // set up updating the label at midnight diff --git a/chrome/content/settings.js b/chrome/content/settings.js index 486d15ce9..5e8a86fc2 100644 --- a/chrome/content/settings.js +++ b/chrome/content/settings.js @@ -588,10 +588,26 @@ SmartTemplate4.Settings = { return true; } , - onUnload : function() { + onUnload : async function() { if (SmartTemplate4.fileTemplates.isModified) { SmartTemplate4.Util.logDebug("fileTemplates were modified - notify to update all menus..."); SmartTemplate4.Util.notifyTools.notifyBackground({ func: "updateTemplateMenus" }); + try { + /* FOR SOME REASONS THIS NEVER RETURNS NOR DOES IT THROW! + await window.SmartTemplate4.Util.notifyTools.notifyBackground({ + func: "updateFileTemplates", + Entries: window.SmartTemplate4.fileTemplates.Entries, + MRU_Entries: window.SmartTemplate4.fileTemplates.MRU_Entries + }); + */ + await SmartTemplate4.Util.notifyTools.notifyBackground({ + func: "patchHeaderMenuAPI" + }); + } catch (ex) { + SmartTemplate4.Util.logException("onUnload after calling patchHeaderMenuAPI()", ex); + } finally { + + } } window.removeEventListener("SmartTemplates.BackgroundUpdate", SmartTemplate4.Settings.validateLicenseFromEvent); } , diff --git a/chrome/content/skin/common/smartTemplate-toolButton.css b/chrome/content/skin/common/smartTemplate-toolButton.css index 50c2c6d39..1461b66c1 100644 --- a/chrome/content/skin/common/smartTemplate-toolButton.css +++ b/chrome/content/skin/common/smartTemplate-toolButton.css @@ -129,7 +129,9 @@ toolbar:not([iconsize="small"]) #SmartTemplate4Button image { } /* use the class force-label-hidden on the button to force hiding the label, but only if icon is visible */ -#messageHeader:not(.message-header-buttons-only-text) .SmartTemplates_HeaderBtn.force-label-hidden .toolbarbutton-text { +#messageHeader:not(.message-header-buttons-only-text) +[data-extensionid="smarttemplate4@thunderbird.extension"].force-label-hidden +.toolbarbutton-text { display: none !important; } diff --git a/chrome/content/smartTemplate-fileTemplates.js b/chrome/content/smartTemplate-fileTemplates.js index 7b06defb8..e3b8af56b 100644 --- a/chrome/content/smartTemplate-fileTemplates.js +++ b/chrome/content/smartTemplate-fileTemplates.js @@ -444,7 +444,7 @@ SmartTemplate4.fileTemplates = { makeLabel: function(entry) { let cat = entry.category || ""; // use right pointing guillemet (left-pointing double angle quotation mark) as delimiter - let retval = cat ? (cat + " » " + entry.label) : entry.label; + let retval = cat ? (cat + " » " + entry?.label) : entry?.label; return retval; }, @@ -548,6 +548,11 @@ SmartTemplate4.fileTemplates = { util.logDebug (`Successfully saved ${fileTemplates.entriesLength} bookmarks [${byteCount} bytes] to file.`); fileTemplates.isModified = true; SmartTemplate4.Util.notifyTools.notifyBackground({ func: "updateTemplateMenus" }); + SmartTemplate4.Util.notifyTools.notifyBackground({ + func: "updateFileTemplates", + Entries: fileTemplates.Entries, + MRU_Entries: fileTemplates.MRU_Entries + }); SmartTemplate4.Util.notifyTools.notifyBackground({ func: "updateSnippetMenus" }); }, function saveReject(fileError) { // IOUtils.Error @@ -809,8 +814,7 @@ SmartTemplate4.fileTemplates = { } msgPopup.appendChild(menuitem); } - } - else { + } else { acKey = getAccessKey(accelerator++); if (acKey) { menuitem.setAttribute("accesskey", acKey); @@ -947,6 +951,7 @@ SmartTemplate4.fileTemplates = { SmartTemplate4.fileTemplates.configureMenuMRU(msgPopup); // the last used template to the menu item! msgPopup.setAttribute("st4configured", true); } , + configureMenuMRU: function(msgPopup) { // uses the classes st-last-rsp st-last-new st-last-fwd for adding the name of the last used templates @@ -1029,10 +1034,17 @@ SmartTemplate4.fileTemplates = { ); if (isAPI) { - // this will also update the data! - await window.SmartTemplate4.Util.notifyTools.notifyBackground({ - func: "smartTemplates-headerMenuAPI" + // update the data! + await SmartTemplate4.Util.notifyTools.notifyBackground({ + func: "updateFileTemplates", + Entries: this.Entries, + MRU_Entries: this.MRU_Entries }); + + await SmartTemplate4.Util.notifyTools.notifyBackground({ + func: "patchHeaderMenuAPI" + }); + // only on main toolbar item until this is converted for API! await window.SmartTemplate4.fileTemplates.initMenus(true, {toolbarType:"unified"}); } else { @@ -1159,6 +1171,16 @@ SmartTemplate4.fileTemplates = { if (this.isAPIpatched) { return; } + + +// ============================================================== +// ============================================================== +// ============================================================== +// OBSOLETE +// ============================================================== +// ============================================================== +// ============================================================== + let doc = SmartTemplate4.Util.getMessageBrowserDocument(); if (isHackMessageHeader && doc) { @@ -1294,6 +1316,7 @@ SmartTemplate4.fileTemplates = { return; } this.storePreviousTemplate(composeType, entry); + this.enterMRUitem(entry); // update api menus // we need to remove all mru- items from the top level! // not sure how to do it via the API @@ -1350,11 +1373,13 @@ SmartTemplate4.fileTemplates = { }, enterMRUitem(entry) { + SmartTemplate4.Util.logDebug(`enterMRUitem(${this.makeLabel(entry)})`); let MAX_MRU_ITEMS = SmartTemplate4.Preferences.getMyIntPref("fileTemplates.mru.max") * 2; // default is 10 but can be raised in Pro let el = SmartTemplate4.fileTemplates.MRU_Entries.find(e => e.path == entry.path && (e.cmd == entry.cmd || e.command == entry.command)); + if (!entry) return false; if (el) { @@ -1378,7 +1403,7 @@ SmartTemplate4.fileTemplates = { }, // origin: "new", "rsp", "fwd" - onItemClick: function (menuitem, menuParent, fileTemplateInstance, composeType, path, label, singleMwindow) { + onItemClick: async function (menuitem, menuParent, fileTemplateInstance, composeType, path, label, singleMwindow) { /* START NEW CODE - [issue 184] */ // use a pref switch for testing API processing... if (SmartTemplate4.Preferences.isBackgroundParser()) { @@ -1505,20 +1530,30 @@ SmartTemplate4.fileTemplates = { case "cmd_replylist": cmd = "replyList"; break; } } - let mruEntry = { - cmd: cmd, - label: entry.label, - path: entry.path, - composeType: entry.composeType, - command: entry.command - } - if (mruEntry.cmd) { - SmartTemplate4.fileTemplates.enterMRUitem(mruEntry); + if (cmd) { + SmartTemplate4.fileTemplates.enterMRUitem({ + cmd: cmd, + label: entry.label, + path: entry.path, + composeType: entry.composeType, + command: entry.command + } + ); } // notify UI to update _after_ updating the MRU list. SmartTemplate4.Util.notifyTools.notifyBackground({ func: "updateTemplateMenus" }); + // update mru in header + await SmartTemplate4.Util.notifyTools.notifyBackground({ + func: "updateFileTemplates", + Entries: this.Entries, + MRU_Entries: this.MRU_Entries + }); + SmartTemplate4.Util.notifyTools.notifyBackground({ + func: "updateHeaderMenuMRU" + }); + } , storePreviousTemplate: function(composeType, entry, updateMenus = false) { @@ -2084,7 +2119,6 @@ SmartTemplate4.fileTemplates = { "SmartTemplate4.fileTemplates.loadMRU()", "Reading the smartTemplates_mru.json file failed\n" + ex); // no changes to Entries array - // return Promise.reject("loadCustomMenu failed."); return false; } } diff --git a/chrome/content/smartTemplate-main.js b/chrome/content/smartTemplate-main.js index f3592aad3..d2fde084c 100644 --- a/chrome/content/smartTemplate-main.js +++ b/chrome/content/smartTemplate-main.js @@ -1064,7 +1064,7 @@ var SmartTemplate4 = { newPopup.remove(); return true; } else { - SmartTemplate4.Util.logDebug(`patchHeaderPane() - didn't find ${newPopupSelector}, so I couldn't patch the popup menu`); + SmartTemplate4.Util.logDebug(`moveMenuItems() - didn't find ${newPopupSelector}, so I couldn't patch the popup menu`); console.log(toolbarButton); } }, @@ -1119,7 +1119,6 @@ var SmartTemplate4 = { - @@ -1238,8 +1237,10 @@ var SmartTemplate4 = { const isMailPane = SmartTemplate4.Util.isTabMode (evt.detail.tabInfo, "mail"); if (isMailPane) { const HEADERBARID = "smarttemplate4_thunderbird_extension-messageDisplayAction-toolbarbutton"; + let result = await SmartTemplate4.Util.notifyTools.notifyBackground({func: "patchUnifiedToolbar"}); await SmartTemplate4.fileTemplates.initMenus(true, {toolbarType:"unified"}); + if (SmartTemplate4.fileTemplates.isAPIpatched) { return; // header Patch obsolete for API method } diff --git a/manifest.json b/manifest.json index 4a325fd0c..a9b36e70b 100644 --- a/manifest.json +++ b/manifest.json @@ -3,7 +3,7 @@ "manifest_version": 2, "name": "SmartTemplates", "description": "__MSG_extensionDescription__", - "version": "4.4pre136", + "version": "4.4pre143", "default_locale": "en", "developer": { "name": "Axel Grude (author)", diff --git a/revision.txt b/revision.txt index 951b0a913..ed5ec24d7 100644 --- a/revision.txt +++ b/revision.txt @@ -1 +1 @@ -136 +143 diff --git a/st-background.js b/st-background.js index e8e014754..c6745b0d5 100644 --- a/st-background.js +++ b/st-background.js @@ -42,34 +42,6 @@ function logReceptionError(x) { } } -// Helper function to walk through a menu data structure and create WebExtension -// menu entries. -// TO DO: use this to recreate SmartTemplates header menus from the back-end [issue 253] -// TEST TEST TEST -async function addMenuEntries(entries, parentId) { - for (let entry of entries) { - let config = { - id: entry.id, - contexts: ["browser_action_menu"], - } - if (entry.separator) { - config.type = "separator"; - } else { - config.title = entry.label || browser.i18n.getMessage(entry.id); - } - if (parentId) { - config.parentId = parentId; - } - if (entry.disabled) { - config.enabled = false; - } - await browser.menus.create(config); - if (entry.subEntries) { - await addMenuEntries(entry.subEntries, entry.id); - } - } -} - const ControllerMap = new Map([ ["cmd_newMessage", "new"], ["cmd_reply", "rsp"], @@ -78,13 +50,15 @@ const ControllerMap = new Map([ ["cmd_forward", "fwd"] ]); +// all .last items had classList:"menuitem-iconic st-last- st-mru" +// all .default items had classList:"menuitem-iconic" const writeMenus = [ { type:"menu", id:"smartTemplates-write-menu", classList:"menu-iconic", label:"pref_new.tab", accesskey:"st.menuaccess.write", controller:"cmd_newMessage", popupItems: [ - { id:"smartTemplates-write-last", label:"st.menu.template.last", classList:"menuitem-iconic st-last-rsp st-mru", controller:"cmd_newMessage", ctr_type: "most-recent" }, - { id:"smartTemplates-write-default", label:"st.menu.template.default", classList:"menuitem-iconic", controller:"cmd_newMessage", ctr_type: "account" } + { id:"smartTemplates-write-last", label:"st.menu.template.last", controller:"cmd_newMessage", ctr_type: "most-recent" }, + { id:"smartTemplates-write-default", label:"st.menu.template.default", controller:"cmd_newMessage", ctr_type: "account" } ] } ]; @@ -94,24 +68,24 @@ const replyMenus = [ label:"pref_rsp.tab", accesskey:"st.menuaccess.reply", controller:"cmd_reply", popupItems: [ - { id:"smartTemplates-reply-last", label:"st.menu.template.last", classList:"menuitem-iconic st-last-rsp st-mru", controller:"cmd_reply", ctr_type: "most-recent" }, - { id:"smartTemplates-reply-default", label:"st.menu.template.default", classList:"menuitem-iconic", controller:"cmd_reply", ctr_type: "account" } + { id:"smartTemplates-reply-last", label:"st.menu.template.last", controller:"cmd_reply", ctr_type: "most-recent" }, + { id:"smartTemplates-reply-default", label:"st.menu.template.default", controller:"cmd_reply", ctr_type: "account" } ] }, { type:"menu", id:"smartTemplates-reply-all-menu", classList:"menu-iconic", label:"st.menu.replyAll", accesskey:"st.menuaccess.replyAll", controller:"cmd_replyAll", popupItems: [ - { id:"smartTemplates-reply-all-last", label:"st.menu.template.last", classList:"menuitem-iconic st-last-rsp st-mru", controller:"cmd_replyAll", ctr_type: "most-recent" }, - { id:"smartTemplates-reply-all-default", label:"st.menu.template.default", classList:"menuitem-iconic", controller:"cmd_replyAll", ctr_type: "account" } + { id:"smartTemplates-reply-all-last", label:"st.menu.template.last", controller:"cmd_replyAll", ctr_type: "most-recent" }, + { id:"smartTemplates-reply-all-default", label:"st.menu.template.default", controller:"cmd_replyAll", ctr_type: "account" } ] }, { type:"menu", id:"smartTemplates-reply-list-menu", classList:"menu-iconic", label:"st.menu.replyList", accesskey:"st.menuaccess.replyList", controller:"cmd_replyList", popupItems: [ - { id:"smartTemplates-reply-list-last", label:"st.menu.template.last", classList:"menuitem-iconic st-last-rsp st-mru", controller:"cmd_replyList", ctr_type: "most-recent" }, - { id:"smartTemplates-reply-list-default", label:"st.menu.template.default", classList:"menuitem-iconic", controller:"cmd_replyList", ctr_type: "account" } + { id:"smartTemplates-reply-list-last", label:"st.menu.template.last", controller:"cmd_replyList", ctr_type: "most-recent" }, + { id:"smartTemplates-reply-list-default", label:"st.menu.template.default", controller:"cmd_replyList", ctr_type: "account" } ] }, ]; @@ -122,8 +96,8 @@ const forwardMenus = [ label:"pref_fwd.tab", accesskey:"st.menuaccess.forward", controller:"cmd_forward", popupItems: [ - { id:"smartTemplates-forward-last", label:"st.menu.template.last", classList:"menuitem-iconicst-last-fwd st-mru", controller:"cmd_forward", ctr_type: "most-recent" }, - { id:"smartTemplates-forward-default", label:"st.menu.template.default", classList:"menuitem-iconic", controller:"cmd_forward", ctr_type: "account" } + { id:"smartTemplates-forward-last", label:"st.menu.template.last", controller:"cmd_forward", ctr_type: "most-recent" }, + { id:"smartTemplates-forward-default", label:"st.menu.template.default", controller:"cmd_forward", ctr_type: "account" } ] } ]; @@ -185,10 +159,15 @@ async function getTargetTemplate(controller, type) { } if (controller.startsWith("cmd_")) { - let ctr = controller.substr(4); switch (type) { case "most-recent" : - return fileTemplates.MRU_Entries.find(e=>e.cmd==ctr); + // not from MRU list but stored separately in legacy prefs + let jsonTemplate = + await messenger.LegacyPrefs.getPref(`extensions.smartTemplate4.fileTemplates.mru.${ControllerMap.get(controller)}`), + sEmptyLabel = "(not set)"; + + let lastEntry = jsonTemplate ? JSON.parse(jsonTemplate) : {path:"", label:sEmptyLabel, category:""}; + return lastEntry; // fileTemplates.MRU_Entries.find(e=>e.cmd==ctr); case "account" : // account template return { controller: controller, @@ -201,7 +180,7 @@ async function getTargetTemplate(controller, type) { } -var Menuhelper = { +var MenuHelper = { injectAccessKey: function(txt, accesskey=null) { if (accesskey) { let p = txt.indexOf(accesskey); @@ -244,6 +223,26 @@ var Menuhelper = { return null; }, + getCmd: function (template) { + if (template.cmd) return template.cmd; + + switch (template?.command.toLowerCase()) { + case "cmd_replyall": return "replyAll"; + case "cmd_replylist": return "replyList"; + case "cmd_reply": return "reply"; + case "cmd_forward": return "forward"; + case "cmd_newMessage": return "write"; + } + + switch(template?.composeType) { + case "rsp": return "reply"; + case "fwd": return "forward"; + case "new": return "write"; + } + + return null; + }, + // get identifier for localization / label from cmd. getActionId: function (cmd) { switch(cmd) { @@ -276,7 +275,7 @@ async function addMenus(menuArray, context) { contexts: [context], enabled: true, id: m.id, // string - title: Menuhelper.injectAccessKey(messenger.i18n.getMessage(m.label), ak), + title: MenuHelper.injectAccessKey(messenger.i18n.getMessage(m.label), ak), visible: true } let icon = getIconOfController(m.controller); @@ -297,7 +296,7 @@ async function addMenus(menuArray, context) { for(let p of m.popupItems) { ak = (p?.accesskey) ? messenger.i18n.getMessage(p?.accesskey) : null ; let template = - await getTargetTemplate(p?.controller, p?.ctr_type) ; + await getTargetTemplate(p?.controller, p?.ctr_type); if (!template) { continue; } @@ -307,7 +306,7 @@ async function addMenus(menuArray, context) { if(template.label) { title = `${messenger.i18n.getMessage(p.label)}: ${template.label}`; } else { - title = Menuhelper.injectAccessKey(messenger.i18n.getMessage(p.label), ak); + title = MenuHelper.injectAccessKey(messenger.i18n.getMessage(p.label), ak); } let itemProps = { @@ -348,7 +347,7 @@ async function addMenus(menuArray, context) { await messenger.menus.create(itemProps); } // append file templates: (either one of new, rsp or fwd ) using ControllerMap - let templateList = Menuhelper.getTemplateListForController(m.controller); + let templateList = MenuHelper.getTemplateListForController(m.controller); if (!templateList.length) continue; // ======================================== @@ -377,7 +376,7 @@ async function addMenus(menuArray, context) { catEl = CatMap.get(t.category) || null; if (!catEl) { - let CA = Menuhelper.getAccessKey(catAccelerator++); + let CA = MenuHelper.getAccessKey(catAccelerator++); catId = await messenger.menus.create({ contexts: [context], parentId: popupId, @@ -395,9 +394,9 @@ async function addMenus(menuArray, context) { let accelKeyString; if (catEl) { - accelKeyString = Menuhelper.getAccessKey(catEl.akc); + accelKeyString = MenuHelper.getAccessKey(catEl.akc); } else { - accelKeyString = Menuhelper.getAccessKey(accCount); + accelKeyString = MenuHelper.getAccessKey(accCount); accCount++ } @@ -438,6 +437,7 @@ async function addMenus(menuArray, context) { enabled: true, parentId: popupId, id: `${m.controller}-openTemplate`, + icons: "../chrome/content/skin/icons/template-load.png", title: messenger.i18n.getMessage("st.fileTemplates.openFile"), onclick: (e) => { // fT.onSelectAdHoc(fT, composeType, popupParent, singleParentWindow); @@ -495,6 +495,7 @@ async function createHeaderMenu() { await addMenus([...replyMenus, ...forwardMenus], Context); // Toggle Label (optional) let isLabelHidden = (await messenger.LegacyPrefs.getPref("extensions.smartTemplate4.toolbar.hideLabel")); + await messenger.menus.remove("toggleLabel"); await messenger.menus.create({ contexts: [Context], enabled: true, @@ -514,6 +515,7 @@ async function createHeaderMenu() { }); // SmartTemplates Settings + await messenger.menus.remove("smartTemplates-settings"); await messenger.menus.create({ contexts: [Context], enabled: true, @@ -532,6 +534,7 @@ async function createHeaderMenu() { }); // ======================================== + await messenger.menus.remove("templateSeparator"); await messenger.menus.create({ contexts: [Context], enabled: true, @@ -632,18 +635,16 @@ async function updateMruMenu(Context) { break; } let theTemplate = templates[i], // - isDisabled = (!isLicensed && i>=MAX_FREE_TEMPLATES), - hasRestrictions = isDisabled; + isDisabled = (!isLicensed && i>=MAX_FREE_TEMPLATES); if (!isDisabled && !hasProLicense && i>=MAX_STANDARD_TEMPLATES) { isDisabled = true; - hasRestrictions = true; } // get identifier for localization / label - let actionId = Menuhelper.getActionId(theTemplate.cmd); + let actionId = MenuHelper.getActionId(MenuHelper.getCmd(theTemplate)); if (!actionId) continue; - let accelKeyString = Menuhelper.getAccessKey(accelerator), + let accelKeyString = MenuHelper.getAccessKey(accelerator), action = messenger.i18n.getMessage(actionId); let title = `${accelKeyString}${action}: ${theTemplate.label}`; @@ -655,7 +656,7 @@ async function updateMruMenu(Context) { id: `mru-${accelerator}`, onclick: (e) => { executeFileMenu( { - controller: Menuhelper.getController(theTemplate), + controller: MenuHelper.getController(theTemplate), composeType: theTemplate?.composeType, // "rsp" "new" "fwd" - added for later? target: theTemplate // file template entry or mru entry - see fileTemplates.js }) @@ -673,6 +674,40 @@ async function updateMruMenu(Context) { if (isDebug) { console.log("No MRU items were generated. "); } return; } + + // update last items + let latestMenus; + switch(Context) { + case "browser_action_menu": + latestMenus = [...writeMenus, ...replyMenus, ...forwardMenus]; + break; + case "message_display_action_menu": + latestMenus = [...replyMenus, ...forwardMenus]; + break; + } + let enableLastUpdate = true; // test + for (let menus of latestMenus) { + for (let menu of menus.popupItems.filter((e) => (e.ctr_type == "most-recent"))) { + let template = await getTargetTemplate(menu.controller, "most-recent"), + title = `${messenger.i18n.getMessage(menu.label)}: ${template.label}`; + + let itemProps = { + contexts: [Context], + parentId: menus.id, + title: title, + onclick: (e) => { + // html template + executeFileMenu( { + controller: menu.controller, + control_type: menu.ctr_type, + target: template // file template entry or mru entry - see fileTemplates.js + }); + } + } + if (!enableLastUpdate) continue; + await messenger.menus.update(menu.id, itemProps); + } + } // remember how many MRU items each menu type has // let prefixMatch = generatedId.match("(.*_)mru-"); @@ -941,12 +976,6 @@ async function main() { messenger.NotifyTools.notifyExperiment({event: "updateTemplateMenus"}); break; - case "patchHeaderMenu": - // Broadcast about:messenger to run patch / refresh Header Menus - // To do rewrite with api [issue 253] - messenger.NotifyTools.notifyExperiment({event: "patchHeaderMenu"}); - break; - case "updateFileTemplates": if (await messenger.LegacyPrefs.getPref("extensions.smartTemplate4.debug.API.menus")) { console.log("SmartTemplates updateFileTemplates() [API] data\n"); @@ -956,6 +985,9 @@ async function main() { break; case "patchHeaderMenuAPI": + if (await messenger.LegacyPrefs.getPref("extensions.smartTemplate4.debug.API.menus")) { + console.log("SmartTemplates patchHeaderMenuAPI [API] data\n"); + } await createHeaderMenu(); // use API to build the menu await updateMruMenu("message_display_action_menu"); // API to update MRU items break; @@ -1043,7 +1075,6 @@ async function main() { case "patchUnifiedToolbar": return await messenger.NotifyTools.notifyExperiment({event: "patchUnifiedToolbar"}); - break; case "openLinkInTab": // https://webextension-api.thunderbird.net/en/stable/tabs.html#query-queryinfo