/* Add buttons */ (function(exports) { if (location != 'chrome://messenger/content/messenger.xhtml') return; const {FolderUtils} = ChromeUtils.importESModule("resource:///modules/FolderUtils.sys.mjs"); exports.easyPeasy.currentFolder=()=>{ const f=gTabmail.currentTabInfo.folder; if (!f) { return null; } const s=FolderUtils.getSpecialFolderString(f); return s; //Inbox, Trash, Sent, Drafts, Templates, ... } exports.easyPeasy.showFolder=(active, inactive)=>{ // shows special folder of first account // active, inactive=Inbox, Trash, Sent, ... console.log('showFolder '+active+' or '+inactive); const curr=exports.easyPeasy.currentFolder(); if (!curr) return; const show=curr==active?inactive:active; let folder=null; const account=MailServices.accounts.accounts[0].incomingServer; console.log('.. uses account: '+account.prettyName); let folders=account.rootFolder.subFolders; for (const f of folders) { const s=FolderUtils.getSpecialFolderString(f); //Inbox, Trash, Sent, Drafts, Templates, ... if (s==show) { folder=f; break; } } if (!folder) { // folders are below inbox? folders=account.rootFolder.subFolders[0].subFolders; for (const f of folders) { const s=FolderUtils.getSpecialFolderString(f); //Inbox, Trash, Sent, Drafts, Templates, ... if (s==show) { folder=f; break; } } } if (folder) gTabmail.currentAbout3Pane.displayFolder(folder.URI); else console.error('Easy-Peasy: Special folder "'+show+'" not found'); } exports.easyPeasy.addButtons=()=>{ const toolbar = document.getElementById('unifiedToolbarContent'); for (const btn of exports.easyPeasy.buttons) { //remove old button, if one exists let onb=document.querySelector("li[item-id='"+btn.id+"']"); if (onb) onb.remove(); if (btn.showIf && !btn.showIf()) continue; let nb=document.createElement('li'); nb.setAttribute('item-id', btn.id); if (btn.class) nb.className=btn.class; nb.setAttribute('is', 'customizable-element'); let d=document.createElement('div'); d.className='live-content'; nb.appendChild(d); let b=document.createElement('button'); b.setAttribute('is', 'mail-tab-button'); b.className='unified-toolbar-button button' +(btn.class.includes('folder')?' check-button':''); if (btn.selected && btn.selected()) b.setAttribute('aria-pressed', 'true'); if (btn?.title) b.title=btn.title; b.setAttribute('onclick', btn.click); d.appendChild(b); let i=document.createElement('img'); i.className='button-icon'; i.style.content='url('+btn.icon+')'; b.appendChild(i); let l=document.createElement('span'); l.className='button-label'; l.textContent=btn.label; b.appendChild(l); //prevent an error message on tab switch nb.onTabSwitched=()=>{}; nb.onTabClosing=()=>{}; if (btn.pos=='last') toolbar.appendChild(nb); else if (btn.pos=='first') toolbar.insertBefore(nb, toolbar.firstChild) else if (isNaN(Number(btn.pos))) { //{+|-}item-id let dir=btn.pos.at(0); let id=btn.pos; if (dir=='+' || dir=='-') id=btn.pos.substring(1); else dir='+'; const e=document.querySelector('li[item-id="'+id+'"]'); if (!e) { console.error('Easy-Peasy: addButtons: button "'+id+'" not found'); toolbar.appendChild(nb); } else { if (dir=='-') toolbar.insertBefore(nb, e); else toolbar.insertBefore(nb, e.nextSibling); } } else { //Number let pos=Number(btn.pos); if (pos==0) toolbar.insertBefore(nb, toolbar.firstChild) else { let e=toolbar.firstChild; while (pos-- && e) e=e.nextSibling; if (e) toolbar.insertBefore(nb, e.nextSibling); else toolbar.appendChild(nb); } } } } //addButtons // Load all button definition files matching BUTTONS-*.def pattern exports.easyPeasy.loadButtonModules = () => { console.log('Easy-Peasy: Starting loadButtonModules'); exports.easyPeasy.buttons = []; try { const {FileUtils} = ChromeUtils.importESModule("resource://gre/modules/FileUtils.sys.mjs"); const dir = FileUtils.getDir("ProfD", ["chrome", "easy-peasy"]); console.log('Easy-Peasy: Directory path:', dir.path); if (dir.exists() && dir.isDirectory()) { console.log('Easy-Peasy: Directory exists'); const entries = dir.directoryEntries; const defFiles = []; while (entries.hasMoreElements()) { const entry = entries.nextFile; if (entry.isFile() && entry.leafName.match(/^BUTTONS-.+\.def$/)) { defFiles.push(entry.leafName); } } console.log('Easy-Peasy: Found button definition files:', defFiles); // Load each button definition file using Services.scriptloader for (const filename of defFiles) { try { console.log('Easy-Peasy: Loading file:', filename); // Create file URI const file = dir.clone(); file.append(filename); const fileURI = Services.io.newFileURI(file).spec; console.log('Easy-Peasy: File URI:', fileURI); // Create a temporary context object to receive the button const context = { button: null, easyPeasy: exports.easyPeasy }; // Load the file - it should define 'var button = {...}' Services.scriptloader.loadSubScriptWithOptions(fileURI, { target: context, charset: "UTF-8", ignoreCache: true, }); // Check if button was defined if (context.button && typeof context.button === 'object') { exports.easyPeasy.buttons.push(context.button); console.log('Easy-Peasy: Loaded button from ' + filename + ':', context.button.id); } else { console.error('Easy-Peasy: No button object found in ' + filename); } } catch (fileError) { console.error('Easy-Peasy: Error loading ' + filename + ':', fileError); } } } else { console.error('Easy-Peasy: Directory not found'); } } catch (error) { console.error('Easy-Peasy: Error loading button modules:', error); } console.log('Easy-Peasy: Loaded ' + exports.easyPeasy.buttons.length + ' buttons'); }; // Initialize: Load button modules and add buttons console.log('Easy-Peasy: Initializing buttons module'); exports.easyPeasy.loadButtonModules(); console.log('Easy-Peasy: After loadButtonModules, calling addButtons'); exports.easyPeasy.addButtons(); // re-add buttons after toolbar has been customized if (!exports.easyPeasy.button_observer) { exports.easyPeasy.button_observer={ observe() { setTimeout(()=>exports.easyPeasy.addButtons(), 200); } }; Services.obs.addObserver(exports.easyPeasy.button_observer, 'unified-toolbar-state-change'); } //re-add buttons after a switch of folders gTabmail.tabInfo[0].chromeBrowser.contentWindow.addEventListener("folderURIChanged", (event)=>{ exports.easyPeasy.addButtons(); }); //re-add buttons after tabs has been switched const tabMonitor={ monitorName: "eaysPeasy_buttons", onTabTitleChanged(tab) {}, onTabClosing(tab) {}, onTabPersist(tab) {}, onTabRestored(tab, state) {}, onTabOpened(tab) {}, onTabSwitched(newTab, oldTab) { if (newTab.mode.name=='mail3PaneTab') { exports.easyPeasy.addButtons(); } }, }; gTabmail.registerTabMonitor(tabMonitor); })(this);