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

Многие проблемы быстрее решаются поиском по форуму и чтением FAQ, чем созданием новой темы и томительным ожиданием ответа.

№180119-07-2010 04:28:21

imyax
пользователь FF c 2010года
 
Группа: Members
Откуда: Сейчас здесь
Зарегистрирован: 13-04-2010
Сообщений: 209
UA: Namoroka 3.6

Re: Custom Buttons

Anton пишет

Najlus написал:как сделать кнопки перехода вперёд\назадhttp://custombuttons.mozdev.org/drupal/ … n-buttons/

Page not found

Отсутствует

 

№180220-07-2010 01:11:07

Indomito
Участник
 
Группа: Members
Откуда: Москва-Север
Зарегистрирован: 27-08-2009
Сообщений: 426
UA: Firefox 3.6

Re: Custom Buttons

Anton Первое.
Есть кнопка Quick History, вот код

скрытый текст

Выделить код

Код:

/*Initialization Code*/
var menu = document. getElementById ("goPopup"). cloneNode (true);
for (var i = 0; i < menu. childNodes. length; i++)
{
    if (menu. childNodes [i]. hasAttribute ("id"))
        menu. childNodes [i]. setAttribute ("hidden", "true");
}
menu. setAttribute ("place", "type=0&sort=4&maxResults=37");
function delId(node) {
    node.removeAttribute("id");
    Array.forEach(node.childNodes, delId);
}
delId(menu);
this. appendChild (menu);
//this. type = "menu";
//this. orient = "horizontal";
this. setAttribute ("popup", menu. id = "cbHistory-" + this. id);

this. onclick = function (event)
{
    var node = event. originalTarget. node;
    if ((event. button < 2) && node)
    {
        PlacesUIUtils. markPageAsTyped (node. uri);
        openUILink (node. uri, event, false, true);
    }
    else if (event. button == 1)
        PlacesCommandHook.showPlacesOrganizer('History');
    else if (event. button == 2)
    {
        if (event. shiftKey || (event. originalTarget. nodeName != "toolbarbutton"))
            return;
        toggleSidebar ("viewHistorySidebar");
        event. preventDefault ();
        event. stopPropagation ();
    }
};

возможно ли тоже самое сделать для буфера обмена?
При появлении нового, отличного от последнего значения, в readFromClipboard(); оно бы заносилось в массив, который организован по принципу стека (списком  типа  LIFO, но без выборки).
Я не знаю к какому событию это привязать и как наиболее правильно.

Второе.

Об не большой ошибке.
Для обработки событий по кнопкам мыши я стандартно использую сл. код:
скрытый текст

Выделить код

Код:

/*Initialization Code*/
/*

Тут находится секция функций-обработчиков

*/

this.onclick = function(event) {
    if(event.button == 0) {
// Действие при клике ЛКМ
lbMouse();
    }
    else if(event.button == 1) {
        // Действие при клике СКМ
    }
    else if(event.button == 2 && !event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) {
        // Действие при клике ПКМ без модификаторов
        rbMouse();
    }
};
this.oncontextmenu = function(event) {
    if(event.button == 2 && !event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) {
        // Блокируем контекстное меню при клике ПКМ без модификаторов
        event.preventDefault();
        event.stopPropagation();
    }
};

и когда я нажимаю ПКМ то вместо того что бы вызывалась функция rbMouse(); происходит вызов меню настройки Custom Buttons, это происходит, если:
1. Я ни разу не нажал ЛКМ на кнопках CB.
2. Я нажал Shift-ПКМ, а после этого не выполнил пункт №1
Эти предположения основаны на статистике, хотя есть вариант что модификатор был нажат дважды, а значит в моём обработчике есть ошибка.


"Никогда не выявляйте в программе ошибки, если не знаете, что с ними дальше делать." Штейнбах

Отсутствует

 

№180320-07-2010 01:51:22

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

Re: Custom Buttons

Indomito пишет

для буфера обмена?

http://www.nakka.com/soft/clcl/index_rus.html :P
Кстати, вроде бы, о факте изменения содержимого буфера обмена из расширения/кнопки «встроенными» средствами не узнать – можно только периодически считывать содержимое.

Indomito пишет

и когда я нажимаю ПКМ то вместо того что бы вызывалась функция rbMouse(); происходит вызов меню настройки Custom Buttons

Скорее всего, происходит и то, и то.
Вообще, с подавлением контекстного меню иногда случается что-то странное. =/
Но можно вообще убрать контекстное меню кнопки, а когда нужно – показывать его «вручную»:

скрытый текст

Выделить код

Код:

this.removeAttribute("context");
this.onclick = function(e) {
    // ...
    if(e.button == 2) {
        if(e.ctrlKey || e.shiftKey || e.altKey || e.metaKey) {
            // Показываем контекстное меню кнопки
            let popup = document.getElementById("custombuttons-contextpopup");
            document.popupNode = this.ownerDocument.popupNode = this;
            if("openPopupAtScreen" in popup)
                popup.openPopupAtScreen(e.screenX, e.screenY, true);
            else
                popup.showPopup(this, e.screenX, e.screenY, "context", null, null);
        }
        else {
            // Действие при клике ПКМ без модификаторов
        }
    }
};

Отредактировано Infocatcher (20-07-2010 01:56:58)


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

Отсутствует

 

№180420-07-2010 02:08:22

Indomito
Участник
 
Группа: Members
Откуда: Москва-Север
Зарегистрирован: 27-08-2009
Сообщений: 426
UA: Firefox 3.6

Re: Custom Buttons

Infocatcher да, надо считывать по таймеру, это я уже понял ибо вытащить содержимое из сторонних дополнений типа AutoCopy мне так и не удалось плюс ставить их для того что бы просто получить буфер обмена, так они не стоят того ибо они несут не нужный функционал.
Спасибо за второй код, хотя я не очень понял разницы, ну да ладно разберусь ))))

Отредактировано Indomito (20-07-2010 02:19:11)


"Никогда не выявляйте в программе ошибки, если не знаете, что с ними дальше делать." Штейнбах

Отсутствует

 

№180520-07-2010 02:15:45

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

Re: Custom Buttons

Indomito пишет

хотя я не очень понял разницы

Можно при определенных условиях останавливать событие contextmenu, а можно вообще убрать контекстное меню, чтобы оно само никогда не показывалось, а когда оно нужно – показывать «вручную».


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

Отсутствует

 

№180620-07-2010 02:19:20

Indomito
Участник
 
Группа: Members
Откуда: Москва-Север
Зарегистрирован: 27-08-2009
Сообщений: 426
UA: Firefox 3.6

Re: Custom Buttons

И ещё....
Infocatcher сорри за "тупой" вопрос... )))) Что делать с CLCL - утилита кеширования буфера обмена.
1. Установить?
2. Скачать исходник и его "встроить" в какую либо кнопку CB?


"Никогда не выявляйте в программе ошибки, если не знаете, что с ними дальше делать." Штейнбах

Отсутствует

 

№180720-07-2010 02:19:59

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

Re: Custom Buttons

Indomito пишет

Что делать с

Ну, если утилита решит поставленные задачи, то поставить. Точнее, пожалуй, сначала поставить и проверить. =)

С точки зрения использования кода – проще найти документацию по буферу обмена и написать бинарную компоненту. И, видимо, сделать расширение, если иным способом воспользоваться ей не удастся. Но, думается, желающего найти будет трудновато.


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

Отсутствует

 

№180820-07-2010 02:29:23

Indomito
Участник
 
Группа: Members
Откуда: Москва-Север
Зарегистрирован: 27-08-2009
Сообщений: 426
UA: Firefox 3.6

Re: Custom Buttons

Infocatcher и ещё, пока не начал разбираться с CLCL, а разве не проще сделать обработчик по времени (событие)? Хотя думаю его эффективность по коду будет не высока, но всё же будет понятно мне что я делаю, а?
Если можно, то покажи пример оного, я то в теории понимаю, но в пространстве движка боюсь наворотить такого, что всё перестанет работать )))))


"Никогда не выявляйте в программе ошибки, если не знаете, что с ними дальше делать." Штейнбах

Отсутствует

 

№180920-07-2010 03:08:27

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

Re: Custom Buttons

Indomito пишет

пример оного

С периодичностью this.CHECK_INTERVAL (в миллисекундах) и при открытии меню проверяется содержимое буфера обмена, если такая строка еще не сохранена, то она добавляется в массив, а к меню кнопки добавляется новый пункт (старые данные при этом удаляются), всего хранится this.MAX_ENTRIES строк:

Инициализация

Выделить код

Код:

this.MAX_ENTRIES = 16;
this.CHECK_INTERVAL = 1000;

this.type = "menu";
this.orient = "horizontal";
this._menupopup = this.appendChild(document.createElement("menupopup"));
this._menupopup.setAttribute("oncommand", "this.parentNode.handleCommand(event.target);");

this.clipboardStrings = [];
this.checkClipboard = function() {
    var clipStr = readFromClipboard();
    if(clipStr && this.clipboardStrings.indexOf(clipStr) == -1)
        this.storeString(clipStr);
};
this.storeString = function(str) {
    var cs = this.clipboardStrings;
    cs.push(str);
    while(cs.length > this.MAX_ENTRIES)
        cs.shift();    

    var mi = document.createElement("menuitem");
    mi.setAttribute("label", str);
    mi.setAttribute("cb_index", cs.length - 1);
    this._menupopup.appendChild(mi);
    while(this._menupopup.childNodes.length > this.MAX_ENTRIES)
        this._menupopup.removeChild(this._menupopup.firstChild);
};
this.handleCommand = function(mi) {
    this.insertText(this.clipboardStrings[mi.getAttribute("cb_index")]);
};
this.insertText = function(str) {
    var cmd = "cmd_insertText";
    var controller = document.commandDispatcher.getControllerForCommand(cmd);
    if(controller && controller.isCommandEnabled(cmd)) {
        controller = controller.QueryInterface(Components.interfaces.nsICommandController);
        var params = Components.classes["@mozilla.org/embedcomp/command-params;1"]
            .createInstance(Components.interfaces.nsICommandParams);
        params.setStringValue("state_data", str);
        controller.doCommandWithParams(cmd, params);
    }
};

setInterval(function(button) {
    button.checkClipboard();
}, this.CHECK_INTERVAL, this);
this.setAttribute("onpopupshowing", "this.checkClipboard();");

Исправленная версия:

скрытый текст

Выделить код

Код:

this.MAX_ENTRIES = 16;
this.CHECK_INTERVAL = 1000;

this.type = "menu";
this.orient = "horizontal";
this._menupopup = this.appendChild(document.createElement("menupopup"));
this._menupopup.setAttribute("oncommand", "this.parentNode.handleCommand(event.target);");

this.clipboardStrings = [];
this.checkClipboard = function() {
    var clipStr = readFromClipboard();
    if(clipStr && this.clipboardStrings.indexOf(clipStr) == -1)
        this.storeString(clipStr);
};
this.storeString = function(str) {
    var cs = this.clipboardStrings;
    cs.push(str);
    while(cs.length > this.MAX_ENTRIES)
        cs.shift();    

    var mi = document.createElement("menuitem");
    mi.setAttribute("label", str);
    this._menupopup.appendChild(mi);
    while(this._menupopup.childNodes.length > this.MAX_ENTRIES)
        this._menupopup.removeChild(this._menupopup.firstChild);
};
this.handleCommand = function(mi) {
    var indx = Array.indexOf(mi.parentNode.childNodes, mi);
    if(indx != -1)
        this.insertText(this.clipboardStrings[indx]);
};
this.insertText = function(str) {
    var cmd = "cmd_insertText";
    var controller = document.commandDispatcher.getControllerForCommand(cmd);
    if(controller && controller.isCommandEnabled(cmd)) {
        controller = controller.QueryInterface(Components.interfaces.nsICommandController);
        var params = Components.classes["@mozilla.org/embedcomp/command-params;1"]
            .createInstance(Components.interfaces.nsICommandParams);
        params.setStringValue("state_data", str);
        controller.doCommandWithParams(cmd, params);
    }
};

setInterval(function(button) {
    button.checkClipboard();
}, this.CHECK_INTERVAL, this);
this.setAttribute("onpopupshowing", "this.checkClipboard();");

Добавлено 20-07-2010 03:34:29
А вот и иконка: http://www.iconfinder.com/icondetails/1 … _text_icon

Отредактировано Infocatcher (22-07-2010 17:21:32)


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

Отсутствует

 

№181020-07-2010 03:40:04

Indomito
Участник
 
Группа: Members
Откуда: Москва-Север
Зарегистрирован: 27-08-2009
Сообщений: 426
UA: Firefox 3.6

Re: Custom Buttons

Infocatcher ага, те поясню почему "ага" ))))
Я посмотрел и вспомнил что с ПО CLCL я уже встречался и даже переписывал её под себя, только исходники были из другого источника, а я то искал решения для программной отработки тегов типа

Выделить код

Код:

[url=имя]адрес из буфера[/url] или [quote=имя]цитата из буфера[/quote] или etc

Еще вопрос.
При mb_BBCodePrim = function (open,close, readFromClipboard()) {}; значение readFromClipboard() равно undefined. При обработке на других языках, оно принимает значение 0 те буфер пуст, те выражение

Выделить код

Код:

if (paste.length == 0)  { open +=close; alert (open+"буфер пуст"); }
   else                 { open +=paste+close; alert (open+"буфер не пуст"); }

ошибочно?
Тогда нужно писать так, что ли if (paste == "undefined") или применить преобразование paste в float/word/int/void ....  или скажем написать так if (paste.boolean == false)
Сорри но я на JS пишу ну скажем неделю и основательно путаюсь )))


"Никогда не выявляйте в программе ошибки, если не знаете, что с ними дальше делать." Штейнбах

Отсутствует

 

№181120-07-2010 04:24:53

Indomito
Участник
 
Группа: Members
Откуда: Москва-Север
Зарегистрирован: 27-08-2009
Сообщений: 426
UA: Firefox 3.6

Re: Custom Buttons

Infocatcher с undefined... да ступил... тк не ожидал такой реализации.

Выделить код

Код:

if (paste == undefined)  { open +=close; alert (open+"буфер пуст"); }
   else                 { open +=paste+close; alert (open+"буфер не пуст"); }

Хотя почти логично, но просто не привычно )))))


"Никогда не выявляйте в программе ошибки, если не знаете, что с ними дальше делать." Штейнбах

Отсутствует

 

№181220-07-2010 05:05:54

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

Re: Custom Buttons

А авторы функции (см. chrome://browser/content/browser.js) решили (зачем-то) возвращать undefined. =)

Выделить код

Код:

var clipStr = readFromClipboard();
if(clipStr)
    alert("not empty");
else
    alert("empty");

Или

Выделить код

Код:

var clipStr = readFromClipboard() || ""; // Будет всегда строка

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

Отсутствует

 

№181320-07-2010 06:20:46

Indomito
Участник
 
Группа: Members
Откуда: Москва-Север
Зарегистрирован: 27-08-2009
Сообщений: 426
UA: Firefox 3.6

Re: Custom Buttons

Infocatcher
Вопрос решил сам, как всегда задача на внимательно при разборке чужого кода :)
Пост оставил, может кому пригодиться ))) хотя не думаю, но может быть...

скрытый текст
Infocatcher я немного попытался разобраться в коде по Clipboard который ты прислал на форум... и так. 

Массив this.clipboardStrings = []; объявлен как я понимаю локально или я не прав? Как получить размер массива? (смотрел методы по справочникам JS - не нашёл или проглядел, те не нашел ) Поясняю про что я.

Есть метод slice(startIndex[, endIndex]), который в контексте твоего кода выглядит так -   var glbVarAarClip = clipboardStrings.slice(0) без var, что бы массив был глоб. видимость для всех кнопок CB, ну таких как QUOTE, URL, etc. Можно объявить глоб. функцию для унификации, ибо кнопок много и править один и тот же код во всех - врагу не пожелаешь)))

Остаётся вопрос как отловить конец массива... опять по undefined?

Пригляделся и всё нашел

Выделить код

Код:

this.storeString = function(str) {
    var cs = this.clipboardStrings;
    cs.push(str);
    alert ("Строка из буфера" + str);
    alert ("Размер массива" + cs.length);
    while(cs.length > this.MAX_ENTRIES)
        cs.shift();    

    var mi = document.createElement("menuitem");
    mi.setAttribute("label", str);
    mi.setAttribute("cb_index", cs.length - 1);
    this._menupopup.appendChild(mi);
    while(this._menupopup.childNodes.length > this.MAX_ENTRIES)
        this._menupopup.removeChild(this._menupopup.firstChild);
};

правда вопрос о передаче через функцию немного не понятен, а через глоб переменную/массив ясен, переменную CS объявить глобально, те без var.


"Никогда не выявляйте в программе ошибки, если не знаете, что с ними дальше делать." Штейнбах

Отсутствует

 

№181420-07-2010 07:32:24

Indomito
Участник
 
Группа: Members
Откуда: Москва-Север
Зарегистрирован: 27-08-2009
Сообщений: 426
UA: Firefox 3.6

Re: Custom Buttons

Infocatcher ты уверен что твой код по обработке ПКМ рабочий?

скрытый текст
this.removeAttribute("context");
this.onclick = function(e) {
    // ...
    if(e.button == 2) {
        if(e.ctrlKey || e.shiftKey || e.altKey || e.metaKey) {
            // Показываем контекстное меню кнопки
            let popup = document.getElementById("custombuttons-contextpopup");
            document.popupNode = this.ownerDocument.popupNode = this;
            if("openPopupAtScreen" in popup)
                popup.openPopupAtScreen(e.screenX, e.screenY, true);
            else
                popup.showPopup(this, e.screenX, e.screenY, "context", null, null);
        }
        else {
            // Действие при клике ПКМ без модификаторов
        }
    }
};
ибо я поставил КТ из алертов и кнопка не стала работать, вот код
скрытый текст
/*Initialization Code*/
this.removeAttribute("context");
this.onclick = function(e) {
    // ...
    alert (1);
    if(e.button == 2) {
        alert (1.1);
        if(e.ctrlKey || e.shiftKey || e.altKey || e.metaKey) {
            // Показываем контекстное меню кнопки
            let popup = document.getElementById("custombuttons-contextpopup");
            document.popupNode = this.ownerDocument.popupNode = this;
            alert (1.2);
            if("openPopupAtScreen" in popup)
                popup.openPopupAtScreen(e.screenX, e.screenY, true);
                alert (1.3);
            else
                popup.showPopup(this, e.screenX, e.screenY, "context", null, null);
                alert (1.4);
        }
        else {
            // Действие при клике ПКМ без модификаторов
//               var clClipboard=clipboardData;
//               clClipboard.clearData();
               alert (1.5);
        }
    }
};
Может вот так верно?
скрытый текст
/*Initialization Code*/
this.removeAttribute("context");
this.onclick = function(e) {
    // ...
    alert (1);
    if(e.button == 2) {
        alert (1.1);
        if(e.ctrlKey || e.shiftKey || e.altKey || e.metaKey) {
            // Показываем контекстное меню кнопки
            let popup = document.getElementById("custombuttons-contextpopup");
            document.popupNode = this.ownerDocument.popupNode = this;
            alert (1.2);}
            if("openPopupAtScreen" in popup) {
                popup.openPopupAtScreen(e.screenX, e.screenY, true);
                alert (1.3); }
            else {
                popup.showPopup(this, e.screenX, e.screenY, "context", null, null);
                alert (1.4); }
        }
        else {
            // Действие при клике ПКМ без модификаторов
//               var clClipboard=clipboardData;
//               clClipboard.clearData();
               alert (1.5);
        }
    }
};
или нечто подобное одна } лишьняя... но где я не нашел тк парсера нет, а убирать... приходится удалять кнопку тк потом на редактироваться не хочет )))


"Никогда не выявляйте в программе ошибки, если не знаете, что с ними дальше делать." Штейнбах

Отсутствует

 

№181520-07-2010 12:58:36

Indomito
Участник
 
Группа: Members
Откуда: Москва-Север
Зарегистрирован: 27-08-2009
Сообщений: 426
UA: Firefox 3.6

Re: Custom Buttons

Программируя на javascript никогда не знаешь когда встанешь на очередную граблю. Иногда складывается впечатление, что в языке больше плохого чем, хорошего.

... это я так... но теперь понял эту цитату прочитанную две недели назад.

Есть код

скрытый текст
// -------------------------------------------------------
// Функция get_ListClipboardPrim
// получить список сохранёного буфера обмена
//
// this.varListClipboardPrim = []; от без исходности)))))
get_ListClipboardPrim = function (){
alert (1);
var cs = this.clipboardStrings;
alert ("размер массива = "+cs.length);
//var ts = cs.slice(0);
//alert (ts[0]);
//alert (1.1);
return ();
};

//++++++++++++++++++END DEF+++++++++++++++++++++++++++++++++++

//Список сохранёного буфера обмена
//Не вызываем это обработка по таймеру или по событию ЛКМ (пока не понял как)
//this.MAX_ENTRIES = 16; - число записей 16
//this.CHECK_INTERVAL = 1000; - время опроса буфера 1000 миллисекунд

//-----Обработчики буфера обмена
this.MAX_ENTRIES = 16;
this.CHECK_INTERVAL = 1000;

this.type = "menu";
this.orient = "horizontal";
this._menupopup = this.appendChild(document.createElement("menupopup"));
this._menupopup.setAttribute("oncommand", "this.parentNode.handleCommand(event.target);");

this.clipboardStrings = [];
this.checkClipboard = function() {
    var clipStr = readFromClipboard();
    if(clipStr && this.clipboardStrings.indexOf(clipStr) == -1)
        this.storeString(clipStr);
};

this.storeString = function(str) {
    var cs = this.clipboardStrings;
    cs.push(str);
    while(cs.length > this.MAX_ENTRIES)
        cs.shift();   

    var mi = document.createElement("menuitem");
    mi.setAttribute("label", str);
    mi.setAttribute("cb_index", cs.length - 1);
    this._menupopup.appendChild(mi);
    while(this._menupopup.childNodes.length > this.MAX_ENTRIES)
        this._menupopup.removeChild(this._menupopup.firstChild);
};

// выбор строки из списка и вставка его
this.handleCommand = function(mi) {
    this.insertText(this.clipboardStrings[mi.getAttribute("cb_index")]);
};

this.insertText = function(str) {
    var cmd = "cmd_insertText";
    var controller = document.commandDispatcher.getControllerForCommand(cmd);
    if(controller && controller.isCommandEnabled(cmd)) {
        controller = controller.QueryInterface(Components.interfaces.nsICommandController);
        var params = Components.classes["@mozilla.org/embedcomp/command-params;1"]
            .createInstance(Components.interfaces.nsICommandParams);
        params.setStringValue("state_data", str);
        controller.doCommandWithParams(cmd, params);
    }
};

setInterval(function(button) {
    button.checkClipboard();
}, this.CHECK_INTERVAL, this);
this.setAttribute("onpopupshowing", "this.checkClipboard();");

то что выделено красным не работает, я просто хотел передать через RETURN копию массива, но даже Alert не хочет вычислять длину. А если посмотреть на что выделено синим - всё работает... почему?

Отредактировано Indomito (20-07-2010 13:00:00)


"Никогда не выявляйте в программе ошибки, если не знаете, что с ними дальше делать." Штейнбах

Отсутствует

 

№181620-07-2010 16:46:12

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

Re: Custom Buttons

iDev.Pi пишет

Anton
если не трудно - собери, пожалуйста, из этого готовый xpi и поделись здесь со всеми ссылкой.

Пока не могу.

Добавлено 20-07-2010 16:48:11

imyax пишет
Anton пишет

Najlus написал:как сделать кнопки перехода вперёд\назадhttp://custombuttons.mozdev.org/drupal/ … n-buttons/

Page not found

Вот это: http://custombuttons.mozdev.org/drupal/ … -buttons-0
?

Добавлено 20-07-2010 17:00:19

Indomito пишет

и когда я нажимаю ПКМ то вместо того что бы вызывалась функция rbMouse(); происходит вызов меню настройки Custom Buttons, это происходит, если:
1. Я ни разу не нажал ЛКМ на кнопках CB.
2. Я нажал Shift-ПКМ, а после этого не выполнил пункт №1
Эти предположения основаны на статистике, хотя есть вариант что модификатор был нажат дважды, а значит в моём обработчике есть ошибка.

Не могу воспроизвести (linux/windows).

Добавлено 20-07-2010 17:06:09

Indomito пишет

то что выделено красным не работает

Там, насколько я понимаю, this неверный.
get_ListClipboardPrim определяется в контексте окна, и в ней this==window
а clipboardStrings "подшивается" к кнопке, когда this==текущая кнопка


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

Отсутствует

 

№181720-07-2010 17:15:24

Indomito
Участник
 
Группа: Members
Откуда: Москва-Север
Зарегистрирован: 27-08-2009
Сообщений: 426
UA: Firefox 3.6

Re: Custom Buttons

Anton

Не могу воспроизвести (linux/windows).

я перепроверил, была опечатка, точнее пропал обработчик this.onclick = function(event) { тело }.

Если можешь, подскажи как верно написать метод slice() для массива this.clipboardStrings, для передачи через return его копии. Это нужно для  доступа к нему из других кнопок. Вот исходный код, см. пост №2072
По сути не сложно, но я что то не так пишу...


"Никогда не выявляйте в программе ошибки, если не знаете, что с ними дальше делать." Штейнбах

Отсутствует

 

№181820-07-2010 17:46:12

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

Re: Custom Buttons

Indomito пишет

Массив this.clipboardStrings = []; объявлен как я понимаю локально или я не прав?

Ну, не совсем. this в данном случае ссылается на кнопку, поэтому «снаружи» можно найти эту кнопку и посмотреть на ее свойство "clipboardStrings".
Вот если там написать
var clipboardStrings = [];
и обращаться уже к clipboardStrings – без this. – то «снаружи» такую переменную будет уже не видно.

Indomito пишет

Infocatcher ты уверен что твой код по обработке ПКМ рабочий?

У меня работает, инициализация:

скрытый текст

Выделить код

Код:

this.removeAttribute("context");
this.onclick = function(e) {
    // ...
    if(e.button == 2) {
        if(e.ctrlKey || e.shiftKey || e.altKey || e.metaKey) {
            // Показываем контекстное меню кнопки
            let popup = document.getElementById("custombuttons-contextpopup");
            document.popupNode = this.ownerDocument.popupNode = this;
            if("openPopupAtScreen" in popup)
                popup.openPopupAtScreen(e.screenX, e.screenY, true);
            else
                popup.showPopup(this, e.screenX, e.screenY, "context", null, null);
        }
        else {
            // Действие при клике ПКМ без модификаторов
            alert("Right-click");
        }
    }
};

Indomito пишет
Выделить код

Код:

if("openPopupAtScreen" in popup)
                popup.openPopupAtScreen(e.screenX, e.screenY, true);
                alert (1.3);

=>

Выделить код

Код:

if("openPopupAtScreen" in popup) {
                popup.openPopupAtScreen(e.screenX, e.screenY, true);
}
                alert (1.3);

А дальше оказывается else уже без if, и все ломается.

Indomito пишет

Программируя на javascript никогда не знаешь когда встанешь на очередную граблю. Иногда складывается впечатление, что в языке больше плохого чем, хорошего.

... это я так... но теперь понял эту цитату прочитанную две недели назад.

Так нужно уметь его готовить. =)
Граблями славится IE, а неожиданностями – Opera. :D

Indomito пишет

то что выделено красным не работает, я просто хотел передать через RETURN копию массива, но даже Alert не хочет вычислять длину. А если посмотреть на что выделено синим - всё работает... почему?

Так не получится.
Ссылка this зависит от способа вызова функции.
Например, вот так

Выделить код

Код:

var cs = get_ListClipboardPrim.call(button);

будет работать, если button – соответствующая кнопка. Но для этого нужно сначала получить ссылку на кнопку.
И даже копию просто так не вернуть – только ссылку на тот же массив.

Можно, не трогая остальной код, написать

Выделить код

Код:

window.cbClipboardStrings = this.clipboardStrings = [];

Тогда этот массив будет доступен из всех кнопок (и не только из них, так что имя такой переменной должно быть достаточно уникальным) через window.cbClipboardStrings или просто cbClipboardStrings.


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

Отсутствует

 

№181920-07-2010 18:01:55

Indomito
Участник
 
Группа: Members
Откуда: Москва-Север
Зарегистрирован: 27-08-2009
Сообщений: 426
UA: Firefox 3.6

Re: Custom Buttons

Infocatcher

Можно, не трогая остальной код, написать

Выделить код

Код:

window.cbClipboardStrings = this.clipboardStrings = [];

Тогда этот массив будет доступен из всех кнопок (и не только из них, так что имя такой переменной должно быть достаточно уникальным) через window.cbClipboardStrings или просто cbClipboardStrings.

так лучше, я уже все варианты перебрал LOL

Про

Infocatcher ты уверен что твой код по обработке ПКМ рабочий?

я уже нашёл свою ошибку и поправил, хотя пришлось 2-3 раза править файл buttonsoverlay.xul ))) Очень не удобно и без отладчика и без компилятора... иногда случайно узнаёшь об ошибке ))))

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


"Никогда не выявляйте в программе ошибки, если не знаете, что с ними дальше делать." Штейнбах

Отсутствует

 

№182020-07-2010 20:06:53

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

Re: Custom Buttons

Indomito пишет

я уже нашёл свою ошибку и поправил, хотя пришлось 2-3 раза править файл buttonsoverlay.xul ))) Очень не удобно и без отладчика и без компилятора... иногда случайно узнаёшь об ошибке ))))

buttonsoverlay.xul обычно править не нужно – можно или отключить инициализацию кнопок в настройках и открыть новое окно, или запустить Firefox с параметром «-custombuttons disable-buttons-initialization».
И еще консоль ошибок есть.

Indomito пишет

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

Для этого кто-то должен генерировать это событие.


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

Отсутствует

 

№182120-07-2010 21:03:18

iDev.Pi
баг-репортёр
 
Группа: Extensions
Зарегистрирован: 31-01-2010
Сообщений: 2718
UA: Mozilla 2.0

Re: Custom Buttons

4 реквеста:
1. может ли кто-нибудь скрестить кнопку запуска внешнего приложения с кнопкой открывающей суб-меню?
т.е. клик по кнопке открывает меню, где располагаются другие кнопки (можно даже в двух вариантах: 1 списком (иконка + подпись), а 2 - таблицей (иконки без текста), каждая их этих кнопок - запускает какую-то программу.

2. можно ли кнопку сделать такую, чтобы при нажатии на ctrl+f открывался сёрчбар, а по повторному нажатию - закрывался (в фф по дефолту такого нет) и чтоб между сессиями запросов поисковая фраза запоминалась бы, т.е. сёрчбар открыли, поискали им что-то, закрыли и снова открыли - а там фраза которую искали в прошлый раз + при открытии она выделена, т.е. если я сходу пишу что-то то старый поиск затирается новым. Я маньяк, я знаю, но можно такое?

3. кнопку, при нажатии на которой, списком (или ещё лучше таблицей) выводилось бы содержимое панели закладок (не самих закладок, а именно панели): у меня на ней ссылки расположены сокращённые до иконок (текст убран), было бы удобно скрыть панель целиком и открывать только когда надо добавить/удалить что-то (ведь кб кнопки не поддерживают drag'n'drop например закладок?)

4. в связи с новой фичей, думаю будет очень актуальна для многих: действие Make into App Tab (не знаю как оно звучит в локализованной сборке) для всех вкладок сразу.
Может быть, даже как-то продумать toggle on/off режим, т.е. чтобы пока кнопка нажата мидлкликом допустим - все открываемые табы в дальнейшем будут сразу сужаться до фавиконки, и так будет происходить до тех пор, пока кнопка не будет мидл кликнута 2-ой раз.

Отредактировано iDev.Pi (20-07-2010 21:08:22)


mzfx

Отсутствует

 

№182220-07-2010 21:14:40

Indomito
Участник
 
Группа: Members
Откуда: Москва-Север
Зарегистрирован: 27-08-2009
Сообщений: 426
UA: Firefox 3.6

Re: Custom Buttons

iDev.Pi пишет

3 реквеста:
1. может ли кто-нибудь скрестить кнопку запуска внешнего приложения с кнопкой открывающей суб-меню?
т.е. клик по кнопке открывает меню, где располагаются другие кнопки (можно даже в двух вариантах: 1 списком (иконка + подпись), а 2 - таблицей (иконки без текста), каждая их этих кнопок - запускает какую-то программу.

можно, просто надо поставить обработчик мышки на кнопки ЛКМ СКМ ПКМ.

Ты про это?

a09bcdc8f345t.jpg

приблизительно, да?


"Никогда не выявляйте в программе ошибки, если не знаете, что с ними дальше делать." Штейнбах

Отсутствует

 

№182320-07-2010 21:30:20

iDev.Pi
баг-репортёр
 
Группа: Extensions
Зарегистрирован: 31-01-2010
Сообщений: 2718
UA: Mozilla 2.0

Re: Custom Buttons

Indomito
если приблизительно - то да. но вообще хотелось бы и вариант не со столбцом из всех этих 1 2 3 4 5 6 7 8 9..., а с квадратной (или прямоугольной) таблицей:
1 2 3
4 5 6
7 8 9


mzfx

Отсутствует

 

№182420-07-2010 21:44:47

Indomito
Участник
 
Группа: Members
Откуда: Москва-Север
Зарегистрирован: 27-08-2009
Сообщений: 426
UA: Firefox 3.6

Re: Custom Buttons

iDev.Pi код меню, который дал мне Anton

скрытый текст

Выделить код

Код:

var menu = <menupopup xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
              xmlns:cb="http://xsms.nm.ru/custombuttons/"
              onclick="this. parentNode. handleClick (event);">
        <menu label="Почта" image="http://mail.rambler.ru/favicon.ico">
            <menupopup>
                <menuitem label="yandex"
                      class="menuitem-iconic"
                      image="http://img.imgsmail.ru/r/favicon.ico"
                      cb:url="http://www.mail.ru/"/>
                <menuitem label="google"
                      class="menuitem-iconic"
                      image="http://66.102.9.104/favicon.ico"
                      cb:url="http://gmail.google.com"/>
                <menuitem label="rambler"
                      class="menuitem-iconic"
                      image="http://mail.rambler.ru/favicon.ico"
                      cb:url="http://mail.rambler.ru"/>
            </menupopup>
        </menu>
        <menu label="Поиск">
            <menupopup>
                <menuitem label="google"
                      class="menuitem-iconic"
                      image="http://66.102.9.104/favicon.ico"
                      cb:url="http://www.google.com"/>
                <menuitem label="yandex"
                      class="menuitem-iconic"
                      image="http://img.yandex.net/i/favicon.ico"
                      cb:url="http://www.yandex.ru"/>
            </menupopup>
        </menu>
        <menuitem label="mysite.ru"
              cb:url="mysite.ru"/>
        <menuitem label="forum.example.org"
              cb:url="forum.example.org"/>
      </menupopup>;
this. appendChild (custombuttonsUtils. makeXML (menu));
this. type = "menu";
this. orient = "horizontal";


+ обработчик
скрытый текст

Выделить код

Код:

this. handleClick = function (event)
{
    var menuitem = event. target;
    var url = menuitem. getAttributeNS ("http://xsms.nm.ru/custombuttons/", "url");
    if (event. button == 0)
        loadURI (url);
    else if (event. button == 1)
        gBrowser. addTab (url);
    this. open = false;
};


Или альтернативный обработчик
скрытый текст

Выделить код

Код:

function lbMouse(){};

function mbMouse(){};

function rbMouse(){};

this.onclick = function(event) {
    if(event.button == 0) {
// Действие при клике ЛКМ
lbMouse();
    }
    else if(event.button == 1) {
        // Действие при клике СКМ
mbMouse();
    }
    else if(event.button == 2 && !event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) {
        // Действие при клике ПКМ без модификаторов
rbMouse();
    }
};
this.oncontextmenu = function(event) {
    if(event.button == 2 && !event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) {
        // Блокируем контекстное меню при клике ПКМ без модификаторов
        event.preventDefault();
        event.stopPropagation();
    }
};


И то что было на скриншоте
скрытый текст

Выделить код

Код:

/*Initialization Code*/
var menu = <menupopup xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
              xmlns:cb="http://xsms.nm.ru/custombuttons/"
              onclick="this. parentNode. handleClick (event);">

        <menuitem label="=1"
                  class="menuitem-iconic"
                  image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAB2klEQVR42sSTPWhTcRTFf/+YmkqG1tjySDu4VZE6iI2TQ40fa3UQFSdNmoYHgSoKVhIR2qGmWId0CAmd1KHioNLJQSenFkSI0qGbVIeHkg+S5jXv/a+DRtLEThm82z0HLudwzlUiQjfjocvp+oC3HShOT1/AcWb6l5bOtOKzs4Vbtl1fbO4+X+/tVGr0SacCree3tR7fMs1EE8pktg7adn3RMIL3DCN4Hli17fr1ZHL95C4FP01zUMMJDViu+2AYMk3OMIKnEonhNYB0+sdKubwTAFCtKXw3zXxDhG2RaEUEEbkYyuVeAywsbN4tlYrpNr1juyzsiFyri9y34amI4MCjPxZipVIx7fP1zs/NjSlgtSOFr6Z5oyFSGMlmLQXPvEqhYeRDLHauUimHAVKp0Znfdg6Md6TgiNzZNzDwEOB4Nvv249SUBQy6cKlWqz7v6+s/mkyu//UbCBwqDw3pmBIRNuLxCQ2vqlp/qkPPfkDD4Qb4LdfVGo5cXl7e3LMHCm468D6Uy4WbxLvJyWMaPnuV8jgij4GJfzZxIx7310TOfnOcK61EOJ//omFtRwQXTu9Z5arIS0tr5fd4Cq3Em2j0quW6oR6l8CkVeBGJFFciEX/7AfXfv/HXAN7NzT0PQkDEAAAAAElFTkSuQmCC"
                  cb:open="[size=1]"
                  cb:close="[/size]"/>

        <menuitem label="=2"
                  class="menuitem-iconic"
                  image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAB2klEQVR42sSTPWhTcRTFf/+YmkqG1tjySDu4VZE6iI2TQ40fa3UQFSdNmoYHgSoKVhIR2qGmWId0CAmd1KHioNLJQSenFkSI0qGbVIeHkg+S5jXv/a+DRtLEThm82z0HLudwzlUiQjfjocvp+oC3HShOT1/AcWb6l5bOtOKzs4Vbtl1fbO4+X+/tVGr0SacCree3tR7fMs1EE8pktg7adn3RMIL3DCN4Hli17fr1ZHL95C4FP01zUMMJDViu+2AYMk3OMIKnEonhNYB0+sdKubwTAFCtKXw3zXxDhG2RaEUEEbkYyuVeAywsbN4tlYrpNr1juyzsiFyri9y34amI4MCjPxZipVIx7fP1zs/NjSlgtSOFr6Z5oyFSGMlmLQXPvEqhYeRDLHauUimHAVKp0Znfdg6Md6TgiNzZNzDwEOB4Nvv249SUBQy6cKlWqz7v6+s/mkyu//UbCBwqDw3pmBIRNuLxCQ2vqlp/qkPPfkDD4Qb4LdfVGo5cXl7e3LMHCm468D6Uy4WbxLvJyWMaPnuV8jgij4GJfzZxIx7310TOfnOcK61EOJ//omFtRwQXTu9Z5arIS0tr5fd4Cq3Em2j0quW6oR6l8CkVeBGJFFciEX/7AfXfv/HXAN7NzT0PQkDEAAAAAElFTkSuQmCC"
                  cb:open="[size=2]"
                  cb:close="[/size]"/>

        <menuitem label="=3"
                  class="menuitem-iconic"
                  image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAB2klEQVR42sSTPWhTcRTFf/+YmkqG1tjySDu4VZE6iI2TQ40fa3UQFSdNmoYHgSoKVhIR2qGmWId0CAmd1KHioNLJQSenFkSI0qGbVIeHkg+S5jXv/a+DRtLEThm82z0HLudwzlUiQjfjocvp+oC3HShOT1/AcWb6l5bOtOKzs4Vbtl1fbO4+X+/tVGr0SacCree3tR7fMs1EE8pktg7adn3RMIL3DCN4Hli17fr1ZHL95C4FP01zUMMJDViu+2AYMk3OMIKnEonhNYB0+sdKubwTAFCtKXw3zXxDhG2RaEUEEbkYyuVeAywsbN4tlYrpNr1juyzsiFyri9y34amI4MCjPxZipVIx7fP1zs/NjSlgtSOFr6Z5oyFSGMlmLQXPvEqhYeRDLHauUimHAVKp0Znfdg6Md6TgiNzZNzDwEOB4Nvv249SUBQy6cKlWqz7v6+s/mkyu//UbCBwqDw3pmBIRNuLxCQ2vqlp/qkPPfkDD4Qb4LdfVGo5cXl7e3LMHCm468D6Uy4WbxLvJyWMaPnuV8jgij4GJfzZxIx7310TOfnOcK61EOJ//omFtRwQXTu9Z5arIS0tr5fd4Cq3Em2j0quW6oR6l8CkVeBGJFFciEX/7AfXfv/HXAN7NzT0PQkDEAAAAAElFTkSuQmCC"
                  cb:open="[size=3]"
                  cb:close="[/size]"/>

        <menuitem label="=4"
                  class="menuitem-iconic"
                  image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAB2klEQVR42sSTPWhTcRTFf/+YmkqG1tjySDu4VZE6iI2TQ40fa3UQFSdNmoYHgSoKVhIR2qGmWId0CAmd1KHioNLJQSenFkSI0qGbVIeHkg+S5jXv/a+DRtLEThm82z0HLudwzlUiQjfjocvp+oC3HShOT1/AcWb6l5bOtOKzs4Vbtl1fbO4+X+/tVGr0SacCree3tR7fMs1EE8pktg7adn3RMIL3DCN4Hli17fr1ZHL95C4FP01zUMMJDViu+2AYMk3OMIKnEonhNYB0+sdKubwTAFCtKXw3zXxDhG2RaEUEEbkYyuVeAywsbN4tlYrpNr1juyzsiFyri9y34amI4MCjPxZipVIx7fP1zs/NjSlgtSOFr6Z5oyFSGMlmLQXPvEqhYeRDLHauUimHAVKp0Znfdg6Md6TgiNzZNzDwEOB4Nvv249SUBQy6cKlWqz7v6+s/mkyu//UbCBwqDw3pmBIRNuLxCQ2vqlp/qkPPfkDD4Qb4LdfVGo5cXl7e3LMHCm468D6Uy4WbxLvJyWMaPnuV8jgij4GJfzZxIx7310TOfnOcK61EOJ//omFtRwQXTu9Z5arIS0tr5fd4Cq3Em2j0quW6oR6l8CkVeBGJFFciEX/7AfXfv/HXAN7NzT0PQkDEAAAAAElFTkSuQmCC"
                  cb:open="[size=4]"
                  cb:close="[/size]"/>

        <menuitem label="=5"
                  class="menuitem-iconic"
                  image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAB2klEQVR42sSTPWhTcRTFf/+YmkqG1tjySDu4VZE6iI2TQ40fa3UQFSdNmoYHgSoKVhIR2qGmWId0CAmd1KHioNLJQSenFkSI0qGbVIeHkg+S5jXv/a+DRtLEThm82z0HLudwzlUiQjfjocvp+oC3HShOT1/AcWb6l5bOtOKzs4Vbtl1fbO4+X+/tVGr0SacCree3tR7fMs1EE8pktg7adn3RMIL3DCN4Hli17fr1ZHL95C4FP01zUMMJDViu+2AYMk3OMIKnEonhNYB0+sdKubwTAFCtKXw3zXxDhG2RaEUEEbkYyuVeAywsbN4tlYrpNr1juyzsiFyri9y34amI4MCjPxZipVIx7fP1zs/NjSlgtSOFr6Z5oyFSGMlmLQXPvEqhYeRDLHauUimHAVKp0Znfdg6Md6TgiNzZNzDwEOB4Nvv249SUBQy6cKlWqz7v6+s/mkyu//UbCBwqDw3pmBIRNuLxCQ2vqlp/qkPPfkDD4Qb4LdfVGo5cXl7e3LMHCm468D6Uy4WbxLvJyWMaPnuV8jgij4GJfzZxIx7310TOfnOcK61EOJ//omFtRwQXTu9Z5arIS0tr5fd4Cq3Em2j0quW6oR6l8CkVeBGJFFciEX/7AfXfv/HXAN7NzT0PQkDEAAAAAElFTkSuQmCC"
                  cb:open="[size=5]"
                  cb:close="[/size]"/>

        <menuitem label="=6"
                  class="menuitem-iconic"
                  image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAB2klEQVR42sSTPWhTcRTFf/+YmkqG1tjySDu4VZE6iI2TQ40fa3UQFSdNmoYHgSoKVhIR2qGmWId0CAmd1KHioNLJQSenFkSI0qGbVIeHkg+S5jXv/a+DRtLEThm82z0HLudwzlUiQjfjocvp+oC3HShOT1/AcWb6l5bOtOKzs4Vbtl1fbO4+X+/tVGr0SacCree3tR7fMs1EE8pktg7adn3RMIL3DCN4Hli17fr1ZHL95C4FP01zUMMJDViu+2AYMk3OMIKnEonhNYB0+sdKubwTAFCtKXw3zXxDhG2RaEUEEbkYyuVeAywsbN4tlYrpNr1juyzsiFyri9y34amI4MCjPxZipVIx7fP1zs/NjSlgtSOFr6Z5oyFSGMlmLQXPvEqhYeRDLHauUimHAVKp0Znfdg6Md6TgiNzZNzDwEOB4Nvv249SUBQy6cKlWqz7v6+s/mkyu//UbCBwqDw3pmBIRNuLxCQ2vqlp/qkPPfkDD4Qb4LdfVGo5cXl7e3LMHCm468D6Uy4WbxLvJyWMaPnuV8jgij4GJfzZxIx7310TOfnOcK61EOJ//omFtRwQXTu9Z5arIS0tr5fd4Cq3Em2j0quW6oR6l8CkVeBGJFFciEX/7AfXfv/HXAN7NzT0PQkDEAAAAAElFTkSuQmCC"
                  cb:open="[size=6]"
                  cb:close="[/size]"/>

        <menuitem label="=7"
                  class="menuitem-iconic"
                  image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAB2klEQVR42sSTPWhTcRTFf/+YmkqG1tjySDu4VZE6iI2TQ40fa3UQFSdNmoYHgSoKVhIR2qGmWId0CAmd1KHioNLJQSenFkSI0qGbVIeHkg+S5jXv/a+DRtLEThm82z0HLudwzlUiQjfjocvp+oC3HShOT1/AcWb6l5bOtOKzs4Vbtl1fbO4+X+/tVGr0SacCree3tR7fMs1EE8pktg7adn3RMIL3DCN4Hli17fr1ZHL95C4FP01zUMMJDViu+2AYMk3OMIKnEonhNYB0+sdKubwTAFCtKXw3zXxDhG2RaEUEEbkYyuVeAywsbN4tlYrpNr1juyzsiFyri9y34amI4MCjPxZipVIx7fP1zs/NjSlgtSOFr6Z5oyFSGMlmLQXPvEqhYeRDLHauUimHAVKp0Znfdg6Md6TgiNzZNzDwEOB4Nvv249SUBQy6cKlWqz7v6+s/mkyu//UbCBwqDw3pmBIRNuLxCQ2vqlp/qkPPfkDD4Qb4LdfVGo5cXl7e3LMHCm468D6Uy4WbxLvJyWMaPnuV8jgij4GJfzZxIx7310TOfnOcK61EOJ//omFtRwQXTu9Z5arIS0tr5fd4Cq3Em2j0quW6oR6l8CkVeBGJFFciEX/7AfXfv/HXAN7NzT0PQkDEAAAAAElFTkSuQmCC"
                  cb:open="[size=7]"
                  cb:close="[/size]"/>

        <menuitem label="=8"
                  class="menuitem-iconic"
                  image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAB2klEQVR42sSTPWhTcRTFf/+YmkqG1tjySDu4VZE6iI2TQ40fa3UQFSdNmoYHgSoKVhIR2qGmWId0CAmd1KHioNLJQSenFkSI0qGbVIeHkg+S5jXv/a+DRtLEThm82z0HLudwzlUiQjfjocvp+oC3HShOT1/AcWb6l5bOtOKzs4Vbtl1fbO4+X+/tVGr0SacCree3tR7fMs1EE8pktg7adn3RMIL3DCN4Hli17fr1ZHL95C4FP01zUMMJDViu+2AYMk3OMIKnEonhNYB0+sdKubwTAFCtKXw3zXxDhG2RaEUEEbkYyuVeAywsbN4tlYrpNr1juyzsiFyri9y34amI4MCjPxZipVIx7fP1zs/NjSlgtSOFr6Z5oyFSGMlmLQXPvEqhYeRDLHauUimHAVKp0Znfdg6Md6TgiNzZNzDwEOB4Nvv249SUBQy6cKlWqz7v6+s/mkyu//UbCBwqDw3pmBIRNuLxCQ2vqlp/qkPPfkDD4Qb4LdfVGo5cXl7e3LMHCm468D6Uy4WbxLvJyWMaPnuV8jgij4GJfzZxIx7310TOfnOcK61EOJ//omFtRwQXTu9Z5arIS0tr5fd4Cq3Em2j0quW6oR6l8CkVeBGJFFciEX/7AfXfv/HXAN7NzT0PQkDEAAAAAElFTkSuQmCC"
                  cb:open="[size=8]"
                  cb:close="[/size]"/>

        <menuitem label="=9"
                  class="menuitem-iconic"
                  image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAB2klEQVR42sSTPWhTcRTFf/+YmkqG1tjySDu4VZE6iI2TQ40fa3UQFSdNmoYHgSoKVhIR2qGmWId0CAmd1KHioNLJQSenFkSI0qGbVIeHkg+S5jXv/a+DRtLEThm82z0HLudwzlUiQjfjocvp+oC3HShOT1/AcWb6l5bOtOKzs4Vbtl1fbO4+X+/tVGr0SacCree3tR7fMs1EE8pktg7adn3RMIL3DCN4Hli17fr1ZHL95C4FP01zUMMJDViu+2AYMk3OMIKnEonhNYB0+sdKubwTAFCtKXw3zXxDhG2RaEUEEbkYyuVeAywsbN4tlYrpNr1juyzsiFyri9y34amI4MCjPxZipVIx7fP1zs/NjSlgtSOFr6Z5oyFSGMlmLQXPvEqhYeRDLHauUimHAVKp0Znfdg6Md6TgiNzZNzDwEOB4Nvv249SUBQy6cKlWqz7v6+s/mkyu//UbCBwqDw3pmBIRNuLxCQ2vqlp/qkPPfkDD4Qb4LdfVGo5cXl7e3LMHCm468D6Uy4WbxLvJyWMaPnuV8jgij4GJfzZxIx7310TOfnOcK61EOJ//omFtRwQXTu9Z5arIS0tr5fd4Cq3Em2j0quW6oR6l8CkVeBGJFFciEX/7AfXfv/HXAN7NzT0PQkDEAAAAAElFTkSuQmCC"
                  cb:open="[size=9]"
                  cb:close="[/size]"/>

        <menuitem label="=10"
                  class="menuitem-iconic"
                  image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAB2klEQVR42sSTPWhTcRTFf/+YmkqG1tjySDu4VZE6iI2TQ40fa3UQFSdNmoYHgSoKVhIR2qGmWId0CAmd1KHioNLJQSenFkSI0qGbVIeHkg+S5jXv/a+DRtLEThm82z0HLudwzlUiQjfjocvp+oC3HShOT1/AcWb6l5bOtOKzs4Vbtl1fbO4+X+/tVGr0SacCree3tR7fMs1EE8pktg7adn3RMIL3DCN4Hli17fr1ZHL95C4FP01zUMMJDViu+2AYMk3OMIKnEonhNYB0+sdKubwTAFCtKXw3zXxDhG2RaEUEEbkYyuVeAywsbN4tlYrpNr1juyzsiFyri9y34amI4MCjPxZipVIx7fP1zs/NjSlgtSOFr6Z5oyFSGMlmLQXPvEqhYeRDLHauUimHAVKp0Znfdg6Md6TgiNzZNzDwEOB4Nvv249SUBQy6cKlWqz7v6+s/mkyu//UbCBwqDw3pmBIRNuLxCQ2vqlp/qkPPfkDD4Qb4LdfVGo5cXl7e3LMHCm468D6Uy4WbxLvJyWMaPnuV8jgij4GJfzZxIx7310TOfnOcK61EOJ//omFtRwQXTu9Z5arIS0tr5fd4Cq3Em2j0quW6oR6l8CkVeBGJFFciEX/7AfXfv/HXAN7NzT0PQkDEAAAAAElFTkSuQmCC"
                  cb:open="[size=10]"
                  cb:close="[/size]"/>

        <menuitem label="=11"
                  class="menuitem-iconic"
                  image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAB2klEQVR42sSTPWhTcRTFf/+YmkqG1tjySDu4VZE6iI2TQ40fa3UQFSdNmoYHgSoKVhIR2qGmWId0CAmd1KHioNLJQSenFkSI0qGbVIeHkg+S5jXv/a+DRtLEThm82z0HLudwzlUiQjfjocvp+oC3HShOT1/AcWb6l5bOtOKzs4Vbtl1fbO4+X+/tVGr0SacCree3tR7fMs1EE8pktg7adn3RMIL3DCN4Hli17fr1ZHL95C4FP01zUMMJDViu+2AYMk3OMIKnEonhNYB0+sdKubwTAFCtKXw3zXxDhG2RaEUEEbkYyuVeAywsbN4tlYrpNr1juyzsiFyri9y34amI4MCjPxZipVIx7fP1zs/NjSlgtSOFr6Z5oyFSGMlmLQXPvEqhYeRDLHauUimHAVKp0Znfdg6Md6TgiNzZNzDwEOB4Nvv249SUBQy6cKlWqz7v6+s/mkyu//UbCBwqDw3pmBIRNuLxCQ2vqlp/qkPPfkDD4Qb4LdfVGo5cXl7e3LMHCm468D6Uy4WbxLvJyWMaPnuV8jgij4GJfzZxIx7310TOfnOcK61EOJ//omFtRwQXTu9Z5arIS0tr5fd4Cq3Em2j0quW6oR6l8CkVeBGJFFciEX/7AfXfv/HXAN7NzT0PQkDEAAAAAElFTkSuQmCC"
                  cb:open="[size=11]"
                  cb:close="[/size]"/>

        <menuitem label="=12"
                  class="menuitem-iconic"
                  image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAB2klEQVR42sSTPWhTcRTFf/+YmkqG1tjySDu4VZE6iI2TQ40fa3UQFSdNmoYHgSoKVhIR2qGmWId0CAmd1KHioNLJQSenFkSI0qGbVIeHkg+S5jXv/a+DRtLEThm82z0HLudwzlUiQjfjocvp+oC3HShOT1/AcWb6l5bOtOKzs4Vbtl1fbO4+X+/tVGr0SacCree3tR7fMs1EE8pktg7adn3RMIL3DCN4Hli17fr1ZHL95C4FP01zUMMJDViu+2AYMk3OMIKnEonhNYB0+sdKubwTAFCtKXw3zXxDhG2RaEUEEbkYyuVeAywsbN4tlYrpNr1juyzsiFyri9y34amI4MCjPxZipVIx7fP1zs/NjSlgtSOFr6Z5oyFSGMlmLQXPvEqhYeRDLHauUimHAVKp0Znfdg6Md6TgiNzZNzDwEOB4Nvv249SUBQy6cKlWqz7v6+s/mkyu//UbCBwqDw3pmBIRNuLxCQ2vqlp/qkPPfkDD4Qb4LdfVGo5cXl7e3LMHCm468D6Uy4WbxLvJyWMaPnuV8jgij4GJfzZxIx7310TOfnOcK61EOJ//omFtRwQXTu9Z5arIS0tr5fd4Cq3Em2j0quW6oR6l8CkVeBGJFFciEX/7AfXfv/HXAN7NzT0PQkDEAAAAAElFTkSuQmCC"
                  cb:open="[size=12]"
                  cb:close="[/size]"/>

        <menuitem label="=13"
                  class="menuitem-iconic"
                  image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAB2klEQVR42sSTPWhTcRTFf/+YmkqG1tjySDu4VZE6iI2TQ40fa3UQFSdNmoYHgSoKVhIR2qGmWId0CAmd1KHioNLJQSenFkSI0qGbVIeHkg+S5jXv/a+DRtLEThm82z0HLudwzlUiQjfjocvp+oC3HShOT1/AcWb6l5bOtOKzs4Vbtl1fbO4+X+/tVGr0SacCree3tR7fMs1EE8pktg7adn3RMIL3DCN4Hli17fr1ZHL95C4FP01zUMMJDViu+2AYMk3OMIKnEonhNYB0+sdKubwTAFCtKXw3zXxDhG2RaEUEEbkYyuVeAywsbN4tlYrpNr1juyzsiFyri9y34amI4MCjPxZipVIx7fP1zs/NjSlgtSOFr6Z5oyFSGMlmLQXPvEqhYeRDLHauUimHAVKp0Znfdg6Md6TgiNzZNzDwEOB4Nvv249SUBQy6cKlWqz7v6+s/mkyu//UbCBwqDw3pmBIRNuLxCQ2vqlp/qkPPfkDD4Qb4LdfVGo5cXl7e3LMHCm468D6Uy4WbxLvJyWMaPnuV8jgij4GJfzZxIx7310TOfnOcK61EOJ//omFtRwQXTu9Z5arIS0tr5fd4Cq3Em2j0quW6oR6l8CkVeBGJFFciEX/7AfXfv/HXAN7NzT0PQkDEAAAAAElFTkSuQmCC"
                  cb:open="[size=13]"
                  cb:close="[/size]"/>

        <menuitem label="=14"
                  class="menuitem-iconic"
                  image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAB2klEQVR42sSTPWhTcRTFf/+YmkqG1tjySDu4VZE6iI2TQ40fa3UQFSdNmoYHgSoKVhIR2qGmWId0CAmd1KHioNLJQSenFkSI0qGbVIeHkg+S5jXv/a+DRtLEThm82z0HLudwzlUiQjfjocvp+oC3HShOT1/AcWb6l5bOtOKzs4Vbtl1fbO4+X+/tVGr0SacCree3tR7fMs1EE8pktg7adn3RMIL3DCN4Hli17fr1ZHL95C4FP01zUMMJDViu+2AYMk3OMIKnEonhNYB0+sdKubwTAFCtKXw3zXxDhG2RaEUEEbkYyuVeAywsbN4tlYrpNr1juyzsiFyri9y34amI4MCjPxZipVIx7fP1zs/NjSlgtSOFr6Z5oyFSGMlmLQXPvEqhYeRDLHauUimHAVKp0Znfdg6Md6TgiNzZNzDwEOB4Nvv249SUBQy6cKlWqz7v6+s/mkyu//UbCBwqDw3pmBIRNuLxCQ2vqlp/qkPPfkDD4Qb4LdfVGo5cXl7e3LMHCm468D6Uy4WbxLvJyWMaPnuV8jgij4GJfzZxIx7310TOfnOcK61EOJ//omFtRwQXTu9Z5arIS0tr5fd4Cq3Em2j0quW6oR6l8CkVeBGJFFciEX/7AfXfv/HXAN7NzT0PQkDEAAAAAElFTkSuQmCC"
                  cb:open="[size=14]"
                  cb:close="[/size]"/>

      </menupopup>;
    
this. appendChild (custombuttonsUtils. makeXML (menu));
this. type = "menu";
this. orient = "horizontal";

this.handleClick = function(event) {
    var menuitem = event. target;
    var open = menuitem. getAttributeNS ("http://xsms.nm.ru/custombuttons/", "open");
    var close = menuitem. getAttributeNS ("http://xsms.nm.ru/custombuttons/", "close");

    if(event.button == 0) {
// Действие при клике ЛКМ
lbMouse(open,close);
    }
    else if(event.button == 1) {
        // Действие при клике СКМ
mbMouse (open,close);        
    }
    else if(event.button == 2 && !event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) {
        // Действие при клике ПКМ без модификаторов
rbMouse (open,close,readFromClipboard());
    }
};
this.oncontextmenu = function(event) {
    if(event.button == 2 && !event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) {
        // Блокируем контекстное меню при клике ПКМ без модификаторов
        event.preventDefault();
        event.stopPropagation();
    }
};

function lbMouse (open,close){
var theBox = document.commandDispatcher.focusedElement;
var startPos = theBox.selectionStart;
var endPos = theBox.selectionEnd;
var oPosition = theBox.scrollTop;
var oHeight = theBox.scrollHeight;
var text=theBox.value.substring(0,startPos);
text +=open+theBox.value.substring(startPos, endPos)+close;
text +=theBox.value.substring(endPos, theBox.value.length);
theBox.value = text;
var nHeight = theBox.scrollHeight - oHeight;
theBox.scrollTop = oPosition + nHeight;
};

function mbMouse (open,close) {};

function rbMouse (open,close,paste){
if (paste.length == 0)  { open +=close; }
   else                 { open +=paste+close; }
   
var theBox = document.commandDispatcher.focusedElement;
var startPos = theBox.selectionStart;
var endPos = theBox.selectionEnd;
var selectionLen = endPos - startPos
var oPosition = theBox.scrollTop;
var oHeight = theBox.scrollHeight;
var text=theBox.value.substring(0,startPos); 
var nHeight = theBox.scrollHeight - oHeight;
text +=open;
text +=theBox.value.substring(endPos, theBox.value.length);
theBox.value = text; 
theBox.selectionStart = endPos + open.length;
theBox.selectionEnd = endPos + open.length - selectionLen;
theBox.scrollTop = oPosition + nHeight;
};

PS Да, насчёт табличного расположения, то тут нужна форма (метод) и надо XUL смотреть, а лучше спросить у Anton, он сразу скажет можно или нет...

Отредактировано Indomito (20-07-2010 21:48:29)


"Никогда не выявляйте в программе ошибки, если не знаете, что с ними дальше делать." Штейнбах

Отсутствует

 

№182520-07-2010 21:50:23

iDev.Pi
баг-репортёр
 
Группа: Extensions
Зарегистрирован: 31-01-2010
Сообщений: 2718
UA: Mozilla 2.0

Re: Custom Buttons

Indomito
это ссылки на сайты. А мне надо запуск программ из фф - там вроде код совсем другой - смотри мой последний линк 2 сообщения назад.


mzfx

Отсутствует

 

Board footer

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