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

Будьте в курсе последних изменений в мире Mozilla, следя за нашим микроблогом в Twitter.

№92625-07-2009 14:00:28

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

Re: Custom Buttons

Антон, извини, что опять надоедаю, но не мог бы ты к кнопке с закладками (которой я тебя так долго мучал), прицепить внизу списка функцию "открыть всё в новых вкладках? =)


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

Отсутствует

 

№92725-07-2009 16:44:29

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

Re: Custom Buttons

Najlus

а сделать автоматическую скачку и возврат к странице с видео никак?

никак


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

Отсутствует

 

№92825-07-2009 20:18:08

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

Re: Custom Buttons

А по поводу второго вопроса (пост 927)?


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

Отсутствует

 

№92925-07-2009 20:25:26

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

Re: Custom Buttons

Najlus

А по поводу второго вопроса (пост 927)?

Я сейчас занимаюсь вопросами razoo
Как закончу, займусь твоим.


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

Отсутствует

 

№93025-07-2009 21:08:35

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

Re: Custom Buttons

razoo пишет

2. Использую расширение "Brief" https://addons.mozilla.org/en-US/firefox/addon/4578, как RSS агрегатор. Хотелось бы чтобы открывающая его кнопка одновременно закрывала боковую панель AiOS (но не блокировала). Просто у Брифа есть собственная боковая панель, которая в AiOS не интегрируется (и ненужно). Восстановление панели после закрытия Брифа тоже не требуется

Секция «код»:

Выделить код

Код:

if(this.isBriefOpen())
	gBrowser.removeTab(gBrief.tab);
else {
	try { toggleSidebar(); }
	catch(e) {}
	gBrief.open(gBrief.shouldOpenInNewTab());
}

Секция «инициализация»:

Выделить код

Код:

this.image = "chrome://brief/skin/toolbarbutton.png";
this.type = "checkbox";
this.isBriefOpen = function() {
	return gBrief.tab == gBrowser.selectedTab;
};
this.updState = function() {
	this.checked = this.isBriefOpen();
};

if(gBrief.onTabLoad.toString().indexOf("var ret = _onTabLoad.apply(this, arguments);") != -1)
	return;

var _onTabLoad = gBrief.onTabLoad;
var _onTabSelect = gBrief.onTabSelect;
var _this = this;
gBrief.onTabLoad = function() {
	var ret = _onTabLoad.apply(this, arguments);
	_this.updState();
	return ret;
};
gBrief.onTabSelect = function() {
	var ret = _onTabSelect.apply(this, arguments);
	_this.updState();
	return ret;
};

Если нужно поставить свою картинку, строку

Выделить код

Код:

this.image = "chrome://brief/skin/toolbarbutton.png";

нужно убрать.


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

Отсутствует

 

№93125-07-2009 21:53:21

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

Re: Custom Buttons

Infocatcher
Спасибо, всё работает :)
Маленький недочет - если закрыть таб с "Брифом" кнопкой закрытия таба, а не той, которую сделали - то отображение нашей (custom) останется нажатой.
Может вообще убрать ей "нажатый" вариант?
Какая строчка кода на это работает?

Отредактировано razoo (25-07-2009 21:54:54)

Отсутствует

 

№93225-07-2009 22:20:25

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

Re: Custom Buttons

razoo пишет

Маленький недочет - если закрыть таб с "Брифом" кнопкой закрытия таба, а не той, которую сделали - то отображение нашей (custom) останется нажатой.

Не должно бы. А оригинальная кнопка правильно меняет «нажатость»?

Можно вот так попробовать (вместо предыдущего кода для раздела «инициализация»):

Выделить код

Код:

this.image = "chrome://brief/skin/toolbarbutton.png";
this.type = "checkbox";
this.isBriefOpen = function() {
	return gBrief.tab == gBrowser.selectedTab;
};
this.updState = function() {
	this.checked = this.isBriefOpen();
};
this.updState();

if(gBrief.onTabLoad.toString().indexOf("_cb_onTabLoad") != -1)
	return;

var _cb_onTabLoad = gBrief.onTabLoad;
var _cb_onTabSelect = gBrief.onTabSelect;
var _cb_this = this;
gBrief.onTabLoad = function() {
	var ret = _cb_onTabLoad.apply(this, arguments);
	_cb_this.updState();
	return ret;
};
gBrief.onTabSelect = function() {
	var ret = _cb_onTabSelect.apply(this, arguments);
	_cb_this.updState();
	return ret;
};

+ теперь устанавливается правильное состояние при создании кнопки.

А вот правильно работать, возможно, будет только в новых окнах (или после перезапуска).


Без изменения состояния кнопки (только секция «код»):

Выделить код

Код:

if(gBrief.tab == gBrowser.selectedTab)
	gBrowser.removeTab(gBrief.tab);
else {
	try { toggleSidebar(); }
	catch(e) {}
	gBrief.open(gBrief.shouldOpenInNewTab());
}

Отредактировано Infocatcher (25-07-2009 22:26:32)


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

Отсутствует

 

№93325-07-2009 22:21:20

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

Re: Custom Buttons

razoo

1. Сделал кнопку для "Block Site" https://addons.mozilla.org/en-US/firefox/addon/3145 с вашим кодом (пост #786 http://forum.mozilla-russia.org/viewtop … 88#p305388).
Спасибо, отличная вещь. Но можно ли усовершенствовать код, чтобы плагин блокировал весь сайт, а не только открытую страничку (пока приходится вручную добавлять "*" после доменной зоны нежелательного портала). А еще лучше, если бы, рядом была стрелка с выпадающим меню, где была бы возможность определить до какого уровня блокировать, а нажатие на саму кнопку - блокировало бы весь сайт целиком.

В раздел "Код":

Выделить код

Код:

var url = getBrowser (). contentDocument. location. href;
url = url. match (/^([a-zA-Z]+:\/\/)?([^\/]+)\/([^?]*)?(.*)$/);
var domain = "";
if (url)
	domain = url [1] + url [2] + "/*";
this. blockURL (this. uriToBlock || domain);
this. uriToBlock = "";

В раздел "Инициализация":

Выделить код

Код:

/*Initialization Code*/
this. clickHandler = function (event)
{
	if (event. button == 2)
		return;
	if (event. originalTarget. nodeName == "toolbarbutton")
		return;
	else if (event. originalTarget. nodeName == "menuitem")
		this. uriToBlock = event. originalTarget. getAttribute ("label");
};

this. blockURL = function (url)
{
	var Cc = Components. classes;
	var Ci = Components. interfaces;
		var NSISSI = Ci. nsISupportsString;
	var blockedWebsitesArray;
	var BlockSitePrefBranch = Cc ["@mozilla.org/preferences-service;1"]. getService (Ci. nsIPrefService). getBranch("BlockSite.");
	if (BlockSitePrefBranch. prefHasUserValue ("locations"))
	{
	    blockedWebsitesString = BlockSitePrefBranch. getComplexValue ("locations", NSISSI). data;
	    blockedWebsitesArray = blockedWebsitesString. split ("|||");
	}
	else
	{
	    blockedWebsitesArray = new Array();
	}
	blockedWebsitesArray. push (url);
	var locationNsIString = Cc ["@mozilla.org/supports-string;1"]. createInstance (NSISSI);
	locationNsIString. data = blockedWebsitesArray. join ("|||");
	BlockSitePrefBranch. setComplexValue ("locations", NSISSI, locationNsIString);
	custombuttons. alertSlide ("Blocked: ", url);
};

this. createMenu = function (event)
{
	var url = getBrowser (). contentDocument. location. href;
	if (event && (event. originalTarget. nodeName != "toolbarbutton"))
		return;
	url = url. match (/^([a-zA-Z]+:\/\/)?([^\/]+)\/([^?]*)?(.*)$/);
	var domain = "";
	var levels = "";
	if (url)
	{
		domain = url [1] + url [2] + "/";
		var path = url [3] && url [3]. split ("/") || "";
		var levels = [];
		var curpath = "";
		for (var i = 0; i < path. length; i++)
		{
			curpath = curpath + path [i] + "/";
			levels. push (domain + curpath);
		}
	}
	var menu = this. getElementsByTagName ("menupopup") [0];
	if (menu)
		this. removeChild (menu);
	menu = "";
	menu = <menupopup xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"/>
	var menuitem;
	for (var i = 0; i < levels. length; i++)
	{
		menuitem = <menuitem label={levels [i]}/>
		menu.menuitem[i] = menuitem;
	}
	menu = new DOMParser (). parseFromString (menu. toXMLString (), "application/xml"). documentElement;
	this. appendChild (menu);
        this. type = "menu-button";
	this. orient = "horizontal";
};

this. createMenu (null);

this. setAttribute ("onclick", "this.clickHandler(event)");
this. setAttribute ("onmouseover", "this.createMenu(event,getBrowser().contentDocument.location.href)");

2. Использую расширение "Brief" https://addons.mozilla.org/en-US/firefox/addon/4578, как RSS агрегатор. Хотелось бы чтобы открывающая его кнопка одновременно закрывала боковую панель AiOS (но не блокировала). Просто у Брифа есть собственная боковая панель, которая в AiOS не интегрируется (и ненужно). Восстановление панели после закрытия Брифа тоже не требуется

У меня получилось "корявей" чем у Infocatcher'а (и получилось ли как надо - я не пользователь Brief). Кстати, Infocatcher - спасибо.

Какая строчка кода на это работает?

Вторая в разделе "Инициализация", вроде бы как.

3. Не получилось сделать работающую кнопку для добавления текущей страницы в проект Offline Explorerа. Родное метапродуктовское расширение позволяет это сделать только из контекстного меню. Самодельная кнопка запускает Оффлайн Эксплорер и создает пустой проект, а url текущей страницы в него не вставляет.
Тупо использовал код, вытащенный MenuManipulator из контекстного:

Перед строкой "MPContext.OEDownload(event);" надо добавить

Выделить код

Код:

var url = getBrowser (). contentDocument. location. href;
this. setAttribute ("url", url);

Что касается вопросов по визуальному отображению кнопок.

Можно ли это реализовать в CB для других кнопок?

Скорее всего, можно, но я не настолько знаток css, чтобы "слету" придумать, что там надо записать в "Инициализацию", нужны дополнительные исследования.
Короче, идей пока никаких нет, если появятся - сообщу дополнительно.


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

Отсутствует

 

№93425-07-2009 22:27:58

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

Re: Custom Buttons

Infocatcher
Всё теперь работает корректно )
Причем, действительно, "недочет" с новым кодом пропал после рестарта.
Спасибо )

Добавлено 25-07-2009 22:40:28
Anton
Спасибо, всё и работает отлично и выглядит правильно!

P.S. Уникальная у вас тут оперативность. :)
Думаю, что и с визуальными решениями вы тож разберетесь.

Отсутствует

 

№93525-07-2009 22:44:20

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

Re: Custom Buttons

Najlus пишет

Антон, извини, что опять надоедаю, но не мог бы ты к кнопке с закладками (которой я тебя так долго мучал), прицепить внизу списка функцию "открыть всё в новых вкладках? =)

"Прицеплением" дополнительного пункта меню я заморачиваться не стал.
Вместо этого клик по кнопке открывает весь список на вкладках.
Надо взять вариант кода, который предложил Infocatcher, в разделе "Инициализация" найти и заменить строки

Выделить код

Код:

type = "menu";

на

Выделить код

Код:

type = "menu-button";

В раздел "Код" добавить:

Выделить код

Код:

var menu = this. getElementsByTagName ("menupopup") [0];
var mi = menu. getElementsByTagName ("menuitem");
while (mi. length > 0)
{
	getBrowser (). loadOneTab(mi [0]. getAttribute ("url"), null, null, null, false /*load in background*/, false);
	this. deleteMenuitem (mi [0]);
}

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

Отсутствует

 

№93625-07-2009 22:50:01

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

Re: Custom Buttons

По поводу отображения кнопок.
В стилях для стандартных кнопок:

Выделить код

Код:

-moz-appearance: none;
border: none;

+ другие иконки на
:hover и :hover:active

Реализовать это можно примерно вот так (код записывать в «инициализацию»):

Выделить код

Код:

with(this.style) {
	MozAppearance = "none";
	border = "none";
}
this.onmouseover = function() { this.image = "hover"; };
this.onmouseout = function() { this.image = "normal"; };
this.onmousedown = function() { this.image = "active"; };
this.onmouseup = function() { this.image = "hover"; };

Вместо "normal", "hover" и "active" – должны быть соответствующие картинки.
Только нужно следить, чтобы больше нигде не переназначалось this.on<событие>, иначе нужно править уже имеющийся код.

В качестве демонстрации (с изменением прозрачности вместо картинок):

Выделить код

Код:

with(this.style) {
	MozAppearance = "none";
	border = "none";
}
this.onmouseover = function() { this.style.opacity = "0.8"; };
this.onmouseout = function() { this.style.opacity = "1"; };
this.onmousedown = function() { this.style.opacity = "0.5"; };
this.onmouseup = function() { this.style.opacity = "0.8"; };

Добавлено 25-07-2009 23:02:11
P.S. Случаем API для регистрации CSS-правил не предусмотрено? По-моему, не помешало бы пригодилось бы.
Как примерный вариант – функция получает строку CSS-кода, заменяет все вхождения «%button%» на «#buttonId» и «регистрирует» новый стиль.

Добавлено 25-07-2009 23:14:57
Using the Stylesheet Service

Отредактировано Infocatcher (25-07-2009 22:54:50)


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

Отсутствует

 

№93725-07-2009 23:24:23

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

Re: Custom Buttons

Infocatcher
Ок, буду думать.


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

Отсутствует

 

№93826-07-2009 03:43:22

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

Re: Custom Buttons

Anton пишет

"Прицеплением" дополнительного пункта меню я заморачиваться не стал.
Вместо этого клик по кнопке открывает весь список на вкладках.

Или можно открывать весь список при клике средней кнопкой мыши (по-прежнему в раздел «инициализация»):

Выделить код

Код:

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 ();

Отредактировано Infocatcher (26-07-2009 03:43:58)


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

Отсутствует

 

№93926-07-2009 10:47:52

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

Re: Custom Buttons

Infocatcher, Anton СПА-СИ-БО! =)
Infocatcher - ваш вариант для меня более удобен =)


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

Отсутствует

 

№94026-07-2009 17:55:36

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

Re: Custom Buttons

Anton
А как насчет реализации деструкторов для кнопок?
Т.е. чтобы можно было определить действие, которое будет выполняться при удалении кнопки (или хотя бы – если сложно реализовать учет перетаскивания кнопки обратно в toolbarpalette – при пересоздании кнопки, если пользователь изменил что-то в коде).
Например, можно было бы сделать вот так (а не так):

Выделить код

Код:

if(gBrief.onTabLoad.toString().indexOf("_cb_onTabLoad") != -1)
	return;

var _cb_onTabLoad = gBrief.onTabLoad;
var _cb_onTabSelect = gBrief.onTabSelect;
var _cb_this = this;
gBrief.onTabLoad = function() {
	var ret = _cb_onTabLoad.apply(this, arguments);
	_cb_this.updState();
	return ret;
};
gBrief.onTabSelect = function() {
	var ret = _cb_onTabSelect.apply(this, arguments);
	_cb_this.updState();
	return ret;
};

this.buttonDestructor = function() {
	gBrief.onTabLoad = _cb_onTabLoad;
	gBrief.onTabSelect = _cb_onTabSelect;
};

Если пойти дальше, может пригодиться и чуть более расширенный вариант, который будет выполняться еще и при событии «unload» окна браузера.

Добавлено 26-07-2009 18:06:10
Во, вроде, работает даже при вызове настройки панелей инструментов:

Выделить код

Код:

var cssStr = "%button%:hover { opacity: 0.7 !important; }";
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.replace(/%button%/g, "#" + this.id));
var uri = ios.newURI(data, null, null);
sss.loadAndRegisterSheet(uri, sss.USER_SHEET);


var _this = this;
this.addEventListener(
	"DOMNodeRemoved",
	function(e) {
		_this.removeEventListener("DOMNodeRemoved", arguments.callee, true);
		alert(e.type);
		if(sss.sheetRegistered(uri, sss.USER_SHEET))
			sss.unregisterSheet(uri, sss.USER_SHEET);
	},
	true
);

Добавлено 26-07-2009 18:07:23
Но, по-хорошему, нужно еще повесить обработчик на unload и снимать слушателя DOMNodeRemoved, если он к тому моменту все еще висит.

Добавлено 26-07-2009 18:15:37
Вот как-то так:

Выделить код

Код:

var cssStr = "%button%:hover { opacity: 0.7 !important; }";
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.replace(/%button%/g, "#" + this.id));
var uri = ios.newURI(data, null, null);
sss.loadAndRegisterSheet(uri, sss.USER_SHEET);


var _this = this;
var unloadDestroy = false;
function destroy(e) {
	alert(e.type + " => destroy()");
	_this.removeEventListener("DOMNodeRemoved", destroy, true);
	window.removeEventListener("unload", destroy, false);
	if(e.type == "unload" && !unloadDestroy)
		return;
	if(sss.sheetRegistered(uri, sss.USER_SHEET))
		sss.unregisterSheet(uri, sss.USER_SHEET);
}
this.addEventListener("DOMNodeRemoved", destroy, true);
window.addEventListener("unload", destroy, false);

Добавлено 26-07-2009 18:21:02
Пример с кодом для открытия Brief:

Выделить код

Код:

this.image = "chrome://brief/skin/toolbarbutton.png";
this.type = "checkbox";
this.isBriefOpen = function() {
	return gBrief.tab == gBrowser.selectedTab;
};
this.updState = function() {
	this.checked = this.isBriefOpen();
};
this.updState();

if(gBrief.onTabLoad.toString().indexOf("_cb_onTabLoad") != -1)
	return;

var _cb_onTabLoad = gBrief.onTabLoad;
var _cb_onTabSelect = gBrief.onTabSelect;
var _cb_this = this;
gBrief.onTabLoad = function() {
	var ret = _cb_onTabLoad.apply(this, arguments);
	_cb_this.updState();
	return ret;
};
gBrief.onTabSelect = function() {
	var ret = _cb_onTabSelect.apply(this, arguments);
	_cb_this.updState();
	return ret;
};


var _this = this;
var unloadDestroy = false;
function destroy(e) {
	_this.removeEventListener("DOMNodeRemoved", destroy, true);
	window.removeEventListener("unload", destroy, false);
	if(e.type == "unload" && !unloadDestroy)
		return;
	gBrief.onTabLoad = _cb_onTabLoad;
	gBrief.onTabSelect = _cb_onTabSelect;
}
this.addEventListener("DOMNodeRemoved", destroy, true);
window.addEventListener("unload", destroy, false);

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

Отсутствует

 

№94126-07-2009 20:15:32

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

Re: Custom Buttons

Infocatcher
Код стиля кнопок "без бордюров" сработал.

Выделить код

Код:

/*Initialization Code*/
with(this.style) {
    MozAppearance = "none";
    border = "none";
this. mouseover = function (event)
{
    this. oldimage = this. image;
    this. image = "file:///W:/ReloadwoCach2.png";
}
this. mouseout = function (event)
{
    this. image = this. oldimage;
}
this. setAttribute ("onmouseover", "this.mouseover()");
this. setAttribute ("onmouseout", "this.mouseout()");

Было:
e9b2ca7f1969.gif
Стало:
b2feb2c834c0.gif

Кому как, а мне вариант "без бордюров" кажется аккуратней.
И какие, при этом, дает возможности для редизайна.
Спасибо.

P.S. Я, как Эдвард Нортон в Fight Club думал, "...что вопрос с диванам решён окончательно", а теперь, видимо, надо переделывать весь тулбар ))
Может быть, и вопрос со смещением кнопок удастся решить?
Как-нибудь при инициализации задавать им координаты?
Возможно, это покажется мелочью, но лично мне кажется логичней и эргономичней группировать вплотную друг к другу родственные кнопки типа "Reload" и "Reload without cache", или Скрапбуковские "Capture" и "Capture as..." Как это сделано со стандартными "Go Back"-"Go Forward".
Потому что пока, чтобы достичь визуального порядка, приходится использовать пустой "Space" из стандартной палитры настройки, чтобы раздвинуть и так не близко стоящие кнопки.

Отредактировано razoo (26-07-2009 20:17:04)

Отсутствует

 

№94226-07-2009 21:22:56

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

Re: Custom Buttons

razoo пишет

Код стиля кнопок "без бордюров" сработал.

На отсутствие закрывающей фигурной скобки у
with(this.style) { ... }
не ругается?

Кстати, если написать
this. onmouseover = function (event) { ... }
, можно убрать часть кода с
this. setAttribute ( ... )

razoo пишет

Может быть, и вопрос со смещением кнопок удастся решить?

Примерно так:

Выделить код

Код:

function isVisible(node) {
	if(!node)
		return false;
	var win = node.ownerDocument.defaultView;
	return win.getComputedStyle(node, "").display != "none"
		&& win.getComputedStyle(node, "").visibility != "collapse"
}
// Отступ слева:
if(isVisible(this.previousSibling))
	this.style.marginLeft = "10px";
// Отступ справа:
if(isVisible(this.nextSibling))
	this.style.marginRight = "10px";

Или вообще без проверок:

Выделить код

Код:

this.style.marginLeft = "10px";
this.style.marginRight = "10px";

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

Отсутствует

 

№94327-07-2009 11:53:37

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

Re: Custom Buttons

Infocatcher
ДА! Тотально-то-что-надо.
Если использовать отрицательное значение, например:

Выделить код

Код:

this.style.marginLeft = "-5px";

кнопки можно ставить вплотную. Именно, как хотелось!

Infocatcher пишет

На отсутствие закрывающей фигурной скобки у
with(this.style) { ... }
не ругается?

Нет. Все равно исправить?

Infocatcher пишет

Кстати, если написать
this. onmouseover = function (event) { ... }
, можно убрать часть кода с
this. setAttribute ( ... )

В предложенном вами коде так и было. Это я просто заменил на кусок, которым пользовался раньше :)

Отсутствует

 

№94427-07-2009 16:46:18

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

Re: Custom Buttons

razoo пишет

Нет. Все равно исправить?

Да, лучше исправить.

У меня этот код вообще себя странно ведет. Из «инициализации» не работает (кнопка становится полупрозрачной), но в консоли ошибок ничего нету (что странно). А из «кода» уже ругается:

Выделить код

Код:

Ошибка: missing } in compound statement
Источник: custombutton://buttons/Firefox/code/custombuttons-button11
Строка: 14

Более того, можно заменить код в инициализации на

Выделить код

Код:

try {
new Function(
'with(this.style) {\n\
    MozAppearance = "none";\n\
    border = "none";\n\
this. mouseover = function (event)\n\
{\n\
    this. oldimage = this. image;\n\
    this. image = "file:///W:/ReloadwoCach2.png";\n\
}\n\
this. mouseout = function (event)\n\
{\n\
    this. image = this. oldimage;\n\
}\n\
this. setAttribute ("onmouseover", "this.mouseover()");\n\
this. setAttribute ("onmouseout", "this.mouseout()");'
).call(this);
} catch(e) { alert(e); }

, и будет сообщение:

SyntaxError: missing } in compound statement


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

Отсутствует

 

№94527-07-2009 19:20:48

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

Re: Custom Buttons

А можете сделать кнопку для менеджера сессий навроде той для закладок? =)
При щелчке на кнопку происходит сохранение сессии. Сессии в списке (только собственноручно сохранённые). удаляются также ПКМ =)
Мне только это надо реализвать, чтобы избавиться от главного меню =)


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

Отсутствует

 

№94627-07-2009 21:11:00

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

Re: Custom Buttons

Najlus
А кнопка от Session Manager'а не устроит?
И мало исходных данных. Предполагается, что в наличии только встроенная сохранялка сессий?


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

Отсутствует

 

№94727-07-2009 21:21:12

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

Re: Custom Buttons

Infocatcher пишет

А кнопка от Session Manager'а не устроит?

Сори, переработал :(


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

Отсутствует

 

№94827-07-2009 22:19:00

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

Re: Custom Buttons

Infocatcher

А как насчет реализации деструкторов для кнопок?

Они были в 0.0.3.0-0.0.3.5 на this. destroy = ...
При переделке binding'а в 0.0.3.6 я его как-то потерял, заметил только недавно.
Правда, работал он только по закрытию окна, из деструктора xbl.
Буду иметь в виду твои предложения.

razoo

Infocatcher
ДА! Тотально-то-что-надо.

Кажется, вопросы по визуальному оформлению разрешились ?
Я ещё даже не успел заняться "дополнительными исследованиями".

Al_H
Сделал кнопку для CustomButtons "по мотивам" ТЗ из № 906
Для работы требуется FF 3.5, Stylish 1.0.5, Custom Buttons 0.0.4.3 - проверял на этом.
Для сохранения настроек кнопка создает файл themes.js в корневом каталоге профиля.
Диалоговое окно "Добавить стиль" я реализовывать не стал, так как это может делать Stylish.

Раздел "Код": http://pastebin.mozilla-russia.org/100398
Раздел "Инициализация": http://pastebin.mozilla-russia.org/100399

Вот только слова "аддон" я заметил несколько позже.
Приношу свои извинения, но разработкой ещё одного расширения я заняться не могу.

Отредактировано Anton (27-07-2009 22:30:44)


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

Отсутствует

 

№94927-07-2009 23:13:46

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

Re: Custom Buttons

Anton пишет

Они были в 0.0.3.0-0.0.3.5 на this. destroy = ...
При переделке binding'а в 0.0.3.6 я его как-то потерял, заметил только недавно.
Правда, работал он только по закрытию окна, из деструктора xbl.
Буду иметь в виду твои предложения.

Все же от деструктора при (пере)создании кнопки пользы больше. И настраивать кнопки при этом проще (а рестарты – это не айс).

Так что поставлю вопрос иначе: отлавливает ли код с DOMNodeRemoved все удаления кнопки? А то я не особо вникал в механизм toolbarpalette.

Кстати, я там забыл про проверку (забавно, делал не так давно в своих целях – там не забыл =)) на
event.originalTarget === button
А с ней как раз и проблемы – можно же удалить не саму кнопку, а ее родителя (хотя, вроде бы, такого в нормальных условиях не происходит).
Так что пока вот так (если снова чего-нибуть не упустил):

Выделить код

Код:

var _this = this;
var unloadDestroy = false;
function destroy(e) {
	(e.type == "DOMNodeRemoved" && e.originalTarget !== _this)
		return;
    _this.removeEventListener("DOMNodeRemoved", destroy, true);
    window.removeEventListener("unload", destroy, false);
    if(e.type == "unload" && !unloadDestroy)
        return;
    // Some code
}
this.addEventListener("DOMNodeRemoved", destroy, true);
window.addEventListener("unload", destroy, false);

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

Отсутствует

 

№95027-07-2009 23:30:50

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

Re: Custom Buttons

Infocatcher пишет

А кнопка от Session Manager'а не устроит?

...поставил Session Manager, но быстро удалил.
Плагин замечательный, но я пользуюсь менеджером сессий, встроенным в “Tab Mix Plus” и он меня устраивает.
Всем, кроме кнопки. ))
Во-первых, родная кнопка Tab Mix Plus ущербная. Практически, это просто выпадающее меню. Отдельного действия у кнопки почему-то нет, хотя логичней было бы, чтобы нажатие на кнопу загружало последнюю сохраненную сессию. Причем в выпадающем меню last session у них действительно выделена, будто это действие по умолчанию.
Во-вторых, в связи открывшимися крутыми возможностями по визуализации просто хочется сделать эту кнопку с помощью CB. :)
Итого :) неплохо бы было получить кнопку, которая по нажатию загружает последнюю сессию, сохраненную “Tab Mix Plus”, а рядом стрелка с выпадающим меню, в котором всё то же, что в меню и сейчас.

И новая серия вопросов:
Я честно просмотрел все 38 страниц темы форума, но не нашел, как делать отработчик(?) shift+click или ctrl+click.
Т.е. я делаю кнопку для плагина Screengrab!
Хотел, чтобы при нажатии он делал скриншот всей страницы,
при ctrl+click видимую часть,
при shift+click предлагал выделить нужную часть. Коды, соответственно:

Выделить код

Код:

sg.Grab(new sg.VisibleTarget(), sg.CaptureViewPort, new sg.SaveAction());
Выделить код

Код:

sg.Grab(new sg.FrameTarget(), sg.CaptureViewPort, new sg.SaveAction());
Выделить код

Код:

sg.Grab(new sg.SelectionTarget(), sg.CaptureViewPort, new sg.SaveAction());

По отдельности все работают правильно, но зачем делать 3 кнопки, если можно объединить это в одной.
Ещё :)
Как кнопке задавать условия, при которой кнопка будет неактивной (выглядеть неактивной)?
Например: кноп, которая перематывает к первой страничке на табе

Выделить код

Код:

getWebNavigation().gotoIndex(0);

Как сделать, чтобы, вернувшись к самой первой - кнопка становилась (выглядела) неактивной как и стандартные лисовские стрелки, показывая что дальше «мотать некуда»?
Еще хотел избавиться от плагина Uppity, заменив его кастом-кнопкой с простеньким кодом upOneFolder();
Но хотелось бы чтобы кнопка становилась неактивной «когда выше подняться некуда» и было выпадающее меню с доступными уровнями, подобно тому, которое Anton сделал для плагина “Block Site”.
Кстати, Anton.
Твою кнопку для “Block Site” можно ещё усовершенствовать. Мог бы ты сделать так, чтобы нижней строкой в выпадающем меню можно было вызвать окно настроек самого плагина (там блэк лист)?

P.S. Я подозреваю, что в теме CB это может быть оффтопом, но как принудительно открывать в табах те окна, которые запускаются различными плагинами?
Например,  окно infolisterа, или менеджер закладок (родной лисовский) или (О!) менеджер скрапбука. Может быть, делая кнопу, можно прописать в коде куда именно завернуть окно?

Отсутствует

 

Board footer

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