Commit 47bc0f24 authored by Sergey.Konovalov's avatar Sergey.Konovalov Committed by Alexander.Trofimov

проблема при move формул на соседние ячейки. RangeDataManager и CellArea - ...

проблема при  move формул на соседние ячейки. RangeDataManager и CellArea -  обьединение кода shift и move.

git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@57560 954022d7-b5bf-4e40-9824-e11837661b57
parent 9216fa74
...@@ -3344,11 +3344,13 @@ Woorksheet.prototype._moveRange=function(oBBoxFrom, oBBoxTo, copyRange){ ...@@ -3344,11 +3344,13 @@ Woorksheet.prototype._moveRange=function(oBBoxFrom, oBBoxTo, copyRange){
} }
//удаляем to через историю, для undo //удаляем to через историю, для undo
var aRangesToCheck = this._prepareMoveRangeGetCleanRanges(oBBoxFrom, oBBoxTo); var aRangesToCheck = this._prepareMoveRangeGetCleanRanges(oBBoxFrom, oBBoxTo);
for(var i = 0, length = aRangesToCheck.length; i < length; i++) for (var i = 0, length = aRangesToCheck.length; i < length; i++) {
aRangesToCheck[i].cleanAll(); var range = aRangesToCheck[i];
//выставляем для slave refError range.cleanAll();
if(!copyRange) //выставляем для slave refError
this.workbook.dependencyFormulas.deleteNodes(this.getId(), oBBoxTo); if (!copyRange)
this.workbook.dependencyFormulas.deleteNodes(this.getId(), range.getBBox0());
}
//перемещаем без истории //перемещаем без истории
History.TurnOff(); History.TurnOff();
//удаляем from без истории, потому что эти данные не терются а перемещаются //удаляем from без истории, потому что эти данные не терются а перемещаются
...@@ -3360,6 +3362,7 @@ Woorksheet.prototype._moveRange=function(oBBoxFrom, oBBoxTo, copyRange){ ...@@ -3360,6 +3362,7 @@ Woorksheet.prototype._moveRange=function(oBBoxFrom, oBBoxTo, copyRange){
delete row.c[nCol0]; delete row.c[nCol0];
}); });
} }
History.TurnOn();
if(!copyRange){ if(!copyRange){
this.workbook.dependencyFormulas.helper(oBBoxFrom, oBBoxTo,this.Id); this.workbook.dependencyFormulas.helper(oBBoxFrom, oBBoxTo,this.Id);
} }
...@@ -3388,7 +3391,6 @@ Woorksheet.prototype._moveRange=function(oBBoxFrom, oBBoxTo, copyRange){ ...@@ -3388,7 +3391,6 @@ Woorksheet.prototype._moveRange=function(oBBoxFrom, oBBoxTo, copyRange){
} }
} }
History.TurnOn();
if(false == this.workbook.bUndoChanges && (false == this.workbook.bRedoChanges || true == this.workbook.bCollaborativeChanges)) if(false == this.workbook.bUndoChanges && (false == this.workbook.bRedoChanges || true == this.workbook.bCollaborativeChanges))
{ {
History.LocalChange = true; History.LocalChange = true;
......
...@@ -53,7 +53,7 @@ function shiftGetBBox(bbox, bHor) ...@@ -53,7 +53,7 @@ function shiftGetBBox(bbox, bHor)
bboxGet = Asc.Range(bbox.c1, bbox.r1, bbox.c2, gc_nMaxRow0); bboxGet = Asc.Range(bbox.c1, bbox.r1, bbox.c2, gc_nMaxRow0);
return bboxGet; return bboxGet;
} }
function shiftSort(a, b, bAsc, bRow) function shiftSort(a, b, offset)
{ {
var nRes = 0; var nRes = 0;
if(null == a.to || null == b.to) if(null == a.to || null == b.to)
...@@ -67,20 +67,18 @@ function shiftSort(a, b, bAsc, bRow) ...@@ -67,20 +67,18 @@ function shiftSort(a, b, bAsc, bRow)
} }
else else
{ {
if(bRow) if (0 != offset.offsetRow) {
{ if (offset.offsetRow > 0)
if(bAsc) nRes = b.to.r1 - a.to.r1;
nRes = a.to.r1 - b.to.r1; else
else nRes = a.to.r1 - b.to.r1;
nRes = b.to.r1 - a.to.r1; }
} if (0 == nRes && 0 != offset.offsetCol) {
else if (offset.offsetCol > 0)
{ nRes = b.to.c1 - a.to.c1;
if(bAsc) else
nRes = a.to.c1 - b.to.c1; nRes = a.to.c1 - b.to.c1;
else }
nRes = b.to.c1 - a.to.c1;
}
} }
return nRes; return nRes;
} }
...@@ -3989,165 +3987,127 @@ RangeDataManager.prototype = { ...@@ -3989,165 +3987,127 @@ RangeDataManager.prototype = {
}, },
shift: function (bbox, bAdd, bHor, oGetRes, oChangeParam) shift: function (bbox, bAdd, bHor, oGetRes, oChangeParam)
{ {
var _this = this; var _this = this;
if(null == oGetRes) if (null == oGetRes)
oGetRes = this.shiftGet(bbox, bHor); oGetRes = this.shiftGet(bbox, bHor);
var aToChange = []; var offset;
var elems = oGetRes.elems; if (bHor)
//сдвигаем inner offset = { offsetRow: 0, offsetCol: bbox.c2 - bbox.c1 + 1 };
if(elems.inner.length > 0) else
{ offset = { offsetRow: bbox.r2 - bbox.r1 + 1, offsetCol: 0 };
var offset = null; if (!bAdd) {
if(bHor) offset.offsetRow = -offset.offsetRow;
offset = {offsetRow: 0, offsetCol: bbox.c2 - bbox.c1 + 1}; offset.offsetCol = -offset.offsetCol;
else }
offset = {offsetRow: bbox.r2 - bbox.r1 + 1, offsetCol: 0}; this._shiftmove(true, bbox, offset, oGetRes.elems, oChangeParam);
if(!bAdd)
{
offset.offsetRow = -offset.offsetRow;
offset.offsetCol = -offset.offsetCol;
}
for(var i = 0, length = elems.inner.length; i < length; i++)
{
var elem = elems.inner[i];
var from = elem.bbox;
var to = null;
if(bAdd)
{
to = elem.bbox.clone();
to.setOffset(offset);
}
else
{
var bboxAsc = Asc.Range(bbox.c1, bbox.r1, bbox.c2, bbox.r2);
if(!bboxAsc.containsRange(from))
{
to = elem.bbox.clone();
if(bHor)
{
if(to.c1 <= bbox.c2)
to.setOffsetFirst({offsetRow: 0, offsetCol: bbox.c2 - to.c1 + 1});
}
else
{
if(to.r1 <= bbox.r2)
to.setOffsetFirst({offsetRow: bbox.r2 - to.r1 + 1, offsetCol: 0});
}
to.setOffset(offset);
}
}
aToChange.push({elem: elem, to: to});
}
}
//меняем outer
if(elems.outer.length > 0)
{
for(var i = 0, length = elems.outer.length; i < length; i++)
{
var elem = elems.outer[i];
var from = elem.bbox;
var to = null;
if(bHor)
{
if(from.c1 < bbox.c1 && bbox.r1 <= from.r1 && from.r2 <= bbox.r2)
{
if(bAdd)
{
to = from.clone();
to.setOffsetLast({offsetRow: 0, offsetCol: bbox.c2 - bbox.c1 + 1});
}
else
{
to = from.clone();
var nTemp1 = from.c2 - bbox.c1 + 1;
var nTemp2 = bbox.c2 - bbox.c1 + 1;
to.setOffsetLast({offsetRow: 0, offsetCol: -Math.min(nTemp1, nTemp2)});
}
}
}
else
{
if(from.r1 < bbox.r1 && bbox.c1 <= from.c1 && from.c2 <= bbox.c2)
{
if(bAdd)
{
to = from.clone();
to.setOffsetLast({offsetRow: bbox.r2 - bbox.r1 + 1, offsetCol: 0});
}
else
{
to = from.clone();
var nTemp1 = from.r2 - bbox.r1 + 1;
var nTemp2 = bbox.r2 - bbox.r1 + 1;
to.setOffsetLast({offsetRow: -Math.min(nTemp1, nTemp2), offsetCol: 0});
}
}
}
if(null != to)
aToChange.push({elem: elem, to: to});
}
}
//сначала сортируем чтобы не было конфликтов при сдвиге
if(bHor)
{
if(bAdd)
aToChange.sort(function(a, b){return shiftSort(a, b, false, false);});
else
aToChange.sort(function(a, b){return shiftSort(a, b, true, false);});
}
else
{
if(bAdd)
aToChange.sort(function(a, b){return shiftSort(a, b, false, true);});
else
aToChange.sort(function(a, b){return shiftSort(a, b, true, true);});
}
if(null != this.fChange)
{
for(var i = 0, length = aToChange.length; i < length; ++i)
{
var item = aToChange[i];
this.fChange.call(this, item.elem.data, item.elem.bbox, item.to, oChangeParam);
}
}
//убираем fChange, чтобы потом послать его только на одну операцию, а не 2
var fOldChange = this.fChange;
this.fChange = null;
//сначала удаляем все чтобы не было конфликтов
for(var i = 0, length = aToChange.length; i < length; ++i)
{
var item = aToChange[i];
var elem = item.elem;
this.removeElement(elem, oChangeParam);
}
//добавляем измененные ячейки
for(var i = 0, length = aToChange.length; i < length; ++i)
{
var item = aToChange[i];
if(null != item.to)
this.add(item.to, item.elem.data, oChangeParam);
}
this.fChange = fOldChange;
}, },
move: function (from, to, oChangeParam) move: function (from, to, oChangeParam)
{ {
var fOldChange = this.fChange; var offset = { offsetRow: to.r1 - from.r1, offsetCol: to.c1 - from.c1 };
var nOffsetRow = to.r1 - from.r1; var oGetRes = this.get(from);
var nOffsetCol = to.c1 - from.c1; this._shiftmove(false, from, offset, oGetRes, oChangeParam);
var oGetRes = this.get(from); },
for(var i = 0, length = oGetRes.inner.length; i < length; i++) _shiftmove: function (bShift, bbox, offset, elems, oChangeParam) {
{ var aToChange = [];
var elem = oGetRes.inner[i]; var bAdd = offset.offsetRow > 0 || offset.offsetCol > 0;
var oNewBBox = new Asc.Range(elem.bbox.c1 + nOffsetCol, elem.bbox.r1 + nOffsetRow, elem.bbox.c2 + nOffsetCol, elem.bbox.r2 + nOffsetRow); var bHor = 0 != offset.offsetCol ? true : false;
if(null != fOldChange) //сдвигаем inner
fOldChange.call(this, elem.data, elem.bbox, oNewBBox, oChangeParam); if (elems.inner.length > 0) {
//убираем fChange, чтобы потом послать его только на одну операцию, а не 2 var bboxAsc = Asc.Range(bbox.c1, bbox.r1, bbox.c2, bbox.r2);
this.fChange = null; for (var i = 0, length = elems.inner.length; i < length; i++) {
this.removeElement(elem, oChangeParam); var elem = elems.inner[i];
this.add(oNewBBox, elem.data, oChangeParam); var from = elem.bbox;
this.fChange = fOldChange; var to = null;
} if (bShift) {
if (bAdd) {
to = from.clone();
to.setOffset(offset);
}
else if (!bboxAsc.containsRange(from)) {
to = from.clone();
if (bHor) {
if (to.c1 <= bbox.c2)
to.setOffsetFirst({ offsetRow: 0, offsetCol: bbox.c2 - to.c1 + 1 });
}
else {
if (to.r1 <= bbox.r2)
to.setOffsetFirst({ offsetRow: bbox.r2 - to.r1 + 1, offsetCol: 0 });
}
to.setOffset(offset);
}
}
else {
to = from.clone();
to.setOffset(offset);
}
aToChange.push({ elem: elem, to: to });
}
}
//меняем outer
if (bShift) {
if (elems.outer.length > 0) {
for (var i = 0, length = elems.outer.length; i < length; i++) {
var elem = elems.outer[i];
var from = elem.bbox;
var to = null;
if (bHor) {
if (from.c1 < bbox.c1 && bbox.r1 <= from.r1 && from.r2 <= bbox.r2) {
if (bAdd) {
to = from.clone();
to.setOffsetLast({ offsetRow: 0, offsetCol: bbox.c2 - bbox.c1 + 1 });
}
else {
to = from.clone();
var nTemp1 = from.c2 - bbox.c1 + 1;
var nTemp2 = bbox.c2 - bbox.c1 + 1;
to.setOffsetLast({ offsetRow: 0, offsetCol: -Math.min(nTemp1, nTemp2) });
}
}
}
else {
if (from.r1 < bbox.r1 && bbox.c1 <= from.c1 && from.c2 <= bbox.c2) {
if (bAdd) {
to = from.clone();
to.setOffsetLast({ offsetRow: bbox.r2 - bbox.r1 + 1, offsetCol: 0 });
}
else {
to = from.clone();
var nTemp1 = from.r2 - bbox.r1 + 1;
var nTemp2 = bbox.r2 - bbox.r1 + 1;
to.setOffsetLast({ offsetRow: -Math.min(nTemp1, nTemp2), offsetCol: 0 });
}
}
}
if (null != to)
aToChange.push({ elem: elem, to: to });
}
}
}
//сначала сортируем чтобы не было конфликтов при сдвиге
aToChange.sort(function (a, b) { return shiftSort(a, b, offset); });
if (null != this.fChange) {
for (var i = 0, length = aToChange.length; i < length; ++i) {
var item = aToChange[i];
this.fChange.call(this, item.elem.data, item.elem.bbox, item.to, oChangeParam);
}
}
//убираем fChange, чтобы потом послать его только на одну операцию, а не 2
var fOldChange = this.fChange;
this.fChange = null;
//сначала удаляем все чтобы не было конфликтов
for (var i = 0, length = aToChange.length; i < length; ++i) {
var item = aToChange[i];
var elem = item.elem;
this.removeElement(elem, oChangeParam);
}
//добавляем измененные ячейки
for (var i = 0, length = aToChange.length; i < length; ++i) {
var item = aToChange[i];
if (null != item.to)
this.add(item.to, item.elem.data, oChangeParam);
}
this.fChange = fOldChange;
}, },
getAll : function() getAll : function()
{ {
...@@ -4249,116 +4209,69 @@ CellArea.prototype = { ...@@ -4249,116 +4209,69 @@ CellArea.prototype = {
var bboxGet = shiftGetBBox(bbox, bHor); var bboxGet = shiftGetBBox(bbox, bHor);
return {bbox: bboxGet, elems: this.get(bboxGet)}; return {bbox: bboxGet, elems: this.get(bboxGet)};
}, },
shift : function(bbox, bAdd, bHor, oGetRes) shift: function (bbox, bAdd, bHor, oGetRes)
{ {
if(null == oGetRes) var _this = this;
oGetRes = this.shiftGet(bbox, bHor); if (null == oGetRes)
var aToChange = []; oGetRes = this.shiftGet(bbox, bHor);
var elems = oGetRes.elems; var offset;
//сдвигаем inner if (bHor)
if(elems.length > 0) offset = { offsetRow: 0, offsetCol: bbox.c2 - bbox.c1 + 1 };
{ else
var offset = null; offset = { offsetRow: bbox.r2 - bbox.r1 + 1, offsetCol: 0 };
if(bHor) if (!bAdd) {
offset = {offsetRow: 0, offsetCol: bbox.c2 - bbox.c1 + 1}; offset.offsetRow = -offset.offsetRow;
else offset.offsetCol = -offset.offsetCol;
offset = {offsetRow: bbox.r2 - bbox.r1 + 1, offsetCol: 0}; }
if(!bAdd) this._shiftmove(true, bbox, offset, oGetRes.elems);
{ },
offset.offsetRow = -offset.offsetRow; move: function (from, to)
offset.offsetCol = -offset.offsetCol; {
} var offset = { offsetRow: to.r1 - from.r1, offsetCol: to.c1 - from.c1 };
for(var i = 0, length = elems.length; i < length; i++) var oGetRes = this.get(from);
{ this._shiftmove(false, from, offset, oGetRes);
var elem = elems[i]; },
var to = null; _shiftmove: function (bShift, bbox, offset, elems) {
if(bAdd) var aToChange = [];
{ //сдвигаем inner
to = elem.bbox.clone(); if (elems.length > 0) {
to.setOffset(offset); var bboxAsc = Asc.Range(bbox.c1, bbox.r1, bbox.c2, bbox.r2);
} var bAdd = offset.offsetRow > 0 || offset.offsetCol > 0;
else for (var i = 0, length = elems.length; i < length; i++) {
{ var elem = elems[i];
var bboxAsc = Asc.Range(bbox.c1, bbox.r1, bbox.c2, bbox.r2); var to = null;
if(!bboxAsc.containsRange(elem.bbox)) if (!bShift || bAdd || !bboxAsc.containsRange(elem.bbox)) {
{ to = elem.bbox.clone();
to = elem.bbox.clone(); to.setOffset(offset);
if(bHor) }
{ aToChange.push({ elem: elem, to: to });
if(to.c1 <= bbox.c2) }
to.setOffsetFirst({offsetRow: 0, offsetCol: bbox.c2 - to.c1 + 1}); }
} //сначала сортируем чтобы не было конфликтов при сдвиге
else aToChange.sort(function (a, b) { return shiftSort(a, b, offset); });
{
if(to.r1 <= bbox.r2) if (null != this.fChange) {
to.setOffsetFirst({offsetRow: bbox.r2 - to.r1 + 1, offsetCol: 0}); for (var i = 0, length = aToChange.length; i < length; ++i) {
} var item = aToChange[i];
to.setOffset(offset); this.fChange.call(this, item.elem.data, item.elem.bbox, item.to);
} }
} }
aToChange.push({elem: elem, to: to}); //убираем fChange, чтобы потом послать его только на одну операцию, а не 2
} var fOldChange = this.fChange;
} this.fChange = null;
//сначала сортируем чтобы не было конфликтов при сдвиге //сначала удаляем все чтобы не было конфликтов
if(bHor) for (var i = 0, length = aToChange.length; i < length; ++i) {
{ var item = aToChange[i];
if(bAdd) var elem = item.elem;
aToChange.sort(function(a, b){return shiftSort(a, b, false, false);}); this.removeElement(elem);
else }
aToChange.sort(function(a, b){return shiftSort(a, b, true, false);}); //добавляем измененные ячейки
} for (var i = 0, length = aToChange.length; i < length; ++i) {
else var item = aToChange[i];
{ if (null != item.to)
if(bAdd) this.add(item.to.r1, item.to.c1, item.elem.data);
aToChange.sort(function(a, b){return shiftSort(a, b, false, true);}); }
else this.fChange = fOldChange;
aToChange.sort(function(a, b){return shiftSort(a, b, true, true);});
}
if(null != this.fChange)
{
for(var i = 0, length = aToChange.length; i < length; ++i)
{
var item = aToChange[i];
this.fChange.call(this, item.elem.data, item.elem.bbox, item.to);
}
}
//убираем fChange, чтобы потом послать его только на одну операцию, а не 2
var fOldChange = this.fChange;
this.fChange = null;
//сначала удаляем все чтобы не было конфликтов
for(var i = 0, length = aToChange.length; i < length; ++i)
{
var item = aToChange[i];
var elem = item.elem;
this.removeElement(elem);
}
//добавляем измененные ячейки
for(var i = 0, length = aToChange.length; i < length; ++i)
{
var item = aToChange[i];
if(null != item.to)
this.add(item.to.r1, item.to.c1, item.elem.data);
}
this.fChange = fOldChange;
},
move : function(from, to)
{
var fOldChange = this.fChange;
var nOffsetRow = to.r1 - from.r1;
var nOffsetCol = to.c1 - from.c1;
var oGetRes = this.get(from);
for(var i = 0, length = oGetRes.length; i < length; i++)
{
var elem = oGetRes[i];
var oNewBBox = new Asc.Range(elem.bbox.c1 + nOffsetCol, elem.bbox.r1 + nOffsetRow, elem.bbox.c2 + nOffsetCol, elem.bbox.r2 + nOffsetRow);
if(null != fOldChange)
fOldChange.call(this, elem.data, elem.bbox, oNewBBox);
//убираем fChange, чтобы потом послать его только на одну операцию, а не 2
this.fChange = null;
this.removeElement(elem);
this.add(oNewBBox.r1, oNewBBox.c1, elem.data);
this.fChange = fOldChange;
}
}, },
getAll : function(){ getAll : function(){
var aRes = []; var aRes = [];
......
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