Commit 960132dd authored by Alexander.Trofimov's avatar Alexander.Trofimov Committed by Alexander.Trofimov

Поправил выставление оптимальной ширины колонки (обновляем только если изменилась ширина)

Заделал реализацию функции _onEndAddFormatTable (для бага http://bugzserver/show_bug.cgi?id=26772)

git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@58648 954022d7-b5bf-4e40-9824-e11837661b57
parent fef47f36
...@@ -9827,94 +9827,105 @@ ...@@ -9827,94 +9827,105 @@
return (nLastRows !== this.nRowsCount || bIsMaxRows); return (nLastRows !== this.nRowsCount || bIsMaxRows);
}; };
WorksheetView.prototype.optimizeColWidth = function (col) { WorksheetView.prototype.onChangeWidthCallback = function (col, r1, r2, onlyIfMore) {
var t = this; var width = null;
var row, ct, c, fl, str, maxW, tm, mc, isMerged, oldWidth, oldColWidth;
var onChangeWidthCallback = function (isSuccess) { var lastHeight = null;
if (false === isSuccess) var filterButton = null;
return; if (null == r1)
r1 = 0;
var width = null; if (null == r2)
var row, ct, c, fl, str, maxW, tm, mc, isMerged; r2 = this.rows.length - 1;
var oldWidth;
var lastHeight = null; oldColWidth = this.cols[col].charCount;
var filterButton = null;
this.cols[col].isCustomWidth = false;
t.cols[col].isCustomWidth = false; for (row = r1; row <= r2; ++row) {
// пересчет метрик текста
for (row = 0; row < t.rows.length; ++row) { this._addCellTextToCache(col, row, /*canChangeColWidth*/c_oAscCanChangeColWidth.all);
// пересчет метрик текста ct = this._getCellTextCache(col, row);
t._addCellTextToCache(col, row, /*canChangeColWidth*/c_oAscCanChangeColWidth.all); if (ct === undefined) {continue;}
ct = t._getCellTextCache(col, row); fl = ct.flags;
if (ct === undefined) {continue;} isMerged = fl.isMerged();
fl = ct.flags; if (isMerged) {
isMerged = fl.isMerged(); mc = fl.merged;
if (isMerged) { // Для замерженных ячеек (с 2-мя или более колонками) оптимизировать не нужно
mc = fl.merged; if (mc.c1 !== mc.c2)
// Для замерженных ячеек (с 2-мя или более колонками) оптимизировать не нужно continue;
if (mc.c1 !== mc.c2) }
continue;
}
if (ct.metrics.height > t.maxRowHeight) { if (ct.metrics.height > this.maxRowHeight) {
if (isMerged) {continue;} if (isMerged) {continue;}
// Запоминаем старую ширину (в случае, если у нас по высоте не уберется) // Запоминаем старую ширину (в случае, если у нас по высоте не уберется)
oldWidth = ct.metrics.width; oldWidth = ct.metrics.width;
lastHeight = null; lastHeight = null;
// вычисление новой ширины столбца, чтобы высота текста была меньше maxRowHeight // вычисление новой ширины столбца, чтобы высота текста была меньше maxRowHeight
c = t._getCell(col, row); c = this._getCell(col, row);
str = c.getValue2(); str = c.getValue2();
maxW = ct.metrics.width + t.maxDigitWidth; maxW = ct.metrics.width + this.maxDigitWidth;
while (1) { while (1) {
tm = t._roundTextMetrics(t.stringRender.measureString(str, fl, maxW)); tm = this._roundTextMetrics(this.stringRender.measureString(str, fl, maxW));
if (tm.height <= t.maxRowHeight) {break;} if (tm.height <= this.maxRowHeight) {break;}
if (lastHeight === tm.height) { if (lastHeight === tm.height) {
// Ситуация, когда у нас текст не уберется по высоте (http://bugzserver/show_bug.cgi?id=19974) // Ситуация, когда у нас текст не уберется по высоте (http://bugzserver/show_bug.cgi?id=19974)
tm.width = oldWidth; tm.width = oldWidth;
break; break;
}
lastHeight = tm.height;
maxW += t.maxDigitWidth;
} }
width = Math.max(width, tm.width); lastHeight = tm.height;
} else { maxW += this.maxDigitWidth;
filterButton = t.autoFilters.getSizeButton({c1: col, r1: row});
if (null !== filterButton && CellValueType.String === ct.cellType)
width = Math.max(width, ct.metrics.width + filterButton.width);
else
width = Math.max(width, ct.metrics.width);
} }
} width = Math.max(width, tm.width);
if (width > 0) {
var pad = t.width_padding * 2 + t.width_1px;
var cc = Math.min(t._colWidthToCharCount(width + pad), /*max col width*/255);
var cw = t._charCountToModelColWidth(cc);
} else { } else {
cw = gc_dDefaultColWidthCharsAttribute; filterButton = this.autoFilters.getSizeButton({c1: col, r1: row});
if (null !== filterButton && CellValueType.String === ct.cellType)
width = Math.max(width, ct.metrics.width + filterButton.width);
else
width = Math.max(width, ct.metrics.width);
} }
}
History.Create_NewPoint(); var cc;
var oSelection = History.GetSelection(); if (width > 0) {
if (null != oSelection) { var pad = this.width_padding * 2 + this.width_1px;
oSelection = oSelection.clone(); cc = Math.min(this._colWidthToCharCount(width + pad), /*max col width*/255);
oSelection.assign(col, 0, col, gc_nMaxRow0); var cw = this._charCountToModelColWidth(cc);
oSelection.type = c_oAscSelectionType.RangeCol; } else {
History.SetSelection(oSelection); cw = gc_dDefaultColWidthCharsAttribute;
History.SetSelectionRedo(oSelection); cc = this.defaultColWidthChars;
} }
History.StartTransaction();
// Выставляем, что это bestFit
t.model.setColBestFit(true, cw, col, col);
History.EndTransaction();
t.nColsCount = 0; if (onlyIfMore && cc < oldColWidth)
t._calcColumnWidths(/*fullRecalc*/0); return false;
t._updateVisibleColsCount();
t._cleanCache(new asc_Range(col, 0, col, t.rows.length - 1)); History.Create_NewPoint();
t.changeWorksheet("update"); var oSelection = History.GetSelection();
}; if (null != oSelection) {
return this._isLockedAll (onChangeWidthCallback); oSelection = oSelection.clone();
oSelection.assign(col, 0, col, gc_nMaxRow0);
oSelection.type = c_oAscSelectionType.RangeCol;
History.SetSelection(oSelection);
History.SetSelectionRedo(oSelection);
}
History.StartTransaction();
// Выставляем, что это bestFit
this.model.setColBestFit(true, cw, col, col);
History.EndTransaction();
return oldColWidth !== cc;
};
WorksheetView.prototype.optimizeColWidth = function (col) {
var t = this;
return this._isLockedAll (function (isSuccess) {
if (false === isSuccess)
return;
if (t.onChangeWidthCallback(col, null, null)) {
t.nColsCount = 0;
t._calcColumnWidths(/*fullRecalc*/0);
t._updateVisibleColsCount();
t._cleanCache(new asc_Range(col, 0, col, t.rows.length - 1));
t.changeWorksheet("update");
}
});
}; };
WorksheetView.prototype.optimizeRowHeight = function (row) { WorksheetView.prototype.optimizeRowHeight = function (row) {
...@@ -10776,8 +10787,21 @@ ...@@ -10776,8 +10787,21 @@
}; };
// При добавлении форматированной таблицы расширяем, автоподбор по названию столбца // При добавлении форматированной таблицы расширяем, автоподбор по названию столбца
WorksheetView.prototype._onEndAddFormatTable = function () { WorksheetView.prototype._onEndAddFormatTable = function (range) {
var i, r = range.r1, bIsUpdate = false;
for (i = range.c1; i < range.c2; ++i) {
if (t.onChangeWidthCallback(i, r, r, /*onlyIfMore*/true)) {
this._cleanCache(new asc_Range(i, 0, i, this.rows.length - 1));
bIsUpdate = true;
}
}
if (bIsUpdate) {
this.nColsCount = 0;
this._calcColumnWidths(/*fullRecalc*/0);
this._updateVisibleColsCount();
this.changeWorksheet("update");
}
}; };
WorksheetView.prototype._loadFonts = function (fonts, callback) { WorksheetView.prototype._loadFonts = function (fonts, callback) {
......
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