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