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

Пользователи не любят читать документацию. Станьте оригинальным, будьте не как все. Ознакомьтесь с нашей базой знаний.

№102607-08-2009 13:20:46

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 3.5
Веб-сайт

Re: Custom Buttons

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ентов на части порвет !!!

Отсутствует

 

№102707-08-2009 14:22:22

Najlus
Рррррррррррь!
 
Группа: Extensions
Откуда: Город N
Зарегистрирован: 11-01-2009
Сообщений: 1988
UA: Firefox 3.5

Re: Custom Buttons

Уже лучше, но всёравно =( он вместо имени папки какойто набор непонятных символов вставляет


Вы ленивы, следовательно вы изобретательны (Граф Де Гиш)
Список настроек About:config на русском языке с пояснениями и рекомендациями

Отсутствует

 

№102807-08-2009 14:40:36

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 3.5
Веб-сайт

Re: Custom Buttons

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;
var suc = Components. classes ["@mozilla.org/intl/scriptableunicodeconverter"].
	  createInstance (Components. interfaces. nsIScriptableUnicodeConverter);
suc. charset = "UTF-8";
dir = suc. ConvertToUnicode (dir);
startProcess (dir, "");

?


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№102907-08-2009 15:09:47

3Jlou
Участник
 
Группа: Members
Зарегистрирован: 14-08-2008
Сообщений: 211
UA: Firefox 3.5

Re: Custom Buttons

ссылка на пост с кнопкой

Anton пишет

Что она должна делать ?

Кнопка "поглощает" любой тулбар (кроме панелей навигации и закладок) и отображает расположенные на нём кнопки во всплывающей панели.

Т.е. сначала следует создать тулбар, накидать на него какие-либо кнопки, затем нажать на кнопку Popup Toolbar (которая должна располагаться на панели, отличной от созданной) и в появившемся меню указать тулбар для "поглощения". Так вот, если расположить на "поглощаемой" панели эту кнопку, то она отказывается работать.

Добавлено 07-08-2009 15:15:30

Anton пишет

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

Отсутствует

 

№103007-08-2009 15:23:30

Najlus
Рррррррррррь!
 
Группа: Extensions
Откуда: Город N
Зарегистрирован: 11-01-2009
Сообщений: 1988
UA: Firefox 3.5

Re: Custom Buttons

Anton пишет

Najlus Вот так попробуй

ТАДАМ!!! РАБОТАЕТ!!!!
СПА-СИ-БО


Вы ленивы, следовательно вы изобретательны (Граф Де Гиш)
Список настроек About:config на русском языке с пояснениями и рекомендациями

Отсутствует

 

№103107-08-2009 15:58:17

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 3.5
Веб-сайт

Re: Custom Buttons

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ентов на части порвет !!!

Отсутствует

 

№103207-08-2009 16:26:22

3Jlou
Участник
 
Группа: Members
Зарегистрирован: 14-08-2008
Сообщений: 211
UA: Firefox 3.5

Re: Custom Buttons

Anton пишет

Ну, стало быть, gQuote.mHandler CB и CB2 не полностью совместимы.
Что если заменить в конце кода "Popup Toolbar"...

Попробовал - не работает эта кнопка, хотя недавно я как то ей пользовался без проблем, да вот уже не помню, может действительно CB2 ставил.

Отсутствует

 

№103307-08-2009 16:35:47

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 3.5
Веб-сайт

Re: Custom Buttons

3Jlou пишет

Попробовал - не работает эта кнопка

У меня эта кнопка работает.


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№103407-08-2009 16:48:06

3Jlou
Участник
 
Группа: Members
Зарегистрирован: 14-08-2008
Сообщений: 211
UA: Firefox 3.5

Re: Custom Buttons

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)

Отсутствует

 

№103507-08-2009 17:00:31

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 3.5
Веб-сайт

Re: Custom Buttons

3Jlou
Нет, там другая какая-то причина.
Если принять изменения, которые я указал в сообщении № 1032, то проблемы с контекстным меню не будет, а указанные кнопки будут работать.
Другое дело, что и в CB2 эта кнопка бывает что перестает работать.


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№103607-08-2009 17:32:57

Najlus
Рррррррррррь!
 
Группа: Extensions
Откуда: Город N
Зарегистрирован: 11-01-2009
Сообщений: 1988
UA: Firefox 3.5

Re: Custom Buttons

Кажется, вот так будет надежнее.

Да вам надо памятник из метеоритной платины ставить =)


Вы ленивы, следовательно вы изобретательны (Граф Де Гиш)
Список настроек About:config на русском языке с пояснениями и рекомендациями

Отсутствует

 

№103707-08-2009 21:13:23

razoo
Участник
 
Группа: Members
Зарегистрирован: 23-07-2009
Сообщений: 48
UA: Foxware 0.0

Re: Custom Buttons

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)

Отсутствует

 

№103807-08-2009 21:39:47

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 3.5

Re: Custom Buttons

razoo пишет

как правильно добавить в твой код 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)


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№103908-08-2009 10:43:20

razoo
Участник
 
Группа: Members
Зарегистрирован: 23-07-2009
Сообщений: 48
UA: Foxware 0.0

Re: Custom Buttons

Infocatcher пишет

Или найти, где в коде добавляются такие же обработчики, и подправить там, или примерно вот так (добавлять в самый низ)

Я и обработчики менял и внизу добавлял, просто, наверно, мой кодец был кривой :)
С твоим кодом - глюк исчез. Спасибо.

Anton, можно еще сделать так, чтобы по нажатию на саму кнопку - поднимал только на один уровень вверх, а на сtrl-клик открывал целевой url в новом табе (из меню тоже)?

И микроглючик: если запустить Customize, когда открыт таб с каким-нибудь chrome://speeddial/content/speeddial.xul или chrome://browser/content/places/places.xul, кнопка становится полупрозрачной (но рабочей), а вот вернуть нормальный вид помогает только «Edit Button... > Applay». Может, это связано с

последнем варианте кнопки, если в табе открыт какой-нибудь chrome://speeddial/content/speeddial.xul то меню не формирует соответствующие пути, а показывает меню последнего открытого таба.

Твой предыдущий код, хавает адреса с chrome:// как обычные.
:)

Отсутствует

 

№104008-08-2009 22:22:52

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 3.5
Веб-сайт

Re: Custom Buttons

3Jlou пишет

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ентов на части порвет !!!

Отсутствует

 

№104109-08-2009 17:07:11

Najlus
Рррррррррррь!
 
Группа: Extensions
Откуда: Город N
Зарегистрирован: 11-01-2009
Сообщений: 1988
UA: Firefox 3.5

Re: Custom Buttons

Ещё одна просьба по поводу кнопки 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 на русском языке с пояснениями и рекомендациями

Отсутствует

 

№104209-08-2009 19:21:25

3Jlou
Участник
 
Группа: Members
Зарегистрирован: 14-08-2008
Сообщений: 211
UA: Firefox 3.0

Re: Custom Buttons

Господа разработчики расширения, вопрос "косметического" характера: почему бы не сделать в диалоге редактирования кнопки 2 поля: "Картинка" и "Картинка маленькая" - которые будут выбираться в зависимости от настройки панели инструментов?
Изначально активно поле "Картинка", после заполнения этого поля активируется поле "Картинка маленькая", которое можно не заполнять, тогда для обоих вариантов настройки панели инструментов используется иконка из 1-го поля.

Отредактировано 3Jlou (09-08-2009 19:22:12)

Отсутствует

 

№104309-08-2009 20:07:08

Najlus
Рррррррррррь!
 
Группа: Extensions
Откуда: Город N
Зарегистрирован: 11-01-2009
Сообщений: 1988
UA: Firefox 3.5

Re: Custom Buttons

Сомневаюсь что такое возможно. Во всяком случае надо обращаться к разработчику =(


Вы ленивы, следовательно вы изобретательны (Граф Де Гиш)
Список настроек About:config на русском языке с пояснениями и рекомендациями

Отсутствует

 

№104409-08-2009 21:54:04

3Jlou
Участник
 
Группа: Members
Зарегистрирован: 14-08-2008
Сообщений: 211
UA: Firefox 3.0

Re: Custom Buttons

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)

Отсутствует

 

№104509-08-2009 23:02:16

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 3.5

Re: Custom Buttons

3Jlou пишет

"Картинка" и "Картинка маленькая" - которые будут выбираться в зависимости от настройки панели инструментов?

Пока что можно, например, так:

Выделить код

Код:

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)


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№104609-08-2009 23:31:16

Dreyk
Участник
 
Группа: Members
Зарегистрирован: 02-08-2009
Сообщений: 9
UA: Firefox 3.5

Re: Custom Buttons

3Jlou пишет

Как должен выглядеть код, чтобы кнопка имела вид нажатой во время сёрфинга в режиме приватного просмотра?

Выделить код

Код:

gPrivateBrowsingUI.toggleMode();
this.checked = !this.checked;

Единственное, у меня кнопка выделяется как буд-то она очень большая по вертикали, на весь тулбар. Я еще подумаю как бы ее сделать получше

Отредактировано Dreyk (10-08-2009 12:22:58)

Отсутствует

 

№104709-08-2009 23:39:34

Jarichek
Member I
 
Группа: Members
Откуда: Минск
Зарегистрирован: 09-04-2009
Сообщений: 306
UA: Firefox 3.5

Re: Custom Buttons

А можно и я парочку заказов оставлю.
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

как бы ее изменить, чтобы по ЛКМ ссылка из буфера вставлялась в новой фоновой вкладке (т.е. текущая вкладка продолжала быть активной), а по средней - вставить и открыть адрес в текущей вкладке?

Отсутствует

 

№104810-08-2009 20:32:27

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 3.5
Веб-сайт

Re: Custom Buttons

razoo

Кстати, в последнем варианте кнопки, если в табе открыт какой-нибудь chrome://speeddial/content/speeddial.xul то меню не формирует соответствующие пути, а показывает меню последнего открытого таба. Вот этого в предыдущем варианте кода нет.
Может быть, избавиться от фичи с topLevelImg?
Как бы, эксперимент дал положительный результат и это можно будет в чем-нибудь более полезном прикольно использовать (особенно, когда гифчик соответствующий поставил - очень эффектно смотрелось), но в данной кнопке, пожалуй, это излишество :).
Да и от disabledImg тоже может избавиться для простоты и функциональности?

В "Код" по-прежнему

Выделить код

Код:

this. loadURL ();

В "Инициализацию":

Выделить код

Код:

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ентов на части порвет !!!

Отсутствует

 

№104910-08-2009 21:24:47

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 3.5

Re: Custom Buttons

Najlus пишет

Можете сделать так, чтобы закладка при открытии сразу перематывала страницу к тому месту, где она была перед её занесением в кнопку.

Пока есть идея воспользоваться
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)


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№105010-08-2009 22:59:58

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 3.5
Веб-сайт

Re: Custom Buttons

3Jlou пишет

Господа разработчики расширения, вопрос "косметического" характера: почему бы не сделать в диалоге редактирования кнопки 2 поля: "Картинка" и "Картинка маленькая" - которые будут выбираться в зависимости от настройки панели инструментов?
Изначально активно поле "Картинка", после заполнения этого поля активируется поле "Картинка маленькая", которое можно не заполнять, тогда для обоих вариантов настройки панели инструментов используется иконка из 1-го поля.

Ок, буду иметь в виду. Но без обещаний.

Добавлено 10-08-2009 23:08:20

Dreyk пишет
3Jlou пишет

Как должен выглядеть код, чтобы кнопка имела вид нажатой во время сёрфинга в режиме приватного просмотра?

Выделить код

Код:

gPrivateBrowsingUI.toggleMode();
this.checked = !this.checked;

...

Можно добавить в раздел "Инициализация"

Выделить код

Код:

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ентов на части порвет !!!

Отсутствует

 

Board footer

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