Commit f0e5e6ba authored by Dmitry.Shahtanov's avatar Dmitry.Shahtanov Committed by Alexander.Trofimov

fix: Bug 30401 - [Undo&Redo][NamedRanges]Не отображается имя диапазона в...

fix: Bug 30401 - [Undo&Redo][NamedRanges]Не отображается имя диапазона в диспетчере имен после отмены Delete Cells (http://bugzserver/show_bug.cgi?id=30401)
Bug 30403 - [NamedRanges][Undo&Redo][CoEdit]Ошибка в консоли после после Delete Cells и использования диапазона в формуле (http://bugzserver/show_bug.cgi?id=30403)

git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@64909 954022d7-b5bf-4e40-9824-e11837661b57
parent e0e3aafe
......@@ -1328,38 +1328,22 @@ cName.prototype.reParse = function () {
}
};
cName.prototype.addDefinedNameNode = function ( nameReParse ) {
if ( nameReParse ) {
this.reParse();
}
if ( !this.defName || !this.defName.Ref ) {
return this.wb.dependencyFormulas.addDefinedNameNode( this.value, null );
}
return this.wb.getDefinesNames( this.defName.Name, this.ws.getId() );
};
cName.prototype.Calculate = function(){
if ( !this.defName || !this.defName.Ref ) {
return new cError( cErrorType.wrong_name );
}
var node = this.wb.getDefinesNames( this.defName.Name, this.ws.getId() ), wsR, ref, nTo;
if(!this.defName.parsedRef){
this.defName.parsedRef = new parserFormula( this.defName.Ref, "", this.ws );
this.defName.parsedRef.parse();
return new cError( cErrorType.wrong_name );
}
for ( var i = 0; i < this.defName.parsedRef.outStack.length; i++ ) {
ref = this.defName.parsedRef.outStack[i];
if ( (ref instanceof cRef || ref instanceof cRef3D || ref instanceof cArea) && ref.isValid() ) {
nTo = this.wb.dependencyFormulas.addNode( ref.getWsId(), ref._cells.replace( this.regSpace, "" ) );
this.wb.dependencyFormulas.addEdge2( node, nTo );
}
else if ( ref instanceof cArea3D && ref.isValid() ) {
wsR = ref.wsRange();
for ( var j = 0; j < wsR.length; j++ ) {
nTo = this.wb.dependencyFormulas.addNode( wsR[j].Id, ref._cells.replace( this.regSpace, "" ) );
this.wb.dependencyFormulas.addEdge2( node, nTo );
}
}
else if ( ref instanceof cName ){
this.wb.dependencyFormulas.addEdge2( node, this.defName );
}
}
return node;
return this.defName.parsedRef.calculate();
};
/** @constructor */
......@@ -3750,17 +3734,9 @@ parserFormula.prototype = {
if ( this.outStack.length < 1 ) {
return this.value = new cError( cErrorType.wrong_name );
}
var elemArr = [], stack = [], _tmp, numFormat = -1;
var elemArr = [], _tmp, numFormat = -1, currentElement = null;
for ( var i = 0; i < this.outStack.length; i++ ) {
_tmp = this.outStack[i];
if ( _tmp instanceof cName ) {
_tmp = _tmp.toRef( this.ws.getId() );
}
stack[i] = _tmp;
}
var currentElement = null;
while ( stack.length != 0 ) {
currentElement = stack.shift();
currentElement = this.outStack[i];
if ( currentElement.name == "(" ) {
continue;
}
......@@ -3784,6 +3760,9 @@ parserFormula.prototype = {
elemArr.push( _tmp );
}
}
else if( currentElement.type == cElementType.name ){
elemArr.push( currentElement.Calculate() );
}
else {
elemArr.push( currentElement );
}
......@@ -4243,14 +4222,6 @@ parserFormula.prototype = {
for ( var i = 0; i < this.outStack.length; i++ ) {
ref = this.outStack[i];
if ( ref instanceof cName ) {
nTo = ref.addDefinedNameNode( nameReParse );
this.wb.dependencyFormulas.addEdge2( node, nTo );
// ref = ref.toRef( this.ws.getId() );
// if ( ref instanceof cError )
// continue;
}
if ( (ref instanceof cRef || ref instanceof cRef3D || ref instanceof cArea || ref instanceof cArea3D) &&
ref.isValid() && this.outStack[i + 1] && this.outStack[i + 1] instanceof cBaseFunction &&
this.reRowCol.test( this.outStack[i + 1].name ) ) {
......@@ -4258,12 +4229,12 @@ parserFormula.prototype = {
continue;
}
if ( (ref instanceof cRef || ref instanceof cRef3D || ref instanceof cArea) && ref.isValid() ) {
if ( ref instanceof cName ) {
nTo = ref.addDefinedNameNode( /*nameReParse*/ );
this.wb.dependencyFormulas.addEdge2( node, nTo );
}
else if ( (ref instanceof cRef || ref instanceof cRef3D || ref instanceof cArea) && ref.isValid() ) {
nTo = this.wb.dependencyFormulas.addNode( ref.getWsId(), ref._cells.replace( this.regSpace, "" ) );
// ref.setNode( nTo );
this.wb.dependencyFormulas.addEdge2( node, nTo );
}
else if ( ref instanceof cArea3D && ref.isValid() ) {
......
......@@ -2866,7 +2866,7 @@ UndoRedoWorkbook.prototype = {
}
else if(historyitem_Workbook_DefinedNamesAdd === Type ){
if(bUndo){
this.wb.delDefinesNames( Data.newName );
this.wb.delDefinesNames( Data.newName, true );
this.wb.handlers.trigger("asc_onDelDefName")
}
else{
......@@ -2879,7 +2879,7 @@ UndoRedoWorkbook.prototype = {
oConflictDefName.renameDefNameToCollaborate(this.wb.getUniqueDefinedNameFrom(oConflictDefName, true));
}
}
this.wb.editDefinesNames( null, Data.newName, !bUndo );
this.wb.editDefinesNames( null, Data.newName, true );
this.wb.handlers.trigger("asc_onEditDefName", null, Data.newName);
}
/*TODO
......@@ -2898,12 +2898,12 @@ UndoRedoWorkbook.prototype = {
oldName = Data.oldName;
newName = Data.newName;
}
res = this.wb.editDefinesNames( oldName, newName, bUndo );
res = this.wb.editDefinesNames( oldName, newName, true );
this.wb.handlers.trigger("asc_onEditDefName", oldName, newName);
}
else if(historyitem_Workbook_DefinedNamesDelete === Type ){
if(bUndo){
this.wb.editDefinesNames( null, Data, bUndo );
this.wb.editDefinesNames( null, Data, true );
if( Data.slaveEdge ){
var n;
for(var i = 0; i < Data.slaveEdge.length; i++){
......@@ -2913,19 +2913,16 @@ UndoRedoWorkbook.prototype = {
this.wb.needRecalc.length++;
n = n.returnCell();
n ? function(){
if(n){
n.formulaParsed = new parserFormula( n.formulaParsed.Formula, n.formulaParsed.cellId, n.formulaParsed.ws )
n.formulaParsed.parse();
n.formulaParsed.buildDependencies();
}() : null;
}
}
}
sortDependency(this.wb);
}
this.wb.handlers.trigger("asc_onEditDefName", null, Data);
}
else{
this.wb.delDefinesNames( Data );
this.wb.delDefinesNames( Data, true );
}
}
}
......
......@@ -10,7 +10,7 @@ var g_nAllColIndex = -1;
var g_nAllRowIndex = -1;
var aStandartNumFormats;
var aStandartNumFormatsId;
var start, end, arrRecalc = {}, lc = 0;
var start, end, arrRecalc = {}, arrDefNameRecalc = {}, lc = 0;
var c_oRangeType =
{
......@@ -891,9 +891,7 @@ DependencyGraph.prototype = {
else if( null == oRes.Ref && null != defRef ){
oRes.Ref = defRef;
oRes.isTable = undefined;
oRes.parsedRef = new parserFormula(oRes.Ref, "", oRes.wb.getWorksheet(0));
oRes.parsedRef.parse();
// oRes.sheetId = sheetId;
addToArrDefNameRecalc(oRes);
}
/*поставить зависимость между ячейками и текущим ИД*/
......@@ -903,9 +901,7 @@ DependencyGraph.prototype = {
}
if( !oRes.isTable && oRes.Ref != undefined && oRes.Ref != null ){
oRes.parsedRef = new parserFormula(oRes.Ref, "", oRes.wb.getWorksheet(0));
oRes.parsedRef.parse();
oRes.parsedRef.buildDependencies(null,oRes);
addToArrDefNameRecalc(oRes);
}
return oRes;
......@@ -922,6 +918,7 @@ DependencyGraph.prototype = {
if ( oRes ) {
this.defNameList[nodeId].Ref = null;
ret = oRes;
addToArrDefNameRecalc(oRes);
}
return ret;
......@@ -929,9 +926,6 @@ DependencyGraph.prototype = {
},
removeDefNameBySheet:function ( sheetId ) {
/*var ws = this.wb.getWorksheet( sheetId );
ws ? sheetId = ws.getId() : null;*/
var nodesList = this.defNameList, retRes = {}, defN, seUndoRedo = [], nSE, wsIndex, ws = this.wb.getWorksheetById(sheetId ), wsName = ws.getName();
for ( var id in nodesList ) {
......@@ -963,6 +957,7 @@ DependencyGraph.prototype = {
defN.Ref = defN.parsedRef.Formula = defN.parsedRef.assemble( true );
retRes[id] = defN;
}
addToArrDefNameRecalc(defN);
}
}
return retRes;
......@@ -1002,9 +997,7 @@ DependencyGraph.prototype = {
}
else{
oldN.deleteAllMasterEdges();
oldN.parsedRef = new parserFormula(oldN.Ref, "", oldN.wb.getWorksheet(0));
oldN.parsedRef.parse();
oldN.parsedRef.buildDependencies(null,oldN);
addToArrDefNameRecalc(oldN);
}
return oldN;
......@@ -1378,7 +1371,6 @@ Vertex.prototype = {
function DefNameVertex( scope, defName, defRef, defHidden, wb, isTable ) {
this.sheetId = scope === null || scope === undefined ? "WB" : scope;
// this.sheetId = scope || "WB";
this.cellId = defName.toLowerCase();
this.Ref = defRef;
this.Name = defName;
......@@ -1387,17 +1379,6 @@ function DefNameVertex( scope, defName, defRef, defHidden, wb, isTable ) {
this.nodeId = getDefNameVertexId( this.sheetId, defName );
this.wb = wb;
/*if(!isTable){
this.parsedRef = new parserFormula(this.Ref, "", this.wb.getWorksheet(0));
if( this.Ref ){
this.parsedRef.parse();
// this.parsedRef.buildDependencies();
}
}*/
/*else{
this.sheetTableId = wb.getActiveWs().getId();
}*/
//вершина которую мы прошли и поставили в очередь обхода
this.isBlack = false;
......@@ -1673,6 +1654,14 @@ DefNameVertex.prototype = {
var item = aFormulas[i];
item.value.formula = item.formula.assemble();
}
},
rebuild:function(){
if(this.Ref){
this.parsedRef = new parserFormula(this.Ref, "", this.wb.getWorksheet(0));
this.parsedRef.parse();
this.parsedRef.buildDependencies(null,this);
}
}
};
......@@ -1698,17 +1687,26 @@ function unLockDraw(wb){
}
}
function addToArrRecalc(sheetId, cell){
var temp = arrRecalc[sheetId];
if( !temp )
{
temp = [];
arrRecalc[sheetId] = temp;
}
temp.push(cell);
}
var temp = arrRecalc[sheetId];
if( !temp )
{
temp = [];
arrRecalc[sheetId] = temp;
}
temp.push(cell);
}
function addToArrDefNameRecalc(name){
arrDefNameRecalc[name.nodeId] = name;
}
function buildRecalc(_wb,notrec, bForce){
var ws;
if( lc > 1 && !bForce) return;
if(!bForce){
for(var id in arrDefNameRecalc ){
arrDefNameRecalc[id].rebuild();
}
arrDefNameRecalc = {};
}
for( var id in arrRecalc ){
ws = _wb.getWorksheetById(id);
if (ws) {
......@@ -1721,10 +1719,11 @@ function buildRecalc(_wb,notrec, bForce){
_rec[cellId] = cellId;
_wb.needRecalc.nodes[getVertexId(id, cellId)] = [id, cellId ];
_wb.needRecalc.length++;
}
ws._BuildDependencies(_rec);
}
}
ws._BuildDependencies(_rec);
}
}
if(!notrec)
sortDependency(_wb)
}
......@@ -1794,7 +1793,7 @@ function _sortDependency(wb, node, oNodeDependence, oNewMasterAreaNodes, bBad, o
var bCurBad = oWeightMapElem.bad || bBad;
if(node.isDefinedName){
//todo
//Обрабатваем тут все, что было ссделано с именованной ссылкой: переименована;
//Обрабатываем тут все, что было сделано с именованной ссылкой: переименована;
//перемещен диапазон; сдвиг/удаление ячеек, приведшие к сдвигу ячеек; удаление именованного диапазона.
//
// var ws = wb.getWorksheetById( node.sheetId );
......@@ -2511,7 +2510,7 @@ Workbook.prototype.getDefinedName = function ( name ) {
ws ? sheetId = ws.getId() : null;
return this.dependencyFormulas.getDefNameNodeByName( name.Name, sheetId );
};
Workbook.prototype.delDefinesNames = function ( defName ) {
Workbook.prototype.delDefinesNames = function ( defName, bUndo ) {
History.Create_NewPoint();
var retRes = false;
......@@ -2533,22 +2532,14 @@ Workbook.prototype.delDefinesNames = function ( defName ) {
for ( var id in nSE ) {
seUndoRedo.push( id );
se = nSE[id];
// se.deleteMasterEdge( retRes );
addToArrRecalc(se.sheetId, se.cell);
this.needRecalc.nodes[se.nodeId] = [se.sheetId, se.cellId ];
this.needRecalc.length++;
se = se.returnCell();
if( se ){
// se.setFormula( se.formulaParsed.assemble() );
se.formulaParsed.isParsed = false;
se.formulaParsed.parse();
se.formulaParsed.buildDependencies();
}
}
sortDependency( this );
if(!bUndo)
buildRecalc( this );
History.Add( g_oUndoRedoWorkbook, historyitem_Workbook_DefinedNamesDelete, null, null, new UndoRedoData_DefinedNames( defName.Name, defName.Ref, defName.LocalSheetId, defName.isTable, seUndoRedo ) );
}
......@@ -2582,12 +2573,12 @@ Workbook.prototype.editDefinesNames = function ( oldName, newName, bUndo ) {
History.Add( g_oUndoRedoWorkbook, historyitem_Workbook_DefinedNamesAdd, null, null, new UndoRedoData_DefinedNamesChange( oldName, newName ) );
}
/*
* #1. поменяли название - перестроили формулу. нужно вызвать пересборку формул в ячейках, в которыйх есть эта именованная ссылка.
* для этого пробегаемся по всем slave, и вызываем пересборку. в результате должна получиться новая формула, где используется новый диапазон.
* #2. поменяли диапазон. нужно перестроить граф зависимосте и пересчитать формулу. находим диапазон; меняем в нем ссылку; разбираем ссылку;
* удаляем старые master и добавляем новые, которые получились в результате разбора новой ссылки; пересчитываем формулу.
* */
/* #1. поменяли название - перестроили формулу. нужно вызвать пересборку формул в ячейках, в которыйх есть эта именованная ссылка.
для этого пробегаемся по всем slave, и вызываем пересборку. в результате должна получиться новая формула, где используется новый диапазон.
#2. поменяли диапазон. нужно перестроить граф зависимосте и пересчитать формулу. находим диапазон; меняем в нем ссылку; разбираем ссылку;
удаляем старые master и добавляем новые, которые получились в результате разбора новой ссылки; пересчитываем формулу.*/
if( !rename ){
retRes = this.dependencyFormulas.getDefNameNodeByName(newName.Name)
......@@ -2600,34 +2591,23 @@ Workbook.prototype.editDefinesNames = function ( oldName, newName, bUndo ) {
for ( var id in nSE ) {
se = nSE[id];
se.deleteMasterEdge( retRes );
this.needRecalc.nodes[se.nodeId] = [se.sheetId, se.cellId ];
this.needRecalc.length++;
addToArrRecalc(se.sheetId, se.cell);
se = se.returnCell();
if ( se ) {
se.setFormula( se.formulaParsed.assemble() );
if ( !rename ) {
se.formulaParsed.setFormula(se.sFormula);
se.formulaParsed.parse();
}
se.formulaParsed.buildDependencies( true );
}
}
if(retRes){
retRes = retRes.getAscCDefName();
}
// if(!bUndo){
// sortDependency( this );
// }
}
if(!bUndo)
buildRecalc(this);
return retRes;
};
......
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