IE mouse event and mouse capture fixes

This commit is contained in:
Fabian Jakobs 2010-04-19 13:08:07 +02:00
commit 7869795a1d
4 changed files with 74 additions and 46 deletions

View file

@ -21,16 +21,17 @@
</div>
<script src="../src/ace.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript" charset="utf-8">
var el = document.getElementById("juhu");
el.addEventListener("mousedown", function(e) {
el.innerHTML = e.pageX + " " + e.pageY;
capture(
ace.addListener(el, "mousedown", function(e) {
el.innerHTML = ace.getDocumentX(e) + " " + ace.getDocumentY(e);
ace.capture(
el,
function(e) {
el.innerHTML = e.pageX + " " + e.pageY;
el.innerHTML = ace.getDocumentX(e) + " " + ace.getDocumentY(e);
}, function() {
el.innerHTML = "";
}
@ -38,29 +39,6 @@ el.addEventListener("mousedown", function(e) {
});
function capture(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);
}
</script>
</body>

View file

@ -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) {

View file

@ -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);

View file

@ -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