home *** CD-ROM | disk | FTP | other *** search
/ PC World 2005 July & August / PCWorld_2005-07-08_cd.bin / komunikace / netscape / nsb-install-8-0.exe / chrome / toolkit.jar / content / global / viewZoomOverlay.js < prev    next >
Text File  |  2004-12-29  |  4KB  |  162 lines

  1.  
  2. /** Document Zoom Management Code
  3.  *
  4.  * To use this, you'll need to have a getMarkupDocumentViewer() function which returns a
  5.  * nsIMarkupDocumentViewer.
  6.  *
  7.  **/
  8.  
  9.  
  10. function ZoomManager() {
  11. }
  12.  
  13. ZoomManager.prototype = {
  14.   instance : null,
  15.  
  16.   getInstance : function() {
  17.     if (!ZoomManager.prototype.instance)
  18.       ZoomManager.prototype.instance = new ZoomManager();
  19.  
  20.     return ZoomManager.prototype.instance;
  21.   },
  22.  
  23.   MIN : 1,
  24.   MAX : 2000,
  25.   factorOther : 300,
  26.   factorAnchor : 300,
  27.     zoomFactors: [50, 75, 90, 100, 120, 150, 200],
  28.   steps : 0,
  29.  
  30.   get textZoom() {
  31.     var currentZoom;
  32.     try {
  33.       currentZoom = Math.round(getMarkupDocumentViewer().textZoom * 100);
  34.       if (this.indexOf(currentZoom) == -1) {
  35.         if (currentZoom != this.factorOther) {
  36.           this.factorOther = currentZoom;
  37.           this.factorAnchor = this.factorOther;
  38.         }
  39.       }
  40.     } catch (e) {
  41.       currentZoom = 100;
  42.     }
  43.     return currentZoom;
  44.   },
  45.  
  46.   set textZoom(aZoom) {
  47.     if (aZoom < this.MIN || aZoom > this.MAX)
  48.       throw Components.results.NS_ERROR_INVALID_ARG;
  49.  
  50.     getMarkupDocumentViewer().textZoom = aZoom / 100;
  51.   },
  52.  
  53.   enlarge : function() {
  54.     this.jump(1);
  55.   },
  56.  
  57.   reduce : function() {
  58.     this.jump(-1);
  59.   },
  60.   reset : function() {
  61.     this.textZoom = 100;
  62.   },
  63.   indexOf : function(aZoom) {
  64.     var index = -1;
  65.     if (this.isZoomInRange(aZoom)) {
  66.       index = this.zoomFactors.length - 1;
  67.       while (index >= 0 && this.zoomFactors[index] != aZoom)
  68.         --index;
  69.     }
  70.  
  71.     return index;
  72.   },
  73.  
  74.   /***** internal helper functions below here *****/
  75.  
  76.   isZoomInRange : function(aZoom) {
  77.     return (aZoom >= this.zoomFactors[0] && aZoom <= this.zoomFactors[this.zoomFactors.length - 1]);
  78.   },
  79.  
  80.   jump : function(aDirection) {
  81.     if (aDirection != -1 && aDirection != 1)
  82.       throw Components.results.NS_ERROR_INVALID_ARG;
  83.  
  84.     var currentZoom = this.textZoom;
  85.     var insertIndex = -1;
  86.     const stepFactor = 1.5;
  87.  
  88.     // temporarily add factorOther to list
  89.     if (this.isZoomInRange(this.factorOther)) {
  90.       insertIndex = 0;
  91.       while (this.zoomFactors[insertIndex] < this.factorOther)
  92.         ++insertIndex;
  93.  
  94.       if (this.zoomFactors[insertIndex] != this.factorOther)
  95.         this.zoomFactors.splice(insertIndex, 0, this.factorOther);
  96.     }
  97.  
  98.     var factor;
  99.     var done = false;
  100.  
  101.     if (this.isZoomInRange(currentZoom)) {
  102.       var index = this.indexOf(currentZoom);
  103.       //<Merc, SLiu let page text zoom in range
  104.       /*
  105.       if (aDirection == -1 && index == 0 ||
  106.           aDirection ==  1 && index == this.zoomFactors.length - 1) {
  107.         this.steps = 0;
  108.         this.factorAnchor = this.zoomFactors[index];
  109.       } else {
  110.         factor = this.zoomFactors[index + aDirection];
  111.         done = true;
  112.       }
  113.       */
  114.       if((aDirection == -1 && index>0) || (aDirection == 1 && index<this.zoomFactors.length - 1))
  115.       {
  116.          factor = this.zoomFactors[index + aDirection];
  117.          done = true;   
  118.       }
  119.       else
  120.          return;
  121.       //SLiu/>
  122.     }
  123.  
  124.     if (!done) {
  125.       this.steps += aDirection;
  126.       factor = this.factorAnchor * Math.pow(stepFactor, this.steps);
  127.       if (factor < this.MIN || factor > this.MAX) {
  128.         this.steps -= aDirection;
  129.         factor = this.factorAnchor * Math.pow(stepFactor, this.steps);
  130.       }
  131.       factor = Math.round(factor);
  132.       if (this.isZoomInRange(factor))
  133.         factor = this.snap(factor);
  134.       else
  135.         this.factorOther = factor;
  136.     }
  137.  
  138.     if (insertIndex != -1)
  139.       this.zoomFactors.splice(insertIndex, 1);
  140.  
  141.     this.textZoom = factor;
  142.   },
  143.  
  144.   snap : function(aZoom) {
  145.     if (this.isZoomInRange(aZoom)) {
  146.       var level = 0;
  147.       while (this.zoomFactors[level + 1] < aZoom)
  148.         ++level;
  149.  
  150.       // if aZoom closer to [level + 1] than [level], snap to [level + 1]
  151.       if ((this.zoomFactors[level + 1] - aZoom) < (aZoom - this.zoomFactors[level]))
  152.         ++level;
  153.  
  154.       aZoom = this.zoomFactors[level];
  155.     }
  156.  
  157.     return aZoom;
  158.   }
  159. }
  160.  
  161.  
  162.