diff --git a/lib/ace/css/editor.css b/lib/ace/css/editor.css index da284a2e..73702bdf 100644 --- a/lib/ace/css/editor.css +++ b/lib/ace/css/editor.css @@ -148,10 +148,22 @@ box-sizing: border-box; } -.ace_cursor.ace_hidden { +.ace_hidden-cursors .ace_cursor { opacity: 0.2; } +.ace_smooth-blinking .ace_cursor { + -moz-transition: opacity 0.18s; + -webkit-transition: opacity 0.18s; + -o-transition: opacity 0.18s; + -ms-transition: opacity 0.18s; + transition: opacity 0.18s; +} + +.ace_cursor[style*="opacity: 0"]{ + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; +} + .ace_editor.ace_multiselect .ace_cursor { border-left-width: 1px; } diff --git a/lib/ace/keyboard/emacs.js b/lib/ace/keyboard/emacs.js index a1248759..8fc3aeeb 100644 --- a/lib/ace/keyboard/emacs.js +++ b/lib/ace/keyboard/emacs.js @@ -66,7 +66,7 @@ exports.handler.attach = function(editor) { opacity: 1;\ background-color: transparent;\ }\ - .emacs-mode .ace_cursor.ace_overwrite {\ + .emacs-mode .ace_overwrite-cursors .ace_cursor {\ opacity: 1;\ background-color: transparent;\ border-width: 0 0 2px 2px !important;\ diff --git a/lib/ace/layer/cursor.js b/lib/ace/layer/cursor.js index 9d688b57..a15e7581 100644 --- a/lib/ace/layer/cursor.js +++ b/lib/ace/layer/cursor.js @@ -40,9 +40,12 @@ var Cursor = function(parentEl) { this.isVisible = false; this.isBlinking = true; + this.blinkInterval = 1000; + this.smoothBlinking = false; this.cursors = []; this.cursor = this.addCursor(); + dom.addCssClass(this.element, "ace_hidden-cursors"); }; (function() { @@ -57,20 +60,33 @@ var Cursor = function(parentEl) { }; this.setBlinking = function(blinking) { - this.isBlinking = blinking; - if (blinking) + if (blinking != this.isBlinking){ + this.isBlinking = blinking; this.restartTimer(); + } + }; + + this.setBlinkInterval = function(blinkInterval) { + if (blinkInterval != this.blinkInterval){ + this.blinkInterval = blinkInterval; + this.restartTimer(); + } + }; + + this.setSmoothBlinking = function(smoothBlinking) { + if (smoothBlinking != this.smoothBlinking) { + this.smoothBlinking = smoothBlinking; + if (smoothBlinking) + dom.addCssClass(this.element, "ace_smooth-blinking"); + else + dom.removeCssClass(this.element, "ace_smooth-blinking"); + this.restartTimer(); + } }; this.addCursor = function() { var el = dom.createElement("div"); - var className = "ace_cursor"; - if (!this.isVisible) - className += " ace_hidden"; - if (this.overwrite) - className += " ace_overwrite"; - - el.className = className; + el.className = "ace_cursor"; this.element.appendChild(el); this.cursors.push(el); return el; @@ -86,43 +102,53 @@ var Cursor = function(parentEl) { this.hideCursor = function() { this.isVisible = false; - for (var i = this.cursors.length; i--; ) - dom.addCssClass(this.cursors[i], "ace_hidden"); - clearInterval(this.blinkId); + dom.addCssClass(this.element, "ace_hidden-cursors"); + this.restartTimer(); }; this.showCursor = function() { this.isVisible = true; - for (var i = this.cursors.length; i--; ) - dom.removeCssClass(this.cursors[i], "ace_hidden"); - - this.element.style.visibility = ""; + dom.removeCssClass(this.element, "ace_hidden-cursors"); this.restartTimer(); }; this.restartTimer = function() { - clearInterval(this.blinkId); - if (!this.isBlinking) - return; - if (!this.isVisible) + clearInterval(this.intervalId); + clearTimeout(this.timeoutId); + if (this.smoothBlinking) + dom.removeCssClass(this.element, "ace_smooth-blinking"); + for (var i = this.cursors.length; i--; ) + this.cursors[i].style.opacity = ""; + + if (!this.isBlinking || !this.blinkInterval || !this.isVisible) return; - var element = this.cursors.length == 1 ? this.cursor : this.element; - this.blinkId = setInterval(function() { - element.style.visibility = "hidden"; - setTimeout(function() { - element.style.visibility = ""; - }, 400); - }, 1000); + if (this.smoothBlinking) + setTimeout(function(){ + dom.addCssClass(this.element, "ace_smooth-blinking"); + }.bind(this)); + + var blink = function(){ + this.timeoutId = setTimeout(function() { + for (var i = this.cursors.length; i--; ) { + this.cursors[i].style.opacity = 0; + } + }.bind(this), 0.6 * this.blinkInterval); + }.bind(this); + + this.intervalId = setInterval(function() { + for (var i = this.cursors.length; i--; ) { + this.cursors[i].style.opacity = ""; + } + blink(); + }.bind(this), this.blinkInterval); + + blink(); }; this.getPixelPosition = function(position, onScreen) { - if (!this.config || !this.session) { - return { - left : 0, - top : 0 - }; - } + if (!this.config || !this.session) + return {left : 0, top : 0}; if (!position) position = this.session.selection.getCursor(); @@ -132,72 +158,58 @@ var Cursor = function(parentEl) { var cursorTop = (pos.row - (onScreen ? this.config.firstRowScreen : 0)) * this.config.lineHeight; - return { - left : cursorLeft, - top : cursorTop - }; + return {left : cursorLeft, top : cursorTop}; }; this.update = function(config) { this.config = config; - if (this.session.selectionMarkerCount > 0) { - var selections = this.session.$selectionMarkers; - var i = 0, sel, cursorIndex = 0; + var selections = this.session.$selectionMarkers; + var i = 0, cursorIndex = 0; - for (var i = selections.length; i--; ) { - sel = selections[i]; - var pixelPos = this.getPixelPosition(sel.cursor, true); - if ((pixelPos.top > config.height + config.offset || - pixelPos.top < -config.offset) && i > 1) { - continue; - } + if (selections === undefined || selections.length === 0){ + selections = [{cursor: null}]; + } - var style = (this.cursors[cursorIndex++] || this.addCursor()).style; - - style.left = pixelPos.left + "px"; - style.top = pixelPos.top + "px"; - style.width = config.characterWidth + "px"; - style.height = config.lineHeight + "px"; + for (var i = selections.length; i--; ) { + var pixelPos = this.getPixelPosition(selections[i].cursor, true); + if ((pixelPos.top > config.height + config.offset || + pixelPos.top < -config.offset) && i > 1) { + continue; } - if (cursorIndex > 1) - while (this.cursors.length > cursorIndex) - this.removeCursor(); - } else { - var pixelPos = this.getPixelPosition(null, true); - var style = this.cursor.style; + + var style = (this.cursors[cursorIndex++] || this.addCursor()).style; + style.left = pixelPos.left + "px"; style.top = pixelPos.top + "px"; style.width = config.characterWidth + "px"; style.height = config.lineHeight + "px"; - - while (this.cursors.length > 1) - this.removeCursor(); } + while (this.cursors.length > cursorIndex) + this.removeCursor(); var overwrite = this.session.getOverwrite(); - if (overwrite != this.overwrite) - this.$setOverwrite(overwrite); + this.$setOverwrite(overwrite); // cache for textarea and gutter highlight this.$pixelPos = pixelPos; - this.restartTimer(); }; this.$setOverwrite = function(overwrite) { - this.overwrite = overwrite; - for (var i = this.cursors.length; i--; ) { + if (overwrite != this.overwrite) { + this.overwrite = overwrite; if (overwrite) - dom.addCssClass(this.cursors[i], "ace_overwrite"); + dom.addCssClass(this.element, "ace_overwrite-cursors"); else - dom.removeCssClass(this.cursors[i], "ace_overwrite"); + dom.removeCssClass(this.element, "ace_overwrite-cursors"); } }; this.destroy = function() { - clearInterval(this.blinkId); - } + clearInterval(this.intervalId); + clearTimeout(this.timeoutId); + }; }).call(Cursor.prototype); diff --git a/lib/ace/theme/ambiance.css b/lib/ace/theme/ambiance.css index 65a25bbd..524ad03a 100644 --- a/lib/ace/theme/ambiance.css +++ b/lib/ace/theme/ambiance.css @@ -66,7 +66,7 @@ border-left: 1px solid #7991E8; } -.ace-ambiance .ace_cursor.ace_overwrite { +.ace-ambiance .ace_overwrite-cursors .ace_cursor { border: 1px solid #FFE300; background: #766B13; } diff --git a/lib/ace/theme/chrome.css b/lib/ace/theme/chrome.css index 8e166a90..773c213c 100644 --- a/lib/ace/theme/chrome.css +++ b/lib/ace/theme/chrome.css @@ -17,7 +17,7 @@ border-left: 2px solid black; } -.ace-chrome .ace_cursor.ace_overwrite { +.ace-chrome .ace_overwrite-cursors .ace_cursor { border-left: 0px; border-bottom: 1px solid black; } diff --git a/lib/ace/theme/clouds.css b/lib/ace/theme/clouds.css index 1f64a7cd..4ff7e7c2 100644 --- a/lib/ace/theme/clouds.css +++ b/lib/ace/theme/clouds.css @@ -20,7 +20,7 @@ border-left: 2px solid #000000 } -.ace-clouds .ace_cursor.ace_overwrite { +.ace-clouds .ace_overwrite-cursors .ace_cursor { border-left: 0px; border-bottom: 1px solid #000000 } diff --git a/lib/ace/theme/clouds_midnight.css b/lib/ace/theme/clouds_midnight.css index 632dc4e5..6bc319d1 100644 --- a/lib/ace/theme/clouds_midnight.css +++ b/lib/ace/theme/clouds_midnight.css @@ -20,7 +20,7 @@ border-left: 2px solid #7DA5DC } -.ace-clouds-midnight .ace_cursor.ace_overwrite { +.ace-clouds-midnight .ace_overwrite-cursors .ace_cursor { border-left: 0px; border-bottom: 1px solid #7DA5DC } diff --git a/lib/ace/theme/cobalt.css b/lib/ace/theme/cobalt.css index 3c8d61f9..3717ba64 100644 --- a/lib/ace/theme/cobalt.css +++ b/lib/ace/theme/cobalt.css @@ -20,7 +20,7 @@ border-left: 2px solid #FFFFFF } -.ace-cobalt .ace_cursor.ace_overwrite { +.ace-cobalt .ace_overwrite-cursors .ace_cursor { border-left: 0px; border-bottom: 1px solid #FFFFFF } diff --git a/lib/ace/theme/crimson_editor.css b/lib/ace/theme/crimson_editor.css index f8032fa4..2d4a0eef 100644 --- a/lib/ace/theme/crimson_editor.css +++ b/lib/ace/theme/crimson_editor.css @@ -26,7 +26,7 @@ border-left: 2px solid black; } -.ace-crimson-editor .ace_cursor.ace_overwrite { +.ace-crimson-editor .ace_overwrite-cursors .ace_cursor { border-left: 0px; border-bottom: 1px solid black; } diff --git a/lib/ace/theme/dawn.css b/lib/ace/theme/dawn.css index fcfd5e89..ca544fea 100644 --- a/lib/ace/theme/dawn.css +++ b/lib/ace/theme/dawn.css @@ -20,7 +20,7 @@ border-left: 2px solid #000000 } -.ace-dawn .ace_cursor.ace_overwrite { +.ace-dawn .ace_overwrite-cursors .ace_cursor { border-left: 0px; border-bottom: 1px solid #000000 } diff --git a/lib/ace/theme/dreamweaver.css b/lib/ace/theme/dreamweaver.css index 04983385..30f77cbf 100644 --- a/lib/ace/theme/dreamweaver.css +++ b/lib/ace/theme/dreamweaver.css @@ -23,7 +23,7 @@ border-left: 2px solid black; } -.ace-dreamweaver .ace_cursor.ace_overwrite { +.ace-dreamweaver .ace_overwrite-cursors .ace_cursor { border-left: 0px; border-bottom: 1px solid black; } diff --git a/lib/ace/theme/github.css b/lib/ace/theme/github.css index 12ffa256..5b059727 100644 --- a/lib/ace/theme/github.css +++ b/lib/ace/theme/github.css @@ -70,7 +70,7 @@ border-left: 2px solid black; } -.ace-github .ace_cursor.ace_overwrite { +.ace-github .ace_overwrite-cursors .ace_cursor { border-left: 0px; border-bottom: 1px solid black; } diff --git a/lib/ace/theme/idle_fingers.css b/lib/ace/theme/idle_fingers.css index 1b735dff..43eff698 100644 --- a/lib/ace/theme/idle_fingers.css +++ b/lib/ace/theme/idle_fingers.css @@ -20,7 +20,7 @@ border-left: 2px solid #91FF00 } -.ace-idle-fingers .ace_cursor.ace_overwrite { +.ace-idle-fingers .ace_overwrite-cursors .ace_cursor { border-left: 0px; border-bottom: 1px solid #91FF00 } diff --git a/lib/ace/theme/kr_theme.css b/lib/ace/theme/kr_theme.css index ffefb03a..0f42c384 100644 --- a/lib/ace/theme/kr_theme.css +++ b/lib/ace/theme/kr_theme.css @@ -20,7 +20,7 @@ border-left: 2px solid #FF9900 } -.ace-kr-theme .ace_cursor.ace_overwrite { +.ace-kr-theme .ace_overwrite-cursors .ace_cursor { border-left: 0px; border-bottom: 1px solid #FF9900 } diff --git a/lib/ace/theme/merbivore.css b/lib/ace/theme/merbivore.css index a842b716..69e81376 100644 --- a/lib/ace/theme/merbivore.css +++ b/lib/ace/theme/merbivore.css @@ -20,7 +20,7 @@ border-left: 2px solid #FFFFFF } -.ace-merbivore .ace_cursor.ace_overwrite { +.ace-merbivore .ace_overwrite-cursors .ace_cursor { border-left: 0px; border-bottom: 1px solid #FFFFFF } diff --git a/lib/ace/theme/merbivore_soft.css b/lib/ace/theme/merbivore_soft.css index 7e276a89..ddd417f8 100644 --- a/lib/ace/theme/merbivore_soft.css +++ b/lib/ace/theme/merbivore_soft.css @@ -20,7 +20,7 @@ border-left: 2px solid #FFFFFF } -.ace-merbivore-soft .ace_cursor.ace_overwrite { +.ace-merbivore-soft .ace_overwrite-cursors .ace_cursor { border-left: 0px; border-bottom: 1px solid #FFFFFF } diff --git a/lib/ace/theme/mono_industrial.css b/lib/ace/theme/mono_industrial.css index b5eb68b2..f9a318fc 100644 --- a/lib/ace/theme/mono_industrial.css +++ b/lib/ace/theme/mono_industrial.css @@ -20,7 +20,7 @@ border-left: 2px solid #FFFFFF } -.ace-mono-industrial .ace_cursor.ace_overwrite { +.ace-mono-industrial .ace_overwrite-cursors .ace_cursor { border-left: 0px; border-bottom: 1px solid #FFFFFF } @@ -135,4 +135,4 @@ .ace-mono-industrial .ace_indent-guide { background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQ0tH4zzBz5sz/ABAOBECKH+evAAAAAElFTkSuQmCC) right repeat-y -} \ No newline at end of file +} diff --git a/lib/ace/theme/monokai.css b/lib/ace/theme/monokai.css index 1a34fed4..ed876c79 100644 --- a/lib/ace/theme/monokai.css +++ b/lib/ace/theme/monokai.css @@ -20,7 +20,7 @@ border-left: 2px solid #F8F8F0 } -.ace-monokai .ace_cursor.ace_overwrite { +.ace-monokai .ace_overwrite-cursors .ace_cursor { border-left: 0px; border-bottom: 1px solid #F8F8F0 } diff --git a/lib/ace/theme/pastel_on_dark.css b/lib/ace/theme/pastel_on_dark.css index 18f61d85..b517f22a 100644 --- a/lib/ace/theme/pastel_on_dark.css +++ b/lib/ace/theme/pastel_on_dark.css @@ -20,7 +20,7 @@ border-left: 2px solid #A7A7A7 } -.ace-pastel-on-dark .ace_cursor.ace_overwrite { +.ace-pastel-on-dark .ace_overwrite-cursors .ace_cursor { border-left: 0px; border-bottom: 1px solid #A7A7A7 } diff --git a/lib/ace/theme/solarized_dark.css b/lib/ace/theme/solarized_dark.css index 26b206b0..4d47fb76 100644 --- a/lib/ace/theme/solarized_dark.css +++ b/lib/ace/theme/solarized_dark.css @@ -22,7 +22,7 @@ border-left: 2px solid #D30102 } -.ace-solarized-dark .ace_cursor.ace_overwrite { +.ace-solarized-dark .ace_overwrite-cursors .ace_cursor { border-left: 0px; border-bottom: 1px solid #D30102 } diff --git a/lib/ace/theme/solarized_light.css b/lib/ace/theme/solarized_light.css index e00b9b39..65dfe8df 100644 --- a/lib/ace/theme/solarized_light.css +++ b/lib/ace/theme/solarized_light.css @@ -20,7 +20,7 @@ border-left: 2px solid #000000 } -.ace-solarized-light .ace_cursor.ace_overwrite { +.ace-solarized-light .ace_overwrite-cursors .ace_cursor { border-left: 0px; border-bottom: 1px solid #000000 } diff --git a/lib/ace/theme/textmate.css b/lib/ace/theme/textmate.css index ef0be415..538700f2 100644 --- a/lib/ace/theme/textmate.css +++ b/lib/ace/theme/textmate.css @@ -20,7 +20,7 @@ border-left: 2px solid black; } -.ace-tm .ace_cursor.ace_overwrite { +.ace-tm .ace_overwrite-cursors .ace_cursor { border-left: 0px; border-bottom: 1px solid black; } diff --git a/lib/ace/theme/tomorrow.css b/lib/ace/theme/tomorrow.css index 90c397bf..a5d88b6c 100644 --- a/lib/ace/theme/tomorrow.css +++ b/lib/ace/theme/tomorrow.css @@ -20,7 +20,7 @@ border-left: 2px solid #AEAFAD } -.ace-tomorrow .ace_cursor.ace_overwrite { +.ace-tomorrow .ace_overwrite-cursors .ace_cursor { border-left: 0px; border-bottom: 1px solid #AEAFAD } diff --git a/lib/ace/theme/tomorrow_night.css b/lib/ace/theme/tomorrow_night.css index 8a62bac2..0baaf323 100644 --- a/lib/ace/theme/tomorrow_night.css +++ b/lib/ace/theme/tomorrow_night.css @@ -20,7 +20,7 @@ border-left: 2px solid #AEAFAD } -.ace-tomorrow-night .ace_cursor.ace_overwrite { +.ace-tomorrow-night .ace_overwrite-cursors .ace_cursor { border-left: 0px; border-bottom: 1px solid #AEAFAD } diff --git a/lib/ace/theme/tomorrow_night_blue.css b/lib/ace/theme/tomorrow_night_blue.css index ca0a84fe..daebddb1 100644 --- a/lib/ace/theme/tomorrow_night_blue.css +++ b/lib/ace/theme/tomorrow_night_blue.css @@ -21,7 +21,7 @@ border-left: 2px solid #FFFFFF } -.ace-tomorrow-night-blue .ace_cursor.ace_overwrite { +.ace-tomorrow-night-blue .ace_overwrite-cursors .ace_cursor { border-left: 0px; border-bottom: 1px solid #FFFFFF } diff --git a/lib/ace/theme/tomorrow_night_bright.css b/lib/ace/theme/tomorrow_night_bright.css index 24f4469c..065e2f00 100644 --- a/lib/ace/theme/tomorrow_night_bright.css +++ b/lib/ace/theme/tomorrow_night_bright.css @@ -20,7 +20,7 @@ border-left: 2px solid #9F9F9F } -.ace-tomorrow-night-bright .ace_cursor.ace_overwrite { +.ace-tomorrow-night-bright .ace_overwrite-cursors .ace_cursor { border-left: 0px; border-bottom: 1px solid #9F9F9F } diff --git a/lib/ace/theme/tomorrow_night_eighties.css b/lib/ace/theme/tomorrow_night_eighties.css index c1695b0d..5584d62d 100644 --- a/lib/ace/theme/tomorrow_night_eighties.css +++ b/lib/ace/theme/tomorrow_night_eighties.css @@ -21,7 +21,7 @@ border-left: 2px solid #CCCCCC } -.ace-tomorrow-night-eighties .ace_cursor.ace_overwrite { +.ace-tomorrow-night-eighties .ace_overwrite-cursors .ace_cursor { border-left: 0px; border-bottom: 1px solid #CCCCCC } diff --git a/lib/ace/theme/twilight.css b/lib/ace/theme/twilight.css index 3051a3e6..3ef9de2e 100644 --- a/lib/ace/theme/twilight.css +++ b/lib/ace/theme/twilight.css @@ -20,7 +20,7 @@ border-left: 2px solid #A7A7A7 } -.ace-twilight .ace_cursor.ace_overwrite { +.ace-twilight .ace_overwrite-cursors .ace_cursor { border-left: 0px; border-bottom: 1px solid #A7A7A7 } diff --git a/lib/ace/theme/vibrant_ink.css b/lib/ace/theme/vibrant_ink.css index fdd965f1..c611681d 100644 --- a/lib/ace/theme/vibrant_ink.css +++ b/lib/ace/theme/vibrant_ink.css @@ -20,7 +20,7 @@ border-left: 2px solid #FFFFFF } -.ace-vibrant-ink .ace_cursor.ace_overwrite { +.ace-vibrant-ink .ace_overwrite-cursors .ace_cursor { border-left: 0px; border-bottom: 1px solid #FFFFFF } diff --git a/lib/ace/theme/xcode.css b/lib/ace/theme/xcode.css index 16db2006..463703b0 100644 --- a/lib/ace/theme/xcode.css +++ b/lib/ace/theme/xcode.css @@ -22,7 +22,7 @@ border-left: 2px solid #000000 } -.ace-xcode .ace_cursor.ace_overwrite { +.ace-xcode .ace_overwrite-cursors .ace_cursor { border-left: 0px; border-bottom: 1px solid #000000 } diff --git a/tool/Theme.tmpl.css b/tool/Theme.tmpl.css index 3b83c5ba..180132f2 100644 --- a/tool/Theme.tmpl.css +++ b/tool/Theme.tmpl.css @@ -22,7 +22,7 @@ border-left: 2px solid %cursor%; } -.%cssClass% .ace_cursor.ace_overwrite { +.%cssClass% .ace_overwrite-cursors .ace_cursor { border-left: 0px; border-bottom: 1px solid %overwrite%; }