Commit 2025fe8d authored by Alexander.Trofimov's avatar Alexander.Trofimov

fix bug 33202

parent 7c46b97d
...@@ -371,7 +371,7 @@ CHistory.prototype.UndoRedoEnd = function (Point, oRedoObjectParam, bUndo) { ...@@ -371,7 +371,7 @@ CHistory.prototype.UndoRedoEnd = function (Point, oRedoObjectParam, bUndo) {
} }
for (i in Point.UpdateRigions) for (i in Point.UpdateRigions)
this.workbook.handlers.trigger("cleanCellCache", i, {'0': Point.UpdateRigions[i]}, false, true, oRedoObjectParam.bAddRemoveRowCol); this.workbook.handlers.trigger("cleanCellCache", i, {'0': Point.UpdateRigions[i]}, true, oRedoObjectParam.bAddRemoveRowCol);
for (i in oRedoObjectParam.oChangeWorksheetUpdate) for (i in oRedoObjectParam.oChangeWorksheetUpdate)
this.workbook.handlers.trigger("changeWorksheetUpdate", this.workbook.handlers.trigger("changeWorksheetUpdate",
......
...@@ -3179,7 +3179,7 @@ Workbook.prototype.getTableNameColumnByIndex = function(tableName, columnIndex){ ...@@ -3179,7 +3179,7 @@ Workbook.prototype.getTableNameColumnByIndex = function(tableName, columnIndex){
} }
} }
for (i in oCleanCellCacheArea) { for (i in oCleanCellCacheArea) {
this.handlers.trigger("cleanCellCache", i, oCleanCellCacheArea[i], AscCommonExcel.c_oAscCanChangeColWidth.none); this.handlers.trigger("cleanCellCache", i, oCleanCellCacheArea[i]);
} }
AscCommonExcel.g_oVLOOKUPCache.clean(); AscCommonExcel.g_oVLOOKUPCache.clean();
......
...@@ -689,10 +689,10 @@ ...@@ -689,10 +689,10 @@
} }
}); });
this.model.handlers.add("cleanCellCache", function(wsId, oRanges, canChangeColWidth, bLockDraw, updateHeight) { this.model.handlers.add("cleanCellCache", function(wsId, oRanges, bLockDraw, updateHeight) {
var ws = self.getWorksheetById(wsId, true); var ws = self.getWorksheetById(wsId, true);
if (ws) { if (ws) {
ws.updateRanges(oRanges, canChangeColWidth, bLockDraw || wsId != self.getWorksheet(self.wsActive).model.getId(), updateHeight); ws.updateRanges(oRanges, bLockDraw || wsId != self.getWorksheet(self.wsActive).model.getId(), updateHeight);
} }
}); });
this.model.handlers.add("changeWorksheetUpdate", function(wsId, val) { this.model.handlers.add("changeWorksheetUpdate", function(wsId, val) {
......
...@@ -4412,75 +4412,73 @@ ...@@ -4412,75 +4412,73 @@
} }
}; };
WorksheetView.prototype._addCellTextToCache = function ( col, row, canChangeColWidth ) { WorksheetView.prototype._addCellTextToCache = function (col, row, canChangeColWidth) {
var self = this; var self = this;
function makeFnIsGoodNumFormat( flags, width ) { function makeFnIsGoodNumFormat(flags, width) {
return function ( str ) { return function (str) {
return self.stringRender.measureString( str, flags, width ).width <= width; return self.stringRender.measureString(str, flags, width).width <= width;
}; };
} }
var c = this._getCell( col, row ); var c = this._getCell(col, row);
if ( null === c ) { if (null === c) {
return col; return col;
} }
var bUpdateScrollX = false; var bUpdateScrollX = false;
var bUpdateScrollY = false; var bUpdateScrollY = false;
// Проверка на увеличение колличества столбцов // Проверка на увеличение колличества столбцов
if ( col >= this.cols.length ) { if (col >= this.cols.length) {
bUpdateScrollX = this.expandColsOnScroll( /*isNotActive*/ false, /*updateColsCount*/ true ); bUpdateScrollX = this.expandColsOnScroll(/*isNotActive*/ false, /*updateColsCount*/ true);
} }
// Проверка на увеличение колличества строк // Проверка на увеличение колличества строк
if ( row >= this.rows.length ) { if (row >= this.rows.length) {
bUpdateScrollY = this.expandRowsOnScroll( /*isNotActive*/ false, /*updateRowsCount*/ true ); bUpdateScrollY = this.expandRowsOnScroll(/*isNotActive*/ false, /*updateRowsCount*/ true);
}
if ( bUpdateScrollX && bUpdateScrollY ) {
this.handlers.trigger( "reinitializeScroll" );
}
else if ( bUpdateScrollX ) {
this.handlers.trigger( "reinitializeScrollX" );
} }
else if ( bUpdateScrollY ) { if (bUpdateScrollX && bUpdateScrollY) {
this.handlers.trigger( "reinitializeScrollY" ); this.handlers.trigger("reinitializeScroll");
} else if (bUpdateScrollX) {
this.handlers.trigger("reinitializeScrollX");
} else if (bUpdateScrollY) {
this.handlers.trigger("reinitializeScrollY");
} }
var str, tm, isMerged = false, strCopy; var str, tm, isMerged = false, strCopy;
// Range для замерженной ячейки // Range для замерженной ячейки
var fl = this._getCellFlags( c ); var fl = this._getCellFlags(c);
var mc = fl.merged; var mc = fl.merged;
var fMergedColumns = false; // Замержены ли колонки (если да, то автоподбор ширины не должен работать) var fMergedColumns = false; // Замержены ли колонки (если да, то автоподбор ширины не должен работать)
var fMergedRows = false; // Замержены ли строки (если да, то автоподбор высоты не должен работать) var fMergedRows = false; // Замержены ли строки (если да, то автоподбор высоты не должен работать)
if ( null !== mc ) { if (null !== mc) {
if ( col !== mc.c1 || row !== mc.r1 ) { if (col !== mc.c1 || row !== mc.r1) {
// Проверим внесена ли первая ячейка в cache (иначе если была скрыта первая строка или первый столбец, то мы не внесем) // Проверим внесена ли первая ячейка в cache (иначе если была скрыта первая строка или первый столбец, то мы не внесем)
if (undefined === this._getCellTextCache(mc.c1, mc.r1, true)) { if (undefined === this._getCellTextCache(mc.c1, mc.r1, true)) {
return this._addCellTextToCache(mc.c1, mc.r1, canChangeColWidth); return this._addCellTextToCache(mc.c1, mc.r1, canChangeColWidth);
} }
return mc.c2; return mc.c2;
} // skip other merged cell from range } // skip other merged cell from range
if ( mc.c1 !== mc.c2 ) { if (mc.c1 !== mc.c2) {
fMergedColumns = true; fMergedColumns = true;
} }
if ( mc.r1 !== mc.r2 ) { if (mc.r1 !== mc.r2) {
fMergedRows = true; fMergedRows = true;
} }
isMerged = true; isMerged = true;
} }
var angle = c.getAngle(); var angle = c.getAngle();
if ( this._isCellEmptyTextString( c ) ) { if (this._isCellEmptyTextString(c)) {
if ( !angle && c.isNotDefaultFont() ) { if (!angle && c.isNotDefaultFont()) {
// Пустая ячейка с измененной гарнитурой или размером, учитвается в высоте // Пустая ячейка с измененной гарнитурой или размером, учитвается в высоте
str = c.getValue2(); str = c.getValue2();
if ( 0 < str.length ) { if (0 < str.length) {
// Без текста не будет толка // Без текста не будет толка
strCopy = [str[0].clone()]; strCopy = [str[0].clone()];
strCopy[0].text = 'A'; strCopy[0].text = 'A';
tm = this._roundTextMetrics( this.stringRender.measureString( strCopy, fl ) ); tm = this._roundTextMetrics(this.stringRender.measureString(strCopy, fl));
this._updateRowHeight( tm, col, row, isMerged, fMergedRows ); this._updateRowHeight(tm, col, row, isMerged, fMergedRows);
} }
} }
...@@ -4495,51 +4493,53 @@ ...@@ -4495,51 +4493,53 @@
var pad = this.width_padding * 2 + this.width_1px; var pad = this.width_padding * 2 + this.width_1px;
var sstr, sfl, stm; var sstr, sfl, stm;
if ( !this.cols[col].isCustomWidth && fl.isNumberFormat && !fMergedColumns && (c_oAscCanChangeColWidth.numbers === canChangeColWidth || c_oAscCanChangeColWidth.all === canChangeColWidth) ) { if (!this.cols[col].isCustomWidth && fl.isNumberFormat && !fMergedColumns &&
(c_oAscCanChangeColWidth.numbers === canChangeColWidth ||
c_oAscCanChangeColWidth.all === canChangeColWidth)) {
colWidth = this.cols[col].innerWidth; colWidth = this.cols[col].innerWidth;
// Измеряем целую часть числа // Измеряем целую часть числа
sstr = c.getValue2( gc_nMaxDigCountView, function () { sstr = c.getValue2(gc_nMaxDigCountView, function () {
return true; return true;
} ); });
if ( "General" === numFormatStr && c_oAscCanChangeColWidth.all !== canChangeColWidth ) { if ("General" === numFormatStr && c_oAscCanChangeColWidth.all !== canChangeColWidth) {
// asc.truncFracPart изменяет исходный массив, поэтому клонируем // asc.truncFracPart изменяет исходный массив, поэтому клонируем
var fragmentsTmp = []; var fragmentsTmp = [];
for ( var k = 0; k < sstr.length; ++k ) for (var k = 0; k < sstr.length; ++k) {
fragmentsTmp.push( sstr[k].clone() ); fragmentsTmp.push(sstr[k].clone());
sstr = asc.truncFracPart( fragmentsTmp ); }
sstr = asc.truncFracPart(fragmentsTmp);
} }
sfl = fl.clone(); sfl = fl.clone();
sfl.wrapText = false; sfl.wrapText = false;
stm = this._roundTextMetrics( this.stringRender.measureString( sstr, sfl, colWidth ) ); stm = this._roundTextMetrics(this.stringRender.measureString(sstr, sfl, colWidth));
// Если целая часть числа не убирается в ячейку, то расширяем столбец // Если целая часть числа не убирается в ячейку, то расширяем столбец
if ( stm.width > colWidth ) { if (stm.width > colWidth) {
this._changeColWidth( col, stm.width, pad ); this._changeColWidth(col, stm.width, pad);
} }
// Обновленная ячейка // Обновленная ячейка
dDigitsCount = this.cols[col].charCount; dDigitsCount = this.cols[col].charCount;
colWidth = this.cols[col].innerWidth; colWidth = this.cols[col].innerWidth;
} } else if (null === mc) {
else if ( null === mc ) {
// Обычная ячейка // Обычная ячейка
dDigitsCount = this.cols[col].charCount; dDigitsCount = this.cols[col].charCount;
colWidth = this.cols[col].innerWidth; colWidth = this.cols[col].innerWidth;
// подбираем ширину // подбираем ширину
if ( !this.cols[col].isCustomWidth && !fMergedColumns && !fl.wrapText && c_oAscCanChangeColWidth.all === canChangeColWidth ) { if (!this.cols[col].isCustomWidth && !fMergedColumns && !fl.wrapText &&
sstr = c.getValue2( gc_nMaxDigCountView, function () { c_oAscCanChangeColWidth.all === canChangeColWidth) {
sstr = c.getValue2(gc_nMaxDigCountView, function () {
return true; return true;
} ); });
stm = this._roundTextMetrics( this.stringRender.measureString( sstr, fl, colWidth ) ); stm = this._roundTextMetrics(this.stringRender.measureString(sstr, fl, colWidth));
if ( stm.width > colWidth ) { if (stm.width > colWidth) {
this._changeColWidth( col, stm.width, pad ); this._changeColWidth(col, stm.width, pad);
// Обновленная ячейка // Обновленная ячейка
dDigitsCount = this.cols[col].charCount; dDigitsCount = this.cols[col].charCount;
colWidth = this.cols[col].innerWidth; colWidth = this.cols[col].innerWidth;
} }
} }
} } else {
else {
// Замерженная ячейка, нужна сумма столбцов // Замерженная ячейка, нужна сумма столбцов
for ( var i = mc.c1; i <= mc.c2 && i < this.cols.length; ++i ) { for (var i = mc.c1; i <= mc.c2 && i < this.cols.length; ++i) {
colWidth += this.cols[i].width; colWidth += this.cols[i].width;
dDigitsCount += this.cols[i].charCount; dDigitsCount += this.cols[i].charCount;
} }
...@@ -4549,33 +4549,34 @@ ...@@ -4549,33 +4549,34 @@
var rowHeight = this.rows[row].height; var rowHeight = this.rows[row].height;
// ToDo dDigitsCount нужно рассчитывать исходя не из дефалтового шрифта и размера, а исходя из текущего шрифта и размера ячейки // ToDo dDigitsCount нужно рассчитывать исходя не из дефалтового шрифта и размера, а исходя из текущего шрифта и размера ячейки
str = c.getValue2( dDigitsCount, makeFnIsGoodNumFormat( fl, colWidth ) ); str = c.getValue2(dDigitsCount, makeFnIsGoodNumFormat(fl, colWidth));
var ha = c.getAlignHorizontalByValue().toLowerCase(); var ha = c.getAlignHorizontalByValue().toLowerCase();
var va = c.getAlignVertical().toLowerCase(); var va = c.getAlignVertical().toLowerCase();
var maxW = fl.wrapText || fl.shrinkToFit || isMerged || asc.isFixedWidthCell( str ) ? this._calcMaxWidth( col, row, mc ) : undefined; var maxW = fl.wrapText || fl.shrinkToFit || isMerged || asc.isFixedWidthCell(str) ?
tm = this._roundTextMetrics( this.stringRender.measureString( str, fl, maxW ) ); this._calcMaxWidth(col, row, mc) : undefined;
tm = this._roundTextMetrics(this.stringRender.measureString(str, fl, maxW));
var cto = (isMerged || fl.wrapText) ? { var cto = (isMerged || fl.wrapText) ? {
maxWidth: maxW - this.cols[col].innerWidth + this.cols[col].width, leftSide: 0, rightSide: 0 maxWidth: maxW - this.cols[col].innerWidth + this.cols[col].width, leftSide: 0, rightSide: 0
} : this._calcCellTextOffset( col, row, ha, tm.width ); } : this._calcCellTextOffset(col, row, ha, tm.width);
// check right side of cell text and append columns if it exceeds existing cells borders // check right side of cell text and append columns if it exceeds existing cells borders
if ( !isMerged ) { if (!isMerged) {
var rside = this.cols[col - cto.leftSide].left + tm.width; var rside = this.cols[col - cto.leftSide].left + tm.width;
var lc = this.cols[this.cols.length - 1]; var lc = this.cols[this.cols.length - 1];
if ( rside > lc.left + lc.width ) { if (rside > lc.left + lc.width) {
this._appendColumns( rside ); this._appendColumns(rside);
cto = this._calcCellTextOffset( col, row, ha, tm.width ); cto = this._calcCellTextOffset(col, row, ha, tm.width);
} }
} }
var oFontColor = c.getFontcolor(); var oFontColor = c.getFontcolor();
var textBound = {}; var textBound = {};
if ( angle ) { if (angle) {
// повернутый текст учитывает мерж ячеек по строкам // повернутый текст учитывает мерж ячеек по строкам
if ( fMergedRows ) { if (fMergedRows) {
rowHeight = 0; rowHeight = 0;
for ( var j = mc.r1; j <= mc.r2 && j < this.nRowsCount; ++j ) { for (var j = mc.r1; j <= mc.r2 && j < this.nRowsCount; ++j) {
rowHeight += this.rows[j].height; rowHeight += this.rows[j].height;
} }
} }
...@@ -4584,20 +4585,20 @@ ...@@ -4584,20 +4585,20 @@
if (fl.wrapText) { if (fl.wrapText) {
if (this.rows[row].isCustomHeight) { if (this.rows[row].isCustomHeight) {
tm = this._roundTextMetrics( this.stringRender.measureString( str, fl, rowHeight ) ); tm = this._roundTextMetrics(this.stringRender.measureString(str, fl, rowHeight));
textBound = this.stringRender.getTransformBound( angle, colWidth, rowHeight, tm.width, ha, va, rowHeight); textBound =
} this.stringRender.getTransformBound(angle, colWidth, rowHeight, tm.width, ha, va, rowHeight);
else { } else {
if (!fMergedRows) { if (!fMergedRows) {
rowHeight = tm.height; rowHeight = tm.height;
} }
tm = this._roundTextMetrics( this.stringRender.measureString( str, fl, rowHeight ) ); tm = this._roundTextMetrics(this.stringRender.measureString(str, fl, rowHeight));
textBound = this.stringRender.getTransformBound( angle, colWidth, rowHeight, tm.width, ha, va, tm.width); textBound =
this.stringRender.getTransformBound(angle, colWidth, rowHeight, tm.width, ha, va, tm.width);
} }
} } else {
else { textBound = this.stringRender.getTransformBound(angle, colWidth, rowHeight, textW, ha, va, maxW);
textBound = this.stringRender.getTransformBound( angle, colWidth, rowHeight, textW, ha, va, maxW);
} }
// NOTE: если проекция строчки на Y больше высоты ячейки подставлять # и рисовать все по центру // NOTE: если проекция строчки на Y больше высоты ячейки подставлять # и рисовать все по центру
...@@ -4619,29 +4620,29 @@ ...@@ -4619,29 +4620,29 @@
// } // }
} }
this._fetchCellCache( col, row ).text = { this._fetchCellCache(col, row).text = {
state : this.stringRender.getInternalState(), state: this.stringRender.getInternalState(),
flags : fl, flags: fl,
color : (oFontColor || this.settings.cells.defaultState.color), color: (oFontColor || this.settings.cells.defaultState.color),
metrics : tm, metrics: tm,
cellW : cto.maxWidth, cellW: cto.maxWidth,
cellHA : ha, cellHA: ha,
cellVA : va, cellVA: va,
sideL : cto.leftSide, sideL: cto.leftSide,
sideR : cto.rightSide, sideR: cto.rightSide,
cellType : cellType, cellType: cellType,
isFormula: c.isFormula(), isFormula: c.isFormula(),
angle : angle, angle: angle,
textBound: textBound textBound: textBound
}; };
this._fetchCellCacheText( col, row ).hasText = true; this._fetchCellCacheText(col, row).hasText = true;
if ( !angle && (cto.leftSide !== 0 || cto.rightSide !== 0) ) { if (!angle && (cto.leftSide !== 0 || cto.rightSide !== 0)) {
this._addErasedBordersToCache( col - cto.leftSide, col + cto.rightSide, row ); this._addErasedBordersToCache(col - cto.leftSide, col + cto.rightSide, row);
} }
this._updateRowHeight( tm, col, row, fl, isMerged, fMergedRows, va, ha, angle, maxW, colWidth, textBound ); this._updateRowHeight(tm, col, row, fl, isMerged, fMergedRows, va, ha, angle, maxW, colWidth, textBound);
return mc ? mc.c2 : col; return mc ? mc.c2 : col;
}; };
...@@ -8486,25 +8487,25 @@ ...@@ -8486,25 +8487,25 @@
} }
var t = this; var t = this;
var checkRange = null; var checkRange = [];
var activeCell = this.model.selectionRange.activeCell.clone(); var activeCell = this.model.selectionRange.activeCell.clone();
var arn = this.model.selectionRange.getLast().clone(true); var arn = this.model.selectionRange.getLast().clone(true);
if (onlyActive) { if (onlyActive) {
checkRange = checkRange.push(new asc_Range(activeCell.col, activeCell.row, activeCell.col, activeCell.row));
new asc_Range(activeCell.col, activeCell.row, activeCell.col, activeCell.row);
} else { } else {
checkRange = arn.getAllRange(); this.model.selectionRange.ranges.forEach(function (item) {
checkRange.push(item.getAllRange());
});
} }
var onSelectionCallback = function (isSuccess) { var onSelectionCallback = function (isSuccess) {
if (false === isSuccess) { if (false === isSuccess) {
return; return;
} }
var range = t.model.getRange3(checkRange.r1, checkRange.c1, checkRange.r2, checkRange.c2);
var canChangeColWidth = c_oAscCanChangeColWidth.none;
var bIsUpdate = true; var bIsUpdate = true;
var oUpdateRanges = {}, hasUpdates = false;
var isLargeRange = t._isLargeRange(range.bbox), callTrigger = false; var callTrigger = false;
var res; var res;
var mc, r, c, cell; var mc, r, c, cell;
...@@ -8528,228 +8529,240 @@ ...@@ -8528,228 +8529,240 @@
History.Create_NewPoint(); History.Create_NewPoint();
History.StartTransaction(); History.StartTransaction();
switch (prop) { checkRange.forEach(function (item, i) {
case "fn": var range = t.model.getRange3(item.r1, item.c1, item.r2, item.c2);
range.setFontname(val); var isLargeRange = t._isLargeRange(range.bbox);
canChangeColWidth = c_oAscCanChangeColWidth.numbers; var canChangeColWidth = c_oAscCanChangeColWidth.none;
break;
case "fs": switch (prop) {
range.setFontsize(val); case "fn":
canChangeColWidth = c_oAscCanChangeColWidth.numbers; range.setFontname(val);
break; canChangeColWidth = c_oAscCanChangeColWidth.numbers;
case "b":
range.setBold(val);
break;
case "i":
range.setItalic(val);
break;
case "u":
range.setUnderline(val);
break;
case "s":
range.setStrikeout(val);
break;
case "fa":
range.setFontAlign(val);
break;
case "a":
range.setAlignHorizontal(val);
break;
case "va":
range.setAlignVertical(val);
break;
case "c":
range.setFontcolor(val);
break;
case "bc":
range.setFill((val) ? (val) : null);
break; // ToDo можно делать просто отрисовку
case "wrap":
range.setWrap(val);
break;
case "shrink":
range.setShrinkToFit(val);
break;
case "value":
range.setValue(val);
break;
case "format":
range.setNumFormat(val);
canChangeColWidth = c_oAscCanChangeColWidth.numbers;
break;
case "angle":
range.setAngle(val);
break;
case "rh":
range.removeHyperlink(null, true);
break;
case "border":
if (isLargeRange) {
callTrigger = true;
t.handlers.trigger("slowOperation", true);
}
// None
if (val.length < 1) {
range.setBorder(null);
break; break;
} case "fs":
res = new AscCommonExcel.Border(); range.setFontsize(val);
// Diagonal canChangeColWidth = c_oAscCanChangeColWidth.numbers;
res.d = makeBorder(val[c_oAscBorderOptions.DiagD] || val[c_oAscBorderOptions.DiagU]); break;
res.dd = val[c_oAscBorderOptions.DiagD] ? true : false; case "b":
res.du = val[c_oAscBorderOptions.DiagU] ? true : false; range.setBold(val);
// Vertical break;
res.l = makeBorder(val[c_oAscBorderOptions.Left]); case "i":
res.iv = makeBorder(val[c_oAscBorderOptions.InnerV]); range.setItalic(val);
res.r = makeBorder(val[c_oAscBorderOptions.Right]); break;
// Horizontal case "u":
res.t = makeBorder(val[c_oAscBorderOptions.Top]); range.setUnderline(val);
res.ih = makeBorder(val[c_oAscBorderOptions.InnerH]); break;
res.b = makeBorder(val[c_oAscBorderOptions.Bottom]); case "s":
// Change border range.setStrikeout(val);
range.setBorder(res); break;
break; case "fa":
case "merge": range.setFontAlign(val);
if (isLargeRange) { break;
callTrigger = true; case "a":
t.handlers.trigger("slowOperation", true); range.setAlignHorizontal(val);
} break;
switch (val) { case "va":
case c_oAscMergeOptions.MergeCenter: range.setAlignVertical(val);
case c_oAscMergeOptions.Merge: break;
range.merge(val); case "c":
t.cellCommentator.mergeComments(range.getBBox0()); range.setFontcolor(val);
break; break;
case c_oAscMergeOptions.Unmerge: case "bc":
range.unmerge(); range.setFill((val) ? (val) : null);
break; break; // ToDo можно делать просто отрисовку
case c_oAscMergeOptions.MergeAcross: case "wrap":
for (res = arn.r1; res <= arn.r2; ++res) { range.setWrap(val);
t.model.getRange3(res, arn.c1, res, arn.c2).merge(val); break;
cell = new asc_Range(arn.c1, res, arn.c2, res); case "shrink":
t.cellCommentator.mergeComments(cell); range.setShrinkToFit(val);
} break;
case "value":
range.setValue(val);
break;
case "format":
range.setNumFormat(val);
canChangeColWidth = c_oAscCanChangeColWidth.numbers;
break;
case "angle":
range.setAngle(val);
break;
case "rh":
range.removeHyperlink(null, true);
break;
case "border":
if (isLargeRange) {
callTrigger = true;
t.handlers.trigger("slowOperation", true);
}
// None
if (val.length < 1) {
range.setBorder(null);
break; break;
} }
break; res = new AscCommonExcel.Border();
// Diagonal
case "sort": res.d = makeBorder(val[c_oAscBorderOptions.DiagD] || val[c_oAscBorderOptions.DiagU]);
if (isLargeRange) { res.dd = val[c_oAscBorderOptions.DiagD] ? true : false;
callTrigger = true; res.du = val[c_oAscBorderOptions.DiagU] ? true : false;
t.handlers.trigger("slowOperation", true); // Vertical
} res.l = makeBorder(val[c_oAscBorderOptions.Left]);
t.cellCommentator.sortComments(range.sort(val, activeCell.col, sortColor, true)); res.iv = makeBorder(val[c_oAscBorderOptions.InnerV]);
break; res.r = makeBorder(val[c_oAscBorderOptions.Right]);
// Horizontal
res.t = makeBorder(val[c_oAscBorderOptions.Top]);
res.ih = makeBorder(val[c_oAscBorderOptions.InnerH]);
res.b = makeBorder(val[c_oAscBorderOptions.Bottom]);
// Change border
range.setBorder(res);
break;
case "merge":
if (isLargeRange) {
callTrigger = true;
t.handlers.trigger("slowOperation", true);
}
switch (val) {
case c_oAscMergeOptions.MergeCenter:
case c_oAscMergeOptions.Merge:
range.merge(val);
t.cellCommentator.mergeComments(range.getBBox0());
break;
case c_oAscMergeOptions.Unmerge:
range.unmerge();
break;
case c_oAscMergeOptions.MergeAcross:
for (res = arn.r1; res <= arn.r2; ++res) {
t.model.getRange3(res, arn.c1, res, arn.c2).merge(val);
cell = new asc_Range(arn.c1, res, arn.c2, res);
t.cellCommentator.mergeComments(cell);
}
break;
}
break;
case "empty": case "sort":
if (isLargeRange) { if (isLargeRange) {
callTrigger = true; callTrigger = true;
t.handlers.trigger("slowOperation", true); t.handlers.trigger("slowOperation", true);
} }
/* отключаем отрисовку на случай необходимости пересчета ячеек, заносим ячейку, при необходимости в список перерисовываемых */ t.cellCommentator.sortComments(range.sort(val, activeCell.col, sortColor, true));
t.model.workbook.lockDraw(); break;
// Если нужно удалить автофильтры - удаляем
if (val === c_oAscCleanOptions.All || val === c_oAscCleanOptions.Text) {
t.model.autoFilters.isEmptyAutoFilters(arn);
} else if (val === c_oAscCleanOptions.Format) {
t.model.autoFilters.cleanFormat(arn);
}
if (val === c_oAscCleanOptions.All) {
range.cleanAll();
// Удаляем комментарии
t.cellCommentator.deleteCommentsRange(arn);
} else if (val === c_oAscCleanOptions.Text || val === c_oAscCleanOptions.Formula) {
range.cleanText();
} else if (val === c_oAscCleanOptions.Format) {
range.cleanFormat();
} else if (val === c_oAscCleanOptions.Comments) {
t.cellCommentator.deleteCommentsRange(arn);
} else if (val === c_oAscCleanOptions.Hyperlinks) {
range.cleanHyperlinks();
}
// Вызываем функцию пересчета для заголовков форматированной таблицы
if (val === c_oAscCleanOptions.All || val === c_oAscCleanOptions.Text) {
t.model.autoFilters.renameTableColumn(arn);
}
/* возвращаем отрисовку. и перерисовываем ячейки с предварительным пересчетом */ case "empty":
t.model.workbook.unLockDraw(); if (isLargeRange) {
t.model.workbook.buildRecalc(); callTrigger = true;
break; t.handlers.trigger("slowOperation", true);
}
/* отключаем отрисовку на случай необходимости пересчета ячеек, заносим ячейку, при необходимости в список перерисовываемых */
t.model.workbook.lockDraw();
// Если нужно удалить автофильтры - удаляем
if (val === c_oAscCleanOptions.All || val === c_oAscCleanOptions.Text) {
t.model.autoFilters.isEmptyAutoFilters(arn);
} else if (val === c_oAscCleanOptions.Format) {
t.model.autoFilters.cleanFormat(arn);
}
case "changeDigNum": if (val === c_oAscCleanOptions.All) {
res = t.cols.slice(arn.c1, arn.c2 + 1).reduce(function (r, c) { range.cleanAll();
r.push(c.charCount); // Удаляем комментарии
return r; t.cellCommentator.deleteCommentsRange(arn);
}, []); } else if (val === c_oAscCleanOptions.Text || val === c_oAscCleanOptions.Formula) {
range.shiftNumFormat(val, res); range.cleanText();
canChangeColWidth = c_oAscCanChangeColWidth.numbers; } else if (val === c_oAscCleanOptions.Format) {
break; range.cleanFormat();
case "changeFontSize": } else if (val === c_oAscCleanOptions.Comments) {
mc = t.model.getMergedByCell(activeCell.row, activeCell.col); t.cellCommentator.deleteCommentsRange(arn);
c = mc ? mc.c1 : activeCell.col; } else if (val === c_oAscCleanOptions.Hyperlinks) {
r = mc ? mc.r1 : activeCell.row; range.cleanHyperlinks();
cell = t._getVisibleCell(c, r);
if (undefined !== cell) {
var oldFontSize = cell.getFontsize();
var newFontSize = asc_incDecFonSize(val, oldFontSize);
if (null !== newFontSize) {
range.setFontsize(newFontSize);
canChangeColWidth = c_oAscCanChangeColWidth.numbers;
} }
}
break; // Вызываем функцию пересчета для заголовков форматированной таблицы
case "style": if (val === c_oAscCleanOptions.All || val === c_oAscCleanOptions.Text) {
range.setCellStyle(val); t.model.autoFilters.renameTableColumn(arn);
canChangeColWidth = c_oAscCanChangeColWidth.numbers;
break;
break;
case "paste":
// Вставляем текст из локального буфера или нет
isLocal ? t._pasteData(isLargeRange, isLocal, val, bIsUpdate, canChangeColWidth) :
t._loadDataBeforePaste(isLargeRange, isLocal, val, bIsUpdate, canChangeColWidth);
bIsUpdate = false;
break;
case "hyperlink":
if (val && val.hyperlinkModel) {
if (Asc.c_oAscHyperlinkType.RangeLink === val.asc_getType()) {
var hyperlinkRangeTmp = t.model.getRange2(val.asc_getRange());
if (null === hyperlinkRangeTmp) {
bIsUpdate = false;
break;
}
} }
val.hyperlinkModel.Ref = range;
range.setHyperlink(val.hyperlinkModel); /* возвращаем отрисовку. и перерисовываем ячейки с предварительным пересчетом */
// Вставим текст в активную ячейку (а не так, как MSExcel в первую ячейку диапазона) t.model.workbook.unLockDraw();
t.model.workbook.buildRecalc();
break;
case "changeDigNum":
res = t.cols.slice(arn.c1, arn.c2 + 1).reduce(function (r, c) {
r.push(c.charCount);
return r;
}, []);
range.shiftNumFormat(val, res);
canChangeColWidth = c_oAscCanChangeColWidth.numbers;
break;
case "changeFontSize":
mc = t.model.getMergedByCell(activeCell.row, activeCell.col); mc = t.model.getMergedByCell(activeCell.row, activeCell.col);
c = mc ? mc.c1 : activeCell.col; c = mc ? mc.c1 : activeCell.col;
r = mc ? mc.r1 : activeCell.row; r = mc ? mc.r1 : activeCell.row;
if (null !== val.asc_getText()) { cell = t._getVisibleCell(c, r);
t.model.getRange3(r, c, r, c).setValue(val.asc_getText()); if (undefined !== cell) {
// Вызываем функцию пересчета для заголовков форматированной таблицы var oldFontSize = cell.getFontsize();
t.model.autoFilters.renameTableColumn(arn); var newFontSize = asc_incDecFonSize(val, oldFontSize);
if (null !== newFontSize) {
range.setFontsize(newFontSize);
canChangeColWidth = c_oAscCanChangeColWidth.numbers;
}
} }
break; break;
} else { case "style":
range.setCellStyle(val);
canChangeColWidth = c_oAscCanChangeColWidth.numbers;
break;
break;
case "paste":
// Вставляем текст из локального буфера или нет
isLocal ? t._pasteData(isLargeRange, isLocal, val, bIsUpdate, canChangeColWidth) :
t._loadDataBeforePaste(isLargeRange, isLocal, val, bIsUpdate, canChangeColWidth);
bIsUpdate = false; bIsUpdate = false;
break; break;
} case "hyperlink":
if (val && val.hyperlinkModel) {
if (Asc.c_oAscHyperlinkType.RangeLink === val.asc_getType()) {
var hyperlinkRangeTmp = t.model.getRange2(val.asc_getRange());
if (null === hyperlinkRangeTmp) {
bIsUpdate = false;
break;
}
}
val.hyperlinkModel.Ref = range;
range.setHyperlink(val.hyperlinkModel);
// Вставим текст в активную ячейку (а не так, как MSExcel в первую ячейку диапазона)
mc = t.model.getMergedByCell(activeCell.row, activeCell.col);
c = mc ? mc.c1 : activeCell.col;
r = mc ? mc.r1 : activeCell.row;
if (null !== val.asc_getText()) {
t.model.getRange3(r, c, r, c).setValue(val.asc_getText());
// Вызываем функцию пересчета для заголовков форматированной таблицы
t.model.autoFilters.renameTableColumn(arn);
}
break;
} else {
bIsUpdate = false;
break;
}
default: default:
bIsUpdate = false; bIsUpdate = false;
break; break;
} }
if (bIsUpdate) { if (bIsUpdate) {
if (callTrigger) { hasUpdates = true;
t.handlers.trigger("slowOperation", false); oUpdateRanges[i] = item;
oUpdateRanges[i].canChangeColWidth = canChangeColWidth;
bIsUpdate = false;
} }
t.isChanged = true; });
t._updateCellsRange(arn, canChangeColWidth);
if (hasUpdates) {
t.updateRanges(oUpdateRanges, false, true);
}
if (callTrigger) {
t.handlers.trigger("slowOperation", false);
} }
//в случае, если вставляем из глобального буфера, транзакцию закрываем внутри функции _loadDataBeforePaste на callbacks от загрузки шрифтов и картинок //в случае, если вставляем из глобального буфера, транзакцию закрываем внутри функции _loadDataBeforePaste на callbacks от загрузки шрифтов и картинок
...@@ -8760,9 +8773,9 @@ ...@@ -8760,9 +8773,9 @@
if ("paste" === prop && val.onlyImages !== true) { if ("paste" === prop && val.onlyImages !== true) {
// Для past свой диапазон // Для past свой диапазон
if (isLocal === "binary") { if (isLocal === "binary") {
checkRange = t._pasteFromBinary(val, true); checkRange.push(this._pasteFromBinary(val, true));
} else { } else {
checkRange = t._pasteFromHTML(val, true); checkRange.push(this._pasteFromHTML(val, true));
} }
} }
if ("paste" === prop && val.onlyImages === true) { if ("paste" === prop && val.onlyImages === true) {
...@@ -11121,11 +11134,11 @@ ...@@ -11121,11 +11134,11 @@
* @param lockDraw * @param lockDraw
* @param updateHeight * @param updateHeight
*/ */
WorksheetView.prototype.updateRanges = function (ranges, canChangeColWidth, lockDraw, updateHeight) { WorksheetView.prototype.updateRanges = function (ranges, lockDraw, updateHeight) {
var arrRanges = [], range; var arrRanges = [], range;
for (var i in ranges) { for (var i in ranges) {
range = ranges[i]; range = ranges[i];
this.updateRange(range, canChangeColWidth, true); this.updateRange(range, range.canChangeColWidth || c_oAscCanChangeColWidth.none, true);
arrRanges.push(range); arrRanges.push(range);
} }
......
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