diff --git a/src/BlazorDatasheet.Core/Commands/MergeCellsCommand.cs b/src/BlazorDatasheet.Core/Commands/MergeCellsCommand.cs index 3fccee00..2923fa70 100644 --- a/src/BlazorDatasheet.Core/Commands/MergeCellsCommand.cs +++ b/src/BlazorDatasheet.Core/Commands/MergeCellsCommand.cs @@ -25,6 +25,7 @@ public MergeCellsCommand(IRegion region) public bool Execute(Sheet sheet) { + sheet.Cells.BatchChanges(); _overridenMergedRegions.Clear(); _mergesPerformed.Clear(); @@ -53,16 +54,14 @@ public bool Execute(Sheet sheet) // Store the merge that we are doing and perform the actual merge _mergesPerformed.Add(region); sheet.Cells.MergeImpl(region); + sheet.Cells.EndBatchChanges(); return true; } - private CellValueChange getValueChangeOnClear(int row, int col, Sheet sheet) - { - return new CellValueChange(row, col, sheet.Cells.GetValue(row, col)); - } - public bool Undo(Sheet sheet) { + sheet.Cells.BatchChanges(); + // Undo the merge we performed foreach (var merge in _mergesPerformed) sheet.Cells.UnMergeCellsImpl(merge); @@ -72,6 +71,7 @@ public bool Undo(Sheet sheet) // Restore all the cell values that were lost when merging sheet.Cells.Restore(_restoreData); + sheet.Cells.EndBatchChanges(); return true; } diff --git a/src/BlazorDatasheet.Core/Data/Cells/CellStore.cs b/src/BlazorDatasheet.Core/Data/Cells/CellStore.cs index f4edae52..c22b248f 100644 --- a/src/BlazorDatasheet.Core/Data/Cells/CellStore.cs +++ b/src/BlazorDatasheet.Core/Data/Cells/CellStore.cs @@ -174,6 +174,7 @@ internal CellStoreRestoreData CopyImpl(IRegion fromRegion, IRegion toRegion, Cop { restoreData.ValueRestoreData = _dataStore.Copy(fromRegion, toRegion); restoreData.ValidRestoreData = _validStore.Copy(fromRegion, toRegion); + restoreData.FormulaRestoreData = _formulaStore.Clear(toRegion); } if (options.CopyFormula) diff --git a/src/BlazorDatasheet.Core/FormulaEngine/FormulaEngine.cs b/src/BlazorDatasheet.Core/FormulaEngine/FormulaEngine.cs index 0b83b475..cdfa0a85 100644 --- a/src/BlazorDatasheet.Core/FormulaEngine/FormulaEngine.cs +++ b/src/BlazorDatasheet.Core/FormulaEngine/FormulaEngine.cs @@ -2,6 +2,7 @@ using BlazorDatasheet.Core.Data.Cells; using BlazorDatasheet.Core.Events; using BlazorDatasheet.Core.Events.Edit; +using BlazorDatasheet.Core.Events.Layout; using BlazorDatasheet.DataStructures.Geometry; using BlazorDatasheet.DataStructures.Graph; using BlazorDatasheet.DataStructures.References; @@ -29,7 +30,7 @@ public class FormulaEngine /// This should ideally keep track of the formula that reference the range also, /// but for now it's just whether it's referenced or not. /// - private RegionDataStore _observedRanges = new(); + private readonly RegionDataStore _observedRanges; public bool IsCalculating { get; private set; } @@ -43,6 +44,7 @@ public FormulaEngine(Sheet sheet) _environment = new SheetEnvironment(sheet); _evaluator = new Evaluator(_environment); _dependencyGraph = new DependencyGraph(); + _observedRanges = new RegionDataStore(); RegisterDefaultFunctions(); } diff --git a/src/BlazorDatasheet/Datasheet.razor b/src/BlazorDatasheet/Datasheet.razor index f01c82ce..a4d5d3b8 100644 --- a/src/BlazorDatasheet/Datasheet.razor +++ b/src/BlazorDatasheet/Datasheet.razor @@ -122,12 +122,16 @@ var mergesInView = Sheet.Cells.GetMerges(this.Viewport.VisibleRegion); @foreach (var merge in mergesInView) { - var row = merge.Top; - var col = merge.Left; + var constrainedMerge = merge.GetIntersection(_sheetLocal.Region); + if (constrainedMerge == null) + continue; + + var row = constrainedMerge.Top; + var col = constrainedMerge.Left; var cell = _visualSheet.GetVisualCell(row, col);
CustomCellTypes { get; set; } + [Parameter, EditorRequired] public Dictionary CustomCellTypes { get; set; } - [Parameter, EditorRequired] - public Dictionary DefaultCellTypes { get; set; } + [Parameter, EditorRequired] public Dictionary DefaultCellTypes { get; set; } private Sheet? _sheet; - [Parameter, EditorRequired] - public CellLayoutProvider CellLayoutProvider { get; set; } + [Parameter, EditorRequired] public CellLayoutProvider CellLayoutProvider { get; set; } /// The type of the active editor, which is an ICellEditor private Type? ActiveEditorType { get; set; } = typeof(TextEditorComponent); @@ -75,11 +71,13 @@ _sheet.Editor.EditFinished -= EditorOnEditFinished; _sheet.Editor.EditValueChanged -= EditorOnEditValueChanged; } + _sheet = Sheet; _sheet.Editor.EditBegin += EditorOnEditBegin; _sheet.Editor.EditFinished += EditorOnEditFinished; _sheet.Editor.EditValueChanged += EditorOnEditValueChanged; } + base.OnParametersSet(); } @@ -138,9 +136,9 @@ { if (!EqualityComparer.Default.Equals(_activeCellEditor.InputRef, default(ElementReference))) { - // Request focus with a delay so that it the field doesn't capture any oninput events - // from the text field that is just rendered. If not, there's inconsistent behaviour between - // WASM and Server. + // Request focus with a delay so that it the field doesn't capture any oninput events + // from the text field that is just rendered. If not, there's inconsistent behaviour between + // WASM and Server. await JS.InvokeVoidAsync("setFocusWithTimeout", _activeCellEditor.InputRef, 0); } } @@ -190,7 +188,9 @@ var left = CellLayoutProvider.ComputeLeftPosition(EditCell.Col); var top = CellLayoutProvider.ComputeTopPosition(EditCell.Row); - var mergedPosn = Sheet.Cells.GetMerge(EditCell.Row, EditCell.Col); + var mergedPosn = Sheet.Cells.GetMerge(EditCell.Row, EditCell.Col)? + .GetIntersection(Sheet.Region); + int colSpan = 1; int rowSpan = 1;