home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 4838 / 4838.xpi / chrome / multipletab.jar / content / multipletab / lib / autoScroll.js < prev    next >
Encoding:
JavaScript  |  2010-02-03  |  5.0 KB  |  161 lines

  1. /*
  2.  Tab Bar AutoScroll Library for Vertical and Horizontal Tab Bar
  3.  
  4.  Usage:
  5.    var scrolled = window['piro.sakura.ne.jp']
  6.                         .autoScroll
  7.                         .processAutoScroll(mouseMoveOrDragOverEvent);
  8.  
  9.  lisence: The MIT License, Copyright (c) 2009 SHIMODA "Piro" Hiroshi
  10.    http://www.cozmixng.org/repos/piro/fx3-compatibility-lib/trunk/license.txt
  11.  original:
  12.    http://www.cozmixng.org/repos/piro/fx3-compatibility-lib/trunk/autoScroll.js
  13. */
  14. (function() {
  15.     const currentRevision = 2;
  16.  
  17.     if (!('piro.sakura.ne.jp' in window)) window['piro.sakura.ne.jp'] = {};
  18.  
  19.     var loadedRevision = 'autoScroll' in window['piro.sakura.ne.jp'] ?
  20.             window['piro.sakura.ne.jp'].autoScroll.revision :
  21.             0 ;
  22.     if (loadedRevision && loadedRevision > currentRevision) {
  23.         return;
  24.     }
  25.  
  26.     var Cc = Components.classes;
  27.     var Ci = Components.interfaces;
  28.  
  29.     window['piro.sakura.ne.jp'].autoScroll = {
  30.         revision : currentRevision,
  31.  
  32.         processAutoScroll : function(aEvent)
  33.         {
  34.             var target = aEvent.originalTarget;
  35.             var b = target.ownerDocument.evaluate(
  36.                     'ancestor-or-self::*[local-name()="tabbrowser"]',
  37.                     target,
  38.                     null,
  39.                     XPathResult.FIRST_ORDERED_NODE_TYPE,
  40.                     null
  41.                 ).singleNodeValue;
  42.             if (!b) return false;
  43.  
  44.             var tabs = b.mTabContainer;
  45.             if (tabs.getAttribute('overflow') != 'true')
  46.                 return false;
  47.  
  48.             var box        = this.getScrollBox(b);
  49.             var boxObject  = this.getScrollBoxObject(b);
  50.             var innerBoxObject = (box.localName == 'arrowscrollbox' ? box._scrollbox : box ).boxObject;
  51.  
  52.             var orientBox = box || tabs;
  53.             var isMultirow = tabs.getAttribute('flowing') == 'multibar'; // Tab Mix Plus
  54.             var isVertical = (
  55.                     isMultirow ||
  56.                     ((orientBox.getAttribute('orient') || window.getComputedStyle(orientBox, '').getPropertyValue('-moz-box-orient')) == 'vertical')
  57.                 );
  58.  
  59.             var maxX = {}, maxY = {}, curX = {}, curY = {};
  60.             boxObject.getScrolledSize(maxX, maxY);
  61.             boxObject.getPosition(curX, curY);
  62.  
  63.             var pixels;
  64.             if (isVertical) {
  65.                 pixels = tabs.childNodes[0].boxObject.height * 0.5;
  66.                 if (isMultirow) pixels *= 0.5;
  67.                 if (aEvent.screenY < boxObject.screenY + this.getUpButtonHeight(b)) {
  68.                     if (curY.value == 0) return false;
  69.                     pixels *= -1;
  70.                 }
  71.                 else if (aEvent.screenY > boxObject.screenY + boxObject.height - this.getDownButtonHeight(b)) {
  72.                     if (innerBoxObject.height + curY.value == maxY.value) return false;
  73.                 }
  74.                 else {
  75.                     return false;
  76.                 }
  77.             }
  78.             else {
  79.                 pixels = box.scrollIncrement;
  80.                 var ltr = window.getComputedStyle(tabs, null).direction == 'ltr';
  81.                 if (aEvent.screenX < boxObject.screenX + this.getUpButtonWidth(b)) {
  82.                     if (curX.value == 0) return false;
  83.                     pixels *= -1;
  84.                 }
  85.                 else if (aEvent.screenX > boxObject.screenX + boxObject.width - this.getDownButtonWidth(b)) {
  86.                     if (innerBoxObject.width + curX.value == maxX.value) return false;
  87.                     return false;
  88.                 }
  89.                 else {
  90.                     return false;
  91.                 }
  92.                 pixels = (ltr ? 1 : -1) * pixels;
  93.             }
  94.  
  95.             if ('scrollByPixels' in box) {
  96.                 box.scrollByPixels(pixels);
  97.             }
  98.             else { // Tab Mix Plus?
  99.                 if (isVertical)
  100.                     boxObject.scrollBy(0, pixels);
  101.                 else
  102.                     boxObject.scrollBy(pixels, 0);
  103.             }
  104.             return true;
  105.         },
  106.  
  107.         getScrollBox : function(aTabBrowser) 
  108.         {
  109.             return document.getAnonymousElementByAttribute(aTabBrowser.mTabContainer, 'class', 'tabs-frame') || // Tab Mix Plus
  110.                     aTabBrowser.mTabContainer.mTabstrip;
  111.         },
  112.  
  113.         getScrollBoxObject : function(aTabBrowser) 
  114.         {
  115.             var box = this.getScrollBox(aTabBrowser);
  116.             return (box.scrollBoxObject || box.boxObject)
  117.                     .QueryInterface(Ci.nsIScrollBoxObject); // Tab Mix Plus
  118.         },
  119.  
  120.         getUpButton : function(aTabBrowser)
  121.         {
  122.             var box = this.getScrollBox(aTabBrowser);
  123.             return box._scrollButtonUp ||
  124.                 document.getAnonymousElementByAttribute(box, 'class', 'scrollbutton-up') ||
  125.                 document.getAnonymousElementByAttribute(box.previousSibling, 'class', 'scrollbutton-up'); // Tab Mix Plus
  126.         },
  127.         getDownButton : function(aTabBrowser)
  128.         {
  129.             var box = this.getScrollBox(aTabBrowser);
  130.             return box._scrollButtonDown ||
  131.                 document.getAnonymousElementByAttribute(box, 'class', 'scrollbutton-down') ||
  132.                 document.getAnonymousElementByAttribute(box.nextSibling, 'class', 'scrollbutton-up'); // Tab Mix Plus
  133.         },
  134.  
  135.         autoScrollArea : 20,
  136.  
  137.         getUpButtonHeight : function(aTabBrowser)
  138.         {
  139.             var button = this.getUpButton(aTabBrowser);
  140.             return (button ? button.boxObject.height : 0 ) || this.autoScrollArea;
  141.         },
  142.         getUpButtonWidth : function(aTabBrowser)
  143.         {
  144.             var button = this.getUpButton(aTabBrowser);
  145.             return (button ? button.boxObject.width : 0 ) || this.autoScrollArea;
  146.         },
  147.  
  148.         getDownButtonHeight : function(aTabBrowser)
  149.         {
  150.             var button = this.getDownButton(aTabBrowser);
  151.             return (button ? button.boxObject.height : 0 ) || this.autoScrollArea;
  152.         },
  153.         getDownButtonWidth : function(aTabBrowser)
  154.         {
  155.             var button = this.getDownButton(aTabBrowser);
  156.             return (button ? button.boxObject.width : 0 ) || this.autoScrollArea;
  157.         }
  158.  
  159.     };
  160. })();
  161.