Najlus
Вот так попробуй:
function startProcess (path, args) { .... } var dir = custombuttonsUtils. getPrefs ("browser.download.downloadDir"); if (!dir) dir = custombuttonsUtils. getPrefs ("browser.download.dir"); if (!dir) dir = custombuttonsUtils. getPrefs ("browser.download.lastDir"); if (!dir) dir = custombuttonsUtils. getPrefs ("browser.download.defaultFolder"); if (!dir) dir = Components. classes ["@mozilla.org/file/directory_service;1"]. getService (Components. interfaces. nsIProperties). get ("DfltDwnld", Components. interfaces. nsILocalFile). path; startProcess (dir, "");
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Уже лучше, но всёравно он вместо имени папки какойто набор непонятных символов вставляет
Вы ленивы, следовательно вы изобретательны (Граф Де Гиш)
Список настроек About:config на русском языке с пояснениями и рекомендациями
Отсутствует
вместо имени папки какойто набор непонятных символов вставляет
А вот так если:
function startProcess (path, args) { .... } var dir = custombuttonsUtils. getPrefs ("browser.download.downloadDir"); if (!dir) dir = custombuttonsUtils. getPrefs ("browser.download.dir"); if (!dir) dir = custombuttonsUtils. getPrefs ("browser.download.lastDir"); if (!dir) dir = custombuttonsUtils. getPrefs ("browser.download.defaultFolder"); if (!dir) dir = Components. classes ["@mozilla.org/file/directory_service;1"]. getService (Components. interfaces. nsIProperties). get ("DfltDwnld", Components. interfaces. nsILocalFile). path; var suc = Components. classes ["@mozilla.org/intl/scriptableunicodeconverter"]. createInstance (Components. interfaces. nsIScriptableUnicodeConverter); suc. charset = "UTF-8"; dir = suc. ConvertToUnicode (dir); startProcess (dir, "");
?
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Что она должна делать ?
Кнопка "поглощает" любой тулбар (кроме панелей навигации и закладок) и отображает расположенные на нём кнопки во всплывающей панели.
Т.е. сначала следует создать тулбар, накидать на него какие-либо кнопки, затем нажать на кнопку Popup Toolbar (которая должна располагаться на панели, отличной от созданной) и в появившемся меню указать тулбар для "поглощения". Так вот, если расположить на "поглощаемой" панели эту кнопку, то она отказывается работать.
Добавлено 07-08-2009 15:15:30
Najlus написал:
вместо имени папки какойто набор непонятных символов вставляетА вот так если: .... ?
Работает. Продублирую кнопку целиком:
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%0D%0A%20%20%3Cname%3E%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u043F%u0430%u043F%u043A%u0443%20%u0437%u0430%u0433%u0440%u0443%u0437%u043E%u043A%3C/name%3E%0D%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bcustombuttons-stdicon-3%5D%5D%3E%3C/image%3E%0D%0A%20%20%3Cmode%3E0%3C/mode%3E%0D%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*Initialization%20Code*/%5D%5D%3E%3C/initcode%3E%0D%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bfunction%20startProcess%20%28path%2C%20args%29%0A%7B%0A%20%20%20%20var%20file%20%3D%20Components.%20classes%5B%22@mozilla.org/file/local%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20createInstance%20%28Components.interfaces.nsILocalFile%29%3B%0A%20%20%20%20var%20process%20%3D%20Components.%20classes%20%5B%22@mozilla.org/process/util%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20createInstance%20%28Components.%20interfaces.%20nsIProcess%29%3B%0A%20%20%20%20file.%20initWithPath%20%28path%29%3B%0A%20%20%20%20if%20%28args%20%3D%3D%20%22%22%29%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20file.%20launch%20%28%29%3B%0A%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%7D%0A%20%20%20%20process.%20init%20%28file%29%3B%0A%20%20%20%20if%20%28%21this.%20pid%29%0A%20%20%20%20%20%20%20%20this.%20pid%20%3D%20%5B%5D%3B%0A%20%20%20%20this.%20pid.%20push%20%28process.%20run%20%28false%2C%20%5Bargs%5D%2C%201%29%29%3B%20%0A%7D%0Avar%20dir%20%3D%20custombuttonsUtils.%20getPrefs%20%28%22browser.download.downloadDir%22%29%3B%0Aif%20%28%21dir%29%0A%20%20%20%20dir%20%3D%20custombuttonsUtils.%20getPrefs%20%28%22browser.download.dir%22%29%3B%0Aif%20%28%21dir%29%0A%20%20%20%20dir%20%3D%20custombuttonsUtils.%20getPrefs%20%28%22browser.download.lastDir%22%29%3B%0Aif%20%28%21dir%29%0A%20%20%20%20dir%20%3D%20custombuttonsUtils.%20getPrefs%20%28%22browser.download.defaultFolder%22%29%3B%0Aif%20%28%21dir%29%0A%20%20%20%20dir%20%3D%20Components.%20classes%20%5B%22@mozilla.org/file/directory_service%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20getService%20%28Components.%20interfaces.%20nsIProperties%29.%0A%20%20%20%20%20%20%20%20%20%20get%20%28%22DfltDwnld%22%2C%20Components.%20interfaces.%20nsILocalFile%29.%0A%20%20%20%20%20%20%20%20%20%20path%3B%0Avar%20suc%20%3D%20Components.%20classes%20%5B%22@mozilla.org/intl/scriptableunicodeconverter%22%5D.%0A%20%20%20%20%20%20createInstance%20%28Components.%20interfaces.%20nsIScriptableUnicodeConverter%29%3B%0Asuc.%20charset%20%3D%20%22UTF-8%22%3B%0Adir%20%3D%20suc.%20ConvertToUnicode%20%28dir%29%3B%0AstartProcess%20%28dir%2C%20%22%22%29%3B%5D%5D%3E%3C/code%3E%0D%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0D%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0D%0A%20%20%3Cattributes/%3E%0D%0A%3C/custombutton%3E
Отсутствует
Najlus Вот так попробуй
ТАДАМ!!! РАБОТАЕТ!!!!
СПА-СИ-БО
Вы ленивы, следовательно вы изобретательны (Граф Де Гиш)
Список настроек About:config на русском языке с пояснениями и рекомендациями
Отсутствует
3Jlou
Так вот, если расположить на "поглощаемой" панели эту кнопку, то она отказывается работать.
Ну, стало быть, gQuote.mHandler CB и CB2 не полностью совместимы.
Что если заменить в конце кода "Popup Toolbar"
//this.setAttribute('onclick', 'if (event.target == event.currentTarget) gQuot(event, this);'); //изменить задержку для отдельной кнопки this. gQuot = {}; this. gQuot. __proto__ = custombuttons. gQuot; this. gQuot. dcDelay = 0; this. setAttribute ('onclick', 'this.gQuot.mHandler(event, this)');
на
this.setAttribute('onclick', 'if (event.target == event.currentTarget) this.gQuot.mHandler(event, this);'); //изменить задержку для отдельной кнопки this. gQuot = {}; this. gQuot. __proto__ = custombuttons. gQuot; this. gQuot. dcDelay = 0; //this. setAttribute ('onclick', 'this.gQuot.mHandler(event, this)');
?
Najlus
ТАДАМ!!! РАБОТАЕТ!!!!
Кажется, вот так:
function startProcess (path, args) { ... } function getPref (pName) { var prefs = Components. classes ["@mozilla.org/preferences-service;1"]. getService (Components. interfaces. nsIPrefBranch); var res = ""; try { res = prefs. getComplexValue ("browser.download." + pName, Components. interfaces. nsILocalFile); } catch (e) {}; return res; } var folderList = custombuttonsUtils. getPrefs ("browser.download.folderList"); var fileLoc = Components. classes ["@mozilla.org/file/directory_service;1"]. getService (Components. interfaces. nsIProperties); var desk = fileLoc. get ("Desk", Components. interfaces. nsILocalFile); var dnldMgr = Components. classes["@mozilla.org/download-manager;1"]. getService(Components.interfaces.nsIDownloadManager); var ddd = dnldMgr. defaultDownloadsDirectory; var dir = ""; if (folderList == 0) // desktop dir = desk. path; else if (folderList == 1) // default downloads directory dir = ddd. path; else { dir = getPref ("dir") || getPref ("downloadDir") || getPref ("lastDir") || getPref ("defaultFolder") || ""; if (!dir) dir = fileLoc. get ("DfltDwnld", Components. interfaces. nsILocalFile); dir = dir. path; } startProcess (dir, "");
будет надежнее.
Отредактировано Anton (07-08-2009 15:58:55)
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Ну, стало быть, gQuote.mHandler CB и CB2 не полностью совместимы.
Что если заменить в конце кода "Popup Toolbar"...
Попробовал - не работает эта кнопка, хотя недавно я как то ей пользовался без проблем, да вот уже не помню, может действительно CB2 ставил.
Отсутствует
Anton, всё, понял - работает, но не со всеми кнопками - в частности отказывают ранее упомянутые:
кнопка для открытия url'a
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%0D%0A%20%20%3Cname%3Eya.ru%3C/name%3E%0D%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bcustombuttons-stdicon-4%5D%5D%3E%3C/image%3E%0D%0A%20%20%3Cmode%3E0%3C/mode%3E%0D%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/initcode%3E%0D%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bvar%20urlToOpen%20%3D%20%27http%3A//ya.ru/%27%3B%0Afunction%20openURI%28url%29%0A%7B%0A%20%20%20%20var%20tabs%20%3D%20gBrowser.tabContainer.childNodes%3B%0A%20%20%20%20for%20%28i%3D0%3B%20i%3Ctabs.length%3B%20i++%29%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20var%20tab%20%3D%20gBrowser.%20getBrowserForTab%28tabs%5Bi%5D%29%3B%0A%20%20%20%20%20%20%20%20var%20location%20%3D%20tab.contentDocument.location.href%3B%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20if%20%28location%20%3D%3D%20url%29%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20gBrowser.selectedTab%20%3D%20tabs%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20gBrowser.selectedTab%20%3D%20gBrowser.addTab%28url%29%3B%0A%20%20%20%20return%20true%3B%0A%7D%0AopenURI%28urlToOpen%29%3B%5D%5D%3E%3C/code%3E%0D%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0D%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0D%0A%20%20%3Cattributes/%3E%0D%0A%3C/custombutton%3E
кнопка для открытия папки загрузок:
custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u043F%u0430%u043F%u043A%u0443%20%u0437%u0430%u0433%u0440%u0443%u0437%u043E%u043A%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bcustombuttons-stdicon-3%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*Initialization%20Code*/%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bfunction%20startProcess%20%28path%2C%20args%29%0A%7B%0A%20%20%20%20var%20file%20%3D%20Components.%20classes%5B%22@mozilla.org/file/local%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20createInstance%20%28Components.interfaces.nsILocalFile%29%3B%0A%20%20%20%20var%20process%20%3D%20Components.%20classes%20%5B%22@mozilla.org/process/util%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20createInstance%20%28Components.%20interfaces.%20nsIProcess%29%3B%0A%20%20%20%20file.%20initWithPath%20%28path%29%3B%0A%20%20%20%20if%20%28args%20%3D%3D%20%22%22%29%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20file.%20launch%20%28%29%3B%0A%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%7D%0A%20%20%20%20process.%20init%20%28file%29%3B%0A%20%20%20%20if%20%28%21this.%20pid%29%0A%20%20%20%20%20%20%20%20this.%20pid%20%3D%20%5B%5D%3B%0A%20%20%20%20this.%20pid.%20push%20%28process.%20run%20%28false%2C%20%5Bargs%5D%2C%201%29%29%3B%20%0A%7D%0Afunction%20getPref%20%28pName%29%0A%7B%0A%20%20%20%20var%20prefs%20%3D%20Components.%20classes%20%5B%22@mozilla.org/preferences-service%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20%20%20getService%20%28Components.%20interfaces.%20nsIPrefBranch%29%3B%0A%20%20%20%20var%20res%20%3D%20%22%22%3B%0A%20%20%20%20try%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20res%20%3D%20prefs.%20getComplexValue%20%28%22browser.download.%22%20+%20pName%2C%20Components.%20interfaces.%20nsILocalFile%29%3B%0A%20%20%20%20%7D%20catch%20%28e%29%20%7B%7D%3B%0A%20%20%20%20return%20res%3B%0A%7D%0Avar%20folderList%20%3D%20custombuttonsUtils.%20getPrefs%20%28%22browser.download.folderList%22%29%3B%0Avar%20fileLoc%20%3D%20Components.%20classes%20%5B%22@mozilla.org/file/directory_service%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20getService%20%28Components.%20interfaces.%20nsIProperties%29%3B%0Avar%20desk%20%3D%20fileLoc.%20get%20%28%22Desk%22%2C%20Components.%20interfaces.%20nsILocalFile%29%3B%0Avar%20dnldMgr%20%3D%20Components.%20classes%5B%22@mozilla.org/download-manager%3B1%22%5D.%0A%20%20%20%20%20%20%20%20%20%20getService%28Components.interfaces.nsIDownloadManager%29%3B%0Avar%20ddd%20%3D%20dnldMgr.%20defaultDownloadsDirectory%3B%0Avar%20dir%20%3D%20%22%22%3B%0Aif%20%28folderList%20%3D%3D%200%29%20//%20desktop%0A%20%20%20%20dir%20%3D%20desk.%20path%3B%0Aelse%20if%20%28folderList%20%3D%3D%201%29%20//%20default%20downloads%20directory%0A%20%20%20%20dir%20%3D%20ddd.%20path%3B%0Aelse%0A%7B%0A%20%20%20%20dir%20%3D%20getPref%20%28%22dir%22%29%20%7C%7C%20getPref%20%28%22downloadDir%22%29%20%7C%7C%20getPref%20%28%22lastDir%22%29%20%7C%7C%20getPref%20%28%22defaultFolder%22%29%20%7C%7C%20%22%22%3B%0A%20%20%20%20if%20%28%21dir%29%0A%20%20%20%20%20%20%20%20dir%20%3D%20fileLoc.%20get%20%28%22DfltDwnld%22%2C%20Components.%20interfaces.%20nsILocalFile%29%3B%0A%20%20%20%20dir%20%3D%20dir.%20path%3B%0A%7D%0AstartProcess%20%28dir%2C%20%22%22%29%3B%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
Отредактировано 3Jlou (09-08-2009 02:24:17)
Отсутствует
3Jlou
Нет, там другая какая-то причина.
Если принять изменения, которые я указал в сообщении № 1032, то проблемы с контекстным меню не будет, а указанные кнопки будут работать.
Другое дело, что и в CB2 эта кнопка бывает что перестает работать.
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Кажется, вот так будет надежнее.
Да вам надо памятник из метеоритной платины ставить
Вы ленивы, следовательно вы изобретательны (Граф Де Гиш)
Список настроек About:config на русском языке с пояснениями и рекомендациями
Отсутствует
Anton,
ты не мог бы подсказать, как правильно добавить в твой код onmouseover и onmousedown?
Я пытался приткнуть:
this.onmouseover = function() { this.image = "file:///W:/GoUp2.png"; }; this.onmouseout = function() { this.image = "file:///W:/GoUp.png"; }; this.onmousedown = function() { this.image = "file:///W:/GoUp3.png"; }; this.onmouseup = function() { this.image = "file:///W:/GoUp2.png"; };
после этого кнопка на любой странице создает меню с того таба, который был открыт до этого.
На предыдущем варианте твоего кода (который без субдоменов) - то же самое.
Это только когда стал заменять визуальный стиль проявилось, т. ч. мой косяк, скорее всего.
Кстати, в последнем варианте кнопки, если в табе открыт какой-нибудь chrome://speeddial/content/speeddial.xul то меню не формирует соответствующие пути, а показывает меню последнего открытого таба. Вот этого в предыдущем варианте кода нет.
Может быть, избавиться от фичи с topLevelImg?
Как бы, эксперимент дал положительный результат и это можно будет в чем-нибудь более полезном прикольно использовать (особенно, когда гифчик соответствующий поставил - очень эффектно смотрелось), но в данной кнопке, пожалуй, это излишество .
Да и от disabledImg тоже может избавиться для простоты и функциональности?
Отредактировано razoo (07-08-2009 21:19:48)
Отсутствует
как правильно добавить в твой код onmouseover и onmousedown?
Или найти, где в коде добавляются такие же обработчики, и подправить там, или примерно вот так (добавлять в самый низ):
var _this = this; this.addHandler = function _ah(onEvt, func) { _ah[onEvt] = this[onEvt]; _ah[onEvt + "+"] = func; this[onEvt] = function(e) { var et = "on" + e.type; var h = _ah[et]; h && h.call(_this, e); _ah[et + "+"].call(_this, e); }; }; this.addHandler("onmouseover", function() { this.style.opacity = "0.8"; }); this.addHandler("onmouseout", function() { this.style.opacity = "1"; }); this.addHandler("onmousedown", function() { this.style.opacity = "0.4"; }); this.addHandler("onmouseup", function() { this.style.opacity = "1"; });
Отредактировано Infocatcher (07-08-2009 21:40:31)
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Или найти, где в коде добавляются такие же обработчики, и подправить там, или примерно вот так (добавлять в самый низ)
Я и обработчики менял и внизу добавлял, просто, наверно, мой кодец был кривой :)
С твоим кодом - глюк исчез. Спасибо.
Anton, можно еще сделать так, чтобы по нажатию на саму кнопку - поднимал только на один уровень вверх, а на сtrl-клик открывал целевой url в новом табе (из меню тоже)?
И микроглючик: если запустить Customize, когда открыт таб с каким-нибудь chrome://speeddial/content/speeddial.xul или chrome://browser/content/places/places.xul, кнопка становится полупрозрачной (но рабочей), а вот вернуть нормальный вид помогает только «Edit Button... > Applay». Может, это связано с
последнем варианте кнопки, если в табе открыт какой-нибудь chrome://speeddial/content/speeddial.xul то меню не формирует соответствующие пути, а показывает меню последнего открытого таба.
Твой предыдущий код, хавает адреса с chrome:// как обычные.
:)
Отсутствует
Anton, всё, понял - работает, но не со всеми кнопками - в частности отказывают ранее упомянутые:
Попробовал соорудить аналог:
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%0D%0A%20%20%3Cname/%3E%0D%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAIAEBAAAAAAAABoAwAAJgAAACAgAAAAAAAAqAwAAI4DAAAoAAAAEAAAACAAAAABABgAAAAAAEADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8gzP//pRD//3Wg//8Z4P9/AAz/fwBs/38AC/9/ABL/fwAA/38n0P9/AAb/f//++A8AAf//AAH//yFw//8AACgAAAAgAAAAQAAAAAEAGAAAAAAAgAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////8/////P////z////8/////P////z////8/////P////z////8/////P////z////8/////P////z////8////AAP//wAD//////////////////////////////////////w%3D%3D%5D%5D%3E%3C/image%3E%0D%0A%20%20%3Cmode%3E0%3C/mode%3E%0D%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bthis.%20onPopupShowing%20%3D%20function%20%28event%2C%20menupopup%29%0A%7B%0A%09if%20%28event.%20target%20%21%3D%20menupopup%29%0A%09%09return%3B%0A%09menupopup.%20parentNode.%20buildMenu%20%28menupopup%29%3B%0A%7D%3B%0A%0Athis.%20buildMenu%20%3D%20function%20%28menupopup%29%0A%7B%0A%09this.%20setCheckboxState%20%28menupopup%29%3B%0A%09this.%20createToolbarsList%20%28menupopup%29%3B%0A%09this.%20appendToolbar%20%28menupopup%29%3B%0A%7D%3B%0A%0Athis.%20setCheckboxState%20%3D%20function%20%28menupopup%29%0A%7B%0A%09var%20scwt%20%3D%20custombuttons.%20getPrefs%20%28%22custombuttons.%22%20+%20this.%20id%20+%20%22.showContextWithToolbar%22%29%3B%0A%09var%20checkbox%20%3D%20menupopup.%20getElementsByTagName%20%28%22menuitem%22%29%20%5B0%5D%3B%0A%09checkbox.%20setAttribute%20%28%22checked%22%2C%20scwt%29%3B%0A%09checkbox.%20setAttribute%20%28%22hidden%22%2C%20this.%20cbMainMenu%29%3B%0A%09var%20toolbarId%20%3D%20custombuttons.%20getPrefs%20%28%22custombuttons.%22%20+%20this.%20id%20+%20%22.toolbarId%22%29%3B%0A%09var%20toolbar%20%3D%20document.%20getElementById%20%28toolbarId%29%3B%0A%09var%20isToolbar%20%3D%20toolbar%3F%20true%3A%20false%3B%0A%09var%20menuseparator%20%3D%20menupopup.%20getElementsByTagName%20%28%22menuseparator%22%29%20%5B0%5D%3B%0A%09menuseparator.%20setAttribute%20%28%22hidden%22%2C%20%28this.%20cbMainMenu%20%26%26%20%21%28isToolbar%20%26%26%20scwt%29%29%29%3B%0A%7D%3B%0A%0Athis.%20createToolbarsList%20%3D%20function%20%28menupopup%29%0A%7B%0A%09var%20scwt%20%3D%20custombuttons.%20getPrefs%20%28%22custombuttons.%22%20+%20this.%20id%20+%20%22.showContextWithToolbar%22%29%3B%0A%09if%20%28%21scwt%20%26%26%20this.%20cbMainMenu%29%0A%09%09return%3B%0A%09var%20toolbarId%20%3D%20custombuttons.%20getPrefs%20%28%22custombuttons.%22%20+%20this.%20id%20+%20%22.toolbarId%22%29%3B%0A%09var%20ctid%20%3D%20this.%20parentNode.%20getAttribute%20%28%22id%22%29%3B%0A%09var%20navbox%20%3D%20document.%20getElementById%20%28%22navigator-toolbox%22%29%3B%0A%09var%20toolbars%20%3D%20navbox.%20getElementsByTagName%20%28%22toolbar%22%29%3B%0A%09var%20groupname%20%3D%20this.%20id%20+%20%22-radiogroup%22%3B%0A%09var%20tid%3B%0A%09for%20%28var%20i%20%3D%200%3B%20i%20%3C%20toolbars.%20length%3B%20i++%29%0A%09%7B%0A%09%09if%20%28%21toolbars%20%5Bi%5D.%20hasAttribute%20%28%22customindex%22%29%29%0A%09%09%09continue%3B%0A%09%09tid%20%3D%20toolbars%20%5Bi%5D.%20getAttribute%20%28%22id%22%29%3B%0A%09%09mi%20%3D%20document.%20createElement%20%28%22menuitem%22%29%3B%0A%09%09mi.%20setAttribute%20%28%22label%22%2C%20toolbars%20%5Bi%5D.%20getAttribute%20%28%22toolbarname%22%29%29%3B%0A%09%09mi.%20setAttribute%20%28%22type%22%2C%20%22radio%22%29%3B%0A%09%09mi.%20setAttribute%20%28%22name%22%2C%20groupname%29%3B%0A%09%09mi.%20setAttribute%20%28%22disabled%22%2C%20ctid%20%3D%3D%20tid%29%3B%0A%09%09mi.%20setAttribute%20%28%22checked%22%2C%20toolbarId%20%3D%3D%20tid%29%3B%0A%09%09mi.%20setAttribute%20%28%22value%22%2C%20tid%29%3B%0A%09%09mi.%20setAttribute%20%28%22oncommand%22%2C%20%22document.popupNode.setToolbar%28this.value%29%22%29%3B%0A%09%09menupopup.%20appendChild%20%28mi%29%3B%0A%09%7D%0A%7D%3B%0A%0Athis.%20appendToolbar%20%3D%20function%20%28menupopup%29%0A%7B%0A%09var%20toolbarId%20%3D%20custombuttons.%20getPrefs%20%28%22custombuttons.%22%20+%20this.%20id%20+%20%22.toolbarId%22%29%3B%0A%09var%20toolbar%20%3D%20document.%20getElementById%20%28toolbarId%29%3B%0A%09if%20%28toolbar%29%0A%09%7B%0A%09%09toolbar.%20collapsed%20%3D%20%21this.%20cbMainMenu%3B%0A%09%09menupopup.%20insertBefore%20%28toolbar%2C%20menupopup.%20firstChild%29%3B%0A%09%09toolbar.%20currentSet%20%3D%20toolbar.%20getAttribute%20%28%22currentset%22%29%3B%0A%09%09document.%20persist%20%28toolbar.%20id%2C%20%22currentset%22%29%3B%0A%09%09this.%20label%20%3D%20toolbar.%20getAttribute%20%28%22toolbarname%22%29%3B%0A%09%09this.%20setAttribute%20%28%22tooltiptext%22%2C%20toolbar.%20getAttribute%20%28%22toolbarname%22%29%29%3B%0A%09%09if%20%28toolbar.%20firstChild%20%26%26%20toolbar.%20firstChild.%20image%29%0A%09%09%09this.%20image%20%3D%20toolbar.%20firstChild.%20image%3B%0A%09%7D%0A%7D%3B%0A%0Athis.%20setToolbar%20%3D%20function%20%28toolbarId%29%0A%7B%0A%09this.%20restoreToolbar%20%28true%29%3B%0A%09custombuttons.%20setPrefs%20%28%22custombuttons.%22%20+%20this.%20id%20+%20%22.toolbarId%22%2C%20toolbarId%29%3B%0A%09var%20menupopup%20%3D%20this.%20firstChild%3B%0A%09this.%20appendToolbar%20%28menupopup%29%3B%0A%7D%3B%0A%0Athis.%20restoreToolbar%20%3D%20function%20%28showToolbar%29%0A%7B%0A%09var%20mp%20%3D%20this.%20firstChild%3B%0A%09var%20ct%20%3D%20mp.%20firstChild%3B%0A%09if%20%28ct.%20nodeName%20%3D%3D%20%22toolbar%22%29%0A%09%7B%0A%09%09var%20navbox%20%3D%20document.%20getElementById%20%28%22navigator-toolbox%22%29%3B%0A%09%09var%20next%20%3D%20navbox.%20firstChild%3B%0A%09%09while%20%28next%20%26%26%20%28next.%20nodeName%20%21%3D%20%22toolbarset%22%29%29%0A%09%09%7B%0A%09%09%09if%20%28Number%20%28next.%20getAttribute%20%28%22customindex%22%29%29%20%3E%20Number%20%28ct.%20getAttribute%20%28%22customindex%22%29%29%29%0A%09%09%09%09break%3B%0A%09%09%09next%20%3D%20next.%20nextSibling%3B%0A%09%09%7D%0A%09%09ct.%20collapsed%20%3D%20%21showToolbar%3B%0A%09%09navbox.%20insertBefore%20%28ct%2C%20next%29%3B%0A%09%09ct.%20firstPermanentChild%20%3D%20null%3B%0A%09%09ct.%20lastPermanentChild%20%3D%20null%3B%0A%09%09ct.%20currentSet%20%3D%20ct.%20getAttribute%20%28%22currentset%22%29%3B%0A%09%09document.%20persist%20%28toolbar.%20id%2C%20%22currentset%22%29%3B%0A%09%7D%0A%7D%3B%0A%0Athis.%20onPopupHidden%20%3D%20function%20%28event%2C%20menupopup%29%0A%7B%0A%09if%20%28event.%20target%20%21%3D%20menupopup%29%0A%09%09return%3B%0A%09menupopup.%20parentNode.%20destroyMenu%20%28menupopup%29%3B%0A%7D%3B%0A%0Athis.%20destroyMenu%20%3D%20function%20%28menupopup%29%0A%7B%0A%09this.%20restoreToolbar%20%28false%29%3B%0A%09var%20mi%20%3D%20menupopup.%20lastChild%3B%0A%09while%20%28menupopup.%20lastChild.%20nodeName%20%3D%3D%20%22menuitem%22%29%0A%09%09menupopup.%20removeChild%20%28menupopup.%20lastChild%29%3B%0A%7D%3B%0A%0Athis.%20setSCWTState%20%3D%20function%20%28checkbox%29%0A%7B%0A%09custombuttons.%20setPrefs%20%28%22custombuttons.%22%20+%20this.%20id%20+%20%22.showContextWithToolbar%22%2C%20checkbox.%20getAttribute%20%28%22checked%22%29%20%3D%3D%20%22true%22%29%3B%0A%7D%3B%0A%0Athis.%20showMenu%20%3D%20function%20%28%29%0A%7B%0A%09this.%20cbMainMenu%20%3D%20true%3B%0A%09document.%20popupNode%20%3D%20this%3B%0A%09var%20mp%20%3D%20this.%20firstChild%3B%0A%09mp.%20openPopup%20%28this%2C%20%22after_start%22%2C%200%2C%200%2C%20false%2C%20false%29%3B%0A%7D%3B%0A%0Athis.%20showContextMenu%20%3D%20function%20%28contextId%29%0A%7B%0A%09this.%20cbMainMenu%20%3D%20false%3B%0A%09this.%20setAttribute%20%28%22context%22%2C%20contextId%29%3B%0A%7D%3B%0A%0Athis.%20onclick%20%3D%20function%20%28event%29%0A%7B%0A%09var%20mp%20%3D%20this.%20firstChild%3B%0A%09if%20%28event.%20originalTarget%20%21%3D%20this%29%0A%09%7B%0A%09%09if%20%28event.%20target%20%21%3D%20this%29%0A%09%09%09mp.%20hidePopup%20%28%29%3B%0A%09%09return%3B%0A%09%7D%0A%09if%20%28event.%20button%20%3D%3D%200%29%0A%09%09this.%20showMenu%20%28%29%3B%0A%09else%20if%20%28event.%20button%20%3D%3D%202%29%0A%09%09this.%20showContextMenu%20%28event.%20shiftKey%3F%20%22custombuttons-contextpopup%22%3A%20%22_child%22%29%3B%0A%7D%3B%0A%0Athis.%20hideSelectedToolbar%20%3D%20function%20%28%29%0A%7B%0A%09var%20toolbarId%20%3D%20custombuttons.%20getPrefs%20%28%22custombuttons.%22%20+%20this.%20id%20+%20%22.toolbarId%22%29%3B%0A%09var%20toolbar%20%3D%20document.%20getElementById%20%28toolbarId%29%3B%0A%09if%20%28toolbar%29%0A%09%7B%0A%09%09toolbar.%20setAttribute%20%28%22collapsed%22%2C%20true%29%3B%0A%09%09this.%20label%20%3D%20toolbar.%20getAttribute%20%28%22toolbarname%22%29%3B%0A%09%09this.%20setAttribute%20%28%22tooltiptext%22%2C%20toolbar.%20getAttribute%20%28%22toolbarname%22%29%29%3B%0A%09%7D%0A%7D%3B%0A%0Avar%20scwt%20%3D%20custombuttons.%20getPrefs%20%28%22custombuttons.%22%20+%20this.%20id%20+%20%22.showContextWithToolbar%22%29%3B%0Aif%20%28scwt%20%3D%3D%20null%29%0A%09custombuttons.%20setPrefs%20%28%22custombuttons.%22%20+%20this.%20id%20+%20%22.showContextWithToolbar%22%2C%20true%29%3B%0Avar%20popup%20%3D%0A%3Cmenupopup%20xmlns%3D%22http%3A//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul%22%0A%09%20%20%20oncommand%3D%22this.hidePopup%28%29%22%20onclick%3D%22event.stopPropagation%28%29%22%20style%3D%22border%3A%20none%20%21important%3Boverflow%3Avisible%20%21important%3B%22%20flex%3D%221%22%0A%09%20%20%20onpopupshowing%3D%22this.parentNode.onPopupShowing%28event%2Cthis%29%22%20onpopuphidden%3D%22this.parentNode.onPopupHidden%28event%2Cthis%29%22%3E%0A%09%3Cmenuitem%20type%3D%22checkbox%22%20label%3D%22Show%20Context%20Menu%20With%20Toolbar%22%20oncommand%3D%22document.popupNode.setSCWTState%28this%29%22/%3E%0A%09%3Cmenuseparator/%3E%0A%3C/menupopup%3E%3B%0Apopup%20%3D%20new%20DOMParser%20%28%29.%20parseFromString%20%28popup.%20toXMLString%20%28%29%2C%20%22application/xml%22%29.%20documentElement%3B%0Athis.%20appendChild%20%28popup%29%3B%0Athis.%20hideSelectedToolbar%20%28%29%3B%5D%5D%3E%3C/initcode%3E%0D%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0D%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0D%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0D%0A%20%20%3Cattributes/%3E%0D%0A%3C/custombutton%3E
Вроде работает
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Ещё одна просьба по поводу кнопки QickBookmarks. Вот код:
/*Initialization Code*/ var profileDir = Components.classes["@mozilla.org/file/directory_service;1"] .getService(Components.interfaces.nsIProperties) .get("ProfD", Components.interfaces.nsILocalFile) .path; var path = profileDir + "\\tabbookmarks.xml"; var loadInBackground = true; this. handleDragOver = function (event) { var dt = event. dataTransfer; var tab = dt. mozGetDataAt (TAB_DROP_TYPE, 0); if (!tab) return; event. preventDefault (); event. stopPropagation (); return dt. effectAllowed = dt. dropEffect = "link"; } this. handleDrop = function (event) { var dt = event. dataTransfer; var url = dt. mozGetDataAt ("text/x-moz-text-internal", 0); var tab = dt. mozGetDataAt (TAB_DROP_TYPE, 0); var label = tab. label; var image = tab. image; var br = getBrowser (); //if (br. tabContainer. childNodes. length > 1) br. removeTab (tab); this. addMenuitem (label, url, image); }; this. addMenuitem = function (label, url, image) { var menu = this. menu; var mi = document. createElement ("menuitem"); mi. setAttribute ("label", label); mi. setAttribute ("url", url); mi. setAttribute ("tooltiptext", url); mi. className = "menuitem-iconic bookmark-item"; image && mi. setAttribute ("image", "moz-anno:favicon:" + image); menu. appendChild (mi); this. type = "menu"; this. flushMenu (menu); }; this. deleteMenuitem = function (menuitem) { var menu = this. menu; menu. removeChild (menuitem); this. checkEmpty (menu); this. flushMenu (menu); }; this. checkEmpty = function (menu) { if (menu. getElementsByTagName ("menuitem"). length > 0) return; menu. hidePopup (); this. type = ""; }; this. flushMenu = function (menu) { menu = menu || this. menu; var xs = new XMLSerializer (); var xmenu = xs. serializeToString (menu); var suc = Components. classes ["@mozilla.org/intl/scriptableunicodeconverter"]. createInstance (Components. interfaces. nsIScriptableUnicodeConverter); suc. charset = "UTF-8"; xmenu = suc. ConvertFromUnicode (xmenu); custombuttons. writeFile (path, xmenu); }; this. getMenu = function (event) { var menu = this. menu; if (menu) this. removeChild (menu); menu = ""; try { file = Components. classes ["@mozilla.org/file/local;1"]. createInstance (Components. interfaces. nsILocalFile); file. initWithPath (path); var fis = Components. classes ["@mozilla.org/network/file-input-stream;1"]. createInstance (Components. interfaces. nsIFileInputStream); fis.init (file, 0x01, 00004, null); var sis = Components. classes ["@mozilla.org/scriptableinputstream;1"]. createInstance (Components. interfaces. nsIScriptableInputStream); sis. init (fis); menu = sis. read (sis. available ()); sis. close (); var suc = Components. classes ["@mozilla.org/intl/scriptableunicodeconverter"]. createInstance (Components. interfaces. nsIScriptableUnicodeConverter); suc. charset = "UTF-8"; menu = suc. ConvertToUnicode (menu); menu = new XML (menu) || ""; } catch (e) { menu = ""; } if (!menu) { menu = <menupopup xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" onclick="this. parentNode. openTab (event);"/> } menu = new DOMParser (). parseFromString (menu. toXMLString (), "application/xml"). documentElement; this. appendChild (menu); if (menu. getElementsByTagName ("menuitem"). length > 0) this. type = "menu"; this. orient = "horizontal"; return menu; }; this. __defineGetter__ ( "menu", function () { return this. getElementsByTagName("menupopup") [0]; } ); this. openTab = function (event) { var mi = event. target; var menu = mi. parentNode; var url = mi. getAttribute ("url"); if (event. button < 2) { if (event. button == 0) getBrowser (). loadURI (url, null, null); else getBrowser (). loadOneTab(url, null, null, null, loadInBackground, false); menu. hidePopup (); } else event. stopPropagation (); this. deleteMenuitem (mi); this. flushMenu (menu); }; this. onclick = function (event) { if (event. button != 1 || event. target != this) return; var menu = this. menu; var mis = menu. getElementsByTagName ("menuitem"); var mi; while (mis. length) { mi = mis[0]; getBrowser (). loadOneTab(mi. getAttribute ("url"), null, null, null, true /*load in background*/, false); menu. removeChild (mi); } this. checkEmpty (menu); this. flushMenu (menu); }; this. setAttribute ("ondragdrop", "return this. handleDrop (event);"); this. setAttribute ("ondragover", "return this. handleDragOver (event);"); this. setAttribute ("onmouseover", "if (event. target == this) this. getMenu (event);"); this. getMenu ();
Можете сделать так, чтобы закладка при открытии сразу перематывала страницу к тому месту, где она была перед её занесением в кнопку.
Отредактировано Najlus (09-08-2009 17:08:11)
Вы ленивы, следовательно вы изобретательны (Граф Де Гиш)
Список настроек About:config на русском языке с пояснениями и рекомендациями
Отсутствует
Господа разработчики расширения, вопрос "косметического" характера: почему бы не сделать в диалоге редактирования кнопки 2 поля: "Картинка" и "Картинка маленькая" - которые будут выбираться в зависимости от настройки панели инструментов?
Изначально активно поле "Картинка", после заполнения этого поля активируется поле "Картинка маленькая", которое можно не заполнять, тогда для обоих вариантов настройки панели инструментов используется иконка из 1-го поля.
Отредактировано 3Jlou (09-08-2009 19:22:12)
Отсутствует
Сомневаюсь что такое возможно. Во всяком случае надо обращаться к разработчику
Вы ленивы, следовательно вы изобретательны (Граф Де Гиш)
Список настроек About:config на русском языке с пояснениями и рекомендациями
Отсутствует
Najlus, дык я к ним и обращаюсь
Набросал кнопку для перехода в режим приватного просмотра:
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%0D%0A%20%20%3Cname%3E%u0412%u043E%u0439%u0442%u0438%20%u0432%20%u0440%u0435%u0436%u0438%u043C%20%u043F%u0440%u0438%u0432%u0430%u0442%u043D%u043E%u0433%u043E%20%u043F%u0440%u043E%u0441%u043C%u043E%u0442%u0440%u0430%3C/name%3E%0D%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAA7DAAAOwwHHb6hkAAACzklEQVR4nL2TTUhUURTHz33v3vdmdHRmdHRs1HRm/Ao/UjOECRMkK5FWMYsooUAaoU0tyq3iLiqKVhIEbfpQKVtIHxIMBJZSpBZpWn7k55g6TjNvxnnv3Xd7CoK7XEQHDvd/FueeP4ffAfhX4fV28bvrNm+XsJc+bkc4RTFvR7d6u8wxMGZc9fZlbNVXvF0pu5uunXteuKNR69neUlnm1zFPXcCxsKooPzHGpRxoqxpDJSql/YSQPKTgZYqVTIJFTZXlVdAESQVJ5o8XWy/EOVdIt1LOMTiIsFiEGV9LEZtGHGniePSZMVbGY+bRGASAQhNDEK71DLqra7h7qNNX/Bjz9typoPe7DA6qT07UjZkYoH7901QKzKQ7XUQAJo6FsNu5Uu+pITHX4UbPxvrGCiZoJcdhXat2266XRWihpDLzWCCcm8hAayBEnnM4EovtTrclsyDbLIqmVAMVeCaYQTClwvLIxx9YUTVxapmfMRtiGfmOcZs1Sag55PwKxiQLWLOrAJX5AGgconMD0NfrDwZDmxvnm5udVInCxMS4H6saW0tJ0tIWgzbP8FDklM2sNFTsD1fnuwhKScqByXfdse5nr3r6h+bfp9ssr9t9dU8QEZ0Lk6PhX1ryQ6wo3ADPqceKHOEHBVnGpxyIdyWVOg36YgDxMD3y9pbbEOotaczeV1JefD/LnVnJGAejI8MDq6vyGLp9Jt1utdLBjBSSk2ZJgEQDhrG5ANRWHACTvQxmp+chLT1dX34CMKKnYIGZSLL0YUE40tLSMsK//CJJdUX2TzxBlQqV7EvrITAQkY6vuTpwZKFKpKoQjcgQleKwqedSiKmjAUPHxUuXe7ZA2sb3xejGbH3tiUc0LlNEjBFmcN453f7mxsmj1ePROK2MSbLxt4LlRZoa/LaZ07YQjN30+/1sm8S/sd7Z2Uk0TcvU6UT6G/D5fNG93Mj/iz9oYC5kMgYmNwAAAABJRU5ErkJggg%3D%3D%5D%5D%3E%3C/image%3E%0D%0A%20%20%3Cmode%3E0%3C/mode%3E%0D%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*Initialization%20Code*/%5D%5D%3E%3C/initcode%3E%0D%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5BgPrivateBrowsingUI.toggleMode%28%29%3B%0A%5D%5D%3E%3C/code%3E%0D%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0D%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0D%0A%20%20%3Cattributes/%3E%0D%0A%3C/custombutton%3E
в принципе там только одна строчка:
gPrivateBrowsingUI.toggleMode();
Как должен выглядеть код, чтобы кнопка имела вид нажатой во время сёрфинга в режиме приватного просмотра?
Отредактировано 3Jlou (09-08-2009 21:54:21)
Отсутствует
"Картинка" и "Картинка маленькая" - которые будут выбираться в зависимости от настройки панели инструментов?
Пока что можно, например, так:
var sId = "__custombuttonsStyle__" + this.id; // Unique style "id" var cssStr = 'toolbar %button% { list-style-image: url("http://forum.mozilla-russia.org/img/smilies/smile.png") !important; }\n' + 'toolbar[iconsize="small"] %button% { list-style-image: url("http://forum.mozilla-russia.org/img/smilies/neutral.png") !important; }'; cssStr = cssStr.replace(/%button%/g, "#" + this.id); function sheet(cssStr, removeFlag) { var sss = Components.classes["@mozilla.org/content/style-sheet-service;1"] .getService(Components.interfaces.nsIStyleSheetService); var ios = Components.classes["@mozilla.org/network/io-service;1"] .getService(Components.interfaces.nsIIOService); var data = "data:text/css," + encodeURIComponent(cssStr); var uri = ios.newURI(data, null, null); if(sss.sheetRegistered(uri, sss.USER_SHEET)) sss.unregisterSheet(uri, sss.USER_SHEET); if(removeFlag) return; sss.loadAndRegisterSheet(uri, sss.USER_SHEET); window[sId] = cssStr; } if(!(sId in window)) sheet(cssStr); else if(window[sId] != cssStr) { sheet(window[sId], true); sheet(cssStr); }
(в инициализацию)
Добавлено 09-08-2009 23:08:51
Вообще, можно и отдельное поле для ввода CSS-стиля сделать (в редакторе). Другое дело – насколько часто это бывает нужно.
Отредактировано Infocatcher (09-08-2009 23:04:41)
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Как должен выглядеть код, чтобы кнопка имела вид нажатой во время сёрфинга в режиме приватного просмотра?
Единственное, у меня кнопка выделяется как буд-то она очень большая по вертикали, на весь тулбар. Я еще подумаю как бы ее сделать получше
Отредактировано Dreyk (10-08-2009 12:22:58)
Отсутствует
А можно и я парочку заказов оставлю.
1. Нужна кнопка "Поиск выделенного в гугле/яндексе по этому сайту". Т.е. на странице http://forum.mozilla-russia.org/viewtopic.php?pid=362834 выделены слова "Custom Buttons". Тогда в гугл идет запрос в виде http://www.google.com/search?as_q=Custom%20Buttons&as_sitesearch=forum.mozilla-russia.org, а на Яндекс - http://yandex.ru/yandsearch?rpt=rad&text=Custom%20Buttons&serverurl=forum.mozilla-russia.org. Если есть возможность, то лучше зделать так: если выделения на странице нет, то работает только ПКМ - Настройки кнопки. Если выделение есть, то ЛКМ - поиск в гугле, ПКМ - в яндексе.
2. Нашел вот такую кнопку "Вставить и перейти":
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%0D%0A%20%20%3Cname%3EPaste%20and%20Go%3C/name%3E%0D%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAEG0lEQVR4AQEQBO/7Af///wAAAAAAAAAAAAAAAAB+g5B4AAUOhwAAAAAAAAAAAPvyeYJ9cIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB////AMabF/L17eoN2wFgAO8DPABgWkoA8fHwANXW2ADa3+4AEf3EACX/oAALExbzO2bqEv////wAAAAAAAAAAAH///8Au4gB/wk9vwC6w94AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARj0gAPfDQwBGeQAZAAAA7P////wAAAATBAAAAAAAAAAAMzI3ABgVwwDx8fcA+vr8AAEBAQAAAAAA/wAAAAAAAAApKlIAy8MAAAAAAAgAAAABAAAAAAAAAE4EAAAAAAAAAAAJCQkAIyIRANrb+wCKrjsADgkGAPL16gDw9OUA9/jxAAAAiwAICIgAYoIb3/7/DQABAQEG////nwQAAAAAAAAAAAAAAAAA/f0AAwAAAAQDBABPQAUAlburAO4c3gAID/0A9/37AOXt/AAd9yoAAvI6ABMTEyIBAQHeBAAAAAAAAAAAAAAAAAD8+wD++fsA7/XZAHyuqgAoQ/4ACQkGAAETBAD9BwAAEfb1AO3k0wDcpeIABTAFOCrnKuUEAAAAAAAAAAAAAAAAAPb5AOvu9QDV7q0APlgCAP0WBAD3yBsAAvsCANYSyQAAD/0ADhUGABRW6ADhpPlkNSs11gIAAAAAAAAAAAAAAAAA+/sA5u/3AAMd4gASIw0A6P3zACsaKwChX6EAYxBwAAveFwDYzuoA/hMBAPsl9ij/Cf8vAgAAAAAAAAAAAAAAAAD6/QD4+wUAGRgMAPkJ/QD4+fsAAP8AAAgFCABrP2sAnkyiAE4HVADm5PIADBUFERUOFSICAAAAAAAAAAAAAAAAAP37AAUFCAD6APoA8fj2APPz9wAA/QAAAAAAAAAAAAACAQIAAQABAPr8/QD5//0BEQ8RDAQAAAAAAAAAAAAAAAAA/P0ADwkDAOne+AAX9PQA9vf5AAD/AAD4+/gAn8afAJ/WnQDU/tMACSsDAPnaAfQJHAnuBAAAAAAAAAAAAPTYAAEniwApDuAAF8bWAOri2AAJBwMA1dzVAF+eXwDDAr0A9w/3AAkXAwD27PkALvY06SwcLNcB////AMeWE/D08u4PAAAAAAIGEADBCI4Aw+yjAO801gDzAvcA/AUAAP0HAAD6/fsA9Oz5ACfFNQBYM1GRIQUhiAH///8AAAAAAAEBARsAAAAFDw8PA2VwmdwNGfcAxuqvANIJyQD+C/UA+v/8AAPyDAAz+joAOxdRAAPt5kbExMTCAf///wAAAAAAAQEBAwAAAAIAAAAAJycnCEBAQCI7SjtK8f/xMgsGCx8AAAAA9fr14Q8BD869rr26sbGx7PDw8OaiWEPH7uRLhgAAAABJRU5ErkJggg%3D%3D%5D%5D%3E%3C/image%3E%0D%0A%20%20%3Cmode%3E0%3C/mode%3E%0D%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bthis.pasteURL%20%3D%20function%28aEvent%2C%20go%29%20%7B%0A%20%20var%20paste%20%3D%20readFromClipboard%28%29%3B%0A%20%20if%28%21paste%29%20return%3B%0A%20%20if%28%21go%29%20%7B%0A%20%20%20%20gURLBar.value%20%3D%20paste%3B%0A%20%20%7D%20else%20%7B%0A%20%20%20%20openUILink%28paste%2C%20aEvent%2C%20false%2C%20true%29%3B%0A%20%20%7D%0A%7D%0A%0Athis.copyURLBar%20%3D%20function%28%29%20%7B%0A%20%20var%20clipb%20%3D%20Components.classes%5B%22@mozilla.org/widget/clipboardhelper%3B1%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.getService%28Components.interfaces.nsIClipboardHelper%29%3B%0A%20%20clipb.copyString%28gURLBar.value%29%3B%0A%7D%0A%0Athis.clearURLBar%20%3D%20function%28%29%20%7B%0A%20%20gURLBar.value%20%3D%20%22%22%3B%0A%20%20gURLBar.focus%28%29%3B%0A%7D%0A%0Athis.resetURLBar%20%3D%20function%28%29%20%7B%0A%20%20gURLBar.value%20%3D%20gBrowser.currentURI.spec%3B%0A%7D%0A%0Athis.checkForMiddleClick%20%3D%20function%28aNode%2C%20aEvent%29%20%7B%0A%20%20if%20%28aEvent.button%20%3D%3D%201%29%20%7B%0A%20%20%20%20var%20fn%20%3D%20new%20Function%28%22event%22%2C%20aNode.getAttribute%28%22cb-oncommand%22%29%29%3B%0A%20%20%20%20fn.call%28aNode%2C%20aEvent%29%3B%0A%20%20%20%20closeMenus%28aEvent.target%29%3B%0A%20%20%7D%0A%7D%0Afunction%20cloneCBMenuitem%20%28id%29%0A%7B%0A%09var%20cbMenuitemId%20%3D%20%22custombuttons-contextpopup-%22%20+%20id%3B%0A%09var%20menuitem%20%3D%20document.%20getElementById%20%28cbMenuitemId%29%3B%0A%09var%20menuitem2%20%3D%20menuitem.%20cloneNode%20%28true%29%3B%0A%09menuitem2.%20setAttribute%20%28%22id%22%2C%20menuitem.%20id%20+%20this.%20id%29%3B%0A%09return%20menuitem2%3B%0A%7D%0Afunction%20createMenuitem%20%28label%2C%20command%29%0A%7B%0A%09var%20menuitem%20%3D%20document.%20createElement%20%28%22menuitem%22%29%3B%0A%09menuitem.%20setAttribute%20%28%22label%22%2C%20label%29%3B%0A%09menuitem.%20setAttribute%20%28%22oncommand%22%2C%20%22document.popupNode.%22%20+%20command%29%3B%0A%09return%20menuitem%3B%0A%7D%0A%0Avar%20submenu%20%3D%20document.%20createElement%20%28%22menupopup%22%29%3B%0Avar%20ids%20%3D%20%5B%22edit%22%2C%20%22remove%22%2C%20%22clone%22%2C%20%22copyURI%22%2C%20%22separator2%22%2C%20%22updateButton%22%2C%0A%09%09%20%20%20%22bookmarkButton%22%2C%20%22buttonHelp%22%2C%20%22separator3%22%2C%20%22customize%22%5D%3B%0Afor%20%28var%20i%20%3D%200%3B%20i%20%3C%20ids.%20length%3B%20i++%29%0A%7B%0A%09try%0A%09%7B%0A%09%09submenu.%20appendChild%20%28cloneCBMenuitem%20%28ids%20%5Bi%5D%29%29%3B%0A%09%7D%0A%09catch%20%28e%29%20%7B%7D%0A%7D%0Avar%20menu%20%3D%20document.%20createElement%20%28%22menupopup%22%29%3B%0Amenu.%20setAttribute%20%28%22id%22%2C%20%22cbContext-pgnButton%22%29%3B%0Amenu.%20setAttribute%20%28%22oncommand%22%2C%20%22event.%20stopPropagation%20%28%29%3B%22%29%3B%0Amenu.%20appendChild%20%28createMenuitem%20%28%22Paste%22%2C%20%22pasteURL%28%29%22%29%29%3B%0Amenu.%20appendChild%20%28createMenuitem%20%28%22Copy%22%2C%20%22copyURLBar%28%29%22%29%29%3B%0Amenu.%20appendChild%20%28createMenuitem%20%28%22Cut%22%2C%20%22copyURLBar%28%29%22%29%29%3B%0Amenu.%20appendChild%20%28createMenuitem%20%28%22Clear%22%2C%20%22clearURLBar%28%29%22%29%29%3B%0Amenu.%20appendChild%20%28createMenuitem%20%28%22Reset%22%2C%20%22resetURLBar%28%29%22%29%29%3B%0Avar%20menunode%20%3D%20document.%20createElement%20%28%22menu%22%29%3B%0Amenunode.%20setAttribute%20%28%22label%22%2C%20%22Custom%20Button%22%29%3B%0Amenunode.%20appendChild%20%28submenu%29%3B%0Amenu.%20appendChild%20%28menunode%29%3B%0Athis.%20appendChild%20%28menu%29%3B%0Athis.%20setAttribute%20%28%22context%22%2C%20menu.%20id%29%3B%0A%0Athis.setAttribute%28%22onclick%22%2C%20%22this.checkForMiddleClick%28this%2C%20event%29%22%29%3B%0Athis.setAttribute%28%22onmouseover%22%2C%20%22this.tooltipText%20%3D%20readFromClipboard%28%29%20%3F%20readFromClipboard%28%29%20%3A%20this.label%3B%22%29%3B%5D%5D%3E%3C/initcode%3E%0D%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*%20---------------------------------------------------------------------------%0A%20%20%20%20%20Paste%20and%20Go%20button%0A%20%20%20%20%20by%20Anton%0A%20%20%20%20%20Original%20code%20is%20LouCypher%20%28aka%20Zoolcar9%29%20%22Paste%20and%20Go%22%0A%20%20%20%20%20%28http%3A//loucypher.wordpress.com/projects/extensions/%23paste-and-go-button%29%0A%0A%20%20%20%20%20Lets%20you%20paste%20an%20URL%20from%20the%20clipboard%20and%20directly%20load%20it%0A%20%20%20---------------------------------------------------------------------------%20*/%0Atry%20%7B%0A%20%20this.pasteURL%28event%2C%20true%29%3B%0A%7D%20catch%28ex%29%20%7B%0A%20%20this.pasteURL%28null%2C%20true%29%3B%0A%7D%5D%5D%3E%3C/code%3E%0D%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0D%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0D%0A%20%20%3Cattributes/%3E%0D%0A%3C/custombutton%3E
как бы ее изменить, чтобы по ЛКМ ссылка из буфера вставлялась в новой фоновой вкладке (т.е. текущая вкладка продолжала быть активной), а по средней - вставить и открыть адрес в текущей вкладке?
Отсутствует
razoo
Кстати, в последнем варианте кнопки, если в табе открыт какой-нибудь chrome://speeddial/content/speeddial.xul то меню не формирует соответствующие пути, а показывает меню последнего открытого таба. Вот этого в предыдущем варианте кода нет.
Может быть, избавиться от фичи с topLevelImg?
Как бы, эксперимент дал положительный результат и это можно будет в чем-нибудь более полезном прикольно использовать (особенно, когда гифчик соответствующий поставил - очень эффектно смотрелось), но в данной кнопке, пожалуй, это излишество .
Да и от disabledImg тоже может избавиться для простоты и функциональности?
В "Код" по-прежнему
В "Инициализацию":
var THIS = this; var id = this. id; this. clickHandler = function (event) { if (event. button == 2) return; if (event. originalTarget. nodeName == "toolbarbutton") return; else if (event. originalTarget. nodeName == "menuitem") this. uriToLoad = event. originalTarget. getAttribute ("label"); }; this. decodeURL = function (url) { try { var uri = makeURI (url); if (uri. schemeIs ("chrome") || uri. schemeIs ("file")) url = losslessDecodeURI (makeURI (url, null, makeURI (url))); else url = losslessDecodeURI (makeURI (url)); } catch (e) {} return url; }; this. makePathsList = function (path, prefix) { var res = []; var paths = path. split ("/"); if (!paths. pop ()) paths. pop (); var url = prefix; for (var i = 0; i < paths. length; i++) { if (!paths [i]) continue; url += paths [i] + "/"; url = this. decodeURL (url); res. push (url); } return res; }; this. getJARPaths = function (uri) { uri = uri. QueryInterface (Components. interfaces. nsINestedURI); uri = uri. QueryInterface (Components. interfaces. nsIURL); var filePaths = this. getPaths (uri. innerURI); var jarPaths = this. makePathsList (uri. filePath, "jar:" + uri. innerURI. spec + "!/"); var res = filePaths. concat (jarPaths); res. push (this. decodeURL (uri. spec)); return res; }; this. getDomain = function (uri, level) { if (uri. schemeIs ("about")) return ""; if (uri. schemeIs ("jar")) { uri = uri. QueryInterface (Components. interfaces. nsINestedURI); uri = uri. innerURI; } var tlds = Components. classes ["@mozilla.org/network/effective-tld-service;1"]. getService (Components. interfaces. nsIEffectiveTLDService); var domain; try { domain = tlds. getBaseDomain (uri, level); } catch (e) { try { domain = uri. asciiHost; } catch (e) { domain = uri. host; } } return domain; }; this. getDomains = function (host) { var domains = []; var dLevel = 0; var tld = ""; while (tld != this. getDomain (host, dLevel)) { tld = this. getDomain (host, dLevel++); if (host. spec == (host. scheme + "://" + tld + "/")) continue; domains. push (this. decodeURL (host. scheme + "://" + tld +"/")); } return domains; }; this. getPaths = function (uri) { var paths = []; if (uri. schemeIs ("about")) return paths; if (uri. schemeIs ("jar")) return this. getJARPaths (uri); var initialURL = uri. spec; paths = this. makePathsList (uri. path, uri. prePath + "/"); paths. push (this. decodeURL (initialURL)); paths = this. getDomains (uri). concat (paths); return paths; }; this. getCBObject = function () { var cbobj = getBrowser (). mCurrentTab [id]; if (typeof (cbobj) != "object") getBrowser (). mCurrentTab [id] = {}; return getBrowser (). mCurrentTab [id]; }; this. handleMouseOver = function (event) { if (event && (event. originalTarget. nodeName != "toolbarbutton")) return; this. updateButton (event); }; this. updateButton = function (event) { var uri = makeURI (getBrowser (). contentDocument. location. href); var cbObject = THIS. getCBObject (); var uri2 = makeURI (cbObject. uri || uri. spec); if ((THIS. getDomain (uri, 0) == THIS. getDomain (uri2, 0)) && (uri. spec. length < uri2. spec. length)) uri = uri2; var f1 = (THIS. getDomain (uri, 0) == THIS. getDomain (uri2, 0)); var f2 = (uri. spec. length < uri2. spec. length); cbObject. uri = uri. spec; var paths = THIS. getPaths (uri); var url = THIS. decodeURL (getBrowser (). contentDocument. location. href); if ((paths. indexOf (url) == -1) && (paths. indexOf (url + "/") == -1)) { for (var i = 0; i < paths. length; i++) { if (url. length < paths [i]. length) { paths. splice (i, 0, url); break; } } } THIS. host = paths [0] || uri. spec; if (paths. length > 1) THIS. type = "menu-button"; else THIS. type = ""; var menu = THIS. getElementsByTagName ("menupopup") [0]; if (menu) THIS. removeChild (menu); menu = <menupopup xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"/> var menuitem; var curl = THIS. decodeURL (getBrowser (). contentDocument. location. href); for (var i = 0; i < paths. length; i++) { menuitem = <menuitem label={paths [i]} tooltiptext={paths [i]}/> if ((paths [i] == curl) || (paths [i] == (curl + "/"))) { menuitem.@checked = "true"; menuitem.@type = "radio"; } menu.menuitem[i] = menuitem; } menu = new DOMParser (). parseFromString (menu. toXMLString (), "application/xml"). documentElement; THIS. appendChild (menu); }; this. loadURL = function () { var url = this. uriToLoad || this. host; loadURI (this. uriToLoad || this. host); this. uriToLoad = ""; }; this. onUnload = function (event) { window. removeEventListener ("focus", THIS. updateButton, true); window. removeEventListener ("unload", THIS. onUnload, false); }; this. destroy = function () { this. onUnload (null); }; window. addEventListener ("focus", this. updateButton, true); window. addEventListener ("unload", this. updateButton, false); this. updateButton (null); this. setAttribute ("onclick", "this.clickHandler(event)"); this. setAttribute ("onmouseover", "this.handleMouseOver(event)"); this. orient = "horizontal";
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Можете сделать так, чтобы закладка при открытии сразу перематывала страницу к тому месту, где она была перед её занесением в кнопку.
Пока есть идея воспользоваться
nsISessionStore + getTabState() + результат в JSON и так строку возвращает.
Обратно – setTabState().
Но есть сомнения в разумности такого подхода. Впрочем, вроде, это самое простое.
Добавлено 10-08-2009 21:52:44
Во, кажется, работает:
var profileDir = Components.classes["@mozilla.org/file/directory_service;1"] .getService(Components.interfaces.nsIProperties) .get("ProfD", Components.interfaces.nsILocalFile) .path; var path = profileDir + "\\tabbookmarks.xml"; this. loadInBackground = true; this. handleDragOver = function (event) { var dt = event. dataTransfer; var tab = dt. mozGetDataAt (TAB_DROP_TYPE, 0); if (!tab) return; event. preventDefault (); event. stopPropagation (); return dt. effectAllowed = dt. dropEffect = "link"; } this. handleDrop = function (event) { var dt = event. dataTransfer; var url = dt. mozGetDataAt ("text/x-moz-text-internal", 0); var tab = dt. mozGetDataAt (TAB_DROP_TYPE, 0); this. addMenuitem (tab, url); }; this. __defineGetter__ ( "ss", function () { delete this.ss; return this.ss = Components.classes["@mozilla.org/browser/sessionstore;1"] .getService(Components.interfaces.nsISessionStore); } ); this. addMenuitem = function (tab, url) { var label = tab. label; var image = tab. image; var menu = this. menu; var mi = document. createElement ("menuitem"); mi. setAttribute ("label", label); mi. setAttribute ("tab_data", this.ss.getTabState(tab)); mi. setAttribute ("tooltiptext", url); mi. className = "menuitem-iconic bookmark-item"; image && mi. setAttribute ("image", "moz-anno:favicon:" + image); menu. appendChild (mi); this. type = "menu"; this. flushMenu (menu); var br = gBrowser; //if (br. tabContainer. childNodes. length > 1) br. removeTab (tab); }; this. deleteMenuitem = function (menuitem, dontFlush) { var menu = this. menu; menu. removeChild (menuitem); this. checkEmpty (menu); !dontFlush && this. flushMenu (menu); }; this. checkEmpty = function (menu) { if (menu. getElementsByTagName ("menuitem"). length > 0) return; menu. hidePopup (); this. type = ""; }; this. flushMenu = function (menu) { menu = menu || this. menu; var xs = new XMLSerializer (); var xmenu = xs. serializeToString (menu); var suc = Components. classes ["@mozilla.org/intl/scriptableunicodeconverter"]. createInstance (Components. interfaces. nsIScriptableUnicodeConverter); suc. charset = "UTF-8"; xmenu = suc. ConvertFromUnicode (xmenu); custombuttons. writeFile (path, xmenu); }; this. getMenu = function (event) { var menu = this. menu; if (menu) this. removeChild (menu); menu = ""; try { file = Components. classes ["@mozilla.org/file/local;1"]. createInstance (Components. interfaces. nsILocalFile); file. initWithPath (path); var fis = Components. classes ["@mozilla.org/network/file-input-stream;1"]. createInstance (Components. interfaces. nsIFileInputStream); fis.init (file, 0x01, 00004, null); var sis = Components. classes ["@mozilla.org/scriptableinputstream;1"]. createInstance (Components. interfaces. nsIScriptableInputStream); sis. init (fis); menu = sis. read (sis. available ()); sis. close (); var suc = Components. classes ["@mozilla.org/intl/scriptableunicodeconverter"]. createInstance (Components. interfaces. nsIScriptableUnicodeConverter); suc. charset = "UTF-8"; menu = suc. ConvertToUnicode (menu); menu = new XML (menu) || ""; } catch (e) { menu = ""; } if (!menu) { menu = <menupopup xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" onclick="this. parentNode. openTab (event);"/> } menu = new DOMParser (). parseFromString (menu. toXMLString (), "application/xml"). documentElement; this. appendChild (menu); if (menu. getElementsByTagName ("menuitem"). length > 0) this. type = "menu"; this. orient = "horizontal"; return menu; }; this. __defineGetter__ ( "menu", function () { return this. getElementsByTagName("menupopup") [0] || null; } ); this. openTab = function (event, mi) { mi = mi || event. target; var bg = event ? this. loadInBackground : true; var menu = mi. parentNode; if (!event || event. button < 2) { var tab; if (event && event. button == 0) tab = gBrowser. mCurrentTab; else tab = gBrowser. loadOneTab("about:blank", null, null, null, bg, false); menu. hidePopup (); var tabData = mi. getAttribute ("tab_data"); this.ss.setTabState(tab, tabData); } else event. stopPropagation (); this. deleteMenuitem (mi, !event); }; this. onclick = function (event) { if (event. button != 1 || event. target != this) return; var menu = this. menu; var mis = menu. getElementsByTagName ("menuitem"); while (mis. length) this. openTab (null, mis[0]); this. flushMenu (menu); }; this. setAttribute ("ondragdrop", "return this. handleDrop (event);"); this. setAttribute ("ondragover", "return this. handleDragOver (event);"); this. setAttribute ("onmouseover", "if (event. target == this) this. getMenu (event);"); this. getMenu ();
Добавлено 10-08-2009 21:53:11
P.S. Firefox 3.0+.
Отредактировано Infocatcher (11-08-2009 16:39:32)
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Господа разработчики расширения, вопрос "косметического" характера: почему бы не сделать в диалоге редактирования кнопки 2 поля: "Картинка" и "Картинка маленькая" - которые будут выбираться в зависимости от настройки панели инструментов?
Изначально активно поле "Картинка", после заполнения этого поля активируется поле "Картинка маленькая", которое можно не заполнять, тогда для обоих вариантов настройки панели инструментов используется иконка из 1-го поля.
Ок, буду иметь в виду. Но без обещаний.
Добавлено 10-08-2009 23:08:20
3Jlou пишетКак должен выглядеть код, чтобы кнопка имела вид нажатой во время сёрфинга в режиме приватного просмотра?
...
Можно добавить в раздел "Инициализация"
var THIS = this; this. cbObserver = { button: THIS, win: window, observe: function (subject, topic, data) { if (topic != "private-browsing") return; if (data == "enter") this. button. checked = true; else if (data == "exit") this. button. checked = false; } }; var os = Components. classes ["@mozilla.org/observer-service;1"]. getService (Components. interfaces. nsIObserverService); os. addObserver (this. cbObserver, "private-browsing", false); this. destroy = function () { var os = Components. classes ["@mozilla.org/observer-service;1"]. getService (Components. interfaces. nsIObserverService); os. removeObserver (this, "private-browsing"); };
тогда состояние кнопки будет изменяться даже если переключение будет производиться не кнопкой, а из меню.
Правда, деструкторы кнопок пока не реализованы, поэтому observer сниматься не будет. (но это мало кто заметит)
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует