Reviewers:
golang-dev_googlecode.com,
Message:
Hello
golan...@googlecode.com (cc:
golan...@googlegroups.com),
I'd like you to review this change to
http://go.googlecode.com/hg/
Description:
goplay: does not work on IE.
Please review this at
http://codereview.appspot.com/6847118/
Affected files:
M misc/goplay/goplay.go
Index: misc/goplay/goplay.go
===================================================================
--- a/misc/goplay/goplay.go
+++ b/misc/goplay/goplay.go
@@ -177,24 +177,61 @@
function insertTabs(n) {
// find the selection start and end
var cont = document.getElementById("edit");
- var start = cont.selectionStart;
- var end = cont.selectionEnd;
- // split the textarea content into two, and insert n tabs
- var v = cont.value;
- var u = v.substr(0, start);
- for (var i=0; i<n; i++) {
- u += "\t";
+ if (cont.selectionStart) {
+ var start = cont.selectionStart;
+ var end = cont.selectionEnd;
+ // split the textarea content into two, and insert n tabs
+ var v = cont.value;
+ var u = v.substr(0, start);
+ for (var i=0; i<n; i++) {
+ u += "\t";
+ }
+ u += v.substr(end);
+ // set revised content
+ cont.value = u;
+ // reset caret position after inserted tabs
+ cont.selectionStart = start+n;
+ cont.selectionEnd = start+n;
+ } else {
+ var v = cont.value;
+ var start = getCaretPosition(cont);
+ var u = v.substr(0, start);
+ for (var i=0; i<n; i++) {
+ u += "\t";
+ }
+ u += v.substr(start);
+ cont.value = u;
+ range = cont.createTextRange();
+ range.collapse(true);
+ range.moveStart('character', v.substr(0,
start).replace(/\r/g, '').length+n);
+ range.moveEnd('character', 0);
+ range.select();
}
- u += v.substr(end);
- // set revised content
- cont.value = u;
- // reset caret position after inserted tabs
- cont.selectionStart = start+n;
- cont.selectionEnd = start+n;
+
+}
+
+function getCaretPosition(el) {
+ if (el.selectionStart)
+ return el.selectionStart;
+ var range = document.selection.createRange();
+ var len = el.value.length;
+ var text = el.value.replace(/\r\n/g, "\n");
+
+ var spos = el.createTextRange();
+ spos.moveToBookmark(range.getBookmark());
+ var epos = el.createTextRange();
+ epos.collapse(false);
+
+ if (spos.compareEndPoints("StartToEnd", epos) > -1) {
+ return len;
+ }
+ var start = -spos.moveStart("character", -len);
+ start += text.slice(0, start).split("\n").length - 1;
+ return start;
}
function autoindent(el) {
- var curpos = el.selectionStart;
+ var curpos = getCaretPosition(el);
var tabs = 0;
while (curpos > 0) {
curpos--;
@@ -213,6 +250,7 @@
if (e.preventDefault) {
e.preventDefault();
} else {
+ e.returnValue = false;
e.cancelBubble = true;
}
}
@@ -226,11 +264,11 @@
}
if (e.keyCode == 13) { // enter
if (e.shiftKey) { // +shift
- compile(e.target);
+ compile(e.target || e.srcElement);
preventDefault(e);
return false;
} else {
- autoindent(e.target);
+ autoindent(e.target || e.srcElement);
}
}
return true;