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

Список ответов на каверзные вопросы можно получить в FAQ-разделе форума.

№287603-08-2011 20:48:35

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

Re: Custom Buttons

bunda1 пишет

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

Баг заметил: кнопка перебивает хоткей для Консоли Ошибок (ctrl+shift+J), поправь его, пожалуйста.
Ну и если можно, то за одно попробуй пофиксить баг описанный мной пару постов назад.

Добавлено 03-08-2011 20:54:13
Anton
А как насчёт добавления какого-то места в настройках CB, куда можно было бы вписывать коды инициализаций? А то есть вещи, которые оформляют в виде кнопки с инициализацией даже тогда, когда сама кнопка не нужна, но чтобы код из инициализации исполнялся - приходится держать её на панели, либо подсовывать этот код в другие кнопки, что приводит к путанице (легко забыть куда чего засунул).

Отредактировано iDev.Pi (03-08-2011 20:54:13)


mzfx

Отсутствует

 

№287703-08-2011 21:58:21

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 3.6

Re: Custom Buttons

iDev.Pi пишет

Баг заметил: кнопка перебивает хоткей для Консоли Ошибок (ctrl+shift+J), поправь его, пожалуйста.

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

Выделить код

Код:

//FindBar, сочетания клавиш(Key config).........................................................
addEventListener('keydown', function (event){

//FindBar(ctrl+ F)показать - скрыть(Toggle Find Bar).........
if ((event.keyCode==0x46)&&(event.ctrlKey))
{
event.preventDefault();
event.stopPropagation();
gFindBar.startFind(gFindBar.FIND_TYPEAHEAD);
gFindBar._setFindCloseTimeout();}

//Findbar(ctrl+ ALT), поиск по странице из буфера обмена, find from clipboard.............
if ((event.keyCode==0x12)&&(event.ctrlKey))
{
gFindBar.startFind(gFindBar.FIND_TYPEAHEAD);
gFindBar._setFindCloseTimeout();
goDoCommand("cmd_selectNone");
goDoCommand("cmd_paste");}

//FindBar, закрыть любой клавишей клавиатуры(FindBar close, Any key keyboard)..
//else{gFindBar.close();}
}, false);


//find bar, показать количество совпадений(find bar,show the number of matches)....................
(function() {
    //add label to findbar
    var status = document.getAnonymousElementByAttribute(gFindBar, 'anonid', 'match-case-status');
    var sep = document.createElement("toolbarspacer");
    var count = document.createElement("label");
    count.hidden = true;
    status.parentNode.insertBefore(sep, status);
    status.parentNode.insertBefore(count, status);//findbar-container


    gFindBar.__proto__._foundMatches = count;
    
    gFindBar.__proto__._updateMatchesCount = function(aRes) {
        if (!this._updateMatchCountTimeout)
            window.clearTimeout(this._updateMatchCountTimeout);
        this._updateMatchCountTimeout =
                window.setTimeout(function(aRes, aSelf) {
                    aSelf._updateMatchesCountWorker(aRes);
                }, 0, aRes, this);
    }

    gFindBar.__proto__._updateMatchesCountWorker = function(aRes) {
        var word = this._findField.value;
        if (aRes == this.nsITypeAheadFind.FIND_NOTFOUND || !word) {
            this._foundMatches.hidden = true;
            this._foundMatches.value = "";
        }
        else {
            var matchesCount = this._countMatches(word).toString();
            if (matchesCount != "0") {
                if (matchesCount == "1")
                    this._foundMatches.value = matchesCount +" \hits ";
                else if (matchesCount == "-1") {
                    var matchLimit = 100;
                    this._foundMatches.value = " \> 100 hits";
                    //                    var key = (matchLimit > 1000) ? "Decrease" : "Increase";
                } else
                    this._foundMatches.value = matchesCount +" \hits";
                this._foundMatches.hidden = false;
            }
            else {
                this._foundMatches.hidden = true;
                this._foundMatches.value = "";
            }

            window.clearTimeout(this._updateMatchCountTimeout);
        }
    }

    gFindBar.__proto__._countMatches = function(aWord, aWindow) {
        var win = aWindow || this.browser.contentWindow;

        var countFound = 0;
        for (var i = 0, count; win.frames && i < win.frames.length; i++) {
            if ((count = this._countMatches(aWord, win.frames[i])) != -1)
                countFound += count;
            else
                return count;
        }

        var doc = win.document;
        if (!doc || !(doc instanceof HTMLDocument))
            return countFound;

        var body = doc.body;

        var count = body.childNodes.length;
        var searchRange = doc.createRange();
        var startPt = doc.createRange();
        var endPt = doc.createRange();

        searchRange.setStart(body, 0);
        searchRange.setEnd(body, count);

        startPt.setStart(body, 0);
        startPt.setEnd(body, 0);
        endPt.setStart(body, count);
        endPt.setEnd(body, count);

        var retRange = null;
        var finder = Components.classes["@mozilla.org/embedcomp/rangefind;1"]
                .createInstance()
                .QueryInterface(Components.interfaces.nsIFind);

        finder.caseSensitive = this._shouldBeCaseSensitive(aWord);

        var matchLimit = 100;
        while ((retRange = finder.Find(aWord, searchRange, startPt, endPt))) {
            if (this._rangeIsVisible(retRange, win)) {
                if (this._findMode == this.FIND_LINKS) {
                    if (this._rangeStartsInLink(retRange))
                        ++ countFound;
                }
                else
                    ++ countFound;
            }
            if (countFound == matchLimit) {
                countFound = -1;
                break;
            }
            startPt = doc.createRange();
            startPt.setStart(retRange.startContainer, retRange.startOffset + 1);
        }

        return countFound;
    }

    gFindBar.__proto__._rangeIsVisible = function(aRange, aWindow) {
        var node = aRange.startContainer;

        if (node.nodeType == node.ELEMENT_NODE) {
            if (node.hasChildNodes) {
                var childNode = node.childNodes[aRange.startOffset];
                if (childNode)
                    node = childNode;
            }
        }

        while (node && node.nodeType != node.ELEMENT_NODE)
            node = node.parentNode;

        // There is no perfect way to check if a node is visible in JavaScript,
        // so use the best measures we can have
        if (node) {
            var style = aWindow.getComputedStyle(node, "");
            if (style) {
                if (style.visibility == "hidden" ||
                        style.visibility == "collapse" ||
                        style.display == "none")
                    return false;
                if (style.left != "auto" && style.width != "auto")
                    if (style.left < 0 && style.left + style.width < 0)
                        return false;
                if (style.top != "auto" && style.height != "auto")
                    if (style.top < 0 && style.top + style.height < 0)
                        return false;
            }
        }

        return true;
    }

    gFindBar.__proto__._rangeStartsInLink = function(aRange) {
        var isInsideLink = false;

        var node = aRange.startContainer;

        if (node.nodeType == node.ELEMENT_NODE) {
            if (node.hasChildNodes) {
                var childNode = node.childNodes[aRange.startOffset];
                if (childNode)
                    node = childNode;
            }
        }

        const XLink_NS = "http://www.w3.org/1999/xlink";
        do {
            if (node instanceof HTMLAnchorElement) {
                isInsideLink = node.hasAttribute("href");
                break;
            }
            else if (typeof node.hasAttributeNS == "function" &&
                    node.hasAttributeNS(XLink_NS, "href")) {
                isInsideLink = (node.getAttributeNS(XLink_NS, "type") == "simple");
                break;
            }

            node = node.parentNode;
        } while (node);

        return isInsideLink;
    }

    //insert count function to original
    eval("gFindBar._updateCaseSensitivity=" + gFindBar._updateCaseSensitivity.toString().slice(0, -1) + "this._updateMatchesCount();}");
    eval("gFindBar._updateStatusUI=" + gFindBar._updateStatusUI.toString().slice(0, -1) + "this._updateMatchesCount();}");
})();



// FindBar "/" style....................................................................... 
var sId = "__customButtonsStyle__" + this.id; // Unique style "id"
var cssStr = <><![CDATA[

#FindToolbar > .findbar-container > * { display: -moz-box !important; }

    ]]></>
    .toString()
    .replace(/%button%/g, "#" + this.id);

function sheet(cssStr, removeFlag) {
    var cc = Components.classes;
    var sss = cc["@mozilla.org/content/style-sheet-service;1"]
        .getService(Components.interfaces.nsIStyleSheetService);
    var ios = cc["@mozilla.org/network/io-service;1"]
        .getService(Components.interfaces.nsIIOService);
    var data = "data:text/css," + encodeURIComponent(cssStr);
    var uri = ios.newURI(data, null, null);
    if(sss.sheetRegistered(uri, sss.AGENT_SHEET))
        sss.unregisterSheet(uri, sss.AGENT_SHEET);
    if(removeFlag)
        return;
    sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET);
    window[sId] = cssStr;
}
if(!(sId in window))
    sheet(cssStr);
else if(window[sId] != cssStr) {
    sheet(window[sId], true);
    sheet(cssStr);
}

iDev.Pi пишет

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

Извини, но я не понял до конца чём проблема. Может языковой барьер.:/
Напиши еще раз.

Отсутствует

 

№287803-08-2011 22:52:59

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

Re: Custom Buttons

iDev.Pi пишет

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

Там вся архитектура привязана к кнопкам – для инициализации должен сработать конструктор binding'а, редактор тоже работает напрямую с кнопками.
В качестве альтернативы есть userChromeJS, но там все в кучу. :) Или нужен скрипт-загрузчик.


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

Отсутствует

 

№287904-08-2011 02:46:24

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

Re: Custom Buttons

bunda1 пишет

Извини, но я не понял до конца чём проблема. Может языковой барьер.:/
Напиши еще раз.

Оок, попробую изложить суть своих требований по пунктам:
1. Хоткей переделать с ctrl+alt на ctrl+alt+f (я так понял - пока у тебя это просто не получается накодить, я этот пункт пишу для других, если кто возьмётся).
2. Баг. STR: a). выделить что-то на странице
b). ctrl+c
с). не снимаем выделения с текста на странице
d). ctrl+f
Результат: текст из буфера обмена вставляется в сёрчбар.
Ожидаемый результат: текст из буфера обмена не вставляется в сёрчбар.
Комментарий: если в пункте c). мы снимем выделение с текста - баг не воспроизводится.
3. Предыдущий баг натолкнул на мысль использовать его во благо, т.е. приделать фичу: при нажатии ctrl+alt+f должна делаться проверка: "выделено ли что-нибудь на странице?" - если "да", то "открыть поиск + вставить в поле поиска выделенное", а если "нет" - то "открыть поиск + вставить в поле поиска текст из буфера".

Твой последний код попробовал - баг исчез, спасибо.

Добавлено 04-08-2011 02:52:07

Infocatcher пишет

Там вся архитектура привязана к кнопкам – для инициализации должен сработать конструктор binding'а, редактор тоже работает напрямую с кнопками.

Ну можно же сделать эмуляцию создания кнопок, даже не эмуляцию, а просто создание с пометкой, что они без физической кнопки на тулбаре. К кнопкам с такой пометкой должен применяться стиль display:none, а коды инициализаций таких кнопок надо было бы в Менеджер Дополнений в раздел "КБ кнопки", который, я надеюсь, Anton всё-таки приделает, где будут хотя бы просто списком все установленные кнопки (а ещё лучше с возможностью редактирования их прям оттуда), а так же наши кнопки с пометкой.

Отредактировано iDev.Pi (04-08-2011 02:52:07)


mzfx

Отсутствует

 

№288004-08-2011 19:06:21

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

Re: Custom Buttons

Anton
А как насчёт добавления какого-то места в настройках CB, куда можно было бы вписывать коды инициализаций? А то есть вещи, которые оформляют в виде кнопки с инициализацией даже тогда, когда сама кнопка не нужна, но чтобы код из инициализации исполнялся - приходится держать её на панели, либо подсовывать этот код в другие кнопки, что приводит к путанице (легко забыть куда чего засунул).

В todo записано давно. Сейчас, к сожалению, руки не доходят до гораздо более актуальных вещей.


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

Отсутствует

 

№288104-08-2011 23:58:49

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 3.6

Re: Custom Buttons

iDev.Pi пишет

1. Хоткей переделать с ctrl+alt на ctrl+alt+f.

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

Выделить код

Код:

//FindBar, сочетания клавиш(Key config).........................................................
addEventListener('keydown', function (event){

//FindBar(ctrl+ F)показать - скрыть(Toggle Find Bar).........
if (event.altKey == false)
{
if ((event.keyCode==0x46)&&(event.ctrlKey))
{
event.preventDefault();
event.stopPropagation();
gFindBar.startFind(gFindBar.FIND_TYPEAHEAD);
gFindBar._setFindCloseTimeout();}}

//Findbar(ctrl+ ALT), поиск по странице из буфера обмена, find from clipboard.............
if (event.altKey == true)
{
if ((event.keyCode==0x46)&&(event.ctrlKey))
{
gFindBar.startFind(gFindBar.FIND_TYPEAHEAD);
gFindBar._setFindCloseTimeout();
goDoCommand("cmd_selectNone");
goDoCommand("cmd_paste");}}

//FindBar, закрыть любой клавишей клавиатуры(FindBar close, Any key keyboard)..
//else{gFindBar.close();}
}, false);


//find bar, показать количество совпадений(find bar,show the number of matches)....................
(function() {
    //add label to findbar
    var status = document.getAnonymousElementByAttribute(gFindBar, 'anonid', 'match-case-status');
    var sep = document.createElement("toolbarspacer");
    var count = document.createElement("label");
    count.hidden = true;
    status.parentNode.insertBefore(sep, status);
    status.parentNode.insertBefore(count, status);//findbar-container


    gFindBar.__proto__._foundMatches = count;
    
    gFindBar.__proto__._updateMatchesCount = function(aRes) {
        if (!this._updateMatchCountTimeout)
            window.clearTimeout(this._updateMatchCountTimeout);
        this._updateMatchCountTimeout =
                window.setTimeout(function(aRes, aSelf) {
                    aSelf._updateMatchesCountWorker(aRes);
                }, 0, aRes, this);
    }

    gFindBar.__proto__._updateMatchesCountWorker = function(aRes) {
        var word = this._findField.value;
        if (aRes == this.nsITypeAheadFind.FIND_NOTFOUND || !word) {
            this._foundMatches.hidden = true;
            this._foundMatches.value = "";
        }
        else {
            var matchesCount = this._countMatches(word).toString();
            if (matchesCount != "0") {
                if (matchesCount == "1")
                    this._foundMatches.value = matchesCount +" \hits ";
                else if (matchesCount == "-1") {
                    var matchLimit = 100;
                    this._foundMatches.value = " \> 100 hits";
                    //                    var key = (matchLimit > 1000) ? "Decrease" : "Increase";
                } else
                    this._foundMatches.value = matchesCount +" \hits";
                this._foundMatches.hidden = false;
            }
            else {
                this._foundMatches.hidden = true;
                this._foundMatches.value = "";
            }

            window.clearTimeout(this._updateMatchCountTimeout);
        }
    }

    gFindBar.__proto__._countMatches = function(aWord, aWindow) {
        var win = aWindow || this.browser.contentWindow;

        var countFound = 0;
        for (var i = 0, count; win.frames && i < win.frames.length; i++) {
            if ((count = this._countMatches(aWord, win.frames[i])) != -1)
                countFound += count;
            else
                return count;
        }

        var doc = win.document;
        if (!doc || !(doc instanceof HTMLDocument))
            return countFound;

        var body = doc.body;

        var count = body.childNodes.length;
        var searchRange = doc.createRange();
        var startPt = doc.createRange();
        var endPt = doc.createRange();

        searchRange.setStart(body, 0);
        searchRange.setEnd(body, count);

        startPt.setStart(body, 0);
        startPt.setEnd(body, 0);
        endPt.setStart(body, count);
        endPt.setEnd(body, count);

        var retRange = null;
        var finder = Components.classes["@mozilla.org/embedcomp/rangefind;1"]
                .createInstance()
                .QueryInterface(Components.interfaces.nsIFind);

        finder.caseSensitive = this._shouldBeCaseSensitive(aWord);

        var matchLimit = 100;
        while ((retRange = finder.Find(aWord, searchRange, startPt, endPt))) {
            if (this._rangeIsVisible(retRange, win)) {
                if (this._findMode == this.FIND_LINKS) {
                    if (this._rangeStartsInLink(retRange))
                        ++ countFound;
                }
                else
                    ++ countFound;
            }
            if (countFound == matchLimit) {
                countFound = -1;
                break;
            }
            startPt = doc.createRange();
            startPt.setStart(retRange.startContainer, retRange.startOffset + 1);
        }

        return countFound;
    }

    gFindBar.__proto__._rangeIsVisible = function(aRange, aWindow) {
        var node = aRange.startContainer;

        if (node.nodeType == node.ELEMENT_NODE) {
            if (node.hasChildNodes) {
                var childNode = node.childNodes[aRange.startOffset];
                if (childNode)
                    node = childNode;
            }
        }

        while (node && node.nodeType != node.ELEMENT_NODE)
            node = node.parentNode;

        // There is no perfect way to check if a node is visible in JavaScript,
        // so use the best measures we can have
        if (node) {
            var style = aWindow.getComputedStyle(node, "");
            if (style) {
                if (style.visibility == "hidden" ||
                        style.visibility == "collapse" ||
                        style.display == "none")
                    return false;
                if (style.left != "auto" && style.width != "auto")
                    if (style.left < 0 && style.left + style.width < 0)
                        return false;
                if (style.top != "auto" && style.height != "auto")
                    if (style.top < 0 && style.top + style.height < 0)
                        return false;
            }
        }

        return true;
    }

    gFindBar.__proto__._rangeStartsInLink = function(aRange) {
        var isInsideLink = false;

        var node = aRange.startContainer;

        if (node.nodeType == node.ELEMENT_NODE) {
            if (node.hasChildNodes) {
                var childNode = node.childNodes[aRange.startOffset];
                if (childNode)
                    node = childNode;
            }
        }

        const XLink_NS = "http://www.w3.org/1999/xlink";
        do {
            if (node instanceof HTMLAnchorElement) {
                isInsideLink = node.hasAttribute("href");
                break;
            }
            else if (typeof node.hasAttributeNS == "function" &&
                    node.hasAttributeNS(XLink_NS, "href")) {
                isInsideLink = (node.getAttributeNS(XLink_NS, "type") == "simple");
                break;
            }

            node = node.parentNode;
        } while (node);

        return isInsideLink;
    }

    //insert count function to original
    eval("gFindBar._updateCaseSensitivity=" + gFindBar._updateCaseSensitivity.toString().slice(0, -1) + "this._updateMatchesCount();}");
    eval("gFindBar._updateStatusUI=" + gFindBar._updateStatusUI.toString().slice(0, -1) + "this._updateMatchesCount();}");
})();



// FindBar "/" style....................................................................... 
var sId = "__customButtonsStyle__" + this.id; // Unique style "id"
var cssStr = <><![CDATA[

#FindToolbar > .findbar-container > * { display: -moz-box !important; }

    ]]></>
    .toString()
    .replace(/%button%/g, "#" + this.id);

function sheet(cssStr, removeFlag) {
    var cc = Components.classes;
    var sss = cc["@mozilla.org/content/style-sheet-service;1"]
        .getService(Components.interfaces.nsIStyleSheetService);
    var ios = cc["@mozilla.org/network/io-service;1"]
        .getService(Components.interfaces.nsIIOService);
    var data = "data:text/css," + encodeURIComponent(cssStr);
    var uri = ios.newURI(data, null, null);
    if(sss.sheetRegistered(uri, sss.AGENT_SHEET))
        sss.unregisterSheet(uri, sss.AGENT_SHEET);
    if(removeFlag)
        return;
    sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET);
    window[sId] = cssStr;
}
if(!(sId in window))
    sheet(cssStr);
else if(window[sId] != cssStr) {
    sheet(window[sId], true);
    sheet(cssStr);
}

iDev.Pi пишет

Оок, попробую изложить суть своих требований по пунктам:

2. Баг. STR: a). выделить что-то на странице
b). ctrl+c
с). не снимаем выделения с текста на странице
d). ctrl+f
Результат: текст из буфера обмена вставляется в сёрчбар.
Ожидаемый результат: текст из буфера обмена не вставляется в сёрчбар.
Комментарий: если в пункте c). мы снимем выделение с текста - баг не воспроизводится.
3. Предыдущий баг натолкнул на мысль использовать его во благо, т.е. приделать фичу: при нажатии ctrl+alt+f должна делаться проверка: "выделено ли что-нибудь на странице?" - если "да", то "открыть поиск + вставить в поле поиска выделенное", а если "нет" - то "открыть поиск + вставить в поле поиска текст из буфера".

попробуй
1. выделить что-то на странице,
2. ctrl+c,
3. не снимаем выделения с текста на странице,
4. выделить что-то на другой странице,
5. ctrl+f  на другой странице,

Отредактировано bunda1 (05-08-2011 01:03:00)

Отсутствует

 

№288205-08-2011 01:57:16

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

Re: Custom Buttons

bunda1 пишет

попробуй
1. выделить что-то на странице,
2. ctrl+c,
3. не снимаем выделения с текста на странице,
4. выделить что-то на другой странице,
5. ctrl+f  на другой странице,

В поиск вставляется выделенный текст. это типа не баг, а фича? Оок, хотя я бы в таком случае хотел бы ей на CTRL+ALT+F повесить, хотя теперь когда я понял суть этой фичи - может и с CTRL+F привыкну.


mzfx

Отсутствует

 

№288305-08-2011 19:48:59

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 3.6

Re: Custom Buttons

iDev.Pi
вот все как ты хотел, оказалось что сделать это было не так уж и трудно.
1. Хоткей переделать с ctrl+alt на ctrl+alt+f,
2. фичa: при нажатии ctrl+alt+f должна делаться проверка: "выделено ли что-нибудь на странице?" - если "да", то "открыть поиск + вставить в поле поиска выделенное", а если "нет" - то "открыть поиск + вставить в поле поиска текст из буфера".

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

Выделить код

Код:

//FindBar, сочетания клавиш(Key config).........................................................
addEventListener('keydown', function (event){

//FindBar(ctrl+ F)показать - скрыть(Toggle Find Bar).........
if (event.altKey == false)
{
if ((event.keyCode==0x46)&&(event.ctrlKey))
{
event.preventDefault();
event.stopPropagation();
gFindBar.startFind(gFindBar.FIND_TYPEAHEAD);
gFindBar._setFindCloseTimeout();}}

//Findbar(ctrl+ ALT+ F), поиск по странице из буфера обмена, find from clipboard.............
if (event.altKey == true)
{
if ((event.keyCode==0x46)&&(event.ctrlKey))
{
var t = content.getSelection().toString();
if(t) 
{
gFindBar.startFind(gFindBar.FIND_TYPEAHEAD);
gFindBar._setFindCloseTimeout();}
else{
gFindBar.startFind(gFindBar.FIND_TYPEAHEAD);
gFindBar._setFindCloseTimeout();
goDoCommand("cmd_selectNone");
goDoCommand("cmd_paste");}}}

//FindBar, закрыть любой клавишей клавиатуры(FindBar close, Any key keyboard)..
//else{gFindBar.close();}
}, false);


//find bar, показать количество совпадений(find bar,show the number of matches)....................
(function() {
    //add label to findbar
    var status = document.getAnonymousElementByAttribute(gFindBar, 'anonid', 'match-case-status');
    var sep = document.createElement("toolbarspacer");
    var count = document.createElement("label");
    count.hidden = true;
    status.parentNode.insertBefore(sep, status);
    status.parentNode.insertBefore(count, status);//findbar-container


    gFindBar.__proto__._foundMatches = count;
    
    gFindBar.__proto__._updateMatchesCount = function(aRes) {
        if (!this._updateMatchCountTimeout)
            window.clearTimeout(this._updateMatchCountTimeout);
        this._updateMatchCountTimeout =
                window.setTimeout(function(aRes, aSelf) {
                    aSelf._updateMatchesCountWorker(aRes);
                }, 0, aRes, this);
    }

    gFindBar.__proto__._updateMatchesCountWorker = function(aRes) {
        var word = this._findField.value;
        if (aRes == this.nsITypeAheadFind.FIND_NOTFOUND || !word) {
            this._foundMatches.hidden = true;
            this._foundMatches.value = "";
        }
        else {
            var matchesCount = this._countMatches(word).toString();
            if (matchesCount != "0") {
                if (matchesCount == "1")
                    this._foundMatches.value = matchesCount +" \hits ";
                else if (matchesCount == "-1") {
                    var matchLimit = 100;
                    this._foundMatches.value = " \> 100 hits";
                    //                    var key = (matchLimit > 1000) ? "Decrease" : "Increase";
                } else
                    this._foundMatches.value = matchesCount +" \hits";
                this._foundMatches.hidden = false;
            }
            else {
                this._foundMatches.hidden = true;
                this._foundMatches.value = "";
            }

            window.clearTimeout(this._updateMatchCountTimeout);
        }
    }

    gFindBar.__proto__._countMatches = function(aWord, aWindow) {
        var win = aWindow || this.browser.contentWindow;

        var countFound = 0;
        for (var i = 0, count; win.frames && i < win.frames.length; i++) {
            if ((count = this._countMatches(aWord, win.frames[i])) != -1)
                countFound += count;
            else
                return count;
        }

        var doc = win.document;
        if (!doc || !(doc instanceof HTMLDocument))
            return countFound;

        var body = doc.body;

        var count = body.childNodes.length;
        var searchRange = doc.createRange();
        var startPt = doc.createRange();
        var endPt = doc.createRange();

        searchRange.setStart(body, 0);
        searchRange.setEnd(body, count);

        startPt.setStart(body, 0);
        startPt.setEnd(body, 0);
        endPt.setStart(body, count);
        endPt.setEnd(body, count);

        var retRange = null;
        var finder = Components.classes["@mozilla.org/embedcomp/rangefind;1"]
                .createInstance()
                .QueryInterface(Components.interfaces.nsIFind);

        finder.caseSensitive = this._shouldBeCaseSensitive(aWord);

        var matchLimit = 100;
        while ((retRange = finder.Find(aWord, searchRange, startPt, endPt))) {
            if (this._rangeIsVisible(retRange, win)) {
                if (this._findMode == this.FIND_LINKS) {
                    if (this._rangeStartsInLink(retRange))
                        ++ countFound;
                }
                else
                    ++ countFound;
            }
            if (countFound == matchLimit) {
                countFound = -1;
                break;
            }
            startPt = doc.createRange();
            startPt.setStart(retRange.startContainer, retRange.startOffset + 1);
        }

        return countFound;
    }

    gFindBar.__proto__._rangeIsVisible = function(aRange, aWindow) {
        var node = aRange.startContainer;

        if (node.nodeType == node.ELEMENT_NODE) {
            if (node.hasChildNodes) {
                var childNode = node.childNodes[aRange.startOffset];
                if (childNode)
                    node = childNode;
            }
        }

        while (node && node.nodeType != node.ELEMENT_NODE)
            node = node.parentNode;

        // There is no perfect way to check if a node is visible in JavaScript,
        // so use the best measures we can have
        if (node) {
            var style = aWindow.getComputedStyle(node, "");
            if (style) {
                if (style.visibility == "hidden" ||
                        style.visibility == "collapse" ||
                        style.display == "none")
                    return false;
                if (style.left != "auto" && style.width != "auto")
                    if (style.left < 0 && style.left + style.width < 0)
                        return false;
                if (style.top != "auto" && style.height != "auto")
                    if (style.top < 0 && style.top + style.height < 0)
                        return false;
            }
        }

        return true;
    }

    gFindBar.__proto__._rangeStartsInLink = function(aRange) {
        var isInsideLink = false;

        var node = aRange.startContainer;

        if (node.nodeType == node.ELEMENT_NODE) {
            if (node.hasChildNodes) {
                var childNode = node.childNodes[aRange.startOffset];
                if (childNode)
                    node = childNode;
            }
        }

        const XLink_NS = "http://www.w3.org/1999/xlink";
        do {
            if (node instanceof HTMLAnchorElement) {
                isInsideLink = node.hasAttribute("href");
                break;
            }
            else if (typeof node.hasAttributeNS == "function" &&
                    node.hasAttributeNS(XLink_NS, "href")) {
                isInsideLink = (node.getAttributeNS(XLink_NS, "type") == "simple");
                break;
            }

            node = node.parentNode;
        } while (node);

        return isInsideLink;
    }

    //insert count function to original
    eval("gFindBar._updateCaseSensitivity=" + gFindBar._updateCaseSensitivity.toString().slice(0, -1) + "this._updateMatchesCount();}");
    eval("gFindBar._updateStatusUI=" + gFindBar._updateStatusUI.toString().slice(0, -1) + "this._updateMatchesCount();}");
})();



// QuickFind стиль(style)....................................................................... 
var sId = "__customButtonsStyle__" + this.id; // Unique style "id"
var cssStr = <><![CDATA[

#FindToolbar > .findbar-container > * { display: -moz-box !important; }

    ]]></>
    .toString()
    .replace(/%button%/g, "#" + this.id);

function sheet(cssStr, removeFlag) {
    var cc = Components.classes;
    var sss = cc["@mozilla.org/content/style-sheet-service;1"]
        .getService(Components.interfaces.nsIStyleSheetService);
    var ios = cc["@mozilla.org/network/io-service;1"]
        .getService(Components.interfaces.nsIIOService);
    var data = "data:text/css," + encodeURIComponent(cssStr);
    var uri = ios.newURI(data, null, null);
    if(sss.sheetRegistered(uri, sss.AGENT_SHEET))
        sss.unregisterSheet(uri, sss.AGENT_SHEET);
    if(removeFlag)
        return;
    sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET);
    window[sId] = cssStr;
}
if(!(sId in window))
    sheet(cssStr);
else if(window[sId] != cssStr) {
    sheet(window[sId], true);
    sheet(cssStr);
}

Отредактировано bunda1 (05-08-2011 19:52:51)

Отсутствует

 

№288405-08-2011 20:47:55

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

Re: Custom Buttons

bunda1
спасибо огромнейшее :)


mzfx

Отсутствует

 

№288506-08-2011 02:35:24

middlemouse.paste
Участник
 
Группа: Members
Зарегистрирован: 10-07-2011
Сообщений: 21
UA: Firefox 5.0

Re: Custom Buttons

Кто нибудь знает id оранжевой кнопки с надписью "Firefox" в правом верхнем углу [firefox]?
Хочу написать код, аналогичный коду сокрытия панели меню http://forum.mozilla-russia.org/viewtop … 44#p385744, а id не знаю. И еще может кто знает как можно на этой кнопке текст поменять, например написать "Пуск" или просто "F"?

Отсутствует

 

№288606-08-2011 03:55:51

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

Re: Custom Buttons

#appmenu-button


mzfx

Отсутствует

 

№288706-08-2011 04:11:53

Крошка Ру
Участник
 
Группа: Extensions
Зарегистрирован: 19-10-2008
Сообщений: 8718
UA: Aurora 7.0

Re: Custom Buttons

...как можно на этой кнопке текст поменять, например написать "Пуск" или просто "F"?

middlemouse.paste
пост №303

пост №1628

Оранжевая кнопка, изменить её :)

Добавлено 06-08-2011 04:26:52
... и ещё можно довольно много найти , если в встроенный поиск от Google вбить appmenu-button

Отредактировано Крошка Ру (06-08-2011 04:26:52)

Отсутствует

 

№288806-08-2011 04:33:54

middlemouse.paste
Участник
 
Группа: Members
Зарегистрирован: 10-07-2011
Сообщений: 21
UA: Firefox 5.0

Re: Custom Buttons

iDev.Pi
Крошка Ру
Спасибо! Кнопочку скрыл. Сэкономил место.

Отсутствует

 

№288910-08-2011 09:39:10

Йцукен
  
 
Группа: Extensions
Зарегистрирован: 05-06-2008
Сообщений: 4799
UA: Firefox 5.0

Re: Custom Buttons

middlemouse.paste

middlemouse.paste пишет

И еще может кто знает как можно на этой кнопке текст поменять […] просто "F"?

Именно так (и не только так) можно сделать с помощью Hide Caption Titlebar Plus, а есть ещё множество вариантов (вот некоторые), в том числе более красивых — со значком [firefox] вместо надписи, причём у меня в Виндовс место куда лучше экономится, когда кнопочка есть (а в линуксе — Убунту всё по другому).

Отсутствует

 

№289011-08-2011 02:32:20

slbgz
Забанен
 
Группа: Members
Зарегистрирован: 27-06-2011
Сообщений: 246
UA: Firefox 5.0

Re: Custom Buttons

А еще лучше скрывается кнопка и экономится место - целый заголовок - этим:http://forum.mozilla-russia.org/viewtop … 46#p416246
... а Меню организовывается другой кнопочкой(-ами) в любом удобном месте. :)

Отредактировано slbgz (11-08-2011 02:32:51)

Отсутствует

 

№289111-08-2011 11:41:53

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 3.6

Re: Custom Buttons

Anton
Караул, сечас пытаюс перейти на FF5 и оказалось что если открыть Настройка панелей инструментов многии коди начинают выполняться два раза, особено те которые связани с табамы.
Вот например такой простой код начинает закрывать сразу две вкладки.

Выделить код

Код:

// close Tab By Double Click

(function()
{
    var mouseDoubleClickHandler = function(event)
    {
        if (event.button != 0) return;
        event.preventDefault();
        event.stopPropagation();
        if (event.target.localName != "tab") return;
        if ((gBrowser.mTabContainer.childNodes.length <= 1) && (gBrowser.currentURI.spec == "about:blank")) return;
        gBrowser.removeCurrentTab();
    };
    gBrowser.mTabContainer.addEventListener("dblclick", mouseDoubleClickHandler, false);
})()

Что делать и в чем тут дело.

Отредактировано bunda1 (11-08-2011 12:34:53)

Отсутствует

 

№289211-08-2011 14:16:41

slbgz
Забанен
 
Группа: Members
Зарегистрирован: 27-06-2011
Сообщений: 246
UA: unknown 0.0

Re: Custom Buttons

bunda1, «перейти» это - путем апгрейда существующего профиля? А если деинсталировать 3.6 и устанавливать 5.0 с нуля, включая все расширения и кнопки?

Отсутствует

 

№289311-08-2011 15:31:50

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 3.6

Re: Custom Buttons

slbgz
1. у меня деинсталлировать нечего, потому что использую портабле,
2. эта проблема на чистом профиле, с одним расширением Custom Buttons

У тебя таких проблем нет эсли открыть и закрыть Настройка панелей инструментов ?

Отсутствует

 

№289411-08-2011 15:32:29

slbgz
Забанен
 
Группа: Members
Зарегистрирован: 27-06-2011
Сообщений: 246
UA: Google 2.1

Re: Custom Buttons

Я попробовал откатиться с 5.0 на 4.0 - заглючило почти все, :lol: только некоторые кнопки работали. Все дело - в способе «отката». (тоже - портабельный, но - свой...)

Добавлено 11-08-2011 15:38:07

bunda1 пишет

У тебя таких проблем нет эсли открыть и закрыть Настройка панелей инструментов ?

Есть одна небольшая проблемка - не всегда после открытия/закрытия срабатывает правильно ТoggleToolbars. Не знаю из-за чего, но меня это не напрягает, все остальное работает без проблем.

Добавлено 11-08-2011 15:51:03

bunda1 пишет

Что делать и в чем тут дело.

Наверно нужно локализовать кнопку, которая «глючит», путем их последовательной установки по одной штуке?

Отредактировано slbgz (11-08-2011 15:51:03)

Отсутствует

 

№289511-08-2011 20:14:38

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 3.6

Re: Custom Buttons

Выделить код

Код:

Наверно нужно локализовать кнопку, которая «глючит», путем их последовательной установки по одной штуке?

уже пробовал и пришел к выводу что виноват FF5

Отсутствует

 

№289611-08-2011 22:02:10

slbgz
Забанен
 
Группа: Members
Зарегистрирован: 27-06-2011
Сообщений: 246
UA: Google 2.1

Re: Custom Buttons

Хмм, значит нужна «подгонка» кнопок к новым версиям Фокса...
А тот Фокс v.5.0 у тебя тоже - портабле или нет?..

Оффтоп.
bunda1, а че так долго на 3.6 сидел, а теперь решил перейти на 5, если не секрет?
Появилась поддержка расширения, ранее недоступного в версиях Фокса выше 3.6?

Отредактировано slbgz (11-08-2011 22:06:33)

Отсутствует

 

№289711-08-2011 22:18:04

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 3.6

Re: Custom Buttons

slbgz

Хмм, значит нужна «подгонка» кнопок к новым версиям Фокса...
А тот Фокс v.5.0 у тебя тоже - портабле или нет?..

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

Выделить код

Код:

а че так долго на 3.6 сидел, а теперь решил перейти на 5, если не секрет?

:( у меня многое не работоло на FF4 пока исправыл вышла FF5
и вот опять глюки, что делать, как дальше жить.

Отсутствует

 

№289811-08-2011 23:46:50

slbgz
Забанен
 
Группа: Members
Зарегистрирован: 27-06-2011
Сообщений: 246
UA: Google 2.1

Re: Custom Buttons

bunda1 пишет

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

Может проблема - в том портабле?
Я себе «делаю» сопственные «портабле» просто копированием соотв. каталогов установленной «нормальной» версии в нужные места и созданием ярлычка к .exe ...



bunda1 пишет

что делать, как дальше жить.

:D

Да наплевать на некоторые «фичи» или заменить их работающими аналогами и все. :)

Отредактировано slbgz (11-08-2011 23:48:12)

Отсутствует

 

№289912-08-2011 14:35:17

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

Re: Custom Buttons

bunda1
Можно попробовать использовать внутреннюю реализацию addEventListener – заменить

Выделить код

Код:

gBrowser.mTabContainer.addEventListener("dblclick", mouseDoubleClickHandler, false);

на

Выделить код

Код:

addEventListener("dblclick", mouseDoubleClickHandler, false, gBrowser.mTabContainer);

Тогда listener должен будет сниматься при срабатывании деструктора кнопки.


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

Отсутствует

 

№290012-08-2011 19:12:22

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 3.6

Re: Custom Buttons

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

Отредактировано bunda1 (12-08-2011 19:23:40)

Отсутствует

 

Board footer

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