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

В мире Mozilla происходит много интересных событий. Но вам не нужно постоянно посещать новостные сайты, чтобы быть в курсе всех изменений. Зайдите на ленту новостей Mozilla Россия.

№109-10-2006 17:49:52

Yan
Участник
 
Группа: Extensions
Откуда: Москва
Зарегистрирован: 27-02-2005
Сообщений: 1018

Разработка Сustom Buttons

Эта тема создана для продолжения дискуссии, завязавшейся при обсуждении одноименного расширения.

Dark-Demon

... много хочешь от расширения, которое даже не пре-альфа :dumb: я говорю, что в будущем пользователи будут править только то, что находится внутри <binding> и ничего более...

Я уже раньше говорил, что принципиально против xbl ничего не имею, всё зависит от конкретной реализации. Пока же получается, что хоть сам код кнопок и выглядит аккуратно, но как это будет выглядеть на практике - неизвестно... Так что IMHO тебе стоит всё-таки попробовать выпустить что-нибудь типа пре-альфы, обладающей базовым функционалом (например, редактирование кнопки без перезагрузки браузера, и т.п.).  Тогда наверняка всплывут и основные проблемы, связанные с этим способом.
А пока у меня еще один вопрос возник. Что будет, если пользователь некорректно напишет кнопку на xbl? Не отразится ли это на других кнопках? В общем, опять приходим к вопросу конкретной реализации.
В общем, если удастся разрешить все эти вопросы, то в расширении можно будет совместить оба формата (и нынешний, и xbl). А может и 3 (если делать что-нибудь типа wizard'а, как я хотел). В любом случае, от нынешнего формата отказываться нет смысла, т.к. под него уже написано много работающих кнопок.

Отсутствует

 

№209-10-2006 18:17:56

Dark-Demon
Участник
 
Группа: Members
Зарегистрирован: 20-02-2006
Сообщений: 1278

Re: Разработка Сustom Buttons

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

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

Так что IMHO тебе стоит всё-таки попробовать выпустить что-нибудь типа пре-альфы, обладающей базовым функционалом

охъ... не обещаю, что это будет скоро...

Что будет, если пользователь некорректно напишет кнопку на xbl? Не отразится ли это на других кнопках?

ничего страшного не случится. единственное, что - надо при сохранении проверять на валидность, как например это сделано в stylish.

Отредактировано Dark-Demon (09-10-2006 18:18:30)


!

Отсутствует

 

№309-10-2006 18:42:44

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

Re: Разработка Сustom Buttons

Dark-Demon
Попробую переубедить в последний раз.
Проведём аналогию между объектами JavaScript и xbl-привязками в твоём расширении на примере bb-кнопок.
Для имитации UI будем использовать функцию

Выделить код

Код:

function sumAndPrint (a, b)
{
    print (a. getValue () + b. getValue ());
}

Итак, пусть перед нами стоит простая задача сложения двух чисел: 1+2.
Мы принципиально против литерального представления чисел ("ужасы DOM"), поэтому будем создавать объекты.
Вот твой подход:

Выделить код

Код:

// xbl:
// создаём класс-объект '1'
function numberOne () // '<binding id="cb2-bb-code"...'
{
    this. value = 1; // <opener> '[CODE]' </opener>
}
numberOne. prototype =
{
    getValue: function () // методы
    {
        return this. value;
    }
}
// Теперь нам нужно иметь число '2', создаём класс-объект
function numberTwo () // '<binding id="cb2-bb-quote"...'
{
    this. value = 2; // <opener> '[quote]' </opener>
}
numberTwo. prototype = numberOne. prototype; // применяем "наследование"

// xul:
var one = new numberOne (); // '<toolbaritem id="cb2-bb-code"...'
var two = new numberTwo (); // '<toolbaritem id="cb2-bb-quote"...'
// используем
sumAndPrint (one, two);

Мой подход, тобою с негодованием отвергнутый:

Выделить код

Код:

// xbl:
// создаём общий класс 'number'
function number (value)
{
    this. value = value; // нет аналога, это делает платформа (атрибуты)
}
number. prototype =
{
    getValue: function () // методы
    {
        return this. value; // ... this. getAttribute ("attr") ...
    }
}

// xul:
var one = new number (1); // '<toolbarbutton opener="[CODE]"...'
var two = new number (2); // '<toolbarbutton opener="[quote]"...'
// используем
sumAndPrint (one, two);

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

Отсутствует

 

№410-10-2006 15:03:47

Yan
Участник
 
Группа: Extensions
Откуда: Москва
Зарегистрирован: 27-02-2005
Сообщений: 1018

Re: Разработка Сustom Buttons

Dark-Demon

ты о том, как будут программировать сторонние разработчики?

Ага.

Отсутствует

 

№510-10-2006 15:38:41

Dark-Demon
Участник
 
Группа: Members
Зарегистрирован: 20-02-2006
Сообщений: 1278

Re: Разработка Сustom Buttons

Anton, глупость какая-то... я тоже так умею:
в моём случае, например, можно сделать так:

Выделить код

Код:

class code: allbuttons
{
  string code= 'code';
  function onmouseleft() {...}
}
class quote: public code
{
  string code= 'quote';
  inherit function onmouseleft();
  function onmouseright() {...}
}

и это будет актуально, так как, например, можно написать [uri]http://...[/uri], а можно [uri=http://..]ссылка[/uri]
фишка в том, что каждая кнопка наследует всё необходимое из исходной кнопки и доопределяет, что требуется, а в твоём случае, что не предусмотрел в базовом классе, то хрен реализуешь в конкретной кнопке.

Отредактировано Dark-Demon (10-10-2006 15:41:50)


!

Отсутствует

 

№610-10-2006 20:46:37

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

Re: Разработка Сustom Buttons

Dark-Demon пишет:

Anton, глупость какая-то... я тоже так умею:
в моём случае, например, можно сделать так:

и это будет актуально, так как, например, можно написать [uri]http://...[/uri], а можно [uri=http://..]ссылка[/uri]

Да, можно. Но как:

Выделить код

Код:

class uritag: public quote
{
  string code = 'uri';
}

Т. е., каждому отдельному объекту - отдельный класс. Вернёмся к примеру с суммированием. Отметим для начала, что проще было бы написать

Выделить код

Код:

print (1 + 2);

Это тот случай, когда в кнопке пишут что-нибудь уж совсем простое, да хотя бы банальное getBrowser().reloadAllTabs(). В твоём случае обязательно придётся писать новый класс. Несмотря на то, что платформа предоставляет общий класс для подобных случаев, достаточно лишь создать объект на его основе.
Теперь второе.

...
фишка в том, что каждая кнопка наследует всё необходимое из исходной кнопки и доопределяет, что требуется,...

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

... а в твоём случае, что не предусмотрел в базовом классе, то хрен реализуешь в конкретной кнопке.

В моём случае добавится второй класс. Сто чисел - два класса. Что до бибикодов - мою реализацию ты видел, там даже второй класс не понадобился, модель изначально предусматривала наличие случаев [uri]...[/uri] / [uri=...]...[/uri].

Теперь более близкая к реальности задача. Не будем суммировать числа, будем делать бб-кнопки динамически. На каждом форуме свой набор кодов, где-то в гробу видели '[ code]', где-то разрешены html. Допустим, есть панелька, на неё нужно помещать нужные кнопки в зависимости от того, на каком мы форуме. Не мудрствуя лукаво напишем набор оверлеев, каждый из которых описывает набор кнопок для какого-то конкретного форума. И твоём случае придётся в xbl прописать все возможные теги. И, поскольку таблицы стилей тебя тоже чем-то не устраивают, тебе придётся ещё писать в xul километры 'style="-moz-binding:url..."'.

Что в моём случае ? Одна привязка в xbl, одна строчка в css типа '.bbcodebutton { -moz-binding:url... }' и те же самые оверлеи, только без длинных style="-moz-binding:url..." а все с одинаковым значением атрибута class: class="bbcodebutton".

А то и вовсе без атрибута 'class': в css строчка 'bbbutton { -moz-binding:url ... }, а в xul - '<bbbutton opener="..." closer="..."/>.
Если ты захочешь сделать так же, тебе придётся вспомнить о css, писать туда километры -moz-binding'ов, для каждого возможного тега. В оверлеях будет что нибудь вроде

Выделить код

Код:

<bbtagcode/>
<bbtagquote/>
<bburiquote/>

Как будто бы всё замечательно, но только на первый взгляд. Потом выяснится, что какой-либо форум не поддерживает альтернативный текст в [uri], т. е., только [uri]...[/uri]. Придётся писать новую привязку в xbl, новый тег <bbtagnoalternatetexturi> какой-нибудь (Кстати, какую привязку он будет, как ты выражаешься, "наследовать" ? Базовую для '[ code]' ? Вроде нелогично. Или переписывать последовательность "наследования": code->noalternatetexturi->uri ?) и пополнять css.

А между тем, всё вышеописанное можно сделать и вовсе без xbl. Для bb-кнопок сойдёт стандартный класс toolbarbutton.

Отредактировано Anton (10-10-2006 22:22:25)


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

Отсутствует

 

№711-10-2006 14:03:35

Dark-Demon
Участник
 
Группа: Members
Зарегистрирован: 20-02-2006
Сообщений: 1278

Re: Разработка Сustom Buttons

Т. е., каждому отдельному объекту - отдельный класс.

поправочка - каждому объекту отдельный объект. просто объекты умеют наследовать свойства у других объектов.
разделение на классы и объекты нужно только в компилируемых языках с жёсткой типизацией. для меня остаётся загадкой, на кой в интерпретируемые языки суют классы, если можно ограничиться только объектами.
биндинги - это те самые объекты, которые умеют наследовать. а в xul хранится лишь массив указателей на них.

Вернёмся к примеру с суммированием.

не вернёмся. кнопки - это полностью автономные элементы. ни о каком суммировании и речи быть не может.

модель изначально предусматривала наличие случаев [uri]...[/uri] / [uri=...]...[/uri]

это в каком это месте?

И твоём случае придётся в xbl прописать все возможные теги.

да, имено так, неактуальные кнопки будут просто прятаться.

тебе придётся ещё писать в xul километры 'style="-moz-binding:url..."'.

Выделить код

Код:

style="-moz-binding:url(cb2.xbl#bb-code-12)"

не назвал бы это "километрами". кстати, это тебя почему-то не смущает:

Выделить код

Код:

class="toolbarbutton-1 chromeclass-toolbar-additional custombutton-bbbutton"

Что в моём случае ? Одна привязка в xbl, одна строчка в css типа '.bbcodebutton { -moz-binding:url... }' и те же самые оверлеи, только без длинных style="-moz-binding:url..." а все с одинаковым значением атрибута class: class="bbcodebutton".

угу, и с фиксированным числом кнопок. а если хочется динамического числа, то либо опять же прописываем в xul все кнопки и прячем лишние, либо в xul не пишем ничего и генерим их через dom, что впрочем не лишено смысла.

А между тем, всё вышеописанное можно сделать и вовсе без xbl.

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


!

Отсутствует

 

№811-10-2006 15:11:49

Dark-Demon
Участник
 
Группа: Members
Зарегистрирован: 20-02-2006
Сообщений: 1278

Re: Разработка Сustom Buttons

и вообще, свои кнопочки для каждого сайта - это уже нужно писать полноценное расширение. с окном настроек и прочими прелестями. применять для этого custombuttons - это как из зубочисток пытаться построить дом...


!

Отсутствует

 

№911-10-2006 16:04:18

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

Re: Разработка Сustom Buttons

Я всё же надеялся вывести спор в конструктивное русло. Но

Dark-Demon пишет:

...для меня остаётся загадкой, на кой в интерпретируемые языки суют классы...

это в каком это месте?

...насчёт тегов я не понял...

и вообще, свои кнопочки для каждого сайта - это уже нужно писать полноценное расширение. с окном настроек и прочими прелестями. применять для этого custombuttons - это как из зубочисток пытаться построить дом...

"не понимаю, не разобрался в чужом коде, не знаю, не понял о чём речь - ну то есть вообще" и, судя по всему, можно добавить "и знать не хочу".

Действительно, бесполезно. А и ладно.

p.s. кстати

...угу, и с фиксированным числом кнопок. а если хочется динамического числа...

спасибо, повеселил


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

Отсутствует

 

№1012-10-2006 11:48:47

Dark-Demon
Участник
 
Группа: Members
Зарегистрирован: 20-02-2006
Сообщений: 1278

Re: Разработка Сustom Buttons

Мда.. это диагноз...


!

Отсутствует

 

№1112-10-2006 12:12:24

Yan
Участник
 
Группа: Extensions
Откуда: Москва
Зарегистрирован: 27-02-2005
Сообщений: 1018

Re: Разработка Сustom Buttons

Anton
Твоя критика относительно того, что предлагает Dark-Demon, понятна. Но я никак не могу понять, что конкретно ты хочешь предложить взамен. То есть отдельные-то куски понятны, но какая из них должна получиться итоговая картина - неизвестно. Какова должна быть внутренняя структура расширения в твоём понимании, и как будет выглядеть написание кнопки для конечного пользователя?

Отредактировано Yan (12-10-2006 12:19:10)

Отсутствует

 

№1212-10-2006 15:47:49

Dark-Demon
Участник
 
Группа: Members
Зарегистрирован: 20-02-2006
Сообщений: 1278

Re: Разработка Сustom Buttons

Антон предлагает что-то вроде этого: http://forum.mozilla-russia.org/uploaded/ta8v51c4.design_mode.zip

то есть делать объекты на XUL и к ним создавать классы на XBL.
а я предлагаю делать объектоклассы на XBL. а их массив в XUL будет создаваться автоматом.


!

Отсутствует

 

№1312-10-2006 17:36:48

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

Re: Разработка Сustom Buttons

Yan пишет:

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

1. Не надо отказываться от нынешнего формата кнопки. Нужны обработчики экзотических событий или кнопки-меню ? Сделать один-два поддерживаемых расширением xbl, расширяющих функционал всех простых кнопок, создаваемых расширением.
2. Для простых кнопок надо бы предусмотреть возможность указания разработчиком кнопки атрибутов кнопки, доступных для изменения через интерфейс расширения. Допустим, пишет разработчик кнопку типа launchApplication, указывает, что атрибут "path" у кнопки является изменяемым - пользователь через интерфейс расширения (не редактор кода) указать нужный путь.
3. Кнопки и прочие элементы управления хранить в xul - их можно перезаписывать во время работы браузера и динамически подгружать (loadOverlay/DOM).
4. Сложные элементы управления делать непосредственно в xul. Возможно, удобней будет соорудить аналог тега <toolbaritem> - контейнер с поддержкой настраиваемых атрибутов и обработчиков событий.
5. Нужна поддержка скриптов, не привязанных к каким-то кнопкам. Т. е., "API" для сокращения размеров распространяемого кода.
6. Пакеты для распространения наборов кнопок и/или скриптов.
7. xbl использовать только там, где без него действительно не обойтись, или где это значительно сократит размеры кода - например, пакеты однотипных кнопок.

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


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

Отсутствует

 

№1423-10-2006 13:58:33

Dark-Demon
Участник
 
Группа: Members
Зарегистрирован: 20-02-2006
Сообщений: 1278

Re: Разработка Сustom Buttons

Anton, тебя, наверно, xbl в детстве укусил :)

5 - каким боком это относится к сабжу? давай не будем создавать очередной кухонный комбайн...

Отредактировано Dark-Demon (23-10-2006 14:00:41)


!

Отсутствует

 

№1523-10-2006 14:54:27

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

Re: Разработка Сustom Buttons

Dark-Demon пишет:

Anton

А ? Что такое ? В других разделах не флеймится ?

давай не будем создавать очередной кухонный комбайн...

А-а, ладно, не создавай, разрешаю.


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

Отсутствует

 

№1625-10-2006 12:13:45

Quicksilver tears
Забанен
 
Группа: Extensions
Зарегистрирован: 13-06-2005
Сообщений: 4459

Re: Разработка Сustom Buttons

foxuser
Для обсуждения этого расширения есть специальная тема. Эта тема только для обсуждения разработки.

Отсутствует

 

№1727-10-2006 12:57:06

Dark-Demon
Участник
 
Группа: Members
Зарегистрирован: 20-02-2006
Сообщений: 1278

Re: Разработка Сustom Buttons

Ну что ж, встречайте tp4 :)
http://dark-demon.nm.ru/etc/files/customitems.tp4.rar
реализовал добавление, редактирование и переименовывание кнопок. рантайм изменения ещё не реализовал.
нажмите ctrl+правую кнопку мыши на каком-нибудь кастомайтеме и в меню будут два пункта: new и edit

Ян, на мой взгляд, так редактировать кнопки много удобнее.

ps. я сменил название, так что предыдущую версию надо удалить.

Отредактировано Dark-Demon (27-10-2006 13:02:54)


!

Отсутствует

 

№1806-11-2006 02:21:37

Dark-Demon
Участник
 
Группа: Members
Зарегистрирован: 20-02-2006
Сообщений: 1278

Re: Разработка Сustom Buttons

http://dark-demon.nm.ru/etc/files/customitems.v.3.rar

новая версия customitems - 0.3
в интерфейсе редактирования добавилась ссылка на редактирование родительской кнопки.

ещё добавил две весьма полезные кнопки (Л,С,П - соответствено, левая, средняя и правая кнопки мыши).

первая:
Л - создаёт новую пустую вкладку
С - восстанавливает последнюю закрытую
П - выдаёт контекстное меню выбора какую закрытую вкладку восстанавливать.

вторая:
Л - создаёт новое окно
С - восстанавливает последнюю сохранённую сессию.
П - выдаёт контектное меню выбора между последними четырьмя сохранёнными сессиями.

ещё у меня вопросик возник: я открываю xul-файлы в отдельных табах. как из этих xul-ов получить доступ к основному окну браузера?


!

Отсутствует

 

№1906-11-2006 13:03:05

Dark-Demon
Участник
 
Группа: Members
Зарегистрирован: 20-02-2006
Сообщений: 1278

Re: Разработка Сustom Buttons

благодаря Антону исправил багу с sessionstore, теперь она работает и в многооконном режиме.
если есть желающие сделать аналогичные кастомкнопки, выкладываю исходники кастомайтемов sessionstore и tabber...

ci-sessiostore:

Выделить код

Код:

<content context="_child">
    <xul:toolbarbutton label="Session Restore" tooltiptext="New Window | Restore Browser State" image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK8AAACvABQqw0mAAAACB0RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgTVi7kSokAAABb0lEQVR4nKWSv0tCURTHP9ceJaYU5lBBDZlUkw1FLQ2GELS2NoXiEP2YCgrCIipCIYkCERrcmqI/oBocais3sd7UUFARFS9JkdtgPqR8WvaFL/ecc7/nnO9whJSS/0AMLe3PNnjHN//aqCj1HycjbXbhPrnTko+t8KAaii88TobPVP2Vx90In8TtuEcQT2scJGvzP+VGASunG11VtZ7DuKUYe8f63pebBxm9saLwlqXdYfvdxkiEMNAzuUV7kw0usyjUNeJyduiaa1Wlx+WqOGdvYLEQnD6i8FJwFgjuEQ1O6yL/yi6xV9VSbgDz8xaAwgGsPmv5fF5nKp3WpJQFzs1JCYYMgTSRedcdlMK/sgtAuITlcvAnjB2U8stNCGSxhj+hmfg65XIOijSElCiYBADR4DRCCP0vtjbzQx/+XjAJBL5zLbXQYrylAnq3nxBM7NxS12knm4NMBswNkMtVaRVgkXC0HhBAP2CuyQJcfQKFzMLCQlddPgAAAABJRU5ErkJggg=="/>
    <xul:menupopup anonid="contextmenu" onclick="event.stopPropagation()">
        <xul:menuitem label="last" oncommand="parentNode.parentNode.restore(1, this.label)"/>
        <xul:menuitem label="more last" oncommand="parentNode.parentNode.restore(2, this.label)"/>
        <xul:menuitem label="very last" oncommand="parentNode.parentNode.restore(3, this.label)"/>
        <xul:menuitem label="lastest" oncommand="parentNode.parentNode.restore(4, this.label)"/>
    </xul:menupopup>
</content>

<implementation>
    <constructor>
        <![CDATA[
            if (typeof (hiddenwindow.customitems_last_session_stored) == 'undefined')
            {
                if (!this.storedir.exists()) this.storedir.create(0x01, 0755);
                if (this.curstate.exists()) this.curstate.copyTo(this.storedir,"sessionstore.0");
                for (var i=4; i>0; i--)
                {
                    if (this.states[i].exists()) this.states[i].remove(false);
                    if (this.states[i-1].exists()) this.states[i-1].copyTo(this.storedir,"sessionstore."+i);
                }
                hiddenwindow.customitems_last_session_stored = true;
            };
        ]]>
    </constructor>
    <destructor>
        <![CDATA[
            if (this.curstate.exists()) 
            {
                if (states[0].exists()) states[0].remove(false);
                this.curstate.copyTo(this.storedir,"sessionstore.0"); 
            };
        ]]>
    </destructor>
    <method name="restore">
        <parameter name="num"/>
        <parameter name="name"/>
        <body>
            <![CDATA[
                if (confirm('restore '+name+' browser state?'))
                {
                    this.ifstream.init (this.states[num], 0x01, 0, 0);
                    var lifstream= this.ifstream.QueryInterface(Components.interfaces.nsILineInputStream);
                    var line = {};
                    lifstream.readLine(line);
                    this.seserv.setBrowserState(line.value);
                    this.ifstream.close();
                };
            ]]>
        </body>
    </method>
    <field name="appshell"> Components.classes ["@mozilla.org/appshell/appShellService;1"]. getService(Components.interfaces.nsIAppShellService) </field>
    <field name="seserv"> Components.classes['@mozilla.org/browser/sessionstore;1'].getService(Components.interfaces.nsISessionStore) </field>
    <field name="profdir"> Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("ProfD", Components.interfaces.nsIFile)     </field>
    <field name="ifstream"> Components.classes['@mozilla.org/network/file-input-stream;1'].getService(Components.interfaces.nsIFileInputStream) </field>
    <field name="hiddenwindow"> appshell.hiddenDOMWindow </field>
    <field name="storedir">
        <![CDATA[
            var storedir= profdir.clone();
            storedir.append("sessionstore");
            storedir
        ]]>
    </field>
    <field name="curstate">
        <![CDATA[
            var curstate= this.profdir.clone();
            curstate.append("sessionstore.js");
            curstate
        ]]>
    </field>
    <field name="states">
        <![CDATA[
            var states= new Array(); 
            for (var i=4; i>=0; i--)
            {
                states[i]= this.storedir.clone();
                states[i].append("sessionstore."+i);
            };
            states
        ]]>
    </field>
</implementation>

<handlers>
    <handler event="click" button="0" modifiers="any"> OpenBrowserWindow(); </handler>
    <handler event="click" button="1" modifiers="any"> this.restore(1, 'last'); </handler>
</handlers>

ci-tabber:

Выделить код

Код:

<content context="_child">
    <xul:toolbarbutton label="Tabber" tooltiptext="New Tab | Undo Close Tab" image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK8AAACvABQqw0mAAAACB0RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgTVi7kSokAAABKElEQVR4nKWSsUrDcBDGfykRpIMiWFCpbiL4BJZSsKNDC+ripg51cezcgs1qQXyATk4KllZfQEqp4OALuAhObakuyeLwuaQhNkkN9YODO+6+7+7+9zck8R+YY+f2rmnPm+a0Wg/fYvvwoPAOgCRa921bUmxz65FEwq+81eqz9tgP7fpxcsrncSl6BYCVBYOjzVSQXa0m0xvr48jxpxKNxs0bIICnfIqLdMTilkXdsryw3Xz4AjCXlxZXM7ksg+Eoggn+mQbDEZlcll6nO+et0Ot0A6Ti60syVOz6KglQBNgvwN55Lfy1KxUJIu0SJImph6/7/PJE7GG3VPn79u40bldbku3yfv+DWRBbIHT82AK1mlOWnLLkTKZMgPxZNe4gARjAzqxkSc8/PUraALhZmswAAAAASUVORK5CYII="/>
    <xul:menupopup anonid="contextmenu" onclick="event.stopPropagation()" onpopupshowing="parentNode.updatemenu(this)"/>
</content>

<implementation>
    <field name="seserv"> Components.classes['@mozilla.org/browser/sessionstore;1'].getService(Components.interfaces.nsISessionStore) </field>
    <method name="updatemenu">
        <parameter name="popup"/>
        <body>
            <![CDATA[
                var c;    while (c= popup.firstChild) popup.removeChild(c);
                var tabs = eval(this.seserv.getClosedTabData(window));
                for (var i = 0; i < tabs.length; i++) 
                {
                    var mi = popup.appendChild(document.createElement("menuitem"));
                    mi.setAttribute("label", i+": "+tabs[i].title);
                    mi.setAttribute("oncommand", "undoCloseTab("+i+")");
                };
            ]]>
        </body>
    </method>
</implementation>

<handlers>
    <handler event="click" button="0" modifiers="any"> BrowserOpenTab(); </handler>
    <handler event="click" button="1" modifiers="any"> undoCloseTab(); </handler>
</handlers>

Отредактировано Dark-Demon (09-11-2006 13:03:43)


!

Отсутствует

 

№2009-11-2006 13:04:32

Dark-Demon
Участник
 
Группа: Members
Зарегистрирован: 20-02-2006
Сообщений: 1278

Re: Разработка Сustom Buttons

в sessionstore была ошибка, из-за чего сессии не сохранялись. подправил предыдущее сообщение.


!

Отсутствует

 

№2127-11-2006 14:53:29

Dark-Demon
Участник
 
Группа: Members
Зарегистрирован: 20-02-2006
Сообщений: 1278

Re: Разработка Сustom Buttons

http://dark-demon.nm.ru/etc/files/customitems.v.4.rar

добавил рантайм изменение айтемов, простенький менеджер, удаление айтемов.

Yan, не подскажешь, как динамически добавлять кнопки в палитру? а то я в твоём расширении не понял как это делается...


!

Отсутствует

 

№2227-11-2006 15:02:26

Yan
Участник
 
Группа: Extensions
Откуда: Москва
Зарегистрирован: 27-02-2005
Сообщений: 1018

Re: Разработка Сustom Buttons

Dark-Demon
А что конкретно не понятно?
Это делает функция addToPalette(button):

Выделить код

Код:

...
    addToPalette:function(button){
        this.gToolbox.palette.appendChild(button);
    },
...

Где:
this.gToolbox=document.getElementById("navigator-toolbox");//Firefox
button - созданный через DOM элемент <toolbarbutton>.

Отсутствует

 

№2327-11-2006 15:11:10

Dark-Demon
Участник
 
Группа: Members
Зарегистрирован: 20-02-2006
Сообщений: 1278

Re: Разработка Сustom Buttons

ясненько, попробуем...


!

Отсутствует

 

№2405-12-2006 15:09:59

Dark-Demon
Участник
 
Группа: Members
Зарегистрирован: 20-02-2006
Сообщений: 1278

Re: Разработка Сustom Buttons

Блин, сделал, все работало, запаковал в расширение, установил и опять не пошет %-\ пока выложил с этим багом ибо весь остальной функционал готов к использованию: http://dark-demon.nm.ru/etc/files/customitems.v.5.xpi
кнопки не прилагаются, установить их можно отсюда:
http://dark-demon.nm.ru/soft/customitems/
ещё попробовал реализовать обратную совместимость с custombuttons. вставляют в начало инициализационного кода определение функции bind(), но когда она используется вылетает ошибка мол нет такой функции... в общем мрак...

Отредактировано Dark-Demon (05-12-2006 15:14:11)


!

Отсутствует

 

№2505-12-2006 15:17:48

Yan
Участник
 
Группа: Extensions
Откуда: Москва
Зарегистрирован: 27-02-2005
Сообщений: 1018

Re: Разработка Сustom Buttons

Dark-Demon

ещё попробовал реализовать обратную совместимость с custombuttons. вставляют в начало инициализационного кода определение функции bind(), но когда она используется вылетает ошибка мол нет такой функции...

Это баг во второй версии Firefox: https://bugzilla.mozilla.org/show_bug.cgi?id=355161
Исправят в 2.0.1

Отсутствует

 

Board footer

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