>Форум Mozilla Россия http://forum.mozilla-russia.org/index.php >Разработка http://forum.mozilla-russia.org/viewforum.php?id=18 >Разработка Сustom Buttons http://forum.mozilla-russia.org/viewtopic.php?id=13002 |
Yan > 09-10-2006 17:49:52 |
Эта тема создана для продолжения дискуссии, завязавшейся при обсуждении одноименного расширения. Dark-Demon
Я уже раньше говорил, что принципиально против xbl ничего не имею, всё зависит от конкретной реализации. Пока же получается, что хоть сам код кнопок и выглядит аккуратно, но как это будет выглядеть на практике - неизвестно... Так что IMHO тебе стоит всё-таки попробовать выпустить что-нибудь типа пре-альфы, обладающей базовым функционалом (например, редактирование кнопки без перезагрузки браузера, и т.п.). Тогда наверняка всплывут и основные проблемы, связанные с этим способом. |
Dark-Demon > 09-10-2006 18:17:56 |
дык я уже сделал несколько полезных кнопок. или ты о том, как будут программировать сторонние разработчики?
охъ... не обещаю, что это будет скоро...
ничего страшного не случится. единственное, что - надо при сохранении проверять на валидность, как например это сделано в stylish. |
Anton > 09-10-2006 18:42:44 |
Dark-Demon Итак, пусть перед нами стоит простая задача сложения двух чисел: 1+2. Выделить код Код:// 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); |
Yan > 10-10-2006 15:03:47 |
Dark-Demon
Ага. |
Dark-Demon > 10-10-2006 15:38:41 |
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] |
Anton > 10-10-2006 20:46:37 |
Dark-Demon пишет
Да, можно. Но как: Т. е., каждому отдельному объекту - отдельный класс. Вернёмся к примеру с суммированием. Отметим для начала, что проще было бы написать Это тот случай, когда в кнопке пишут что-нибудь уж совсем простое, да хотя бы банальное getBrowser().reloadAllTabs(). В твоём случае обязательно придётся писать новый класс. Несмотря на то, что платформа предоставляет общий класс для подобных случаев, достаточно лишь создать объект на его основе.
(читаем: каждый объект доопределяет что ему надо)
В моём случае добавится второй класс. Сто чисел - два класса. Что до бибикодов - мою реализацию ты видел, там даже второй класс не понадобился, модель изначально предусматривала наличие случаев [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'ов, для каждого возможного тега. В оверлеях будет что нибудь вроде Как будто бы всё замечательно, но только на первый взгляд. Потом выяснится, что какой-либо форум не поддерживает альтернативный текст в [uri], т. е., только [uri]...[/uri]. Придётся писать новую привязку в xbl, новый тег <bbtagnoalternatetexturi> какой-нибудь (Кстати, какую привязку он будет, как ты выражаешься, "наследовать" ? Базовую для '[ code]' ? Вроде нелогично. Или переписывать последовательность "наследования": code->noalternatetexturi->uri ?) и пополнять css. А между тем, всё вышеописанное можно сделать и вовсе без xbl. Для bb-кнопок сойдёт стандартный класс toolbarbutton. |
Dark-Demon > 11-10-2006 14:03:35 |
поправочка - каждому объекту отдельный объект. просто объекты умеют наследовать свойства у других объектов.
не вернёмся. кнопки - это полностью автономные элементы. ни о каком суммировании и речи быть не может.
это в каком это месте?
да, имено так, неактуальные кнопки будут просто прятаться.
не назвал бы это "километрами". кстати, это тебя почему-то не смущает:
угу, и с фиксированным числом кнопок. а если хочется динамического числа, то либо опять же прописываем в xul все кнопки и прячем лишние, либо в xul не пишем ничего и генерим их через dom, что впрочем не лишено смысла.
угу, всё что душе угодно, можно сделать через DOM. аминь. насчёт тегов я не понял. мозилла тебя пошлёт в пешее эротическое с самопальными тегами... |
Dark-Demon > 11-10-2006 15:11:49 |
и вообще, свои кнопочки для каждого сайта - это уже нужно писать полноценное расширение. с окном настроек и прочими прелестями. применять для этого custombuttons - это как из зубочисток пытаться построить дом... |
Anton > 11-10-2006 16:04:18 |
Я всё же надеялся вывести спор в конструктивное русло. Но Dark-Demon пишет
"не понимаю, не разобрался в чужом коде, не знаю, не понял о чём речь - ну то есть вообще" и, судя по всему, можно добавить "и знать не хочу". Действительно, бесполезно. А и ладно. p.s. кстати
спасибо, повеселил |
Dark-Demon > 12-10-2006 11:48:47 |
Мда.. это диагноз... |
Yan > 12-10-2006 12:12:24 |
Anton |
Dark-Demon > 12-10-2006 15:47:49 |
Антон предлагает что-то вроде этого: http://forum.mozilla-russia.org/uploaded/ta8v51c4.design_mode.zip то есть делать объекты на XUL и к ним создавать классы на XBL. |
Anton > 12-10-2006 17:36:48 |
Yan пишет
1. Не надо отказываться от нынешнего формата кнопки. Нужны обработчики экзотических событий или кнопки-меню ? Сделать один-два поддерживаемых расширением xbl, расширяющих функционал всех простых кнопок, создаваемых расширением. Примерно так. |
Dark-Demon > 23-10-2006 13:58:33 |
Anton, тебя, наверно, xbl в детстве укусил 5 - каким боком это относится к сабжу? давай не будем создавать очередной кухонный комбайн... |
Anton > 23-10-2006 14:54:27 |
Dark-Demon пишет
А ? Что такое ? В других разделах не флеймится ?
А-а, ладно, не создавай, разрешаю. |
Quicksilver tears > 25-10-2006 12:13:45 |
foxuser |
Dark-Demon > 27-10-2006 12:57:06 |
Ну что ж, встречайте tp4 Ян, на мой взгляд, так редактировать кнопки много удобнее. ps. я сменил название, так что предыдущую версию надо удалить. |
Dark-Demon > 06-11-2006 02:21:37 |
http://dark-demon.nm.ru/etc/files/customitems.v.3.rar новая версия customitems - 0.3 ещё добавил две весьма полезные кнопки (Л,С,П - соответствено, левая, средняя и правая кнопки мыши). первая: вторая: ещё у меня вопросик возник: я открываю xul-файлы в отдельных табах. как из этих xul-ов получить доступ к основному окну браузера? |
Dark-Demon > 06-11-2006 13:03:05 |
благодаря Антону исправил багу с sessionstore, теперь она работает и в многооконном режиме. 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:04:32 |
в sessionstore была ошибка, из-за чего сессии не сохранялись. подправил предыдущее сообщение. |
Dark-Demon > 27-11-2006 14:53:29 |
http://dark-demon.nm.ru/etc/files/customitems.v.4.rar добавил рантайм изменение айтемов, простенький менеджер, удаление айтемов. Yan, не подскажешь, как динамически добавлять кнопки в палитру? а то я в твоём расширении не понял как это делается... |
Yan > 27-11-2006 15:02:26 |
Dark-Demon Выделить код Код:... addToPalette:function(button){ this.gToolbox.palette.appendChild(button); }, ... Где: |
Dark-Demon > 27-11-2006 15:11:10 |
ясненько, попробуем... |
Dark-Demon > 05-12-2006 15:09:59 |
Блин, сделал, все работало, запаковал в расширение, установил и опять не пошет %-\ пока выложил с этим багом ибо весь остальной функционал готов к использованию: http://dark-demon.nm.ru/etc/files/customitems.v.5.xpi |
Yan > 05-12-2006 15:17:48 |
Dark-Demon
Это баг во второй версии Firefox: https://bugzilla.mozilla.org/show_bug.cgi?id=355161 |
Dark-Demon > 05-12-2006 15:57:16 |
Yan, дык если эти кнопки установить твоим расширением, то они работают нормально.... |
Yan > 05-12-2006 16:16:37 |
В версии 0.0.1.3 я сделал, чтобы при нажатии на кнопку проверялось, есть ли метод bind у Function, и если нет -- то он заново инициализируется. |
Dark-Demon > 06-12-2006 11:50:42 |
Yan, вотъ! я тоже так делаю. я просто добавляю твой код в начало инициализации. например: Выделить код Код:<content label="Image show-hide" image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAA3NCSVQICAjb4U/gAAAAD1BMVEUfact50/fF+v/M//////8mt18DAAAABXRSTlP/////APu2DlMAAAAJcEhZcwAACvAAAArwAUKsNJgAAAAgdEVYdFNvZnR3YXJlAE1hY3JvbWVkaWEgRmlyZXdvcmtzIE1Yu5EqJAAAADhJREFUeJxjcHFgAAIXFwYXB2NjYwYWEMNQUJCZAcYwYIEwGBigDEFhDIYQ+QygpUZKIAbIGQwsANX+EGaBLn8yAAAAAElFTkSuQmCC"> <xul:toolbarbutton xbl:inherits="label,image" /> </content> <implementation> <constructor> <![CDATA[ if ((typeof Function.prototype.bind)=="undefined") { Function.prototype.bind= function(object) { var method = this; return function() { return method.apply(object, arguments); }; }; }; this.pref='permissions.default.image'; this.setState=function(){ switch(this.PS.getIntPref(this.pref)) { case 1: this.image= 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAACp0lEQVR42mL4//8/g3zm6f8AAcQAYvz4uuc/QACBeSAOQAAx/P75/X/ukY//AQIILHXhz///lZe//wfJAgQQWOBui9D/P78t/6ftffcfIIAYYKbA9AIEEIjDWnPtx3+YIEAAMXz7/P7/75+v/mcADQQJAAQQ0HTt/y9nqv73W/caLAAQQDAzWC8CbWq89et//fWf/5HNBAgguIJzIKdc+v6/7Py3/8Wnv/wvPPkZrAgggMAKfv+c8P/f+8r//x+mAZ03/X/g5nf/sw68BysACCCIH78p///zSeb/n4ci/39d4P+/4+f//0d//QcrAAggFH8gY5A4CAMEEFxB0+1f/xtu/vxfc+X7f5CDYYoAAgiuoP7Gz//VV378r7j4HdkkVoAAgisA6Sy/8O1/ydmvYB+c+g02hRUggBgaw6T+g4Iegq//B/Fzj376fwLiSFaAAAIr+HI17f//l4X//9+JAyvIPPjh/3GoAoAAAit4MEns/71Gof+f1hmCFaQCownqTVaAAAIr+PNb4f+fFxL//9wUACsAScIUAAQQA8y/IA7IsSAvgvAFKD4PxdjCCIQBAgjDgAvQSK0DRmrtNWDQXAUFzTewxjNAn5/8/R/FIIAAwjAAZFsdMEFVAcMUFPkgzaAEUAoKvlOfkYMQ7AWAAAJrBvmLEC4Aasw/DsTHPiG7ghUggOAG/PkFTCG/p/3//6P///+PLf//vwamrsc5///+WQc2IHLX+//Zhz/+zz4EjwKwAQABBDfg90/d/w+mSvx/DEztPy+G//9/K/r//6vBwBhoBhvgv/HN//T97/9n7Hv//xiSAQABhDDgl8b/B33C/++3C/6/38T//34d7//7Vdz//0Kjzm/dq/9pe979T939Fp6UQQYABBDRYSAZdghrkgcIMAD5xMj+kGsEXgAAAABJRU5ErkJggg=='; this.tooltipText= 'load all images'; break; case 2: this.image= 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAA3NCSVQICAjb4U/gAAAAD1BMVEUfact50/fF+v/M//////8mt18DAAAABXRSTlP/////APu2DlMAAAAJcEhZcwAACvAAAArwAUKsNJgAAAAgdEVYdFNvZnR3YXJlAE1hY3JvbWVkaWEgRmlyZXdvcmtzIE1Yu5EqJAAAADhJREFUeJxjcHFgAAIXFwYXB2NjYwYWEMNQUJCZAcYwYIEwGBigDEFhDIYQ+QygpUZKIAbIGQwsANX+EGaBLn8yAAAAAElFTkSuQmCC'; this.tooltipText= 'don\'t load any images'; break; case 3: this.image= 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAACXBIWXMAAAsSAAALEgHS3X78AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAACdklEQVR42mL4//8/g3zm6f8AAcQAYvz69es/QACBeSAOQAAx/Pnz5//Z20/+AwQQWOrHv///n7x89R8kCxBAYIEuXdb/f//+/X/w8oP/AAHEADMFphcggEAc1pdv3vyHCQIEEMPPnz//gwy8dPcpWAAggMCmnzp16v+Rqw/BAgABBDOD9RfQpncf3v1/9RahHSQHEEBwBd+BCh4DnXLv6Yv/Nx89/3/l/jOwIoAAAisAGXv9+vX/MOedvvn4//Frj8AKAAII7keQBAj//v37//M///8/+/0frAAggFD8gYxB4iAMEEBwBR8+vvv/5v1bYJC8/v/733+4IoAAgit4/e7t/+evX/9/9OIVskmsAAEEV/D01ev/D56//H/78Yv/1x48+//uD9gUVoAAYlizZg04pGAYxD8PjIbXUAUAAQRWMMmA9f+VK1f+dwK9CeKfuP7o/0uoAoAAAivo02f9f+7cuf9tOhAFh4DR9BziTVaAAAIrgIUBCIP4IEloOLACBBADzL8gDsixIC+C4uUnFP+AYmxhBMIAAYRhwE9wpL79/wYYLKCIfQEMmofPIUHz6e///2///EcxCCCAMAwA2fYCmKCeATWC0uFDYNDdf/by/50nL/5fBQbf5ftP/7//CzeEFSCAwJpB/iKErwJTz6V7T/9fBCZMJFewAgQQ3ABQAE0BBjcoyCcAQxUUsj16rP///fsHNuAcMG7OAFPZqRuP/79CMgAggOAGgCIRpBEUX6BkCYqWDh1WeMiD4u4oMBeAcsILJAMAAgjFgF6gjSDNII2gOG3RRhhw+MrD/wcvPfi//+J9eFIGGQAQQESHAa4kDxBgAMjdAQviliYiAAAAAElFTkSuQmCC'; this.tooltipText= 'load images only from this domain'; break; } } this.PS= Components.classes['@mozilla.org/preferences-service;1'] .getService(Components.interfaces.nsIPrefBranch); this.ob={}; this.ob.observe=this.setState.bind(this); this.PS.addObserver(this.pref,this.ob,false); this.setState(); ]]> </constructor> </implementation> <handlers> <handler event="click" button="0" modifiers="any"> <![CDATA[ switch(this.PS.getIntPref(this.pref)){ case 1: this.PS.setIntPref(this.pref,2);break; case 2: this.PS.setIntPref(this.pref,3);break; case 3: this.PS.setIntPref(this.pref,1);break; } ]]> </handler> </handlers> |
Yan > 06-12-2006 14:07:21 |
Dark-Demon
И при последующем запуске все твои кнопки перестали инициализироваться. В панели они есть (проверил через DOM-инспектор), а их не видно. (После этого мне и стало влом разбираться, куда bind пропал.) |
Dark-Demon > 06-12-2006 16:22:07 |
ты ставил кнопки с моего сайта? или кастомкнопки?
изменять можно не перезагружая, удалять уже тоже, но я эту версию ещё не выложил. вот с добавление - коряга.
а ты strict отруби и ни одного не останется |
Dark-Demon > 11-12-2006 16:25:33 |
что-то addons.mozilla.org не хочет кушать моё расширение |
Yan > 11-12-2006 17:52:18 |
Чёрт, опять не заметил твоё сообщение от 6 декабря.
С твоего сайта.
Это вроде как основная функция.
Не понял. Как strict мешает работе расширения?
Не знаю. |
Dark-Demon > 12-12-2006 12:29:22 |
Yan, strict никак не мешает работе, просто засоряет консоль. |
Dark-Demon > 10-07-2007 00:50:22 |
ввиду того, что старое моё расширение под третьей лисицей не заработало, да и редактор давно уже хотел дописать сделал новую версию: из нововведений: особенности: |
Infocatcher > 08-08-2009 19:12:26 |
Подниму-ка я тему. Во-первых, нужна ли вообще настройка на скрытие кнопки «применить» в редакторе? Пусть она всегда видна будет, не мешает же. Относительно универсальная схема примерно такая: Выделить код Код:<dialog onchange="changed(event);" oncommand="changed(event);" oninput="changed(event);" ondragexit="changed(event);" С ondragexit не совсем хорошо, я пару раз пытался выявлять факт перетаскивания текста иначе, но результатов не добился. Далее два варианта. Самый точный вариант, но и самый медленный, если может быть большой текст (а он может). Ну, и преимущество в том, что код мало зависит от структуры XUL и от того, как реализовано чтение/сохранение настроек. P.S. И все же «Показывать кнопку "Применить" в редакторе кода», а не «Отобразить кнопку "Применить" в редакторе кода». Последнее больше применимо к однократному действию. |
Anton > 08-08-2009 22:34:15 |
Если писать сразу в кнопку, то она будет пересоздаваться и инициализироваться при каждой записи.
Кажется, есть вариант попроще. nsIEditorObserver на редактор + анализ transactionManager. numberOfUndoItems |
Infocatcher > 09-08-2009 00:41:04 |
Anton пишет
В основном сохранение нужно на случай, если выполненный по F9 код тем или иным образом не даст сохраниться. Anton пишет
Три редактора, два текстовых поля + хоткей, два чекбокса. И это после не особо внимательного осмотра. |
Infocatcher > 12-08-2009 02:04:50 |
Обнаружился небольшой баг: нельзя снять комментирование, если перед уже имеющимся комментированием есть пробелы. Методика лечения примерно такая: Выделить код Код:if(/^\s*\/\//m.test(block)) block = block.replace(/^(\s*)\/\//mg, "$1"); else block = block.replace(/^/mg, "//"); |
Anton > 12-08-2009 20:31:14 |
Infocatcher пишет
Это не баг. |
Infocatcher > 12-08-2009 21:29:14 |
Удобнее, что ли, хм. Надо будет последить, что нужно чаще. |
Infocatcher > 13-08-2009 22:47:20 |
http://forum.mozilla-russia.org/viewtop … 82#p364082 Что вообще дает добавление оверлея через свой протокол кроме запрета кэширования? 13-08-2009 23:09:01 |
Anton > 14-08-2009 18:56:13 |
Кроме того, что оверлей, загружаемый по собственному протоколу не кэшируется, есть возможность менять его содержимое прямо во время загрузки.
Если надо "перекрывать" toolbarpalette это не будет работать.
И что же с ней "не так" ? |
Infocatcher > 14-08-2009 21:02:17 |
Кроме версий js это сейчас для чего-нибудь используется?
А когда подключается toolbarpalette?
Ммм... она не работает. |
Anton > 14-08-2009 21:18:05 |
Пока нет.
Конструктор toolbox'а его удаляет из документа.
Она-то как раз работает. Не работает chrome.manifest.
Всё так.
Уже посоветовал, за что я ему весьма благодарен. Оверлей с кнопками будет загружаться из resource://, селектор версий js - по-прежнему из custtombuttons://, но через loadOverlay (...) |
Infocatcher > 14-08-2009 22:17:54 |
В том смысле, что есть планы использовать изменение контента, загружаемого по своему протоколу, для чего-то еще или просто может пригодиться?
До того, как запустятся скрипты расширений, так?
Т.е. это баг в реализации chrome.manifest?
Тебе видней. Тем не менее, не стоило это исключать без веских оснований, а у меня их не было.
Не совсем понимаю, что дает resource://, он что, тоже не кэшируется или можно сделать, чтобы не кэшировался? |
Anton > 15-08-2009 01:16:32 |
Без динамической подмены версии js как раз и будет "через одно место" - лишние записи в chrome.manifest, несколько оверлеев, слегка отличающихся только значением атрибута type. Это при том, что в chrome.manifest нет флага для platformversion.
Это значит, надо поставить observer на domwindowopened, когда он "поймает" окно, проверить, нужное ли это окно, поставить на окно обработчик некоего события, дождаться срабатывания обработчика и загрузить оверлей.
Я разве что-нибудь говорил про "баг в реализации chrome.manifest" ?
Мдя... Ну я то ведь думал, что у тебя есть какие-то веские основания, раз ты это озвучиваешь.
Да, оверлеи через resource:// не кэшируются. |
Infocatcher > 15-08-2009 01:55:42 |
Anton пишет
Однако я могу подключить скрипт без указания версии js, содержащий , и он будет работать. будет работать.
Если оверлей через resource:// решает проблему, нет смысла и проверять, понятно, что так сложнее.
А я и не утверждаю, что ты говорил. Но ведь баг есть. И он где-то находится. Так вот, где баг?
Я сказал, что «по-моему». К тому же, проявлялось все это довольно-таки странно. Например, у меня почему-то вываливалось исключение на document.loadOverlay() при использовании custombutton-протокола и при том, что в chrome.manifest все строки с custombutton:// были закомментированы. |
Anton > 15-08-2009 02:15:20 |
2.0, xbl вызывает что-нибудь из скрипта, загруженного без указания версии.
Я же сказал: не работает chrome.manifest Infocatcher пишет
При каких условиях ? |
Infocatcher > 15-08-2009 03:09:33 |
Н-ну, пусть xbl оповещает наблюдателя, что нужно выполнить код такой-то кнопки.
Это уже вопрос терминологии. Если что-то не работает, то или так и задумано, или это баг.
Тот код не сохранился, потому как не давал нужного результата... Пока пытался воспроизвести, убил все расширения: Выделить код Код:## Firefox overlay chrome://browser/content/browser.xul chrome://custombuttons/content/test.xul overlay chrome://browser/content/browser.xul chrome://custombuttons/content/overlay.xul # overlay chrome://browser/content/browser.xul custombuttons://content/buttonsoverlay.xul ## Browser # overlay chrome://browser/content/browser.xul custombuttons://content/cbbutton.xul overlay chrome://global/content/customizeToolbar.xul custombuttons://content/cbbutton.xul test.xul: Выделить код Код:<?xml version="1.0"?> <overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> <script type="application/x-javascript"> <![CDATA[ document.loadOverlay("custombuttons://content/buttonsoverlay.xul", null); document.loadOverlay("custombuttons://content/cbbutton.xul", null); ]]> </script> </overlay> А Выделить код Код:window.addEventListener("load", function(e) { document.loadOverlay("custombuttons://content/buttonsoverlay.xul", null); document.loadOverlay("custombuttons://content/cbbutton.xul", null); }, false); тупо не дает никакого эффекта. Правда, это все без установленного ABP. А при установке ABP плюс Выделить код Код:setTimeout(function() { document.loadOverlay("custombuttons://content/buttonsoverlay.xul", null); document.loadOverlay("custombuttons://content/cbbutton.xul", null); }, 1000); Firefox вообще падает при запуске. о_О Заодно нашел в userChromeJS коммент про https://bugzilla.mozilla.org/show_bug.cgi?id=330458. |
Anton > 15-08-2009 03:44:17 |
Эта идея требует тщательного обдумывания.
Первоначальный вопрос, напомню, был "Что не так с компонентой" : )
Наверное, если поставить observer вместо null, который будет загружать следующий оверлей, падать не будет. |
Infocatcher > 15-08-2009 04:40:48 |
Если уже все починилось, то это не приоритетно, разумеется. Однако это мне видится несколько более простым подходом, чем правка оверлея «на лету».
Бррр... так я совсем запутаюсь.
Вполне возможно, там в комментах к багу есть хитрый код для загрузки нескольких оверлеев (var overlay_loader= ...) и, вроде как, с observer'ом тоже баг: Выделить код Код:observe: function(subject,topic,data) { // don't bother to do anything because we cannot // guarantee that this observer will be called anyway } |
Anton > 15-08-2009 18:52:47 |
Не знаю. Впрочем, можешь пировать победу над селектором версий - биндинги кнопок загружаются раньше загружаемого через loadOverlay оверлея, содержащего необходимые конструкторам кнопок методы. |
Infocatcher > 15-08-2009 19:41:45 |
Мне-то селектор версий не мешал(ет), это вопрос (не)оптимальности подхода. |
Anton > 15-08-2009 20:08:37 |
Уже не надо. Вот так: http://www.mozdev.org/source/browse/custombuttons/src/chrome/custombuttons/content/custombuttons/tcbbutton.xul?rev=1.1.8.2;content-type=text%2Fplain;f=h работает. |
Infocatcher > 15-08-2009 20:42:37 |
А если как-то так: Выделить код Код:<script type="application/x-javascript;version=1.8" src="chrome://custombuttons/content/cbbutton-loader.js"/> <script type="application/x-javascript;version=1.7" src="chrome://custombuttons/content/cbbutton-loader.js"/> <script type="application/x-javascript;version=1.6" src="chrome://custombuttons/content/cbbutton-loader.js"/> <script type="application/x-javascript" src="chrome://custombuttons/content/cbbutton-loader.js"/> cbbutton-loader.js: Выделить код Код:if(!("custombuttonsLoaded" in window)) { Components.classes["@mozilla.org/moz/jssubscript-loader;1"] .getService(Components.interfaces.mozIJSSubScriptLoader) .loadSubScript("chrome://custombuttons/content/cbbutton.js"); window.custombuttonsLoaded = true; } ? |
Anton > 15-08-2009 20:52:21 |
Infocatcher пишет
Не пойму, в чём суть. |
Infocatcher > 15-08-2009 20:53:59 |
Суть в том, что скрипты из chrome://custombuttons/content/cbbutton.js гарантированно выполнятся только один раз и с наибольшей версией js. Ну, в теории. |
Anton > 15-08-2009 21:04:59 |
Ну, может быть. |
Al_H > 16-08-2009 00:48:28 |
Anton пишет
Какая фраза! Прошу пардона, а с селектором стиль-тема все глухо пока? |
Anton > 16-08-2009 00:59:08 |
Al_H |
Anton > 20-08-2009 17:41:00 |
Размышляю по поводу http://forum.mozilla-russia.org/viewtopic.php?pid=365834#p365834 |
Infocatcher > 20-08-2009 20:23:00 |
Anton пишет
Ну, самый удобный вариант – это как в Mouse Gestures Redox, чтобы с диалогом. Но количество кода для реализации плохо соотносится с получаемой пользой, по-моему. А в противном случае не особо ясно, куда там сокращать код – и так не много, а тем, кто «в курсе» – наоборот труднее будет, с нестандартной функцией-то (а в код расширения лезть, разумеется, лень ). Выделить код Код:custombuttons.dispatchKeyEvent( ["keydown", "keypress", "keyup"], true /*ctrlKey*/, false /*altKey*/, false /*shiftKey*/, false /*metaKey*/, "VK_SPACE" ); 20-08-2009 20:30:06 |
Anton > 20-08-2009 21:23:02 |
Ну, я предполагал по типу ms wsh object. sendKeys (string) startProcess часто используется, как будто бы, но не знаю, как она работает в не-windows системах. |
Infocatcher > 26-08-2009 08:18:47 |
Мне тут про деструкторы кнопок подумалось. Примерно в таком духе: Выделить код Код:var button = ...; if("destroy" in button && (!("hasOwnProperty" in button) || button.hasOwnProperty("destroy"))) button.destroy.call(button); // Кнопка уже была инициализирована и определила метод "destroy" try { new Function("arg0,arg1", button.getAttribute("cb-init")).call(button, arg0, arg1); } ... (А destroy может всплыть от Object.prototype, а также можно сделать this.__proto__ = null; в инициализации кнопки.) |
Anton > 26-08-2009 18:02:26 |
В конструкторе такая проверка есть давно.
: ) |
Infocatcher > 26-08-2009 19:53:46 |
Anton пишет
Хы, а я как-то только про потерявшиеся XBL-деструкторы осознал, а прочие эффекты или пропустил, или не уловил из пояснений.
Туго без него, ага. Пожалуй, все равно без Object.prototype в начале цепочки прототипов ничего полезного не получится. P.S. Странно, не вызывается this.destroy. Выделить код Код:this.clickHandler = function() { setTimeout(function() { throw "Click"; }, 0); } window.addEventListener("click", this.clickHandler, true); this.destroy = function() { alert("destroy"); window.removeEventListener("click", this.clickHandler, true); }; var _this = this; window.addEventListener("dblclick", function f() { window.removeEventListener("dblclick", f, true); setTimeout(function() { throw "dblclick -> destroy()"; }, 0); _this.destroy(); }, true); Или я снова что-то не учел? 26-08-2009 19:56:44 26-08-2009 20:04:18 Выделить код Код:this.clickHandler = function() { setTimeout(function() { throw "Click"; }, 0); } var _this = this; window.addEventListener("click", this.clickHandler, true); this.destroy = function() { alert("destroy"); window.removeEventListener("click", _this.clickHandler, true); }; window.addEventListener("dblclick", function f() { window.removeEventListener("dblclick", f, true); setTimeout(function() { throw "dblclick -> destroy()"; }, 0); _this.destroy(); }, true); |
Anton > 26-08-2009 20:06:15 |
Infocatcher пишет
Ну так деструктора в toolbarbutton.xml нет - кто его позовёт ? : ) |
Infocatcher > 26-08-2009 21:03:57 |
Anton пишет
Речь шла о пересоздании кнопки aka кнопка Применить в редакторе. 26-08-2009 21:05:46
|
Anton > 26-08-2009 21:24:01 |
Infocatcher пишет
Ну почему не вызывается - при удалении кнопки вызывается. При инициализации не вызывается, это верно. Как верно и то, что в конструкторе есть вызов destroy : ) С деструкторами я запамятовал - задумывалось, что штатным обработчиком кнопки будет onDestroy, а destroy - это служебная функция в cbbuttonimpl.js. |
Infocatcher > 26-08-2009 22:56:58 |
А еще может быть ondestroy. Кстати, можно еще передавать в функцию-деструктор параметр, определяющий, удаление это или обновление кода. И несколько идей касательно интерфейса. 1. «Кнопка была успешно создана. Вы можете добавить её на любую панель инструментов через меню "Вид -> Панели инструментов -> Настроить..."» И, мне кажется, удобнее сделать как-то так: [Настроить…] открывает диалог настройки панелей инструментов. 2. «Обновить кнопку " ... " кодом кнопки " ... " ?» Собственно, хотя вряд ли кто проверяет, но запускать что-то там, не видя кода, как-то не особо. 3. Не прикрутить ли контекстное меню к диалогу настройки панелей инструментов? И там, соответственно, как минимум, «редактировать» и «удалить». [UPD] |
Anton > 27-08-2009 18:33:13 |
Infocatcher |
Infocatcher > 14-12-2009 23:27:03 |
Мне тут подумалось, что хорошо бы сделать возможность редактирования произвольной кнопки (а не той, что видна и с контекстным меню). И, пожалуй, не помешает возможность отключения инициализации кнопок при запуске. Мало ли, что там, не руками же из-за этого XML'ку править. Можно и руками, конечно, но только удалять – править уже муторно. Также при поиске по Ctrl+/ хочется навигации по результатам через Enter/Shift+Enter или стрелки вниз/вверх (а то Enter мимо поля закроет диалог). |
Anton > 15-12-2009 17:00:58 |
Infocatcher
Я помню про контекстное меню в диалоге настройки панелей инструментов.
Если будут предложения по наименованию параметра командной строки - готов рассмотреть, если нет - придумаю сам : )
Вот насчет первого - не знаю. Есть ведь навигация по F3/Shift+F3. Завершение по Enter - почти как в Emacs, вроде удобно. А "Enter мимо поля закроет диалог" - это как воспроизвести ? |
Infocatcher > 15-12-2009 18:11:51 |
И это тоже. Но меня тут угораздило чуть промахнуться с кодом и скрыть кнопку «пользовательским» стилем (да еще и с important-флагом). К счастью, промахнулся я не до конца, и кнопку можно было показать добавлением атрибута.
Ну, «custombuttons» там должно в любом случае присутствовать.
А тут простой пример в лице поиска в Firefox. (Shift+)F3 есть, но есть и (Shift+)Enter.
Там же <dialog>, и если не перехватить нажатие Enter, то он выполнит умолчальное действие (эквивалент нажатия на Ok) и закроется. А разный эффект от одного и того же действия далеко не всегда удобен.
Тогда не знаю. Или вот настройку добавить – для привыкших к иному поведению или сторонников орудовать мышкой. P.S.
Торопиться особо некуда. Было бы определенное сочетание необходимости и наличия свободного времени, сам бы докрутил что-нибудь. Но я же ленюсь. 15-12-2009 18:21:01 sizeToContent(), что ли, делать... И, раз уж на то пошло, в заголовке хочется написать «Custom Buttons: ...». |
Anton > 15-12-2009 18:43:35 |
Не понимаю.
Он там есть, по onload и по oncommand. Правда, почему-то по onload в Thunderbird 3 не срабатывает. |
Infocatcher > 15-12-2009 18:54:04 |
А я все про ту же мысль, что, на мой взгляд, навигация по результатам поиска стрелками (когда фокус на поле для поиска) удобнее – эффект от нажатия стрелок не там, где предполагалось, менее критичен. Но особо мешать не должно, да. Кстати, еще разумно подхватывать выделенный текст при нажатии Ctrl+/. 15-12-2009 19:12:32
Видимо, баг. Как-то так: Выделить код Код:sizeWindowToContent: function (forced) { ... window. sizeToContent (); if (forced) setTimeout(window. sizeToContent, 0); }, onLoad: function () { ... this. sizeWindowToContent (true); }, Кривовато (и дергается) , но зато работает. |
Anton > 15-12-2009 23:14:07 |
Вроде понял.
Вроде бы когда-то так было, не помню. Интересно это работает. |
Infocatcher > 15-12-2009 23:29:19 |
И еще раз про то же, но с другого бока.
Это еще хорошо, что XUL там не сложный. При наличии скроллбоксов бывает интереснее. |
Anton > 15-12-2009 23:36:57 |
Опять двадцать пять : ) |
Infocatcher > 16-12-2009 00:15:07 |
А я не спорю. Вроде бы. Кстати, а как насчет пункта контекстного меню для создания пустой кнопки – как клонирование, только без переноса свойств? |
Anton > 17-12-2009 18:39:36 |
Не хотелось бы добавлять в контекстное меню. Подумаю. |
Infocatcher > 18-12-2009 02:00:27 |
А если изменить поведение клонирования при клике средней кнопкой мыши? |
Anton > 19-12-2009 08:22:44 |
Infocatcher
Может быть. Или Shift/Ctrl+Left click. okkamas_knife |
Infocatcher > 19-12-2009 18:48:56 |
Anton пишет
Лучше «и». Кликать без участия клавиатуры удобнее. Но на случай отсутствия средней кнопки лучше предусмотреть запасной вариант. |
Infocatcher > 26-01-2010 00:47:55 |
Меня тут попросили реквест передать... Так сказать, несколько доработанная идея. И еще один неудобный момент – хорошо бы иметь возможность и отмены, и сохранения на случай вылета программы или каких других сбоев. Или вот при сохранении во время редактирования сохраняться во временный файл. При нажатии на Ok файл удалять, а изменения записывать в основной файл, а при отмене – тоже удалять и считывать данные из основного файла. Причем даже имена для файлов есть – что-нибудь + номер кнопки. Вот как-то так. 26-01-2010 01:11:04 Да, а для отмен можно делать один файл, аналогичный по структуре основному файлу настроек. Тогда проще проверять при запуске, не было ли падения – по наличию файла (который удалился бы при успешном закрытии редактора). Ну, и проверять при закрытии, нету ли еще открытых редакторов, и если нет – удалять временный файл. Или уже при закрытии браузера удалять, что проще, наверное – насколько я помню, можно подписаться на оповещение о соответствующем событии. 26-01-2010 01:16:55
|
Infocatcher > 26-01-2010 03:58:08 |
okkamas_knife И не все кнопки могут существовать в двух экземплярах одновременно. А про массовое отключение и правку, скажем, невидимых кнопок уже было выше. |
Anton > 26-01-2010 18:21:16 |
Infocatcher
Ок, закину в todo. |
Infocatcher > 27-01-2010 23:10:31 |
okkamas_knife пишет
Проще не разворачивать окно на весь экран. На правах развлекательства: http://forum.mozilla-russia.org/uploade … +tb+sb.xpi Суть: Выделить код Код:toggleOnTop: function() { var ci = Components.interfaces; var xulWin = window.QueryInterface(ci.nsIInterfaceRequestor) .getInterface(ci.nsIWebNavigation) .QueryInterface(ci.nsIDocShellTreeItem) .treeOwner .QueryInterface(ci.nsIInterfaceRequestor) .getInterface(ci.nsIXULWindow); var normal = xulWin.zLevel == xulWin.normalZ; xulWin.zLevel = normal ? xulWin.highestZ : xulWin.normalZ; document.getElementById("toggleOnTop").setAttribute("checked", normal); } Распихивать текст по локалям лениво, ибо это только концепт. Выделить код Код:var s = top.document.documentElement.style; if(normal) { s.outline = "2px groove " + (this.pu.pref("ui.onTopBorderColor") || "orange"); s.outlineOffset = "-2px"; } else { s.outline = ""; s.outlineOffset = ""; } И, увы, это отличается от системного onTop в Windows. |
Infocatcher > 25-02-2010 02:08:46 |
CB 0.0.4.7 А если добавить class="menuitem-iconic", то уже нормально (добавлено только к первому пункту): А причина – в Выделить код Код:menuitem[id^="custombuttons-contextpopup-"] { -moz-binding: url("chrome://global/content/bindings/menu.xml#menuitem-iconic") !important; } и в Выделить код Код:menu.menu-iconic > .menu-iconic-left, menuitem.menuitem-iconic > .menu-iconic-left { -moz-appearance: menuimage; padding-top: 2px; } из chrome://global/skin/menu.css (берется из firefox/chrome/classic.jar!/skin/classic/aero/global/menu.css) 25-02-2010 02:10:02 25-02-2010 02:11:21 выводится как
Смотрится не особо. |
Anton > 25-02-2010 23:16:08 |
Infocatcher
Хорошо, добавлю.
Как сделать лучше ? |
Infocatcher > 26-02-2010 01:09:58 |
Anton пишет
С той же стороны еще есть отсутствие прямой связи accesskey с текстом, а также отсутствие подобного в других местах. Вроде бы, для всяких там независимостей правильнее использовать «обычные» хоткеи. Может быть, даже есть смысл реагировать на Ctrl+Вниз и Ctrl+Вверх (или что-то вроде того) как на Tab и Shift+Tab, раз уж Tab перехватывается. |
Anton > 27-02-2010 18:11:13 |
Infocatcher пишет
Это ведь редактор кода, а код набирается в en-раскладке. Если локализовать горячие клавиши, то наверняка перед (и после) их использованием потребуется сменить раскладку. Три "распальцовки" - уже не так быстро как одна.
Кроме Tab/Ctrl+Tab работает ещё Ctrl+PgUp и Ctrl+PgDn. Но эти сочетания реализуют последовательный доступ к вкладкам, а не произвольный, и работают не из любой точки редактора.
Понятно, буду разбираться. |
Infocatcher > 27-02-2010 18:34:45 |
Anton пишет
Если accesskeys на английском работают из любой раскладки, а на русском – только на русской, то это уже баг. Там вообще странно как-то – по-моему, еще есть разница, как идет русификация – изначально или в виде языкового пакета. |
Anton > 27-02-2010 18:59:29 |
Infocatcher пишет
В редакторе так и есть, о чем я и говорил. |
Infocatcher > 27-02-2010 19:45:25 |
Anton пишет
Это и правда менее удобно. И все равно останутся лишние символы в скобках. Anton пишет
Хм, не знал, что они скрываются. |
Anton > 28-02-2010 13:20:41 |
Infocatcher пишет
Это можно сделать множеством способов. Ну, хотя бы добавив <key> и удалив accesskey. |
Infocatcher > 06-03-2010 03:26:50 |
А как насчет принудительного отображения контекстного меню по (редкоиспользуемые модификаторы)+правоклик? Выделить код Код:window.addEventListener("click", function(e) { if(e.button == 2 && e.ctrlKey && e.shiftKey && e.altKey) { var tar = e.originalTarget; if( "id" in tar && tar.id.indexOf("custombuttons-button") == 0 && navigator.preference("custombuttons.mode") & 64 ) { e.preventDefault(); e.stopPropagation(); var cm = document.getElementById("custombuttons-contextpopup"); document.popupNode = tar.ownerDocument.popupNode = tar; if("openPopupAtScreen" in cm) // Firefox 3.0+ cm.openPopupAtScreen(e.screenX, e.screenY, true /*isContextMenu*/); else cm.showPopup(e.target, e.clientX, e.clientY, "context", "none", "none"); } } }, true); Только, пожалуй, обработчик лучше все же снимать при закрытии окна. Тестовая кнопка: Выделить код Код:this.oncontextmenu = this.onclick = function(e) { e.preventDefault(); e.stopPropagation(); }; Правда, можно отключить инициализацию, но зато тут без переоткрытия окна получается. И хорошо бы выяснить, как там на Маках с наличием клавиш-модификаторов. |
Anton > 06-03-2010 20:06:03 |
Infocatcher пишет
http://support.apple.com/kb/HT1343?viewlocale=ru_RU&locale=ru_RU Как будто бы все в наличии. |
iDev.Pi > 11-03-2010 23:52:09 |
Anton |
Anton > 12-03-2010 19:29:19 |
iDev.Pi пишет
Под "совместимостью" понимается возможность использования Custom Buttons для настройки панели инструментов редактора Stylish Custom ? Пока что Custom Buttons не позволяет настраиваться на использование в произвольных окнах. |
Sid > 12-03-2010 20:59:30 |
Anton пишет
iDev.Pi предлагает наоборот — использовать навороченную форму редактирования из Stylish-Custom для правки кода в Custom Buttons. |
iDev.Pi > 12-03-2010 23:41:02 |
Anton, |
iDev.Pi > 13-03-2010 08:18:19 |
Вобщем, ChoGGi хоть и очень неохотно отозвался, но вроде согласился сделать отдельный редактор для КБ на основе функционала Stylish Custom. Подождём - увидим. |
Anton > 13-03-2010 10:24:21 |
iDev.Pi пишет
Если честно, не вижу смысла. Какой функционал редактора Stylish Custom нужен в Custom Buttons ? Поиск есть, целых два. Обычный (Ctrl+F) и по мере набора (Ctrl+/). Есть выравнивание выделенного кода по Tab/Shift+Tab, есть даже замена (Ctrl+H). Я Stylish не пользуюсь, поэтому, может быть что-то упустил в сравнении, поправьте если так. |
iDev.Pi > 13-03-2010 14:41:19 |
Anton вот больше всего в КБ не хватает именно продуманного сохранения и правильного поведения диалоговых окон, остальное - уже мелочи вообще там ещё много вкусностей вроде грамотного apply-unapply или заливки кода на сайт в 1 клик и на всякий случай уточню: Stylish и Stylish Custom - это 2 разных дополнения, 2-ое - обвеска для 1-ого. |
Infocatcher > 15-03-2010 19:30:47 |
Совсем забыл.
И далее. Очень странно реагирует на любые (?) модальные сообщения в инициализации. Что интересно, вне CB не воспроизводится. |
Anton > 15-03-2010 19:46:24 |
Infocatcher пишет
Это не проблема CB.
Конечно. |
Infocatcher > 15-03-2010 21:42:27 |
Anton пишет
Это понятно. Просто правильнее найти/создать баг в багзилле. |
Infocatcher > 14-05-2010 21:14:45 |
Вроде, недавно появилось: при сохранении сбрасывается позиция прокуртки в редакторе. |
Infocatcher > 14-05-2010 22:33:31 |
Посмотрел, в 0.0.4.8 появилось. |
Anton > 15-05-2010 11:25:31 |
Infocatcher пишет
Спасибо, исправил. |