[ Index ] |
PHP Cross Reference of Phabricator |
[Summary view] [Print] [Text view]
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 });
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Sun Nov 30 09:20:46 2014 | Cross-referenced by PHPXref 0.7.1 |