okkamas_knife
Спасибо большое. И аналогичный вопрос по поводу кнопки Play/Pause для управления foobar2000, может быть есть? Существует аддон Foobar Controls, но он работает только с очень старыми версиями программ, жаль, хотя автор проверенный и даже исходники доступны. Подозреваю, что там нужно изменить самый минимум, чтобы заработало, но видимо из-за невостребованности оно похоронено.
Отсутствует
okkamas_knife
К сожалению я не понимаю как это делается, особенно управление foobar-ом через командную строку. Решил в очередной раз попробовать, включил принудительную совместимость и откатил foobar на старую версию, но безрезультатно, все таже ошибка, которая была год назад. Ощущение, что здесь какая-то принципиальная ошибка ибо foobar не тот плеер, который часто кардинально обновляется.
Отсутствует
Существует аддон Foobar Controls, но он работает только с очень старыми версиями программ, жаль, хотя автор проверенный и даже исходники доступны. Подозреваю, что там нужно изменить самый минимум, чтобы заработало, но видимо из-за невостребованности оно похоронено.
vom а FoxyTunes вроде бы поддерживает foobar2000
Отредактировано Крошка Ру (21-09-2011 10:11:18)
Отсутствует
Крошка Ру
Похоже работает, но он весит мегабайт и там слишком много лишнего.
okkamas_knife
Может быть здесь есть нужное? Я просто не знаю что искать.
http://www.foobar2000.org/files/2885341 … -03-11.zip
Отсутствует
okkamas_knife
Спасибо Вам огромное, я и не представлял как это делается, а оказывается все так просто.
И теперь мелочи, как сделать мигающую кнопку, чтобы отдача от 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)
Отсутствует
И теперь мелочи, как сделать мигающую кнопку, чтобы отдача от 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, непонятно
Отсутствует
bunda1
Первый код вообще меняет иконку на такую и не работает, а второй просто не работает.
Под отдачей имелось ввиду мигание, т.е. подтверждение нажатия, Вы же ставили кнопку Session Bookmarks, вот она при нажатии СКМ затемняет иконку на миллисекунды, причем любую установленную пользователем.
А кнопка супер получилась, она оказывается еще запускает foobar и автоматически начинает воспроизведение.
Отредактировано vom (22-09-2011 05:22:01)
Отсутствует
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";
Отсутствует
okkamas_knife
Думаете рискованно доверять кнопкам участников этого форума?
Вот, надеюсь разборчиво.
http://rghost.ru/22560801
Отсутствует
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'");
Отсутствует
okkamas_knife
У меня стандартная тема, просто персона черная, и код "blink" действует, но не важно, раз мы это уже решили верхним кодом с 2 иконками. :)
Да, устроит, спасибо, все сделал наконец. :blush:
Отсутствует
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); }
Отсутствует
Код из 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();
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
2 вопроса по Search and open и Search and open +.
1. Можно ли в первую кнопку добавить действие поиска текста, набранного в адресной строке, не по даблклику, как сделано в Search and open +, а по тому же левому клику как один из 3-х вариантов в следующем порядке: а) искать текст из адресной строки
б) если в адресной строке находится адрес, т.е. есть две косых "//", то искать выделенное на странице
в) если выделенного нет, то искать текст из буфера обмена?
Даблклик мне мешает, так как используется в других местах.
2. Из кода выбора поисковика из второй кнопки я сделал себе отдельную кнопку. Как ее переделать, чтобы убрать боковой дропдаунмейкер и заменить простым выпадающим меню, в идеале - с нижним дропмейкером?
Удобнее прицеливаться по кнопке будет и место на панели экономится.
Скрин того, как у меня сейчас, желтая кнопка - выбор поисковика, зеленая - Search and open, дропмейкер между ними - лишний:
Апдейт. Вместо зачеркнутого:
а) искать выделенный на странице текст,
б) если выделенного нет И если в адресной строке находится НЕ адрес (т.е. нет двух косых "//" ?...), то искать текст из адресной строки,
в) в противном случае искать текст из буфера обмена.
Отредактировано ignorecheats (26-09-2011 08:17:27)
Отсутствует
переделать, чтобы убрать боковой дропдаунмейкер и заменить простым выпадающим меню, в идеале - с нижним дропмейкером?
на
насчет Search and open подумаю завтра
Отредактировано bunda1 (26-09-2011 00:08:03)
Отсутствует
Taк просто!
Спасибо bunda1!
А первый вопрос?
Отредактировано ignorecheats (26-09-2011 08:18:19)
Отсутствует
ищешь в коде dblclick и заменяешь на click
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;
Вопрос. Как написать такое условие?
Скрины:
Хочу, чтобы стало так:
Отредактировано ignorecheats (26-09-2011 10:03:50)
Отсутствует
okkamas_knife
Я не чукча писатель, я - читатель...
Мне бы готовое решение.
Отсутствует
УРРЯ!!! Работает!
okkamas_knife, bunda1, Спасибо огромное!!!
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
Отредактировано ignorecheats (26-09-2011 12:13:58)
Отсутствует
Хмм, добавил в кнопку еще этот код для открытия по правой кнопке мыши набранного 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)
Отсутствует
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)
Отсутствует
Супер! Спасибо, все работает!!!
Код кнопки 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
Скрин:
Слева от адресной строки - кнопка выбора поисковика (за помощь и код снова большое спасибо 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! ... - иконка кнопки - соответствующая, как и ее расположение - на месте скрытой стандартной кнопки Go
Функции кнопок мыши:
Левая => обычная кнопка Go - открыть URL из строки адреса (тут и далее - в новой активной вкладке(настраивается в коде...))
плюс дополнительно:
Средняя => открыть "текстовую" ссылку, выделенную на странице, или, при отсутствии выделенного, - ссылку, находящуюся в буфере обмена
Правая => искать в текущем поисковике текст, выделенный на странице, или набранный в строке адреса или находящийся в буфере обмена.
И еще дополнительно, - один, чаще всего используемый поисковик можно установить через about:config , параметр keyword.URL как отдельную опцию поиска из адресной строки. Поиск этим поисковиком будет осуществяться независимо от выбранного поисковика кнопочкой Select Search Engine после набора текста в строке адреса и нажатия кнопки ENTER.
Отредактировано ignorecheats (27-09-2011 07:53:43)
Отсутствует
Там в "Готовых кнопках" Search and Open тоже нужно поправить блокировку контекстного меню старой кнопки...
ok
Отсутствует
Обновил пост, теперь это - мои две любимые кнопки. Select Search Engine и Go plus!
Отредактировано ignorecheats (27-09-2011 07:16:34)
Отсутствует
ignorecheats
По поводу дромаркера в кнопке Select Search Engine здесь, очень сомнительно удобство в нижнем дропмаркере, подскажите как исправить на обычный или вообще убрать, стилем у меня и така все дропмаркеры убраны, но после этого данная кнопка остается кривой, по ширине и высоте.
Отсутствует