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

Хотите узнать больше о расширениях? Посмотрите ролики, рассказывающие о работе с расширениями Firefox.

№305121-09-2011 09:11:43

vom
Участник
 
Группа: Members
Зарегистрирован: 30-08-2011
Сообщений: 155
UA: Firefox 6.0

Re: Custom Buttons

okkamas_knife
Спасибо большое. И аналогичный вопрос по поводу кнопки Play/Pause для управления foobar2000, может быть есть? Существует аддон Foobar Controls, но он работает только с очень старыми версиями программ, жаль, хотя автор проверенный и даже исходники доступны. Подозреваю, что там нужно изменить самый минимум, чтобы заработало, но видимо из-за невостребованности оно похоронено.

Отсутствует

 

№305221-09-2011 09:53:37

vom
Участник
 
Группа: Members
Зарегистрирован: 30-08-2011
Сообщений: 155
UA: Firefox 6.0

Re: Custom Buttons

okkamas_knife
К сожалению я не понимаю как это делается, особенно управление foobar-ом через командную строку. :| Решил в очередной раз попробовать, включил принудительную совместимость и откатил foobar на старую версию, но безрезультатно, все таже ошибка, которая была год назад. Ощущение, что здесь какая-то принципиальная ошибка ибо foobar не тот плеер, который часто кардинально обновляется.

eb62694a4a54.jpg

Отсутствует

 

№305321-09-2011 10:10:21

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

Re: Custom Buttons

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

vom  а   FoxyTunes вроде бы поддерживает foobar2000 :)

Отредактировано Крошка Ру (21-09-2011 10:11:18)

Отсутствует

 

№305421-09-2011 10:23:39

vom
Участник
 
Группа: Members
Зарегистрирован: 30-08-2011
Сообщений: 155
UA: Firefox 6.0

Re: Custom Buttons

Крошка Ру
Похоже работает, но он весит мегабайт и там слишком много лишнего. :)
okkamas_knife
Может быть здесь есть нужное? Я просто не знаю что искать.
http://www.foobar2000.org/files/2885341 … -03-11.zip

Отсутствует

 

№305521-09-2011 15:16:25

vom
Участник
 
Группа: Members
Зарегистрирован: 30-08-2011
Сообщений: 155
UA: Firefox 6.0

Re: Custom Buttons

okkamas_knife
Спасибо Вам огромное, я и не представлял как это делается, а оказывается все так просто. :angel:

И теперь мелочи, как сделать мигающую кнопку, чтобы отдача от Play/Pause была? :) Код из Session Bookmarks не действует, есть ли универсальный код, подходящий под любые кнопки?

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

Выделить код

Код:

blink: function() {
        var stl = this.button.style;
        if("transition" in stl)
            stl.transition = "opacity 100ms ease-in";
        else if("MozTransition" in stl)
            stl.MozTransition = "opacity 100ms ease-in";
        stl.opacity = "0.72";
        setTimeout(function() {
            stl.opacity = "";
            setTimeout(function() {
                if("transition" in stl)
                    stl.transition = "";
                else if("MozTransition" in stl)
                    stl.MozTransition = "";
            }, 150);
        }, 250);
    },

Отредактировано vom (21-09-2011 15:16:45)

Отсутствует

 

№305621-09-2011 18:56:00

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

Re: Custom Buttons

vom пишет

И теперь мелочи, как сделать мигающую кнопку, чтобы отдача от Play/Pause была?  есть ли универсальный код, подходящий под любые кнопки?

Выделить код

Код:

/*Initialization code*/
this.image = "http://www.mozilla.org/favicon.ico";
this.setAttribute("onmouseup", "this.image = 'chrome://custombuttons/skin/button.png'");
this.setAttribute("onmousedown", "this.image = 'chrome://custombuttons/skin/stdicons/rbutton.png'");
this.setAttribute("onmouseout", "this.image = 'chrome://custombuttons/skin/stdicons/gbutton.png'");
this.setAttribute("onmouseover", "this.image = 'chrome://custombuttons/skin/stdicons/bbutton.png'");

или

Выделить код

Код:

/*Initialization code*/
  oBtn = this;
    this.origImage = this.image;
    this.brighterImage = "data:image/x-icon;base64,AAABAAEAEhIAAAEAIACABQAAFgAAACgAAAASAAAAJAAAAAEAIAAAAAAAWAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAQADAQAAAQAAAAAHAAAZJwUASDgJAWE0CAFeGgMAQQAAABMAAAAAAgEAAQIAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAMBAAMAAAAAGwQALH0cBaHCNA3p3UIR/uVIE//jRxP/1j4Q+60sCttTEAOJBAAAHQAAAAACAAACAAAAAAAAAAAAAAAAAwEAAgAAAABWEQNv3DwO+vVYGv/uZR7+6Wkb/+ltG/7qbBv+6mcb//BfGv70TxX/sSwJ5B0EAEsAAAAAAgAAAgAAAAADAQADAAAAAGYUA3zxSRP/6WEc/ORqEfvpcwr++IgZ//iMG//1iBj/8oIY/+13Gf3kahr78lsZ/842DfYfBABNAAAAAAIAAAIAAAAAPQoBSOxFEv/lYxz87HIS/eiYS//YpWT/2YcS//eaEP//ph7//p8b//mTGP/zghn/5m4a/PFbGv+2LQrkAwAAIAAAAAABAAACti0Kye5dGv/rdBz884QM//jarv//////6ti8/9GjWf/dlB7/+aUf//+pIf/7mRr/84IZ/+VqGvv0URb/XxQDjwAAAABDCwFI6EgT/+dpG/70hBv/+ZYP//naqv//+vH///zw//379P/i0bP/z59P/+OWHP/9pBn//Zgc/+15Gv7vYRr/tjAL3wAAABiDHAaN7lUY/+pyGvz5kBr/+58U//jcr////PX//fXn//746v////f/+vfu/93Gn//Rljf/6o0I//WEF//qaRv/3EIR/iUFAEqlJwm27Vwa/+14Gv38mBr/+qIZ//jdsf///fb//vjr//757//9+Ov//vns////+P/37+H/2baB/96AHP/sbxr96EwV/0MMAWqrKgm/7V0a/+56Gf38mBn/+qQd//jetP///ff//vns//768f/++vD//fjr//325/////r/+vbs/+CLMP/rbhX96k4X/0gOAm+cJAim72Ej/+1+Jvz7miH/+qkh//jht////vj//vnt//767//++u////73//358f/x16j/7qU1//WMHv/reC7+5k8c/zkJAFZtFQJv8WMv/+yIQfz5pkf/+7Q8//njuf///ff///nr///99f/++/X/9ObF/+3Fb//2tDj//rE+//SZRf7vgUP/00Yd8BQAACYmAgAi4E8l7++WXv/2rWT++sNo//rszP////v///z1//jx3P/u2Zn/9M9t//7Ubf//03X/+r1s/++iYPz6hlP/mCcLsgAAAAAAAAAAjSAHkP+SYv/wt4L6+cZ9//vryv/8+e//9em///bkoP/96Z3//+qi///imP/81Iv/975//vKxgfzvZjr/MQQAQQAAAQAAAQEAEwAAD9BNJ9X/u43/89Kf+vnbo/755Kz//Oys///0uP//8rf//uuu//3hpv/41Z79886i+v+XaP92GwWLAAAAAAMBAQMCAAACAAABACcEACLUXTfa/8qd//vqvv3778L8/fXJ/f34zP389sr9+/DD/PrrwP3+47j9/6V2/4cqEZkAAAAAAgEBAQAAAAAAAAAAAgAAAgAAAQAVAQAQlz0imfOfdfn/27L//vTO/v/92P//+tX//+rF/v/Hnf/WeFHjVhoKXwAAAAACAQECAAAAAQAAAAAAAAAAAAAAAAIAAAICAQECAAAAAC0IAiiCNyCCvmlIvMh/W9TIeVbOqVY5qlwgEGEPAAAPAAAAAAMBAQMBAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";

    this.setOrigImg = function(){
          this.image = this.origImage;
    };
    this.image = this.brighterImage;
    window.setTimeout(function() { oBtn.setOrigImg(); }, 500);

что за отдача от Play/Pause, непонятно :/

Отсутствует

 

№305722-09-2011 05:20:23

vom
Участник
 
Группа: Members
Зарегистрирован: 30-08-2011
Сообщений: 155
UA: Firefox 6.0

Re: Custom Buttons

bunda1
Первый код вообще меняет иконку на такую [firefox] и не работает, а второй просто не работает. :rolleyes:

Под отдачей имелось ввиду мигание, т.е. подтверждение нажатия, Вы же ставили кнопку Session Bookmarks, вот она при нажатии СКМ затемняет иконку на миллисекунды, причем любую установленную пользователем.

А кнопка супер получилась, она оказывается еще запускает foobar и автоматически начинает воспроизведение. :music:

Отредактировано vom (22-09-2011 05:22:01)

Отсутствует

 

№305822-09-2011 06:24:00

vom
Участник
 
Группа: Members
Зарегистрирован: 30-08-2011
Сообщений: 155
UA: Firefox 6.0

Re: Custom Buttons

okkamas_knife
Поставьте вот эту кнопку в инициализацию, иконку можно любую, хоть стандартную, и нажмите СКМ по ней, сразу все станет ясно. :) Кнопка просто отрабатывает свое действие, как и положено в любых интерфейсах. А слайд у меня стоит на заметки, он немного для других функций.

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

Выделить код

Код:

// http://infocatcher.ucoz.net/js/cb/sessionBookmarks.js

// Session Bookmarks button for Custom Buttons
// (code for "initialization" section)

// (c) Infocatcher 2011
// version 0.1.0pre3 - 2011-06-29

// Compatibility: Firefox 3.0+, SeaMonkey 2.0+

var options = {
    middleClickCloseMenu: true,
    checkDuplicates: true,
    useSessions: true,
    reloadSessions: true
};

this.onclick = function(e) {
    if(e.target != this)
        return;
    if(e.button == 1 || e.button == 0 && this.bookmarks.hasModifier(e))
        this.bookmarks.addBookmark();
};
this.onmouseover = function(e) {
    if(e.target != this)
        return;
    Array.some(
        this.parentNode.childNodes,
        function(node) {
            if(
                node != this
                && node.namespaceURI == xulns
                && node.boxObject
                && node.boxObject instanceof Components.interfaces.nsIMenuBoxObject
                && node.open
            ) {
                node.open = false;
                this.open = true;
                return true;
            }
            return false;
        },
        this
    );
};
this.setAttribute("ondragdrop", "return this.bookmarks.handleDrop(event);");
this.setAttribute("ondragover", "return this.bookmarks.handleDragOver(event);");
this.bookmarks = {
    options: options,
    get deleteLabel() {
        var mi = document.getElementById("placesContext_delete");
        delete this.deleteLabel;
        return this.deleteLabel = mi && mi.getAttribute("label") || "Delete";
    },
    get openAllLabel() {
        var sb = document.getElementById("bundle_browser");
        if(sb) try {
            var label = sb.getString("menuOpenAllInTabs.label");
        }
        catch(e) {
        }
        delete this.openAllLabel;
        return this.openAllLabel = label || "Open All in Tabs";
    },

    button: this,
    XULNS: "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul",
    get ss() {
        delete this.ss;
        return this.ss = Components.classes["@mozilla.org/browser/sessionstore;1"]
            .getService(Components.interfaces.nsISessionStore);
    },
    get ios() {
        delete this.ios;
        return this.ios = Components.classes["@mozilla.org/network/io-service;1"]
            .getService(Components.interfaces.nsIIOService);
    },
    get file() {
        var file = Components.classes["@mozilla.org/file/directory_service;1"]
            .getService(Components.interfaces.nsIProperties)
            .get("ProfD", Components.interfaces.nsILocalFile);
        file.append("custombuttons");
        file.append("bookmarks" + (/\d+/.test(this.button.id) ? "-" + RegExp.lastMatch : "") + ".txt");
        delete this.file;
        return this.file = file.QueryInterface(Components.interfaces.nsILocalFile);
    },
    init: function() {
        var file = this.file;
        if(file.exists())
            this.readFromFileAsync(file, this.load, this);
        else
            this.load("");
    },
    _label:   "label:   ",
    _uri:     "uri:     ",
    _icon:    "icon:    ",
    _session: "session: ",
    load: function(data) {
        var btnId = this.button.id;
        this.cmId      = btnId + "-context";
        this.sepId     = btnId + "-separator";
        this.openAllId = btnId + "-openAll";
        var mp = <menupopup xmlns={this.XULNS}
            context={this.cmId}
            oncommand="this.parentNode.bookmarks.openBookmark(event);"
            onclick="this.parentNode.bookmarks.openBookmark(event);"
            onpopuphidden="this.parentNode.bookmarks.checkUnsaved();"
        />
        data.split("\n\n").forEach(function(section, i) {
            if(!section)
                return;
            var label, uri, icon, ssData;
            var typeOffset = this._label.length;
            section.split("\n").forEach(function(line, i) {
                if(!line)
                    return;
                var type = line.substr(0, typeOffset);
                line = line.substr(typeOffset);
                switch(type) {
                    case this._label:   label  = line; break;
                    case this._uri:     uri    = line; break;
                    case this._icon:    icon   = line; break;
                    case this._session: ssData = line;
                }
            }, this);
            mp.appendChild(this.getMenuitem(label, uri, icon, ssData));
        }, this);
        mp.appendChild(
            <menuseparator xmlns={this.XULNS} id={this.sepId} />
        );
        mp.appendChild(
            <menuitem xmlns={this.XULNS} id={this.openAllId}
                label={this.openAllLabel}
            />
        );
        this.mp = this.button.appendChild(this.parseFromXML(mp));

        var cm = document.getElementById(this.cmId);
        cm && cm.parentNode.removeChild(cm);
        cm = this.parseFromXML(
            <menupopup xmlns={this.XULNS}
                id={this.cmId}
                onpopupshowing="return (this.parentNode.triggerNode || document.popupNode).hasAttribute('cb_uri');"
            >
                <menuitem
                    label={this.deleteLabel} closemenu="single"
                    oncommand="this.parentNode.bookmarks.deleteBookmark(this.parentNode.triggerNode || document.popupNode);"
                />
            </menupopup>
        );
        cm.bookmarks = this;
        document.getElementById("mainPopupSet").appendChild(cm);
        this.showOpenAll();
    },
    unsaved: false,
    save: function() {
        var data = [];
        Array.forEach(
            this.mp.getElementsByAttribute("cb_uri", "*"),
            function(mi) {
                var section = [
                    this._label + this.escapeString(mi.getAttribute("label")),
                    this._uri   + this.escapeString(mi.getAttribute("cb_uri"))
                ];
                var icon   = mi.getAttribute("image");
                var ssData = mi.getAttribute("cb_ssData");
                icon   && section.push(this._icon    + this.escapeString(icon));
                ssData && section.push(this._session + this.escapeString(ssData));
                data.push(section.join("\n"));
            },
            this
        );
        this.writeToFileAsync(data.join("\n\n"), this.file);
        this.unsaved = false;
    },
    checkUnsaved: function() {
        this.unsaved && this.save();
    },
    getMenuitem: function(label, uri, icon, ssData) {
        return <menuitem xmlns={this.XULNS}
            class="menuitem-iconic bookmark-item menuitem-with-favicon"
            label={label || ""}
            cb_uri={uri || ""}
            cb_ssData={ssData || ""}
            tooltiptext={uri || ""}
            image={icon || ""}
        />
    },
    addBookmark: function(tab) {
        if(!tab)
            tab = gBrowser.selectedTab;
        var label = tab.label;
        var uri = tab.linkedBrowser && tab.linkedBrowser.currentURI.spec;
        var icon = tab.image;
        if(/^https?:/.test(icon) && !this.isOldSeaMonkey) // https://bugzilla.mozilla.org/show_bug.cgi?id=467828
            icon = "moz-anno:favicon:" + icon;
        if(this.options.useSessions)
            var ssData = this.ss.getTabState(tab);
        if(this.options.checkDuplicates) {
            var mi = this.mp.getElementsByAttribute("cb_uri", uri);
            if(mi.length) {
                mi = mi[0];
                if(
                    mi.getAttribute("label") == label
                    && mi.getAttribute("image") == icon
                    && (this.options.useSessions ? mi.getAttribute("cb_ssData") == ssData : true)
                )
                    return;
            }
        }
        var mi = this.parseFromXML(this.getMenuitem(label, uri, icon, ssData));
        this.mp.insertBefore(mi, document.getElementById(this.sepId));
        this.save();
        this.showOpenAll(true);
        this.blink();
    },
    blink: function() {
        var stl = this.button.style;
        if("transition" in stl)
            stl.transition = "opacity 100ms ease-in";
        else if("MozTransition" in stl)
            stl.MozTransition = "opacity 100ms ease-in";
        stl.opacity = "0.72";
        setTimeout(function() {
            stl.opacity = "";
            setTimeout(function() {
                if("transition" in stl)
                    stl.transition = "";
                else if("MozTransition" in stl)
                    stl.MozTransition = "";
            }, 150);
        }, 250);
    },
    openBookmark: function(e) {
        var mi = e.target;
        if(mi.id == this.openAllId) {
            if(e.type == "command")
                this.openAllBookmarks();
            return;
        }
        var uri = mi.getAttribute("cb_uri");
        var tab;
        if(e.type == "click" ? e.button == 1 : this.hasModifier(e)) {
            tab = gBrowser.selectedTab = gBrowser.addTab(this.options.useSessions ? "about:blank" : uri);
            this.options.middleClickCloseMenu && closeMenus(mi);
        }
        else if(e.type == "command") {
            if(!this.options.useSessions)
                loadURI(uri);
            tab = gBrowser.selectedTab;
        }
        if(tab && this.options.useSessions)
            this.setTabSession(tab, mi.getAttribute("cb_ssData"), uri);
    },
    openAllBookmarks: function() {
        Array.forEach(
            this.mp.getElementsByAttribute("cb_uri", "*"),
            function(mi, i, mis) {
                if(this.options.useSessions) {
                    var tab = gBrowser.addTab("about:blank");
                    this.setTabSession(tab, mi.getAttribute("cb_ssData"), mi.getAttribute("cb_uri"));
                }
                else {
                    gBrowser.addTab(mi.getAttribute("cb_uri"));
                }
            },
            this
        );
    },
    setTabSession: function(tab, ssData, uri) {
        try {
            this.ss.setTabState(tab, ssData);
            if(this.options.reloadSessions && !this.ios.offline)
                tab.linkedBrowser.addProgressListener(this.progressListener);
        }
        catch(e) {
            uri && tab.linkedBrowser.loadURI(uri);
        }
    },
    progressListener: {
        QueryInterface: function(aIID) {
            if(
                aIID.equals(Components.interfaces.nsIWebProgressListener)
                || aIID.equals(Components.interfaces.nsISupportsWeakReference)
                || aIID.equals(Components.interfaces.nsISupports)
            )
                return this;
            throw Components.results.NS_NOINTERFACE;
        },
        onStateChange: function(aWebProgress, aRequest, aFlag, aStatus) {
            var wpl = Components.interfaces.nsIWebProgressListener;
            if(aFlag & wpl.STATE_START) { // Force load to bypass cache
                aRequest.loadFlags = aRequest.loadFlags | aRequest.LOAD_BYPASS_CACHE;
                aWebProgress.chromeEventHandler.removeProgressListener(this);
            }
        },
        onLocationChange: function(aProgress, aRequest, aURI) {},
        onProgressChange: function(aWebProgress, aRequest, curSelf, maxSelf, curTot, maxTot) {},
        onStatusChange:   function(aWebProgress, aRequest, aStatus, aMessage) {},
        onSecurityChange: function(aWebProgress, aRequest, aState) {}
    },
    deleteBookmark: function(mi) {
        mi.parentNode.removeChild(mi);
        if(this.button.open || this.button.getAttribute("open") == "true")
            this.unsaved = true;
        else
            this.save();
        this.showOpenAll();
    },
    showOpenAll: function(show) {
        if(show === undefined)
            show = this.mp.getElementsByAttribute("cb_uri", "*").length > 0;
        document.getElementById(this.sepId).hidden
            = document.getElementById(this.openAllId).hidden
            = !show;
        if(!show)
            this.mp.hidePopup();
    },
    handleDragOver: function(event) {
        var dt = event.dataTransfer;
        //~ todo: dt.mozItemCount
        var tab = dt.mozGetDataAt(TAB_DROP_TYPE, 0);
        if(!tab)
            return null;
        event.preventDefault();
        event.stopPropagation();
        return dt.effectAllowed = dt.dropEffect = "link";
    },
    handleDrop: function(event) {
        var dt = event.dataTransfer;
        //var uri = dt.mozGetDataAt("text/x-moz-text-internal", 0);
        var tab = dt.mozGetDataAt(TAB_DROP_TYPE, 0);
        this.addBookmark(tab);
    },
    get isOldSeaMonkey() {
        var info = Components.classes["@mozilla.org/xre/app-info;1"]
            .getService(Components.interfaces.nsIXULAppInfo);
        delete this.isOldSeaMonkey;
        return this.isOldSeaMonkey = info.name == "SeaMonkey" && parseFloat(info.version) <= 2;
    },
    hasModifier: function(e) {
        return e.ctrlKey || e.shiftKey || e.altKey || e.metaKey;
    },
    escapeString: function(s) {
        return s.replace(/\n/g, "\r");
    },
    writeToFileAsync: function(str, file, callback, context) {
        try {
            Components.utils.import("resource://gre/modules/NetUtil.jsm");
            Components.utils.import("resource://gre/modules/FileUtils.jsm");
        }
        catch(e) {
            this.writeToFileAsync = function(str, file, callback, context) {
                this.writeToFile(str, file);
                callback && callback.call(context || this, 0);
            };
            this.writeToFileAsync.apply(this, arguments);
            return;
        }
        var ostream = FileUtils.openSafeFileOutputStream(file);
        var suc = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]
            .createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
        suc.charset = "UTF-8";
        var istream = suc.convertToInputStream(str);
        NetUtil.asyncCopy(istream, ostream, callback && this.bind(function(status) {
            callback.call(context || this, status);
        }, this));
    },
    writeToFile: function(str, file) {
        var fos = Components.classes["@mozilla.org/network/file-output-stream;1"]
            .createInstance(Components.interfaces.nsIFileOutputStream);
        fos.init(file, 0x02 | 0x08 | 0x20, 0644, 0);
        var cos = Components.classes["@mozilla.org/intl/converter-output-stream;1"]
            .createInstance(Components.interfaces.nsIConverterOutputStream);
        cos.init(fos, "UTF-8", 0, 0);
        cos.writeString(str);
        cos.close(); // this closes fos
    },
    readFromFileAsync: function(file, callback, context) {
        try {
            Components.utils.import("resource://gre/modules/NetUtil.jsm");
            if(!("newChannel" in NetUtil))
                throw "Firefox 3.6";
        }
        catch(e) {
            this.readFromFileAsync = function(file, callback, context) {
                var data = this.readFromFile(file);
                callback.call(context || this, data, 0);
            };
            this.readFromFileAsync.apply(this, arguments);
            return;
        }
        NetUtil.asyncFetch(file, this.bind(function(istream, status) {
            var data = "";
            if(Components.isSuccessCode(status)) {
                try { // Firefox 7.0a1 throws after istream.available() on empty files
                    data = this.convertToUnicode(NetUtil.readInputStreamToString(istream, istream.available()));
                }
                catch(e) {
                }
            }
            callback.call(context || this, data, status);
        }, this));
    },
    readFromFile: function(file) {
        var fis = Components.classes["@mozilla.org/network/file-input-stream;1"]
            .createInstance(Components.interfaces.nsIFileInputStream);
        fis.init(file, 0x01, 0444, 0);
        var sis = Components.classes["@mozilla.org/scriptableinputstream;1"]
            .createInstance(Components.interfaces.nsIScriptableInputStream);
        sis.init(fis);
        var str = sis.read(fis.available());
        sis.close();
        fis.close();
        return this.convertToUnicode(str);
    },
    convertToUnicode: function(str) {
        var suc = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]
            .createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
        suc.charset = "utf8";
        try {
            return suc.ConvertToUnicode(str);
        }
        catch(e) {
            Components.utils.reportError(e);
        }
        return str;
    },
    bind: function(func, context, args) {
        return function() {
            return func.apply(context, args || arguments);
        };
    },
    parseFromXML: function(xml) {
        var pp = XML.prettyPrinting;
        XML.prettyPrinting = false;
        var elt = this.parseFromString(xml.toXMLString());
        XML.prettyPrinting = pp;
        return elt;
    },
    parseFromString: function(str, contentType) {
        return new DOMParser().parseFromString(str, contentType || "application/xml").documentElement;
    }
};
this.bookmarks.init();
this.type = "menu";
this.orient = "horizontal";

Отсутствует

 

№305922-09-2011 07:22:24

vom
Участник
 
Группа: Members
Зарегистрирован: 30-08-2011
Сообщений: 155
UA: Firefox 6.0

Re: Custom Buttons

okkamas_knife
Думаете рискованно доверять кнопкам участников этого форума?

Вот, надеюсь разборчиво.
http://rghost.ru/22560801

Отсутствует

 

№306022-09-2011 13:45:01

vom
Участник
 
Группа: Members
Зарегистрирован: 30-08-2011
Сообщений: 155
UA: Firefox 6.0

Re: Custom Buttons

okkamas_knife
Ок, ясно. Хотя и эти варианты не то, что я имел ввиду, но мне понравились, выбор есть на будущее. :) Видимо все недопонимание из-за слова "мигать", там скорее затемнение, посмотрите для интереса, когда будет время. Просто в коде написано "blink", который я приводил, там не нужно подставлять иконки в код, затемняется любая пользовательская.

А как изменить этот код, чтобы при нажатии иконка просто сменялась на вторую? Т.е. нажал первый раз, появилась "Pause" и остается, второй раз, "Play", как в плеерах.

Выделить код

Код:

this.setAttribute("onmouseup", "this.image = 'chrome://custombuttons/skin/button.png'");
this.setAttribute("onmousedown", "this.image = 'chrome://custombuttons/skin/stdicons/rbutton.png'");

Отсутствует

 

№306122-09-2011 15:39:18

vom
Участник
 
Группа: Members
Зарегистрирован: 30-08-2011
Сообщений: 155
UA: Firefox 6.0

Re: Custom Buttons

okkamas_knife
У меня стандартная тема, просто персона черная, и код "blink" действует, но не важно, раз мы это уже решили верхним кодом с 2 иконками. :)

Да, устроит, спасибо, все сделал наконец. :blush:

Отсутствует

 

№306223-09-2011 23:01:51

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

Re: Custom Buttons

Toggle  Find+http://forum.mozilla-russia.org/viewtop … 53#p508253

экспериментальная версия кнопки

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

Выделить код

Код:

//настройка функций кликов мыши(Mouse Click settings)...................................................
this.onclick = function(event) {
    if(event.button == 0) {
        // Действие при клике ЛКМ
        gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
    }
    else if(event.button == 1) {
        // Действие при клике СКМ
        gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
        goDoCommand("cmd_selectNone");
        goDoCommand("cmd_paste"); 
    }
};


//настройки языка(language settings)...................................................
var cb=custombuttons,self=this,lang=cb.getPref("general.useragent.locale");
lang = lang.replace("-", "_");
function l(str) {
  self.properties = {
    en_US:{     
      Label:       "Search with in a webpage",
      Toggle:      'Toggle Find Bar',
      Check:       'Search for a page from the clipboard ',
      Uncheck:     'CB menu',
      Left:        'L',
      Middle:      'M',
      Right:       'R',
      Matches:     'hits',
      Matches2:    'hits',
      cbTitle:       'Auto Highlight',
      Help:        "Additional Features;"+"\n"+
                   "Auto Highlight a text, switch off (about:config)FindBar.Highlight,false"+"\n"+
                   "Auto Highlight, add selected /Clipboard text - press ctrl+ALT+H, "+"\n"+
                   "Highlight a selected /Clipboard text - press ctrl+ALT+H,"+"\n"+
                   "FindBar find for a page from the clipboard, midlle click on findbar"+"\n"+
           "FindBar find, Mouse Scroll on findbar"+"\n"+
           "FindBar clear findText, right click on findbar's label-Find:"+"\n"+
           "FindBar find , left click on findbar's label-Find:"+"\n"+
           "FindBar close, Double midlleClick in page, (about:config) FindBar.DblclickClose: true"+"\n"+
           "Findbar find for a page from the clipboard, press ctrl+ALT+F"+"\n"+
           "FindBar Toggle, press Ctrl+F"+"\n"+
           ""+"\n"+
           "Locked; "+"\n"+
           "FindBar(7 sec) autohide "+"\n"+
           "FindBar close, Any key keyboard",  
               },
    
    ru:{     
      Label:       "Поиск по странице",
      Toggle:      'Показать - скрыть поиск по странице ',
      Check:       'Поиск по странице из буфера обмена ',
      Uncheck:     'CB меню ',
      Left:        'Л',
      Middle:      'С',
      Right:       'П',
      Matches:     'совпадений',
      Matches2:    'совпадение',
      cbTitle:       'Автовыделение',    
      Help:        "Дополнительные возможности;"+"\n"+
                    ""+"\n"+
                 "Автовыделение, выделяет заранее введенные слова на всех страницах, отключение (about:config)FindBar.Highlight,false"+"\n"+
                 "Автовыделение, добавить текст (выделеный / из буфера обмена)для автовыделения текста, нажать(ctrl+ALT+H)"+"\n"+
                 "Выделение текста (выделенного/из буфера обмена) на странице, эсли отключена Автовыделение, нажать(ctrl+ALT+H)"+"\n"+
           "Findbar поиск, из буфера обмена, кликнуть средним кликом на findbar"+"\n"+
           "Findbar поиск, колесиком мыши на findbar"+"\n"+
           "Findbar очистить, кликнуть правим кликом на findbar's label-Найти:"+"\n"+
           "Findbar поиск, если кликнуть левым кликом на findbar's label-Найти:"+"\n"+
           "Findbar, закрыть двойным средним кликом на странице, в (about:config) FindBar.DblclickClose: true"+"\n"+
           "Findbar поиск по странице из буфера обмена, нажать(ctrl+ALT+F)"+"\n"+
           "FindBar показать - скрыть, нажать(ctrl+ F)"+"\n"+
           ""+"\n"+
           "Заблокировано; "+"\n"+
           "FindBar(7 sec), автоматически закрыть "+"\n"+
           "Findbar закрыть, любой клавишей клавиатуры",  
       }
    
  };
  var tstr = cb.getLocalString(self, str);

  // Operations to handle replacements
  if (tstr.match(/[%]\w{1}/g)) {
    lang = (typeof self.properties[lang] != "undefined") ? lang : "en_US";
    for(prop in self.properties[lang]) {
      if ((prop.match(/[_]\w{1}$/)) && ((prop.substr(prop.lastIndexOf("_")+1)) == (tstr.substring(tstr.indexOf("%")+1, tstr.indexOf("%")+2)))) {
        var tok = tstr.substring(tstr.indexOf("%"), tstr.indexOf("%")+2);
        tstr = tstr.replace(tok, l(prop));
      }
    }
  }
  return tstr;
}
  
//переключения языка Справки(switch Help language)
this.setAttribute("Help", l("Help"));

//переключения языка подсказки (switch tooltip language)
this.tooltipText = 
                   l("Label")+"\n"+
                   l("Left")+": "+l("Toggle")+"\n"+
                   l("Middle")+": "+l("Check")+"\n"+
                   l("Right")+": "+l("Uncheck")+"\n";
                   
                   

//проверить наличие строк в about:config и создать если не существует(Add preferences)........................................
var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
var f;
try{
    f = prefs.getBoolPref("FindBar.Highlight");
}
catch(e){
    prefs.setBoolPref("FindBar.Highlight", true);
}
try{
    f = prefs.getBoolPref("FindBar.contextFindWords");
}
catch(e){
    prefs.setBoolPref("FindBar.contextFindWords", true);
}
try{
    f = prefs.getBoolPref("FindBar.DblclickClose");
}
catch(e){
    prefs.setBoolPref("FindBar.DblclickClose", false);
}
try{
    f = prefs.getBoolPref("ui.textHighlightBackground");
}
catch(e){
    prefs.setCharPref("ui.textHighlightBackground", "#ef0fff");//http://coloria.net/bonus/colornames.htm
}


//find bar сверху (move find bar to the top)................................................
XPCOMUtils.defineLazyGetter(window, "gFindBar", function() {
  let XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
  let findbar = document.createElementNS(XULNS, "findbar");
  findbar.setAttribute("browserid", "content");
  findbar.id = "FindToolbar";
  //let panel = getBrowser().mPanelContainer;
  //panel.parentNode.insertBefore(findbar, panel);
  gBrowser.parentNode.insertBefore(findbar, gBrowser);

  // Force a style flush to ensure that our binding is attached.
  findbar.clientTop;
  window.gFindBarInitialized = true;
  return findbar;
});



//find bar, показать количество совпадений(find bar,show the number of matches)...@author slimx.................
(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 +" \ "+ l("Matches2");
                else if (matchesCount == "-1") {
                    var matchLimit = 100;
                    this._foundMatches.value = " \>"+ matchLimit +" \ "+ l("Matches");
                    //                    var key = (matchLimit > 1000) ? "Decrease" : "Increase";
                } else
                    this._foundMatches.value = matchesCount +" \ "+ l("Matches2");
                this._foundMatches.hidden = false;
                //Findbar, удалить атрибут 'red'(Findbar, remove attribute 'red') 
                var findToolbar = document.getElementById("FindToolbar");
                findToolbar.removeAttribute("red");  
            }
            else {
                this._foundMatches.hidden = true;
                this._foundMatches.value = "";
                //Findbar, установить атрибут 'red'(Findbar, set attribute 'red')
                var findToolbar = document.getElementById("FindToolbar");
                findToolbar.setAttribute("red", "true");
             }

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




//find bar, поиск колесиком мыши(FindBar, Mouse Scroll find )..................................................
gFindBar.addEventListener('DOMMouseScroll', function (event){
    gFindBar.onFindAgainCommand(event.detail < 0);
}, false);



//find bar, закрыть двойным средним кликом на странице(FindBar close, Double midlleClick in page)..............
gBrowser.addEventListener('click', function (event){
  if (event.button != 1) {
        return;
    }
    event.preventDefault();
    event.stopPropagation();    
if (custombuttonsUtils. getPrefs ("FindBar.DblclickClose", true))
{
gFindBar.close();
}
 }, false);



//findbar очистить, кликнуть правим кликом на findbar's label-Найти: (FindBar clear findText, right click on findbar's label)..............
//findbar поиск, кликнуть левым кликом на findbar's label-Найти: (FindBar find, left click on findbar's label)..............  
   document.getAnonymousElementByAttribute(gFindBar, "anonid", "find-label").addEventListener("click", function(event){
      if ( event.button != 0 ){
      event.preventDefault();
      event.stopPropagation();
      gFindBar._findField.value = '';}
      if ( event.button != 2 ){
      event.preventDefault();
      event.stopPropagation();
      gFindBar.onFindAgainCommand(false);
      }
        }, true);
        
        
//findbar-textbox автофокус(auto focus)...........................                  
//document.getAnonymousElementByAttribute(gFindBar, "anonid", "findbar-textbox").addEventListener("mouseover", function(e) { e.target.select(); }, false);     
        
        
   
//Поиск по странице из буфера обмена, кликнуть средним кликом на findbar (FindBar Search for a page from the clipboard, midlle click on findbar)..
(function(){
     gFindBar.addEventListener("click", function(event){
      if ( event.button != 1 )return; 
      event.preventDefault();
      event.stopPropagation();
      this.str = readFromClipboard();
      gFindBar._findField.value = this.str;
      var evt = document.createEvent("UIEvents");
      evt.initUIEvent("input", true, false, window, 0);
      gFindBar._findField.dispatchEvent(evt);
      return;}, true);
})();       

     
      


//FindBar, автоматически закрыть(autohide Findbar).................................
/*(function(){

this.clickPage = function(event) {gBrowser.addEventListener('mousemove',on, false);};

function go() {
clickPage(event);
gFindBar.close();}

function on() {
gBrowser.removeEventListener('mousemove',on, false);
  timeoutId = setTimeout(go, 7000)}//7 сек(7 sec)
  
function off() {
clickPage(event);
   clearTimeout(timeoutId)}
   
gFindBar.addEventListener('mouseover',off, false);
clickPage(event);
})();*/



//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.hidden ? gFindBar.onFindCommand() : gFindBar.close();}}

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

//Findbar(ctrl+ALT+H), FindBar, вести слова для выделение(set Highlight words).............
if (event.altKey == true)
{
if ((event.keyCode==0x48)&&(event.ctrlKey))
{
var clipboard = Components.classes["@mozilla.org/widget/clipboardhelper;1"].  getService(Components.interfaces.nsIClipboardHelper);
//copy to Clipboard
var t = content.getSelection();
if(t){document.getElementById("cmd_copy").doCommand();
//read from Clipboard
this.str = readFromClipboard();
goDoCommand("cmd_selectNone");}
else
//read from Clipboard
this.str = readFromClipboard();

if (custombuttonsUtils. getPrefs ("FindBar.Highlight", true))
{
// Get the root branch
var prefs = Components.classes["@mozilla.org/preferences-service;1"]
                     .getService(Components.interfaces.nsIPrefBranch);
//setting prefs Unicode value
var str = Components.classes["@mozilla.org/supports-string;1"]
      .createInstance(Components.interfaces.nsISupportsString);
str.data = this.str;
prefs.setComplexValue("FindBar.Highlight.value", 
      Components.interfaces.nsISupportsString, str);
      
//getting prefs Unicode value
var value = prefs.getComplexValue("FindBar.Highlight.value",
      Components.interfaces.nsISupportsString).data;
//Sliding alert
custombuttons.alertSlide(l("cbTitle"), value);
//run auto Highlight
Highlight(event);
}
else
if (gFindBar.hidden)
{
//hide Highlight
gFindBar._highlightDoc(false);
//Highlight
var word = [this.str];
gFindBar._findField.value = word;
gFindBar._highlightDoc(true, word);
} 
 }
  }
//FindBar, закрыть любой клавишей клавиатуры(FindBar close, Any key keyboard)..
//else{gFindBar.close();}
}, false);



//Автоматически выделить заранее введенные слова (auto Highlight words permanent)....................................................
function Highlight(event) {

//FindBar, auto find 
if (gFindBar.hidden == false)
{
//hide Highlight
gFindBar._highlightDoc(false);
//auto Find
gFindBar.onFindCommand();
}
//auto Highlight
if (custombuttonsUtils. getPrefs ("FindBar.Highlight", true))
{
if (gFindBar.hidden)
{
//hide Highlight
gFindBar._highlightDoc(false);
//getting prefs Unicode value
var value = prefs.getComplexValue("FindBar.Highlight.value",
      Components.interfaces.nsISupportsString).data;
/*else{
getting findField value
var value = gFindBar._findField.value;} };*/

//run auto Highlight
var word = [value];
gFindBar._findField.value = word;
gFindBar._highlightDoc(true, word);
}
 }
  };  
gBrowser.tabContainer.addEventListener("TabSelect", Highlight, false);
document.addEventListener( "DOMContentLoaded", Highlight, false);





//FindBar. контекстного меню (context Menu).......................................
(function contextFindWords(){

 
    const kXULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";

    var contextMenu = document.getElementById("contentAreaContextMenu");
    var separator = document.getElementById("context-sep-properties");
    var eventTarget = null;

    var menu = document.createElementNS(kXULNS, "menu");
    menu.id = "contextFindWords";
    var locale = Components.classes["@mozilla.org/preferences-service;1"]
                         .getService(Components.interfaces.nsIPrefBranch)
                         .getCharPref("general.useragent.locale");
       
    menu.setAttribute("label", locale.indexOf("ru") == -1 ? "Find" : "Find");
    //menu.setAttribute("accesskey", "i");
    menu.hidden = true;
    contextMenu.insertBefore(menu, separator);

    var menuPopup = document.createElementNS(kXULNS, "menupopup");
    menu.appendChild(menuPopup);

    var lst = [
        { 
          label:locale.indexOf("ru") == -1 ? "Find on page" : "Найти на странице",
          //accesskey:"F",
          command:Find
        },
        {
          label:locale.indexOf("ru") == -1 ? "Search selected in Website" : "Поиск по сайту(google)",
          command:Search
        },
        {
          label:locale.indexOf("ru") == -1 ? "Highlight selected" : "Выделить текст на странице",
          command:HighlightSel
        },
        { 
          label:locale.indexOf("ru") == -1 ? "Auto Highlight, add selected" : "Авто выделение, дабавыть текст",
          command:HighlightAdd
        },
        { 
          label:locale.indexOf("ru") == -1 ? "Auto Следим за иконкой статуса на FindBarHighlight include" : "Авто выделение, включить",
          command:switchHighlight
        }
        ];
    
    for(var i = 0, m; m = lst[i]; i++){
        var menuItem = document.createElementNS(kXULNS, "menuitem");
        menuItem.setAttribute("label", m.label);
        menuItem.setAttribute("type", "m.radio");
        if ("accesskey" in m) menuItem.setAttribute("accesskey", m.accesskey);
        menuItem.addEventListener("command", m.command, false);
        menuItem.id = "context-Find-Words-" + m.label.toString();
        menuPopup.appendChild(menuItem);
        
    }

    contextMenu.addEventListener("popupshowing", setMenuDisplay, false);

    function setMenuDisplay(aEvent) {
        var t = content.getSelection().toString();
        if(t){
        if (custombuttonsUtils. getPrefs ("FindBar.contextFindWords", true))
        {
        document.getElementById("contextFindWords").hidden = false;
        }
        else   
        {
         document.getElementById("contextFindWords").hidden = true;
        }
              }
        else   
              {
            document.getElementById("contextFindWords").hidden = true;
              }
    }
    
    
function Find(){
       var findbar, textbox;
        var selected = content.getSelection().toString();
        var findbar = document.getElementById('FindToolbar');
        if('gFindBar' in window && 'onFindAgainCommand' in gFindBar){ 
          gFindBar._findField.value = selected;
          if(gFindBar.hidden)
            gFindBar.onFindCommand();
          var evt = document.createEvent("UIEvents");
          evt.initUIEvent("input", true, false, window, 0);
          gFindBar._findField.dispatchEvent(evt);
        }
     }
    function Search(){
        var focusedWindow = document. commandDispatcher. focusedWindow;
        var text = focusedWindow. getSelection (). toString ();
        var doc = getBrowser (). contentDocument;
        try { var url = doc. location. hostname; }
        catch(e)
        { var url = ""; }
          
        text = escape (convertFromUnicode ("UTF-8", text));
        url = encodeURIComponent (url);
    
        var searchUrl = "http://www.google.com/search?as_q=" + text + "&as_sitesearch=" + url;
        gBrowser.selectedTab = gBrowser.addTab(searchUrl);
        }
    
   function HighlightSel(){
        gFindBar.toggleHighlight(false);
        var words = content.getSelection();
        var word = [words];
        gFindBar._findField.value = word;
        gFindBar._highlightDoc(true, word);
        }
         
   function HighlightAdd(){
        // Get the root branch
var prefs = Components.classes["@mozilla.org/preferences-service;1"]
                     .getService(Components.interfaces.nsIPrefBranch);
//setting Unicode value
var str = Components.classes["@mozilla.org/supports-string;1"]
      .createInstance(Components.interfaces.nsISupportsString);
    str.data = content.getSelection();
        prefs.setComplexValue("FindBar.Highlight.value", 
        Components.interfaces.nsISupportsString, str);
        //Sliding alert
        custombuttons.alertSlide(l("cbTitle"), str.data);
        //run auto Highlight
        Highlight(event);
      }
      
       function switchHighlight(){
       // toggle preference
       var s = "FindBar.Highlight";
       custombuttons.setPrefs(s, !custombuttons.getPrefs(s));
       var autohighlight = Components.classes["@mozilla.org/preferences-service;1"]
                         .getService(Components.interfaces.nsIPrefBranch)
                         .getBoolPref("FindBar.Highlight");
       //window.setTimeout(function() { alert("autohighlight - "+autohighlight);}, 2000);                     
       custombuttons.alertSlide(l("cbTitle"),autohighlight);
      }
})();


//Следим за иконкой статуса на FindBar(Monitor the find-status-icon on FindBar)
function fflash(event){
var findstatus = gFindBar.getElement("find-status-icon");
findstatus.addEventListener("DOMAttrModified",function(e) {
if(findstatus.getAttribute("status")=="wrapped"){ fflash2(event);}
}, false);};
//Findbar, установить и удалить атрибут 'yellow'(Findbar, set and remove attribute 'yellow') 
function fflash2(event){
var findToolbar = document.getElementById("FindToolbar");
findToolbar.setAttribute("yellow", "true");
setTimeout(function() {findToolbar.removeAttribute("yellow"); }, 1000);};

//Запускаем функцию fflash(run function fflash)
setTimeout(function() {fflash(event); }, 1000);


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

/*Find Toolbar, border */
#FindToolbar{ border-bottom: 2px solid;
-moz-border-bottom-colors: ThreeDShadow ThreeDHighlight;}


#FindToolbar > .findbar-container > * { display: -moz-box !important; }
#FindToolbar > hbox > label{-moz-appearance: none !important;color: green !important;font-weight: bold  !important;}

/*  Убираем блок-надпись "С учетом регистра"*/ 
#FindToolbar.findbar-container label.checkbox-label{  display: none !important;}
#FindToolbar .findbar-container>checkbox{display: none !important;}
#FindToolbar label[value="(С учётом регистра)"],#FindToolbar label[value="(Case sensitive)"]{ -moz-appearance:none !important; display: none !important;}

#find-field,.findbar-textbox{width: 250px !important;}

#FindToolbar[yellow="true"] .findbar-textbox{
   -moz-box-shadow: 0 0 0 1em yellow inset !important;}
#FindToolbar[red="true"] .findbar-textbox{
   -moz-box-shadow: 0 0 0 1em red inset !important;}

#FindToolbar:not([red="true"]) .findbar-textbox[status="notfound"]{
   background: rgba(207,219,236,0.99) !important;
   color: black !important;-moz-box-shadow: none !important;}
 

#FindToolbar .findbar-find-fast.findbar-find-status,
#FindToolbar .findbar-container>image{ display: none !important;}

/*#FindToolbar .findbar-highlight > label,*/
#FindToolbar .findbar-find-next > label,
#FindToolbar .findbar-find-previous > label
{display: none !important;}


.findbar-closebutton{list-style-image: none !important;
   background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAD2EAAA9hAHVrK90AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAABVElEQVR42mL8//8/AzUBQAAxMVAZAAQQ1Q0ECCCqGwgQQCzoAvkN3Q5ACoQ/TGwonYBNE1BNAZASAOINQDUXkOUAAgibC0EKAoC4H6hxARbDQJb0Q9U8QJcHCCBGbLEM1GQApA4AMT8QJwJdsQAqngCk5gPxQyA2AIp/QNcLEECMuJIN1Ov7oVxHqBfXA/FHUJCgexUGAAKIEV86RHLRR6gQyMWOQMMO4NIDEEB4Yxnq1YVQg0C4EJ9hIAAQQHgNBLoQ5E0DJKEAQskGIIAIpUOQa/ShrrwIxPbYYh4ZAAQQEx7XLYAadhHoTVBYJkDDMh6aDrECgABiwmEYKK3FQ13lAA3PC0heBqVRrN4HCCAmHDGbD3VNAnJag0ZIIpS7AJpeUQBAADFhiQQFIG7EldagMV8IxBPQIgwMAAKIkdrlIUAAUb20AQggqhsIEEBUNxAgwAD1Mmk1Ns1bkQAAAABJRU5ErkJggg==") center no-repeat !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);
}

Отсутствует

 

№306324-09-2011 18:56:34

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

Re: Custom Buttons

vom пишет

Код из Session Bookmarks не действует, есть ли универсальный код, подходящий под любые кнопки?

В Session Bookmarks метод blink вызывается в другом контексте, у которого есть ссылка на кнопку в виде свойства button.

Выделить код

Код:

this.blink = function() {
    var stl = this.style; // Здесь должна быть ссылка на свойство style кнопки
    if("transition" in stl)
        stl.transition = "opacity 100ms ease-in";
    else if("MozTransition" in stl)
        stl.MozTransition = "opacity 100ms ease-in";
    stl.opacity = "0.72";
    setTimeout(function() {
        stl.opacity = "";
        setTimeout(function() {
            if("transition" in stl)
                stl.transition = "";
            else if("MozTransition" in stl)
                stl.MozTransition = "";
        }, 150);
    }, 250);
};
this.blink();

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

Отсутствует

 

№306425-09-2011 22:17:32

ignorecheats
Забанен
 
Группа: Members
Зарегистрирован: 01-09-2011
Сообщений: 104
UA: Firefox 2.0

Re: Custom Buttons

2 вопроса по Search and open и Search and open +.

1. Можно ли в первую кнопку добавить действие поиска текста, набранного в адресной строке, не по даблклику, как сделано в Search and open +, а по тому же левому клику как один из 3-х вариантов в следующем порядке:
а) искать текст из адресной строки
б) если в адресной строке находится адрес, т.е. есть две косых "//", то искать выделенное на странице
в) если выделенного нет, то искать текст из буфера обмена?

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

2. Из кода выбора поисковика из второй кнопки я сделал себе отдельную кнопку. Как ее переделать, чтобы убрать боковой дропдаунмейкер и заменить простым выпадающим меню, в идеале - с нижним дропмейкером?
Удобнее прицеливаться по кнопке будет и место на панели экономится. :)

Скрин того, как у меня сейчас, желтая кнопка - выбор поисковика, зеленая - Search and open, дропмейкер между ними - лишний:
ca3b5c8a6443.jpg

Апдейт. Вместо зачеркнутого:
а) искать выделенный на странице текст,
б) если выделенного нет И если в адресной строке находится НЕ адрес (т.е. нет двух косых "//" ?...), то искать текст из адресной строки,
в) в противном случае искать текст из буфера обмена.

Отредактировано ignorecheats (26-09-2011 08:17:27)

Отсутствует

 

№306525-09-2011 23:34:28

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

Re: Custom Buttons

ignorecheats пишет

переделать, чтобы убрать боковой дропдаунмейкер и заменить простым выпадающим меню, в идеале - с нижним дропмейкером?

Выделить код

Код:

this.type = "menu-button";

на

Выделить код

Код:

this.type = "menu";

насчет Search and open подумаю завтра

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

Отсутствует

 

№306625-09-2011 23:40:36

ignorecheats
Забанен
 
Группа: Members
Зарегистрирован: 01-09-2011
Сообщений: 104
UA: Firefox 2.0

Re: Custom Buttons

Taк просто!  :D
Спасибо bunda1!

А первый вопрос?

Отредактировано ignorecheats (26-09-2011 08:18:19)

Отсутствует

 

№306726-09-2011 07:58:35

ignorecheats
Забанен
 
Группа: Members
Зарегистрирован: 01-09-2011
Сообщений: 104
UA: Firefox 2.0

Re: Custom Buttons

okkamas_knife пишет

ищешь в коде dblclick и заменяешь на click

:D
okkamas_knife, Семееен Семеныч! © ;)
Если бы все было так просто...

Я тут уже немного разобрался сам и потестил...
Вот немного измененный код кнопки Search and open:

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

Выделить код

Код:

this.onclick = function(event) {
    if(event.button == 0) {
// ЛКМ

goDoCommand("cmd_copy");
var str = readFromClipboard();
var ss = Cc["@mozilla.org/browser/search-service;1"].getService(Ci.nsIBrowserSearchService);
var submission = ss.currentEngine.getSubmission(str, null);
getBrowser (). selectedTab = getBrowser (). addTab(submission.uri.spec, null, null, submission.postData, true, false);
}


else if(event.button == 1) {
        // СКМ без модифікаторів
        
goDoCommand("cmd_copy");        
const IN_NEW_TAB = true;
const IN_BACKGROUND = false;
var str = readFromClipboard();
if (!str)
  return;
if (IN_NEW_TAB)
  getBrowser (). selectedTab = getBrowser (). addTab(str, null, null, null, IN_BACKGROUND, false);
else
  gBrowser.loadURI(str);
}
};

Вот код кнопки, ищущей текст, набранный в строке адреса, в текущем поисковике :

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

Выделить код

Код:

this.onclick = function(event) {
    if(event.button == 0) {
// ЛКМ
  var str = gURLBar.value;
var ss = Cc["@mozilla.org/browser/search-service;1"].getService(Ci.nsIBrowserSearchService);
var submission = ss.currentEngine.getSubmission(str, null);
getBrowser (). selectedTab = getBrowser (). addTab(submission.uri.spec, null, null, submission.postData, true, false);
}
};


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

Нужно чтобы в первом коде вместо
var str = readFromClipboard();
выполнялся следующий "условный оператор":

Если в строке адреса находится конструкция, похожая на адрес (http://... , https://... , ftp://... ) и т.п., то -
var str = readFromClipboard();,
если нет, то -
var str = gURLBar.value;

Вопрос. Как написать такое условие? :)

Скрины:

скрытый текст
Сейчас у меня так:

941731c49723.bmp

Хочу, чтобы стало так:

cd8d95eb1cb5.bmp

:)

Отредактировано ignorecheats (26-09-2011 10:03:50)

Отсутствует

 

№306826-09-2011 09:44:25

ignorecheats
Забанен
 
Группа: Members
Зарегистрирован: 01-09-2011
Сообщений: 104
UA: Firefox 2.0

Re: Custom Buttons

okkamas_knife
Я не чукча писатель, я - читатель...  ;)
Мне бы готовое решение.

Отсутствует

 

№306926-09-2011 11:54:48

ignorecheats
Забанен
 
Группа: Members
Зарегистрирован: 01-09-2011
Сообщений: 104
UA: Firefox 2.0

Re: Custom Buttons

УРРЯ!!!  Работает!

okkamas_knife
, bunda1, Спасибо огромное!!!   :beer:

SEARCH AND OPEN 2

Л  => искать в скрытом текущем поисковике выделенный текст на странице / текст из адресной строки / текст из буфера обмена
Ср => открывать текстовую ссылку, выделенную на странице, или из буфера обмена
Пр => CB меню

Открытие всех поисков - в новой активной вкладке, открытие ссылок - настраиваемое.

Код кнопки:

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

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EL%3D%26gt%3BSEARCH%20%26amp%3B%20M%3D%26gt%3BOPEN%20%28from%20selected%20/%20URLstring%20/%20clipboard%29%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWJFY/6Kiov8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAAAAAAAAAAAAAABsAP8AHQD/oqKi/6Kiov8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAAAAAAAAAAAAABZtFn/AHgA/wBBAP8ANwD/oqKi/wAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAAbrhu/xKaEv8AkwD/AHsA/wBXAP8PXA//oqKi/wAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAAHLGcv8TohP/BaQF/xixGP8RqxH/AIQA/wBeAP8+hT7/oqKi/wAAAAAAAAAAAAAA/wAAAP8AAAAAAAAAAAAAAAB5xnn/GKIY/wqeCv8ZpRn/GK8Y/xq+Gv8SthL/AJIA/wBzAP+AuoD/oqKi/wAAAP8AAAD/AAAAAAAAAAAAAAAAbrRu/xCIEP8Lhgv/FosW/xaKFv8Wjxb/GJwY/xurG/8OpA7/AIoA/wCIAP+ioqL/oqKi/wAAAAAAAAAAAAAAAIDGgP8ZnRn/EJgQ/xycHP8bmxv/Gpga/xuUG/8ckhz/HJgc/w2YCv8AhgD/AHQA/wByAP/Nzc3/AAAAAAAAAACBzIH/HaUd/xWjFP8ipyH/Iacg/yKnIf8ipyL/FKQU/wWcB/8apBr/Q7ZC/064UP/Nzc3/zc3N/wAAAAAAAAAAjdaN/yKvIv8YrBr/JrAo/yivKf8drB//CqgL/xSrFv82tjb/UsRU/6Kiov+ioqL/AAAAAAAAAAAAAAAAAAAAAI7cjv8mtyb/IrUh/yi5J/8SshL/FrMW/zK8NP9XzVf/oqKi/6Kiov8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACY4Zj/Kr8q/xK6Ev8Xuhf/LMEs/0jJSP9o1mf/oqKi/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkeOR/xnEGf8dwx3/QdBB/17aXv+ioqL/oqKi/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIjliP850Tn/W9tb/6Kiov+ioqL/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABl4WX/RNtE/6Kiov8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoqKi/6Kiov8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAn/OsQYfzrEGDwKxBgMCsQYAzrEGAA6xBgAOsQYABrEGAAaxBgAesQYAfrEGAf6xBgP+sQYP/rEGP/6xBn/+sQQ%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%0A//%20%20%20SEARCH%20AND%20OPEN%20++%0A//%0Athis.setAttribute%28%22style%22%2C%20%22padding-left%3A%202px%20%21important%3B%20padding-right%3A%202px%20%21important%3B%20padding-top%3A%200px%20%21important%3B%20padding-bottom%3A%200px%20%21important%3B%20%20margin-top%3A%204px%20%21important%3B%20margin-bottom%3A%204px%20%21important%3B%22%29%3B%0A%0Athis.onclick%20%3D%20function%28event%29%20%7B%0A%20%20%20%20if%28event.button%20%3D%3D%200%29%20%7B%0AgoDoCommand%28%22cmd_copy%22%29%3B%0Avar%20strokaadresa%3D%20gURLBar.value%3B%0Avar%20nsa%3Dstrokaadresa.substring%280%2C4%29%3B%0Aif%20%28nsa%3D%3D%22http%22%29%7B%20var%20str%20%3D%20readFromClipboard%28%29%3B%7D%0Aelse%20%7B%20%0Aif%20%28nsa%3D%3D%22ftp%3A%22%29%7Bvar%20str%20%3D%20readFromClipboard%28%29%3B%7D%0Aelse%20%0A%7Bvar%20str%20%3D%20gURLBar.value%3B%7D%0A%7D%3B%0Avar%20ss%20%3D%20Cc%5B%22@mozilla.org/browser/search-service%3B1%22%5D.getService%28Ci.nsIBrowserSearchService%29%3B%0Avar%20submission%20%3D%20ss.currentEngine.getSubmission%28str%2C%20null%29%3B%0AgetBrowser%20%28%29.%20selectedTab%20%3D%20getBrowser%20%28%29.%20addTab%28submission.uri.spec%2C%20null%2C%20null%2C%20submission.postData%2C%20true%2C%20false%29%3B%0A%7D%0A%0Aelse%20if%28event.button%20%3D%3D%201%29%20%7B%0AgoDoCommand%28%22cmd_copy%22%29%3B%20%20%20%20%20%20%20%20%0Aconst%20IN_NEW_TAB%20%3D%20true%3B%0Aconst%20IN_BACKGROUND%20%3D%20false%3B%0Avar%20str%20%3D%20readFromClipboard%28%29%3B%0Aif%20%28%21str%29%0A%20%20return%3B%0Aif%20%28IN_NEW_TAB%29%0A%20%20getBrowser%20%28%29.%20selectedTab%20%3D%20getBrowser%20%28%29.%20addTab%28str%2C%20null%2C%20null%2C%20null%2C%20IN_BACKGROUND%2C%20false%29%3B%0Aelse%0A%20%20gBrowser.loadURI%28str%29%3B%0A%7D%0A%7D%3B%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E


:iron:

Отредактировано ignorecheats (26-09-2011 12:13:58)

Отсутствует

 

№307026-09-2011 17:22:28

ignorecheats
Забанен
 
Группа: Members
Зарегистрирован: 01-09-2011
Сообщений: 104
UA: Firefox 2.0

Re: Custom Buttons

Хмм, добавил в кнопку еще этот код для открытия по правой кнопке мыши набранного url в адресной строке:

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

Выделить код

Код:

...
else if(event.button == 2 && !event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) {
var str = gURLBar.value;
if (!str)
  return;
if (IN_NEW_TAB)
  getBrowser (). selectedTab = getBrowser (). addTab(str, null, null, null, IN_BACKGROUND, false);
else
  gBrowser.loadURI(str);
}
};


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


первая часть работает, а вторая - нет, контекстное меню не блокируется. :(

Что я делаю не так?

Отредактировано ignorecheats (26-09-2011 18:03:51)

Отсутствует

 

№307126-09-2011 18:56:59

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

Re: Custom Buttons

ignorecheats

Выделить код

Код:

//
//
//   SEARCH AND OPEN ++
//
this.setAttribute("style", "padding-left: 2px !important; padding-right: 2px !important; padding-top: 0px !important; padding-bottom: 0px !important;  margin-top: 4px !important; margin-bottom: 4px !important;");

this.onclick = function(event) {
    if(event.button == 0) {
goDoCommand("cmd_copy");
var strokaadresa= gURLBar.value;
var nsa=strokaadresa.substring(0,5);
if (nsa=="https"){ var str = readFromClipboard();}
else
if (nsa=="http:"){ var str = readFromClipboard();}
else
if (nsa=="ftp:/"){var str = readFromClipboard();}
else
{var str = gURLBar.value;}

var ss = Cc["@mozilla.org/browser/search-service;1"].getService(Ci.nsIBrowserSearchService);
var submission = ss.currentEngine.getSubmission(str, null);
getBrowser (). selectedTab = getBrowser (). addTab(submission.uri.spec, null, null, submission.postData, true, false);
}

else if(event.button == 1) {
goDoCommand("cmd_copy");        
const IN_NEW_TAB = true;
const IN_BACKGROUND = false;
var str = readFromClipboard();
if (!str)
  return;
if (IN_NEW_TAB)
  getBrowser (). selectedTab = getBrowser (). addTab(str, null, null, null, IN_BACKGROUND, false);
else
  gBrowser.loadURI(str);

};

if(event.button == 2 && !event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) {
 // Блокируем контекстное меню при клике ПКМ без модификаторов
        event.preventDefault();
        event.stopPropagation();
        var str = gURLBar.value;
        if (!str) return;
if (IN_NEW_TAB)
  getBrowser (). selectedTab = getBrowser (). addTab(str, null, null, null, IN_BACKGROUND, false);
else
  gBrowser.loadURI(str);       
 };       
    };

Отредактировано bunda1 (26-09-2011 19:20:15)

Отсутствует

 

№307226-09-2011 19:54:22

ignorecheats
Забанен
 
Группа: Members
Зарегистрирован: 01-09-2011
Сообщений: 104
UA: Firefox 2.0

Re: Custom Buttons

Супер! Спасибо, все работает!!!

Код кнопки SEARCH AND OPEN 2 Go plus!: ;)

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EGo%20plus%21%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWJFY/97e3v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAAAAAAAAAAAAAABsAP8AHQD/oK2g/97e3v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAAAAAAAAAAAAABZtFn/AHgA/wBBAP8ANwD/3t7e/wAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAAbrhu/xKaEv8AkwD/AHsA/wBXAP8PXA//3t7e/wAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAAHLGcv8TohP/BaQF/xixGP8RqxH/AIQA/wBeAP8+hT7/3t7e/wAAAAAAAAAAAAAA/wAAAP8AAAAAAAAAAAAAAAB5xnn/GKIY/wqeCv8ZpRn/GK8Y/xq+Gv8SthL/AJIA/wBzAP+AuoD/3t7e/wAAAP8AAAD/AAAAAAAAAAAAAAAAbrRu/xCIEP8Lhgv/FosW/xaKFv8Wjxb/GJwY/xurG/8OpA7/AIoA/wCIAP/K/cr/3t7e/wAAAAAAAAAAAAAAAIDGgP8ZnRn/EJgQ/xycHP8bmxv/Gpga/xuUG/8ckhz/HJgc/w2YCv8AhgD/AHQA/wByAP/e3t7/AAAAAAAAAACBzIH/HaUd/xWjFP8ipyH/Iacg/yKnIf8ipyL/FKQU/wWcB/8apBr/Q7ZC/064UP/F7MX/3t7e/wAAAAAAAAAAjdaN/yKvIv8YrBr/JrAo/yivKf8drB//CqgL/xSrFv82tjb/UsRU/8Hsw//e3t7/AAAAAAAAAAAAAAAAAAAAAI7cjv8mtyb/IrUh/yi5J/8SshL/FrMW/zK8NP9XzVf/k+GT/97e3v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACY4Zj/Kr8q/xK6Ev8Xuhf/LMEs/0jJSP9o1mf/3t7e/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkeOR/xnEGf8dwx3/QdBB/17aXv/T9tP/3t7e/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIjliP850Tn/W9tb/6nuqf/e3t7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABl4WX/RNtE/97e3v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3t7e/+z/7P8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAn/OsQYfzrEGDwKxBgMCsQYAzrEGAA6xBgAOsQYABrEGAAaxBgAesQYAfrEGAf6xBgP+sQYP/rEGP/6xBn/+sQQ%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bthis.tooltipText%20%3D%20%22L%3DOPEN%20addr.string%20%26%20M%3DOPEN%20sel./clipb.%20%26%20R%3DSEARCH%20sel./addr./clipb.%22%3B%0A%0Athis.setAttribute%28%22style%22%2C%20%22padding-left%3A%202px%20%21important%3B%20padding-right%3A%202px%20%21important%3B%20padding-top%3A%200px%20%21important%3B%20padding-bottom%3A%200px%20%21important%3B%20%20margin-top%3A%204px%20%21important%3B%20margin-bottom%3A%204px%20%21important%3B%22%29%3B%0A%0Aconst%20IN_NEW_TAB%20%3D%20true%3B%0Aconst%20IN_BACKGROUND%20%3D%20false%3B%0A%0Athis.onclick%20%3D%20function%28event%29%20%7B%0A%20%20%20%20if%28event.button%20%3D%3D%202%20%26%26%20%21event.ctrlKey%20%26%26%20%21event.shiftKey%20%26%26%20%21event.altKey%20%26%26%20%21event.metaKey%29%20%7B%0A%20%20%20%20%20%20%20%20event.preventDefault%28%29%3B%0A%20%20%20%20%20%20%20%20event.stopPropagation%28%29%3B%0AgoDoCommand%28%22cmd_copy%22%29%3B%0Avar%20strokaadresa%20%3D%20gURLBar.value%3B%0Avar%20nsa%3Dstrokaadresa.substring%280%2C4%29%3B%0Aif%20%28nsa%3D%3D%22http%22%29%7B%20var%20str%20%3D%20readFromClipboard%28%29%3B%7D%0Aelse%20%7B%20%0Aif%20%28nsa%3D%3D%22ftp%3A%22%29%7Bvar%20str%20%3D%20readFromClipboard%28%29%3B%7D%0Aelse%20%0A%7Bvar%20str%20%3D%20gURLBar.value%3B%7D%0A%7D%3B%0Avar%20ss%20%3D%20Cc%5B%22@mozilla.org/browser/search-service%3B1%22%5D.getService%28Ci.nsIBrowserSearchService%29%3B%0Avar%20submission%20%3D%20ss.currentEngine.getSubmission%28str%2C%20null%29%3B%0AgetBrowser%20%28%29.%20selectedTab%20%3D%20getBrowser%20%28%29.%20addTab%28submission.uri.spec%2C%20null%2C%20null%2C%20submission.postData%2C%20true%2C%20false%29%3B%0A%7D%0A%0Aelse%20if%28event.button%20%3D%3D%201%29%20%7B%0AgoDoCommand%28%22cmd_copy%22%29%3B%20%20%20%20%20%20%20%20%0Avar%20str%20%3D%20readFromClipboard%28%29%3B%0Aif%20%28%21str%29%0A%20%20return%3B%0Aif%20%28IN_NEW_TAB%29%0A%20%20getBrowser%20%28%29.%20selectedTab%20%3D%20getBrowser%20%28%29.%20addTab%28str%2C%20null%2C%20null%2C%20null%2C%20IN_BACKGROUND%2C%20false%29%3B%0Aelse%0A%20%20gBrowser.loadURI%28str%29%3B%0A%7D%3B%0A%0Aif%28event.button%20%3D%3D%200%29%20%7B%0A%20%20%20%20%20%20%20%20var%20str%20%3D%20gURLBar.value%3B%0A%20%20%20%20%20%20%20%20if%20%28%21str%29%20return%3B%0Aif%20%28IN_NEW_TAB%29%0A%20%20getBrowser%20%28%29.%20selectedTab%20%3D%20getBrowser%20%28%29.%20addTab%28str%2C%20null%2C%20null%2C%20null%2C%20IN_BACKGROUND%2C%20false%29%3B%0Aelse%0A%20%20gBrowser.loadURI%28str%29%3B%20%20%20%20%20%20%20%0A%20%7D%3B%20%20%20%20%20%20%20%0A%20%20%20%20%7D%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*%0A%0AGo%20plus%21%0A%A9%20bunda1%2C%20okkamas_knife%2C%20ignorecheats%20%202011%20%3B%29%0A%0A*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Скрин:
0e97c851dc8d.jpg
Слева от адресной строки - кнопка выбора поисковика (за помощь и код снова большое спасибо bunda1):
Код кнопки Select Search Engine:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3ESelect%20Search%20Engine%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACiklEQVQ4jWWTS2yMURTH/4NISCgRiQUbsRERC7GSEISNnSUbO2JnI2IrUqodNVOtaetRbU2nWn1PWx2kQmhIJFqPpiGUaKdfq63ON318c7+fxXfTFItf7uOc+ztncY+A0FK8b9G9uR9lcTMac/zxCpioxB8rn8yNxprmvpUc/jdfi4fPsTwzUhr302HI1IP3AfwhmE+BcxFGLuGPRfFGytpmRiIb/xZ8OrfG+3Khj+FT4D4G/ytkO+DnefiwH95shrfbYPAgDJ/B/Mj/OPUuf/2iYKH/WJU/sA9mX4AZgOlqGDoBfVugdwU8ETwV9Ibg1Tr8gb14Q6fbgJCmX+zY4z3fCNP1sPAS0mHoPwLP8uCRoNvSI0gJngi/dzle31bm3h46rKnO1RVe/1HItMDXs/B6F/SshA5Bm6BdwT4p6FIgfSy8VIjs0w1NynaGBv3Bk/DpODzbBMkQtAialtCs4K7NirqF3yPc7mWTmk3K81NrIbU2SHgoaBDUL+GBoNHKWoOO/C7hJkPIbdW8abcVGu2DuKBWUGOpFdRZ0UMrSYrZDiG3We9Niw0kbHKV4JagwnJbcM+KHwSdmFYx0yJHM42KzjXYwH3BXUG5oFRQYikTVFpJXdBprllkm5TQrxrt/B2XydUJqm3FG4KI4LolYiW3gw79ejHfIJyEDggIzdQqmosLc0eYm8JEhCkWueJgNcXCRIUpF6ZaLMRFJqHE4k/8HtYqt0Y9bkxkIsINC7cwIFsoskUiWywyJcKtFFP39PpzTHl/DdP3sFZNxhQdK5LnFIjxywETV8REgRgvFE5YZqxUVc4trfl/Gi0/r2n7xDUVpa/qvVOg+fQVeelCDY0WKepc1+5/8/8AC2i/6y6mDqYAAAAASUVORK5CYII%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bthis.setAttribute%28%22style%22%2C%20%22padding-left%3A%202px%20%21important%3B%20padding-right%3A%202px%20%21important%3B%20padding-top%3A%200px%20%21important%3B%20padding-bottom%3A%200px%20%21important%3B%20%20margin-top%3A%204px%20%21important%3B%20margin-bottom%3A%204px%20%21important%3B%22%29%3B%0A%0A%0Afunction%20searchService%28%29%20%7B%0Areturn%20Components.classes%5B%22@mozilla.org/browser/search-service%3B1%22%5D%0A.getService%28Components.interfaces.nsIBrowserSearchService%29%3B%0A%7D%0A%0A%20this.selectEngine%20%3D%20function%28aNode%2C%20aEvent%29%20%7B%0A%20%20var%20engine%20%3D%20aEvent.target.engine%3B%0A%20%20var%20ss%20%3D%20searchService%28%29%3B%0A%20%20ss.currentEngine%20%3D%20ss.getEngineByName%28engine.name%29%3B%0A%20%20aNode.engine%20%3D%20engine%3B%0A%20%20aNode.image%20%3D%20aEvent.target.getAttribute%28%22src%22%29%3B%0A%7D%0A%0Athis.populateMenu%20%3D%20function%28aNode%29%20%7B%0A%20%20var%20ss%20%3D%20searchService%28%29%3B%0A%20%20var%20engines%20%3D%20ss.getVisibleEngines%28%7B%20%7D%29%3B%0A%20%20const%20kXULNS%20%3D%20%22http%3A//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul%22%3B%0A%0A%20%20while%28aNode.firstChild%20%26%26%20aNode.firstChild.localName%20%21%3D%20%22menuseparator%22%29%20%7B%0A%20%20%20%20aNode.removeChild%28aNode.firstChild%29%3B%0A%20%20%7D%0A%0A%20%20for%28var%20i%20%3D%20engines.length%20-%201%3B%20i%20%3E%3D%200%3B%20i--%29%20%7B%0A%20%20%20%20var%20mi%20%3D%20document.createElementNS%28kXULNS%2C%20%22menuitem%22%29%3B%0A%20%20%20%20mi.id%20%3D%20%22cb-search-%22%20+%20engines%5Bi%5D.name%3B%0A%20%20%20%20mi.className%20%3D%20%22menuitem-iconic%20searchbar-engine-menuitem%22%3B%0A%20%20%20%20mi.setAttribute%28%22label%22%2C%20engines%5Bi%5D.name%29%3B%0A%20%20%20%20if%28engines%5Bi%5D.iconURI%29%0A%20%20%20%20%20%20mi.setAttribute%28%22src%22%2C%20engines%5Bi%5D.iconURI.spec%29%3B%0A%20%20%20%20mi.engine%20%3D%20engines%5Bi%5D%3B%0A%20%20%20%20if%28mi.engine%20%3D%3D%20ss.currentEngine%29%0A%20%20%20%20%20%20mi.style.fontWeight%20%3D%20%22bold%22%3B%0A%20%20%20%20mi.setAttribute%28%22onclick%22%2C%0A%20%20%20%20%20%20%22event.preventDefault%28%29%3Bevent.stopPropagation%28%29%3BparentNode.parentNode.selectEngine%28parentNode.parentNode%2C%20event%29%3B%22%29%3B%0A%20%20%20%20aNode.insertBefore%28mi%2C%20aNode.firstChild%29%3B%0A%20%20%7D%0A%7D%0A%0Athis.currentEngine%20%3D%20searchService%28%29.currentEngine%3B%0A%0Avar%20ss%20%3D%20searchService%28%29%3B%0Athis.engine%20%3D%20ss.currentEngine%3B%0Athis.image%20%3D%20this.engine.iconURI.spec%3B%0A%0Avar%20mp%20%3D%20this.appendChild%28document.createElement%28%22menupopup%22%29%29%3B%0Amp.setAttribute%28%22onpopupshowing%22%2C%20%22parentNode.populateMenu%28this%29%22%29%3B%0Amp.setAttribute%28%22oncommand%22%2C%20%22event.stopPropagation%28%29%22%29%3B%0A%0Avar%20managerSeparator%20%3D%20mp.appendChild%28document.createElement%28%22menuseparator%22%29%29%3B%0AmanagerSeparator.id%20%3D%20%22cb-searchbutton-separator%22%0Avar%20managerItem%20%3D%20mp.appendChild%28document.createElement%28%22menuitem%22%29%29%3B%0AmanagerItem.setAttribute%28%22label%22%2C%20%22Manage%20Search%20Engines%22%29%3B%0AmanagerItem.setAttribute%28%22oncommand%22%2C%0A%20%20%22openDialog%28%27chrome%3A//browser/content/search/engineManager.xul%27%2C%20%22%20+%0A%20%20%22%27engineManager%27%2C%20%27chrome%2C%20dialog%3Dno%27%29%22%29%3B%0A%20%20%0Athis.type%20%3D%20%22menu%22%3B%0A%0A%0A%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

справа адресной строки -  кнопка SEARCH AND OPEN 2 Go plus! :)


Добавлено 26-09-2011 20:02:02
P.S. Там в "Готовых кнопках" Search and Open тоже нужно поправить блокировку контекстного меню старой кнопки... ;)

P.P.S. Update. 

Поспешил я... Теперь подумал и ... поменял между собой действия по нажатиям левой и правой кнопок мыши, так привычнее и логичнее...
Теперь это уже по функциям и внешнему виду не Search and Open, a Go plus! ... :D - иконка кнопки - соответствующая, как и ее расположение - на месте скрытой стандартной кнопки Go ;)

Функции кнопок мыши:

Левая   => обычная кнопка Go - открыть URL из строки адреса (тут и далее - в новой активной вкладке(настраивается в коде...))
плюс дополнительно:
Средняя => открыть "текстовую" ссылку, выделенную на странице, или, при отсутствии выделенного, - ссылку, находящуюся в буфере обмена
Правая => искать в текущем поисковике текст, выделенный на странице, или набранный в строке адреса или находящийся в буфере обмена.

И еще дополнительно,  - один, чаще всего используемый поисковик можно установить через about:config , параметр keyword.URL как отдельную опцию поиска из адресной строки. Поиск этим поисковиком будет осуществяться независимо от выбранного поисковика кнопочкой Select Search Engine после набора текста в строке адреса и нажатия кнопки ENTER. :)

Отредактировано ignorecheats (27-09-2011 07:53:43)

Отсутствует

 

№307326-09-2011 20:08:44

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

Re: Custom Buttons

ignorecheats пишет

Там в "Готовых кнопках" Search and Open тоже нужно поправить блокировку контекстного меню старой кнопки... ;)

ok

Отсутствует

 

№307427-09-2011 07:04:14

ignorecheats
Забанен
 
Группа: Members
Зарегистрирован: 01-09-2011
Сообщений: 104
UA: Firefox 2.0

Re: Custom Buttons

Обновил пост, теперь это - мои две любимые кнопки. Select Search Engine и Go plus! ;)

Отредактировано ignorecheats (27-09-2011 07:16:34)

Отсутствует

 

№307527-09-2011 20:51:18

Kamui
Участник
 
Группа: Members
Зарегистрирован: 31-03-2011
Сообщений: 1796
UA: Firefox 7.0

Re: Custom Buttons

ignorecheats
По поводу дромаркера в кнопке Select Search Engine здесь, очень сомнительно удобство в нижнем дропмаркере, подскажите как исправить на обычный или вообще убрать, стилем у меня и така все дропмаркеры убраны, но после этого данная кнопка остается кривой, по ширине и высоте.

Отсутствует

 

Board footer

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