Commit 9d1b20e3 authored by Alexander.Trofimov's avatar Alexander.Trofimov Committed by Alexander.Trofimov

Добавил autoComplete для текстовых данных. Ограничение 20000 строк на поиск.

git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@55335 954022d7-b5bf-4e40-9824-e11837661b57
parent 23144a1a
......@@ -707,6 +707,13 @@
return (valTrim - 0) == valTrim && valTrim.length > 0;
}
function arrayToLowerCase(array) {
var result = [];
for (var i = 0, length = array.length; i < length; ++i)
result.push(array[i].toLowerCase());
return result;
}
//-----------------------------------------------------------------
// События движения мыши
//-----------------------------------------------------------------
......@@ -1257,6 +1264,7 @@
window["Asc"].isNumber = isNumber;
window["Asc"].trim = trim;
window["Asc"].extendClass = extendClass;
window["Asc"].arrayToLowerCase = arrayToLowerCase;
window["Asc"].Range = Range;
window["Asc"].ActiveRange = ActiveRange;
......
......@@ -86,6 +86,7 @@
this.input = input;
this.handlers = new asc_HL(handlers);
this.settings = $.extend(true, {}, this.defaults, settings);
this.options = {};
//---declaration---
this.canvasOuter = undefined;
......@@ -137,6 +138,8 @@
// Автоподстановка формул. Цвет селекта
this.formulaSelectorColor = "rgba(105, 119, 62, 0.2)";
this.objAutoComplete = {};
this._init();
return this;
......@@ -306,6 +309,9 @@
// hide
t.canvasOuterStyle.display = "none";
// delete autoComplete
this.objAutoComplete = {};
t.handlers.trigger("closed");
return true;
},
......@@ -1596,55 +1602,20 @@
this.handlers.trigger("applyCloseEvent", event);
},
_getAutoString: function(str) {
var _this = this;
var api = asc["editor"];
if ( api.wb ) {
var ws = api.wb.getWorksheet();
if ( ws ) {
var editedCol = ws.getSelectedColumnIndex();
var editedRow = ws.getSelectedRowIndex();
var isNumber = function(n) {
return !isNaN(parseFloat(n)) && isFinite(n);
}
var findAutoString = function (col, row) {
var oString = null;
var _start = (_this.selectionBegin >= 0) ? _this.selectionBegin : _this.input.value.length;
var fixedText = _this.input.value.substring(0, _start);
var cellText = fixedText + str;
if ( !isNumber(cellText) ) {
var cellAddress = new CellAddress(row, col, 0);
var topCellText = ws.model.getCell(cellAddress).getValueWithFormat();
var start = topCellText.indexOf(cellText);
if ( topCellText && (start == 0) ) {
oString = {};
oString.text = topCellText.substring(fixedText.length, topCellText.length);
oString.selectionBegin = fixedText.length + 1;
oString.selectionEnd = topCellText.length;
}
}
return oString;
}
var oAutoStringTop = null;
var oAutoStringBottom = null;
// Check top cell
if ( editedRow - 1 >= 0 )
oAutoStringTop = findAutoString(editedCol, editedRow - 1);
// Check bottom cell
if ( ws.rows[editedRow + 1] && (editedRow + 1 >= 0) )
oAutoStringBottom = findAutoString(editedCol, editedRow + 1);
if ( oAutoStringTop && !oAutoStringBottom )
return oAutoStringTop;
if ( !oAutoStringTop && oAutoStringBottom )
return oAutoStringBottom;
}
_getAutoComplete: function(str) {
// ToDo можно ускорить делая поиск каждый раз не в большом массиве, а в уменбшенном (по предыдущим символам)
var oLastResult = this.objAutoComplete[str];
if (oLastResult)
return oLastResult;
var arrAutoComplete = this.options.autoComplete;
var arrAutoCompleteLC = this.options.autoCompleteLC;
var i, length, arrResult = [];
for (i = 0, length = arrAutoCompleteLC.length; i < length; ++i) {
if (0 === arrAutoCompleteLC[i].indexOf(str))
arrResult.push(arrAutoComplete[i]);
}
return null;
return this.objAutoComplete[str] = arrResult;
},
_getFormulaList: function(str) {
......@@ -2152,21 +2123,35 @@
//t.setFocus(true);
t.isUpdateValue = false;
t._removeFormulaSelector();
var oAutoString = t._getAutoString(String.fromCharCode(event.which));
var oFormulaList = t._getFormulaList(String.fromCharCode(event.which));
if (oFormulaList) {
t._showFormulaSelector(oFormulaList);
t._addChars(String.fromCharCode(event.which));
if (t.textRender.getEndOfText() === t.cursorPos && !t.isFormula()) {
var s = t._getFragmentsText(t.options.fragments);
var arrAutoComplete = t._getAutoComplete(s.toLowerCase());
var lengthInput = s.length;
if (1 === arrAutoComplete.length) {
var newValue = arrAutoComplete[0];
var tmpCursorPos = t.cursorPos;
t._addChars(newValue.substring(lengthInput));
t.selectionBegin = tmpCursorPos;
t._selectChars(kEndOfText);
}
}
if ( oAutoString ) {
//t._removeFormulaSelector();
//var oFormulaList = t._getFormulaList(oNewChar);
//if (oFormulaList) {
// t._showFormulaSelector(oFormulaList);
//}
/*if ( oAutoString ) {
t._addChars(oAutoString.text);
t.selectionBegin = oAutoString.selectionBegin;
t.selectionEnd = oAutoString.selectionEnd;
t._drawSelection();
}
else
t._addChars(String.fromCharCode(event.which));
t._addChars(String.fromCharCode(event.which));*/
return t.isTopLineActive ? true : false; // prevent event bubbling
},
......
......@@ -786,13 +786,7 @@
WorkbookView.prototype._onShowAutoComplete = function () {
var ws = this.getWorksheet();
var arrValues = [], objValues = {};
var range = ws.findCellAutoComplete(ws.activeRange.startCol, ws.activeRange.startRow, 1);
ws.getColValues(range, ws.activeRange.startCol, arrValues, objValues);
range = ws.findCellAutoComplete(ws.activeRange.startCol, ws.activeRange.startRow, -1);
ws.getColValues(range, ws.activeRange.startCol, arrValues, objValues);
arrValues.sort();
var arrValues = ws.getCellAutoCompleteValues(ws.activeRange.startCol, ws.activeRange.startRow);
console.log(arrValues);
};
......
......@@ -159,6 +159,8 @@
var kNewLine = "\n";
var kMaxAutoCompleteCellEdit = 20000;
function calcDecades(num) {
return Math.abs(num) < 10 ? 1 : 1 + calcDecades( asc_floor(num * 0.1) );
}
......@@ -9927,18 +9929,26 @@
/*isCoord*/false, /*isSelectMode*/false);
};
/**
* Ищет дополнение для ячейки (снизу или сверху)
* @param col
* @param row
* @param step
* @returns {asc_Range}
*/
WorksheetView.prototype.findCellAutoComplete = function (col, row, step) {
/* Ищет дополнение для ячейки */
WorksheetView.prototype.getCellAutoCompleteValues = function (col, row, maxCount) {
var arrValues = [], objValues = {};
var range = this.findCellAutoComplete(col, row, 1, maxCount);
this.getColValues(range, col, arrValues, objValues);
range = this.findCellAutoComplete(col, row, -1, maxCount);
this.getColValues(range, col, arrValues, objValues);
arrValues.sort();
return arrValues;
};
/* Ищет дополнение для ячейки (снизу или сверху) */
WorksheetView.prototype.findCellAutoComplete = function (col, row, step, maxCount) {
row += step;
var cell, end = 0 < step ? this.model.getRowsCount() - 1: 0, isEnd = true,
if (!maxCount)
maxCount = Number.MAX_VALUE;
var count = 0, cell, end = 0 < step ? this.model.getRowsCount() - 1: 0, isEnd = true,
colsCount = this.model.getColsCount(), range = new asc_Range(col, row, col, row);
for (; row * step <= end; row += step, isEnd = true) {
for (; row * step <= end && count < maxCount; row += step, isEnd = true, ++count) {
for (col = range.c1; col <= range.c2; ++col) {
cell = this.model._getCellNoEmpty(row, col);
if (cell && false === cell.isEmptyText()) {
......@@ -9973,13 +9983,7 @@
return range.r1 <= range.r2 ? range : null;
};
/**
* Формирует уникальный массив
* @param range
* @param col
* @param arrValues
* @param objValues
*/
/* Формирует уникальный массив */
WorksheetView.prototype.getColValues = function (range, col, arrValues, objValues) {
if (null === range)
return;
......@@ -10271,6 +10275,9 @@
fragments.push(_fragmentsTmp[i].clone());
}
var arrAutoComplete = this.getCellAutoCompleteValues(col, row, kMaxAutoCompleteCellEdit);
var arrAutoCompleteLC = asc.arrayToLowerCase(arrAutoComplete);
editor.open({
cellX: t.cellsLeft + tc[!isMerged ? col : mc.c1].left - tc[vr.c1].left + offsetX,
cellY: t.cellsTop + tr[!isMerged ? row : mc.r1].top - tr[vr.r1].top + offsetY,
......@@ -10287,6 +10294,8 @@
focus: isFocus,
isClearCell: isClearCell,
isHideCursor: isHideCursor,
autoComplete: arrAutoComplete,
autoCompleteLC: arrAutoCompleteLC,
saveValueCallback: function (val, flags, skipNLCheck) {
var oCellEdit = isMerged ? new asc_Range(mc.c1, mc.r1, mc.c1, mc.r1) : new asc_Range(col, row, col, row);
return t._saveCellValueAfterEdit(oCellEdit, c, val, flags, skipNLCheck, /*isNotHistory*/false);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment