Commit 5e9aa030 authored by Igor.Zotov's avatar Igor.Zotov Committed by Alexander.Trofimov

обработка для форматированных таблиц при Shift(Delete) Cell Rigth(Down)

git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@50629 954022d7-b5bf-4e40-9824-e11837661b57
parent 77275080
......@@ -2012,6 +2012,151 @@
this.AddFormatTableOptions = objOptions;
return objOptions;
},
//если селект затрагивает часть хотя бы одной форматированной таблицы(для случая insert(delete) cells)
isActiveCellsCrossHalfFTable: function(activeCells, val, prop)
{
var InsertCellsAndShiftDown = (val == c_oAscInsertOptions.InsertCellsAndShiftDown && prop == 'insCell') ? true : false;
var InsertCellsAndShiftRight = (val == c_oAscInsertOptions.InsertCellsAndShiftRight && prop == 'insCell') ? true : false;
var DeleteCellsAndShiftLeft = (val == c_oAscDeleteOptions.DeleteCellsAndShiftLeft && prop == 'delCell') ? true : false;;
var DeleteCellsAndShiftTop = (val == c_oAscDeleteOptions.DeleteCellsAndShiftTop && prop == 'delCell') ? true : false;;
var ws = this.woksheet;
var aWs = this._getCurrentWS();
var tableParts = aWs.TableParts;
var autoFilter = aWs.AutoFilter;
var result = true;
//проверка на то, что захвачен кусок форматированной таблицы
if(tableParts)//при удалении в MS Excel ошибка может возникать только в случае форматированных таблиц
{
var tableRange;
var isExp;
for(var i = 0; i < tableParts.length; i++ )
{
tableRange = this._refToRange(tableParts[i].Ref);
isExp = false;
//если хотя бы одна ячейка активной области попадает внутрь форматированной таблицы
if(this._rangeHitInAnRange(activeCells, tableRange))
{
//если селектом засхвачена не вся таблица, то выдаём ошибку и возвращаем false
if(activeCells.c1 <= tableRange.c1 && activeCells.r1 <= tableRange.r1 && activeCells.c2 >= tableRange.c2 && activeCells.r2 >= tableRange.r2)
{
result = 'changeAutoFilter';
}
else
{
if(InsertCellsAndShiftDown)
{
if(activeCells.c1 <= tableRange.c1 && activeCells.c2 >= tableRange.c2 && activeCells.r1 <= tableRange.r1)
isExp = true;
}
else if(InsertCellsAndShiftRight)
{
if(activeCells.r1 <= tableRange.r1 && activeCells.r2 >= tableRange.r2 && activeCells.c1 <= tableRange.c1)
isExp = true;
}
if(!isExp)
return false;
}
}
else
{
//проверка на то, что хотим сдвинуть часть отфильтрованного диапазона
if(DeleteCellsAndShiftLeft)
{
//если данный фильтр находится справа
if(tableRange.c1 > activeCells.c1 && (tableRange.r1 < activeCells.r1 || tableRange.r2 > activeCells.r2))
return false;
}
else if(DeleteCellsAndShiftTop)
{
//если данный фильтр находится внизу
if(tableRange.r1 > activeCells.r1 && (tableRange.c1 < activeCells.c1 || tableRange.c2 > activeCells.c2))
return false;
}
else if(InsertCellsAndShiftRight)
{
//если данный фильтр находится справа
if(tableRange.c1 > activeCells.c1 && (tableRange.r1 < activeCells.r1 || tableRange.r2 > activeCells.r2))
return false;
}
else
{
//если данный фильтр находится внизу
if(tableRange.r1 > activeCells.r1 && (tableRange.c1 < activeCells.c1 || tableRange.c2 > activeCells.c2))
return false;
}
}
//если сдвигаем данный фильтр
if(DeleteCellsAndShiftLeft && tableRange.c1 > activeCells.c1 && tableRange.r1 >= activeCells.r1 && tableRange.r2 <= activeCells.r2)
{
result = 'changeAutoFilter';
}
else if(DeleteCellsAndShiftTop && tableRange.r1 > activeCells.r1 && tableRange.c1 >= activeCells.c1 && tableRange.c2 <= activeCells.c2)
{
result = 'changeAutoFilter';
}
else if(InsertCellsAndShiftRight && tableRange.c1 >= activeCells.c1 && tableRange.r1 >= activeCells.r1 && tableRange.r2 <= activeCells.r2)
{
result = 'changeAutoFilter';
}
else if(InsertCellsAndShiftDown && tableRange.r1 >= activeCells.r1 && tableRange.c1 >= activeCells.c1 && tableRange.c2 <= activeCells.c2)
{
result = 'changeAutoFilter';
}
}
}
//при вставке ошибка в MS Excel может возникать как в случае автофильтров, так и в случае форматированных таблиц
if((InsertCellsAndShiftRight || InsertCellsAndShiftDown) && autoFilter)
{
tableRange = this._refToRange(autoFilter.Ref);
//если хотя бы одна ячейка активной области попадает внутрь форматированной таблицы
if(this._rangeHitInAnRange(activeCells, tableRange))
{
//если селектом засхвачена не вся таблица, то выдаём ошибку и возвращаем false
if(!(activeCells.c1 <= tableRange.c1 && activeCells.r1 <= tableRange.r1 && activeCells.c2 >= tableRange.c2 && activeCells.r2 >= tableRange.r2))
return false;
}
else
{
//проверка на то, что хотим сдвинуть часть отфильтрованного диапазона
if(InsertCellsAndShiftRight)
{
//если данный фильтр находится справа
if(tableRange.c1 > activeCells.c1 && (tableRange.r1 < activeCells.r1 || tableRange.r2 > activeCells.r2))
return false;
}
else
{
//если данный фильтр находится внизу
if(tableRange.r1 > activeCells.r1 && (tableRange.c1 < activeCells.c1 || tableRange.c2 > activeCells.c2))
return false;
}
}
//если сдвигаем данный фильтр
if(DeleteCellsAndShiftLeft && tableRange.c1 > activeCells.c1 && tableRange.r1 >= activeCells.r1 && tableRange.r2 <= activeCells.r2)
{
result = 'changeAutoFilter';
}
else if(DeleteCellsAndShiftTop && tableRange.r1 > activeCells.r1 && tableRange.c1 >= activeCells.c1 && tableRange.c2 <= activeCells.c2)
{
result = 'changeAutoFilter';
}
else if(InsertCellsAndShiftRight && tableRange.c1 >= activeCells.c1 && tableRange.r1 >= activeCells.r1 && tableRange.r2 <= activeCells.r2)
{
result = 'changeAutoFilter';
}
else if(InsertCellsAndShiftDown && tableRange.r1 >= activeCells.r1 && tableRange.c1 >= activeCells.c1 && tableRange.c2 <= activeCells.c2)
{
result = 'changeAutoFilter';
}
}
return result;
},
//при закрытии диалогового окна числового фильтра
_applyDigitalFilter: function(ar, autoFiltersObject) {
......@@ -6031,23 +6176,6 @@
}
}
}
},
_isEmptyRange: function(activeCells)
{
var ws = this.worksheet;
for(var n = activeCells.r1; n <= activeCells.r2; n++)
{
for(var k = activeCells.c1; k <= activeCells.c2; k++)
{
cell = ws.model._getCell(n,k);
if(cell.getValueWithoutFormat() != '')
{
return false;
}
}
}
return true;
}
};
......
......@@ -8024,8 +8024,13 @@
switch (val) {
case c_oAscInsertOptions.InsertCellsAndShiftRight:
functionModelAction = function () {
var isCheckChangeAutoFilter = t.autoFilters.isActiveCellsCrossHalfFTable(_updateRangeIns, c_oAscInsertOptions.InsertCellsAndShiftRight, prop);
if(!isCheckChangeAutoFilter)
return;
if (range.addCellsShiftRight()) {
fullRecalc = true;
if(isCheckChangeAutoFilter == 'changeAutoFilter')
t.autoFilters.insertColumn(prop, _updateRangeIns, arn);
t.cellCommentator.updateCommentsDependencies(true, val, _updateRangeIns);
t.objectRender.updateDrawingObject(true, val, _updateRangeIns);
}
......@@ -8039,8 +8044,13 @@
return;
case c_oAscInsertOptions.InsertCellsAndShiftDown:
functionModelAction = function () {
var isCheckChangeAutoFilter = t.autoFilters.isActiveCellsCrossHalfFTable(_updateRangeIns, c_oAscInsertOptions.InsertCellsAndShiftDown, prop);
if(!isCheckChangeAutoFilter)
return;
if (range.addCellsShiftBottom()) {
fullRecalc = true;
if(isCheckChangeAutoFilter == 'changeAutoFilter')
t.autoFilters.insertRows(prop,_updateRangeIns, _updateRangeIns);
t.cellCommentator.updateCommentsDependencies(true, val, _updateRangeIns);
t.objectRender.updateDrawingObject(true, val, _updateRangeIns);
}
......@@ -8097,12 +8107,23 @@
range = t.model.getRange3(_updateRangeDel.r1, _updateRangeDel.c1, _updateRangeDel.r2, _updateRangeDel.c2);
switch (val) {
case c_oAscDeleteOptions.DeleteCellsAndShiftLeft:
var isCheckChangeAutoFilter = t.autoFilters.isActiveCellsCrossHalfFTable(_updateRangeDel, c_oAscDeleteOptions.DeleteCellsAndShiftLeft, prop);
if(!isCheckChangeAutoFilter)
return;
functionModelAction = function () {
History.Create_NewPoint();
History.SetSelection(new asc_Range(_updateRangeDel.c1, 0, _updateRangeDel.c2, gc_nMaxRow0));
History.StartTransaction();
//t.autoFilters.isEmptyAutoFilters(arn);
if (range.deleteCellsShiftLeft()) {
fullRecalc = true;
if(isCheckChangeAutoFilter == 'changeAutoFilter')
t.autoFilters.insertColumn(prop, _updateRangeDel, arn);
t.cellCommentator.updateCommentsDependencies(false, val, _updateRangeDel);
t.objectRender.updateDrawingObject(false, val, _updateRangeDel);
}
History.EndTransaction();
};
if(bUndoRedo)
......@@ -8112,12 +8133,23 @@
gc_nMaxCol0, _updateRangeDel.r2), null, onChangeWorksheetCallback);
return;
case c_oAscDeleteOptions.DeleteCellsAndShiftTop:
var isCheckChangeAutoFilter = t.autoFilters.isActiveCellsCrossHalfFTable(_updateRangeDel, c_oAscDeleteOptions.DeleteCellsAndShiftTop, prop);
if(!isCheckChangeAutoFilter)
return;
functionModelAction = function () {
if (range.deleteCellsShiftUp()) {
fullRecalc = true;
t.cellCommentator.updateCommentsDependencies(false, val, _updateRangeDel);
t.objectRender.updateDrawingObject(false, val, _updateRangeDel);
}
History.Create_NewPoint();
History.SetSelection(new asc_Range(_updateRangeDel.c1, _updateRangeDel.r1, _updateRangeDel.c2, _updateRangeDel.r2));
History.StartTransaction();
//t.autoFilters.isEmptyAutoFilters(arn);
if (range.deleteCellsShiftUp()) {
fullRecalc = true;
if(isCheckChangeAutoFilter == 'changeAutoFilter')
t.autoFilters.insertRows(prop, _updateRangeDel, _updateRangeDel);
t.cellCommentator.updateCommentsDependencies(false, val, _updateRangeDel);
t.objectRender.updateDrawingObject(false, val, _updateRangeDel);
}
History.EndTransaction();
};
if(bUndoRedo)
......@@ -8132,8 +8164,8 @@
History.Create_NewPoint();
History.SetSelection(new asc_Range(_updateRangeDel.c1, 0, _updateRangeDel.c2, gc_nMaxRow0));
History.StartTransaction();
t.autoFilters.insertColumn(prop,_updateRangeDel, arn);
t.model.removeCols(_updateRangeDel.c1, _updateRangeDel.c2);
t.autoFilters.insertColumn(prop,_updateRangeDel, arn);
History.EndTransaction();
t.objectRender.updateDrawingObject(false, val, _updateRangeDel);
......@@ -8152,8 +8184,8 @@
History.Create_NewPoint();
History.SetSelection(new asc_Range(0, _updateRangeDel.r1, gc_nMaxCol0, _updateRangeDel.r2));
History.StartTransaction();
t.autoFilters.insertRows(prop,_updateRangeDel, arn);
t.model.removeRows(_updateRangeDel.r1, _updateRangeDel.r2);
t.autoFilters.insertRows(prop,_updateRangeDel, arn);
History.EndTransaction();
t.objectRender.updateDrawingObject(false, val, _updateRangeDel);
......
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