diff --git a/lib/ace/lib/event.js b/lib/ace/lib/event.js index 42ed97ff..aad5ddd4 100644 --- a/lib/ace/lib/event.js +++ b/lib/ace/lib/event.js @@ -184,32 +184,41 @@ exports.addMouseWheelListener = function(el, callback) { exports.addListener(el, "mousewheel", listener); }; -exports.addMultiMouseDownListener = function(el, button, count, timeout, callback) { +exports.addMultiMouseDownListener = function(el, timeouts, eventHandler, callbackName) { var clicks = 0; - var startX, startY; + var startX, startY, timer; + var eventNames = { + 2: "dblclick", + 3: "tripleclick", + 4: "quadclick" + }; var listener = function(e) { - clicks += 1; + if (exports.getButton(e) != 0) { + clicks = 0; + } else { + var isNewClick = Math.abs(e.clientX - startX) > 5 || Math.abs(e.clientY - startY) > 5; + + if (!timer || isNewClick) + clicks = 0; + + clicks += 1; + + if (timer) + clearTimeout(timer) + timer = setTimeout(function() {timer = null}, timeouts[clicks - 1] || 600); + } if (clicks == 1) { startX = e.clientX; startY = e.clientY; - - setTimeout(function() { - clicks = 0; - }, timeout || 600); } - var isButton = exports.getButton(e) == button; - if (!isButton || Math.abs(e.clientX - startX) > 5 || Math.abs(e.clientY - startY) > 5) - clicks = 0; + eventHandler[callbackName]("mousedown", e); - if (clicks == count) { + if (clicks > 4) clicks = 0; - callback(e); - } - - if (isButton) - return exports.preventDefault(e); + else if (clicks > 1) + return eventHandler[callbackName](eventNames[clicks], e); }; exports.addListener(el, "mousedown", listener); diff --git a/lib/ace/mouse/mouse_handler.js b/lib/ace/mouse/mouse_handler.js index f7dbee99..ad9b19f4 100644 --- a/lib/ace/mouse/mouse_handler.js +++ b/lib/ace/mouse/mouse_handler.js @@ -57,12 +57,9 @@ var MouseHandler = function(editor) { }); var mouseTarget = editor.renderer.getMouseEventTarget(); - event.addListener(mouseTarget, "mousedown", this.onMouseEvent.bind(this, "mousedown")); event.addListener(mouseTarget, "click", this.onMouseEvent.bind(this, "click")); event.addListener(mouseTarget, "mousemove", this.onMouseMove.bind(this, "mousemove")); - event.addMultiMouseDownListener(mouseTarget, 0, 2, 500, this.onMouseEvent.bind(this, "dblclick")); - event.addMultiMouseDownListener(mouseTarget, 0, 3, 600, this.onMouseEvent.bind(this, "tripleclick")); - event.addMultiMouseDownListener(mouseTarget, 0, 4, 600, this.onMouseEvent.bind(this, "quadclick")); + event.addMultiMouseDownListener(mouseTarget, [300, 300, 250], this, "onMouseEvent"); event.addMouseWheelListener(editor.container, this.onMouseWheel.bind(this, "mousewheel")); var gutterEl = editor.renderer.$gutter; @@ -126,8 +123,9 @@ var MouseHandler = function(editor) { this.y = ev.y; // do not move textarea during selection - var kt = this.editor.renderer.$keepTextAreaAtCursor; - this.editor.renderer.$keepTextAreaAtCursor = false; + var renderer = this.editor.renderer; + if (renderer.$keepTextAreaAtCursor) + renderer.$keepTextAreaAtCursor = null; var self = this; var onMouseSelection = function(e) { @@ -139,8 +137,10 @@ var MouseHandler = function(editor) { clearInterval(timerId); self[self.state + "End"] && self[self.state + "End"](e); self.$clickSelection = null; - self.editor.renderer.$keepTextAreaAtCursor = kt; - self.editor.renderer.$moveTextAreaToCursor(); + if (renderer.$keepTextAreaAtCursor == null) { + renderer.$keepTextAreaAtCursor = true; + renderer.$moveTextAreaToCursor(); + } }; var onSelectionInterval = function() { @@ -149,8 +149,6 @@ var MouseHandler = function(editor) { event.capture(this.editor.container, onMouseSelection, onMouseSelectionEnd); var timerId = setInterval(onSelectionInterval, 20); - - ev.preventDefault(); }; }).call(MouseHandler.prototype);