Commit 053ae293 authored by Alexander.Trofimov's avatar Alexander.Trofimov Committed by Alexander.Trofimov

Вынес обновление диапазона в отдельную фунцию. Ускорил применение при...

Вынес обновление диапазона в отдельную фунцию. Ускорил применение при пересчете формул (присылалось много раз обновление).

git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@59617 954022d7-b5bf-4e40-9824-e11837661b57
parent 5fbe535a
......@@ -297,9 +297,7 @@ CHistory.prototype.UndoRedoEnd = function (Point, oRedoObjectParam, bUndo) {
}
for (i in Point.UpdateRigions)
this.workbook.handlers.trigger("cleanCellCache", i, Point.UpdateRigions[i], false, true);
this.workbook.handlers.trigger("cleanCellCache", i, {'0': Point.UpdateRigions[i]}, false, true);
for (i in oRedoObjectParam.oChangeWorksheetUpdate)
this.workbook.handlers.trigger("changeWorksheetUpdate",
......
......@@ -1076,51 +1076,41 @@ function sortDependency( wb, setCellFormat ) {
buildRecalc(wb, true);
arrRecalc = {};
}
var i;
var nR = wb.needRecalc;
if(nR && (nR.length > 0))
{
var oCleanCellCacheArea = {};
var oNodeDependence = wb.dependencyFormulas.getNodeDependence(nR.nodes);
for ( var i in oNodeDependence.oMasterNodes ) {
var node = oNodeDependence.oMasterNodes[i];
_sortDependency(wb, node, oNodeDependence, oNodeDependence.oMasterAreaNodes, false, oCleanCellCacheArea, setCellFormat);
}
for (i in oNodeDependence.oMasterNodes)
_sortDependency(wb, oNodeDependence.oMasterNodes[i], oNodeDependence, oNodeDependence.oMasterAreaNodes,
false, oCleanCellCacheArea, setCellFormat);
//те AreaNodes
var oCurMasterAreaNodes = oNodeDependence.oMasterAreaNodes;
while (true) {
var bEmpty = true;
var oNewMasterAreaNodes = {};
for (var i in oCurMasterAreaNodes) {
for (i in oCurMasterAreaNodes) {
bEmpty = false;
var node = oCurMasterAreaNodes[i];
_sortDependency(wb, node, oNodeDependence, oNewMasterAreaNodes, false, oCleanCellCacheArea, setCellFormat);
_sortDependency(wb, oCurMasterAreaNodes[i], oNodeDependence, oNewMasterAreaNodes, false,
oCleanCellCacheArea, setCellFormat);
}
oCurMasterAreaNodes = oNewMasterAreaNodes;
if (bEmpty) {
//все оставшиеся считаем как bad
//todo сделать как в Excel, которой определяет циклические ссылки на момент подсчета(пример A1=VLOOKUP(1,B1:D2,2),B2 = 1, D1=A1 - это не циклическая ссылка)
for (var i in oNodeDependence.oMasterAreaNodesRestricted) {
var node = oNodeDependence.oMasterAreaNodesRestricted[i].node;
_sortDependency(wb, node, oNodeDependence, null, true, oCleanCellCacheArea, setCellFormat);
for (i in oNodeDependence.oMasterAreaNodesRestricted) {
_sortDependency(wb, oNodeDependence.oMasterAreaNodesRestricted[i].node, oNodeDependence, null,
true, oCleanCellCacheArea, setCellFormat);
}
break;
}
}
for ( var sheetId in oCleanCellCacheArea ) {
var sheetArea = oCleanCellCacheArea[sheetId];
var nPrevCellId = null;
var nMinRow = Number.MAX_VALUE;
var nMaxRow = 0;
for ( var cellId in sheetArea ) {
if(null != nPrevCellId)
wb.handlers.trigger( "cleanCellCache", sheetId, sheetArea[nPrevCellId], c_oAscCanChangeColWidth.numbers, true );
nPrevCellId = cellId;
}
if(null != nPrevCellId)
wb.handlers.trigger( "cleanCellCache", sheetId, sheetArea[nPrevCellId], c_oAscCanChangeColWidth.numbers );
}
for (i in oCleanCellCacheArea)
wb.handlers.trigger("cleanCellCache", i, oCleanCellCacheArea[i], c_oAscCanChangeColWidth.numbers);
g_oVLOOKUPCache.clean();
g_oHLOOKUPCache.clean()
g_oHLOOKUPCache.clean();
}
wb.needRecalc = {nodes: {}, length:0};
}
......
......@@ -426,12 +426,11 @@
"onScroll" : function (d) {self.controller.scroll(d);}
});
this.model.handlers.add("cleanCellCache", function (wsId, range, canChangeColWidth, bLockDraw) {
this.model.handlers.add("cleanCellCache", function (wsId, oRanges, canChangeColWidth, bLockDraw) {
var ws = self.getWorksheetById(wsId);
if (ws)
ws.changeWorksheet("updateRange", {range: range,
lockDraw: bLockDraw || wsId != self.getWorksheet(self.wsActive).model.getId(),
canChangeColWidth: canChangeColWidth});
ws.updateRanges(oRanges, canChangeColWidth,
bLockDraw || wsId != self.getWorksheet(self.wsActive).model.getId());
});
this.model.handlers.add("changeWorksheetUpdate", function (wsId, val) {
var ws = self.getWorksheetById(wsId);
......@@ -714,8 +713,7 @@
if (false === ct.hyperlink.hyperlinkModel.getVisited() && !isSelectOnShape) {
ct.hyperlink.hyperlinkModel.setVisited(true);
if (ct.hyperlink.hyperlinkModel.Ref)
ws.changeWorksheet("updateRange", {range: ct.hyperlink.hyperlinkModel.Ref.getBBox0(),
lockDraw: false, canChangeColWidth: false});
ws.updateRange(ct.hyperlink.hyperlinkModel.Ref.getBBox0(), false, false);
}
switch (ct.hyperlink.asc_getType()) {
case c_oAscHyperlinkType.WebLink:
......
......@@ -6979,7 +6979,7 @@
if (c_oAscFormatPainterState.kMultiple !== t.stateFormatPainter)
t.formatPainter();
// Перерисовываем
t.draw();
t._recalculateAfterUpdate([t.activeRange]);
};
var result = oTmpRange.preparePromoteFromTo(from, to);
......@@ -7840,8 +7840,9 @@
// Сбрасываем параметры
t.activeMoveRange = null;
t.startCellMoveRange = null;
t._updateCellsRange(arnFrom, false, true);
// Тут будет отрисовка select-а
t._updateCellsRange(arnFrom);
t._recalculateAfterUpdate([arnFrom, arnTo]);
// Вызовем на всякий случай, т.к. мы можем уже обновиться из-за формул ToDo возможно стоит убрать это в дальнейшем (но нужна переработка формул) - http://bugzserver/show_bug.cgi?id=24505
t.handlers.trigger("selectionNameChanged", t.getSelectionName(/*bRangeText*/false));
......@@ -9701,31 +9702,6 @@
}
onChangeWorksheetCallback(true);
break;
case "updateRange":
if (val && val.range) {
// Для принятия изменения нужно делать расширение диапазона
if (this.model.workbook.bCollaborativeChanges) {
var bIsUpdateX = false, bIsUpdateY = false;
if (val.range.c2 >= this.nColsCount) {
this.expandColsOnScroll(false, true, 0); // Передаем 0, чтобы увеличить размеры
bIsUpdateX = true;
}
if (val.range.r2 >= this.nRowsCount) {
this.expandRowsOnScroll(false, true, 0); // Передаем 0, чтобы увеличить размеры
bIsUpdateY = true;
}
if (bIsUpdateX && bIsUpdateY)
this.handlers.trigger("reinitializeScroll");
else if (bIsUpdateX)
this.handlers.trigger("reinitializeScrollX");
else if (bIsUpdateY)
this.handlers.trigger("reinitializeScrollY");
}
this._updateCellsRange(val.range, val.canChangeColWidth, val.lockDraw);
}
break;
}
};
......@@ -10574,6 +10550,46 @@
return this.arrActiveFormulaRanges;
};
/**
*
* @param {Object} ranges
* @param canChangeColWidth
* @param lockDraw
*/
WorksheetView.prototype.updateRanges = function (ranges, canChangeColWidth, lockDraw) {
var arrRanges = [], range;
for (var i in ranges) {
range = ranges[i];
this.updateRange(range, canChangeColWidth, true);
arrRanges.push(range);
}
if (0 < arrRanges.length)
this._recalculateAfterUpdate(arrRanges, lockDraw);
};
WorksheetView.prototype.updateRange = function (range, canChangeColWidth, lockDraw) {
// Для принятия изменения нужно делать расширение диапазона
if (this.model.workbook.bCollaborativeChanges) {
var bIsUpdateX = false, bIsUpdateY = false;
if (range.c2 >= this.nColsCount) {
this.expandColsOnScroll(false, true, 0); // Передаем 0, чтобы увеличить размеры
bIsUpdateX = true;
}
if (range.r2 >= this.nRowsCount) {
this.expandRowsOnScroll(false, true, 0); // Передаем 0, чтобы увеличить размеры
bIsUpdateY = true;
}
if (bIsUpdateX && bIsUpdateY)
this.handlers.trigger("reinitializeScroll");
else if (bIsUpdateX)
this.handlers.trigger("reinitializeScrollX");
else if (bIsUpdateY)
this.handlers.trigger("reinitializeScrollY");
}
this._updateCellsRange(range, canChangeColWidth, lockDraw);
};
WorksheetView.prototype._updateCellsRange = function (range, canChangeColWidth, lockDraw) {
var r, c, h, d, ct, isMerged;
var mergedRange, bUpdateRowHeight;
......@@ -10652,6 +10668,11 @@
}
}
if (!lockDraw)
this._recalculateAfterUpdate([range]);
};
WorksheetView.prototype._recalculateAfterUpdate = function (arrChanged, lockDraw) {
if (this.isChanged) {
this.isChanged = false;
this._initCellsArea(true);
......@@ -10664,7 +10685,7 @@
this.handlers.trigger("selectionMathInfoChanged", this.getSelectionMathInfo());
}
this.objectRender.rebuildChartGraphicObjects(new CChangeTableData(range, null, null, null));
this.objectRender.rebuildChartGraphicObjects(new CChangeTableData(null, null, null, null, arrChanged));
this.cellCommentator.updateCommentPosition();
this.handlers.trigger("onDocumentPlaceChanged");
this.draw(lockDraw);
......
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