Merge branch 'cursors' into master

TODO, needs cleanup
This commit is contained in:
nightwing 2012-10-26 21:03:00 +04:00
commit 1d7d636bff
31 changed files with 126 additions and 102 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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%;
}