Skip to content

Commit

Permalink
[se] Fix bug 48054
Browse files Browse the repository at this point in the history
  • Loading branch information
GoshaZotov committed Feb 11, 2025
1 parent 5c3ecc4 commit 88814cd
Showing 1 changed file with 34 additions and 36 deletions.
70 changes: 34 additions & 36 deletions cell/view/CellEditorView.js
Original file line number Diff line number Diff line change
Expand Up @@ -1017,20 +1017,20 @@ function (window, undefined) {
};

CellEditor.prototype._findRangeUnderCursor = function () {
var ranges, t = this, s = t.textRender.getChars(0, t.textRender.getCharsCount()), range, a;
// Get character string
let s = this.textRender.getChars(0, this.textRender.getCharsCount());
s = AscCommonExcel.convertUnicodeToSimpleString(s);
var arrFR = this.handlers.trigger("getFormulaRanges");
let arrFR = this.handlers.trigger("getFormulaRanges");

// Check cached formula ranges first
if (arrFR) {
ranges = arrFR.ranges;
/*так как у нас уже есть некий массив с рейнджами, которые в формуле, то пробегаемся по ним и смотрим,
* находится ли курсор в позиции над этим диапазоном, дабы не парсить всю формулу заново
* необходимо чтобы парсить случаи когда используется что-то такое sumnas2:K2 - sumnas2 невалидная ссылка.
* */
for (var i = 0, l = ranges.length; i < l; ++i) {
a = ranges[i];
if (t.cursorPos >= a.cursorePos && t.cursorPos <= a.cursorePos + a.formulaRangeLength) {
range = a.clone(true);
let ranges = arrFR.ranges;
// Check if cursor is over any existing ranges before re-parsing formula
// Needed for cases like sumnas2:K2 where sumnas2 is invalid reference
for (let i = 0, l = ranges.length; i < l; ++i) {
let a = ranges[i];
if (this.cursorPos >= a.cursorePos && this.cursorPos <= a.cursorePos + a.formulaRangeLength) {
let range = a.clone(true);
range.isName = a.isName;
range.formulaRangeLength = a.formulaRangeLength;
range.cursorePos = a.cursorePos;
Expand All @@ -1039,33 +1039,35 @@ function (window, undefined) {
}
}

/*не нашли диапазонов под курсором, парсим формулу*/
var r, offset, _e, _s, wsName = null, ret = false, refStr, isName = false, _sColorPos, localStrObj;
var ws = this.handlers.trigger("getActiveWS");
// No ranges found under cursor, parse formula
let r, offset, _e, _s, wsName = null, ret = false, refStr, isName = false;
let _sColorPos, localStrObj;
let ws = this.handlers.trigger("getActiveWS");

var bbox = this.options.bbox;
let bbox = this.options.bbox;
this._parseResult = new AscCommonExcel.ParseResult([], []);
var cellWithFormula = new window['AscCommonExcel'].CCellWithFormula(ws, bbox.r1, bbox.c1);
let cellWithFormula = new window['AscCommonExcel'].CCellWithFormula(ws, bbox.r1, bbox.c1);
this._formula = new AscCommonExcel.parserFormula(s.substr(1), cellWithFormula, ws);
this._formula.parse(true, true, this._parseResult, bbox);

let range;
if (this._parseResult.refPos && this._parseResult.refPos.length > 0) {
for (var index = 0; index < this._parseResult.refPos.length; index++) {
for (let index = 0; index < this._parseResult.refPos.length; index++) {
wsName = null;
r = this._parseResult.refPos[index];

offset = r.end;
_e = r.end;
_e = r.end;
_sColorPos = _s = r.start;

switch (r.oper.type) {
case cElementType.cell : {
case cElementType.cell: {
wsName = ws.getName();
refStr = r.oper.toLocaleString();
ret = true;
break;
}
case cElementType.cell3D : {
case cElementType.cell3D: {
localStrObj = r.oper.toLocaleStringObj();
refStr = localStrObj[1];
ret = true;
Expand All @@ -1074,13 +1076,13 @@ function (window, undefined) {
_sColorPos = _e - localStrObj[0].length;
break;
}
case cElementType.cellsRange : {
case cElementType.cellsRange: {
wsName = ws.getName();
refStr = r.oper.toLocaleString();
ret = true;
break;
}
case cElementType.cellsRange3D : {
case cElementType.cellsRange3D: {
if (!r.oper.isSingleSheet()) {
continue;
}
Expand All @@ -1091,22 +1093,21 @@ function (window, undefined) {
_s = _e - localStrObj[1].length + 1;
break;
}
case cElementType.table :
case cElementType.name :
case cElementType.name3D : {
var nameRef = r.oper.toRef(bbox);
case cElementType.table:
case cElementType.name:
case cElementType.name3D: {
let nameRef = r.oper.toRef(bbox);
if (nameRef instanceof AscCommonExcel.cError) {
continue;
}
switch (nameRef.type) {

case cElementType.cellsRange3D : {
case cElementType.cellsRange3D: {
if (!nameRef.isSingleSheet()) {
continue;
}
}
case cElementType.cellsRange :
case cElementType.cell3D : {
case cElementType.cellsRange:
case cElementType.cell3D: {
ret = true;
localStrObj = nameRef.toLocaleStringObj();
refStr = localStrObj[1];
Expand All @@ -1118,16 +1119,13 @@ function (window, undefined) {
isName = true;
break;
}
default :
default:
continue;
}

if (ret && t.cursorPos > _s && t.cursorPos <= _s + refStr.length) {
range = t._parseRangeStr(refStr);
if (ret && this.cursorPos > _s && this.cursorPos <= _s + refStr.length) {
range = this._parseRangeStr(refStr);
if (range) {
if (ws.getName() !== wsName) {
return {range: null};
}
range.isName = isName;
range.formulaRangeLength = refStr.length;
range.cursorePos = _s;
Expand Down

0 comments on commit 88814cd

Please sign in to comment.