Commit 031d05af authored by Alexander.Trofimov's avatar Alexander.Trofimov Committed by Alexander.Trofimov

Окончательный переход на getMergedByCell (убрал лишние функции работы с...

Окончательный переход на getMergedByCell (убрал лишние функции работы с локальным кешем замерженных ячеек)

git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@50543 954022d7-b5bf-4e40-9824-e11837661b57
parent 4908734d
...@@ -266,16 +266,10 @@ ...@@ -266,16 +266,10 @@
} }
this.rows = {}; this.rows = {};
this.mergedCells = {
index: {},
ranges: []
};
this.sectors = []; this.sectors = [];
this.reset = function () { this.reset = function () {
this.rows = {}; this.rows = {};
this.mergedCells.index = {};
this.mergedCells.ranges = [];
this.sectors = []; this.sectors = [];
}; };
...@@ -316,20 +310,6 @@ ...@@ -316,20 +310,6 @@
// } // }
// }, // },
// //
// mergedCells : {
// index : {
// "row-col" : Number
// },
// ranges: [
// {
// c1 : Number,
// r1 : Number,
// c2 : Number,
// r2 : Number
// }
// ]
// },
//
// sectors: [ // sectors: [
// 0 : Range // 0 : Range
// ] // ]
...@@ -2294,7 +2274,7 @@ ...@@ -2294,7 +2274,7 @@
for (var col = colStart; col <= colEnd; ++col) { for (var col = colStart; col <= colEnd; ++col) {
if (this.cols[col].width < this.width_1px) {continue;} if (this.cols[col].width < this.width_1px) {continue;}
mc = this._drawCellText(drawingCtx, col, row, colStart, colEnd, offsetX, offsetY, false); mc = this._drawCellText(drawingCtx, col, row, colStart, colEnd, offsetX, offsetY, false);
if (mc !== null) {mergedCells[mc.index] = {col: mc.col, row: mc.row};} if (mc !== null) {mergedCells[mc.index] = {c1: mc.c1, r1: mc.r1, c2: mc.c2, r2: mc.r2};}
// check if long text overlaps this cell // check if long text overlaps this cell
i = this._findSourceOfCellText(col, row); i = this._findSourceOfCellText(col, row);
if (i >= 0) { if (i >= 0) {
...@@ -2333,8 +2313,8 @@ ...@@ -2333,8 +2313,8 @@
var ctx = (undefined === drawingCtx) ? this.drawingCtx : drawingCtx; var ctx = (undefined === drawingCtx) ? this.drawingCtx : drawingCtx;
if (isMerged) { if (isMerged) {
range = this._getMergedCellsRange(col, row); range = ct.mc;
if (!drawMergedCells) {return {col: range.c1, row: range.r1, index: range.r1 + "_" + range.c1};} if (!drawMergedCells) {return {c1: range.c1, r1: range.r1, c2: range.c2, r2: range.r2, index: range.r1 + "_" + range.c1};}
if (col !== range.c1 || row !== range.r1) {return null;} if (col !== range.c1 || row !== range.r1) {return null;}
} }
...@@ -2553,7 +2533,8 @@ ...@@ -2553,7 +2533,8 @@
var isFirstCol = col === range.c1; var isFirstCol = col === range.c1;
if (!mergedCellsStage) { if (!mergedCellsStage) {
mc = this._getMergedCellsRange(col, row); // ToDo возможно можно оптимизировать
mc = this.model.getMergedByCell(row, col);
if (mc) { if (mc) {
if ((col === mc.c1 || isFirstCol) && (row === mc.r1 || isFirstRow)) { if ((col === mc.c1 || isFirstCol) && (row === mc.r1 || isFirstRow)) {
mc = mc.intersectionSimple(this.visibleRange); mc = mc.intersectionSimple(this.visibleRange);
...@@ -3412,16 +3393,7 @@ ...@@ -3412,16 +3393,7 @@
// --- Cache --- // --- Cache ---
_cleanCache: function (range) { _cleanCache: function (range) {
var t = this, r, c, row, id, rid; var t = this, r, c, row;
function deleteIndex(range) {
for (var r = range.r1; r <= range.r2 && r < t.rows.length; ++r) {
for (var c = range.c1; c <= range.c2 && c < t.cols.length; ++c) {
var id = t._getMergedCellIndex(c, r);
delete t.cache.mergedCells.index[id];
}
}
}
if (range === undefined) {range = t.activeRange.clone(true);} if (range === undefined) {range = t.activeRange.clone(true);}
...@@ -3434,12 +3406,6 @@ ...@@ -3434,12 +3406,6 @@
if (row.erasedLB[c]) {delete row.erasedLB[c];} if (row.erasedLB[c]) {delete row.erasedLB[c];}
if (row.erasedRB[c-1]) {delete row.erasedRB[c-1];} if (row.erasedRB[c-1]) {delete row.erasedRB[c-1];}
} }
id = t._getMergedCellIndex(c, r);
rid = t.cache.mergedCells.index[id];
if (rid !== undefined) {
deleteIndex(t.cache.mergedCells.ranges[rid]);
delete t.cache.mergedCells.ranges[rid];
}
} }
if (row !== undefined) { if (row !== undefined) {
if (row.erasedLB[c]) {delete row.erasedLB[c];} if (row.erasedLB[c]) {delete row.erasedLB[c];}
...@@ -3561,8 +3527,9 @@ ...@@ -3561,8 +3527,9 @@
if (c && c.text) { if (c && c.text) {
return c.text; return c.text;
} else if (!dontLookupMergedCells) { } else if (!dontLookupMergedCells) {
var range = this._getMergedCellsRange(col, row); // ToDo проверить это условие, возможно оно избыточно
return range !== undefined ? this._getCellTextCache(range.c1, range.r1, true) : undefined; var range = this.model.getMergedByCell(row, col);
return null !== range ? this._getCellTextCache(range.c1, range.r1, true) : undefined;
} }
return undefined; return undefined;
}, },
...@@ -3645,25 +3612,19 @@ ...@@ -3645,25 +3612,19 @@
} }
// Range для замерженной ячейки // Range для замерженной ячейки
var range = null; var mc = this.model.getMergedByCell(row, col);
var fl = this._getCellFlags(c); var fl = this._getCellFlags(c);
var fMergedColumns = false; // Замержены ли колонки (если да, то автоподбор ширины не должен работать) var fMergedColumns = false; // Замержены ли колонки (если да, то автоподбор ширины не должен работать)
var fMergedRows = false; // Замержены ли строки (если да, то автоподбор высоты не должен работать) var fMergedRows = false; // Замержены ли строки (если да, то автоподбор высоты не должен работать)
if (fl.isMerged) { if (null !== mc) {
range = this._getMergedCellsRange(col, row); if (col !== mc.c1 || row !== mc.r1) {return mc.c2;} // skip other merged cell from range
if (range === undefined) { // got uncached merged cells, redirect it if (mc.c1 !== mc.c2)
range = this._fetchMergedCellsRange(col, row);
this._addCellTextToCache(range.c1, range.r1, canChangeColWidth);
return col;
}
if (col !== range.c1 || row !== range.r1) {return range.c2;} // skip other merged cell from range
if (range.c1 !== range.c2)
fMergedColumns = true; fMergedColumns = true;
if (range.r1 !== range.r2) if (mc.r1 !== mc.r2)
fMergedRows = true; fMergedRows = true;
} }
if (this._isCellEmpty(c)) {return col;} if (this._isCellEmpty(c)) {return mc ? mc.c2 : col;}
var dDigitsCount = 0; var dDigitsCount = 0;
var colWidth = 0; var colWidth = 0;
...@@ -3689,7 +3650,7 @@ ...@@ -3689,7 +3650,7 @@
// Обновленная ячейка // Обновленная ячейка
dDigitsCount = this.cols[col].charCount; dDigitsCount = this.cols[col].charCount;
colWidth = this.cols[col].innerWidth; colWidth = this.cols[col].innerWidth;
} else if (null === range) { } else if (null === mc) {
// Обычная ячейка // Обычная ячейка
dDigitsCount = this.cols[col].charCount; dDigitsCount = this.cols[col].charCount;
colWidth = this.cols[col].innerWidth; colWidth = this.cols[col].innerWidth;
...@@ -3707,7 +3668,7 @@ ...@@ -3707,7 +3668,7 @@
} }
} else { } else {
// Замерженная ячейка, нужна сумма столбцов // Замерженная ячейка, нужна сумма столбцов
for (var i = range.c1; i <= range.c2 && i < this.nColsCount; ++i) { for (var i = mc.c1; i <= mc.c2 && i < this.nColsCount; ++i) {
colWidth += this.cols[i].width; colWidth += this.cols[i].width;
} }
colWidth -= pad; colWidth -= pad;
...@@ -3718,7 +3679,7 @@ ...@@ -3718,7 +3679,7 @@
var str = c.getValue2(dDigitsCount, makeFnIsGoodNumFormat(fl, colWidth)); var 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 || fl.isMerged || isFixedWidthCell(str) ? this._calcMaxWidth(col, row, range) : undefined; var maxW = fl.wrapText || fl.shrinkToFit || fl.isMerged || isFixedWidthCell(str) ? this._calcMaxWidth(col, row, mc) : undefined;
var tm = this._roundTextMetrics( this.stringRender.measureString(str, fl, maxW) ); var tm = this._roundTextMetrics( this.stringRender.measureString(str, fl, maxW) );
var cto = (fl.isMerged || fl.wrapText) ? var cto = (fl.isMerged || fl.wrapText) ?
{ {
...@@ -3756,10 +3717,11 @@ ...@@ -3756,10 +3717,11 @@
cellVA : va, cellVA : va,
sideL : cto.leftSide, sideL : cto.leftSide,
sideR : cto.rightSide, sideR : cto.rightSide,
cellType: cellType, cellType : cellType,
isFormula: c.getFormula().length > 0, isFormula : c.getFormula().length > 0,
angle : c.getAngle(), angle : c.getAngle(),
textBound : textBound textBound : textBound,
mc : mc
}; };
this._fetchCellCacheText(col, row).hasText = true; this._fetchCellCacheText(col, row).hasText = true;
...@@ -3804,14 +3766,14 @@ ...@@ -3804,14 +3766,14 @@
} }
} }
return col; return mc ? mc.c2 : col;
}, },
_calcMaxWidth: function (col, row, range) { _calcMaxWidth: function (col, row, mc) {
if (null === range) {return this.cols[col].innerWidth;} if (null === mc) {return this.cols[col].innerWidth;}
var width = this.cols[range.c1].innerWidth; var width = this.cols[mc.c1].innerWidth;
for (var c = range.c1 + 1; c <= range.c2 && c < this.nColsCount; ++c) { for (var c = mc.c1 + 1; c <= mc.c2 && c < this.nColsCount; ++c) {
width += this.cols[c].width; width += this.cols[c].width;
} }
return width; return width;
...@@ -3881,70 +3843,10 @@ ...@@ -3881,70 +3843,10 @@
// ----- Merged cells cache ----- // ----- Merged cells cache -----
_getMergedCellIndex: function (col, row) {
return row + "-" + col;
},
_getMergedCellsRange: function (col, row) {
var index = this._getMergedCellIndex(col, row);
var rangeId = this.cache.mergedCells.index[index];
return rangeId !== undefined ? this.cache.mergedCells.ranges[rangeId] : undefined;
},
_fetchMergedCellsRange: function (col, row) {
var index, rangeId, mc = this._getMergedCellsRange(col, row);
if (mc) {return mc;}
this._addMergedCellsRange(col, row);
index = this._getMergedCellIndex(col, row);
rangeId = this.cache.mergedCells.index[index];
if (rangeId === undefined) {
throw "Error: can not get merged cell range (col=" + col + ", row=" + row + ")";
}
return this.cache.mergedCells.ranges[rangeId];
},
_addMergedCellsRange: function (col, row) {
var range = this._getCell(col, row).hasMerged(), rangeId, c, r;
this.cache.mergedCells.ranges.push( asc_Range(range.c1, range.r1, range.c2, range.r2) );
rangeId = this.cache.mergedCells.ranges.length - 1;
for (r = range.r1; r <= range.r2 && r < this.nRowsCount; ++r) {
for (c = range.c1; c <= range.c2 && c < this.nColsCount; ++c) {
this.cache.mergedCells.index[ this._getMergedCellIndex(c, r) ] = rangeId;
}
}
},
_isMergedCells: function (range) { _isMergedCells: function (range) {
return range.isEqual(this.model.getMergedByCell(range.c1, range.r1)); return range.isEqual(this.model.getMergedByCell(range.r1, range.c1));
},
// Обновляем массив мерженных индексов для новых строк
_updateMergedCellsRange: function (updateRange) {
for (var key in this.cache.mergedCells.ranges) {
var tmpRange = this.cache.mergedCells.ranges[key];
var bIsUpdate = false;
var _r = tmpRange.r1, _c = tmpRange.c1;
if (tmpRange.c1 < updateRange.c1 && tmpRange.c2 > updateRange.c2) {
bIsUpdate = true;
_c = updateRange.c1;
}
if (tmpRange.r1 < updateRange.r1 && tmpRange.r2 > updateRange.r2) {
bIsUpdate = true;
_r = updateRange.r1;
}
if (bIsUpdate) {
for (var r = _r; r <= tmpRange.r2 && r < this.nRowsCount; ++r) {
for (var c = _c; c <= tmpRange.c2 && c < this.nColsCount; ++c) {
this.cache.mergedCells.index[ this._getMergedCellIndex(c, r) ] = key;
}
}
}
}
}, },
// ----- Cell borders cache ----- // ----- Cell borders cache -----
_addErasedBordersToCache: function (colBeg, colEnd, row) { _addErasedBordersToCache: function (colBeg, colEnd, row) {
...@@ -4642,12 +4544,10 @@ ...@@ -4642,12 +4544,10 @@
if (newCol >= t.cols.length && newCol <= gc_nMaxCol0) { if (newCol >= t.cols.length && newCol <= gc_nMaxCol0) {
t.nColsCount = newCol + 1; t.nColsCount = newCol + 1;
t._updateMergedCellsRange(asc_Range(t.cols.length - 1, 0, t.nColsCount - 1, t.nRowsCount));
t._calcColumnWidths(/*fullRecalc*/2); t._calcColumnWidths(/*fullRecalc*/2);
} }
if (newRow >= t.rows.length && newRow <= gc_nMaxRow0) { if (newRow >= t.rows.length && newRow <= gc_nMaxRow0) {
t.nRowsCount = newRow + 1; t.nRowsCount = newRow + 1;
t._updateMergedCellsRange(asc_Range(0, t.rows.length - 1, t.nColsCount, t.nRowsCount - 1));
t._calcRowHeights(/*fullRecalc*/2); t._calcRowHeights(/*fullRecalc*/2);
} }
...@@ -8341,9 +8241,6 @@ ...@@ -8341,9 +8241,6 @@
bIsMaxCols = true; bIsMaxCols = true;
} }
// Проверяем замерженность всего или какой-либо строки
this._updateMergedCellsRange(asc_Range (nLastCols, 0, this.nColsCount - 1, this.nRowsCount));
t._calcColumnWidths(/*fullRecalc*/2); t._calcColumnWidths(/*fullRecalc*/2);
return (nLastCols !== this.nColsCount || bIsMaxCols); return (nLastCols !== this.nColsCount || bIsMaxCols);
}, },
...@@ -8380,9 +8277,6 @@ ...@@ -8380,9 +8277,6 @@
bIsMaxRows = true; bIsMaxRows = true;
} }
// Проверяем замерженность всего или какого-либо столбца
this._updateMergedCellsRange(asc_Range (0, nLastRows, this.nColsCount, this.nRowsCount - 1));
t._calcRowHeights(/*fullRecalc*/2); t._calcRowHeights(/*fullRecalc*/2);
return (nLastRows !== this.nRowsCount || bIsMaxRows); return (nLastRows !== this.nRowsCount || bIsMaxRows);
}, },
...@@ -8395,7 +8289,7 @@ ...@@ -8395,7 +8289,7 @@
return; return;
var width = null; var width = null;
var row, ct, c, fl, str, maxW, tm, range; var row, ct, c, fl, str, maxW, tm, mc;
var oldWidth; var oldWidth;
var lastHeight = null; var lastHeight = null;
var filterButton = null; var filterButton = null;
...@@ -8404,12 +8298,9 @@ ...@@ -8404,12 +8298,9 @@
ct = t._getCellTextCache(col, row); ct = t._getCellTextCache(col, row);
if (ct === undefined) {continue;} if (ct === undefined) {continue;}
if (ct.flags.isMerged) { if (ct.flags.isMerged) {
range = t._getMergedCellsRange(col, row); mc = ct.mc;
if (range === undefined) { // got uncached merged cells, redirect it
range = t._fetchMergedCellsRange(col, row);
}
// Для замерженных ячеек (с 2-мя или более колонками) оптимизировать не нужно // Для замерженных ячеек (с 2-мя или более колонками) оптимизировать не нужно
if (range.c1 !== range.c2) if (mc.c1 !== mc.c2)
continue; continue;
} }
...@@ -8481,18 +8372,15 @@ ...@@ -8481,18 +8372,15 @@
return; return;
var height = t.defaultRowHeight; var height = t.defaultRowHeight;
var col, ct; var col, ct, mc;
for (col = 0; col < t.rows.length; ++col) { for (col = 0; col < t.rows.length; ++col) {
ct = t._getCellTextCache(col, row); ct = t._getCellTextCache(col, row);
if (ct === undefined) {continue;} if (ct === undefined) {continue;}
if (ct.flags.isMerged) { if (ct.flags.isMerged) {
range = t._getMergedCellsRange(col, row); mc = ct.mc;
if (range === undefined) { // got uncached merged cells, redirect it
range = t._fetchMergedCellsRange(col, row);
}
// Для замерженных ячеек (с 2-мя или более строками) оптимизировать не нужно // Для замерженных ячеек (с 2-мя или более строками) оптимизировать не нужно
if (range.r1 !== range.r2) if (mc.r1 !== mc.r2)
continue; continue;
} }
...@@ -9023,12 +8911,13 @@ ...@@ -9023,12 +8911,13 @@
row = ar.startRow; row = ar.startRow;
} }
// Возможно стоит заменить на ячейку из кеша
c = t._getVisibleCell(col, row); c = t._getVisibleCell(col, row);
if (!c) {throw "Can not get cell data (col=" + col + ", row=" + row + ")";} if (!c) {throw "Can not get cell data (col=" + col + ", row=" + row + ")";}
fl = t._getCellFlags(c); fl = t._getCellFlags(c);
if (fl.isMerged) { if (fl.isMerged) {
mc = t._getMergedCellsRange(col, row); mc = t.model.getMergedByCell(row, col);
c = t._getVisibleCell(mc.c1, mc.r1); c = t._getVisibleCell(mc.c1, mc.r1);
if (!c) {throw "Can not get merged cell data (col=" + mc.c1 + ", row=" + mc.r1 + ")";} if (!c) {throw "Can not get merged cell data (col=" + mc.c1 + ", row=" + mc.r1 + ")";}
fl = t._getCellFlags(c); fl = t._getCellFlags(c);
...@@ -9157,10 +9046,7 @@ ...@@ -9157,10 +9046,7 @@
if (!ct.flags.isMerged) { if (!ct.flags.isMerged) {
bUpdateRowHeight = true; bUpdateRowHeight = true;
} else { } else {
mergedRange = t._getMergedCellsRange(c, r); mergedRange = ct.mc;
if (undefined === mergedRange) { // got uncached merged cells, redirect it
mergedRange = t._fetchMergedCellsRange(c, r);
}
// Для замерженных ячеек (с 2-мя или более строками) оптимизировать не нужно // Для замерженных ячеек (с 2-мя или более строками) оптимизировать не нужно
bUpdateRowHeight = mergedRange.r1 === mergedRange.r2; bUpdateRowHeight = mergedRange.r1 === mergedRange.r2;
} }
......
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