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 @@ ...@@ -707,6 +707,13 @@
return (valTrim - 0) == valTrim && valTrim.length > 0; 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 @@ ...@@ -1257,6 +1264,7 @@
window["Asc"].isNumber = isNumber; window["Asc"].isNumber = isNumber;
window["Asc"].trim = trim; window["Asc"].trim = trim;
window["Asc"].extendClass = extendClass; window["Asc"].extendClass = extendClass;
window["Asc"].arrayToLowerCase = arrayToLowerCase;
window["Asc"].Range = Range; window["Asc"].Range = Range;
window["Asc"].ActiveRange = ActiveRange; window["Asc"].ActiveRange = ActiveRange;
......
...@@ -86,6 +86,7 @@ ...@@ -86,6 +86,7 @@
this.input = input; this.input = input;
this.handlers = new asc_HL(handlers); this.handlers = new asc_HL(handlers);
this.settings = $.extend(true, {}, this.defaults, settings); this.settings = $.extend(true, {}, this.defaults, settings);
this.options = {};
//---declaration--- //---declaration---
this.canvasOuter = undefined; this.canvasOuter = undefined;
...@@ -137,6 +138,8 @@ ...@@ -137,6 +138,8 @@
// Автоподстановка формул. Цвет селекта // Автоподстановка формул. Цвет селекта
this.formulaSelectorColor = "rgba(105, 119, 62, 0.2)"; this.formulaSelectorColor = "rgba(105, 119, 62, 0.2)";
this.objAutoComplete = {};
this._init(); this._init();
return this; return this;
...@@ -306,6 +309,9 @@ ...@@ -306,6 +309,9 @@
// hide // hide
t.canvasOuterStyle.display = "none"; t.canvasOuterStyle.display = "none";
// delete autoComplete
this.objAutoComplete = {};
t.handlers.trigger("closed"); t.handlers.trigger("closed");
return true; return true;
}, },
...@@ -1596,55 +1602,20 @@ ...@@ -1596,55 +1602,20 @@
this.handlers.trigger("applyCloseEvent", event); this.handlers.trigger("applyCloseEvent", event);
}, },
_getAutoString: function(str) { _getAutoComplete: function(str) {
var _this = this; // ToDo можно ускорить делая поиск каждый раз не в большом массиве, а в уменбшенном (по предыдущим символам)
var api = asc["editor"]; var oLastResult = this.objAutoComplete[str];
if ( api.wb ) { if (oLastResult)
var ws = api.wb.getWorksheet(); return oLastResult;
if ( ws ) {
var editedCol = ws.getSelectedColumnIndex(); var arrAutoComplete = this.options.autoComplete;
var editedRow = ws.getSelectedRowIndex(); var arrAutoCompleteLC = this.options.autoCompleteLC;
var i, length, arrResult = [];
var isNumber = function(n) { for (i = 0, length = arrAutoCompleteLC.length; i < length; ++i) {
return !isNaN(parseFloat(n)) && isFinite(n); if (0 === arrAutoCompleteLC[i].indexOf(str))
} arrResult.push(arrAutoComplete[i]);
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;
}
} }
return null; return this.objAutoComplete[str] = arrResult;
}, },
_getFormulaList: function(str) { _getFormulaList: function(str) {
...@@ -2152,21 +2123,35 @@ ...@@ -2152,21 +2123,35 @@
//t.setFocus(true); //t.setFocus(true);
t.isUpdateValue = false; t.isUpdateValue = false;
t._removeFormulaSelector();
var oAutoString = t._getAutoString(String.fromCharCode(event.which)); t._addChars(String.fromCharCode(event.which));
var oFormulaList = t._getFormulaList(String.fromCharCode(event.which)); if (t.textRender.getEndOfText() === t.cursorPos && !t.isFormula()) {
var s = t._getFragmentsText(t.options.fragments);
if (oFormulaList) { var arrAutoComplete = t._getAutoComplete(s.toLowerCase());
t._showFormulaSelector(oFormulaList); 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._addChars(oAutoString.text);
t.selectionBegin = oAutoString.selectionBegin; t.selectionBegin = oAutoString.selectionBegin;
t.selectionEnd = oAutoString.selectionEnd; t.selectionEnd = oAutoString.selectionEnd;
t._drawSelection(); t._drawSelection();
} }
else else
t._addChars(String.fromCharCode(event.which)); t._addChars(String.fromCharCode(event.which));*/
return t.isTopLineActive ? true : false; // prevent event bubbling return t.isTopLineActive ? true : false; // prevent event bubbling
}, },
......
...@@ -786,13 +786,7 @@ ...@@ -786,13 +786,7 @@
WorkbookView.prototype._onShowAutoComplete = function () { WorkbookView.prototype._onShowAutoComplete = function () {
var ws = this.getWorksheet(); var ws = this.getWorksheet();
var arrValues = [], objValues = {}; var arrValues = ws.getCellAutoCompleteValues(ws.activeRange.startCol, ws.activeRange.startRow);
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();
console.log(arrValues); console.log(arrValues);
}; };
......
...@@ -159,6 +159,8 @@ ...@@ -159,6 +159,8 @@
var kNewLine = "\n"; var kNewLine = "\n";
var kMaxAutoCompleteCellEdit = 20000;
function calcDecades(num) { function calcDecades(num) {
return Math.abs(num) < 10 ? 1 : 1 + calcDecades( asc_floor(num * 0.1) ); return Math.abs(num) < 10 ? 1 : 1 + calcDecades( asc_floor(num * 0.1) );
} }
...@@ -9927,18 +9929,26 @@ ...@@ -9927,18 +9929,26 @@
/*isCoord*/false, /*isSelectMode*/false); /*isCoord*/false, /*isSelectMode*/false);
}; };
/** /* Ищет дополнение для ячейки */
* Ищет дополнение для ячейки (снизу или сверху) WorksheetView.prototype.getCellAutoCompleteValues = function (col, row, maxCount) {
* @param col var arrValues = [], objValues = {};
* @param row var range = this.findCellAutoComplete(col, row, 1, maxCount);
* @param step this.getColValues(range, col, arrValues, objValues);
* @returns {asc_Range} range = this.findCellAutoComplete(col, row, -1, maxCount);
*/ this.getColValues(range, col, arrValues, objValues);
WorksheetView.prototype.findCellAutoComplete = function (col, row, step) {
arrValues.sort();
return arrValues;
};
/* Ищет дополнение для ячейки (снизу или сверху) */
WorksheetView.prototype.findCellAutoComplete = function (col, row, step, maxCount) {
row += step; 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); 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) { for (col = range.c1; col <= range.c2; ++col) {
cell = this.model._getCellNoEmpty(row, col); cell = this.model._getCellNoEmpty(row, col);
if (cell && false === cell.isEmptyText()) { if (cell && false === cell.isEmptyText()) {
...@@ -9973,13 +9983,7 @@ ...@@ -9973,13 +9983,7 @@
return range.r1 <= range.r2 ? range : null; return range.r1 <= range.r2 ? range : null;
}; };
/** /* Формирует уникальный массив */
* Формирует уникальный массив
* @param range
* @param col
* @param arrValues
* @param objValues
*/
WorksheetView.prototype.getColValues = function (range, col, arrValues, objValues) { WorksheetView.prototype.getColValues = function (range, col, arrValues, objValues) {
if (null === range) if (null === range)
return; return;
...@@ -10271,6 +10275,9 @@ ...@@ -10271,6 +10275,9 @@
fragments.push(_fragmentsTmp[i].clone()); fragments.push(_fragmentsTmp[i].clone());
} }
var arrAutoComplete = this.getCellAutoCompleteValues(col, row, kMaxAutoCompleteCellEdit);
var arrAutoCompleteLC = asc.arrayToLowerCase(arrAutoComplete);
editor.open({ editor.open({
cellX: t.cellsLeft + tc[!isMerged ? col : mc.c1].left - tc[vr.c1].left + offsetX, 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, cellY: t.cellsTop + tr[!isMerged ? row : mc.r1].top - tr[vr.r1].top + offsetY,
...@@ -10287,6 +10294,8 @@ ...@@ -10287,6 +10294,8 @@
focus: isFocus, focus: isFocus,
isClearCell: isClearCell, isClearCell: isClearCell,
isHideCursor: isHideCursor, isHideCursor: isHideCursor,
autoComplete: arrAutoComplete,
autoCompleteLC: arrAutoCompleteLC,
saveValueCallback: function (val, flags, skipNLCheck) { 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); 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); 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