Fixed checkCursorTag and checkCursorMenu not calculate doc height properly, fixed jquery-textcomplete support upSideDown

This commit is contained in:
Wu Cheng-Han 2015-09-25 13:39:08 +08:00
parent c4c9c4fed6
commit f8b029b2f4
2 changed files with 35 additions and 25 deletions

View file

@ -1353,15 +1353,19 @@ function emitUserStatus(force) {
} }
function checkCursorTag(coord, ele) { function checkCursorTag(coord, ele) {
if (!ele) return;
var curosrtagMargin = 60; var curosrtagMargin = 60;
var viewport = editor.getViewport(); var cursor = editor.getCursor();
var viewportHeight = (viewport.to - viewport.from) * editor.defaultTextHeight(); //var viewport = editor.getViewport();
//var viewportHeight = (viewport.to - viewport.from) * editor.defaultTextHeight();
var editorWidth = ui.area.codemirror.width(); var editorWidth = ui.area.codemirror.width();
var editorHeight = ui.area.codemirror.height(); var editorHeight = ui.area.codemirror.height();
var width = ele.width(); var width = ele.width();
var height = ele.height(); var height = ele.height();
if (!lineHeightMap)
buildMapInner();
var left = coord.left; var left = coord.left;
var top = coord.top; var top = lineHeightMap[cursor.line] * defaultTextHeight; //coord.top;
var offsetLeft = -3; var offsetLeft = -3;
var offsetTop = defaultTextHeight; var offsetTop = defaultTextHeight;
var statusBarHeight = 0; var statusBarHeight = 0;
@ -1371,8 +1375,8 @@ function checkCursorTag(coord, ele) {
if (left + width + offsetLeft > editorWidth - curosrtagMargin) { if (left + width + offsetLeft > editorWidth - curosrtagMargin) {
offsetLeft = -(width + 10); offsetLeft = -(width + 10);
} }
offsetTop = -(height);
if (top + height + offsetTop > Math.max(editor.doc.height, editorHeight) + curosrtagMargin - statusBarHeight * 2 && top - height > curosrtagMargin) { if (top + height + offsetTop > Math.max(editor.doc.height, editorHeight) + curosrtagMargin - statusBarHeight * 2 && top - height > curosrtagMargin) {
offsetTop = -(height + 4);
} }
} }
ele[0].style.left = offsetLeft + 'px'; ele[0].style.left = offsetLeft + 'px';
@ -1863,10 +1867,11 @@ if ($('.cursor-menu').length <= 0) {
} }
var upSideDown = false; var upSideDown = false;
var menuMargin = 60;
function checkCursorMenu() { function checkCursorMenu() {
var menuMargin = 60;
var dropdown = $('.cursor-menu .dropdown-menu'); var dropdown = $('.cursor-menu .dropdown-menu');
if (dropdown.length <= 0) return;
var cursor = editor.getCursor(); var cursor = editor.getCursor();
var scrollInfo = editor.getScrollInfo(); var scrollInfo = editor.getScrollInfo();
if (!dropdown.hasClass('other-cursor')) if (!dropdown.hasClass('other-cursor'))
@ -1877,14 +1882,16 @@ function checkCursorMenu() {
line: cursor.line, line: cursor.line,
ch: cursor.ch ch: cursor.ch
}, 'windows'); }, 'windows');
var viewport = editor.getViewport(); //var viewport = editor.getViewport();
var viewportHeight = (viewport.to - viewport.from) * editor.defaultTextHeight(); //var viewportHeight = (viewport.to - viewport.from) * editor.defaultTextHeight();
var editorWidth = ui.area.codemirror.width(); var editorWidth = ui.area.codemirror.width();
var editorHeight = ui.area.codemirror.height(); var editorHeight = ui.area.codemirror.height();
var width = dropdown.width(); var width = dropdown.outerWidth();
var height = dropdown.height(); var height = dropdown.outerHeight();
if (!lineHeightMap)
buildMapInner();
var left = coord.left; var left = coord.left;
var top = coord.top; var top = lineHeightMap[cursor.line] * defaultTextHeight; //coord.top;
var offsetLeft = 0; var offsetLeft = 0;
var offsetTop = defaultTextHeight; var offsetTop = defaultTextHeight;
var statusBarHeight = 0; var statusBarHeight = 0;
@ -1892,9 +1899,15 @@ function checkCursorMenu() {
statusBarHeight = statusBar.outerHeight(); statusBarHeight = statusBar.outerHeight();
if (left + width + offsetLeft > editorWidth - menuMargin) if (left + width + offsetLeft > editorWidth - menuMargin)
offsetLeft = -(left + width - editorWidth + menuMargin); offsetLeft = -(left + width - editorWidth + menuMargin);
offsetTop = -(height + defaultTextHeight);
if (top + height + offsetTop > Math.max(editor.doc.height, editorHeight) + menuMargin - statusBarHeight * 2 && top - height > menuMargin) { if (top + height + offsetTop > Math.max(editor.doc.height, editorHeight) + menuMargin - statusBarHeight * 2 && top - height > menuMargin) {
offsetTop = -(height + 4);
upSideDown = true; upSideDown = true;
var items = dropdown.find('.textcomplete-item');
items.sort(function (a, b) {
return $(b).attr('data-index') - $(a).attr('data-index');
});
dropdown.html(items);
dropdown.scrollTop(dropdown[0].scrollHeight);
} else { } else {
upSideDown = false; upSideDown = false;
} }

View file

@ -554,10 +554,16 @@ if (typeof jQuery === 'undefined') {
if (!this.shown) { return; } if (!this.shown) { return; }
if (this.isUp(e)) { if (this.isUp(e)) {
e.preventDefault(); e.preventDefault();
this._up(); if(typeof upSideDown != 'undefined' && upSideDown)
this._down();
else
this._up();
} else if (this.isDown(e)) { } else if (this.isDown(e)) {
e.preventDefault(); e.preventDefault();
this._down(); if(typeof upSideDown != 'undefined' && upSideDown)
this._up();
else
this._down();
} else if (this.isEnter(e)) { } else if (this.isEnter(e)) {
e.preventDefault(); e.preventDefault();
this._enter(); this._enter();
@ -633,7 +639,7 @@ if (typeof jQuery === 'undefined') {
}, },
_getActiveElement: function () { _getActiveElement: function () {
return this.$el.children('.textcomplete-item:nth(' + this._index + ')'); return this.$el.children('.textcomplete-item[data-index=' + this._index + ']');
}, },
_setScroll: function () { _setScroll: function () {
@ -661,20 +667,11 @@ if (typeof jQuery === 'undefined') {
this.data.push(datum); this.data.push(datum);
item.push(datum.strategy.template(datum.value)); item.push(datum.strategy.template(datum.value));
} }
if(typeof upSideDown != 'undefined' && upSideDown) { for (i = 0; i < item.length; i++) {
for (i = item.length - 1; i >= 0; i--) {
html += '<li class="textcomplete-item" data-index="' + i + '"><a>';
html += item[i];
html += '</a></li>';
}
this._index = this.data.length - 1;
} else {
for (i = 0; i < item.length; i++) {
html += '<li class="textcomplete-item" data-index="' + i + '"><a>'; html += '<li class="textcomplete-item" data-index="' + i + '"><a>';
html += item[i]; html += item[i];
html += '</a></li>'; html += '</a></li>';
} }
}
return html; return html;
}, },