home *** CD-ROM | disk | FTP | other *** search
/ PC World 2003 May / PCWorld_2003-05_cd.bin / Komunik / phoenix / chrome / toolkit.jar / content / global / viewZoomOverlay.js < prev    next >
Text File  |  2002-11-03  |  4KB  |  151 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.       if (aDirection == -1 && index == 0 ||
  104.           aDirection ==  1 && index == this.zoomFactors.length - 1) {
  105.         this.steps = 0;
  106.         this.factorAnchor = this.zoomFactors[index];
  107.       } else {
  108.         factor = this.zoomFactors[index + aDirection];
  109.         done = true;
  110.       }
  111.     }
  112.  
  113.     if (!done) {
  114.       this.steps += aDirection;
  115.       factor = this.factorAnchor * Math.pow(stepFactor, this.steps);
  116.       if (factor < this.MIN || factor > this.MAX) {
  117.         this.steps -= aDirection;
  118.         factor = this.factorAnchor * Math.pow(stepFactor, this.steps);
  119.       }
  120.       factor = Math.round(factor);
  121.       if (this.isZoomInRange(factor))
  122.         factor = this.snap(factor);
  123.       else
  124.         this.factorOther = factor;
  125.     }
  126.  
  127.     if (insertIndex != -1)
  128.       this.zoomFactors.splice(insertIndex, 1);
  129.  
  130.     this.textZoom = factor;
  131.   },
  132.  
  133.   snap : function(aZoom) {
  134.     if (this.isZoomInRange(aZoom)) {
  135.       var level = 0;
  136.       while (this.zoomFactors[level + 1] < aZoom)
  137.         ++level;
  138.  
  139.       // if aZoom closer to [level + 1] than [level], snap to [level + 1]
  140.       if ((this.zoomFactors[level + 1] - aZoom) < (aZoom - this.zoomFactors[level]))
  141.         ++level;
  142.  
  143.       aZoom = this.zoomFactors[level];
  144.     }
  145.  
  146.     return aZoom;
  147.   }
  148. }
  149.  
  150.  
  151.