static bool ContainsOrEqual(CalcCalculationManager mgr, CalcLocalIdentity id1, CalcLocalIdentity id2) { CalcLocalIdentityExtension.CompareResult result; CalcLocalIdentityExtension.CompareResult result2; if (id2.TryCompareTo(id1, out result, out result2)) { CalcNode objA = mgr.Graph.GetNode(id2); CalcExpression expression = mgr.GetExpression(id2); if (expression == null) { return(false); } if ((!object.ReferenceEquals(objA, null) && (objA.OwnerNode != null)) && (expression is CalcSharedExpression)) { return(false); } if (((id2 is CalcRangeIdentity) && (((result == CalcLocalIdentityExtension.CompareResult.Great_Intersected) || (result == CalcLocalIdentityExtension.CompareResult.Less_Intersected)) || (result == CalcLocalIdentityExtension.CompareResult.Contains))) && (((result2 == CalcLocalIdentityExtension.CompareResult.Great_Intersected) || (result2 == CalcLocalIdentityExtension.CompareResult.Less_Intersected)) || (result2 == CalcLocalIdentityExtension.CompareResult.Contains))) { if (!(mgr.GetExpression(id2) is CalcSharedExpression)) { throw new InvalidOperationException(ResourceStrings.FormulaChangePartOfArrayFormulaError); } return(false); } if (((result == CalcLocalIdentityExtension.CompareResult.Contained) || (result == CalcLocalIdentityExtension.CompareResult.Equal)) && ((result2 == CalcLocalIdentityExtension.CompareResult.Contained) || (result2 == CalcLocalIdentityExtension.CompareResult.Equal))) { return(true); } } return(false); }
public void Copy(SpreadCalcAxialManager src, int fromRow, int fromColumn, int toRow, int toColumn, int fromRowCount, int fromColumnCount, int toRowCount, int toColumnCount) { CalcCalculationManager sourceMgr = (src == null) ? this.Manager : src.Manager; Dictionary <CalcLocalIdentity, CalcExpression> formulas = this.GetFormulaIds(fromRow, fromColumn, fromRowCount, fromColumnCount, sourceMgr, null, false); this.Save(src, fromRow, fromColumn, toRow, toColumn, fromRowCount, fromColumnCount, toRowCount, toColumnCount, formulas, false, false); }
public void Save(SpreadCalcAxialManager src, int fromRow, int fromColumn, int toRow, int toColumn, int fromRowCount, int fromColumnCount, int toRowCount, int toColumnCount, Dictionary <CalcLocalIdentity, CalcExpression> formulas, bool offsetSelf, bool updataDependens) { CalcCalculationManager sourceMgr = (src == null) ? this.Manager : src.Manager; int sourceRowCount = (src == null) ? this.RowCount : src.RowCount; int sourceColumnCount = (src == null) ? this.ColumnCount : src.ColumnCount; FormulaClipboardHelper.Save(sourceMgr, this.Manager, null, sourceRowCount, sourceColumnCount, fromRow, fromColumn, toRow, toColumn, fromRowCount, fromColumnCount, toRowCount, toColumnCount, formulas, offsetSelf, updataDependens); }
public void RemoveSheet(IList sources, ICalcSource replacedSource) { ICalcSource currentSource = this.Manager.Source; Dictionary <CalcCalculationManager, Dictionary <CalcLocalIdentity, CalcExpression> > dictionary = new Dictionary <CalcCalculationManager, Dictionary <CalcLocalIdentity, CalcExpression> >(); foreach (object obj2 in sources) { ICalcSource source = obj2 as ICalcSource; if (source != null) { CalcCalculationManager manager = this.Manager.Service.GetCalculationManager(source, null, true); if (manager != null) { foreach (CalcLocalIdentity identity in manager.Graph.GetAllSheetRangeIdentities()) { CalcNode node = manager.Graph.GetNode(identity); if (node.Precedents != null) { using (List <CalcNode> .Enumerator enumerator3 = node.Precedents.GetEnumerator()) { while (enumerator3.MoveNext()) { if (enumerator3.Current.Source == currentSource) { Dictionary <CalcLocalIdentity, CalcExpression> dictionary2; if (!dictionary.TryGetValue(manager, out dictionary2)) { dictionary2 = new Dictionary <CalcLocalIdentity, CalcExpression>(); dictionary[manager] = dictionary2; } dictionary2[identity] = manager.GetExpression(identity); } } } } } } } } RemoveSheetVisitor visitor = new RemoveSheetVisitor(currentSource, replacedSource); foreach (KeyValuePair <CalcCalculationManager, Dictionary <CalcLocalIdentity, CalcExpression> > pair in dictionary) { CalcCalculationManager mgr = pair.Key; foreach (KeyValuePair <CalcLocalIdentity, CalcExpression> pair2 in pair.Value) { int num; int num2; int num3; int num4; mgr.ClearExpression(pair2.Key); FormulaOperatorHelper.Identity2Indexs(pair2.Key, out num, out num2, out num3, out num4); CalcExpression expr = visitor.Visit(pair2.Value, num, num2); CalcExpressionHelper.SetExpression(mgr, pair2.Key, expr, true); mgr.Invalidate(pair2.Key, false); } } }
public static void Save(CalcCalculationManager sourceMgr, CalcCalculationManager targetMgr, ChangingContext context, int sourceRowCount, int sourceColumnCount, int fromRow, int fromColumn, int toRow, int toColumn, int fromRowCount, int fromColumnCount, int toRowCount, int toColumnCount, Dictionary <CalcLocalIdentity, CalcExpression> formulas, bool offsetSelf, bool updataDependens) { Dictionary <CalcLocalIdentity, CalcExpression> dictionary3; if (context == null) { context = new ChangingContext(); } GetDependentsFromulas(sourceMgr, targetMgr, context, fromRow, fromColumn, toRow, toColumn, fromRowCount, formulas, fromColumnCount, offsetSelf, updataDependens); Dictionary <CalcCellIdentity, CalcExpression> cellFormulas = new Dictionary <CalcCellIdentity, CalcExpression>(); Dictionary <CalcRangeIdentity, CalcExpression> rangeFormulas = new Dictionary <CalcRangeIdentity, CalcExpression>(); foreach (KeyValuePair <CalcLocalIdentity, CalcExpression> pair in formulas) { if (pair.Key is CalcCellIdentity) { cellFormulas[pair.Key as CalcCellIdentity] = pair.Value; } else if (pair.Key is CalcRangeIdentity) { rangeFormulas[pair.Key as CalcRangeIdentity] = pair.Value; } } GetTargetFormulas(sourceMgr, targetMgr, sourceRowCount, sourceColumnCount, fromRow, fromColumn, toRow, toColumn, fromRowCount, fromColumnCount, toRowCount, toColumnCount, cellFormulas, rangeFormulas, offsetSelf, out dictionary3); ReferenceValidateVisitor visitor = new ReferenceValidateVisitor(new int?(sourceRowCount - 1), new int?(sourceColumnCount - 1)); Clear(targetMgr, FormulaOperatorHelper.Indexs2Identity(toRow, toColumn, (toRow + toRowCount) - 1, (toColumn + toColumnCount) - 1)); foreach (KeyValuePair <CalcLocalIdentity, CalcExpression> pair2 in dictionary3) { if (pair2.Value == null) { targetMgr.ClearExpression(pair2.Key); } else { int num; int num2; int num3; int num4; CalcExpression expr = pair2.Value; FormulaOperatorHelper.Identity2Indexs(pair2.Key, out num, out num2, out num3, out num4); num = (num < 0) ? 0 : num; num2 = (num2 < 0) ? 0 : num2; num3 = (num3 < 0) ? 0 : num3; num4 = (num4 < 0) ? 0 : num4; expr = visitor.Visit(expr, num, num2); if (expr is CalcSharedExpression) { expr = visitor.Visit(expr, num3, num4); } bool?isArrayFormula = null; CalcExpressionHelper.SetExpression(targetMgr, pair2.Key, expr, isArrayFormula); } targetMgr.Invalidate(pair2.Key, false); } }
public void Move(SpreadCalcAxialManager src, int fromRow, int fromColumn, int toRow, int toColumn, int rowCount, int columnCount) { CalcCalculationManager sourceMgr = (src == null) ? this.Manager : src.Manager; ChangingContext context = new ChangingContext(); Dictionary <CalcLocalIdentity, CalcExpression> formulas = this.GetFormulaIds(fromRow, fromColumn, rowCount, columnCount, sourceMgr, context, true); int sourceRowCount = (src == null) ? this.RowCount : src.RowCount; int sourceColumnCount = (src == null) ? this.ColumnCount : src.ColumnCount; FormulaClipboardHelper.Save(sourceMgr, this.Manager, context, sourceRowCount, sourceColumnCount, fromRow, fromColumn, toRow, toColumn, rowCount, columnCount, rowCount, columnCount, formulas, true, true); }
public static void SetFormula(CalcCalculationManager mgr, CalcLocalIdentity id, string fromula, bool isArrayFormual) { if (id is CalcCellIdentity) { mgr.SetFormula(id as CalcCellIdentity, fromula, isArrayFormual); } if (id is CalcRangeIdentity) { mgr.SetFormula(id as CalcRangeIdentity, fromula, isArrayFormual); } }
static void GetDependentsFromulas(CalcCalculationManager sourceMgr, CalcCalculationManager targetMgr, ChangingContext context, int fromRow, int fromColumn, int toRow, int toColumn, int fromRowCount, Dictionary <CalcLocalIdentity, CalcExpression> formulas, int fromColumnCount, bool offsetSelf, bool updataDependens) { int rowOffset = toRow - fromRow; int columnOffset = toColumn - fromColumn; CalcLocalIdentity id = FormulaOperatorHelper.Indexs2Identity(fromRow, fromColumn, (fromRow + fromRowCount) - 1, (fromColumn + fromColumnCount) - 1); CellRange fromRange = new CellRange(fromRow, fromColumn, fromRowCount, fromColumnCount); MoveVisitor visitor = new MoveVisitor(fromRange, rowOffset, columnOffset, 0x7fffffff, 0x7fffffff, true, targetMgr.Source, sourceMgr != targetMgr, null, !offsetSelf); sourceMgr.Source.GetEvaluatorContext(new CalcCellIdentity(toRow, toColumn)); new Dictionary <CalcIdentity, CalcIdentity>(); CalcNode node = sourceMgr.Graph.GetNode(id); IFormulaOperatorSource mgr = new SpreadCalcAxialManager.FormulaOperatorSource(sourceMgr); List <CalcLocalIdentity> list = new List <CalcLocalIdentity>(); HashSet <CalcNode> arrayFormulaNodes = new HashSet <CalcNode>(); if ((node != null) && updataDependens) { list = FormulaOperatorHelper.GetChangedDependents(mgr, context, node, arrayFormulaNodes, formulas, null); } if (offsetSelf && updataDependens) { foreach (CalcIdentity identity2 in sourceMgr.Graph.GetAllLocalIdentities()) { int num3; int num4; int num5; int num6; FormulaOperatorHelper.Identity2Indexs(identity2, out num3, out num4, out num5, out num6); if ((((fromRow == -1) || (num3 >= fromRow)) && ((fromRow == -1) || (num5 < (fromRow + fromRowCount)))) && (((fromColumn == -1) || (num4 >= fromColumn)) && ((fromColumn == -1) || (num6 < (fromColumn + fromColumnCount))))) { CalcNode node2 = sourceMgr.Graph.GetNode(identity2); if ((node2 != null) && (node2.Dependents != null)) { list.AddRange((IEnumerable <CalcLocalIdentity>)FormulaOperatorHelper.GetChangedDependents(mgr, context, node2, arrayFormulaNodes, formulas, null)); } } } visitor.CurrentCalcSource = sourceMgr.Source; foreach (CalcLocalIdentity identity3 in list) { int num7; int num8; int num9; int num10; CalcExpression expr = formulas[identity3]; FormulaOperatorHelper.Identity2Indexs(identity3, out num7, out num8, out num9, out num10); expr = visitor.Visit(expr, num7, num8); formulas[identity3] = expr; } } FormulaOperatorHelper.UpdataInvalidFormula(mgr, context, visitor); }
public static void Clear(CalcCalculationManager mgr, CalcLocalIdentity id) { Dictionary <CalcCellIdentity, CalcExpression> dictionary; Dictionary <CalcRangeIdentity, CalcExpression> dictionary2; FormulaOperatorHelper.GetAllContainsIds(mgr, id, out dictionary, out dictionary2); foreach (CalcCellIdentity identity in dictionary.Keys) { mgr.ClearExpression(identity); mgr.Invalidate(identity, false); } foreach (CalcRangeIdentity identity2 in dictionary2.Keys) { mgr.ClearExpression(identity2); mgr.Invalidate(identity2, false); } }
public static List <CalcRangeIdentity> GetAllContainsArrayFormulaIds(CalcCalculationManager manager, CalcLocalIdentity id) { int num; int num2; int num3; int num4; List <CalcRangeIdentity> list = new List <CalcRangeIdentity>(); Identity2Indexs(id, out num, out num2, out num3, out num4); foreach (CalcRangeIdentity identity in manager.Graph.GetAllArrayFormulaIdentities()) { if (ContainsOrEqual(manager, id, identity)) { list.Add(identity); } } return(list); }
public void InsertSheet(IList sources) { foreach (object obj2 in sources) { ICalcSource source = obj2 as ICalcSource; if (source != null) { CalcCalculationManager mgr = this.Manager.Service.GetCalculationManager(source, null, true); if (mgr != null) { foreach (CalcLocalIdentity identity in mgr.Graph.GetAllSheetRangeIdentities()) { CalcExpression expr = mgr.GetExpression(identity); CalcExpressionHelper.SetExpression(mgr, identity, expr, true); } } } } }
public static void SetExpression(CalcCalculationManager mgr, CalcLocalIdentity id, CalcExpression expr, bool?isArrayFormula = new bool?()) { if (id is CalcCellIdentity) { mgr.SetExpression(id as CalcCellIdentity, expr, false); } if (id is CalcRangeIdentity) { if (!isArrayFormula.HasValue) { isArrayFormula = new bool?(!(expr is CalcSharedExpression)); } else { CalcSharedExpression expression1 = expr as CalcSharedExpression; } mgr.SetExpression(id as CalcRangeIdentity, expr, isArrayFormula.Value); } }
public static void ValidateIntersectedArrayFormula(CalcCalculationManager mgr, int row, int column, int rowCount, int columnCount, bool isInsertRowOrColumn) { List <CalcRangeIdentity> list; List <CalcRangeIdentity> list2; CalcRangeIdentity objA = FormulaOperatorHelper.Indexs2Identity(row, column, (row + rowCount) - 1, (column + columnCount) - 1) as CalcRangeIdentity; if (object.ReferenceEquals(objA, null)) { objA = new CalcRangeIdentity(row, column, 1, 1); } mgr.GetArrayFormulaByRange(objA, out list, out list2); if ((list2 != null) && (list2.Count > 0)) { foreach (CalcRangeIdentity identity2 in list2) { if (!isInsertRowOrColumn || (((!identity2.IsFullRow && !objA.IsFullRow) || (identity2.RowIndex < row)) && ((!identity2.IsFullColumn && !objA.IsFullColumn) || (identity2.ColumnIndex < column)))) { throw new InvalidOperationException(ResourceStrings.FormulaChangePartOfArrayFormulaError); } } } }
public SpreadCalcAxialManager(Worksheet sheet, CalcCalculationManager manager, ICalcStorage <CalcLocalIdentity, CalcExpression> storage) { this.Sheet = sheet; this.Manager = manager; this.Storage = storage; }
static void GetTargetFormulas(CalcCalculationManager sourceMgr, CalcCalculationManager targetMgr, int sourceRowCount, int sourceColumnCount, int fromRow, int fromColumn, int toRow, int toColumn, int fromRowCount, int fromColumnCount, int toRowCount, int toColumnCount, Dictionary <CalcCellIdentity, CalcExpression> cellFormulas, Dictionary <CalcRangeIdentity, CalcExpression> rangeFormulas, bool offsetSelf, out Dictionary <CalcLocalIdentity, CalcExpression> newExpressions) { MoveVisitor visitor; int rowOffset = toRow - fromRow; int columnOffset = toColumn - fromColumn; CellRange fromRange = new CellRange(fromRow, fromColumn, fromRowCount, fromColumnCount); MoveVisitor visitor2 = new MoveVisitor(fromRange, rowOffset, columnOffset, sourceRowCount, sourceColumnCount, false, sourceMgr.Source, sourceMgr != targetMgr, null, !offsetSelf); newExpressions = new Dictionary <CalcLocalIdentity, CalcExpression>(); if ((cellFormulas != null) && (cellFormulas.Count > 0)) { for (int i = toRow; i < (toRow + toRowCount); i++) { int rowIndex = ((i - toRow) % fromRowCount) + fromRow; for (int j = toColumn; j < (toColumn + toColumnCount); j++) { int columnIndex = ((j - toColumn) % fromColumnCount) + fromColumn; CalcCellIdentity identity = new CalcCellIdentity(rowIndex, columnIndex); CalcCellIdentity id = new CalcCellIdentity(i, j); if (cellFormulas.ContainsKey(identity)) { CalcExpression expr = cellFormulas[identity]; if (!offsetSelf) { visitor = new MoveVisitor(fromRange, rowOffset, columnOffset, sourceRowCount, sourceColumnCount, false, sourceMgr.Source, false, null, true); expr = visitor.FirstVisit(expr, identity.RowIndex, identity.ColumnIndex); } else { expr = visitor2.Visit(expr, identity.RowIndex, identity.ColumnIndex); } newExpressions[id] = expr; } else if (targetMgr.GetExpression(id) != null) { newExpressions[id] = null; } } } } int num7 = (toRow + toRowCount) - 1; int num8 = (toColumn + toColumnCount) - 1; if ((rangeFormulas != null) && (rangeFormulas.Count > 0)) { foreach (KeyValuePair <CalcRangeIdentity, CalcExpression> pair in rangeFormulas) { int baseRow = (pair.Key.RowIndex < 0) ? 0 : pair.Key.RowIndex; int baseColumn = (pair.Key.ColumnIndex < 0) ? 0 : pair.Key.ColumnIndex; if (!pair.Key.IsFullRow || !pair.Key.IsFullColumn) { if (pair.Key.IsFullColumn) { for (int k = toColumn; k <= num8; k += fromColumnCount) { int num12 = (k + pair.Key.ColumnCount) - 1; num12 = (num12 > num8) ? (num8 - k) : num12; CalcRangeIdentity identity3 = new CalcRangeIdentity((k + pair.Key.ColumnIndex) - fromColumn, (num12 - k) + 1, false); CalcExpression expression2 = pair.Value; if (!offsetSelf) { visitor = new MoveVisitor(fromRange, 0, columnOffset, sourceRowCount, sourceColumnCount, false, sourceMgr.Source, sourceMgr != targetMgr, null, true); expression2 = visitor.Visit(expression2, baseRow, baseColumn); } else { expression2 = visitor2.Visit(expression2, baseRow, baseColumn); } newExpressions[identity3] = expression2; } } else if (pair.Key.IsFullRow) { for (int m = toRow; m <= num7; m += fromRowCount) { int num14 = (m + pair.Key.RowCount) - 1; num14 = (num14 > num7) ? (num7 - m) : num14; CalcRangeIdentity identity4 = new CalcRangeIdentity((m + pair.Key.RowIndex) - fromRow, (num14 - m) + 1, true); CalcExpression expression3 = pair.Value; if (!offsetSelf) { visitor = new MoveVisitor(fromRange, rowOffset, 0, sourceRowCount, sourceColumnCount, false, sourceMgr.Source, sourceMgr != targetMgr, null, true); expression3 = visitor.Visit(expression3, baseRow, baseColumn); } else { expression3 = visitor2.Visit(expression3, baseRow, baseColumn); } newExpressions[identity4] = expression3; } } else { for (int n = toRow; n <= num7; n += fromRowCount) { int num16 = (n + pair.Key.RowCount) - 1; num16 = (num16 > num7) ? (num7 - n) : num16; for (int num17 = toColumn; num17 <= num8; num17 += fromColumnCount) { int num18 = (num17 + pair.Key.ColumnCount) - 1; num18 = (num18 > num8) ? (num8 - num17) : num18; CalcRangeIdentity identity5 = new CalcRangeIdentity((n + pair.Key.RowIndex) - fromRow, (num17 + pair.Key.ColumnIndex) - fromColumn, (num16 - n) + 1, (num18 - num17) + 1); CalcExpression expression4 = pair.Value; if (!offsetSelf) { expression4 = new MoveVisitor(fromRange, rowOffset, columnOffset, sourceRowCount, sourceColumnCount, false, sourceMgr.Source, sourceMgr != targetMgr, null, true).Visit(expression4, baseRow, baseColumn); } else { expression4 = visitor2.Visit(expression4, baseRow, baseColumn); } newExpressions[identity5] = expression4; } } } } } } }
public FormulaOperatorSource(CalcCalculationManager manager) { this.Manager = manager; }
Dictionary <CalcLocalIdentity, CalcExpression> GetFormulaIds(int fromRow, int fromColumn, int rowCount, int columnCount, CalcCalculationManager sourceMgr, ChangingContext context, bool clearSource) { CalcLocalIdentity id = FormulaOperatorHelper.Indexs2Identity(fromRow, fromColumn, (fromRow + rowCount) - 1, (fromColumn + columnCount) - 1); Dictionary <CalcLocalIdentity, CalcExpression> allContainsIds = FormulaOperatorHelper.GetAllContainsIds(sourceMgr, id); if (clearSource) { foreach (CalcLocalIdentity identity2 in allContainsIds.Keys) { if (sourceMgr == this.Manager) { context.ChangedFormulas[identity2] = null; } else { context.AddExtChangedFormula(new FormulaOperatorSource(sourceMgr), identity2, identity2, null); } } } return(allContainsIds); }
internal static void GetAllContainsIds(CalcCalculationManager mgr, CalcLocalIdentity id, out Dictionary <CalcCellIdentity, CalcExpression> cellFromulas, out Dictionary <CalcRangeIdentity, CalcExpression> arrayFormulas) { cellFromulas = new Dictionary <CalcCellIdentity, CalcExpression>(); arrayFormulas = new Dictionary <CalcRangeIdentity, CalcExpression>(); CalcLocalIdentity identity = id; CalcExpression expression = mgr.GetExpression(identity); if ((expression == null) && (id is CalcCellIdentity)) { int rowIndex = (id as CalcCellIdentity).RowIndex; int columnIndex = (id as CalcCellIdentity).ColumnIndex; CalcRangeIdentity identity2 = new CalcRangeIdentity(rowIndex, columnIndex, 1, 1); expression = mgr.GetExpression(identity2); identity = identity2; } bool flag = false; if (expression == null) { flag = mgr.IsIsIntersectantWithArrayFormula(identity); } if (expression != null) { if (identity is CalcCellIdentity) { cellFromulas.Add(identity as CalcCellIdentity, expression); } else if (identity is CalcRangeIdentity) { arrayFormulas.Add(identity as CalcRangeIdentity, expression); } } else { if ((id is CalcCellIdentity) && flag) { throw new InvalidOperationException(ResourceStrings.FormulaChangePartOfArrayFormulaError); } if (id is CalcRangeIdentity) { CalcRangeIdentity identity3 = id as CalcRangeIdentity; if ((identity3.RowCount != 1) || (identity3.ColumnCount != 1)) { foreach (CalcLocalIdentity identity4 in mgr.Graph.GetAllLocalIdentities()) { if (ContainsOrEqual(mgr, id, identity4)) { expression = mgr.GetExpression(identity4); if (expression != null) { if (identity4 is CalcCellIdentity) { cellFromulas[identity4 as CalcCellIdentity] = expression; } else if (identity4 is CalcRangeIdentity) { arrayFormulas.Add(identity4 as CalcRangeIdentity, expression); } } } } } } } }
internal static Dictionary <CalcLocalIdentity, CalcExpression> GetAllContainsIds(CalcCalculationManager mgr, CalcLocalIdentity id) { Dictionary <CalcCellIdentity, CalcExpression> dictionary2; Dictionary <CalcRangeIdentity, CalcExpression> dictionary3; Dictionary <CalcLocalIdentity, CalcExpression> dictionary = new Dictionary <CalcLocalIdentity, CalcExpression>(); GetAllContainsIds(mgr, id, out dictionary2, out dictionary3); foreach (KeyValuePair <CalcCellIdentity, CalcExpression> pair in dictionary2) { CalcCellIdentity introduced7 = pair.Key; dictionary[introduced7] = pair.Value; } foreach (KeyValuePair <CalcRangeIdentity, CalcExpression> pair2 in dictionary3) { CalcRangeIdentity introduced8 = pair2.Key; dictionary[introduced8] = pair2.Value; } return(dictionary); }