diff --git a/experiments/capture.html b/experiments/capture.html index eed0f2f7..9df5e3cd 100644 --- a/experiments/capture.html +++ b/experiments/capture.html @@ -21,16 +21,17 @@ + diff --git a/src/Editor.js b/src/Editor.js index b286d150..044293b9 100644 --- a/src/Editor.js +++ b/src/Editor.js @@ -2,6 +2,7 @@ ace.provide("ace.Editor"); ace.Editor = function(renderer, doc, mode) { var container = renderer.getContainerElement(); + this.container = container; this.renderer = renderer; this.setMode(mode || new ace.mode.Text()); @@ -26,6 +27,7 @@ ace.Editor = function(renderer, doc, mode) { this._initialized = true; }; + ace.Editor.prototype.setDocument = function(doc) { // TODO: document change is not yet supported if (this.doc) { diff --git a/src/TextDocument.js b/src/TextDocument.js index 17c6400c..1c66c0e5 100644 --- a/src/TextDocument.js +++ b/src/TextDocument.js @@ -13,7 +13,7 @@ ace.mixin(ace.TextDocument.prototype, ace.MEventEmitter); ace.TextDocument.prototype._split = function(text) { - return text.split(/[\n\r]/); + return text.split(/\r\n|\r|\n/); }; ace.TextDocument.prototype.toString = function() { @@ -212,7 +212,7 @@ ace.TextDocument.prototype._insert = function(position, text) { var newLines = this._split(text); - if (text == "\n") { + if (this._isNewLine(text)) { var line = this.lines[position.row] || ""; this.lines[position.row] = line.substring(0, position.column); this.lines.splice(position.row + 1, 0, line.substring(position.column)); @@ -251,6 +251,10 @@ ace.TextDocument.prototype._insert = function(position, text) { } }; +ace.TextDocument.prototype._isNewLine = function(text) { + return (text == "\r\n" || text == "\r" || text == "\n"); +}; + ace.TextDocument.prototype.remove = function(range) { this._remove(range); diff --git a/src/ace.js b/src/ace.js index a49b2805..080725f4 100644 --- a/src/ace.js +++ b/src/ace.js @@ -139,26 +139,70 @@ ace.bind = function(fcn, context) { }; }; -ace.capture = function(el, eventHandler, releaseCaptureHandler) { - function onMouseMove(e) { - eventHandler(e); - e.stopPropagation(); +ace.getDocumentX = function(event) { + if (event.clientX) { + var scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft; + return event.clientX + scrollLeft; + } else { + return event.pageX; } - - function onMouseUp(e) { - eventHandler && eventHandler(e); - releaseCaptureHandler && releaseCaptureHandler(); - - document.removeEventListener("mousemove", onMouseMove, true); - document.removeEventListener("mouseup", onMouseUp, true); - - e.stopPropagation(); - } - - document.addEventListener("mousemove", onMouseMove, true); - document.addEventListener("mouseup", onMouseUp, true); }; +ace.getDocumentY = function(event) { + if (event.clientY) { + var scrollTop = document.documentElement.scrollTop || document.body.scrollTop; + return event.clientY + scrollTop; + } else { + return event.pageX; + } +}; + +if (document.documentElement.setCapture) { + ace.capture = function(el, eventHandler, releaseCaptureHandler) { + function onMouseMove(e) { + eventHandler(e); + return ace.stopPropagation(e); + } + + function onReleaseCapture(e) { + eventHandler && eventHandler(e); + releaseCaptureHandler && releaseCaptureHandler(); + + ace.removeListener(el, "mousemove", eventHandler); + ace.removeListener(el, "mouseup", onReleaseCapture); + ace.removeListener(el, "losecapture", onReleaseCapture); + + el.releaseCapture(); + } + + ace.addListener(el, "mousemove", eventHandler); + ace.addListener(el, "mouseup", onReleaseCapture); + ace.addListener(el, "losecapture", onReleaseCapture); + el.setCapture(); + }; +} +else { + ace.capture = function(el, eventHandler, releaseCaptureHandler) { + function onMouseMove(e) { + eventHandler(e); + e.stopPropagation(); + } + + function onMouseUp(e) { + eventHandler && eventHandler(e); + releaseCaptureHandler && releaseCaptureHandler(); + + document.removeEventListener("mousemove", onMouseMove, true); + document.removeEventListener("mouseup", onMouseUp, true); + + e.stopPropagation(); + } + + document.addEventListener("mousemove", onMouseMove, true); + document.addEventListener("mouseup", onMouseUp, true); + }; +} + ace.addMouseWheelListener = function(el, callback) { var listener = function(e) { e.wheel = (e.wheelDelta) ? e.wheelDelta / 120