Commit 071a5bcd authored by Sergey Konovalov's avatar Sergey Konovalov Committed by GitHub

Merge pull request #93 from ONLYOFFICE/formuladependence

Formuladependence
parents e55670fe f6c7f64a
......@@ -14,7 +14,7 @@
<script type="text/javascript" src="../../../web-apps/apps/spreadsheeteditor/sdk_dev_scripts.js"></script>
<script>
window.sdk_dev_scrpipts.forEach(function(item){
document.write('<script type="text/javascript" src="' + item + '"><\/script>');
document.write('<script type="text/javascript" src="' + item.substring('../'.length) + '"><\/script>');
});
</script>
......
......@@ -472,6 +472,21 @@ $( function () {
ok( oParser.parse() );
strictEqual( oParser.calculate().getValue(), 6 );
} );
test( "Test: \"Cross\"", function () {
ws.getRange2( "A7" ).setValue( "1" );
ws.getRange2( "A8" ).setValue( "2" );
ws.getRange2( "A9" ).setValue( "3" );
oParser = new parserFormula( 'A7:A9', null, ws );
ok( oParser.parse() );
strictEqual( oParser.calculate().cross(new AscCommon.CellAddress(5, 0, 0), ws.getId()).getValue(), "#VALUE!" );
strictEqual( oParser.calculate().cross(new AscCommon.CellAddress(6, 0, 0), ws.getId()).getValue(), 1 );
strictEqual( oParser.calculate().cross(new AscCommon.CellAddress(7, 0, 0), ws.getId()).getValue(), 2 );
strictEqual( oParser.calculate().cross(new AscCommon.CellAddress(8, 0, 0), ws.getId()).getValue(), 3 );
strictEqual( oParser.calculate().cross(new AscCommon.CellAddress(9, 0, 0), ws.getId()).getValue(), "#VALUE!" );
} );
test( "Test: \"Parse intersection\"", function () {
......@@ -970,15 +985,15 @@ $( function () {
oParser = new parserFormula( "Лист2!A2", "A1", ws );
ok( oParser.parse() );
// strictEqual( oParser.parse(), true)
strictEqual( oParser.changeSheet( "Лист2", "Лист3" ).assemble(), "Лист3!A2" );
strictEqual( oParser.renameSheet( "Лист2", "Лист3" ).assemble(), "Лист3!A2" );
oParser = new parserFormula( "Лист2:Лист3!A2", "A1", ws );
ok( oParser.parse() );
strictEqual( oParser.changeSheet( "Лист2", "Лист1" ).assemble(), "Лист1:Лист3!A2" );
strictEqual( oParser.renameSheet( "Лист2", "Лист1" ).assemble(), "Лист1:Лист3!A2" );
oParser = new parserFormula( "Лист2!A2:A5", "A1", ws );
ok( oParser.parse() );
strictEqual( oParser.changeSheet( "Лист2", "Лист3" ).assemble(), "Лист3!A2:A5" );
strictEqual( oParser.renameSheet( "Лист2", "Лист3" ).assemble(), "Лист3!A2:A5" );
ws = wb.getWorksheet( 0 );
ws.getRange2( "S95" ).setValue( "2" );
......@@ -1415,8 +1430,6 @@ $( function () {
test( "Test: \"TEXT\"", function () {
wb.dependencyFormulas = new AscCommonExcel.DependencyGraph( wb );
oParser = new parserFormula( "TEXT(1234.567,\"$0.00\")", "A2", ws );
ok( oParser.parse() );
strictEqual( oParser.calculate().getValue(), "$1234.57" );
......@@ -1429,8 +1442,6 @@ $( function () {
test( "Test: \"WORKDAY\"", function () {
wb.dependencyFormulas = new AscCommonExcel.DependencyGraph( wb );
oParser = new parserFormula( "WORKDAY(DATE(2006,1,1),0)", "A2", ws );
ok( oParser.parse() );
strictEqual( oParser.calculate().getValue(), 38718 );
......
......@@ -12,16 +12,12 @@
<script type="text/javascript" src="../../../web-apps/vendor/xregexp/xregexp-all-min.js"></script>
<script type="text/javascript" src="../utils/utils.js"></script>
<script type="text/javascript" src="../model/Workbook.js"></script>
<script type="text/javascript" src="../model/WorkbookElems.js"></script>
<script type="text/javascript" src="../model/Serialize.js"></script>
<script type="text/javascript" >
AscCommonExcel.g_oDefaultFormat.FontAbs = {};
</script>
<script type="text/javascript" src="../model/FormulaObjects/parserFormula.js"></script>
<script type="text/javascript" src="../../Common/commonDefines.js"></script>
<script type="text/javascript" src="../../Common/NumFormat.js"></script>
<script type="text/javascript" src="../../../web-apps/apps/spreadsheeteditor/sdk_dev_scripts.js"></script>
<script>
window.sdk_dev_scrpipts.forEach(function(item){
document.write('<script type="text/javascript" src="' + item.substring('../'.length) + '"><\/script>');
});
</script>
<script type="text/javascript" src="CellFormatTests.js"></script>
......
......@@ -10,9 +10,14 @@
<link rel="stylesheet" href="qunit/qunit.css" type="text/css" media="screen" />
<script type="text/javascript" src="qunit/qunit.js"></script>
<script type="text/javascript" src="../utils/utils.js"></script>
<script type="text/javascript" src="../../../web-apps/vendor/xregexp/xregexp-all-min.js"></script>
<script type="text/javascript" src="../../../web-apps/apps/spreadsheeteditor/sdk_dev_scripts.js"></script>
<script>
window.sdk_dev_scrpipts.forEach(function(item){
document.write('<script type="text/javascript" src="' + item.substring('../'.length) + '"><\/script>');
});
</script>
<script type="text/javascript" src="tests.js"></script>
</head>
......
......@@ -342,4 +342,122 @@ $(function () {
l3.trigger("onEvent1", "trigger event with all handlers removed by 'remove()'"); //-
});
test("RangeTree", function test_HandlersList() {
function getRandomArbitary(min, max)
{
return Math.round(Math.random() * (max - min) + min);
}
function getCellIndex(row, col) {
return row * AscCommon.gc_nMaxCol + col;
}
function testCells(cells, tree, standart)
{
var starndartRes = {};
var treeCells = {};
for(var i = 0; i < cells.length; ++i){
var cell = cells[i];
treeCells[cell.index] = cell.index;
for(var id in standart){
var data = standart[id];
if(data.bbox.contains(cell.col, cell.row)){
starndartRes[data.id] = data;
}
}
}
var starndartResArr = [];
for(var i in starndartRes){
starndartResArr.push(starndartRes[i].id);
}
var treeRes = [];
var areas = tree.getByCells(treeCells);
for(var i = 0 ; i < areas.length; ++i){
treeRes.push(areas[i].data.id);
}
tree.getByCellsEnd(areas);
treeRes.sort();
starndartResArr.sort();
var res = JSON.stringify(starndartResArr)==JSON.stringify(treeRes);
return res;
}
function test(row, col, tree, standart)
{
var cells = [];
var cellsCount = 10;
while (cellsCount-- > 0) {
var r1 = getRandomArbitary(0, row);
var c1 = getRandomArbitary(0, col);
cells.push({row: r1, col: c1, index: getCellIndex(r1, c1)});
}
return testCells(cells, tree, standart);
}
var bboxCount = 1000;
var colMax = 100;
var rowMax = 100;
var tree = new AscCommonExcel.RangeTree();
var standard = {};
var count = 0;
for(var i = 0 ; i < bboxCount; ++i){
var r1 = getRandomArbitary(0, rowMax);
var r2 = getRandomArbitary(0, rowMax);
var c1 = getRandomArbitary(0, colMax);
var c2 = getRandomArbitary(0, colMax);
var bbox = new Asc.Range(c1, c2, r1, r2, true);
var name = bbox.getName();
if (!standard[name]) {
var data = {bbox: bbox, id: i};
standard[name] = data;
tree.add(bbox, data);
var res = test(rowMax, colMax, tree, standard);
count += res ? 0 : 1;
}
}
strictEqual(count, 0, "RangeTree missmatch");
count = 0;
for(var i in standard){
var data = standard[i];
delete standard[i];
tree.remove(data.bbox, data);
var res = test(rowMax, colMax, tree, standard);
count += res ? 0 : 1;
}
strictEqual(count, 0, "RangeTree no empty");
});
test("DependencyGraph.startListeningRange", function test_HandlersList() {
function getRandomArbitary(min, max)
{
return Math.round(Math.random() * (max - min) + min);
}
var bboxCount = 100;
var colMax = 100;
var rowMax = 100;
var sheetId = 0;
var graph = new AscCommonExcel.DependencyGraph(null);
var standard = {};
for(var i = 0 ; i < bboxCount; ++i){
var r1 = getRandomArbitary(0, rowMax);
var r2 = getRandomArbitary(0, rowMax);
var c1 = getRandomArbitary(0, colMax);
var c2 = getRandomArbitary(0, colMax);
var bbox = new Asc.Range(c1, c2, r1, r2, true);
var listener = {bbox: bbox, getListenerId: function(){return i;}};
standard[listener.getListenerId()] = listener;
graph.startListeningRange(sheetId, bbox, listener);
}
for(var i in standard){
var data = standard[i];
delete standard[i];
graph.endListeningRange(sheetId, data.bbox, data);
}
var res = "";
var sheetContainer = graph.sheetListeners[sheetId];
for(var i in sheetContainer.cellMap){
res += i;
}
for(var i in sheetContainer.areaMap){
res += i;
}
strictEqual(res, "", "DependencyGraph no empty");
});
});
......@@ -292,6 +292,7 @@ var editor;
AscCommonExcel.g_oUndoRedoComment = new AscCommonExcel.UndoRedoComment(wbModel);
AscCommonExcel.g_oUndoRedoAutoFilters = new AscCommonExcel.UndoRedoAutoFilters(wbModel);
AscCommonExcel.g_oUndoRedoSparklines = new AscCommonExcel.UndoRedoSparklines(wbModel);
AscCommonExcel.g_DefNameWorksheet = new AscCommonExcel.Woorksheet(wbModel, -1);
};
spreadsheet_api.prototype.asc_DownloadAs = function(typeFile, bIsDownloadEvent) {//передаем число соответствующее своему формату. например c_oAscFileType.XLSX
......@@ -1620,7 +1621,7 @@ var editor;
spreadsheet_api.prototype._onUpdateDefinedNames = function(lockElem) {
// if( lockElem.Element["subType"] == AscCommonExcel.c_oAscLockTypeElemSubType.DefinedNames ){
if( lockElem.Element["sheetId"] == -1 && lockElem.Element["rangeOrObjectId"] != -1 && !this.collaborativeEditing.getFast() ){
var dN = this.wbModel.dependencyFormulas.defNameList[lockElem.Element["rangeOrObjectId"]];
var dN = this.wbModel.dependencyFormulas.getDefNameByNodeId(lockElem.Element["rangeOrObjectId"]);
if (dN) {
dN.isLock = lockElem.UserId;
this.handlers.trigger("asc_onRefreshDefNameList",dN.getAscCDefName());
......@@ -1783,7 +1784,7 @@ var editor;
History.Create_NewPoint();
History.StartTransaction();
t.wbModel.dependencyFormulas.lockRecal();
// Нужно проверить все диаграммы, ссылающиеся на удаляемый лист
for (var key in t.wb.model.aWorksheets) {
var wsModel = t.wb.model.aWorksheets[key];
......@@ -1806,6 +1807,7 @@ var editor;
// Посылаем callback об изменении списка листов
t.sheetsChanged();
}
t.wbModel.dependencyFormulas.unlockRecal();
History.EndTransaction();
}
};
......@@ -1821,7 +1823,7 @@ var editor;
if (1 === d) {
where -= 1;
}
History.Create_NewPoint();
this.wb.replaceWorksheet(i, where);
this.wbModel.replaceWorksheet(i, where);
......
......@@ -320,13 +320,14 @@
};
CFormulaCF.prototype.init = function(ws) {
if (!this._f) {
this._f = new AscCommonExcel.parserFormula(this.Text, '', ws);
this._f = new AscCommonExcel.parserFormula(this.Text, null, ws);
this._f.parse();
}
};
CFormulaCF.prototype.getValue = function(ws) {
this.init(ws);
return this._f.calculate().getValue();
//todo bbox
return this._f.calculate(null, null).getValue();
};
function CIconSet () {
......
......@@ -582,29 +582,17 @@
}
if (parserHelp.isArea.call(o, o.Formula, o.pCurrPos)) {
found_operand = new cArea3D(o.operand_str.toUpperCase(), _wsFrom, _wsTo, wb);
if (o.operand_str.indexOf("$") > -1) {
found_operand.isAbsolute = true;
}
} else if (parserHelp.isRef.call(o, o.Formula, o.pCurrPos)) {
if (_wsTo != _wsFrom) {
found_operand = new cArea3D(o.operand_str.toUpperCase(), _wsFrom, _wsTo, wb);
} else {
found_operand = new cRef3D(o.operand_str.toUpperCase(), _wsFrom, wb);
}
if (o.operand_str.indexOf("$") > -1) {
found_operand.isAbsolute = true;
}
}
} else if (parserHelp.isArea.call(o, o.Formula, o.pCurrPos)) {
found_operand = new cArea(o.operand_str.toUpperCase(), r1.worksheet);
if (o.operand_str.indexOf("$") > -1) {
found_operand.isAbsolute = true;
}
} else if (parserHelp.isRef.call(o, o.Formula, o.pCurrPos, true)) {
found_operand = new cRef(o.operand_str.toUpperCase(), r1.worksheet);
if (o.operand_str.indexOf("$") > -1) {
found_operand.isAbsolute = true;
}
} else if (parserHelp.isName.call(o, o.Formula, o.pCurrPos, wb)[0]) {
found_operand = new AscCommonExcel.cName(o.operand_str, wb, r1.worksheet);
}
......@@ -631,37 +619,6 @@
found_operand = found_operand.toRef();
}
var cellName = r1.getFirst().getID(), wsId = r1.worksheet.getId();
if ((cElementType.cell === found_operand.type || cElementType.cell3D === found_operand.type ||
cElementType.cellsRange === found_operand.type) && found_operand.isValid()) {
var nFrom, nTo;
if (r2) {
nFrom = r2.defName;
} else {
nFrom = wb.dependencyFormulas.addNode(wsId, cellName);
}
nTo = wb.dependencyFormulas.addNode(found_operand.getWsId(), found_operand._cells);
found_operand.setNode(nTo);
wb.dependencyFormulas.addEdge2(nFrom, nTo);
} else if (cElementType.cellsRange3D === found_operand.type && found_operand.isValid()) {
var wsR = found_operand.wsRange(), nTo, _cell = found_operand._cells.replace(/\$/g, "");
for (var j = 0; j < wsR.length; j++) {
if (r2) {
nTo = wb.dependencyFormulas.addNode(wsR[j].Id, _cell);
wb.dependencyFormulas.addEdge2(r2.defName, nTo);
} else {
wb.dependencyFormulas.addEdge(wsId, cellName.replace(/\$/g, ""), wsR[j].Id, _cell);
}
}
}
return this.value = found_operand;
}
......@@ -1036,38 +993,6 @@
this.value = new cError(cErrorType.wrong_value_type);
}
if (cElementType.cellsRange === this.value.type || cElementType.cell === this.value.type ||
cElementType.cell3D === this.value.type || cElementType.cellsRange3D === this.value.type) {
var r1 = arguments[1], r2 = arguments[2], wb = r1.worksheet.workbook, cellName = r1.getFirst()
.getID(), wsId = r1.worksheet.getId();
if ((cElementType.cell === this.value.type || cElementType.cell3D === this.value.type ||
cElementType.cellsRange === this.value.type) && this.value.isValid()) {
var nFrom, nTo;
if (r2) {
nFrom = r2.defName;
} else {
nFrom = wb.dependencyFormulas.addNode(wsId, cellName);
}
nTo = wb.dependencyFormulas.addNode(this.value.getWsId(), this.value._cells.replace(/\$/g, ""));
this.value.setNode(nTo);
wb.dependencyFormulas.addEdge2(nFrom, nTo);
} else if (cElementType.cellsRange3D === this.value.type && this.value.isValid()) {
var wsR = this.value.wsRange(), nTo, _cell = this.value._cells.replace(/\$/g, "");
for (var j = 0; j < wsR.length; j++) {
if (r2) {
nTo = wb.dependencyFormulas.addNode(wsR[j].Id, _cell);
wb.dependencyFormulas.addEdge2(r2.defName, nTo);
} else {
wb.dependencyFormulas.addEdge(wsId, cellName.replace(/\$/g, ""), wsR[j].Id, _cell);
}
}
}
}
return this.value;
};
......
This diff is collapsed.
......@@ -45,12 +45,10 @@ function (window, undefined) {
window['AscCH'].historyitem_Workbook_SheetAdd = 1;
window['AscCH'].historyitem_Workbook_SheetRemove = 2;
window['AscCH'].historyitem_Workbook_SheetMove = 3;
window['AscCH'].historyitem_Workbook_SheetPositions = 4;
window['AscCH'].historyitem_Workbook_ChangeColorScheme = 5;
window['AscCH'].historyitem_Workbook_AddFont = 6;
window['AscCH'].historyitem_Workbook_DefinedNamesAdd = 7;
window['AscCH'].historyitem_Workbook_DefinedNamesChange = 8;
window['AscCH'].historyitem_Workbook_DefinedNamesDelete = 9;
window['AscCH'].historyitem_Workbook_DefinedNamesChange = 7;
window['AscCH'].historyitem_Workbook_DefinedNamesChangeUndo = 8;
window['AscCH'].historyitem_Worksheet_RemoveCell = 1;
window['AscCH'].historyitem_Worksheet_RemoveRows = 2;
......@@ -73,7 +71,6 @@ function (window, undefined) {
window['AscCH'].historyitem_Worksheet_CreateCol = 21;
window['AscCH'].historyitem_Worksheet_CreateCell = 22;
window['AscCH'].historyitem_Worksheet_RemoveCellFormula = 24;
window['AscCH'].historyitem_Worksheet_ChangeMerge = 25;
window['AscCH'].historyitem_Worksheet_ChangeHyperlink = 26;
window['AscCH'].historyitem_Worksheet_SetTabColor = 27;
......@@ -125,6 +122,7 @@ function (window, undefined) {
window['AscCH'].historyitem_Cell_SetQuotePrefix = 20;
window['AscCH'].historyitem_Cell_Angle = 21;
window['AscCH'].historyitem_Cell_Style = 22;
window['AscCH'].historyitem_Cell_ChangeValueUndo = 23;
window['AscCH'].historyitem_Comment_Add = 1;
window['AscCH'].historyitem_Comment_Remove = 2;
......@@ -145,6 +143,8 @@ function (window, undefined) {
window['AscCH'].historyitem_AutoFilter_ChangeTableRef = 13;
window['AscCH'].historyitem_AutoFilter_ChangeTableName = 14;
window['AscCH'].historyitem_AutoFilter_ClearFilterColumn = 15;
window['AscCH'].historyitem_AutoFilter_ChangeColumnName = 16;
window['AscCH'].historyitem_AutoFilter_ChangeTotalRow = 17;
window['AscCH'].historyitem_Sparkline_Type = 1;
window['AscCH'].historyitem_Sparkline_LineWeight = 2;
......@@ -284,7 +284,7 @@ CHistory.prototype.UndoRedoPrepare = function (oRedoObjectParam, bUndo) {
this.TurnOff();
}
/* отключаем отрисовку на случай необходимости пересчета ячеек, заносим ячейку, при необходимости в список перерисовываемых */
this.workbook.lockDraw();
this.workbook.dependencyFormulas.lockRecal();
if (bUndo)
this.workbook.bUndoChanges = true;
......@@ -330,7 +330,7 @@ CHistory.prototype.RedoAdd = function(oRedoObjectParam, Class, Type, sheetid, ra
{
if(!Class){
if(Data.isDrawingCollaborativeData){
Data.oBinaryReader.Seek2(Data.nPos);
Data.oBinaryReader.Seek2(Data.nPos);
var nReaderPos = Data.oBinaryReader.GetCurPos();
var nChangesType = Data.oBinaryReader.GetLong();
......@@ -339,18 +339,18 @@ CHistory.prototype.RedoAdd = function(oRedoObjectParam, Class, Type, sheetid, ra
var fChangesClass = AscDFH.changesFactory[nChangesType];
if (fChangesClass)
{
{
var oChange = new fChangesClass(changedObject);
oChange.ReadFromBinary(Data.oBinaryReader);
oChange.Load(new CDocumentColor(255, 255, 255));
}
}
else
{
{
Data.oBinaryReader.Seek2(nReaderPos);
changedObject.Load_Changes(Data.oBinaryReader, null, new CDocumentColor(255, 255, 255));
}
}
}
}
}
}
}
}
}
......@@ -381,8 +381,8 @@ CHistory.prototype.RedoExecute = function(Point, oRedoObjectParam)
Item.Class.Redo();
Item.Class.RefreshRecalcData();
}
else
{
else
{
Item.Class.Redo(Item.Type);
Item.Class.Refresh_RecalcData && Item.Class.Refresh_RecalcData(Item.Type);
}
......@@ -425,8 +425,7 @@ CHistory.prototype.UndoRedoEnd = function (Point, oRedoObjectParam, bUndo) {
}
/* возвращаем отрисовку. и перерисовываем ячейки с предварительным пересчетом */
this.workbook.unLockDraw();
this.workbook.buildRecalc();
this.workbook.dependencyFormulas.unlockRecal();
if (null != Point) {
//синхронизация index и id worksheet
......@@ -553,7 +552,7 @@ CHistory.prototype._addRedoObjectParam = function (oRedoObjectParam, Point) {
}
else if (AscCommonExcel.g_oUndoRedoWorksheet === Point.Class && (AscCH.historyitem_Worksheet_RowProp == Point.Type || AscCH.historyitem_Worksheet_ColProp == Point.Type || AscCH.historyitem_Worksheet_RowHide == Point.Type))
oRedoObjectParam.oChangeWorksheetUpdate[Point.SheetId] = Point.SheetId;
else if (AscCommonExcel.g_oUndoRedoWorkbook === Point.Class && (AscCH.historyitem_Workbook_SheetAdd === Point.Type || AscCH.historyitem_Workbook_SheetRemove === Point.Type || AscCH.historyitem_Workbook_SheetMove === Point.Type || AscCH.historyitem_Workbook_SheetPositions === Point.Type)) {
else if (AscCommonExcel.g_oUndoRedoWorkbook === Point.Class && (AscCH.historyitem_Workbook_SheetAdd === Point.Type || AscCH.historyitem_Workbook_SheetRemove === Point.Type || AscCH.historyitem_Workbook_SheetMove === Point.Type)) {
oRedoObjectParam.bUpdateWorksheetByModel = true;
oRedoObjectParam.bOnSheetsChanged = true;
}
......@@ -740,15 +739,15 @@ CHistory.prototype.Add = function(Class, Type, sheetid, range, Data, LocalChange
var Item;
if ( this.RecIndex >= this.Index )
this.RecIndex = this.Index - 1;
Item =
{
Class : Class,
Type : Type,
SheetId : sheetid,
Range : null,
Data : Data,
LocalChange: this.LocalChange
};
Item =
{
Class : Class,
Type : Type,
SheetId : sheetid,
Range : null,
Data : Data,
LocalChange: this.LocalChange
};
if(null != range)
Item.Range = range.clone();
if(null != LocalChange)
......@@ -931,7 +930,7 @@ CHistory.prototype.GetSerializeArray = function()
//функция, которая перемещает последнее действие на первую позицию(в текущей точке)
CHistory.prototype.ChangeActionsEndToStart = function()
{
var curPoint = this.Points[this.Index];
var curPoint = this.Points[this.Index];
if(curPoint && curPoint.Items.length > 0)
{
var endAction = curPoint.Items.pop();
......
......@@ -1450,7 +1450,7 @@
if(null != tableColumn.TotalsRowFormula)
{
this.memory.WriteByte(c_oSer_TableColumns.TotalsRowFormula);
this.memory.WriteString2(tableColumn.TotalsRowFormula);
this.memory.WriteString2(tableColumn.TotalsRowFormula.Formula);
}
if(null != tableColumn.dxf)
{
......@@ -3245,8 +3245,8 @@
if(ECellTypeType.celltypeNumber != nType)
this.bs.WriteItem(c_oSerCellTypes.Type, function(){oThis.memory.WriteByte(nType);});
}
if(null != cell.sFormula)
this.bs.WriteItem(c_oSerCellTypes.Formula, function(){oThis.WriteFormula(cell.sFormula, cell.sFormulaCA);});
if(null != cell.formulaParsed)
this.bs.WriteItem(c_oSerCellTypes.Formula, function(){oThis.WriteFormula(cell.formulaParsed);});
if(null != cell.oValue && false == cell.oValue.isEmpty())
{
var dValue = 0;
......@@ -3322,7 +3322,7 @@
}
}
};
this.WriteFormula = function(sFormula, sFormulaCA)
this.WriteFormula = function(formulaParsed)
{
// if(null != oFormula.aca)
// {
......@@ -3336,11 +3336,11 @@
// this.memory.WriteByte(c_oSerPropLenType.Byte);
// this.memory.WriteBool(oFormula.bx);
// }
if(null != sFormulaCA)
if(true === formulaParsed.ca)
{
this.memory.WriteByte(c_oSerFormulaTypes.Ca);
this.memory.WriteByte(c_oSerPropLenType.Byte);
this.memory.WriteBool(sFormulaCA);
this.memory.WriteBool(formulaParsed.ca);
}
// if(null != oFormula.del1)
// {
......@@ -3404,7 +3404,7 @@
// }
this.memory.WriteByte(c_oSerFormulaTypes.Text);
this.memory.WriteByte(c_oSerPropLenType.Variable);
this.memory.WriteString2(sFormula);
this.memory.WriteString2(formulaParsed.Formula);
};
this.WriteComments = function(aComments, aCommentsCoords)
{
......@@ -3862,12 +3862,13 @@
};
}
/** @constructor */
function Binary_TableReader(stream, ws, Dxfs)
function Binary_TableReader(stream, oReadResult, ws, Dxfs)
{
this.stream = stream;
this.ws = ws;
this.Dxfs = Dxfs;
this.bcr = new Binary_CommonReader(this.stream);
this.oReadResult = oReadResult;
this.Read = function(length, aTables)
{
var res = c_oSerConstants.ReadOk;
......@@ -3888,7 +3889,7 @@
return oThis.ReadTable(t,l, oNewTable);
});
if(null != oNewTable.Ref && null != oNewTable.DisplayName)
this.ws.workbook.dependencyFormulas.addTableName(oNewTable.DisplayName, this.ws, oNewTable.Ref, oNewTable);
this.ws.workbook.dependencyFormulas.addTableName(this.ws, oNewTable, true);
aTables.push(oNewTable);
}
else
......@@ -4244,10 +4245,10 @@
oTableColumn.TotalsRowLabel = this.stream.GetString2LE(length);
else if ( c_oSer_TableColumns.TotalsRowFunction == type )
oTableColumn.TotalsRowFunction = this.stream.GetUChar();
else if ( c_oSer_TableColumns.TotalsRowFormula == type )
oTableColumn.TotalsRowFormula = this.stream.GetString2LE(length);
else if ( c_oSer_TableColumns.DataDxfId == type )
{
else if ( c_oSer_TableColumns.TotalsRowFormula == type ) {
var formula = this.stream.GetString2LE(length);
this.oReadResult.tableCustomFunc.push({formula: formula, column: oTableColumn, ws: this.ws});
} else if ( c_oSer_TableColumns.DataDxfId == type ) {
var DxfId = this.stream.GetULongLE();
oTableColumn.dxf = this.Dxfs[DxfId];
}
......@@ -5309,15 +5310,12 @@
var oThis = this;
if ( c_oSerWorkbookTypes.DefinedName == type )
{
var oNewDefinedName = new AscCommonExcel.DefinedName();
var oNewDefinedName = new Asc.asc_CDefName();
res = this.bcr.Read1(length, function(t,l){
return oThis.ReadDefinedName(t,l,oNewDefinedName);
});
if(null != oNewDefinedName.Name && null != oNewDefinedName.Ref)
{
this.oWorkbook.dependencyFormulas.addDefinedNameNode(oNewDefinedName.Name, oNewDefinedName.LocalSheetId, oNewDefinedName.Ref, oNewDefinedName.Hidden);
if (null != oNewDefinedName.Name && null != oNewDefinedName.Ref) {
this.oWorkbook.dependencyFormulas.addDefNameOpen(oNewDefinedName.Name, oNewDefinedName.Ref, oNewDefinedName.LocalSheetId, oNewDefinedName.Hidden, false);
}
}
else
......@@ -5341,7 +5339,7 @@
};
}
/** @constructor */
function Binary_WorksheetTableReader(stream, wb, aSharedStrings, aCellXfs, Dxfs, oMediaArray, copyPasteObj)
function Binary_WorksheetTableReader(stream, oReadResult, wb, aSharedStrings, aCellXfs, Dxfs, oMediaArray, copyPasteObj)
{
this.stream = stream;
this.wb = wb;
......@@ -5354,6 +5352,7 @@
this.aHyperlinks = [];
this.copyPasteObj = copyPasteObj;
this.curWorksheet = null;
this.oReadResult = oReadResult;
this.Read = function()
{
var oThis = this;
......@@ -5545,7 +5544,7 @@
}
else if ( c_oSerWorksheetsTypes.Autofilter == type )
{
oBinary_TableReader = new Binary_TableReader(this.stream, oWorksheet, this.Dxfs);
oBinary_TableReader = new Binary_TableReader(this.stream, this.oReadResult, oWorksheet, this.Dxfs);
oWorksheet.AutoFilter = new AscCommonExcel.AutoFilter();
res = this.bcr.Read1(length, function(t,l){
return oBinary_TableReader.ReadAutoFilter(t,l, oWorksheet.AutoFilter);
......@@ -5553,7 +5552,7 @@
}
else if ( c_oSerWorksheetsTypes.TableParts == type )
{
oBinary_TableReader = new Binary_TableReader(this.stream, oWorksheet, this.Dxfs);
oBinary_TableReader = new Binary_TableReader(this.stream, this.oReadResult, oWorksheet, this.Dxfs);
oBinary_TableReader.Read(length, oWorksheet.TableParts);
} else if ( c_oSerWorksheetsTypes.Comments == type
&& !(typeof editor !== "undefined" && editor.WordControl && editor.WordControl.m_oLogicDocument && Array.isArray(editor.WordControl.m_oLogicDocument.Slides))) {
......@@ -6969,6 +6968,9 @@
isCopyPaste: isCopyPaste,
activeRange: null
};
this.oReadResult = {
tableCustomFunc: []
};
this.getbase64DecodedData = function(szSrc)
{
var nType = 0;
......@@ -7203,11 +7205,11 @@
// res = (new Binary_WorkbookTableReader(this.stream, wb)).Read();
// break;
case c_oSerTableTypes.Worksheets:
res = (new Binary_WorksheetTableReader(this.stream, wb, aSharedStrings, aCellXfs, aDxfs, oMediaArray, this.copyPasteObj)).Read();
break;
case c_oSerTableTypes.CalcChain:
res = (new Binary_CalcChainTableReader(this.stream, wb.calcChain)).Read();
res = (new Binary_WorksheetTableReader(this.stream, this.oReadResult, wb, aSharedStrings, aCellXfs, aDxfs, oMediaArray, this.copyPasteObj)).Read();
break;
// case c_oSerTableTypes.CalcChain:
// res = (new Binary_CalcChainTableReader(this.stream, wb.calcChain)).Read();
// break;
// case c_oSerTableTypes.Other:
// res = (new Binary_OtherTableReader(this.stream, oMediaArray)).Read();
// break;
......@@ -7226,9 +7228,9 @@
if(c_oSerConstants.ReadOk == res)
res = (new Binary_WorkbookTableReader(this.stream, wb)).Read();
}
wb.init();
wb.init(this.oReadResult.tableCustomFunc, false, true);
} else if(window["Asc"] && window["Asc"]["editor"] !== undefined){
wb.init(true);
wb.init(this.oReadResult.tableCustomFunc, true);
}
return res;
};
......@@ -8152,5 +8154,8 @@
window["AscCommonExcel"].BinaryFileReader = BinaryFileReader;
window["AscCommonExcel"].BinaryFileWriter = BinaryFileWriter;
window["AscCommonExcel"].BinaryTableWriter = BinaryTableWriter;
window["AscCommonExcel"].Binary_TableReader = Binary_TableReader;
window["Asc"].getBinaryOtherTableGVar = getBinaryOtherTableGVar;
})(window);
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -899,7 +899,7 @@
var newFonts = {};
pasteData.generateFontMap(newFonts);
worksheet._loadFonts(newFonts, function() {
worksheet.setSelectionInfo('paste', pasteData, false, "binary");
worksheet.setSelectionInfo('paste', pasteData, false, true);
});
}
}
......
......@@ -364,6 +364,120 @@
return bRes;
};
Range.prototype.isIntersectForShift = function(range, offset) {
var isHor = offset && 0 != offset.offsetCol;
var toDelete = offset && (offset.offsetCol < 0 || offset.offsetRow < 0);
if (isHor) {
if (this.r1 <= range.r1 && range.r2 <= this.r2 && this.c1 <= range.c2) {
return true;
} else if (toDelete && this.c1 <= range.c1 && range.c2 <= this.c2) {
var topIn = this.r1 <= range.r1 && range.r1 <= this.r2;
var bottomIn = this.r1 <= range.r2 && range.r2 <= this.r2;
return topIn || bottomIn;
} else {
return false;
}
} else {
if (this.c1 <= range.c1 && range.c2 <= this.c2 && this.r1 <= range.r2) {
return true;
} else if (toDelete && this.r1 <= range.r1 && range.r2 <= this.r2) {
var leftIn = this.c1 <= range.c1 && range.c1 <= this.c2;
var rightIn = this.c1 <= range.c2 && range.c2 <= this.c2;
return leftIn || rightIn;
} else {
return false;
}
}
};
Range.prototype.isIntersectForShiftCell = function(col, row, offset) {
var isHor = offset && 0 != offset.offsetCol;
if (isHor) {
return this.r1 <= row && row <= this.r2 && this.c1 <= col;
} else {
return this.c1 <= col && col <= this.c2 && this.r1 <= row;
}
};
Range.prototype.forShift = function(bbox, offset, bUndo) {
var isNoDelete = true;
var isHor = 0 != offset.offsetCol;
var toDelete = offset.offsetCol < 0 || offset.offsetRow < 0;
if (isHor) {
if (toDelete) {
if (this.c1 < bbox.c1) {
if (this.c2 <= bbox.c2) {
this.setOffsetLast({offsetCol: -(this.c2 - bbox.c1 + 1), offsetRow: 0});
} else {
this.setOffsetLast(offset);
}
} else if (this.c1 <= bbox.c2) {
if (this.c2 <= bbox.c2) {
if(!bUndo){
var topIn = bbox.r1 <= this.r1 && this.r1 <= bbox.r2;
var bottomIn = bbox.r1 <= this.r2 && this.r2 <= bbox.r2;
if (topIn && bottomIn) {
isNoDelete = false;
} else if (topIn) {
this.setOffsetFirst({offsetCol: 0, offsetRow: bbox.r2 - this.r1 + 1});
} else if (bottomIn) {
this.setOffsetLast({offsetCol: 0, offsetRow: bbox.r1 - this.r2 - 1});
}
}
} else {
this.setOffsetFirst({offsetCol: bbox.c1 - this.c1, offsetRow: 0});
this.setOffsetLast(offset);
}
} else {
this.setOffset(offset);
}
} else {
if (this.c1 < bbox.c1) {
this.setOffsetLast(offset);
} else {
this.setOffset(offset);
}
}
} else {
if (toDelete) {
if (this.r1 < bbox.r1) {
if (this.r2 <= bbox.r2) {
this.setOffsetLast({offsetCol: 0, offsetRow: -(this.r2 - bbox.r1 + 1)});
} else {
this.setOffsetLast(offset);
}
} else if (this.r1 <= bbox.r2) {
if (this.r2 <= bbox.r2) {
if(!bUndo) {
var leftIn = bbox.c1 <= this.c1 && this.c1 <= bbox.c2;
var rightIn = bbox.c1 <= this.c2 && this.c2 <= bbox.c2;
if (leftIn && rightIn) {
isNoDelete = false;
} else if (leftIn) {
this.setOffsetFirst({offsetCol: bbox.c2 - this.c1 + 1, offsetRow: 0});
} else if (rightIn) {
this.setOffsetLast({offsetCol: bbox.c1 - this.c2 - 1, offsetRow: 0});
}
}
} else {
this.setOffsetFirst({offsetCol: 0, offsetRow: bbox.r1 - this.r1});
this.setOffsetLast(offset);
}
} else {
this.setOffset(offset);
}
} else {
if (this.r1 < bbox.r1) {
this.setOffsetLast(offset);
} else {
this.setOffset(offset);
}
}
}
return isNoDelete;
};
Range.prototype.isOneCell = function () {
return this.r1 === this.r2 && this.c1 === this.c2;
};
......@@ -382,6 +496,93 @@
this.r2 = Math.max(this.r2, range.r2);
};
Range.prototype.union3 = function (c, r) {
this.c1 = Math.min(this.c1, c);
this.c2 = Math.max(this.c2, c);
this.r1 = Math.min(this.r1, r);
this.r2 = Math.max(this.r2, r);
};
Range.prototype.setOffsetWithAbs = function(offset) {
var temp;
var offsetRow = offset.offsetRow;
var offsetCol = offset.offsetCol;
if (0 === this.r1 && gc_nMaxRow0 === this.r2) {
//full sheet is 1:1048576 but offsetRow is valid for it
offsetRow = 0;
} else if (0 === this.c1 && gc_nMaxCol0 === this.c2) {
offsetCol = 0;
}
var isAbsRow1 = this.isAbsRow(this.refType1);
var isAbsCol1 = this.isAbsCol(this.refType1);
var isAbsRow2 = this.isAbsRow(this.refType2);
var isAbsCol2 = this.isAbsCol(this.refType2);
if (!isAbsRow1) {
this.r1 += offsetRow;
if (this.r1 < 0) {
this.r1 = 0;
return false;
}
if (this.r1 > gc_nMaxRow0) {
this.r1 = gc_nMaxRow0;
return false;
}
}
if (!isAbsCol1) {
this.c1 += offsetCol;
if (this.c1 < 0) {
this.c1 = 0;
return false;
}
if (this.c1 > gc_nMaxCol0) {
this.c1 = gc_nMaxCol0;
return false;
}
}
if (!isAbsRow2) {
this.r2 += offsetRow;
if (this.r2 < 0) {
this.r2 = 0;
return false;
}
if (this.r2 > gc_nMaxRow0) {
this.r2 = gc_nMaxRow0;
return false;
}
}
if (!isAbsCol2) {
this.c2 += offsetCol;
if (this.c2 < 0) {
this.c2 = 0;
return false;
}
if (this.c2 > gc_nMaxCol0) {
this.c2 = gc_nMaxCol0;
return false;
}
}
//switch abs flag
if (this.r1 > this.r2) {
temp = this.r1;
this.r1 = this.r2;
this.r2 = temp;
if (!isAbsRow1 && isAbsRow2) {
isAbsRow1 = !isAbsRow1;
isAbsRow2 = !isAbsRow2;
this.setAbs(isAbsRow1, isAbsCol1, isAbsRow2, isAbsCol2);
}
}
if (this.c1 > this.c2) {
temp = this.c1;
this.c1 = this.c2;
this.c2 = temp;
if (!isAbsCol1 && isAbsCol2) {
isAbsCol1 = !isAbsCol1;
isAbsCol2 = !isAbsCol2;
this.setAbs(isAbsRow1, isAbsCol1, isAbsRow2, isAbsCol2);
}
}
return true;
};
Range.prototype.setOffset = function (offset) {
if (this.r1 == 0 && this.r2 == gc_nMaxRow0 && offset.offsetRow != 0 ||
this.c1 == 0 && this.c2 == gc_nMaxCol0 && offset.offsetCol != 0) {
......@@ -457,7 +658,7 @@
sRes += "$";
}
sRes += (this.r1 + 1);
if (!this.isOneCell()) {
if (!this.isOneCell() || r1Abs !== r2Abs || c1Abs !== c2Abs) {
sRes += ":";
if (c2Abs) {
sRes += "$";
......@@ -933,6 +1134,11 @@
this._updateAdditionalData();
return this;
};
ActiveRange.prototype.union3 = function () {
ActiveRange.superclass.union3.apply(this, arguments);
this._updateAdditionalData();
return this;
};
ActiveRange.prototype.setOffset = function(offset){
this.setOffsetFirst(offset);
this.setOffsetLast(offset);
......
......@@ -815,7 +815,8 @@
// var __e__ = new Date().getTime();
// console.log("e-s "+ (__e__ - __s__));
this._formula = new AscCommonExcel.parserFormula(s.substr(1), this.options.cellName, ws);
var bbox = AscCommonExcel.g_oRangeCache.getActiveRange(this.options.cellName);
this._formula = new AscCommonExcel.parserFormula(s.substr(1), null, ws);
this._formula.parse();
var r, offset, _e, _s, wsName = null, refStr, isName = false, _sColorPos;
......@@ -869,7 +870,7 @@
}
case cElementType.table :
case cElementType.name : {
var nameRef = r.oper.toRef();
var nameRef = r.oper.toRef(bbox);
if (nameRef instanceof AscCommonExcel.cError) {
continue;
}
......@@ -939,7 +940,8 @@
var r, offset, _e, _s, wsName = null, ret = false, refStr, isName = false, _sColorPos, wsOPEN = this.handlers.trigger(
"getCellFormulaEnterWSOpen"), ws = wsOPEN ? wsOPEN.model : this.handlers.trigger("getActiveWS");
this._formula = new AscCommonExcel.parserFormula(s.substr(1), this.options.cellName, ws);
var bbox = AscCommonExcel.g_oRangeCache.getActiveRange(this.options.cellName);
this._formula = new AscCommonExcel.parserFormula(s.substr(1), null, ws);
this._formula.parse();
if (this._formula.RefPos && this._formula.RefPos.length > 0) {
......@@ -988,7 +990,7 @@
}
case cElementType.table :
case cElementType.name : {
var nameRef = r.oper.toRef();
var nameRef = r.oper.toRef(bbox);
if (nameRef instanceof AscCommonExcel.cError) {
continue;
}
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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