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 ) { if (bUpdateScrollX && bUpdateScrollY) {
this.handlers.trigger( "reinitializeScrollX" ); this.handlers.trigger("reinitializeScroll");
} } else if (bUpdateScrollX) {
else if ( bUpdateScrollY ) { this.handlers.trigger("reinitializeScrollX");
this.handlers.trigger( "reinitializeScrollY" ); } 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,6 +8529,11 @@ ...@@ -8528,6 +8529,11 @@
History.Create_NewPoint(); History.Create_NewPoint();
History.StartTransaction(); History.StartTransaction();
checkRange.forEach(function (item, i) {
var range = t.model.getRange3(item.r1, item.c1, item.r2, item.c2);
var isLargeRange = t._isLargeRange(range.bbox);
var canChangeColWidth = c_oAscCanChangeColWidth.none;
switch (prop) { switch (prop) {
case "fn": case "fn":
range.setFontname(val); range.setFontname(val);
...@@ -8745,12 +8751,19 @@ ...@@ -8745,12 +8751,19 @@
} }
if (bIsUpdate) { if (bIsUpdate) {
hasUpdates = true;
oUpdateRanges[i] = item;
oUpdateRanges[i].canChangeColWidth = canChangeColWidth;
bIsUpdate = false;
}
});
if (hasUpdates) {
t.updateRanges(oUpdateRanges, false, true);
}
if (callTrigger) { if (callTrigger) {
t.handlers.trigger("slowOperation", false); t.handlers.trigger("slowOperation", false);
} }
t.isChanged = true;
t._updateCellsRange(arn, canChangeColWidth);
}
//в случае, если вставляем из глобального буфера, транзакцию закрываем внутри функции _loadDataBeforePaste на callbacks от загрузки шрифтов и картинок //в случае, если вставляем из глобального буфера, транзакцию закрываем внутри функции _loadDataBeforePaste на callbacks от загрузки шрифтов и картинок
if (prop !== "paste" || (prop === "paste" && isLocal)) { if (prop !== "paste" || (prop === "paste" && isLocal)) {
...@@ -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