Commit 5da40db3 authored by konovalovsergey's avatar konovalovsergey

bug move sheet, defNamee bugs, test RangeTree

parent a0f1c6ca
......@@ -342,4 +342,122 @@ $(function () {
l3.trigger("onEvent1", "trigger event with all handlers removed by 'remove()'"); //-
});
test("RangeTree", function test_HandlersList() {
function getRandomArbitary(min, max)
{
return Math.round(Math.random() * (max - min) + min);
}
function getCellIndex(row, col) {
return row * AscCommon.gc_nMaxCol + col;
}
function testCells(cells, tree, standart)
{
var starndartRes = {};
var treeCells = {};
for(var i = 0; i < cells.length; ++i){
var cell = cells[i];
treeCells[cell.index] = cell.index;
for(var id in standart){
var data = standart[id];
if(data.bbox.contains(cell.col, cell.row)){
starndartRes[data.id] = data;
}
}
}
var starndartResArr = [];
for(var i in starndartRes){
starndartResArr.push(starndartRes[i].id);
}
var treeRes = [];
var areas = tree.getByCells(treeCells);
for(var i = 0 ; i < areas.length; ++i){
treeRes.push(areas[i].data.id);
}
tree.getByCellsEnd(areas);
treeRes.sort();
starndartResArr.sort();
var res = JSON.stringify(starndartResArr)==JSON.stringify(treeRes);
return res;
}
function test(row, col, tree, standart)
{
var cells = [];
var cellsCount = 10;
while (cellsCount-- > 0) {
var r1 = getRandomArbitary(0, row);
var c1 = getRandomArbitary(0, col);
cells.push({row: r1, col: c1, index: getCellIndex(r1, c1)});
}
return testCells(cells, tree, standart);
}
var bboxCount = 1000;
var colMax = 100;
var rowMax = 100;
var tree = new AscCommonExcel.RangeTree();
var standard = {};
var count = 0;
for(var i = 0 ; i < bboxCount; ++i){
var r1 = getRandomArbitary(0, rowMax);
var r2 = getRandomArbitary(0, rowMax);
var c1 = getRandomArbitary(0, colMax);
var c2 = getRandomArbitary(0, colMax);
var bbox = new Asc.Range(c1, c2, r1, r2, true);
var name = bbox.getName();
if (!standard[name]) {
var data = {bbox: bbox, id: i};
standard[name] = data;
tree.add(bbox, data);
var res = test(rowMax, colMax, tree, standard);
count += res ? 0 : 1;
}
}
strictEqual(count, 0, "RangeTree missmatch");
count = 0;
for(var i in standard){
var data = standard[i];
delete standard[i];
tree.remove(data.bbox, data);
var res = test(rowMax, colMax, tree, standard);
count += res ? 0 : 1;
}
strictEqual(count, 0, "RangeTree no empty");
});
test("DependencyGraph.startListeningRange", function test_HandlersList() {
function getRandomArbitary(min, max)
{
return Math.round(Math.random() * (max - min) + min);
}
var bboxCount = 100;
var colMax = 100;
var rowMax = 100;
var sheetId = 0;
var graph = new AscCommonExcel.DependencyGraph(null);
var standard = {};
for(var i = 0 ; i < bboxCount; ++i){
var r1 = getRandomArbitary(0, rowMax);
var r2 = getRandomArbitary(0, rowMax);
var c1 = getRandomArbitary(0, colMax);
var c2 = getRandomArbitary(0, colMax);
var bbox = new Asc.Range(c1, c2, r1, r2, true);
var listener = {bbox: bbox, getListenerId: function(){return i;}};
standard[listener.getListenerId()] = listener;
graph.startListeningRange(sheetId, bbox, listener);
}
for(var i in standard){
var data = standard[i];
delete standard[i];
graph.endListeningRange(sheetId, data.bbox, data);
}
var res = "";
var sheetContainer = graph.sheetListeners[sheetId];
for(var i in sheetContainer.cellMap){
res += i;
}
for(var i in sheetContainer.areaMap){
res += i;
}
strictEqual(res, "", "DependencyGraph no empty");
});
});
......@@ -1904,7 +1904,7 @@ var editor;
if (1 === d) {
where -= 1;
}
History.Create_NewPoint();
this.wb.replaceWorksheet(i, where);
this.wbModel.replaceWorksheet(i, where);
......
......@@ -1216,13 +1216,17 @@ cArea3D.prototype.getRange = function () {
return (null == _val[0]) ? new cEmpty() : _val[0];
};
cArea3D.prototype.changeSheet = function (lastName, newName) {
if (this.wsFrom === this._wb.getWorksheetByName(lastName).getId() &&
this.wsTo === this._wb.getWorksheetByName(lastName).getId()) {
this.wsFrom = this.wsTo = this._wb.getWorksheetByName(newName).getId();
} else if (this.wsFrom === this._wb.getWorksheetByName(lastName).getId()) {
this.wsFrom = this._wb.getWorksheetByName(newName).getId();
} else if (this.wsTo === this._wb.getWorksheetByName(lastName).getId()) {
this.wsTo = this._wb.getWorksheetByName(newName).getId();
var wsLast = this._wb.getWorksheetByName(lastName);
var wsNew = this._wb.getWorksheetByName(newName);
if(wsLast && wsNew){
var sheetIdLast = wsLast.getId();
var sheetIdNew = wsNew.getId();
if(this.wsFrom === sheetIdLast){
this.wsFrom = sheetIdNew;
}
if(this.wsTo === sheetIdLast){
this.wsTo = sheetIdNew;
}
}
};
cArea3D.prototype.toString = function () {
......@@ -3766,6 +3770,7 @@ function parserFormula( formula, parent, _ws ) {
AscCommon.c_oNotifyType.Delete === data.type) {
this.shiftCells(data.type, data.sheetId, data.bbox, data.offset);
eventData.assembleType = AscCommon.c_oNotifyParentAssemble.Flag;
eventData.isRebuild = false;
} else if (AscCommon.c_oNotifyType.ChangeDefName === data.type) {
if (data.from.Name != data.to.Name) {
this.changeDefName(data.from, data.to);
......@@ -3777,16 +3782,28 @@ function parserFormula( formula, parent, _ws ) {
eventData.assembleType = AscCommon.c_oNotifyParentAssemble.Normal;
eventData.isRebuild = true;
} else if (AscCommon.c_oNotifyType.ChangeSheet === data.type) {
eventData.assembleType = AscCommon.c_oNotifyParentAssemble.Current;
if (this.is3D) {
var changeData = data.data;
if (changeData.insert) {
this.insertSheet(changeData.insert);
} else if (changeData.replace) {
this.moveSheet(changeData.replace);
eventData.isRebuild = this.insertSheet(changeData.insert);
} else if (changeData.replace || changeData.remove) {
eventData.isRebuild = true;
var moveSheetRes = 0;
if (changeData.replace) {
moveSheetRes = this.moveSheet(changeData.replace);
} else {
moveSheetRes = this.removeSheet(changeData.remove);
}
if (2 === moveSheetRes) {
eventData.assembleType = AscCommon.c_oNotifyParentAssemble.Normal;
} else if (1 !== moveSheetRes) {
eventData.isRebuild = false;
}
} else if (changeData.rename) {
this.renameSheet(changeData.rename.from, changeData.rename.to);
} else if (changeData.remove) {
this.removeSheet(changeData.remove);
eventData.assembleType = AscCommon.c_oNotifyParentAssemble.Normal;
eventData.isRebuild = false;
}
}
}
......@@ -4940,20 +4957,17 @@ parserFormula.prototype.getRef = function() {
};
parserFormula.prototype.renameSheet = function(lastName, newName) {
for (var i = 0; i < this.outStack.length; i++) {
if (cElementType.cell3D == this.outStack[i].type) {
this.outStack[i].changeSheet(lastName, newName);
}
if (cElementType.cellsRange3D == this.outStack[i].type) {
this.outStack[i].changeSheet(lastName, newName);
var elem = this.outStack[i];
if (cElementType.cell3D === elem.type || cElementType.cellsRange3D === elem.type) {
elem.changeSheet(lastName, newName);
}
}
this.Formula = this.assemble();
return this;
};
parserFormula.prototype.removeSheet = function(sheetId) {
var nRes = 0;
var ws = this.wb.getWorksheetById(sheetId);
if (ws) {
var isChanged = false;
var wsIndex = ws.getIndex();
var wsPrev = null;
if (wsIndex > 0) {
......@@ -4965,29 +4979,38 @@ parserFormula.prototype.getRef = function() {
}
for (var i = 0; i < this.outStack.length; i++) {
var elem = this.outStack[i];
if (elem instanceof cArea3D) {
if (cElementType.cellsRange3D === elem.type) {
var wsTo = this.wb.getWorksheetById(elem.wsTo);
var wsToIndex = wsTo.getIndex();
var wsFrom = this.wb.getWorksheetById(elem.wsFrom);
var wsFromIndex = wsFrom.getIndex();
if (wsFromIndex <= wsIndex && wsIndex <= wsToIndex && 0 == nRes) {
nRes = 1;
}
if (elem.wsFrom == sheetId) {
if (elem.wsTo != sheetId && null != wsNext) {
this.outStack[i].changeSheet(ws.getName(), wsNext.getName());
elem.changeSheet(ws.getName(), wsNext.getName());
} else {
this.outStack[i] = new cError(cErrorType.bad_reference);
}
nRes = 2;
} else if (elem.wsTo == sheetId) {
if (null != wsPrev) {
elem.changeSheet(ws.getName(), wsPrev.getName());
} else {
this.outStack[i] = new cError(cErrorType.bad_reference);
}
isChanged = true;
} else if (elem.wsTo == sheetId && null != wsPrev) {
this.outStack[i].changeSheet(ws.getName(), wsPrev.getName());
isChanged = true;
nRes = 2;
}
} else if (elem instanceof cRef3D) {
} else if (cElementType.cell3D === elem.type) {
if (elem.ws.getId() == sheetId) {
this.outStack[i] = new cError(cErrorType.bad_reference);
isChanged = true;
nRes = 2;
}
}
}
if(isChanged){
this.Formula = this.assemble();
}
}
return nRes;
};
parserFormula.prototype.insertSheet = function(index) {
var bRes = false;
......@@ -5000,18 +5023,17 @@ parserFormula.prototype.getRef = function() {
var wsFromIndex = wsFrom.getIndex();
if (wsFromIndex <= index && index <= wsToIndex) {
bRes = true;
break;
}
}
}
if (bRes) {
this.Formula = null;
}
return bRes;
};
parserFormula.prototype.moveSheet = function(tempW) {
var nRes = 0;
for (var i = 0; i < this.outStack.length; i++) {
var elem = this.outStack[i];
if (elem instanceof cArea3D) {
if (cElementType.cellsRange3D == elem.type) {
var wsTo = this.wb.getWorksheetById(elem.wsTo);
var wsToIndex = wsTo.getIndex();
var wsFrom = this.wb.getWorksheetById(elem.wsFrom);
......@@ -5019,35 +5041,32 @@ parserFormula.prototype.getRef = function() {
if (wsFromIndex <= tempW.wFI && tempW.wFI <= wsToIndex && 0 == nRes) {
nRes = 1;
}
if (elem.wsFrom == tempW.wFId) {
if (tempW.wTI > wsToIndex) {
nRes = 2;
var wsNext = this.wb.getWorksheet(wsFromIndex + 1);
if (wsNext) {
this.outStack[i].changeSheet(tempW.wFN, wsNext.getName());
} else {
this.outStack[i] = new cError(cErrorType.bad_reference);
if (elem.wsFrom !== elem.wsTo) {
if (elem.wsFrom == tempW.wFId) {
if (tempW.wTI > wsToIndex) {
nRes = 2;
var wsNext = this.wb.getWorksheet(wsFromIndex + 1);
if (wsNext) {
elem.changeSheet(tempW.wFN, wsNext.getName());
} else {
this.outStack[i] = new cError(cErrorType.bad_reference);
}
}
}
} else if (elem.wsTo == tempW.wFId) {
if (tempW.wTI <= wsFromIndex) {
nRes = 2;
var wsPrev = this.wb.getWorksheet(wsToIndex - 1);
if (wsPrev) {
this.outStack[i].changeSheet(tempW.wFN, wsPrev.getName());
} else {
this.outStack[i] = new cError(cErrorType.bad_reference);
} else if (elem.wsTo == tempW.wFId) {
if (tempW.wTI <= wsFromIndex) {
nRes = 2;
var wsPrev = this.wb.getWorksheet(wsToIndex - 1);
if (wsPrev) {
elem.changeSheet(tempW.wFN, wsPrev.getName());
} else {
this.outStack[i] = new cError(cErrorType.bad_reference);
}
}
}
}
}
}
if(2 == nRes){
this.Formula = this.assemble();
} else if(1 == nRes){
//todo
this.Formula = null;
}
return nRes;
};
/* Сборка функции в инфиксную форму */
......
......@@ -465,7 +465,7 @@ function getRangeType(oBBox){
}
},
//defined name
getDefNameByName: function(name, sheetId) {
getDefNameByName: function(name, sheetId, opt_exact) {
var res = null;
var nameIndex = getDefNameIndex(name);
if (sheetId) {
......@@ -474,14 +474,14 @@ function getRangeType(oBBox){
res = sheetContainer[nameIndex];
}
}
if (!res) {
if (!res && !(opt_exact && sheetId)) {
res = this.defNames.wb[nameIndex];
}
return res;
},
getDefNameByNodeId: function(nodeId) {
getFromDefNameId(nodeId);
return this.getDefNameByName(g_FDNI.name, g_FDNI.sheetId);
return this.getDefNameByName(g_FDNI.name, g_FDNI.sheetId, true);
},
getDefNameByRef: function(ref, sheetId) {
var getByRef = function(defName) {
......@@ -601,7 +601,7 @@ function getRangeType(oBBox){
}
var sheetId = this.wb.getSheetIdByIndex(sheetIndex);
var defName = this.getDefNameByName(name, sheetId);
var defName = this.getDefNameByName(name, sheetId, true);
if (defName) {
defName = defName.getAscCDefName();
res.status = false;
......@@ -624,18 +624,18 @@ function getRangeType(oBBox){
},
copyDefNameByWorksheet: function(wsFrom, wsTo) {
var sheetContainerFrom = this.defNames.sheet[wsFrom.getId()];
if(sheetContainerFrom){
var sheetContainerTo = this.defNames.sheet[wsTo.getId()];
if (sheetContainerFrom) {
var nameFrom = wsFrom.getName();
var nameTo = wsFrom.getName();
var notifyData = {type: AscCommon.c_oNotifyType.ChangeSheet, data: {rename: {from: nameFrom, to: nameTo}}};
for(var name in sheetContainerFrom){
var nameTo = wsTo.getName();
for (var name in sheetContainerFrom) {
var defNameOld = sheetContainerFrom[name];
var defNameNew = defNameOld.clone();
if(defNameNew.parsedRef){
defNameNew.parsedRef.notify(notifyData);
if (!defNameOld.isTable && defNameOld.parsedRef) {
var parsedRefNew = defNameOld.parsedRef.clone();
parsedRefNew.renameSheet(nameFrom, nameTo);
var refNew = parsedRefNew.assemble();
var defNameNew = new DefName(this.wb, defNameOld.name, refNew, wsTo.getId(), defNameOld.hidden, defNameOld.isTable);
this._addDefName(defNameNew);
}
sheetContainerTo[name] = defNameNew;
}
}
},
......@@ -804,8 +804,7 @@ function getRangeType(oBBox){
}
}
for (var defNameId in this.buildDefName) {
getFromDefNameId(defNameId);
var defName = this.getDefNameByName(g_FDNI.name, g_FDNI.sheetId);
var defName = this.getDefNameByNodeId(defNameId);
if (defName && defName.parsedRef) {
defName.parsedRef.parse();
defName.parsedRef.buildDependencies();
......@@ -975,12 +974,12 @@ function getRangeType(oBBox){
var changedDefName = this.changedDefName;
this.changedDefName = null;
for (var nodeId in changedDefName) {
getFromDefNameId(nodeId);
var defName = this.getDefNameByName(g_FDNI.name, g_FDNI.sheetId);
var defName = this.getDefNameByNodeId(nodeId);
if (defName && defName.parsedRef) {
defName.parsedRef.setIsDirty(true);
calcTrack.push(defName.parsedRef);
}
getFromDefNameId(nodeId);
this._broadcastDefName(g_FDNI.name, notifyData);
}
}
......@@ -1457,35 +1456,26 @@ Workbook.prototype._insertTablePartsName = function (sheet) {
}
};
Workbook.prototype._insertWorksheetFormula=function(index){
if( index > 0 && index < this.aWorksheets.length ){
var oWsTo = this.aWorksheets[index - 1];
this.dependencyFormulas.changeSheet(oWsTo.getId(), {insert: index});
if( index > 0 && index < this.aWorksheets.length ) {
var oWsBefore = this.aWorksheets[index - 1];
this.dependencyFormulas.changeSheet(oWsBefore.getId(), {insert: index});
}
};
Workbook.prototype.replaceWorksheet=function(indexFrom, indexTo){
if(indexFrom >= 0 && indexFrom < this.aWorksheets.length &&
indexTo >= 0 && indexTo < this.aWorksheets.length){
History.Create_NewPoint();
History.TurnOff();
var wsActive = this.getActiveWs();
var oWsFrom = this.aWorksheets[indexFrom];
var oWsTo = this.aWorksheets[indexTo];
var tempW = {
wFN: oWsFrom.getName(),
wFI: indexFrom,
wFId: oWsFrom.getId(),
wTN: oWsTo.getName(),
wTI: indexTo,
wTId: oWsTo.getId()
wTI: indexTo
};
//переводим обратно в индекс sheet перед которым надо вставить
//wTI index insert before
if(tempW.wFI < tempW.wTI)
tempW.wTI++;
/*
Формулы:
перестройка графа для трехмерных формул вида Sheet1:Sheet3!A1:A3, Sheet1:Sheet3!A1.
пересчет трехмерных формул, перестройка формул при изменении положения листа: Sheet1, Sheet2, Sheet3, Sheet4 - Sheet1:Sheet4!A1 -> Sheet4, Sheet1, Sheet2, Sheet3 - Sheet1:Sheet3!A1;
*/
this.dependencyFormulas.lockRecal();
this.dependencyFormulas.changeSheet(tempW.wFId, {replace: tempW});
History.TurnOn();
......@@ -1493,7 +1483,7 @@ Workbook.prototype.replaceWorksheet=function(indexFrom, indexTo){
this.aWorksheets.splice(indexTo, 0, movedSheet[0]);
this._updateWorksheetIndexes(wsActive);
this._insertWorksheetFormula(tempW.wTI);
this._insertWorksheetFormula(indexTo);
History.Add(AscCommonExcel.g_oUndoRedoWorkbook, AscCH.historyitem_Workbook_SheetMove, null, null, new UndoRedoData_FromTo(indexFrom, indexTo), true);
this.dependencyFormulas.unlockRecal();
......@@ -1542,7 +1532,7 @@ Workbook.prototype.removeWorksheet=function(nIndex, outputParams){
History.Create_NewPoint();
var removedSheetId = removedSheet.getId();
this.dependencyFormulas.lockRecal();
this.dependencyFormulas.changeSheet(removedSheetId, {remove: removedSheet.getName()});
this.dependencyFormulas.changeSheet(removedSheetId, {remove: removedSheetId});
var wsActive = this.getActiveWs();
var oVisibleWs = null;
......@@ -1697,46 +1687,6 @@ Workbook.prototype.unlockDefName = function(){
Workbook.prototype.checkDefNameLock = function(){
return this.dependencyFormulas.checkDefNameLock();
};
Workbook.prototype.getUniqueDefinedNameFrom=function(name, bCopy){
var nIndex = 1,
dnNewName = "",
fGetPostfix = null,
name = name.Name,
sheetId = name.sheetId;
if(bCopy)
{
var result = /^(.*)(\d)$/.exec(name);
if(result)
{
fGetPostfix = function(nIndex){return "" + nIndex;};
name = result[1];
}
else
{
fGetPostfix = function(nIndex){return "_" + nIndex;};
name = name;
}
}
else
{
fGetPostfix = function(nIndex){return nIndex.toString();};
}
while(nIndex < 10000)
{
var sPosfix = fGetPostfix(nIndex);
dnNewName = name + sPosfix;
var bUniqueName = false;
if(!this.getDefNameByName( dnNewName, sheetId )){
bUniqueName = true;
break;
}
if(bUniqueName)
break;
nIndex++;
}
return dnNewName;
};
Workbook.prototype._SerializeHistoryBase64 = function (oMemory, item, aPointChangesBase64) {
if (!item.LocalChange) {
var nPosStart = oMemory.GetCurPosition();
......@@ -2623,9 +2573,9 @@ Woorksheet.prototype.setName=function(name, bFromUndoRedo){
var lastName = this.sName;
this.sName = name;
History.Create_NewPoint();
History.Add(AscCommonExcel.g_oUndoRedoWorksheet, AscCH.historyitem_Worksheet_Rename, this.getId(), null, new UndoRedoData_FromTo(lastName, name));
this.workbook.dependencyFormulas.changeSheet(this.getId(), {rename: {from: lastName, to: name}});
History.Add(AscCommonExcel.g_oUndoRedoWorksheet, AscCH.historyitem_Worksheet_Rename, this.getId(), null, new UndoRedoData_FromTo(lastName, name));
if(!bFromUndoRedo)
{
var _lastName = parserHelp.getEscapeSheetName(lastName);
......@@ -8737,6 +8687,8 @@ DrawingObjectsManager.prototype.rebuildCharts = function(data)
window['AscCommonExcel'].Woorksheet = Woorksheet;
window['AscCommonExcel'].Cell = Cell;
window['AscCommonExcel'].Range = Range;
window['AscCommonExcel'].RangeTree = RangeTree;
window['AscCommonExcel'].DependencyGraph = DependencyGraph;
window['AscCommonExcel'].preparePromoteFromTo = preparePromoteFromTo;
window['AscCommonExcel'].promoteFromTo = promoteFromTo;
})(window);
......@@ -2296,7 +2296,7 @@
var defNameId;
if (oldName) {
defNameId = t.model.getDefinedName(oldName);
defNameId = defNameId ? defNameId.nodeId : null;
defNameId = defNameId ? defNameId.getNodeId() : null;
}
var callback = function() {
......@@ -2341,7 +2341,7 @@
}
t._onSelectionNameChanged(ws.getSelectionName(/*bRangeText*/false));
};
var defNameId = t.model.getDefinedName(oldName).nodeId;
var defNameId = t.model.getDefinedName(oldName).getNodeId();
ws._isLockedDefNames(delDefinedNamesCallback, defNameId);
......
......@@ -11177,7 +11177,7 @@
if (defName) {
range = true;
this._isLockedDefNames(null, defName.nodeId);
this._isLockedDefNames(null, defName.getNodeId());
if (defName.isTable) {
sheetName = defName.Ref.split("!");
......
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