From f35418ab7d4c1f2d7b3e9f76ef5d1d5db86bc03e Mon Sep 17 00:00:00 2001 From: nightwing Date: Wed, 4 Jul 2012 17:18:18 +0400 Subject: [PATCH 1/7] fix ie9 contextmenu --- lib/ace/keyboard/textinput.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/ace/keyboard/textinput.js b/lib/ace/keyboard/textinput.js index e4ba3e1c..3f0cb9dc 100644 --- a/lib/ace/keyboard/textinput.js +++ b/lib/ace/keyboard/textinput.js @@ -268,11 +268,14 @@ var TextInput = function(parentNode, host) { tempStyle = text.style.cssText; text.style.cssText = - "position:fixed; z-index:100000;" + //"background:rgba(250, 0, 0, 0.3); opacity:1;" + + "position:fixed; z-index:100000;" + + (useragent.isIE ? "background:rgba(0, 0, 0, 0.03); opacity:0.1;" : "") + //"background:rgba(250, 0, 0, 0.3); opacity:1;" + "left:" + (e.clientX - 2) + "px; top:" + (e.clientY - 2) + "px;"; if (host.selection.isEmpty()) text.value = ""; + else + reset(true); if (e.type != "mousedown") return; @@ -281,7 +284,7 @@ var TextInput = function(parentNode, host) { host.renderer.$keepTextAreaAtCursor = null; // on windows context menu is opened after mouseup - if (useragent.isGecko && useragent.isWin) + if (useragent.isWin && (useragent.isGecko || useragent.isIE)) event.capture(host.container, function(e) { text.style.left = e.clientX - 2 + "px"; text.style.top = e.clientY - 2 + "px"; From 81b6e5916a6fc8b4e7b6314170e1e4f5f57ae8c5 Mon Sep 17 00:00:00 2001 From: nightwing Date: Wed, 4 Jul 2012 17:57:35 +0400 Subject: [PATCH 2/7] fix text input for old ie --- lib/ace/keyboard/textinput.js | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/lib/ace/keyboard/textinput.js b/lib/ace/keyboard/textinput.js index 3f0cb9dc..af6fe1b7 100644 --- a/lib/ace/keyboard/textinput.js +++ b/lib/ace/keyboard/textinput.js @@ -166,7 +166,24 @@ var TextInput = function(parentNode, host) { }; event.addCommandKeyListener(text, host.onCommandKey.bind(host)); - event.addListener(text, "input", useragent.isIE ? onPropertyChange : onTextInput); + event.addListener(text, "input", onTextInput); + + if (useragent.isOldIE) { + var keytable = { 13:1, 27:1 }; + event.addListener(text, "keyup", function (e) { + if (inCompostion && (!text.value || keytable[e.keyCode])) + setTimeout(onCompositionEnd, 0); + if ((text.value.charCodeAt(0)|0) < 129) { + return; + } + inCompostion ? onCompositionUpdate() : onCompositionStart(); + }); + + event.addListener(text, "propertychange", function() { + if (text.value != PLACEHOLDER) + setTimeout(sendText, 0); + }); + } event.addListener(text, "paste", function(e) { // Mark that the next input text comes from past. From 61ae3503248bd86656008e3aa78c9539bcb6f5dd Mon Sep 17 00:00:00 2001 From: nightwing Date: Wed, 4 Jul 2012 17:59:02 +0400 Subject: [PATCH 3/7] do not use postmessage on oldIE since addListener is very slow there --- lib/ace/lib/event.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ace/lib/event.js b/lib/ace/lib/event.js index 1afca2a2..0948f158 100644 --- a/lib/ace/lib/event.js +++ b/lib/ace/lib/event.js @@ -292,7 +292,7 @@ exports.addCommandKeyListener = function(el, callback) { } }; -if (window.postMessage) { +if (window.postMessage && !useragent.isOldIE) { var postMessageId = 1; exports.nextTick = function(callback, win) { win = win || window; From e7b952a55e61c4b97142a9a745c189e5cf91f5a8 Mon Sep 17 00:00:00 2001 From: nightwing Date: Wed, 4 Jul 2012 19:26:07 +0400 Subject: [PATCH 4/7] fix mouse handling for ie8 --- lib/ace/lib/event.js | 16 ++++++++++++---- lib/ace/mouse/mouse_handler.js | 9 +++++++++ 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/lib/ace/lib/event.js b/lib/ace/lib/event.js index 0948f158..87da2cb2 100644 --- a/lib/ace/lib/event.js +++ b/lib/ace/lib/event.js @@ -193,7 +193,7 @@ exports.addMultiMouseDownListener = function(el, timeouts, eventHandler, callbac 4: "quadclick" }; - var listener = function(e) { + exports.addListener(el, "mousedown", function(e) { if (exports.getButton(e) != 0) { clicks = 0; } else { @@ -219,10 +219,18 @@ exports.addMultiMouseDownListener = function(el, timeouts, eventHandler, callbac clicks = 0; else if (clicks > 1) return eventHandler[callbackName](eventNames[clicks], e); - }; + }); - exports.addListener(el, "mousedown", listener); - useragent.isOldIE && exports.addListener(el, "dblclick", listener); + if (useragent.isOldIE) { + exports.addListener(el, "dblclick", function(e) { + clicks = 2; + if (timer) + clearTimeout(timer); + timer = setTimeout(function() {timer = null}, timeouts[clicks - 1] || 600); + eventHandler[callbackName]("mousedown", e); + eventHandler[callbackName](eventNames[clicks], e); + }); + } }; function normalizeCommandKeys(callback, e, keyCode) { diff --git a/lib/ace/mouse/mouse_handler.js b/lib/ace/mouse/mouse_handler.js index f108a7dc..b8e992a3 100644 --- a/lib/ace/mouse/mouse_handler.js +++ b/lib/ace/mouse/mouse_handler.js @@ -41,6 +41,7 @@ define(function(require, exports, module) { "use strict"; var event = require("../lib/event"); +var useragent = require("../lib/useragent"); var DefaultHandlers = require("./default_handlers").DefaultHandlers; var DefaultGutterHandler = require("./default_gutter_handler").GutterHandler; var MouseEvent = require("./mouse_event").MouseEvent; @@ -148,6 +149,14 @@ var MouseHandler = function(editor) { var onCaptureInterval = function() { self[self.state] && self[self.state](); } + + if (useragent.isOldIE && ev.domEvent.type == "dblclick") { + setTimeout(function() { + onCaptureInterval(); + onCaptureEnd(ev.domEvent); + }); + return; + } event.capture(this.editor.container, onMouseMove, onCaptureEnd); var timerId = setInterval(onCaptureInterval, 20); From 4319abf2567f4f280441179adddb9d5896d161b9 Mon Sep 17 00:00:00 2001 From: nightwing Date: Fri, 6 Jul 2012 12:06:42 +0400 Subject: [PATCH 5/7] fix scriptloading on old ie --- lib/ace/lib/net.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/lib/ace/lib/net.js b/lib/ace/lib/net.js index bf4eefe0..438a26a2 100644 --- a/lib/ace/lib/net.js +++ b/lib/ace/lib/net.js @@ -1,6 +1,6 @@ /* * based on code from: - * + * * @license RequireJS text 0.25.0 Copyright (c) 2010-2011, The Dojo Foundation All Rights Reserved. * Available via the MIT or new BSD license. * see: http://github.com/jrburke/requirejs for details @@ -8,6 +8,8 @@ define(function(require, exports, module) { "use strict"; +var useragent = require("ace/lib/useragent"); + exports.get = function (url, callback) { var xhr = exports.createXhr(); xhr.open('GET', url, true); @@ -55,8 +57,13 @@ exports.loadScript = function(path, callback) { s.src = path; head.appendChild(s); - - s.onload = callback; + + if (useragent.isOldIE) + s.onreadystatechange = function () { + this.readyState == 'loaded' && callback(); + }; + else + s.onload = callback; }; }); From 7b365db83f1054b8f2f2a19c300ee76b6468fc94 Mon Sep 17 00:00:00 2001 From: nightwing Date: Fri, 6 Jul 2012 12:24:04 +0400 Subject: [PATCH 6/7] event target for ie8 --- lib/ace/edit_session/folding.js | 2 +- lib/ace/mouse/default_gutter_handler.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/ace/edit_session/folding.js b/lib/ace/edit_session/folding.js index c6292a3f..310a9856 100644 --- a/lib/ace/edit_session/folding.js +++ b/lib/ace/edit_session/folding.js @@ -729,7 +729,7 @@ function Folding() { } else { if (addSubfolds) this.foldAll(row + 1, this.getLength()); - e.target.className += " invalid" + (e.target || e.srcElement).className += " invalid" } }; diff --git a/lib/ace/mouse/default_gutter_handler.js b/lib/ace/mouse/default_gutter_handler.js index 21c792a1..e7e005bd 100644 --- a/lib/ace/mouse/default_gutter_handler.js +++ b/lib/ace/mouse/default_gutter_handler.js @@ -44,7 +44,7 @@ function GutterHandler(mouseHandler) { var editor = mouseHandler.editor; mouseHandler.editor.setDefaultHandler("guttermousedown", function(e) { - var target = e.domEvent.target; + var target = e.domEvent.target || e.domEvent.srcElement; if (target.className.indexOf("ace_gutter-cell") == -1) return; From 78471317f6fb0e1c7f9268c47d365d5732a0f630 Mon Sep 17 00:00:00 2001 From: nightwing Date: Fri, 6 Jul 2012 13:15:09 +0400 Subject: [PATCH 7/7] do not use event.target for determining clicked gutter region breakpoints/numbers/foldwidgets --- lib/ace/ext/textarea.js | 1 - lib/ace/layer/gutter.js | 20 ++++++++++++++++++++ lib/ace/mouse/default_gutter_handler.js | 8 ++------ lib/ace/mouse/fold_handler.js | 7 +++++-- 4 files changed, 27 insertions(+), 9 deletions(-) diff --git a/lib/ace/ext/textarea.js b/lib/ace/ext/textarea.js index c46579d8..918e8ebd 100644 --- a/lib/ace/ext/textarea.js +++ b/lib/ace/ext/textarea.js @@ -193,7 +193,6 @@ exports.transformTextarea = function(element, loader) { var settingOpener = document.createElement("div"); applyStyles(settingOpener, { position: "absolute", - width: "15px", right: "0px", bottom: "0px", background: "red", diff --git a/lib/ace/layer/gutter.js b/lib/ace/layer/gutter.js index be72a172..d30c4ba3 100644 --- a/lib/ace/layer/gutter.js +++ b/lib/ace/layer/gutter.js @@ -174,12 +174,32 @@ var Gutter = function(parentEl) { dom.removeCssClass(this.element, "ace_folding-enabled"); this.$showFoldWidgets = show; + this.$padding = null; }; this.getShowFoldWidgets = function() { return this.$showFoldWidgets; }; + this.$computePadding = function() { + if (!this.element.firstChild) + return {left: 0, right: 0}; + var style = dom.computedStyle(this.element.firstChild); + this.$padding = {} + this.$padding.left = parseInt(style.paddingLeft) + 1; + this.$padding.right = parseInt(style.paddingRight); + return this.$padding; + }; + + this.getRegion = function(point) { + var padding = this.$padding || this.$computePadding(); + var rect = this.element.getBoundingClientRect(); + if (point.x < padding.left + rect.left) + return "markers"; + if (this.$showFoldWidgets && point.x > rect.right - padding.right) + return "foldWidgets"; + }; + }).call(Gutter.prototype); exports.Gutter = Gutter; diff --git a/lib/ace/mouse/default_gutter_handler.js b/lib/ace/mouse/default_gutter_handler.js index e7e005bd..0fbadfb7 100644 --- a/lib/ace/mouse/default_gutter_handler.js +++ b/lib/ace/mouse/default_gutter_handler.js @@ -44,15 +44,11 @@ function GutterHandler(mouseHandler) { var editor = mouseHandler.editor; mouseHandler.editor.setDefaultHandler("guttermousedown", function(e) { - var target = e.domEvent.target || e.domEvent.srcElement; - if (target.className.indexOf("ace_gutter-cell") == -1) - return; - if (!editor.isFocused()) return; + var gutterRegion = editor.renderer.$gutterLayer.getRegion(e); - var padding = parseInt(dom.computedStyle(target).paddingLeft); - if (e.x < padding + target.getBoundingClientRect().left + 1) + if (gutterRegion) return; var row = e.getDocumentPosition().row; diff --git a/lib/ace/mouse/fold_handler.js b/lib/ace/mouse/fold_handler.js index ecde7769..2064660e 100644 --- a/lib/ace/mouse/fold_handler.js +++ b/lib/ace/mouse/fold_handler.js @@ -58,9 +58,12 @@ function FoldHandler(editor) { }); editor.on("gutterclick", function(e) { - if (e.domEvent.target.className.indexOf("ace_fold-widget") != -1) { + var gutterRegion = editor.renderer.$gutterLayer.getRegion(e); + + if (gutterRegion == "foldWidgets") { var row = e.getDocumentPosition().row; - editor.session.onFoldWidgetClick(row, e.domEvent); + if (editor.session.foldWidgets[row]) + editor.session.onFoldWidgetClick(row, e); e.stop(); } });