[ Index ]

PHP Cross Reference of Phabricator

title

Body

[close]

/webroot/rsrc/js/core/ -> TextAreaUtils.js (source)

   1  /**
   2   * @requires javelin-install
   3   *           javelin-dom
   4   *           javelin-vector
   5   * @provides phabricator-textareautils
   6   * @javelin
   7   */
   8  
   9  JX.install('TextAreaUtils', {
  10    statics : {
  11      getSelectionRange : function(area) {
  12        var v = area.value;
  13  
  14        // NOTE: This works well in Safari, Firefox and Chrome. We'll probably get
  15        // less-good behavior on IE.
  16  
  17        var s = v.length;
  18        var e = v.length;
  19  
  20        if ('selectionStart' in area) {
  21          s = area.selectionStart;
  22          e = area.selectionEnd;
  23        }
  24  
  25        return {start: s, end: e};
  26      },
  27  
  28      getSelectionText : function(area) {
  29        var v = area.value;
  30        var r = JX.TextAreaUtils.getSelectionRange(area);
  31        return v.substring(r.start, r.end);
  32      },
  33  
  34      setSelectionRange : function(area, start, end) {
  35        if ('setSelectionRange' in area) {
  36          area.focus();
  37          area.setSelectionRange(start, end);
  38        }
  39      },
  40  
  41      setSelectionText : function(area, text) {
  42        var v = area.value;
  43        var r = JX.TextAreaUtils.getSelectionRange(area);
  44  
  45        v = v.substring(0, r.start) + text + v.substring(r.end, v.length);
  46        area.value = v;
  47  
  48        JX.TextAreaUtils.setSelectionRange(area, r.start, r.start + text.length);
  49      },
  50  
  51      /**
  52       * Get the document pixel positions of the beginning and end of a character
  53       * range in a textarea.
  54       */
  55      getPixelDimensions: function(area, start, end) {
  56        var v = area.value;
  57  
  58        // We're using zero-width spaces to make sure the spans get some
  59        // height even if there's no text in the metrics tag.
  60  
  61        var head = v.substring(0, start);
  62        var before = JX.$N('span', {}, '\u200b');
  63        var body = v.substring(start, end);
  64        var after = JX.$N('span', {}, '\u200b');
  65  
  66        // Create a similar shadow element which we can measure.
  67        var metrics = JX.$N(
  68          'var',
  69          {
  70            className: area.className,
  71          },
  72          [head, before, body, after]);
  73  
  74        // If the textarea has a scrollbar, force a scrollbar on the shadow
  75        // element too.
  76        if (area.scrollHeight > area.clientHeight) {
  77          metrics.style.overflowY = 'scroll';
  78        }
  79  
  80        area.parentNode.appendChild(metrics);
  81  
  82        // Adjust the positions we read out of the document to account for the
  83        // current scroll position of the textarea.
  84        var metrics_pos = JX.Vector.getPos(metrics);
  85        metrics_pos.x += area.scrollLeft;
  86        metrics_pos.y += area.scrollTop;
  87  
  88        var area_pos = JX.Vector.getPos(area);
  89        var before_pos = JX.Vector.getPos(before);
  90        var after_pos = JX.Vector.getPos(after);
  91  
  92        JX.DOM.remove(metrics);
  93  
  94        return {
  95          start: {
  96            x: area_pos.x + (before_pos.x - metrics_pos.x),
  97            y: area_pos.y + (before_pos.y - metrics_pos.y)
  98          },
  99          end: {
 100            x: area_pos.x + (after_pos.x - metrics_pos.x),
 101            y: area_pos.y + (after_pos.y - metrics_pos.y)
 102          }
 103        };
 104      }
 105  
 106    }
 107  });


Generated: Sun Nov 30 09:20:46 2014 Cross-referenced by PHPXref 0.7.1