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

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

№65130-03-2016 20:43:58

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

Re: [CB]Toggle Find+

zbf пишет

bunda1
Можно ли сделать, чтобы надпись в поиске автоматически очищалась  закрытии панели? :rolleyes:

Ctrl+ snift+ f, открыть панель поиска с чистой поисковой формой.

Отсутствует

 

№65231-03-2016 08:49:29

zbf
Участник
 
Группа: Extensions
Зарегистрирован: 27-04-2005
Сообщений: 39
UA: Firefox 38.0

Re: [CB]Toggle Find+

bunda1

bunda1 пишет

Ctrl+ snift+ f, открыть панель поиска с чистой поисковой формой.

С гор.клавишами все понятно, но хотелось  бы обойтись „как  бы без них” - кнопкой  в панели дополнений... ;)

Отредактировано zbf (31-03-2016 21:02:28)

Отсутствует

 

№65331-03-2016 21:30:31

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

Re: [CB]Toggle Find+

zbf пишет

bunda1
хотелось  бы обойтись „как  бы без них” - кнопкой  в панели дополнений

Ну тогда так:

Выделить код

Код:

// Настройка функций кликов мыши для кнопки ................................
this.onclick =e=> {

    // действие при клике ЛКМ ....
    if ( e.button == 0 )
         gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
          
    // действие при клике СКМ ....    
    if ( e.button == 1 ) { 
         gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
         goDoCommand("cmd_paste");
         };
     
    // действие при клике ПКМ ....    
    if ( e.button == 2 && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey ) { 
         e.preventDefault();  
         menu.showPopup( this, -1, -1, "popup", "bottomleft", "topleft");
         }
};



// Настройки и переменные для кнопки ................................
var findbarRight = 18;             // отступ справа у мини панели поиска
var addKeyboardShortcuts = true;   // разрешить дополнительные сочетания клавиш для панели поиска
var alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService);



// Проверить наличие строк в about:config и создать если не существует ................................
if ( cbu.getPrefs("FindBar.version") !== '15') {
   ["FindBar.top","FindBar.mini","FindBar.right","FindBar.auto_Close","FindBar.autoclear","FindBar.Highlight",
    "FindBar.Highlight.Link","FindBar.pasteButton","FindBar.contextFindWords","FindBar.ToggleWithDoubleMiddleClick",
    "FindBar.Autohighlight.ToggleWithDoubleClick","FindBar.auto_Find"].forEach(function(pref) cbu.setPrefs(pref, false) );
     
    ["FindBar.version,15", "FindBar.CloseTimer,7", "ui.textHighlightBackground,#ef0fff", "FindBar.Highlight.value,"]
    .forEach(function(pref) cbu.setPrefs(pref.split(",")[0], pref.split(",")[1]) );     
};



// Подсказка для кнопки ................................
this.onmouseover =()=> {
   // получить и обрезать подсказку для автовыделение ....
   var val = gPrefService.getComplexValue("FindBar.Highlight.value", Ci.nsISupportsString).data;
   var value = val.substring(0,50) + ( (val.length > 50) ? '....' : "" );
                    
   this.tooltipText = "Поиск по странице \nЛ:    Показать - скрыть поиск по странице \nС:    Поиск по странице из буфера обмена\
                        \nП:    Mеню кнопки \nДП: CB меню \n\nАвтовыделение: " + value;                                                    
};



// Создать меню с настройками для кнопки ................................
var array = [
  { label: 'Автоматически закрыть', value: 'FindBar.auto_Close', func: autoClose, cek:''},
  { label: 'Закрыть через: |7| секунд', value: 'FindBar.CloseTimer', change:''},
  { separator: '' },
  { label: 'FindBar мини', value: 'FindBar.mini', func: toggleAttribute, cek:''},
  { label: 'FindBar сверху', value: 'FindBar.top', func: toggleAttribute, cek:''},
  { label: 'FindBar справа', value: 'FindBar.right', func: toggleAttribute, cek:''},
  { label: 'Кнопка "Вставить и искать" на FindBar', value: 'FindBar.pasteButton', func: toggleAttribute, cek:''},
  { separator: '' },
  { label: 'Find в контекстном меню', value: 'FindBar.contextFindWords', cek:''},
  { label: 'Запуск поиска выделением текста', value: 'FindBar.auto_Find', cek:''},
  { label: 'Быстрый поиск по мере набора текста', value: 'accessibility.typeaheadfind', cek:''},
  { label: 'Открывать панель поиска с чистой поисковой формой', value: 'FindBar.autoclear', cek:''},  
  { label: 'Переключать FindBar двойным средним кликом на странице', value: 'FindBar.ToggleWithDoubleMiddleClick', cek:''},
  { label: 'Переключать aвтовыделение двойным кликом на панели поиска', value: 'FindBar.Autohighlight.ToggleWithDoubleClick', cek:''},
  { separator: '' },
  { label: 'Автовыделение', value: 'FindBar.Highlight', func: toggleAttribute, cek:''},
  { label: 'Автовыделение в ссылках', value: 'FindBar.Highlight.Link', func: Highlight, cek:''},
  { label: 'Добавить текст для автовыделения', value: 'add', func: toggleHighlightValue },
  { label: 'Сбросить текст для автовыделения', value: 'clear', func: toggleHighlightValue },
  { label: 'Изменить цвет: |#ef0fff| для автовыделения', value: 'ui.textHighlightBackground', change:''}
            ];

var menu = self.appendChild( document.createElement("menupopup") );
array.forEach(function( m ) {
     if ( "separator" in m ) { menu.appendChild( document.createElement("menuseparator") ); return };
     if ( "value" in m ) var p = cbu.getPrefs( m.value );   
     var mItem = document.createElement("menuitem"), arr = m.label.split("|");    
     mItem.setAttribute("label", ( "change" in m ) ? (arr[0] + p + arr[2]) : m.label );     
     if ( "cek" in m ) { 
          mItem.setAttribute('type', 'checkbox');
          mItem.setAttribute('checked', p );
          mItem.setAttribute('onclick', 'custombuttons.setPrefs("' + m.value + '", !custombuttons.getPrefs("' + m.value + '"))');                                                      
          }              
     if ( "change" in m ) {
          mItem.addEventListener("command", function(e) {
             var val = custombuttons.promptBox( this.label, 'Отмена вернёт значение по умолчанию');
             var pref = val[0] ? val[1] : arr[1];
             cbu.setPrefs( m.value, pref );
             this.label = arr[0] + pref + arr[2];
          }, false);
          };
     if ( "func" in m ) mItem.addEventListener("command", function(e) { m.func( m.value ) }, false);

     menu.appendChild(mItem);
});
menu.setAttribute("onclick", "event.stopPropagation()");



// Установить и удалить разные атрибуты для панели поиска ................................
function toggleAttribute( s ) {
  if ( s == "FindBar.Highlight" ) { gFindBar.getElement('highlight').removeAttribute("checked"); Highlight(); return };
  
  var atrr = s.substring(8);
  setTimeout(function(){ cbu.getPrefs( s ) ? gFindBar.setAttribute( atrr, "true") : gFindBar.removeAttribute( atrr ) }, 0);
  if ( s !== "FindBar.mini" ) return;      
  if ( cbu.getPrefs( s ) ) {       
       if ( gFindBar.getElement('highlight').hasAttribute("checked") ) {
            gFindBar._findField.style.color = cbu.getPrefs("ui.textHighlightBackground");
            }    
       }     
  else
       {
       if ( !!gFindBar._findField.style.color ) {
            gFindBar.getElement('highlight').setAttribute("checked", "true");
            gFindBar._findField.removeAttribute("style");
            }
       }        
};
["FindBar.top", "FindBar.mini", "FindBar.right", "FindBar.pasteButton"].forEach(function(s) toggleAttribute(s) );



// Установить нужную иконку кнопки при старте браузера или при изменениях настроек автовыделения ................................
var s = "FindBar.Highlight";
function toggleImage() {
   self.ownerDocument.getAnonymousElementByAttribute(self, "class", "toolbarbutton-icon").
   src = cbu.getPrefs(s)
   ? "data:image/x-icon;base64,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"
   : "data:image/x-icon;base64,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";  
};
toggleImage();
gPrefService.addObserver(s, toggleImage, false);
addDestructor(()=> gPrefService.removeObserver(s, toggleImage) );



// Удалить оргинальный панель поиска и создать новый с дополнительными возможностями ................................
delete window.gFindBar;
window.gFindBar = document.getElementById("FindToolbar");
if ( !gFindBar || gFindBar.parentNode != gBrowser.parentNode) {
     var version = parseInt(Services.appinfo.version);
     if ( version > 25 )                                // удалить на FF25+
          for( var tab of gBrowser.tabs ) {
          if ( !tab._findBar ) continue;
          tab._findBar.parentNode.removeChild( tab._findBar );    
          delete tab._findBar;
          }
     else document.getElementById("browser-bottombox")  // удалить на FF17-24
          .removeChild( document.getElementById("FindToolbar") );  
     
     if ( version > 38 ) {                              // исправить глюк на FF38+
          setTimeout(function() {
             eval("gFindBar.startFind = " + gFindBar.startFind.toString()
             .replace('this.browser.finder.getInitialSelection();',
             'this.onCurrentSelection(gBrowser.finder.getActiveSelectionText(), false)'));
             
             var {Finder} = Cu.import("resource://gre/modules/Finder.jsm");
             eval("Finder.prototype.getActiveSelectionText = " + Finder.prototype
             .getActiveSelectionText.toString().replace('.replace', '; //'));          
          }, 3000 );
          }        

     gFindBar = gBrowser.parentNode.insertBefore(document.createElement("findbar"), gBrowser);
     gFindBar.setAttribute("browserid", "content");
     version < 25 && gFindBar.setAttribute("oldFindBar", "true");       
     gFindBar.id = "FindToolbar";
     gFindBar.clientTop;
     delete window.gFindBarInitialized;
     window.gFindBarInitialized = true;

     gFindBar._selectionMaxLen = 1000;             // лимит символов для поиска и подсветки
     gFindBar._quickFindTimeoutLength = 4500;      // время закрытия панели поиска эсли тот открыт по мере набора текста
     };
if ( gFindBar instanceof Ci.nsIDOMEventListener )  // добавить поиск по мере набора текста
     addEventListener("keypress", gFindBar)

     function onBrowserKeypress(msg) {msg.target == gBrowser.selectedBrowser && gFindBar._onBrowserKeypress(msg.data);}
     messageManager.addMessageListener("Findbar:Keypress", onBrowserKeypress);
     addDestructor(() => messageManager.removeMessageListener("Findbar:Keypress", onBrowserKeypress));



// Показать количество совпадений на панели поиска, автор кода 'Dumby' ................................
var curHit, allHits, lastCurHit;
const fff = gFindBar._findField,
      lab = fff.parentNode.insertBefore( document.createElement("label"), fff ),
      nrm = Ci.nsISelectionController.SELECTION_NORMAL;
      lab.id = "hits";
addDestructor(function() fff.parentNode.removeChild(lab) );

function updateHits(arg) {
   if ( gFindBar.hidden ) return;
   var win = arg instanceof Ci.nsIDOMWindow && arg || content;
   var finder = gBrowser.finder || gFindBar;
   if ( win == content ) curHit = allHits = 0;
   var word = fff.value;
   var controller = finder._getSelectionController(win);
   var doc = win.document;
   
   if ( word && controller && doc && doc.documentElement ) {
        var body = doc instanceof HTMLDocument && doc.body ? doc.body : doc.documentElement;

        var searchRange = doc.createRange();
        searchRange.selectNodeContents(body);
        var startPt = searchRange.cloneRange();
        startPt.collapse(true);
        var endPt = searchRange.cloneRange();
        endPt.collapse(false);

        var retRange = null;
        var nsIFind = Cc["@mozilla.org/embedcomp/rangefind;1"].createInstance().QueryInterface(Ci.nsIFind);        
        nsIFind.caseSensitive = gFindBar._shouldBeCaseSensitive(word);

        while ((retRange = nsIFind.Find(word, searchRange, startPt, endPt))) {
               allHits++;
               if ( !curHit) {
                    var sel = controller.getSelection(nrm), range;
                    if ( sel.toString() ) range = sel.getRangeAt(0);
                    else {
                         var editableNode = finder._getEditableNode(retRange.startContainer);
                         if ( editableNode ) sel = editableNode.editor.selectionController.getSelection(nrm);
                         if ( sel.toString() ) range = sel.getRangeAt(0);
                         }
                    var comp = range && ["startContainer", "endContainer", "startOffset", "endOffset"]
                               .every(function(prop) range[prop] == retRange[prop]);
                    if ( comp ) curHit = allHits;
                    }
               startPt = retRange.cloneRange();
               startPt.collapse(false);
               }
        Array.forEach(win.frames, function(frame) updateHits(frame));
       }
    if ( win != content ) return;
    lab.value = curHit + "/" + allHits;
    
    if ( fff.value ) self.lastValueOfFind = fff.value; // запомнить текст для поиска   
    
    // поле текстового ввода красное если ничего не найдено .... 
    allHits == 0 && fff.value ? fff.setAttribute("status", "notfound") : fff.removeAttribute("status");

    // поле текстового ввода мигает желтим если переход с низа наверх страницы и наоборот ....
    if ( !!arg && arg == "flash" && allHits > 2 && (allHits/curHit * allHits/lastCurHit == allHits) ) {         
         fff.setAttribute("flash", true );
         setTimeout(function() fff.removeAttribute("flash"), 600);
         }
    lastCurHit = curHit;   
};
updateHits();



// FindBar, поиск колесиком мыши ................................
addEventListener('DOMMouseScroll', function(e) { gFindBar.onFindAgainCommand( e.detail < 0 ); updateHits("flash"); }, false, gFindBar );



// Отслеживать клики на панели поиска ................................
addEventListener("mousedown", function(e) {

   if ( e.button == 1 ) {  // поиск из буфера обмена
        e.preventDefault();
        var str = (gClipboard.read()).replace(/^\s+|\s+$/g,""); // убираем пробелы с концов текста
        gFindBar._findField.value = str;
        Highlight("hits", "greenLight");
        }   
   
   var targ = e.originalTarget
   if ( !targ.hasAttribute("anonid") ) return; 
   
   if ( targ.value == 'Найти:') { // кнопка 'Найти:' < FF24
        e.button ? clearFindField() : gFindBar.onFindAgainCommand(false);  
        updateHits("flash");
        }

   if ( targ.getAttribute('oncommand').startsWith("onFind") ) { // кнопки next, previous
        setTimeout(updateHits, 0, "flash");
        }         
   
}, false, gFindBar ); 



// Двойной клик на панели поиска включает и выключает автовыделение или стандартную подсветку текста ................................ 
addEventListener("dblclick", function(e) {
   
   if ( e.originalTarget.nodeName == 'div' && e.button == 0 ) return;
   if ( /:label|button|check/.test( e.originalTarget.nodeName ) ) return; 

   if ( cbu.getPrefs("FindBar.Autohighlight.ToggleWithDoubleClick") ) {       
        var s = cbu.getPrefs("FindBar.Highlight");
        cbu.setPrefs("FindBar.Highlight", !s );
        
        menu.childNodes[16].setAttribute("checked", !s);    
        gFindBar.getElement('highlight').removeAttribute("checked"); 

        Highlight(); 
        }             
   else  
        {
        if ( cbu.getPrefs("FindBar.Highlight") ) return;         
        gFindBar.getElement("highlight").click(); 
        gFindBar._findField.style.color = ( gFindBar._findField.style.color || !gFindBar.hasAttribute('mini') ) 
        ? "" : cbu.getPrefs("ui.textHighlightBackground");            
        };
   
   // закрыть контекстное меню поисковой формы ....
   var hbox = gFindBar._findField.mInputField.parentNode;
   setTimeout(function() document.getAnonymousElementByAttribute(hbox, "class", "textbox-contextmenu").hidePopup(), 20);     
                        
   window.content.focus(); 
}, false, gFindBar );



// ЛКМ + ПКМ на поле текстового ввода очищают его ................................
function clickToClear(e) { 
   if ( e.type == "mousedown" ) {
        if ( e.button == 0 ) this.leftButtonDown = true;
        if ( e.button == 2 && this.leftButtonDown ) {
             this.leftButtonDown = false;
             this.stopMenu = true; 
             setTimeout(function() { clearFindField() }, 0); 
             }
       }

   if ( e.type == "click" ) {
        if ( e.button == 0 ) this.leftButtonDown = false;
        if ( e.button == 2 && this.stopMenu ) {
             e.preventDefault();
             e.stopPropagation();
             this.stopMenu = false; 
             }
        }     
};
["mousedown", "click"].forEach(function(type) addEventListener( type, clickToClear, false, gFindBar._findField ) );



// Запускать поиск выделением текста если это разрешено в 'about:config' ................................
function autoFind(e) {
   if ( e.button !== 0 ) return;
   if ( !cbu.getPrefs("FindBar.auto_Find") ) return;
   if ( /input|password|textarea|textbox|searchbar|findbar|tabbrowser/.test( e.target.localName ) ) return;

   if ( e.type == 'mousedown' ) var lastSelection = getBrowserSelection();
   
   if ( e.type == 'mouseup' ) {   
        var selection = getBrowserSelection();
        if ( selection && selection !== lastSelection ) {
             setTimeout(function() {  
                gFindBar.onFindCommand();                      
                updateHits();
                lab.value == "0/0" ? Highlight() : Highlight("", "greenLight")
             }, 50);
             }   
        }
};
addEventListener("mouseup", autoFind, false, gBrowser );
addEventListener("mousedown", autoFind, false, gBrowser );



// Автоматически закрывать панель поиска если это разрешено в 'about:config' ................................       
function autoClose() {
  
  window.clearTimeout( self.closeTimer );
  try { autoClose.removeListener() } catch(e) {};
  
  function closeFind(e) { 
     if ( e !== 'timer' && e.target.nodeName == 'findbar') { 
          window.clearTimeout( self.closeTimer ); 
          
          autoClose.run = true;         
          }               
     else if ( e == 'timer' || autoClose.run && !gFindBar._findField.getAttribute("focused") ) {    
               self.closeTimer = setTimeout(function() {          
                      gFindBar.close();                  
               }, cbu.getPrefs("FindBar.CloseTimer") + '000');               

               autoClose.run = false;               
               }
  }
  
  if ( cbu.getPrefs("FindBar.auto_Close") && !gFindBar.hidden ) { 
       closeFind('timer');       
       addEventListener('mouseover', closeFind, false, window );       
       autoClose.removeListener = function() { removeEventListener('mouseover', closeFind, false, window ) };  
       } 
};



// Переключать панель поиска двойным средним кликом на странице ................................
addEventListener("mouseup", function(e) {
  if ( e.button !== 1 ) return;
  if ( !cbu.getPrefs("FindBar.ToggleWithDoubleMiddleClick") ) return;
       
       if ( self.flag ) { 
            gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close(); 
            Highlight("hits", "greenLight");
            gFindBar._findField.focus();
            };
            
       self.flag = true;
       
       setTimeout(function() { self.flag = false }, 600); // сбросить флаг по таймеру
}, false, gBrowser );



// Сочетания клавиш для управление поиском на странице ................................
addEventListener('keydown', function(e) {
  if ( content.location.href == 'chrome://browser/content/places/places.xul' ) return;
  
  // Ctrl+ snift+ g и F3, запуск подсчета совпадений ....
  if ( e.keyCode == 114 || ((!e.altKey) && ((e.ctrlKey) || (e.shiftKey)) && (e.keyCode == 71)) ) {
       gFindBar.hidden || setTimeout(updateHits, 0, "flash");
       }

  // Ctrl+ f, показать - скрыть панель поиска ....
  if ( (e.ctrlKey) && (!e.altKey) && (!e.shiftKey) && (e.keyCode == 70) ) {
       e.preventDefault();
       e.stopPropagation();
       gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close(); 
       Highlight("hits", "greenLight");
       gFindBar._findField.focus();
       }
       
  if ( !addKeyboardShortcuts ) return; // дальше дополнительные сочетания клавиш для панели поиска
       
  // Ctrl+ alt+ f, поиск по странице из буфера обмена ....
  if ( (e.ctrlKey) && (e.altKey) && (e.keyCode == 70) ) {
       gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
       goDoCommand("cmd_selectNone");
       goDoCommand("cmd_paste");
       Highlight("hits", "greenLight");
       }

  // Ctrl+ alt+ h, добавить текст(выделенный / из буфера обмена) для автовыделения ....
  if ( (e.ctrlKey) && (e.altKey) && (e.keyCode == 72) ) toggleHighlightValue('add');
  
}, false, window );



// Автоматически выделить слова и ссылки ................................
function Highlight( hits, green ) {

  var findValue = gFindBar._findField.value;
  var hidden = gFindBar.hidden;

  if ( !hidden ) {
       // выделить зеленным искомый текст на странице .... 
       if ( !!green && green == "greenLight") setTimeout(function() { gFindBar._find() }, 10);  
  
       // для запуска подсчета совпадений ....
       if ( !!hits && hits == "hits" ) setTimeout( updateHits, 20);
       }

  // получаем текст для автовыделения из 'about:config' или из панели поиска ....
  if ( cbu.getPrefs("FindBar.Highlight") ) {
       var value = hidden
       ? gPrefService.getComplexValue("FindBar.Highlight.value", Ci.nsISupportsString).data 
       : ( findValue.length > 2 ) ? findValue: "";
       } 

  // удалить и запустить подсветку совпадений ....
  var finder = gBrowser.finder || gFindBar;
  var lighted = (finder._highlightDoc || finder._highlight).bind(finder);
  lighted(false); if ( !!value ) lighted(true, value );

     
  /* изменить цвет ссылок на страницах если содержат искомое слово,
     если разрешено в 'about:config' и включена автовыделение ....*/
    
    var hLink = cbu.getPrefs("FindBar.Highlight.Link") && value;
    var color = cbu.getPrefs("ui.textHighlightBackground");

    function highlightLinks( win ) {
       var doc = win.document, links = doc.links;
       
       if ( (hLink || "prop1" in doc ) && links ) {
             hLink ? doc.prop1 = true : delete doc.prop1;

             Array.forEach( links, function(link) {

                if ("prop2" in link) link.style.color = link.prop2;
                if ( hLink && String( link ).indexOf( value ) != -1 ) {
                     link.prop2 = link.style.color;
                     link.style.color = color;
                     }
                else if ("prop2" in link) delete link.prop2;
             });
        }
        for ( var i = 0; i < win.frames.length; i++ ) highlightLinks( win.frames[i] );
    };
    highlightLinks( content );
};


   
// Обработчик следит за загрузкой и переключением вкладки и запускают автовыделение ................................
var listener = { 
   onStateChange: function(wpr, req, flag) {
      if ( gBrowser.currentURI.spec == 'chrome://global/content/console.xul') return; 
      if ( flag & Ci.nsIWebProgressListener.STATE_STOP ) Highlight("hits");
   },
      
   onLocationChange: function(wpr, req) {
      if ( wpr.currentURI.spec != "about:blank" && !req && wpr.document.readyState == "complete")
           Highlight("hits");
      gFindBar._findField.removeAttribute("style");
      gFindBar.getElement('highlight').removeAttribute("checked");           
   }       
};
gBrowser.addProgressListener( listener );
addDestructor(function() gBrowser.removeProgressListener( listener ) );



// Обработчики следят за панелью поиска, запускают автовыделение и другие функции ................................
addEventListener("drop", function(e) { Highlight("hits", "greenLight") }, false, gFindBar._findField );
addEventListener("input", function() { Highlight("hits", "greenLight") }, false, gFindBar._findField );
gFindBar.watch("hidden", function( prop, oldV, hidden ) {
   setTimeout(function() { Highlight("hits", "greenLight"); autoClose() }, 10);
    
   if ( !hidden && cbu.getPrefs("FindBar.autoclear") ) { // открывать без выделенного текста
        document.activeElement.blur();
        gFindBar._findField.value = '';
        gFindBar._findField.focus();
        }
       
  return hidden;
});



// Добавляем подменю в контекстного меню на странице для выделенного текста ................................
(function() {
  var contextMenu = document.getElementById("contentAreaContextMenu");  
  
  var menu = document.createElement("menu");      
  menu.setAttribute("label", "Find");  
  contextMenu.insertBefore( menu, document.getElementById("context-sep-properties") ); 
  addEventListener("popupshowing", function() {
     menu.hidden = !cbu.getPrefs("FindBar.contextFindWords") || !gContextMenu.isTextSelected; 
  }, false, contextMenu );
  addDestructor(function() contextMenu.removeChild(menu) );
  
  var array = [
              { label:"Найти на странице", func: findToContex },
              { label:"Выделить текст на странице", func: highlightSel },
              { label:"Автовыделение, добавить текст", func: addSel }
              ];
  var menuPopup = menu.appendChild( document.createElement("menupopup") );              
  array.forEach(function( m ) {  
       var mItem = document.createElement("menuitem");
       mItem.setAttribute("label", m.label);
       mItem.func = m.func;
       menuPopup.appendChild( mItem );
  });
  addEventListener("command", function(e) { e.target.func() }, false, menu );
  
  function findToContex() {
     gFindBar.onFindCommand();
     Highlight("hits", "greenLight");
  };
        
  function highlightSel() {
     var finder = gBrowser.finder || gFindBar;
     var lighted = (finder._highlightDoc || finder._highlight).bind(finder);
     lighted(false), lighted(true, getSelect() );
     goDoCommand("cmd_selectNone");
  };
        
  function addSel() toggleHighlightValue('add'); 
})();



// Очистить поле текстового ввода на Findbar ................................
function clearFindField() {  
  setTimeout(function() { 
     gFindBar._findField.value = ''; 
     Highlight("hits");
     gFindBar._findField.focus();
  }, 0)
};       



// Добавить или удалить текст для автовыделения ................................
function toggleHighlightValue( arg ) { 
  if ( arg == 'clear' ) {
       var str = '', title = self.label, notification = "Текст для автовыделение удален";
       }        
  if ( arg == 'add' && getSelect() ) {
       var str = getSelect(), title = "Автовыделение"; 
       var notification = str.substring(0,50) + ( (str.length > 50) ? '....' : "" );
       if ( cbu.getPrefs("FindBar.Highlight") ) { goDoCommand("cmd_selectNone") };           
       }       
  cbu.setPrefs("FindBar.Highlight.value", convertFromUnicode("UTF-8", str) );
  alertsService.showAlertNotification( self.image, title, notification, false, "", null, "");     
  Highlight();      
};
 
  

// Получить выделенный текст из страницы или из буфера обмена, если нет текста получить false ..........
function getSelect() {
   var sel = document.commandDispatcher.focusedWindow.getSelection().toString(); // из страницы
   if (sel == '') {    
       var el = document.commandDispatcher.focusedElement; // из текстового поля
       if ( el && el.textLength ) 
            sel = el.value.substring(el.selectionStart, el.selectionEnd);  
       }
   if (sel == '') sel = gClipboard.read(); // из буфера обмена
   if (sel == '') alertsService.showAlertNotification(self.image, self.label, "Выделите или скопируйте текст!", false, "", null, "");
  
   return (sel == '') ? false : sel.toString().replace(/^\s+|\s+$/g,""); // убираем пробелы с концов текста
};



// Запустить поиск через Toggle Find+3 если нажать в главном меню на пункт меню 'Найти' ................................
addEventListener("command", function() { gFindBar.onFindCommand(); Highlight("hits", "greenLight") }, false, document.getElementById("cmd_find") );



// Создать кнопку "Учесть регистр" на Findbar ................................
var check = document.createElement("checkbox");
check.setAttribute("id", "findCheckbox");
check.setAttribute("label", "Учесть регистр");
check.setAttribute("tooltiptext", "Учесть регистр");
check.setAttribute("checked", gFindBar._shouldBeCaseSensitive(""));
gFindBar.getElement("findbar-container").appendChild( check );
addDestructor(function() check.parentNode.removeChild( check ) );
check.addEventListener("command", function() { gFindBar._setCaseSensitivity(this.checked); Highlight("hits", "greenLight") });               



// Создать кнопку "Поиск" на Findbar ................................
var search = document.createElement("toolbarbutton");
search.setAttribute("id", "findButton");
search.setAttribute("tooltiptext", "Л: Искать следущее \nС: Поиск текста из буфера \nП: Искать предыдущее");
search.setAttribute("style", "list-style-image: url('chrome://global/skin/icons/Search-glass.png') !important; -moz-image-region: rect(0px, 16px, 16px, 0px);");                             
gFindBar.getElement("findbar-container").appendChild( search );
addDestructor(function() search.parentNode.removeChild( search ) );
search.addEventListener("click", function(e) { e.button !== 1 && gFindBar.onFindAgainCommand(!!e.button); updateHits("flash") });



// Создать кнопку "Вставить и искать" на Findbar ................................
var paste = document.createElement("toolbarbutton");
paste.setAttribute("id", "pasteButton");
paste.setAttribute("tooltiptext", "Л: Поиск выделенного текста/из буфера \nП: Очистить");
paste.setAttribute("image", "data:image/x-icon;base64,AAABAAEADhAAAAEAIADoAwAAFgAAACgAAAAOAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5eXn/eXl5/3l5ef95eXn/eXl5/3l5ef95eXn/eXl5/ylTda0pU3X/KVN1/ylTdf8pU3X/HTpS/4WFhf/w8PL/8fHz//Hx8//x8fP/8fHz//Hx8/+FhYX/KVN1/yRJaP8jSGf/I0dl/yNHZP8YMEX/j4+P//Hx8//x8vP/8fLz//Hy8//x8vP/8fLz/4+Pj/8pU3X/JUxr/yVLav8kSmn/JElo/xkyR/+cnJz/8vLz//Ly9P/y8vT/8vL0//Ly9P/y8vT/nJyc/ylTdf8nTm3/Jk1t/yVMa/8lSmn/GjNJ/6urq//y8vT/8/P1//Pz9f/z8/X/8/P1//Pz9f+rq6v/KVN1/ydPb/8nTm7/Jk1t/yZMa/8aNEr/srKy//X19v/19vf/9fb3//X29//19vf/9fb3/7Kysv8pU3X/J1Bx/ydQb/8nTm//Jk1t/xs2S/+8vLz/+fr6//r7+//6+/v/ubm5/7e3t/+3t7f/ubm5/ylTdf8oUXP/KFBx/ydQcf8nT2//GzZN/76+vv/6+/v/+/v8//v7/P/ExMT/9vb2/7e3t/na2tpfKVN1/ylTdP8pUXP/KFBy/yhPcP8bN03/v7+///v7/P/7/Pz/+/z8/8rKyv+3t7f/4OLgaQAAAAApU3X/KVN1/yhSdP8oUnT/KFJy/xw4UP+/v7//v7+//7+/v/+/v7//uru7/2OBmf8AAAAAAAAAAClTdf8pU3X/KVN1/ylSdP8pUnT/JEpn/yRIZv8kSGX/I0dk/yNGY/8jRWL/KVN1/wAAAAAAAAAAKVN1/ylTdf8lS2n/IztO/yM7Tv8jO07/IztO/yM7Tv8jO07/JUtp/ydOb/8lS2n/AAAAAAAAAAApU3X/K2GQ/yhahv91dXX/XV1d/11dXf9dXV3/XV1d/4B/f/8oWob/Kmad/ylTdf8AAAAAAAAAAClTda0pU3X/KVN1/7O0tP/h4eD/3t7f/97f3//g4OD/s7S0/ylTdf8pU3X/KVN1rQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG1yds1dXFv1XVxb9Wxxdc8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUwFASZMCwAlTAsAI00LIys1CxcXFsEYFxbCJS01DAAlTQsAJk0LASZNCwAlTQUAAAAAAAAAAPwArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAASsQQAMrEEADKxBAAysQQAMrEEADKxB8PysQQAMrEE=");
var node = gFindBar.hasAttribute('oldFindBar') ? gFindBar.getElement("find-next") : gFindBar.getElement("highlight");
gFindBar.getElement("findbar-container").insertBefore( paste, node );
addDestructor(function() paste.parentNode.removeChild(paste) );
paste.addEventListener("click", function(e) {
   if ( e.button == 0 ) {
        if ( !getSelect() ) return;
        gFindBar._findField.value = getSelect(); // вставить текст
        Highlight("hits", "greenLight");
        };
   if ( e.button == 2 )        
        setTimeout(function() clearFindField(), 0); // очистить поле текстового ввода  
}, false);



// Стиль для панели поиска ................................
var uri = makeURI('data:text/css,'+ encodeURIComponent('\
#FindToolbar { border-bottom: 1px solid grey !important; }\
#find-field, .findbar-textbox { width: 325px !important; }\
#FindToolbar > .findbar-container > * { display: -moz-box !important; }\
#FindToolbar .findbar-textbox[status="notfound"] { color: white !important; }\
#FindToolbar > hbox > label { -moz-appearance: none !important; font-weight: bold !important; }\
#FindToolbar .findbar-textbox:not([style]):not([status="notfound"]) { color: black !important; }\
\
#FindToolbar .findbar-closebutton,\
#FindToolbar:not([mini]) #findButton,\
#FindToolbar .findbar-container > image,\
#FindToolbar:not([pasteButton]) #pasteButton,\
#FindToolbar .findbar-case-sensitive.tabbable,\
#FindToolbar checkbox[anonid="find-case-sensitive"],\
#FindToolbar .findbar-find-fast.findbar-find-status,\
#FindToolbar .findbar-find-fast[anonid="match-case-status"] {\
   display: none !important; }\
\
/* мини панель поиска ....*/\
#FindToolbar[mini] .findbar-textbox {\
   width: 16em !important;\
   height: 21px !important;\
   padding-right: 20px !important;\
   margin-right: 2px !important;\
   margin-left: -4px !important; }\
#FindToolbar[mini] {\
   position: fixed;\
   padding: 0 !important;\
   background: menu !important;\
   box-shadow: 0px 10px 5px -10px rgba(0,0,0,.3) !important;\
   border: 1px solid grey !important; }\
#FindToolbar[mini][top] {\
   border-top: 0 !important;\
   border-radius: 0 0 8px 8px !important; }\
#FindToolbar[mini][right] {\
   right: ' + findbarRight + 'px; }\
#FindToolbar:not([top]) + #content {\
   -moz-box-ordinal-group: 0 !important; }\
#FindToolbar:not([top]) {\
   -moz-box-ordinal-group: 1 !important; }\
#FindToolbar[mini]:not([top]) {\
   border-radius: 8px 8px 0 0 !important;\
   margin-top: -29px !important; }\
\
#FindToolbar[mini] toolbarspacer,\
#FindToolbar[mini] label[class="checkbox-label"],\
#FindToolbar[mini] toolbarbutton.findbar-find-next,\
#FindToolbar[mini] toolbarbutton.findbar-find-previous,\
#FindToolbar[mini] .findbar-highlight label,\
#FindToolbar[mini] .findbar-closebutton,\
#FindToolbar[mini] .findbar-find-fast[anonid="find-label"],\
#FindToolbar[mini] .findbar-highlight,\
#FindToolbar[mini] .findbar-highlight[checked] {\
   display: none !important; }\
\
/* расположение элементов на панели поиска ....*/\
#pasteButton { padding-left: 6px !important; padding-right: 6px !important; }\
\
#FindToolbar:not([mini]):not([oldFindBar]):not([pasteButton]) #findCheckbox { margin-left: 35px !important; }\
#FindToolbar:not([mini]):not([oldFindBar]) .findbar-highlight.tabbable { -moz-box-ordinal-group: 4 !important; }\
#FindToolbar:not([mini]):not([oldFindBar]) * { -moz-box-ordinal-group: 99 !important; }\
#FindToolbar:not([mini]):not([oldFindBar]) hbox[anonid="findbar-textbox-wrapper"] {\
   -moz-box-ordinal-group: 1 !important; margin-left: -10px !important; }\
#FindToolbar:not([mini]):not([oldFindBar]) #pasteButton {\
   -moz-box-ordinal-group: 2 !important; margin-left: 5px !important; margin-right: 15px !important; }\
\
#FindToolbar:not([mini]) #hits { text-align: right; width: 4.1em !important; margin-left: -13px; margin-right: -1px; color: green; }\
\
#FindToolbar[mini] #hits { -moz-appearance: none !important; margin-top: 3px !important; }\
#FindToolbar[mini] textbox.findbar-textbox { -moz-box-ordinal-group: 1 !important; }\
#FindToolbar[mini] #findCheckbox { -moz-box-ordinal-group: 2 !important; margin-left: -24px !important; margin-right: -3px !important; }\
#FindToolbar[mini] #pasteButton { -moz-box-ordinal-group: 3 !important; margin: -5px 0 !important; }\
#FindToolbar[mini] #findButton { -moz-box-ordinal-group: 4 !important; margin: -5px 0 !important; }\
\
#FindToolbar[mini][oldFindBar] #pasteButton { margin: 1px 0 !important; }\
#FindToolbar[mini][oldFindBar] #findButton { margin: 1px 0 !important; }\
\
#FindToolbar[mini]:not([oldFindBar]) #findCheckbox { margin-left: -33px !important; margin-right: -5px !important; }\
\
/* не показывать панель поиска на страницах ....*/\
#main-window[title="about:config - Mozilla Firefox"] #appcontent > #FindToolbar,\
#main-window[title="Управление дополнениями - Mozilla Firefox"] #appcontent > #FindToolbar\
 { display: none !important; }\
'));

const sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
sss.loadAndRegisterSheet(uri, 0); 
addDestructor(function() { sss.unregisterSheet(uri, 0) });

Включи в меню кнопки: Открывать панель поиска с чистой поисковой формой

Отсутствует

 

№65401-04-2016 09:19:27

zbf
Участник
 
Группа: Extensions
Зарегистрирован: 27-04-2005
Сообщений: 39
UA: Firefox 38.0

Re: [CB]Toggle Find+

bunda1

bunda1 пишет

Ну тогда так:

Большое Вам спасибо- это то, что нужно! :beer:

Отсутствует

 

№65506-06-2016 15:53:11

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

Re: [CB]Toggle Find+

bunda1
Помнишь ты мне делал облегченный вариант Toggle find+

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

Выделить код

Код:

const forceFind = false, forceFindCS = true;

// Приклеить элемент findbar к странице( #appcontent ) ................................
const fbID = "FindToolbar-m";
delete window.gFindBar;
window.gFindBar = document.getElementById(fbID);
if (!gFindBar) {
    gFindBar = gBrowser.parentNode.insertBefore(document.createElement("findbar"), gBrowser);
    gFindBar.id = fbID;
    gFindBar.setAttribute("browserid", "content");
    gFindBar.clientTop;
    delete window.gFindBarInitialized;
    window.gFindBarInitialized = true;
    gFindBar._selectionMaxLen = 1000;    // лимит символов для поиска
}


// Ctrl+F, показать - скрыть панель поиска ....................................
function toggleFindbar() gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
addEventListener("keydown", function(e)
    e.keyCode == e.DOM_VK_F && e.ctrlKey && !e.altKey && !e.shiftKey
    && !e.preventDefault() && toggleFindbar()
, false);
this.onclick = function(e) { if (!e.button) toggleFindbar() };



// Показать количество совпадений на панели поиска ................................
const textbox = gFindBar.getElement("findbar-textbox"),
nrm = Ci.nsISelectionController.SELECTION_NORMAL, labID = "hits-m";
var lab = document.getElementById(labID);
if (!lab) {
    lab = textbox.parentNode.insertBefore(document.createElement("label"), textbox);
    lab.id = labID;
}
var curHit, allHits;

function updateHits(arg) {
    if (gFindBar.hidden) return;
    var word = textbox.value;
    if (!word) {
        lab.value = "0/0";
        textbox.removeAttribute("status");
        return;
    }
    var win = arg instanceof Window && arg || content;
    if (win == content) curHit = allHits = 0;
    var findbarFinder = gFindBar._browser.finder;
    var controller = findbarFinder._getSelectionController(win);
    var doc = win.document;

    if (word && controller && doc && doc.documentElement) {
        var body = doc instanceof HTMLDocument && doc.body ? doc.body : doc.documentElement;

        var searchRange = doc.createRange();
        searchRange.selectNodeContents(body);
        var startPt = searchRange.cloneRange();
        startPt.collapse(true);
        var endPt = searchRange.cloneRange();
        endPt.collapse(false);

        var retRange = null;
        var finder = Cc["@mozilla.org/embedcomp/rangefind;1"].createInstance().QueryInterface(Ci.nsIFind);
        finder.caseSensitive = gFindBar._shouldBeCaseSensitive(word);

        while ((retRange = finder.Find(word, searchRange, startPt, endPt))) {
            allHits++;
            if (!curHit) {
                var sel = controller.getSelection(nrm), range;
                if (sel.toString()) range = sel.getRangeAt(0);
                else {
                    var editableNode = findbarFinder._getEditableNode(retRange.startContainer);
                    if (editableNode) sel = editableNode.editor.selectionController.getSelection(nrm);
                    if (sel.toString()) range = sel.getRangeAt(0);
                }
                var comp = range && ["startContainer", "endContainer", "startOffset", "endOffset"]
                    .every(function(prop) range[prop] == retRange[prop]);
                if (comp) curHit = allHits;
            }
            startPt = retRange.cloneRange();
            startPt.collapse(false);
        }
        Array.forEach(win.frames, function(frame) updateHits(frame));
    }
    if (win != content) return;
    allHits ? textbox.removeAttribute("status") : textbox.setAttribute("status", "notfound");
    forceFind && !curHit && allHits && gFindBar._find();
    lab.value = curHit + "/" + allHits;
}
updateHits();


gFindBar.updateHits = updateHits;
function insUpd(methodName, code) {
    const method = gFindBar[methodName];
    gFindBar[methodName] = Function("arguments.callee.method.apply(this, arguments);" + (code || "") + " this.updateHits();");
    gFindBar[methodName].method = method;
    addDestructor(function() gFindBar[methodName] = method);
}
insUpd("_find"); insUpd("_findAgain");
insUpd("_setCaseSensitivity", forceFindCS && " this._find();");


const progressListener = {
    onStateChange: function(wpr, req, state)
        state & Ci.nsIWebProgressListener.STATE_STOP && setTimeout(updateHits, 320),
    onLocationChange: function(wpr, req) !req && updateHits()
};
addDestructor(function() gBrowser.removeProgressListener(progressListener));


function onFindbar() {
    gBrowser[(gFindBar.hidden ? "remove" : "add") + "ProgressListener"](progressListener);
    !gFindBar.hidden && updateHits();
}
onFindbar();
const observer = MutationObserver(onFindbar);
observer.observe(gFindBar, { attributes: true, attributesFilter: ["hidden"] });
addDestructor(function() observer.disconnect());


Так вот пара недостатков есть: если я выделяю текст и нажимаю ctrl+f то выделенный текст не ищется, хотя в стандартной поисковой строке ищется. Еще если я например искал какой-то текст, а потом закрыл панель поиска, а затем открыл ее по ctrl+f, то панель открывается с невыделеным текстом, хотя в стандартной панели текст выделен. Можешь помочь с этими мелочами?

Отсутствует

 

№65611-06-2016 13:04:03

Garider
Участник
 
Группа: Members
Зарегистрирован: 02-07-2014
Сообщений: 48
UA: Firefox 47.0

Re: [CB]Toggle Find+

bunda1
Тоже в 47.0 отвалилась, тусклая стала.

Отсутствует

 

№65711-06-2016 13:38:04

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

Re: [CB]Toggle Find+

Garider пишет

bunda1
Тоже в 47.0 отвалилась, тусклая стала.

Код инициализации кнопки Toggle Find

Отсутствует

 

№65811-06-2016 15:10:20

Garider
Участник
 
Группа: Members
Зарегистрирован: 02-07-2014
Сообщений: 48
UA: Firefox 47.0

Re: [CB]Toggle Find+

bunda1
Спасибо, теперь работает.

Отсутствует

 

№65913-06-2016 11:35:18

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

Re: [CB]Toggle Find+

Kamui пишет

bunda1
Помнишь ты мне делал облегченный вариант Toggle find+
Так вот пара недостатков есть: если я выделяю текст и нажимаю ctrl+f то выделенный текст не ищется, хотя в стандартной поисковой строке ищется.

:/

Выделить код

Код:

const forceFind = false, forceFindCS = true;

// Приклеить элемент findbar к странице( #appcontent ) ................................
const fbID = "FindToolbar-m";
delete window.gFindBar;
window.gFindBar = document.getElementById(fbID);
if (!gFindBar) {
    gFindBar = gBrowser.parentNode.insertBefore(document.createElement("findbar"), gBrowser);
    gFindBar.id = fbID;
    gFindBar.setAttribute("browserid", "content");
    gFindBar.clientTop;
    delete window.gFindBarInitialized;
    window.gFindBarInitialized = true;
    gFindBar._selectionMaxLen = 1000;    // лимит символов для поиска
    
    setTimeout(function() {
       eval("gFindBar.startFind = " + gFindBar.startFind.toString()
       .replace('this.browser.finder.getInitialSelection();',
       'this.onCurrentSelection(gBrowser.finder.getActiveSelectionText(), false)'));
             
       var {Finder} = Cu.import("resource://gre/modules/Finder.jsm");
       eval("Finder.prototype.getActiveSelectionText = " + Finder.prototype
       .getActiveSelectionText.toString().replace('.replace', '; //'));          
    }, 3000 );
    
}


// Ctrl+F, показать - скрыть панель поиска ....................................  
function toggleFindbar() {
   if (gFindBar.hidden) { gFindBar.onFindCommand(); setTimeout(function() { gFindBar._find() }, 50) }
   else 
       gFindBar.close();
};
addEventListener("keydown", function(e)
    e.keyCode == e.DOM_VK_F && e.ctrlKey && !e.altKey && !e.shiftKey
    && !e.preventDefault() && toggleFindbar()
, false);
this.onclick = function(e) { if (!e.button) toggleFindbar() };



// Показать количество совпадений на панели поиска ................................
const textbox = gFindBar.getElement("findbar-textbox"),
nrm = Ci.nsISelectionController.SELECTION_NORMAL, labID = "hits-m";
var lab = document.getElementById(labID);
if (!lab) {
    lab = textbox.parentNode.insertBefore(document.createElement("label"), textbox);
    lab.id = labID;
}
var curHit, allHits;

function updateHits(arg) {
    if (gFindBar.hidden) return;
    var word = textbox.value;
    if (!word) {
        lab.value = "0/0";
        textbox.removeAttribute("status");
        return;
    }
    var win = arg instanceof Window && arg || content;
    if (win == content) curHit = allHits = 0;
    var findbarFinder = gFindBar._browser.finder;
    var controller = findbarFinder._getSelectionController(win);
    var doc = win.document;

    if (word && controller && doc && doc.documentElement) {
        var body = doc instanceof HTMLDocument && doc.body ? doc.body : doc.documentElement;

        var searchRange = doc.createRange();
        searchRange.selectNodeContents(body);
        var startPt = searchRange.cloneRange();
        startPt.collapse(true);
        var endPt = searchRange.cloneRange();
        endPt.collapse(false);

        var retRange = null;
        var finder = Cc["@mozilla.org/embedcomp/rangefind;1"].createInstance().QueryInterface(Ci.nsIFind);
        finder.caseSensitive = gFindBar._shouldBeCaseSensitive(word);

        while ((retRange = finder.Find(word, searchRange, startPt, endPt))) {
            allHits++;
            if (!curHit) {
                var sel = controller.getSelection(nrm), range;
                if (sel.toString()) range = sel.getRangeAt(0);
                else {
                    var editableNode = findbarFinder._getEditableNode(retRange.startContainer);
                    if (editableNode) sel = editableNode.editor.selectionController.getSelection(nrm);
                    if (sel.toString()) range = sel.getRangeAt(0);
                }
                var comp = range && ["startContainer", "endContainer", "startOffset", "endOffset"]
                    .every(function(prop) range[prop] == retRange[prop]);
                if (comp) curHit = allHits;
            }
            startPt = retRange.cloneRange();
            startPt.collapse(false);
        }
        Array.forEach(win.frames, function(frame) updateHits(frame));
    }
    if (win != content) return;
    allHits ? textbox.removeAttribute("status") : textbox.setAttribute("status", "notfound");
    forceFind && !curHit && allHits && gFindBar._find();
    lab.value = curHit + "/" + allHits;
}
updateHits();


gFindBar.updateHits = updateHits;
function insUpd(methodName, code) {
    const method = gFindBar[methodName];
    gFindBar[methodName] = Function("arguments.callee.method.apply(this, arguments);" + (code || "") + " this.updateHits();");
    gFindBar[methodName].method = method;
    addDestructor(function() gFindBar[methodName] = method);
}
insUpd("_find"); insUpd("_findAgain");
insUpd("_setCaseSensitivity", forceFindCS && " this._find();");


const progressListener = {
    onStateChange: function(wpr, req, state)
        state & Ci.nsIWebProgressListener.STATE_STOP && setTimeout(updateHits, 320),
    onLocationChange: function(wpr, req) !req && updateHits()
};
addDestructor(function() gBrowser.removeProgressListener(progressListener));


function onFindbar() {
    gBrowser[(gFindBar.hidden ? "remove" : "add") + "ProgressListener"](progressListener);
    !gFindBar.hidden && updateHits();
}
onFindbar();
const observer = new MutationObserver(onFindbar);
observer.observe(gFindBar, { attributes: true, attributesFilter: ["hidden"] });
addDestructor(function() observer.disconnect());

Отсутствует

 

№66013-06-2016 15:38:36

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 50.0

Re: [CB]Toggle Find+

bunda1
Обнаружился конфликт. В [nightly] (на других не проверял) кнопка мешает работе QTranslate и кнопке цитирование для forum.ru-board

скрытый текст
http://forum.ru-board.com/topic.cgi?forum=5&topic=31396&start=873#2
http://forum.ru-board.com/topic.cgi?forum=5&topic=31510&start=580#10

Посмотри, плиз.
ПС А куда кнопка удалить сообщение делась?

Отредактировано voqabuhe (13-06-2016 18:41:20)

Отсутствует

 

№66113-06-2016 16:43:41

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

Re: [CB]Toggle Find+

bunda1
Спасибо, но я уже разобрался сам. Оказалось что теперь и в стандартном поиске появилось количество совпадений, наверх я передвинул панель поиска с помощью стиля, в итоге от кода осталось только "Ctrl+F, показать - скрыть панель поиска".

Отсутствует

 

№66220-06-2016 04:01:25

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1644
UA: Firefox 45.0

Re: [CB]Toggle Find+

Можно ли в текстовом поле цвет текста настроить или цвет фона для текста? А то с моим оформлением [firefox] текст темный и его плохо видно.

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

Код:

#FindToolbar .findbar-textbox:not([style]):not([status="notfound"]) { color: black !important; }\

Теперь отлично. Спасибо.

Отредактировано _zt (20-06-2016 10:36:21)

Отсутствует

 

№66320-06-2016 09:01:21

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

Re: [CB]Toggle Find+

_zt пишет

Можно ли в текстовом поле цвет текста настроить или цвет фона для текста? А то с моим оформлением [firefox] текст темный и его плохо видно.

Внизу кода инициализации, под // Стиль для панели поиска ................................
В:

Выделить код

Код:

#FindToolbar .findbar-textbox:not([style]):not([status="notfound"]) { color: black !important; }\

измени black на нужный тебе цвет.

Отсутствует

 

№66420-06-2016 23:37:12

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 50.0

Re: [CB]Toggle Find+

bunda1
Тоскливо в [nightly] уже целую неделю без Toggle Find+ №660 :cry:

Отсутствует

 

№66524-06-2016 20:06:47

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

Re: [CB]Toggle Find+

voqabuhe пишет

bunda1
Обнаружился конфликт. В [nightly] (на других не проверял) кнопка мешает работе QTranslate и кнопке цитирование для forum.ru-board

скрытый текст
http://forum.ru-board.com/topic.cgi?forum=5&topic=31396&start=873#2
http://forum.ru-board.com/topic.cgi?forum=5&topic=31510&start=580#10

Проверил, вроде кнопка цитирования и QTranslate работет на [nightly] вместе с Toggle Find+. А как у тебя проявляется конфликт?

Отсутствует

 

№66624-06-2016 20:40:44

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 50.0

Re: [CB]Toggle Find+

bunda1
Кнопка цитирование у меня вообще не работает, т.е не вставляет цитату, а QTranslate вместо перевода выдаёт вот такую шнягу
e9e84a341c059c833be0f0274205c73d.png 
После деактивации Toggle Find+ всё начинает работать.

Отсутствует

 

№66724-06-2016 21:19:56

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

Re: [CB]Toggle Find+

voqabuhe
:/ да есть глюк если включена Автовыделение из за того что разработчики опять что поменяли.

Выделить код

Код:

// Настройка функций кликов мыши для кнопки .............
this.onclick =e=> {

   if ( e.button == 0 )
        gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
          
   if ( e.button == 1 ) { 
        gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
        goDoCommand("cmd_paste");
        };
     
   if ( e.button == 2 && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey ) { 
        e.preventDefault();  
        menu.showPopup(this, -1, -1, "popup", "bottomleft", "topleft");
        }
};


// Настройки и переменные для кнопки ............. 
var findbarRight = 18;             // отступ справа у мини панели поиска
var addKeyboardShortcuts = true;   // разрешить дополнительные сочетания клавиш для панели поиска
var alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService);



// Проверить наличие строк в about:config и создать если не существует .............
if ( cbu.getPrefs("FindBar.version") != '15') {
   ["FindBar.top","FindBar.mini","FindBar.right","FindBar.auto_Close","FindBar.autoclear","FindBar.Highlight",
    "FindBar.Highlight.Link","FindBar.pasteButton","FindBar.contextFindWords","FindBar.ToggleWithDoubleMiddleClick",
    "FindBar.Autohighlight.ToggleWithDoubleClick","FindBar.auto_Find"].forEach(pref=> cbu.setPrefs(pref, false) );
     
    ["FindBar.version,15", "FindBar.CloseTimer,7", "ui.textHighlightBackground,#ef0fff", "FindBar.Highlight.value,"]
    .forEach(pref=> cbu.setPrefs(pref.split(",")[0], pref.split(",")[1]) );     
};


// Подсказка для кнопки .............
this.onmouseover =()=> {
   // получить и обрезать подсказку для автовыделение ....
   var val = gPrefService.getComplexValue("FindBar.Highlight.value", Ci.nsISupportsString).data;
   var value = val.substring(0,50) + ( (val.length > 50) ? '....' : "" );
                    
   this.tooltipText = "Поиск по странице \nЛ:    Показать - скрыть поиск по странице \nС:    Поиск по странице из буфера обмена\
                     \nП:    Mеню кнопки \nДП: CB меню \n\nАвтовыделение: " + value;                                                    
};


// Создать меню с настройками для кнопки .............
var array = [
  { label: 'Автоматически закрыть', value: 'FindBar.auto_Close', func: autoClose, cek:''},
  { label: 'Закрыть через: |7| секунд', value: 'FindBar.CloseTimer', change:''},
  { separator: '' },
  { label: 'FindBar мини', value: 'FindBar.mini', func: toggleAttribute, cek:''},
  { label: 'FindBar сверху', value: 'FindBar.top', func: toggleAttribute, cek:''},
  { label: 'FindBar справа', value: 'FindBar.right', func: toggleAttribute, cek:''},
  { label: 'Кнопка "Вставить и искать" на FindBar', value: 'FindBar.pasteButton', func: toggleAttribute, cek:''},
  { separator: '' },
  { label: 'Find в контекстном меню', value: 'FindBar.contextFindWords', cek:''},
  { label: 'Запуск поиска выделением текста', value: 'FindBar.auto_Find', cek:''},
  { label: 'Быстрый поиск по мере набора текста', value: 'accessibility.typeaheadfind', cek:''},
  { label: 'Открыть панель поиска с поиском по старому запросу', value: 'FindBar.autoclear', cek:''},  
  { label: 'Переключать FindBar двойным средним кликом на странице', value: 'FindBar.ToggleWithDoubleMiddleClick', cek:''},
  { label: 'Переключать aвтовыделение двойным кликом на панели поиска', value: 'FindBar.Autohighlight.ToggleWithDoubleClick', cek:''},
  { separator: '' },
  { label: 'Автовыделение', value: 'FindBar.Highlight', func: toggleAttribute, cek:''},
  { label: 'Автовыделение в ссылках', value: 'FindBar.Highlight.Link', func: Highlight, cek:''},
  { label: 'Добавить текст для автовыделения', value: 'add', func: toggleHighlightValue },
  { label: 'Сбросить текст для автовыделения', value: 'clear', func: toggleHighlightValue },
  { label: 'Изменить цвет: |#ef0fff| для автовыделения', value: 'ui.textHighlightBackground', change:''}
            ];

var menu = self.appendChild( document.createElement("menupopup") );
array.forEach(m=> {
     if ( "separator" in m ) { menu.appendChild( document.createElement("menuseparator") ); return };
     if ( "value" in m ) var p = cbu.getPrefs( m.value );   
     var mItem = document.createElement("menuitem"), arr = m.label.split("|");    
     mItem.setAttribute("label", ("change" in m) ? (arr[0] + p + arr[2]) : m.label );     
     if ( "cek" in m ) { 
          mItem.setAttribute('type', 'checkbox');
          mItem.setAttribute('checked', p );
          mItem.setAttribute('onclick', 'custombuttons.setPrefs("' + m.value + '", !custombuttons.getPrefs("' + m.value + '"))');                                                      
          }              
     if ( "change" in m ) {
          mItem.addEventListener("command", e=> {
             var val = custombuttons.promptBox(this.label, 'Отмена вернёт значение по умолчанию');
             var pref = val[0] ? val[1] : arr[1];
             cbu.setPrefs( m.value, pref );
             this.label = arr[0] + pref + arr[2];
          }, false);
          };
     if ( "func" in m ) mItem.addEventListener("command", e=> { m.func(m.value) }, false);

     menu.appendChild(mItem);
});
menu.setAttribute("onclick", "event.stopPropagation()");


// Установить и удалить разные атрибуты для панели поиска .............
function toggleAttribute(s) {
  if ( s == "FindBar.Highlight" ) { gFindBar.getElement('highlight').removeAttribute("checked"); Highlight(); return };
  
  var atrr = s.substring(8);
  setTimeout(()=> { cbu.getPrefs(s) ? gFindBar.setAttribute(atrr, "true") : gFindBar.removeAttribute(atrr) }, 0);
  if ( s !== "FindBar.mini" ) return;      
  if ( cbu.getPrefs(s) ) {       
       if ( gFindBar.getElement('highlight').hasAttribute("checked") ) {
            gFindBar._findField.style.color = cbu.getPrefs("ui.textHighlightBackground");
            }    
       }     
  else
       {
       if ( !!gFindBar._findField.style.color ) {
            gFindBar.getElement('highlight').setAttribute("checked", "true");
            gFindBar._findField.removeAttribute("style");
            }
       }        
};
["FindBar.top", "FindBar.mini", "FindBar.right", "FindBar.pasteButton"].forEach(s=> toggleAttribute(s));


// Установить нужную иконку кнопки при старте браузера или при изменениях настроек автовыделения .............
var s = "FindBar.Highlight";
function toggleImage() {
   self.ownerDocument.getAnonymousElementByAttribute(self, "class", "toolbarbutton-icon").
   src = cbu.getPrefs(s)
   ? "data:image/x-icon;base64,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"
   : "data:image/x-icon;base64,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";  
};
toggleImage();
gPrefService.addObserver(s, toggleImage, false);
addDestructor(()=> gPrefService.removeObserver(s, toggleImage) );


// Удалить оргинальный панель поиска и создать новый с дополнительными возможностями .............
delete window.gFindBar;
window.gFindBar = document.getElementById("FindToolbar");
if ( !gFindBar || gFindBar.parentNode != gBrowser.parentNode) {
     var version = parseInt(Services.appinfo.version);
     if ( version > 25 )                                // удалить на FF25+
          for( var tab of gBrowser.tabs ) {
          if ( !tab._findBar ) continue;
          tab._findBar.parentNode.removeChild( tab._findBar );    
          delete tab._findBar;
          }
   
     gFindBar = gBrowser.parentNode.insertBefore(document.createElement("findbar"), gBrowser);
     gFindBar.setAttribute("browserid", "content");
     version < 25 && gFindBar.setAttribute("oldFindBar", "true");       
     gFindBar.id = "FindToolbar";
     gFindBar.clientTop;
     delete window.gFindBarInitialized;
     window.gFindBarInitialized = true;

     gFindBar._selectionMaxLen = 1000;             // лимит символов для поиска и подсветки
     gFindBar._quickFindTimeoutLength = 4500;      // время закрытия панели поиска эсли тот открыт по мере набора текста
     };
if ( gFindBar instanceof Ci.nsIDOMEventListener )  // добавить поиск по мере набора текста
     addEventListener("keypress", gFindBar)
     function onBrowserKeypress(msg) {msg.target == gBrowser.selectedBrowser && gFindBar._onBrowserKeypress(msg.data);}
     messageManager.addMessageListener("Findbar:Keypress", onBrowserKeypress);
     addDestructor(()=> messageManager.removeMessageListener("Findbar:Keypress", onBrowserKeypress));


// Показать количество совпадений на панели поиска, автор кода 'Dumby' .............
var curHit, allHits, lastCurHit;
const fff = gFindBar._findField,
      lab = fff.parentNode.insertBefore( document.createElement("label"), fff ),
      nrm = Ci.nsISelectionController.SELECTION_NORMAL;
      lab.id = "hits";
addDestructor(()=> fff.parentNode.removeChild(lab) );

function updateHits(arg) {
   if ( gFindBar.hidden ) return;
   var win = arg instanceof Ci.nsIDOMWindow && arg || content;
   var finder = gBrowser.finder || gFindBar;
   if ( win == content ) curHit = allHits = 0;
   var word = fff.value;
   var controller = finder._getSelectionController(win);
   var doc = win.document;
   
   if ( word && controller && doc && doc.documentElement ) {
        var body = doc instanceof HTMLDocument && doc.body ? doc.body : doc.documentElement;

        var searchRange = doc.createRange();
        searchRange.selectNodeContents(body);
        var startPt = searchRange.cloneRange();
        startPt.collapse(true);
        var endPt = searchRange.cloneRange();
        endPt.collapse(false);

        var retRange = null;
        var nsIFind = Cc["@mozilla.org/embedcomp/rangefind;1"].createInstance().QueryInterface(Ci.nsIFind);        
        nsIFind.caseSensitive = gFindBar._shouldBeCaseSensitive(word);

        while ((retRange = nsIFind.Find(word, searchRange, startPt, endPt))) {
               allHits++;
               if ( !curHit) {
                    var sel = controller.getSelection(nrm), range;
                    if ( sel.toString() ) range = sel.getRangeAt(0);
                    else {
                         var editableNode = finder._getEditableNode(retRange.startContainer);
                         if ( editableNode ) sel = editableNode.editor.selectionController.getSelection(nrm);
                         if ( sel.toString() ) range = sel.getRangeAt(0);
                         }
                    var comp = range && ["startContainer", "endContainer", "startOffset", "endOffset"]
                               .every(function(prop) range[prop] == retRange[prop]);
                    if ( comp ) curHit = allHits;
                    }
               startPt = retRange.cloneRange();
               startPt.collapse(false);
               }
        Array.forEach(win.frames, frame=> updateHits(frame));
       }
    if ( win != content ) return;
    lab.value = curHit + "/" + allHits;
    
    if ( fff.value ) self.lastValueOfFind = fff.value; // запомнить текст для поиска   
    
    // поле текстового ввода красное если ничего не найдено .... 
    allHits == 0 && fff.value ? fff.setAttribute("status", "notfound") : fff.removeAttribute("status");

    // поле текстового ввода мигает желтим если переход с низа наверх страницы и наоборот ....
    if ( !!arg && arg == "flash" && allHits > 2 && (allHits/curHit * allHits/lastCurHit == allHits) ) {         
         fff.setAttribute("flash", true );
         setTimeout(()=> fff.removeAttribute("flash"), 600);
         }
    lastCurHit = curHit;   
};
updateHits();


// FindBar, поиск колесиком мыши .............
addEventListener('DOMMouseScroll', e=> { gFindBar.onFindAgainCommand(e.detail < 0); updateHits("flash") }, false, gFindBar);


// Отслеживать клики на панели поиска .............
addEventListener("mousedown", e=> {

   if ( e.button == 1 ) {  // поиск из буфера обмена
        e.preventDefault();
        var str = (gClipboard.read()).replace(/^\s+|\s+$/g,""); // убираем пробелы с концов текста
        gFindBar._findField.value = str;
        Highlight("hits", "greenLight");
        }   
   
   var targ = e.originalTarget
   if ( !targ.hasAttribute("anonid") ) return; 
   
   if ( targ.value == 'Найти:') { // кнопка 'Найти:'
        e.button ? clearFindField() : gFindBar.onFindAgainCommand(false);  
        updateHits("flash");
        }

   if ( targ.getAttribute('oncommand').startsWith("onFind") ) { // кнопки next, previous
        setTimeout(updateHits, 0, "flash");
        }         
   
}, false, gFindBar); 


// Двойной клик на панели поиска включает и выключает автовыделение или стандартную подсветку текста ............. 
addEventListener("dblclick", e=> {
   
   if ( e.originalTarget.nodeName == 'div' && e.button == 0 ) return;
   if ( /:label|button|check/.test( e.originalTarget.nodeName ) ) return; 

   if ( cbu.getPrefs("FindBar.Autohighlight.ToggleWithDoubleClick") ) {       
        var s = cbu.getPrefs("FindBar.Highlight");
        cbu.setPrefs("FindBar.Highlight", !s );
        
        menu.childNodes[16].setAttribute("checked", !s);    
        gFindBar.getElement('highlight').removeAttribute("checked"); 

        Highlight(); 
        }             
   else  
        {
        if ( cbu.getPrefs("FindBar.Highlight") ) return;         
        gFindBar.getElement("highlight").click(); 
        gFindBar._findField.style.color = (gFindBar._findField.style.color || !gFindBar.hasAttribute('mini')) 
        ? "" : cbu.getPrefs("ui.textHighlightBackground");            
        };
   
   // закрыть контекстное меню поисковой формы ....
   var hbox = gFindBar._findField.mInputField.parentNode;
   setTimeout(()=> document.getAnonymousElementByAttribute(hbox, "class", "textbox-contextmenu").hidePopup(), 20);     
                        
   window.content.focus(); 
}, false, gFindBar);


// ЛКМ + ПКМ на поле текстового ввода очищают его .............
function clickToClear(e) { 
   if ( e.type == "mousedown" ) {
        if ( e.button == 0 ) this.leftButtonDown = true;
        if ( e.button == 2 && this.leftButtonDown ) {
             this.leftButtonDown = false;
             this.stopMenu = true; 
             setTimeout(()=> { clearFindField() }, 0); 
             }
       }

   if ( e.type == "click" ) {
        if ( e.button == 0 ) this.leftButtonDown = false;
        if ( e.button == 2 && this.stopMenu ) {
             e.preventDefault();
             e.stopPropagation();
             this.stopMenu = false; 
             }
        }     
};
["mousedown", "click"].forEach(type=> addEventListener(type, clickToClear, false, gFindBar._findField) );


// Запускать поиск выделением текста если это разрешено в 'about:config' .............
function autoFind(e) {
   if ( e.button != 0 ) return;
   if ( !cbu.getPrefs("FindBar.auto_Find") ) return;
   if ( /input|password|textarea|textbox|searchbar|findbar|tabbrowser/.test(e.target.localName) ) return;

   if ( e.type == 'mousedown' ) var lastSelection = getBrowserSelection();
   
   if ( e.type == 'mouseup' ) {   
        var selection = getBrowserSelection();
        if ( selection && selection !== lastSelection ) {
             setTimeout(()=> {  
                gFindBar.onFindCommand();                      
                updateHits();
                lab.value == "0/0" ? Highlight() : Highlight("", "greenLight")
             }, 50);
             }   
        }
};
addEventListener("mouseup", autoFind, false, gBrowser);
addEventListener("mousedown", autoFind, false, gBrowser);


// Автоматически закрывать панель поиска, если это разрешено в 'about:config' .............       
function autoClose() {
  window.clearTimeout(self.closeTimer);
  try { autoClose.removeListener() } catch(e) {};
  
  function closeFind(e) { 
     if ( e !== 'timer' && e.target.nodeName == 'findbar') { 
          window.clearTimeout( self.closeTimer ); 
          autoClose.run = true;         
          }               
     else if ( e == 'timer' || autoClose.run && !gFindBar._findField.getAttribute("focused") ) {    
               self.closeTimer = setTimeout(()=> {          
                  gFindBar.close();                  
               }, cbu.getPrefs("FindBar.CloseTimer") + '000');               
               autoClose.run = false;               
               }
  }
  
  if ( cbu.getPrefs("FindBar.auto_Close") && !gFindBar.hidden ) { 
       closeFind('timer');       
       addEventListener('mouseover', closeFind, false, window);       
       autoClose.removeListener =()=> { removeEventListener('mouseover', closeFind, false, window) };  
       } 
};


// Переключать панель поиска двойным средним кликом на странице .............
addEventListener("mouseup", e=> {
  if ( e.button != 1 ) return;
  if ( !cbu.getPrefs("FindBar.ToggleWithDoubleMiddleClick") ) return;
       
       if ( self.flag ) { 
            gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close(); 
            Highlight("hits", "greenLight");
            gFindBar._findField.focus();
            };
            
       self.flag = true;
       
       setTimeout(()=> { self.flag = false }, 600);
}, false, gBrowser);


// Сочетания клавиш для управление поиском на странице .............
addEventListener('keydown', e=> {
  if ( content.location.href == 'chrome://browser/content/places/places.xul' ) return;
  
  // Ctrl+snift+g и F3, запуск подсчета совпадений ....
  if ( e.keyCode == 114 || ((!e.altKey) && ((e.ctrlKey) || (e.shiftKey)) && (e.keyCode == 71)) ) {
       gFindBar.hidden || setTimeout(updateHits, 0, "flash");
       }

  // Ctrl+f, показать - скрыть панель поиска ....
  if ( (e.ctrlKey) && (!e.altKey) && (!e.shiftKey) && (e.keyCode == 70) ) {
       e.preventDefault();
       e.stopPropagation();
       gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close(); 
       Highlight("hits", "greenLight");
       gFindBar._findField.focus();
       }
       
  if ( !addKeyboardShortcuts ) return; // дальше дополнительные сочетания клавиш для панели поиска
       
  // Ctrl+alt+f, поиск по странице из буфера обмена ....
  if ( (e.ctrlKey) && (e.altKey) && (e.keyCode == 70) ) {
       gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
       goDoCommand("cmd_selectNone");
       goDoCommand("cmd_paste");
       Highlight("hits", "greenLight");
       }
        
  /* Ctrl+snift+f, открыть панель поиска с чистой поисковой формой или очистить поисковую форму или
     открыть панель поиска с предыдущим запросом/выделенным текстом или искать выделенный текст если панель поиска открыт
     если настройках кнопки включена 'Всегда открывать пустую поисковую форму' ....*/
  if ( (e.ctrlKey) && (!e.altKey) && (e.shiftKey) && (e.keyCode == 70) ) {
       e.preventDefault();
       var val = self.lastValueOfFind ? self.lastValueOfFind : "";
       var sel = document.commandDispatcher.focusedWindow.getSelection().toString();
       if ( sel.length !== 0 ) { val = sel };  
       gFindBar.onFindCommand();
       cbu.getPrefs("FindBar.autoclear") ? setTimeout(()=> { gFindBar._findField.value = val; Highlight("hits", "greenLight"); }, 10) 
                                         : clearFindField();
       }
        
  // Ctrl+alt+h, добавить текст(выделенный / из буфера обмена) для автовыделения ....
  if ( (e.ctrlKey) && (e.altKey) && (e.keyCode == 72) ) toggleHighlightValue('add');
  
}, false, window);


// Автоматически выделить слова и ссылки .............
function Highlight(hits, green) {
   var findValue = gFindBar._findField.value;
   var hidden = gFindBar.hidden;

   if ( !hidden ) {
        // выделить зеленным искомый текст на странице .... 
        if ( !!green && green == "greenLight") setTimeout(()=> { gFindBar._find() }, 10);  
  
        // для запуска подсчета совпадений ....
        if ( !!hits && hits == "hits" ) setTimeout(updateHits, 20);
        }

   // получаем текст для автовыделения из 'about:config' или из панели поиска ....
   if ( cbu.getPrefs("FindBar.Highlight") ) {
        var value = hidden
        ? gPrefService.getComplexValue("FindBar.Highlight.value", Ci.nsISupportsString).data 
        : ( findValue.length > 2 ) ? findValue: "";
        } 

   // удалить и запустить подсветку совпадений .... 
   gBrowser.finder.highlight(false); if ( !!value ) gBrowser.finder.highlight(true, value); 

     
  /* изменить цвет ссылок на страницах если содержат искомое слово,
     если разрешено в 'about:config' и включена автовыделение ....*/
    
    var hLink = cbu.getPrefs("FindBar.Highlight.Link") && value;
    var color = cbu.getPrefs("ui.textHighlightBackground");

    function highlightLinks(win) {
       var doc = win.document, links = doc.links;
       
       if ( (hLink || "prop1" in doc ) && links ) {
             hLink ? doc.prop1 = true : delete doc.prop1;

             Array.forEach(links, link=> {

                if ("prop2" in link) link.style.color = link.prop2;
                if ( hLink && String( link ).indexOf( value ) != -1 ) {
                     link.prop2 = link.style.color;
                     link.style.color = color;
                     }
                else if ("prop2" in link) delete link.prop2;
             });
        }
        for ( var i = 0; i < win.frames.length; i++ ) highlightLinks(win.frames[i]);
    };
    highlightLinks(content);
};

   
// Обработчик следит за загрузкой и переключением вкладки и запускают автовыделение .............
var listener = { 
   onStateChange: function(wpr, req, flag) {
      if ( gBrowser.currentURI.spec == 'chrome://global/content/console.xul') return; 
      if ( flag & Ci.nsIWebProgressListener.STATE_STOP ) Highlight("hits");
   },
      
   onLocationChange: function(wpr, req) {
      if ( wpr.currentURI.spec != "about:blank" && !req && wpr.document.readyState == "complete")
           Highlight("hits");
      gFindBar._findField.removeAttribute("style");
      gFindBar.getElement('highlight').removeAttribute("checked");           
   }       
};
gBrowser.addProgressListener(listener);
addDestructor(()=>  gBrowser.removeProgressListener(listener) );


// Обработчики следят за панелью поиска, запускают автовыделение и другие функции .............
addEventListener("drop", e=> { Highlight("hits", "greenLight") }, false, gFindBar._findField);
addEventListener("input", ()=> { Highlight("hits", "greenLight") }, false, gFindBar._findField);
gFindBar.watch("hidden", (prop, oldV, hidden)=> {
   setTimeout(()=> { Highlight("hits", "greenLight"); autoClose() }, 10);
    
   if ( !hidden && cbu.getPrefs("FindBar.autoclear") ) { // открывать без выделенного текста
        document.activeElement.blur();
        try { self.lastValueOfFind } catch(e) { self.lastValueOfFind = '' };
        gFindBar._findField.value = self.lastValueOfFind ? self.lastValueOfFind : '';
        gFindBar._findField.focus();
        }
       
  return hidden;
});


// Добавляем подменю в контекстного меню на странице для выделенного текста .............
((contextMenu, el)=> {
  var menu = document.createElement("menu");      
  menu.setAttribute("label", "Find");  
  contextMenu.insertBefore(menu, el); 
  addEventListener("popupshowing", ()=> {
     menu.hidden = !cbu.getPrefs("FindBar.contextFindWords") || !gContextMenu.isTextSelected; 
  }, false, contextMenu);
  addDestructor(()=> contextMenu.removeChild(menu) );
  
  var array = [
              { label:"Найти на странице", func: findToContex },
              { label:"Выделить текст на странице", func: highlightSel },
              { label:"Автовыделение, добавить текст", func: addSel }
              ];
  var menuPopup = menu.appendChild( document.createElement("menupopup") );              
  array.forEach(m=> {  
       var mItem = document.createElement("menuitem");
       mItem.setAttribute("label", m.label);
       mItem.func = m.func;
       menuPopup.appendChild( mItem );
  });
  addEventListener("command", e=> { e.target.func() }, false, menu);
  
  function findToContex() {
     gFindBar.onFindCommand();
     Highlight("hits", "greenLight");
  };
        
  function highlightSel() {
     gBrowser.finder.highlight(true, value);
     goDoCommand("cmd_selectNone");
  };
        
  function addSel() toggleHighlightValue('add');
   
})(document.getElementById("contentAreaContextMenu"), document.getElementById("context-sep-properties"));


// Очистить поле текстового ввода на Findbar .............
function clearFindField() {  
  setTimeout(()=> { 
     gFindBar._findField.value = ''; 
     Highlight("hits");
     gFindBar._findField.focus();
  }, 0)
};       


// Добавить или удалить текст для автовыделения .............
function toggleHighlightValue(arg) { 
  if ( arg == 'clear' ) {
       var str = '', title = self.label, notification = "Текст для автовыделение удален";
       }        
  if ( arg == 'add' && getSelect() ) {
       var str = getSelect(), title = "Автовыделение"; 
       var notification = str.substring(0,50) + ( (str.length > 50) ? '....' : "" );
       if ( cbu.getPrefs("FindBar.Highlight") ) { goDoCommand("cmd_selectNone") };           
       }       
  cbu.setPrefs("FindBar.Highlight.value", convertFromUnicode("UTF-8", str) );
  alertsService.showAlertNotification(self.image, title, notification);     
  Highlight();      
};
  

// Получить выделенный текст из страницы или из буфера обмена, если нет текста получить false .............
function getSelect() {
   var el = document.commandDispatcher.focusedElement;
   try { return el.value.substring(el.selectionStart, el.selectionEnd) } catch(e) {};
   var sel = document.commandDispatcher.focusedWindow.getSelection();
   if (sel == '') sel = gClipboard.read();
   if (sel == '') alertsService.showAlertNotification(self.image, self.label, "Выделите или скопируйте текст!");
   return (sel == '') ? false : sel.toString().replace(/^\s+|\s+$/g,"");
};


// Конвертировать текст в юникод .............
function convertFromUnicode(charset, str) {
   var converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
   converter.charset = charset;
   str = converter.ConvertFromUnicode(str);
   return str + converter.Finish();
};


// Запустить поиск через Toggle Find+3 если нажать в главном меню на пункт меню 'Найти' .............
addEventListener("command", ()=> { gFindBar.onFindCommand(); Highlight("hits", "greenLight") }, false, document.getElementById("cmd_find"));


// Создать кнопку "Учесть регистр" на Findbar .............
var check = document.createElement("checkbox");
check.setAttribute("id", "findCheckbox");
check.setAttribute("label", "Учесть регистр");
check.setAttribute("tooltiptext", "Учесть регистр");
check.setAttribute("checked", gFindBar._shouldBeCaseSensitive(""));
gFindBar.getElement("findbar-container").appendChild(check);
addDestructor(()=>  check.parentNode.removeChild(check) );
check.addEventListener("command", ()=> { gFindBar._setCaseSensitivity(this.checked); Highlight("hits", "greenLight") });               


// Создать кнопку "Поиск" на Findbar .............
var search = document.createElement("toolbarbutton");
search.setAttribute("id", "findButton");
search.setAttribute("tooltiptext", "Л: Искать следущее \nС: Поиск текста из буфера \nП: Искать предыдущее");
search.setAttribute("style", "list-style-image: url('chrome://global/skin/icons/Search-glass.png') !important; -moz-image-region: rect(0px, 16px, 16px, 0px);");                             
gFindBar.getElement("findbar-container").appendChild(search);
addDestructor(()=> search.parentNode.removeChild(search) );
search.addEventListener("click", e=> { e.button !== 1 && gFindBar.onFindAgainCommand(!!e.button); updateHits("flash") });


// Создать кнопку "Вставить и искать" на Findbar .............
var paste = document.createElement("toolbarbutton");
paste.setAttribute("id", "pasteButton");
paste.setAttribute("tooltiptext", "Л: Поиск выделенного текста/из буфера \nП: Очистить");
paste.setAttribute("image", "data:image/x-icon;base64,AAABAAEADhAAAAEAIADoAwAAFgAAACgAAAAOAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5eXn/eXl5/3l5ef95eXn/eXl5/3l5ef95eXn/eXl5/ylTda0pU3X/KVN1/ylTdf8pU3X/HTpS/4WFhf/w8PL/8fHz//Hx8//x8fP/8fHz//Hx8/+FhYX/KVN1/yRJaP8jSGf/I0dl/yNHZP8YMEX/j4+P//Hx8//x8vP/8fLz//Hy8//x8vP/8fLz/4+Pj/8pU3X/JUxr/yVLav8kSmn/JElo/xkyR/+cnJz/8vLz//Ly9P/y8vT/8vL0//Ly9P/y8vT/nJyc/ylTdf8nTm3/Jk1t/yVMa/8lSmn/GjNJ/6urq//y8vT/8/P1//Pz9f/z8/X/8/P1//Pz9f+rq6v/KVN1/ydPb/8nTm7/Jk1t/yZMa/8aNEr/srKy//X19v/19vf/9fb3//X29//19vf/9fb3/7Kysv8pU3X/J1Bx/ydQb/8nTm//Jk1t/xs2S/+8vLz/+fr6//r7+//6+/v/ubm5/7e3t/+3t7f/ubm5/ylTdf8oUXP/KFBx/ydQcf8nT2//GzZN/76+vv/6+/v/+/v8//v7/P/ExMT/9vb2/7e3t/na2tpfKVN1/ylTdP8pUXP/KFBy/yhPcP8bN03/v7+///v7/P/7/Pz/+/z8/8rKyv+3t7f/4OLgaQAAAAApU3X/KVN1/yhSdP8oUnT/KFJy/xw4UP+/v7//v7+//7+/v/+/v7//uru7/2OBmf8AAAAAAAAAAClTdf8pU3X/KVN1/ylSdP8pUnT/JEpn/yRIZv8kSGX/I0dk/yNGY/8jRWL/KVN1/wAAAAAAAAAAKVN1/ylTdf8lS2n/IztO/yM7Tv8jO07/IztO/yM7Tv8jO07/JUtp/ydOb/8lS2n/AAAAAAAAAAApU3X/K2GQ/yhahv91dXX/XV1d/11dXf9dXV3/XV1d/4B/f/8oWob/Kmad/ylTdf8AAAAAAAAAAClTda0pU3X/KVN1/7O0tP/h4eD/3t7f/97f3//g4OD/s7S0/ylTdf8pU3X/KVN1rQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG1yds1dXFv1XVxb9Wxxdc8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUwFASZMCwAlTAsAI00LIys1CxcXFsEYFxbCJS01DAAlTQsAJk0LASZNCwAlTQUAAAAAAAAAAPwArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAASsQQAMrEEADKxBAAysQQAMrEEADKxB8PysQQAMrEE=");
var node = gFindBar.hasAttribute('oldFindBar') ? gFindBar.getElement("find-next") : gFindBar.getElement("highlight");
gFindBar.getElement("findbar-container").insertBefore(paste, node);
addDestructor(()=> paste.parentNode.removeChild(paste) );
paste.addEventListener("click", e=> {
   if ( e.button == 0 ) {
        if ( !getSelect() ) return;
        gFindBar._findField.value = getSelect(); // вставить текст
        Highlight("hits", "greenLight");
        };
   if ( e.button == 2 )        
        setTimeout(()=> clearFindField(), 0); // очистить поле текстового ввода  
}, false);


// Стиль для панели поиска .............
var uri = makeURI('data:text/css,'+ encodeURIComponent('\
#FindToolbar { border-bottom: 1px solid grey !important; }\
#find-field, .findbar-textbox { width: 325px !important; }\
#FindToolbar > .findbar-container > * { display: -moz-box !important; }\
#FindToolbar .findbar-textbox[status="notfound"] { color: white !important; }\
#FindToolbar > hbox > label { -moz-appearance: none !important; font-weight: bold !important; }\
#FindToolbar .findbar-textbox:not([style]):not([status="notfound"]) { color: black !important; }\
\
#FindToolbar .findbar-closebutton,\
#FindToolbar:not([mini]) #findButton,\
#FindToolbar .findbar-container > image,\
#FindToolbar:not([pasteButton]) #pasteButton,\
#FindToolbar .findbar-case-sensitive.tabbable,\
#FindToolbar checkbox[anonid="find-case-sensitive"],\
#FindToolbar .findbar-find-fast.findbar-find-status,\
#FindToolbar .findbar-find-fast[anonid="match-case-status"] {\
   display: none !important; }\
\
/* мини панель поиска ....*/\
#FindToolbar[mini] .findbar-textbox {\
   width: 16em !important;\
   height: 21px !important;\
   padding-right: 20px !important;\
   margin-right: 2px !important;\
   margin-left: -4px !important; }\
#FindToolbar[mini] {\
   position: fixed;\
   padding: 0 !important;\
   background: menu !important;\
   box-shadow: 0px 10px 5px -10px rgba(0,0,0,.3) !important;\
   border: 1px solid grey !important; }\
#FindToolbar[mini][top] {\
   border-top: 0 !important;\
   border-radius: 0 0 8px 8px !important; }\
#FindToolbar[mini][right] {\
   right: ' + findbarRight + 'px; }\
#FindToolbar:not([top]) + #content {\
   -moz-box-ordinal-group: 0 !important; }\
#FindToolbar:not([top]) {\
   -moz-box-ordinal-group: 1 !important; }\
#FindToolbar[mini]:not([top]) {\
   border-radius: 8px 8px 0 0 !important;\
   margin-top: -29px !important; }\
\
#FindToolbar[mini] toolbarspacer,\
#FindToolbar[mini] .findbar-entire-word,\
#FindToolbar[mini] label[class="checkbox-label"],\
#FindToolbar[mini] toolbarbutton.findbar-find-next,\
#FindToolbar[mini] toolbarbutton.findbar-find-previous,\
#FindToolbar[mini] .findbar-highlight label,\
#FindToolbar[mini] .findbar-closebutton,\
#FindToolbar[mini] .findbar-find-fast[anonid="find-label"],\
#FindToolbar[mini] .findbar-highlight,\
#FindToolbar[mini] .findbar-highlight[checked] {\
   -moz-appearance: none; display: none !important; }\
\
/* расположение элементов на панели поиска ....*/\
#pasteButton { padding-left: 6px !important; padding-right: 6px !important; }\
\
#FindToolbar:not([mini]):not([oldFindBar]):not([pasteButton]) #findCheckbox { margin-left: 35px !important; }\
#FindToolbar:not([mini]):not([oldFindBar]) .findbar-highlight.tabbable { -moz-box-ordinal-group: 4 !important; }\
#FindToolbar:not([mini]):not([oldFindBar]) * { -moz-box-ordinal-group: 99 !important; }\
#FindToolbar:not([mini]):not([oldFindBar]) hbox[anonid="findbar-textbox-wrapper"] {\
   -moz-box-ordinal-group: 1 !important; margin-left: -10px !important; }\
#FindToolbar:not([mini]):not([oldFindBar]) #pasteButton {\
   -moz-box-ordinal-group: 2 !important; margin-left: 5px !important; margin-right: 15px !important; }\
\
#FindToolbar:not([mini]) #hits { text-align: right; width: 4.1em !important; margin-left: -13px; margin-right: -1px; color: green; }\
\
#FindToolbar[mini] #hits { -moz-appearance: none !important; margin-top: 3px !important; }\
#FindToolbar[mini] textbox.findbar-textbox { -moz-box-ordinal-group: 1 !important; }\
#FindToolbar[mini] #findCheckbox { -moz-box-ordinal-group: 2 !important; margin-left: -24px !important; margin-right: -3px !important; }\
#FindToolbar[mini] #pasteButton { -moz-box-ordinal-group: 3 !important; margin: -5px 0 !important; }\
#FindToolbar[mini] #findButton { -moz-box-ordinal-group: 4 !important; margin: -5px 0 !important; }\
\
#FindToolbar[mini][oldFindBar] #pasteButton { margin: 1px 0 !important; }\
#FindToolbar[mini][oldFindBar] #findButton { margin: 1px 0 !important; }\
\
#FindToolbar[mini]:not([oldFindBar]) #findCheckbox { margin-left: -33px !important; margin-right: -5px !important; }\
\
/* не показывать панель поиска на страницах ....*/\
#main-window[title="about:config - Mozilla Firefox"] #appcontent > #FindToolbar,\
#main-window[title="Управление дополнениями - Mozilla Firefox"] #appcontent > #FindToolbar\
 { display: none !important; }\
'));

var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
sss.loadAndRegisterSheet(uri, 0); 
addDestructor(function() { sss.unregisterSheet(uri, 0) });

Отсутствует

 

№66824-06-2016 21:40:39

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 50.0

Re: [CB]Toggle Find+

bunda1
Не помогло к сожалению, ничего не изменилось. И подсказку
глюк проявляется и с вкл. и выкл.  Автовыделением.

Добавлено 24-06-2016 21:42:22
А нет, вру, теперь всё работает, если отключить Запуск поиска выделением текста

Отредактировано voqabuhe (24-06-2016 21:42:22)

Отсутствует

 

№66924-06-2016 23:32:27

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 50.0

Re: [CB]Toggle Find+

bunda1
Немного погонял, вроде всё что мне надо теперь работает. Спасибо большое. А то это одна из замечательных кнопок, которая если вылетает, то без неё уже как без рук. :beer:

Отсутствует

 

№67024-06-2016 23:48:43

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

Re: [CB]Toggle Find+

voqabuhe пишет

bunda1
Спасибо большое.

Спасибо за спасибо :)

Выделить код

Код:

(()=> {        
    var code = `
       function handleEvent(e) {
          if (e.button != 1) return;
          sendSyncMessage("response",{},{});
       }
       addEventListener('mousedown', handleEvent, false);
       
       function receiveMessage() {
          Services.console.logStringMessage("receiveMessage");
          removeMessageListener("destroy", receiveMessage);
          removeEventListener("mousedown", handleEvent, false);
       }
       addMessageListener("destroy", receiveMessage);
    `;
    
    var url = "data:," + encodeURIComponent(code);
    var mm = window.getGroupMessageManager("browsers");
    mm.loadFrameScript(url, true);

    function run(e) {
       Services.console.logStringMessage(e);
    }
    mm.addMessageListener("response", run);

    addDestructor(() => {
        mm.removeDelayedFrameScript(url);
        mm.broadcastAsyncMessage("destroy");
        mm.removeMessageListener("response", run);
    });
})();

Отсутствует

 

№67105-07-2016 01:55:47

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 50.0

Re: [CB]Toggle Find+

bunda1
В [nightly] на FindBar появилась кнопка Только слово целиком , которая испохабила FindBar мини.

Отсутствует

 

№67213-07-2016 15:56:13

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 50.0

Re: [CB]Toggle Find+

bunda1
После манипуляции ПКМ - Настроить, кнопка становится неактивной. Помогает перезапуск [nightly].
ПС Эт я что бы ты знал, что кнопку постепенно гробят :(

Отсутствует

 

№67303-08-2016 00:09:15

Caddy
Участник
 
Группа: Members
Зарегистрирован: 01-01-2016
Сообщений: 40
UA: Firefox 47.0

Re: [CB]Toggle Find+

bunda1
Здравствуйте, заметил баг, при вставке по СКМ текст дублируется (тексттекст), возможно конфликт с Вашей Autocopy?

Отсутствует

 

№67401-11-2016 19:35:24

roadrunner
Участник
 
Группа: Members
Зарегистрирован: 18-08-2011
Сообщений: 34
UA: Firefox 49.0

Re: [CB]Toggle Find+

не пойму в чем проблема, перестала вызываться кнопка  Toggle Find+ по Ctrl+f , вылазит стандартный поиск, раньше работало, подскажите в чем проблема? Firefox 49.0.2

Отредактировано roadrunner (01-11-2016 19:35:51)

Отсутствует

 

№67525-12-2016 21:57:16

lokiju
Участник
 
Группа: Members
Зарегистрирован: 30-01-2012
Сообщений: 208
UA: Firefox 50.0

Re: [CB]Toggle Find+

Firefox50.1.0 нет поиска выделенного на странице по нажатию пункта"Найти на странице" подменю"Find". Открывается пустая панель.
Если вставить или набрать текст в текстовом поле панели, то поиск есть.

Отсутствует

 

Board footer

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