Полезная информация

Список ответов на каверзные вопросы можно получить в FAQ-разделе форума.

№177601-09-2017 15:00:31

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Palemoon 27.0

Re: Обсуждение кнопок CB

polk90
Очевидно тебе надо обновить Сustom Buttons на Custom Buttons • View topic - [Signed fixed extension attached] CB broken on Firefox 48+

Отсутствует

 

№177701-09-2017 21:00:41

polk90
Участник
 
Группа: Members
Зарегистрирован: 07-07-2005
Сообщений: 80
UA: Firefox 55.0

Re: Обсуждение кнопок CB

bunda1 пишет

надо обновить Сustom Buttons на Custom Buttons fixed extension

ааа... Супер, оно!
Спасибо!

Отсутствует

 

№177801-09-2017 22:08:00

Gladius333
Забанен
 
Группа: Members
Зарегистрирован: 11-02-2017
Сообщений: 92
UA: Firefox 52.0

Re: Обсуждение кнопок CB

Спасибо пойдет, только жаль что один код надо в кнопке держать, а один в стиле.
Но все равно спасибо! Кстати в кнопке "Toggle Find+" есть все что надо, но хотелось обойтись без кнопки а функций в код, -1 кнопка которая маячит.

Отсутствует

 

№177902-09-2017 01:17:06

rgdru
Участник
 
Группа: Members
Зарегистрирован: 07-04-2013
Сообщений: 36
UA: Palemoon 26.0

Re: Обсуждение кнопок CB

Кнопка VT ( Firefox10+ )
В консоле ошибок
"Метка времени: 02.09.2017 6:46:45
Ошибка: TypeError: bgc.match(...) is null
Источник: chrome://custombuttons-context/content/button.js?windowId=Firefox&id=custombuttons-button0@init line 1 > Function
Строка: 226"
Pale Moon 27.4.2 Win7 32

Отредактировано rgdru (02-09-2017 06:54:00)

Отсутствует

 

№178002-09-2017 09:47:46

Quartz1t
Участник
 
Группа: Members
Зарегистрирован: 25-11-2013
Сообщений: 111
UA: Palemoon 27.0

Re: Обсуждение кнопок CB

Помогите найти кнопку. Кнопка регулировала количество загрузки вкладок. Похожа на это дополнение.

Также хочу задать вопрос о кнопке VT. Можно ли в ней ограничить размер иконок? Скажем, чтобы иконки были 16 пикс.

Отсутствует

 

№178102-09-2017 10:19:59

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Palemoon 27.0

Re: Обсуждение кнопок CB

rgdru пишет

Кнопка VT ( Firefox10+ )
В консоле ошибок
"Метка времени: 02.09.2017 6:46:45
Ошибка: TypeError: bgc.match(...) is null
Источник: chrome://custombuttons-context/content/button.js?windowId=Firefox&id=custombuttons-button0@init line 1 > Function
Строка: 226"
Pale Moon 27.4.2 Win7 32

А ты менял тему или обои? Попробуй это:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u041F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u0432%u0435%u0440%u0442%u0438%u043A%u0430%u043B%u044C%u043D%u0443%u044E%20%u043F%u0430%u043D%u0435%u043B%u044C%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAKP+AAIX/gAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAFf+AABUAAAAAAAAAAAAAAAAAAAAA/4AAJP+AAP//gAD//4AA//+AACQAAAAAAAAAAAAAAAAAAAAA/4AAEv+AAP//gAD//4AAEgAAAAAAAAAA/4AAIP+AAP//gAD//4AA//+AAP//gAD//4AAJgAAAAAAAAAAAAAAAP+AABH/gAD//4AA//+AABEAAAAAAAAAAP+AAP//gAD//4AA//+AADb/gAD//4AA//+AAP//gAAQAAAAAAAAAAD/gAAP/4AA//+AAP//gAAPAAAAAAAAAAD/gAD//4AA//+AACAAAAAA/4AAIP+AAP//gAD//4AAEQAAAAAAAAAA/4AAD/+AAP//gAD//4AADwAAAAAAAAAA/4AA//+AAP//gAAMAAAAAP+AAAz/gAD//4AA//+AAA8AAAAAAAAAAP+AAA//gAD//4AA//+AAA8AAAAAAAAAAP+AAP//gAD//4AADwAAAAD/gAAP/4AA//+AAP//gAAPAAAAAAAAAAD/gAAP/4AA//+AAP//gAAPAAAAAAAAAAD/gAD//4AA//+AAA8AAAAA/4AAD/+AAP//gAD//4AADAAAAAAAAAAA/4AACv+AAP//gAD//4AACgAAAAAAAAAA/4AA//+AAP//gAAPAAAAAP+AAA//gAD//4AA//+AAAv/gAAL/4AADP+AACH/gAD//4AA//+AACH/gAAK/4AAD/+AAP//gAD//4AAEQAAAAD/gAAR/4AA//+AAP//gAAm/4AA//+AAP//gAD//4AA//+AAP//gAD//4AA//+AAP//gAD//4AA//+AABIAAAAA/4AAEv+AAP//gAD//4AAJ/+AAP//gAD//4AA//+AAP//gAD//4AA//+AAP//gAD//4AAEf+AABIAAAAAAAAAAAAAAAD/gAAV/4AAEgAAAAD/gAAQ/4AAEf+AAA//gAAP/4AAD/+AAA//gAAP/4AADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//+sQe//rEHH56xBg8OsQQHDrEEAw6xBEMOsQRDDrEEQw6xBEMOsQRAArEEQAKxBEACsQTkArEH//6xB//+sQQ%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bvar%20button%20%3D%20this%3B%0A%0Aconst%20sideBarAutoClose%20%3D%20false%3B%20%20//%20true%20%3D%3E%20%u0432%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u0430%u0432%u0442%u043E%20%u0437%u0430%u043A%u0440%u044B%u0442%u0438%u0435%20%u0431%u043E%u043A%u043E%u0432%u043E%u0439%20%u043F%u0430%u043D%u0435%u043B%u0438%20%0Aconst%20autoCloseDelay%20%3D%20500%3B%20%20%20%20%20//%20ms%0A%0Aconst%20showDelay%20%3D%20250%3B%09%09//%20ms%0Aconst%20distanceShow%20%3D%202%3B%09%09//%20px%0Aconst%20distanceHide%20%3D%2064%3B%09//%20px%0Aconst%20vtWidthCorrection%20%3D%20-1%3B%09//%20px%20%28%20number%20%5B%20+%20or%20-%20%5D%20%29%0A%0Aconst%20toolbarId%20%3D%20%22vertical_toolbar%22%3B%0Aconst%20toolboxId%20%3D%20toolbarId%20+%20%22_toolbox%22%3B%0Aconst%20sep%20%3D%20%22%5Cu00A0%22%3B%0Aconst%20firstAttributes%20%3D%20%22%5C%0Aid%20%25id%25%20class%20chromeclass-toolbar%20fullscreentoolbar%20true%20context%20toolbar-context-menu%20_width%2020%20%5C%0Acustomizable%20true%20flex%201%20iconize%20large%20mode%20icons%20orient%20vertical%20widthcorr%200%22%0A.replace%28/%20/g%2C%20sep%29.replace%28/%25id%25/%2C%20toolbarId%29%3B%0A%0A//%20....................................................................................................%0A%0Aconst%20pn%20%3D%20%22custombutton.verticaltoolbar.attributes%22%3B%0Avar%20prefs%20%3D%20Application.prefs%3B%0Aif%20%28%21prefs.has%28pn%29%29%20prefs.setValue%28pn%2C%20firstAttributes%29%3B%0Avar%20pref%20%3D%20prefs.get%28pn%29%3B%0Afunction%20getAttr_pref%28%29%20%7B%0A%09return%20pref.value%0A%7D%0Afunction%20setAttr_pref%28%29%20%7B%0A%09pref.value%20%3D%20%22%22%3B%0A%09Array.slice%28document.getElementById%28toolbarId%29.attributes%29.forEach%28function%28attr%29%20%7B%0A%09%09pref.value%20+%3D%20%28attr.name%20+%20sep%20+%20attr.value%20+%20sep%29%3B%0A%09%7D%29%3B%0A%7D%0A//%20....................................................................................................%0A%0Avar%20browser%20%3D%20document.getElementById%28%22browser%22%29%3B%0Avar%20toolbar%20%3D%20document.getElementById%28toolbarId%29%3B%0Avar%20toolbox%20%3D%20document.getElementById%28toolboxId%29%3B%0A%0Aif%20%28%21toolbar%29%20%7B%0A%0A%09toolbox%20%3D%20document.createElement%28%22toolbox%22%29%3B%0A%09toolbox.id%20%3D%20toolboxId%3B%0A%09toolbox.palette%20%3D%20gNavToolbox.palette%3B%0A%09%0A%09toolbar%20%3D%20document.createElement%28%22toolbar%22%29%3B%0A%09toolbar.style.minWidth%20%3D%20%2220px%22%3B%0A%09%0A%09browser.insertBefore%28toolbox%2C%20browser.firstChild%29%3B%0A%09toolbox.appendChild%28toolbar%29%3B%0A%0A//%20....................................................................................................%0A//%20Thanks%20-%20http%3A//nanto.asablo.jp/blog/2007/04/22/1459018%0A%0A%09const%20style%20%3D%27%5C%0A%5C%0A%09toolbar%5Borient%3D%22vertical%22%5D%20%7B%5Cn%5C%0A%09%09-moz-appearance%3A%20none%3B%5Cn%5C%0A%09%09border-bottom%3A%200px%20none%3B%5Cn%5C%0A%09%09border-top%3A%200px%20none%3B%5Cn%5C%0A%09%09border-right%3A%201px%20solid%20rgb%28170%2C%20188%2C%20207%29%3B%5Cn%5C%0A%09%09background%3A%20none%20repeat%20scroll%200%25%200%25%20rgb%28207%2C%20219%2C%20236%29%3B%5Cn%5C%0A%09%09-image%3A%20-moz-linear-gradient%28rgba%28255%2C%20255%2C%20255%2C%20.5%29%2C%20rgba%28255%2C%20255%2C%20255%2C%200%29%2027px%29%20%21important%3B%5Cn%5C%0A%7D%5Cn%5C%0A%09toolbar%5Borient%3D%22vertical%22%5D%20%3E%20toolbarseparator%2C%5Cn%5C%0A%09toolbar%5Borient%3D%22vertical%22%5D%20%3E%20%5Bid%5E%3D%22wrapper-separator%22%5D%20%7B%5Cn%5C%0A%09%09-moz-appearance%3A%20none%20%21important%3B%5Cn%5C%0A%09%09margin%3A%200.2em%202px%3B%5Cn%5C%0A%09%09border-bottom%3A%201px%20solid%20ThreeDHighlight%3B%5Cn%5C%0A%09%09border-top%3A%201px%20solid%20ThreeDShadow%3B%5Cn%5C%0A%09%09height%3A%202px%3B%5Cn%5C%0A%09%09border-left%3A%20none%3B%5Cn%5C%0A%09%09border-right%3A%20none%3B%5Cn%5C%0A%7D%5Cn%5C%0A%09toolbar%5Borient%3D%22vertical%22%5D%20%3E%20toolbarspacer%2C%5Cn%5C%0A%09toolbar%5Borient%3D%22vertical%22%5D%20%3E%20%5Bid%5E%3D%22wrapper-spacer%22%5D%20%7B%20height%3A%2015px%3B%20%7D%27%0A%0A%09var%20sspi%20%3D%20document.createProcessingInstruction%28%27xml-stylesheet%27%2C%0A%09%09%20%20%27type%3D%22text/css%22%20href%3D%22data%3Atext/css%2C%27%20+%20encodeURI%28style%29%20+%20%27%22%27%29%3B%0A%09document.insertBefore%28sspi%2C%20document.documentElement%29%3B%0A%0A//%20....................................................................................................%0A%0A%09var%20attr%20%3D%20getAttr_pref%28%29.split%28sep%29%3B%0A%09for%20%28var%20i%3D0%3B%20i%3C%28attr.length-1%29%3B%20i+%3D2%29%20%7B%20toolbar.setAttribute%28attr%5Bi%5D%2C%20attr%5Bi+1%5D%29%3B%20%7D%0A%0A%09var%20currentSet%20%3D%20toolbar.getAttribute%28%22currentset%22%29.split%28%22%2C%22%29%3B%0A%09currentSet.forEach%28function%28id%29%7B%20toolbar.insertItem%28id%29%3B%20%7D%29%3B%0A%7D%0A//%20....................................................................................................%0A%0Avar%20et%20%3D%20gNavToolbox.externalToolbars%3B%0Avar%20already%20%3D%20false%3B%0Afor%20%28var%20i%3D0%3B%20i%3Cet.length%3B%20i++%29%20%7B%20if%20%28et%5Bi%5D%20%3D%3D%20toolbar%29%20%7B%20already%20%3D%20true%3B%20break%20%7D%20%7D%0Aif%20%28%21already%29%20et%5Bet.length%5D%20%3D%20toolbar%3B%0A%0Avar%20delta%20%3D%20toolbar.getAttribute%28%22widthcorr%22%29%20-%20vtWidthCorrection%3B%0Atoolbar.setAttribute%28%22widthcorr%22%2C%20vtWidthCorrection%29%3B%0Aif%20%28delta%29%20toolbar.setAttribute%28%22_width%22%2C%20toolbar.getAttribute%28%22_width%22%29%20-%20delta%29%3B%0A%0Afunction%20lock%28%29%20%7B%0A%0A%09var%20width%20%3D%20toolbar.getAttribute%28%22_width%22%29%3B%0A%09%0A%09toolbox.style.position%20%3D%20toolbar.hasAttribute%28%22autohide%22%29%20%3F%20%22%22%20%3A%20%22fixed%22%3B%0A%09toolbox.style.height%20%3D%0A%09toolbar.style.height%20%3D%20browser.boxObject.height%20+%20%22px%22%3B%0A%0A%09toolbar.style.maxWidth%20%3D%0A%09toolbar.style.minWidth%20%3D%0A%09toolbox.style.maxWidth%20%3D%0A%09toolbox.style.minWidth%20%3D%20width%20*%20%21toolbar.collapsed%20+%20%22px%22%3B%09%0A%7D%0Afunction%20beforeCustomize%28%29%20%7B%0A%0A%09toolbox.removeAttribute%28%22style%22%29%3B%0A%09toolbox.removeAttribute%28%22width%22%29%3B%0A%09toolbar.removeAttribute%28%22style%22%29%3B%0A%09toolbar.style.minWidth%20%3D%20%2220px%22%3B%0A%7D%0Afunction%20customizationChange%28%29%20%7B%0A%09window.setTimeout%28function%28%29%20%7B%0A%09%09toolbar.setAttribute%28%22_width%22%2C%20toolbar.boxObject.width%20+%20vtWidthCorrection%29%3B%0A%09%7D%2C%20640%29%3B%0A%7D%0Afunction%20afterCustomize%28%29%20%7B%0A%0A%09setAttr_pref%28%29%3B%0A%09removeListeners%28%29%3B%0A%09lock%28%29%3B%0A%7D%0Afunction%20collapser%28e%29%20%7B%0A%0A%09var%20distance%20%3D%20e.screenX%20-%20browser.boxObject.screenX%3B%0A%09if%20%28toolbar.waiting%29%20return%3B%0A%0A%09if%20%28%28distance%20%3C%3D%20distanceShow%29%20%26%26%20%28toolbar.collapsed%29%29%20%7B%0A%0A%09%09if%20%28showDelay%20%3C%201%29%20%7B%20toolbar.collapsed%20%3D%20false%3B%20lock%28%29%3B%20return%3B%20%7D%0A%0A%09%09toolbar.waiting%20%3D%20true%3B%0A%09%09window.setTimeout%28function%28%29%20%7B%0A%0A%09%09%09if%20%28distance%20%3E%3D%20distanceShow%29%20%7B%20toolbar.waiting%20%3D%20false%3B%20return%3B%20%7D%0A%09%09%09toolbar.collapsed%20%3D%20false%3B%0A%09%09%09lock%28%29%3B%0A%09%09%09toolbar.waiting%20%3D%20false%3B%0A%0A%09%09%7D%2C%20showDelay%29%3B%0A%09%7D%0A%09if%20%28%28distance%20%3E%3D%20distanceHide%29%20%26%26%20%28%21toolbar.collapsed%29%29%20%7B%0A%09%09toolbar.collapsed%20%3D%20true%3B%0A%09%09lock%28%29%3B%0A%09%7D%0A%7D%0Afunction%20removeListeners%28%29%20%7B%0A%0A%09gNavToolbox.removeEventListener%28%22beforecustomization%22%2C%20beforeCustomize%2C%20false%29%3B%0A%09gNavToolbox.removeEventListener%28%22customizationchange%22%2C%20customizationChange%2C%20false%29%3B%0A%09gNavToolbox.removeEventListener%28%22aftercustomization%22%2C%20afterCustomize%2C%20false%29%3B%0A%7D%0A%0Athis.onclick%20%3D%20function%28e%29%20%7B%20%0A%0A%09if%20%28e.button%29%20return%3B%0A%0A%09var%20autohide%20%3D%20toolbar.hasAttribute%28%22autohide%22%29%3B%0A%09toolbar.collapsed%20%3D%20autohide%3B%0A%0A%09if%20%28%21autohide%29%20%7B%0A%09%09browser.removeEventListener%28%22mousemove%22%2C%20collapser%2C%20false%29%3B%0A%09%09toolbar.setAttribute%28%22autohide%22%2C%20%22true%22%29%3B%0A%09%7D%0A%09else%20%7B%0A%09%09browser.addEventListener%28%22mousemove%22%2C%20collapser%2C%20false%29%3B%0A%09%09toolbar.removeAttribute%28%22autohide%22%29%3B%0A%09%7D%0A%09lock%28%29%3B%0A%7D%0A%0Atoolbar.ondblclick%20%3D%20function%28e%29%20%7B%0A%0A%09if%20%28%20e.button%20%7C%7C%20e.target.nodeName%20%3D%3D%20%22toolbarbutton%22%0A%09%20%20%09%20%20%20%20%20%20%7C%7C%20e.target.nodeName%20%3D%3D%20%22toolbaritem%22%20%29%20return%3B%0A%09button.click%28%29%3B%0A%7D%0A//%20....................................................................................................%0A%0Aif%20%28%21toolbar.hasAttribute%28%22autohide%22%29%29%20%7B%0A%09browser.addEventListener%28%22mousemove%22%2C%20collapser%2C%20false%29%3B%0A%7D%0Aelse%20toolbar.setAttribute%28%22autohide%22%2C%20%22true%22%29%3B%0A%0Alock%28%29%3B%0A%0AgNavToolbox.addEventListener%28%22beforecustomization%22%2C%20beforeCustomize%2C%20false%29%3B%0AgNavToolbox.addEventListener%28%22customizationchange%22%2C%20customizationChange%2C%20false%29%3B%0AgNavToolbox.addEventListener%28%22aftercustomization%22%2C%20afterCustomize%2C%20false%29%3B%0A%0A%0A%0A%0Afunction%20addBackground%28e%29%20%7B%0A%20%20%20setTimeout%28function%28%29%20%7B%0A%20%20%20%20%20%20var%20toolbar%20%3D%20document.getElementById%28%27vertical_toolbar%27%29%3B%0A%20%20%20%20%20%20var%20win%20%3D%20document.getElementById%28%22main-window%22%29%3B%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20var%20image%20%3D%20win.style.backgroundImage%3B%0A%20%20%20%20%20%20if%20%28%20image%20%3D%3D%20%27%27%20%29%20%7B%20%0A%20%20%20%20%20%20%20%20%20%20%20toolbar.style.background%20%3D%20%27%27%3B%0A%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20toolbar.style.background%20%3D%20image%3B%0A%20%20%20%20%20%20toolbar.style.backgroundSize%20%3D%20%27auto%20100%25%27%3B%0A%20%20%20%7D%2C%20500%29%3B%0A%7D%3B%0AaddBackground%28%29%3B%20%0AServices.obs.addObserver%28addBackground%2C%20%22lightweight-theme-styling-update%22%2C%20false%29%3B%0AaddDestructor%28%28%29%3D%3E%20Services.obs.removeObserver%28addBackground%2C%20%22lightweight-theme-styling-update%22%29%20%29%3B%20%0A%0A%0A%0A%0Aconst%20MPT%20%3D%20window.MousePosTracker%20%7C%7C%20%7B%20_x%3A%200%2C%20handleEvent%3A%20function%28e%29%20this._x%20%3D%20e.screenX%20%7D%3B%0Afunction%20handlePopup%28e%29%20%7B%0A%0A%20%20%20%20if%20%28toolbar.hasAttribute%28%22autohide%22%29%20%7C%7C%20toolbar.collapsed%20%7C%7C%20e.target.nodeName%20%21%3D%20%22menupopup%22%29%20return%3B%0A%0A%20%20%20%20var%20count%20%3D%20Array.filter%28document.getElementsByTagName%28%22menupopup%22%29%2C%20function%28popup%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28popup.state%20%21%3D%20%22open%22%29%20return%20false%3B%0A%20%20%20%20%20%20%20%20for%20%28var%20node%20%3D%20popup.triggerNode%20%7C%7C%20popup%3B%20node%3B%20node%20%3D%20node.parentNode%29%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28node%20%3D%3D%20toolbar%29%20return%20true%3B%0A%20%20%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%7D%29.length%3B%0A%0A%20%20%20%20if%20%28e.type%20%3D%3D%20%22popupshown%22%20%26%26%20count%20%3D%3D%201%29%20%7B%0A%20%20%20%20%20%20%20%20browser.removeEventListener%28%22mousemove%22%2C%20collapser%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20%21MPT._y%20%26%26%20window.addEventListener%28%22mousemove%22%2C%20MPT%2C%20false%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28e.type%20%3D%3D%20%22popuphidden%22%20%26%26%20count%20%3D%3D%200%29%20%7B%0A%20%20%20%20%20%20%20%20browser.addEventListener%28%22mousemove%22%2C%20collapser%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20%21MPT._y%20%26%26%20window.removeEventListener%28%22mousemove%22%2C%20MPT%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20MPT._x%20%3E%20distanceHide%20%26%26%20lock%28toolbar.collapsed%20%3D%20true%29%3B%0A%20%20%20%20%7D%0A%7D%0A%5B%22popupshown%22%2C%20%22popuphidden%22%5D.forEach%28function%28type%29%20addEventListener%28type%2C%20handlePopup%2C%20true%29%29%3B%0A%0Aconst%20topic%20%3D%20custombuttons.cbService.getNotificationPrefix%28window%29%20+%20%22removeButton%22%3B%0Aconst%20obsrv%20%3D%20%7B%20observe%3A%20function%28%29%20handlePopup%28%7B%20type%3A%20%22popuphidden%22%2C%20target%3A%20%7B%20nodeName%3A%20%22menupopup%22%20%7D%20%7D%29%20%7D%3B%0AServices.obs.addObserver%28obsrv%2C%20topic%2C%20false%29%3B%0AaddDestructor%28function%28%29%20Services.obs.removeObserver%28obsrv%2C%20topic%29%29%3B%0A%0A%0A%0Afunction%20fsl%28%29%20FullScreen._isAnimating%20%3F%20lock%28setTimeout%28fsl%2C%2050%29%29%20%3A%20window.setTimeout%28lock%2C%2050%29%3B%0AaddEventListener%28%22fullscreen%22%2C%20function%28%29%20setTimeout%28lock%2C%200%29%20%26%26%20fsl%28%29%2C%20true%29%3B%0A%0A%0A%0Afunction%20n%28id%29%20document.getElementById%28id%29%3B%0Aconst%20page%20%3D%20n%28%22content%22%29%2C%20box%20%3D%20n%28%22sidebar-box%22%29%2C%20sidebar%20%3D%20n%28%22sidebar%22%29%3B%0Avar%20tvtc%2C%20timeout%3B%0A%0Afunction%20listenMO%28node%2C%20listen%29%20%7B%0A%20%20%20%20var%20func%20%3D%20node%20%3D%3D%20box%20%3F%20onBMO%20%3A%20onPMO%3B%0A%20%20%20%20%28listen%20%3F%20addEventListener%20%3A%20removeEventListener%29%0A%20%20%20%20.apply%28this%2C%20%5B%22mouseover%22%2C%20func%2C%20false%2C%20node%5D%29%3B%0A%7D%0Afunction%20onPMO%28%29%20%7B%0A%20%20%20%20listenMO%28page%2C%20false%29%3B%0A%20%20%20%20timeout%20%3D%20setTimeout%28hideSB%2C%20autoCloseDelay%20%29%3B%0A%20%20%20%20listenMO%28box%2C%20true%29%3B%0A%7D%0Afunction%20onBMO%28%29%20%7B%0A%20%20%20%20listenMO%28box%2C%20false%29%3B%0A%20%20%20%20clearTimeout%28timeout%29%3B%0A%20%20%20%20listenMO%28page%2C%20true%29%3B%0A%7D%0Afunction%20hideSB%28%29%20%7B%0A%20%20%20%20listenMO%28box%2C%20false%29%3B%0A%20%20%20%20if%20%28box.hidden%29%20return%3B%0A%20%20%20%20var%20id%20%3D%20box.getAttribute%28%22sidebarcommand%22%29%20%7C%7C%20%22viewBookmarksSidebar%22%3B%0A%20%20%20%20n%28id%29.setAttribute%28%22checked%22%2C%20true%29%3B%0A%20%20%20%20toggleSidebar%28id%29%3B%0A%7D%0Afunction%20onSBL%28%29%20%7B%0A%20%20%20%20var%20time%20%3D%20Date.now%28%29%3B%0A%20%20%20%20listenMO%28page%2C%20false%29%3B%0A%20%20%20%20if%20%28time%20-%20tvtc%20%3C%20800%29%20listenMO%28page%2C%20true%29%3B%0A%7D%0Afunction%20onVTC%28e%29%20%7B%0A%20%20%20%20var%20time%20%3D%20Date.now%28%29%3B%0A%20%20%20%20for%20%28var%20node%20%3D%20e.target%3B%20node%3B%20node%20%3D%20node.parentNode%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28node%20%21%3D%20toolbar%29%20continue%3B%0A%20%20%20%20%20%20%20%20tvtc%20%3D%20time%3B%0A%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%7D%0A%7D%0Afunction%20ael%28add%29%20%7B%0A%20%20%20%20%5B%20%20%20%20%5B%22DOMContentLoaded%22%2C%20onSBL%2C%20false%2C%20sidebar%5D%2C%0A%20%20%20%20%20%20%20%20%5B%22click%22%2C%20onVTC%2C%20false%2C%20window%5D%2C%0A%20%20%20%20%20%20%20%20%5B%22command%22%2C%20onVTC%2C%20false%2C%20window%5D%0A%20%20%20%20%5D.forEach%28function%28args%29%20%7B%0A%20%20%20%20%20%20%20%20%28add%20%3F%20addEventListener%20%3A%20removeEventListener%29.apply%28this%2C%20args%29%3B%0A%20%20%20%20%7D%29%3B%0A%7D%0Aif%20%28%20sideBarAutoClose%20%29%20ael%28true%29%3B%0A%0A%0A%0Athis.onDestroy%20%3D%20function%28reason%29%20%7B%0A%09browser.removeEventListener%28%22mousemove%22%2C%20collapser%2C%20false%29%3B%0A%09if%20%28%21toolbar.hasAttribute%28%22customizing%22%29%29%20removeListeners%28%29%3B%0A%09if%20%28reason%20%3D%3D%20%22delete%22%29%20pref.reset%28%29%3B%0A%09if%20%28%21getAttr_pref%28%29%29%20return%3B%0A%09setAttr_pref%28%29%3B%0A%09%0A%09ael%28false%29%3B%0A%7D%3B%0A%0A%0A%0Athis.style.cssText%20%3D%20%22opacity%3A%201%20%21important%3B%22%3B%20//%20Css%20%u0441%u0442%u0438%u043B%u044C%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Добавлено 02-09-2017 10:26:22

Quartz1t пишет

Также хочу задать вопрос о кнопке VT. Можно ли в ней ограничить размер иконок? Скажем, чтобы иконки были 16 пикс.

Да, можно. В userChrome.css:

Выделить код

Код:

#vertical_toolbar .toolbarbutton-icon { -moz-appearance: none !important; height: 16px !important; width: 16px !important; }

Отредактировано bunda1 (02-09-2017 10:26:22)

Отсутствует

 

№178202-09-2017 11:01:06

difabor
Участник
 
Группа: Members
Зарегистрирован: 21-09-2013
Сообщений: 539
UA: Firefox 52.0
Веб-сайт

Re: Обсуждение кнопок CB

Quartz1t пишет

Помогите найти кнопку. Кнопка регулировала количество загрузки вкладок. Похожа на это дополнение.

Посмотрите здесь Приведённый ниже код почти то же, но учитывает конфликт с расширением Link Status Redux:

LoadTabProgressively

Выделить код

Код:

var allTabMax = 20; // максимальное число табов 
var tabArray = [];  

// Отслеживать открытие, закрытие вкладок и восстановление сессии ..... 
function tabHandler(e) {
   var tab = e.target; 
   var selTabPos = gBrowser.selectedTab._tPos;
   var xbw = XULBrowserWindow.statusTextField.label.split(' ')
      [(XULBrowserWindow.statusTextField.label.split(' ').length>1)+0];
   
   // прятать и закрывать лишние вкладки, сохранить их адреса в массив 
   if ( e.type !== "TabClose" && gBrowser.tabs.length > allTabMax ) {
        tabArray.push( (e.type == 'TabOpen') ? 
        (tab.label == "Новая вкладка") ? xbw : tab.label : 
        tab.linkedBrowser.contentDocument.location );
        tab.style.display = 'none';
        setTimeout(function() { gBrowser.removeTab( tab ); }, 150);     
    
    // открывать сохранение адреса и удалять их из массива     
    if ( e.type == "TabClose" && gBrowser.tabs.length < allTabMax && tabArray.length > 0 ) {
         gBrowser.loadOneTab( (tabArray.shift()).trim(), null, null, null, true, false);   }
};
var container = gBrowser.tabContainer;
addEventListener("TabOpen", tabHandler, true, container );
addEventListener("TabClose", tabHandler, false, container );
addEventListener("SSTabRestoring", tabHandler, false, container );


Сейчас я её не использую и не проверял - работает ли она на новейших версиях [firefox]
Это код bunda1, oн не требует отдельной кнопки. Можно добавить в существующую.

Отредактировано difabor (02-09-2017 11:02:40)


Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©

Отсутствует

 

№178302-09-2017 15:21:07

rgdru
Участник
 
Группа: Members
Зарегистрирован: 07-04-2013
Сообщений: 36
UA: Palemoon 27.0

Re: Обсуждение кнопок CB

bunda1 пишет

А ты менял тему или обои?

Я кнопку установил впервые.Заметил ошибку в консоли,поэтому сообщил сюда.
Сейчас ошибки нет.
Спасибо!

Отсутствует

 

№178402-09-2017 17:07:31

Quartz1t
Участник
 
Группа: Members
Зарегистрирован: 25-11-2013
Сообщений: 111
UA: Palemoon 27.0

Re: Обсуждение кнопок CB

difabor пишет

Посмотрите здесь Приведённый ниже код почти то же, но учитывает конфликт с расширением Link Status Redux:

Похожее, но не то, и на РМ не работает.

Нашёл.

Отредактировано Quartz1t (02-09-2017 22:02:46)

Отсутствует

 

№178505-09-2017 04:28:23

polk90
Участник
 
Группа: Members
Зарегистрирован: 07-07-2005
Сообщений: 80
UA: Firefox 55.0

Re: Обсуждение кнопок CB

не работатет кнопка Tab History, (брал там)
позволяла новой вкладке наследовать историю родительской вкладки,

Инициализация

Выделить код

Код:

var TU_hookCode = TU_hookMethod;
function TU_hookMethod(aStr) {
  try {
    var namespaces = aStr.split(".");

    try {
      var object = this;
      while (namespaces.length > 1) {
        object = object[namespaces.shift()];
      }
    }
    catch (e) {
      throw TypeError(aStr + " is not a function");
    }

    var method = namespaces.pop();
    if (typeof object[method] != "function")
      throw TypeError(aStr + " is not a function");

    return object[method] = TU_hookFunc.apply(this, Array.concat(object[method], Array.slice(arguments, 1)));
  }
  catch (e) {
    Components.utils.reportError("Failed to hook " + aStr + ": " + e.message);
  }
}
function TU_hookFunc(aFunc) {
  var myCode = aFunc.toString();
  for (var i = 1; i < arguments.length;) {
    if (arguments[i].constructor.name == "Array") {
      var [orgCode, newCode, flags] = arguments[i++];
    }
    else {
      var [orgCode, newCode, flags] = [arguments[i++], arguments[i++], arguments[i++]];
    }

    if (typeof newCode == "function" && newCode.length == 0)
      newCode = newCode.toString().replace(/^.*{|}$/g, "");

    switch (orgCode) {
      case "{": [orgCode, newCode] = [/{/, "$&\n" + newCode];break;
      case "}": [orgCode, newCode] = [/}$/, newCode + "\n$&"];break;
    }

    if (typeof orgCode == "string")
      orgCode = RegExp(orgCode.replace(/[{[(\\^|$.?*+/)\]}]/g, "\\$&"), flags || "");

    myCode = myCode.replace(orgCode, newCode);
  }

  return eval("(" + myCode + ")");
}

  TU_hookCode("gBrowser.loadOneTab",
    ["{", function() {
      var currentTab = this.mCurrentTab;
    }],
    [/(?=return tab;)/, function() {
      if (aReferrerURI/* && TU_getPref("extensions.tabutils.openLinkWithHistory", false)*/) {
        let currentHistory = currentTab.linkedBrowser.sessionHistory;
        let newHistory = tab.linkedBrowser.sessionHistory.QueryInterface(Ci.nsISHistoryInternal);
        for (let i = 0; i <= currentHistory.index; i++) {
          newHistory.addEntry(currentHistory.getEntryAtIndex(i, false), true);
        }
      }
    }]
  );


посмотрите пожалуйста, можно поправить?

Отсутствует

 

№178613-09-2017 09:08:41

SOTVM
Участник
 
Группа: Members
Зарегистрирован: 30-01-2012
Сообщений: 112
UA: Firefox 52.0

Re: Обсуждение кнопок CB

опять не работает кнопка вставки спецсимволов
код взят Insert special symbol(Firefox) All the versions
раньше всё работало ,не могу понять в чём проблема:angry:
пробовал с версией CB из магазина (вообще кнопки не работают)
скачал с sourceforge.net custom_buttons-0.0.5.8.9-fixed4-signed.xpi.zip
удалил старую версию CB и саму кнопку ,поставил новую = другие кнопки заработали ,а эта не работает:blush:
пробовал отключать все дополнения стили и темы (оставил только CB)

Firefox 52.3.0 (64бити)ESR Linux

Отредактировано SOTVM (13-09-2017 09:19:13)


Никто не знает столько,сколько не знаю Я.

Отсутствует

 

№178713-09-2017 16:26:57

firepox
Участник
 
Группа: Members
Зарегистрирован: 17-11-2011
Сообщений: 358
UA: Firefox 55.0

Re: Обсуждение кнопок CB

Спасибо за отличную кнопку: https://forum.mozilla-russia.org/viewtopic.php?pid=708281#p708281
С помощью этой кнопки создаю различные кнопки запусков .CMD файлов.

Можно добавить сюда?:

2di1103.png

cmd и bat

и еще, на данный момент иконку невозможно назначить, если запуск указан  cmd и bat файла.
Иконка не отображается, а если зайти в редактирование панелей  - видно назначенную иконку.

Спасибо!

Отсутствует

 

№178813-09-2017 18:15:15

firepox
Участник
 
Группа: Members
Зарегистрирован: 17-11-2011
Сообщений: 358
UA: Firefox 55.0

Re: Обсуждение кнопок CB

делюсь способом быстрого бэкапа firefox, возможно, кому-то пригодится)

Backup Firefox.cmd - кладем в корень портативного Ferefox.

скрытый текст
https://pastebin.com/dWNfn3Gg

Запускаем Backup Firefox.cmd \ в папке Backup Firefox создается архивная копия.
Я запускаю кнопкой в firefox - быстро и удобно. Рекомендую)

2wod2fk.png

Нужен 7-Zip

Отредактировано firepox (14-09-2017 01:16:01)

Отсутствует

 

№178913-09-2017 19:17:34

difabor
Участник
 
Группа: Members
Зарегистрирован: 21-09-2013
Сообщений: 539
UA: Firefox 52.0
Веб-сайт

Re: Обсуждение кнопок CB

SOTVM пишет

опять не работает кнопка вставки спецсимволов
код взят Insert special symbol(Firefox) All the versions
раньше всё работало ,не могу понять в чём проблема:angry:
пробовал с версией CB из магазина (вообще кнопки не работают)
скачал с sourceforge.net custom_buttons-0.0.5.8.9-fixed4-signed.xpi.zip
удалил старую версию CB и саму кнопку ,поставил новую = другие кнопки заработали ,а эта не работает:blush:
пробовал отключать все дополнения стили и темы (оставил только CB)

Firefox 52.3.0 (64бити)ESR Linux

А что именно не работает?
У меня на Windows работает. Правда, у меня она слегка модифицирована...


Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©

Отсутствует

 

№179014-09-2017 08:19:46

SOTVM
Участник
 
Группа: Members
Зарегистрирован: 30-01-2012
Сообщений: 112
UA: Firefox 52.0

Re: Обсуждение кнопок CB

difabor пишет

А что именно не работает?
У меня на Windows работает. Правда, у меня она слегка модифицирована...

уже починил :lol: пол дня "парился"
когда вставлял свои символы в код,затёр случайно пару символов в самом конце строки ";
нашёл методом сравнения  двух файлов/кода  по содержанию (в linux программа Meld

Отредактировано SOTVM (14-09-2017 08:22:14)


Никто не знает столько,сколько не знаю Я.

Отсутствует

 

№179122-09-2017 08:15:44

rgdru
Участник
 
Группа: Members
Зарегистрирован: 07-04-2013
Сообщений: 36
UA: Palemoon 27.0

Re: Обсуждение кнопок CB

Прошу поправить кнопку Save( Firefox 24 + ) от 07.03.2017 для работы в Pale Moon 27.
Не работют пункты меню "Сохранить выделенную область страницы как PNG-изображение,
Сохранить выбранный элемент страницы как PNG-изображение,
Сохранить видимую область страницы как PNG-изображение,
Сохранить всю страницу как  PNG-изображение".
В Консоле ошибок запись
Метка времени: 22.09.2017 14:11:25
Ошибка: NS_ERROR_XPC_NOT_ENOUGH_ARGS: Not enough arguments [nsIWebBrowserPersist.saveURI]
Источник: chrome://custombuttons-context/content/button.js?windowId=Firefox&id=custombuttons-button36@init line 1 > Function
Строка: 75

Отсутствует

 

№179222-09-2017 11:53:53

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2129
UA: Firefox 52.0

Re: Обсуждение кнопок CB

rgdru пишет

Not enough arguments

Выделить код

Код:

//parseInt(Services.appinfo.version) < 36
      wbp.saveURI.length < 8

Отсутствует

 

№179322-09-2017 12:26:18

rgdru
Участник
 
Группа: Members
Зарегистрирован: 07-04-2013
Сообщений: 36
UA: Palemoon 27.0

Re: Обсуждение кнопок CB

Dumby
Спасибо! Сейчас все нормально.

Отсутствует

 

№179430-09-2017 02:13:21

difabor
Участник
 
Группа: Members
Зарегистрирован: 21-09-2013
Сообщений: 539
UA: Firefox 52.0
Веб-сайт

Re: Обсуждение кнопок CB

Можно ли сделать кнопку, аналогичную VT ( Firefox10+ ), но чтоб он был справа?
Что надо поменять в ней для этого?


Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©

Отсутствует

 

№179530-09-2017 08:54:30

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 24.0

Re: Обсуждение кнопок CB

difabor пишет

Можно ли сделать кнопку, аналогичную VT ( Firefox10+ ), но чтоб он был справа?
Что надо поменять в ней для этого?

Кажется Dumby что то такое делал с VT. Может посмотри в его комментариях год или два назад.

Отсутствует

 

№179630-09-2017 15:55:32

difabor
Участник
 
Группа: Members
Зарегистрирован: 21-09-2013
Сообщений: 539
UA: Firefox 52.0
Веб-сайт

Re: Обсуждение кнопок CB

bunda1 пишет
difabor пишет

Можно ли сделать кнопку, аналогичную VT ( Firefox10+ ), но чтоб он был справа?
Что надо поменять в ней для этого?

Кажется Dumby что то такое делал с VT. Может посмотри в его комментариях год или два назад.

Спасибо.
Я комментарии Dumby не нашёл, но сумел полуклонировать его  VT, чтобы получился второй  VT, рядом с первым так, чтобы они выскакивали оба сразу и была возможность посадить на них в два раза больше иконок.
Изменения должны быть минимальными:
1. Надо изменить id: в оригинале: id: "cb-vt" -> я изменил на id: "cb-vt2". Менять надо это ещё в одном месте (почти в конце кода): var toolbar = document.getElementById('cb-vt'); -> var toolbar = document.getElementById('cb-vt2');
2. Надо изменить имя: name: "VT" -> name: "VT2" - это тоже в самом начале. Если это не изменить, катастрофы не произойдёт, но будет некрасиво - будут присутствовать два тулбара с одним и тем же именем. А вот id надо менять обязательно!
3. Надо изменить в стиле (это ближе к концу кода, ищите 'style: "-moz-appearance" и в этой строке добавить: left: 33px; после position: fixed; Примечание: 33рх - у меня, я немного сузил сам тулбар, вы должны подобрать для себя своё значение.
Сделайте сначала больше, скажем, >40рх. Между тулбарами при выскакивании будет щёлочка, оценив её величину -> уменьшите выбранное вами значение до приемлемого, чтобы щёлочка исчезла, но тулбары не налазили друг на друга.
4. Увеличьте distanceHide: (это в начале кода) на эту величину, чтобы второй тулбар прятался не вместе с первым.
----------------------------------------------------------------------------------------------------------------------
При перетаскивании иконок на второй тулбар, первый должен быть закрыт, и наоборот, если перетаскиваете иконку на первый тулбар. Открыт должен быть только тот верт. тулбар, на который вы собираетесь иконку перетащить
Если вы собираетесь перетащить иконку с одного тулбара на другой, используйте для этого промежуточный тулбар: сначала перетащите на него, выйдите из режима перетаскивания, закройте тот верт.тулбар, с которого перетаскивали и откройте тот, куда будете перетаскивать. Затем снова включите режим перетаскивания и перетащите с промежуточного тулбара на вертикальный.
----------------------------------------------------------------------------------------------------------------------
В принципе можно создать сколько угодно VT, а вне VT оставить только иконки-информеры, несущие какую-то информацию (часы, расход памяти и т.д., а также иконки самих VT)


Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©

Отсутствует

 

№179730-09-2017 17:18:01

villa7
Участник
 
Группа: Members
Зарегистрирован: 21-07-2012
Сообщений: 2235
UA: Firefox 42.0

Re: Обсуждение кнопок CB

difabor
Была кнопка VT2, панели появлялись и справа и слева, но она перестала работать в новых версиях, может удастся исправить.

скрытый текст

Выделить код

Код:

const leftVT = true;
const optLeftVT = {
    showDelay: 0,
    distanceShow: 10,
    distanceHide: 100,    // relative ∏↔
    widthCorrection: 7,
    animateTime: 0
};

const rightVT = true;
const optRightVT = {
    showDelay: 0,
    distanceShow: 1,
    distanceHide: 50,    // relative ↔∏
    widthCorrection: 7,
    animateTime: 0
};
this.tooltipText = "L:   toggle left VT\nM:  toggle background image\nR:   toggle right VT";

const sep = "\u00A0";
const firstAttributes = "\
class chromeclass-toolbar fullscreentoolbar true context toolbar-context-menu pwidth 20 \
customizable true flex 1 iconize large mode icons orient vertical bgimage true".replace(/ /g, sep);

const pn = "custombutton.VT2.", pnl = pn + "left", pnr = pn + "right";
const prefs = Application.prefs;
if (!prefs.has(pnl)) prefs.setValue(pnl, firstAttributes);
if (!prefs.has(pnr)) prefs.setValue(pnr, firstAttributes);
const vtlPref = prefs.get(pnl), vtrPref = prefs.get(pnr);

function setAttrs(vt) {
    vt.textContent = "";
    var attrs = (vt == vtl ? vtlPref : vtrPref).value.split(sep);
    for (var i = 0, l = attrs.length - 1; i < l; i += 2)
        vt.setAttribute(attrs[i], attrs[i + 1]);
    var currentSet = vt.getAttribute("currentset").split(",");
    currentSet.forEach(function(id) vt.insertItem(id));
}
function saveAttrs(vt) {
    var pref = vt == vtl ? vtlPref : vtrPref;
    if (!pref.value) return;
    pref.value = "";
    Array.slice(vt.attributes).forEach(function(attr) {
        if (attr.name != "width" && attr.name != "height")
            pref.value += attr.name + sep + attr.value + sep;
    });
}
const idp = "cb-vt";
function n(id) document.getElementById(id);

var vtl = n(idp + "-left"), vtlBox = n(idp + "-left-box");
var vtr = n(idp + "-right"), vtrBox = n(idp + "-right-box");
const browser = n("browser");

function createVT(left) {
    var side = left ? "-left" : "-right"

    var toolbox = document.createElement("toolbox");
    toolbox.id = idp + side + "-box";
    toolbox.palette = gNavToolbox.palette;

    var toolbar = document.createElement("toolbar");
    toolbar.id = idp + side;

    if (left) {
        vtlBox = browser.insertBefore(toolbox, browser.firstChild);
        vtl = toolbox.appendChild(toolbar);
    } else {
        vtrBox = browser.appendChild(toolbox);
        vtr = toolbox.appendChild(toolbar);
    }
    setAttrs(toolbar);
    gNavToolbox.externalToolbars.push(toolbar);
}
function removeButtons(vt) {
    Array.slice(vt.children).forEach(function(node) {
        var nn = node.nodeName;
        if (nn == "toolbarbutton" || nn == "toolbaritem")
            gNavToolbox.palette.appendChild(node);
    });
}
function removeVT(vt) {
    removeButtons(vt);
    gNavToolbox.externalToolbars.forEach(function(et, i, ets) {
        if (et == vt) ets.splice(i, 1);
    });
    browser.removeChild(vt.parentNode);
    if (vt == vtl) vtl = null;
    if (vt == vtr) vtr = null;
}
function forEachVT(func) {
    var toolbars = [];
    if (vtl) toolbars.push(vtl);
    if (vtr) toolbars.push(vtr);
    toolbars.forEach(func);
}
function forEachBtn(func, arg) {
    var btns = [];
    var en = Services.ww.getWindowEnumerator();
    while(en.hasMoreElements()) {
        var win = en.getNext();
        var btn = win.document.getElementById(self.id);
        if (btn) btns.push(btn);
    }
    btns.forEach(function(btn) {
        btn[func.name].call(this, arg);
    });
}
function widthCorr(vt)
    vt.setAttribute("width", parseInt(vt.getAttribute("pwidth")) + vt.opt.widthCorrection);

if (leftVT && !vtl) createVT(true);
if (!leftVT && vtl) removeVT(vtl);

if (rightVT && !vtr) createVT(false);
if (!rightVT && vtr) removeVT(vtr);

forEachVT(function(vt) {
    vt.opt = vt == vtl ? optLeftVT : optRightVT;
    widthCorr(vt);
});
function setHeight(box) {
    box.style.height =
    box.firstChild.style.height = 
    browser.boxObject.height + "px";
}
function onMousemove(e) {

    var distanceLeft = e.screenX - browser.boxObject.screenX;
    var distanceRight = browser.boxObject.width - distanceLeft;

    if (vtl) {
        vtlBox.show = distanceLeft <= vtl.opt.distanceShow;
        vtlBox.hide = distanceLeft > vtl.opt.distanceHide + vtlBox.boxObject.width;
        vt(vtlBox);
    }
    if (vtr) {
        vtrBox.show = distanceRight <= vtr.opt.distanceShow;
        vtrBox.hide = distanceRight > vtr.opt.distanceHide + vtrBox.boxObject.width;
        vt(vtrBox);
    }
    function vt(box) {
        var vt = box.firstChild;
        if (box.show) {
            if (box.waiting) return;
            box.waiting = true;
            setTimeout(function() {
                box.waiting = false;
                if (box.hide) return;
                box.setAttribute("show", true);
                setHeight(box);
            }, vt.opt.showDelay);
        }
        if (box.hide) {
            var st = "-" + vt.boxObject.width + "px";
            box.style[box == vtlBox ? "left" : "right"] = st;
            box.removeAttribute("show");
            setHeight(box);
        }
    }
}
function mm()
    onMousemove({ screenX: browser.boxObject.screenX + browser.boxObject.width / 2 });
mm();

function onBeforecustomization() {
    forEachVT(function(vt) {
        var st = vt.parentNode.style;
        st[vt == vtl ? "left" : "right"] = 0;
        st.position = "static";
        vt.removeAttribute("width");
    });
}
addEventListener("beforecustomization", onBeforecustomization, false, gNavToolbox);

function toggleAutohide(e) {
    var ahBefore, ahAfter;
    forEachVT(function(vt) {
        if (vt.hasAttribute("autohide")) ahBefore = true;
        if (e && !e.button && vt == vtr) return;
        if (e && e.button == 2 && vt == vtl) return;

        var box = vt.parentNode;
        if (vt.hasAttribute("autohide")) {
            vt.removeAttribute("autohide");
            box.style.position = "static";
        } else {
            vt.setAttribute("autohide", true);
            box.style.position = "fixed";
        }
        saveAttrs(vt);
    });
    forEachVT(function(vt) { if (vt.hasAttribute("autohide")) ahAfter = true; });
    var func;
    if (ahBefore && !ahAfter) func = removeEventListener;
    if ((!ahBefore || !e) && ahAfter) func = addEventListener;
    if (func) func("mousemove", onMousemove, false, browser);
}
toggleAutohide({ button: -1 }), toggleAutohide();

this.onclick = function(e) {
    if (e.ctrlKey || e.shiftKey || e.altKey || e.metaKey) return;
    if (e.button == 1) {
        forEachBtn(toggleBackgroundImage, true);
        return;
    }
    if (vtr) e.preventDefault();
    forEachBtn(toggleAutohide, e);
};
forEachVT(function(vt) {
    vt.ondblclick = function(e) {
        var nn = e.target.nodeName;
        if (    (["toolbar", "toolbarspring", "toolbarspacer", "toolbarseparator"].indexOf(nn) > -1)
            && !e.button && (e.target.parentNode == this || e.target == this)
        ) {
            forEachBtn(toggleAutohide, { button: this == vtl ? 0 : 2 })
            mm();
        }
    }
});
[setAttrs, removeButtons, forEachVT, widthCorr, toggleAutohide, toggleBackgroundImage]
    .forEach(function(f) self[f.name] = f);
var upd;
forEachVT(function(vt) {
    if (vt.upd) {
        upd = true;
        delete vt.upd;
    }
});
if (upd) {
    var en = Services.ww.getWindowEnumerator();
    while(en.hasMoreElements()) {
        var win = en.getNext();
        var btn = win.document.getElementById(this.id);
        if (!btn || win == window) continue;
        btn.forEachVT(function(vt) {
            btn.removeButtons(vt);
            btn.setAttrs(vt);
            btn.widthCorr(vt);
            btn.toggleBackgroundImage(false);
        });
    }
}
const cssStr = '\
\
    toolbar[id^="%idp%"] {\n\
        -moz-appearance: none;\n\
        border-bottom: 0;\n\
        border-top: 0;\n\
    }\n\
    toolbar[id^="%idp%"] > toolbarseparator,\n\
    toolbar[id^="%idp%"] > [id^="wrapper-separator"] {\n\
        -moz-appearance: none;\n\
        margin: 0.2em 2px;\n\
        border-bottom: 1px solid ThreeDHighlight;\n\
        border-top: 1px solid ThreeDShadow;\n\
        height: 2px;\n\
        border-left: none;\n\
        border-right: none;\n\
    }\n\
    toolbar[id^="%idp%"] > toolbarspacer,\n\
    toolbar[id^="%idp%"] > [id^="wrapper-spacer"] {\n\
        height: 15px;\n\
    }\n\
    toolbox[id^="%idp%"] {\n\
        -moz-appearance: none; border-top: 0;\n\
    }\n\
\n\
    #%idp%-left-box[show] {\n\
        left: 0;\n\
    }\n\
    #%idp%-left-box {\n\
        -moz-transition: left %lefttime%s ease;\n\
    }\n\
    #%idp%-right-box[show] {\n\
        right: 0;\n\
    }\n\
    #%idp%-right-box {\n\
        -moz-transition: right %righttime%s ease;\n\
    }\n\
\n\
    toolbar[id^="%idp%"][customizing] {\n\
        min-width: 20px;\n\
    }\n\
    toolbar[id^="%idp%"] toolbarpaletteitem {\n\
        margin-top: -2px;\n\
        margin-bottom: -2px;\n\
        border-top: 2px solid transparent;\n\
        border-bottom: 2px solid transparent;\n\
        border-left-color: transparent;\n\
        border-right-color: transparent;\n\
    }\n\
    toolbar[id^="%idp%"] toolbarpaletteitem[dragover="left"] {\n\
        border-top-color: black;\n\
    }\n\
    toolbar[id^="%idp%"] toolbarpaletteitem[dragover="right"] {\n\
        border-bottom-color: black;\n\
    }\
'
    .replace(/;/g, " !important;")
    .replace(/%idp%/g, idp)
    .replace("%lefttime%", optLeftVT.animateTime)
    .replace("%righttime%", optRightVT.animateTime);

const sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
const cssURI = makeURI("data:text/css," + encodeURIComponent(cssStr), null, null);
if (!sss.sheetRegistered(cssURI, sss.USER_SHEET)) sss.loadAndRegisterSheet(cssURI, sss.USER_SHEET);

function setBackground(backgroundColor, borderColor) {
    forEachVT(function(vt) {
        vt.style.backgroundColor = backgroundColor;
        var side = vt == vtl ? "Right" : "Left";
        vt.style["border" + side] = "1px solid " + borderColor;
        toggleBackgroundImage(false);
    });
}
function onLWT() {
    setTimeout(function() {
        
        var win = n("main-window");
        var backgroundImage = window.getComputedStyle(win).backgroundImage;

        if (backgroundImage == "none") {
            var backgroundColor = window.getComputedStyle(win).backgroundColor;
            var borderColors = backgroundColor.match(/\d+/g).map(function(color) Math.round(color / 1.5));
            var borderColor = "rgb(" + borderColors.join(", ") + ")";
            setBackground(backgroundColor, borderColor);
            return;
        }
        var url = backgroundImage.replace('url("', "").replace('")', "");

        var img = document.createElementNS(xhtmlns, "img");
        var canvas = document.createElementNS(xhtmlns, "canvas");
        img.src = url;
        img.onload = function() {

            var width = canvas.width = img.width;
            var height = canvas.height = img.height;
            var context = canvas.getContext("2d");
            context.drawImage(img, 0, 0);
            var arr = context.getImageData(0, 0, width, height).data;

            var r = 0, g = 0, b = 0;
            var len = arr.length;
            for (var i = 0; i < len; i += 4) {
                r += arr[i];
                g += arr[i + 1];
                b += arr[i + 2];
            }
            var colors = [r, g, b];
            var backgroundColors = colors.map(function(color) Math.round(4 * color / len));
            var borderColors = backgroundColors.map(function(color) Math.round(color / 1.5));
            
            var backgroundColor = "rgb(" + backgroundColors.join(", ") + ")";
            var borderColor = "rgb(" + borderColors.join(", ") + ")";
            setBackground(backgroundColor, borderColor);
        }
    }, 200);
}
onLWT();
function toggleBackgroundImage(toggle) {
    forEachVT(function(vt) {
        var st = vt.style;
        if (vt.hasAttribute("bgimage") - !toggle) {
            vt.removeAttribute("bgimage");
            st.backgroundImage = "";
        } else {
            vt.setAttribute("bgimage", true);
            st.backgroundImage = n("main-window").style.backgroundImage;
        }
        saveAttrs(vt);
    });
}
toggleBackgroundImage(false);

const observer = { observe: onLWT };
const topic = "lightweight-theme-styling-update";
Services.obs.addObserver(observer, topic, false);

this.onDestroy = function(reason) {
    try { Services.obs.removeObserver(observer, topic) } catch(ex) {}
    if (reason == "update" || reason == "delete") {
        if (sss.sheetRegistered(cssURI, sss.USER_SHEET)) sss.unregisterSheet(cssURI, sss.USER_SHEET);
    }
    if (reason == "constructor") {
        forEachVT(function(vt) {
            vt.removeAttribute("width");
            vt.setAttribute("pwidth", Math.max(vt.boxObject.width, 20));
            saveAttrs(vt);
            vt.upd = true;
        });
    }
    if (reason == "delete") {
        forEachVT(function(vt) removeVT(vt));
        if (custombuttons.confirmBox("VT2", "Reset prefs ?", "Yes", "No")) {
            vtlPref.reset(); vtrPref.reset();
        }
    }
};


Лучше спросить у знающих - чем лезть не зная.

Отсутствует

 

№179830-09-2017 18:52:06

difabor
Участник
 
Группа: Members
Зарегистрирован: 21-09-2013
Сообщений: 539
UA: Firefox 52.0
Веб-сайт

Re: Обсуждение кнопок CB

villa7 пишет

difabor
Была кнопка VT2, панели появлялись и справа и слева, но она перестала работать в новых версиях, может удастся исправить.

Вы знаете, villa7, а ведь иметь два вертикальных тулбара рядом имхо даже удобнее...
Не надо думать - какие кнопки слева, какие справа. Выскакивают они вместе - создаётся впечатление одного широкого...
Я, конечно, подумаю как сделать открытие справа (для спортивного интереса), но так даже лучше.
Я бы вообще подумал бы над тем, как размешать в одну строку несколько кнопок на широком VT.
Тогда кнопки можно было бы группировать по 2-3 в один ряд - была бы лучшая организация кнопок - каждый ряд имел бы некое семантическое значение.
Но это мне пока не по зубам... :(

Отредактировано difabor (01-10-2017 00:56:43)


Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©

Отсутствует

 

№179927-10-2017 07:57:17

Garalf
Участник
 
Группа: Members
Зарегистрирован: 19-09-2017
Сообщений: 313
UA: Seamonkey 2.53

Re: Обсуждение кнопок CB

bunda1
Кнопка Autocopy+3 не работает на SM 2.53. Возможно решить эту проблему?

Отсутствует

 

№180030-10-2017 15:36:13

broker
Участник
 
Группа: Members
Зарегистрирован: 23-06-2015
Сообщений: 103
UA: unknown 0.0

Re: Обсуждение кнопок CB

Господа здравствуйте, есть такая кнопка SONCO Timer можно сделать чтоб она отображала кириллицу? Спасибо.

скрытый текст

Выделить код

Код:

'use strict';

var {classes: Cc, interfaces: Ci, utils: Cu} = Components,
    helpCSS = encodeURIComponent(this.Help);
    
Cu.import("resource://gre/modules/Timer.jsm");
    
const sound = Cc['@mozilla.org/sound;1'].getService(Ci.nsISound),
      aFile = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile),
      as = Cc['@mozilla.org/alerts-service;1'].getService(Ci.nsIAlertsService),
      ios = Cc['@mozilla.org/network/io-service;1'].getService(Ci.nsIIOService),
      sss = Cc['@mozilla.org/content/style-sheet-service;1'].getService(Ci.nsIStyleSheetService),
      wm = Cc['@mozilla.org/appshell/window-mediator;1'].getService(Ci.nsIWindowMediator).getMostRecentWindow;

pref.root = 'extensions.custombuttons.soncoTimer' + this.id.match(/\d+/) + '.';
pref.defaults = {
  alertCancel: 'Do you wish to cancel the alert?',
  alertEmpty: 'Alert message',
  alertHour: 0,
  alertIcon: 'https://raw.githubusercontent.com/srazzano/Images/master/Aalarm.gif',
  alertLabel: 'Change Alert Icon',
  alertTerminatedIcon: 'https://raw.githubusercontent.com/srazzano/Images/master/Aclock1-48.png',
  alertMinute: 0,
  alertNo: 'No',
  alertSecond: 0,
  alertTerminated: 'Alert Terminated',
  alertTitle: 'Alert Notification',
  alertYes: 'Yes',
  am: 'AM',
  audio: true,
  audioFile: 'Sound',
  audioLabel: 'Play Sound File',
  cancel: 'Cancel',
  clear: 'Clear Message Field',
  close: 'Close',
  countdown: 0,
  editPreset: 'Edit Presets',
  getFile: 'Get Sound File',
  getIcon: 'Change Toolbarbutton Icon',
  hours: 12,
  hour12Label: '12hr',
  hour24Label: '24hr',
  hrLabel: 'Hrs',
  image: 'https://raw.githubusercontent.com/srazzano/Images/master/Aclock1-16.png',
  imageLabel: 'Change Button Icon',
  message: '',
  messageLabel: 'Message:',
  minLabel: 'Min',
  pm: 'PM',
  posAlertLeft: 200,
  posAlertTop: 200,
  posEditLeft: 200,
  posEditTop: 200,
  posTimerLeft: 200,
  posTimerTop: 200,
  preset1: 'Preset Message 1',
  preset2: 'Preset Message 2',
  preset3: 'Preset Message 3',
  preset4: 'Preset Message 4',
  preset5: 'Preset Message 5',
  presetLabel1: 'Preset 1',
  presetLabel2: 'Preset 2',
  presetLabel3: 'Preset 3',
  presetLabel4: 'Preset 4',
  presetLabel5: 'Preset 5',
  reset1: 'Clear Hrs Field',
  reset2: 'Clear Min Field',
  reset3: 'Clear Sec Field',
  repeat: 'Repeat',
  secLabel: 'Sec',
  showTime: true,
  showTimeLabel: 'Show Current Time',
  soundFile: 'C:\\Windows\\Media\\notify.wav',
  soundFileLabel: 'Sound File',
  startTimer: 'Start Timer',
  timer: 'Duration:',
  timerNotSet: 'Timer not set',
  timerTitle: 'Timer Notification',
  timerWarning: 'https://raw.githubusercontent.com/srazzano/Images/master/Aalarm2-64.png',
  timestart: '',
  tt1: 'Left-click to set timer',
  tt2: 'Middle-click to terminate the timer',
  tt3: 'Hover to view remainig time when active',
  tt4: 'SONCO Timer remaining time',
  urlbar: false,
  urlbarLabel: 'In Urlbar'
}

for (let key in pref.defaults) {
  if (pref.defaults.hasOwnProperty(key)) {
    let val = pref.defaults[key];
    switch (typeof val) {
      case 'boolean':
        Services.prefs.getDefaultBranch(pref.root).setBoolPref(key, val);
        break;
      case 'number':
        Services.prefs.getDefaultBranch(pref.root).setIntPref(key, val);
        break;
      case 'string':
        let str = Cc['@mozilla.org/supports-string;1'].createInstance(Ci.nsISupportsString);
        str.data = val;
        Services.prefs.getDefaultBranch(pref.root).setComplexValue((key), Ci.nsISupportsString, str);
        break;
} } }

pref.observe = function(prefs, callback) {
  let {root} = pref;
  function observe(subject, topic, data) {
    if (topic !== 'nsPref:changed') return;
    let pref = data.slice(root.length);
    if (prefs.indexOf(pref) === -1) return;
    callback(pref);
  }
  Services.prefs.addObserver(root, observe, false);
  unload => Services.prefs.removeObserver(root, observe);
}

var gRoot = Services.prefs.getBranch(pref.root),
    alertTimer = 0, dialog, curTime, remTime;

function pref(key) {
  let {branch, defaults} = pref;
  if (branch == null) branch = Services.prefs.getBranch(pref.root);
  switch (typeof defaults[key]) {
    case 'boolean': return branch.getBoolPref(key);
    case 'number': return branch.getIntPref(key);
    case 'string': return branch.getCharPref(key);
  }
  return null;
}

function getSS(filepath) { return ios.newURI('data:text/css,' + filepath, null, null) }

function loadSheet(filepath) { sss.loadAndRegisterSheet(getSS(filepath), sss.AGENT_SHEET) }

function unloadSheet(filepath) {
  let uri = getSS(filepath);
  if (sss.sheetRegistered(uri, sss.AGENT_SHEET)) sss.unregisterSheet(uri, sss.AGENT_SHEET);
}

function getCurrentTime() {
  if (pref('showTime')) {
    var today = new Date(),
        h = today.getHours(),
        m = today.getMinutes(),
        s = today.getSeconds(),
        ampm = '';
    m = checkCurrentTime(m);
    s = checkCurrentTime(s);
    if (pref('hours') === 12) {
      ampm = (h < 12) ? pref('am') : pref('pm');
      if (h > 12) {h = h - 12;}
      if (h === 0) {h = 12;}
    }
    if (wm('sonco:timer')) var mrw = wm('sonco:timer');
    else var mrw = wm('sonco:alert');
    mrw.document.getElementById('time').value = h + ':' + m + ':' + s + ' ' + ampm;
} }

function checkCurrentTime(i) {
  if (i < 10) {i = '0' + i};
  return i;
}

function formatTimeDuration(millisec) {
  var seconds = (millisec / 1000).toFixed(0),
      minutes = Math.floor(seconds / 60),
      hours = '';
  if (minutes > 59) {
    hours = Math.floor(minutes / 60);
    minutes = minutes - (hours * 60);
  }
  minutes = (minutes >= 10) ? minutes : '0' + minutes;
  seconds = Math.floor(seconds % 60);
  seconds = (seconds >= 10) ? seconds : '0' + seconds;
  if (hours != '') return hours + ':' + minutes + ':' + seconds;
  return '0:' + minutes + ':' + seconds;
}

function remainingTime() {
  if (pref('countdown')) {
    var val = Date.now() - pref('timestart'),
        diff = getTimerDuration() - parseInt(val),
        mrw = wm('sonco:timer'),
        mrd = wm('navigator:browser');
    mrd.document.getElementById('sonco-time-remaining').value = formatTimeDuration(diff);
    mrw.document.getElementById('remaining').value = formatTimeDuration(diff);
  } else mrw.document.getElementById('remaining').value = '';
}

function getTimerDuration() {
  var a = pref('alertHour'), h = a * 3600000,
      b = pref('alertMinute'), m = b * 60000,
      c = pref('alertSecond'), s = c * 1000;
  return h + m + s;
}

this.image = pref('image');
this.tooltipText = this.label + '\n\u2022 ' + pref('tt1') + '\n\u2022 ' + pref('tt2');

loadSheet(helpCSS);

this.onclick = function(e) {
  if (e.button == 0) {
    if (wm('sonco:timer')) {
      wm('sonco:timer').focus();
      return;
    }
    this.onTimer();
  }
  if (e.button === 1) {
    if (wm('sonco:alert')) wm('sonco:alert').close();
    if (wm('sonco:timer')) wm('sonco:timer').close();
    var el = document.getElementById('sonco-time-remaining'),
        mra = wm('sonco:alert'),
        mrt = wm('sonco:timer');
    if (pref('countdown')) as.showAlertNotification(pref('alertTerminatedIcon'), pref('alertTitle'), pref('alertTerminated'), false, '', null);
    gRoot.setIntPref('countdown', 0);
    gRoot.setCharPref('timestart', '');
    el.parentNode.removeChild(el);
    clearInterval(curTime);
    clearInterval(remTime);
    alertTimer = 0;
} }

this.onAlert = function() {
  if (pref('countdown') === 0) return;
  var data = '<?xml version="1.0"?><?xml-stylesheet href="chrome://global/skin/" type="text/css"?>\
    <window xmlns="' + xulns + '" windowtype="sonco:alert" id="soncoAlert" title="' + pref("alertTitle") + '" \
      minwidth="300" onload="self.onAlertLoad(this)" onclose="self.onAlertClose(this)">\
      <keyset><key keycode="VK_ESCAPE" oncommand="close()"/></keyset>\
      <hbox id="hbox1" class="hbox" align="center">\
        <vbox id="vbox1">\
          <textbox id="time" class="textbox"/>\
          <hbox id="image-container" pack="center">\
            <image id="alertImage" src="' + pref("alertIcon") + '"/>\
          </hbox>\
        </vbox>\
        <textbox id="alertMessage" class="textbox" value="' + pref("message") + '" multiline="true" rows="4" flex="1"/>\
      </hbox>\
      <hbox id="buttonGroup" class="hbox" align="center">\
        <button id="alertIcon" class="button" label="' + pref("alertLabel") + '" oncommand="self.onButton(this)"/>\
        <spacer id="alert-spacer" flex="1"/>\
        <button id="repeat" class="button" label="' + pref("repeat") +'" oncommand="self.onButton(this); close()"/>\
      </hbox>\
    </window>';
  data = data.replace(/self/g, 'opener.document.getElementById(&quot;' + self.id + '&quot;)');
  var url = 'data:application/vnd.mozilla.xul+xml;text/plain,' + encodeURIComponent(data);
  dialog = window.openDialog(url, '', 'chrome,dialog=no,resizable');
}

this.onAlertLoad = function(e) {
  var mrw = wm('navigator:browser');
  mrw.document.getElementById(self.id).hidden = false;
  e.document.getElementById('time').hidden = !pref('showTime');
  gRoot.setIntPref('countdown', 0);
  gRoot.setCharPref('timestart', '');
  e.moveTo(pref('posAlertLeft'), pref('posAlertTop'));
  wm('sonco:timer').close()
  alertTimer = 0;
  clearInterval(remTime);
  if (pref("showTime")) curTime = setInterval(getCurrentTime, 200);
  else clearInterval(curTime);
  e.removeAttribute('height');
  e.sizeToContent();
}

this.onAlertClose = function(e) {
  gRoot.setIntPref("posAlertLeft", e.screenX);
  gRoot.setIntPref("posAlertTop", e.screenY);
  clearInterval(curTime);
}

this.onButton = function(e) {
  switch (e.id) {
    case 'audioFile':
      var mrw = wm('sonco:timer'),
          fp = Cc['@mozilla.org/filepicker;1'].createInstance(Ci.nsIFilePicker);
      fp.init(window, null, fp.modeOpen);
      fp.appendFilters(fp.filterAudio);
      if (fp.show() != fp.returnCancel) {
        var file = fp.fileURL.spec.replace('file:///', '').replace(/\//g, '\\').replace(/%20/g, ' ');
        gRoot.setCharPref('soundFile', file);
        e.nextSibling.value = file;
      }
      mrw.focus();
      break;
    case 'image': case 'alertIcon':
      if (e.id === 'image') var mrw = wm('sonco:timer');
      else var mrw = wm('sonco:alert');
      var fp = Cc['@mozilla.org/filepicker;1'].createInstance(Ci.nsIFilePicker);
      fp.init(window, null, fp.modeOpen);
      fp.appendFilters(fp.filterImages);
      if (fp.show() != fp.returnCancel) {
        var url = fp.fileURL.spec;
        gRoot.setCharPref(e.id, url);
        if (e.id === 'image') {
          e.nextSibling.src = url;
          wm('navigator:browser').document.getElementById(this.id).image = pref('image');
        }
        if (e.id === 'alertIcon') {
          var mrw = wm('sonco:alert');
          mrw.document.getElementById('alertImage').src = pref('alertIcon');
      } }
      mrw.focus();
      break;
    case 'startTimer':
      var mrw = wm('sonco:timer');
      this.onStartTimer();
      mrw.close();
      break;
    case 'repeat':
      this.onStartTimer();
      break;
    case 'preset1': case 'preset2': case 'preset3': case 'preset4': case 'preset5':
      var mrw = wm('sonco:timer');
      mrw.document.getElementById('message').value = pref(e.id);
      gRoot.setCharPref('message', mrw.document.getElementById('message').value);
      break;
    case 'reset1': case 'reset2': case 'reset3':
      var mrw = wm('sonco:timer');
      e.previousSibling.value = '';
      e.previousSibling.select();
      break;
    case 'clear':
      var mrw = wm('sonco:timer');
      mrw.document.getElementById('message').value = '';
      mrw.document.getElementById('message').select();
      gRoot.setCharPref('message', '');
      break;
    case 'editPreset':
      this.onEdit();
      break;
} }

this.onCheckbox = function(e) { 
  gRoot.setBoolPref(e.id, pref(e.id) !== false ? false : true);
  if (e.id === 'url') {
    var mrw = wm('navigator:browser'),
        textbox = mrw.document.getElementById('sonco-time-remaining');
    mrw.document.removeElement(tetbox);
  }
  if (e.id === 'showTime') {
    var mrt = wm('sonco:timer');
    mrt.document.getElementById('time').hidden = !pref('showTime');
    if (pref('showTime'))  curTime = setInterval(getCurrentTime, 200);
    else clearInterval(curTime);
    e.nextSibling.disabled = !pref('showTime');
} }

this.onDestroy = function(reason) {
  if (reason === 'delete') {
    clearInterval(curTime);
    clearInterval(remTime);
    unloadSheet(this.Help);
} }

this.onEdit = function() {
  if (wm('sonco:edit')) {
    wm('sonco:edit').focus();
    return;
  }
  var data = '<?xml version="1.0"?><?xml-stylesheet href="chrome://global/skin/" type="text/css"?>\
    <window xmlns="' + xulns + '" windowtype="sonco:edit" id="soncoEdit" title="' + pref("editPreset") + '" \
      minwidth="445" onload="self.onEditLoad(this)" onclose="self.onEditClose(this)" persist="width height screenX screenY">\
      <keyset><key keycode="VK_ESCAPE" oncommand="close()"/></keyset>\
      <hbox id="hbox1" class="hbox" align="center">\
        <label class="label" value="' + pref("presetLabel1") + '"/>\
        <textbox id="preset1" class="textbox" value="' + pref("preset1") + '" multiline="true" rows="1" flex="1" \
          oninput="self.onTextbox(this)" placeholder="' + pref("alertEmpty") + '"/>\
      </hbox>\
      <hbox id="hbox2" class="hbox" align="center">\
        <label class="label" value="' + pref("presetLabel2") + '"/>\
        <textbox id="preset2" class="textbox" value="' + pref("preset2") + '" multiline="true" rows="1" flex="1" \
          oninput="self.onTextbox(this)" placeholder="' + pref("alertEmpty") + '"/>\
      </hbox>\
      <hbox id="hbox3" class="hbox" align="center">\
        <label class="label" value="' + pref("presetLabel3") + '"/>\
        <textbox id="preset3" class="textbox" value="' + pref("preset3") + '" multiline="true" rows="1" flex="1" \
          oninput="self.onTextbox(this)" placeholder="' + pref("alertEmpty") + '"/>\
      </hbox>\
      <hbox id="hbox4" class="hbox" align="center">\
        <label class="label" value="' + pref("presetLabel4") + '"/>\
        <textbox id="preset4" class="textbox" value="' + pref("preset4") + '" multiline="true" rows="1" flex="1" \
          oninput="self.onTextbox(this)" placeholder="' + pref("alertEmpty") + '"/>\
      </hbox>\
      <hbox id="hbox5" class="hbox" align="center">\
        <label class="label" value="' + pref("presetLabel5") + '"/>\
        <textbox id="preset5" class="textbox" value="' + pref("preset5") + '" multiline="true" rows="1" flex="1" \
          oninput="self.onTextbox(this)" placeholder="' + pref("alertEmpty") + '"/>\
      </hbox>\
    </window>';
  data = data.replace(/self/g, 'opener.document.getElementById(&quot;' + self.id + '&quot;)');
  var url = 'data:application/vnd.mozilla.xul+xml;text/plain,' + encodeURIComponent(data);
  dialog = window.openDialog(url, '', 'chrome,dialog=no,resizable');
  dialog.focus();
}

this.onEditLoad = function(e) { e.moveTo(pref("posEditLeft"), pref("posEditTop")) }

this.onEditClose = function(e) {
  gRoot.setIntPref("posEditLeft", e.screenX);
  gRoot.setIntPref("posEditTop", e.screenY);
  wm('sonco:timer').close();
  this.onTimer();
}

this.onRadio = function(e) { gRoot.setIntPref(e.id, e.value) }

this.onRemaining = function(e) {
  if (e === 0) self.onTimer();
  if (e === 1) {
    var mrw = wm('navigator:browser'),
        mrd = wm('sonco:timer'),
        toolbar = mrw.document.getElementById('sonco-time-remaining');
    as.showAlertNotification(pref('alertTerminatedIcon'), pref('alertTitle'), pref('alertTerminated'), false, '', null);
    toolbar.parentNode.removeChild(toolbar);
    mrw.document.getElementById(self.id).hidden = false;
    gRoot.setIntPref('countdown', 0);
    gRoot.setCharPref('timestart', '');
    mrd.close();
    clearInterval(curTime);
    clearInterval(remTime);
    alertTimer = 0;
} }

this.onRemoveTime = function() {
  var mrw = wm('navigator:browser'),
      mrt = wm('sonco:timer');
  if (pref('urlbar')) var toolbar = mrw.document.getElementById('urlbar');
  else {
    var toolbar = mrw.document.getElementById(this.parentNode.id)
    mrw.document.getElementById(self.id).hidden = false;
  }
  toolbar.removeChild(document.getElementById('sonco-time-remaining'));
  mrt.document.getElementById('remaining').value = '';
}

this.onStartTimer = function() {
  if (!getTimerDuration()) {
    as.showAlertNotification(pref('timerWarning'), pref('timerTitle'), pref('timerNotSet'), false, '', null);
    return;
  }
  var start = new Date(),
      mrw = wm('navigator:browser'),
      tbIcon = mrw.document.getElementById(self.id),
      textbox = mrw.document.createElement('textbox');
  gRoot.setIntPref('countdown', getTimerDuration());
  gRoot.setCharPref('timestart', start.getTime());
  textbox.id = 'sonco-time-remaining';
  textbox.tooltipText = pref('tt4') + '\n\u2022 ' + pref('tt1') + '\n\u2022 ' + pref('tt2');
  textbox.onclick = function(e){self.onRemaining(e.button);}
  if (pref('urlbar')) {
    var toolbar = mrw.document.getElementById('urlbar');
    toolbar.appendChild(textbox);
    tbIcon.hidden = false;
  } else {
    var toolbar = mrw.document.getElementById(self.parentNode.id);
    toolbar.insertBefore(textbox, self.nextSibling);
    tbIcon.hidden = true;
  }
  remTime = setInterval(remainingTime, 200);
  alertTimer = setTimeout(function() {
    if (pref('audio') && pref('soundFile')) {
      var file = pref('soundFile').replace('file:///', '').replace(/\//g, '\\');
      aFile.initWithPath(file);
      sound.play(ios.newFileURI(aFile));
    }
    toolbar.removeChild(textbox);
    self.onAlert();
  }, getTimerDuration());
}

this.onTextbox = function(e) {
  if (e.id.match('alert')) {
    var mrw = wm('navigator:browser');
    e.value = e.value.replace(/[^\d+]/g, '');
    gRoot.setIntPref(e.id, e.value);
    mrw.document.getElementById(self.id).hidden = false;
    gRoot.setIntPref('countdown', 0);
    gRoot.setCharPref('timestart', '');
    alertTimer = 0;
  } else {
    gRoot.setCharPref(e.id, e.value);
    gRoot.setCharPref('message', e.value);
} }

this.onTimer = function() {
  var data = '<?xml version="1.0"?><?xml-stylesheet href="chrome://global/skin/" type="text/css"?>\
    <window xmlns="' + xulns + '" windowtype="sonco:timer" id="soncoTimer" title="' + this.label + '" \
      onload="self.onTimerLoad(this)" onclose="self.onTimerClose(this)">\
      <keyset><key keycode="VK_ESCAPE" oncommand="close()"/></keyset>\
      <hbox id="hbox1" class="hbox" align="center">\
        <label id="timer" class="caption" value="' + pref("timer") + '"/>\
        <textbox id="alertHour" class="integer" value="' + pref("alertHour") + '" oninput="self.onTextbox(this)" \
          onmousedown="self.onRemoveTime()"/>\
        <button id="reset1" class="reset button" label="' + pref("hrLabel") + '" tooltiptext="' + pref("reset1") + '" \
            oncommand="self.onButton(this)"/>\
        <textbox id="alertMinute" class="integer" value="' + pref("alertMinute") + '" oninput="self.onTextbox(this)" \
          onmousedown="self.onRemoveTime()"/>\
        <button id="reset2" class="reset button" label="' + pref("minLabel") + '" tooltiptext="' + pref("reset2") + '" \
            oncommand="self.onButton(this)"/>\
        <textbox id="alertSecond" class="integer" value="' + pref("alertSecond") + '" oninput="self.onTextbox(this)" \
          onmousedown="self.onRemoveTime()"/>\
        <button id="reset3" class="reset button" label="' + pref("secLabel") + '" tooltiptext="' + pref("reset3") + '" \
            oncommand="self.onButton(this)"/>\
        <textbox id="time" class="textbox"/>\
        <textbox id="remaining" class="textbox"/>\
      </hbox>\
      <hbox id="hbox2" class="hbox" align="center">\
          <label id="messageLabel" class="caption" value="' + pref("messageLabel") + '"/>\
          <button id="preset1" class="preset" label="' + pref("presetLabel1") + '" tooltiptext="' + pref("preset1") + '" \
            oncommand="self.onButton(this)"/>\
          <button id="preset2" class="preset" label="' + pref("presetLabel2") + '" tooltiptext="' + pref("preset2") + '" \
            oncommand="self.onButton(this)"/>\
          <button id="preset3" class="preset" label="' + pref("presetLabel3") + '" tooltiptext="' + pref("preset3") + '" \
            oncommand="self.onButton(this)"/>\
          <button id="preset4" class="preset" label="' + pref("presetLabel4") + '" tooltiptext="' + pref("preset4") + '" \
            oncommand="self.onButton(this)"/>\
          <button id="preset5" class="preset" label="' + pref("presetLabel5") + '" tooltiptext="' + pref("preset5") + '" \
            oncommand="self.onButton(this)"/>\
          <spacer id="spacer1" class="spacer" flex="1"/>\
          <button id="clear" class="button" tooltiptext="' + pref("clear") + '" \
            oncommand="self.onButton(this)"/>\
      </hbox>\
      <hbox id="hbox3" class="hbox" align="center">\
        <textbox id="message" class="textbox" value="' + pref("message") + '" oninput="self.onTextbox(this)" \
          multiline="true" rows="1" flex="1" placeholder="' + pref("alertEmpty") + '"/>\
      </hbox>\
      <hbox id="hbox4" class="hbox" align="center">\
        <button id="audioFile" class="button" label="' + pref("audioFile") + '" tooltiptext="' + pref("getFile") + '" \
          oncommand="self.onButton(this)"/>\
        <textbox id="soundFile" class="textbox" flex="1" value="' + pref("soundFile") + '" placeholder="' + pref("soundFileLabel") + '"/>\
      </hbox>\
      <hbox id="hbox5" class="hbox" align="center">\
        <checkbox id="urlbar" class="checkbox" label="' + pref("urlbarLabel") + '" checked="' + pref("urlbar") + '" \
          oncommand="self.onCheckbox(this)"/>\
        <checkbox id="audio" class="checkbox" label="' + pref("audioLabel") + '" checked="' + pref("audio") + '" \
          oncommand="self.onCheckbox(this)"/>\
        <checkbox id="showTime" class="checkbox" label="' + pref("showTimeLabel") + '" checked="' + pref("showTime") + '" \
          oncommand="self.onCheckbox(this)"/>\
        <radiogroup id="hours" value="' + pref("hours") + '" orient="horizontal" onclick="self.onRadio(this)">\
          <radio id="hour12" class="radio" label="' + pref("hour12Label") + '" value="12"/>\
          <radio id="hour24" class="radio" label="' + pref("hour24Label") + '" value="24"/>\
        </radiogroup>\
      </hbox>\
      <hbox id="buttonGroup" class="hbox" align="center">\
        <button id="image" class="button" label="' + pref("imageLabel") + '" tooltiptext="' + pref("getIcon") + '" \
          oncommand="self.onButton(this)"/>\
        <image id="imageIcon" src="' + pref("image") + '"/>\
        <spacer id="spacer2" class="spacer" flex="1"/>\
        <button id="editPreset" class="button" label="' + pref("editPreset") + '" oncommand="self.onButton(this)"/>\
        <button id="startTimer" class="button" label="' + pref("startTimer") + '" oncommand="self.onButton(this)"/>\
      </hbox>\
    </window>';
  data = data.replace(/self/g, 'opener.document.getElementById(&quot;' + self.id + '&quot;)');
  var url = 'data:application/vnd.mozilla.xul+xml;text/plain,' + encodeURIComponent(data);
  dialog = window.openDialog(url, '', 'chrome,dialog=no,resizable');
  dialog.focus();
}

this.onTimerLoad = function(e) {
  e.moveTo(pref("posTimerLeft"), pref("posTimerTop"));
  if (pref('showTime')) curTime = setInterval(getCurrentTime, 200);
  else clearInterval(curTime);
  e.document.getElementById('time').hidden = !pref('showTime');
  e.document.getElementById('hours').disabled = !pref('showTime');
  if (pref('countdown')) {
    remTime = setInterval(remainingTime, 200);
    e.document.getElementById('remaining').style.display = '-moz-box';
  } else {
    clearInterval(remTime);
    e.document.getElementById('remaining').value= '';
    e.document.getElementById('remaining').style.display = 'none';
} }

this.onTimerClose = function(e) {
  gRoot.setIntPref("posTimerLeft", e.screenX);
  gRoot.setIntPref("posTimerTop", e.screenY);
  clearInterval(curTime);
  clearInterval(remTime);
}

// BUTTON ATTRIBUTES
// Name: SONCO Timer
// Author: Sonny Razzano a.k.a. srazzano
// Updated: Oct 15, 2017
// Download: https://sonco.synthasite.com/custom-buttons-%E2%96%BA.php
// Discussion: http://custombuttons.sourceforge.net/forum/viewtopic.php?f=4&t=866

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]