ReplaceAll runs inside a history batch, so one Ctrl+Z restores every replaced cell.
- commit
- 3fe4c54f48a0c208a55d7d4ba37383bd2da71039
- parent
- a2eb17eed4c01b9c4e87f2a6e4fddb46b00d5252
- author
- Dami <dami.etoile@gmail.com>
| M | internal/ | 26 | +++++++++++++++++--------- |
| M | internal/ | 15 | +++++++++++++++ |
@@ -118,14 +118,22 @@ func (s *Sheet) ReplaceAll(query, repl string, o FindOptions) (int, error) {
118118 return 0, err119119 }120120 n := 0121- for _, a := range cells {122- changed, err := s.replace(a, f, repl)123- if err != nil {124- return n, err121+ var focus Rect122+ if len(cells) > 0 {123+ focus = NewRect(cells[0], cells[len(cells)-1])124+ }125+ // One undo step for the whole replacement.126+ err = s.Batch(Change{Label: "replace all", Focus: focus}, func() error {127+ for _, a := range cells {128+ changed, err := s.replace(a, f, repl)129+ if err != nil {130+ return err131+ }132+ if changed {133+ n++134+ }125135 }126- if changed {127- n++128- }129- }130- return n, nil136+ return nil137+ })138+ return n, err131139 }@@ -109,3 +109,18 @@ func TestReplace(t *testing.T) {
109109 t.Errorf("E1 changed to %q", got)110110 }111111 }112+113+func TestReplaceAllIsOneUndoStep(t *testing.T) {114+ s := findSheet()115+ if n, err := s.ReplaceAll("rent", "Lease", FindOptions{}); n != 4 || err != nil {116+ t.Fatalf("ReplaceAll = %d, %v", n, err)117+ }118+ if _, ok := s.Undo(); !ok {119+ t.Fatal("nothing to undo")120+ }121+ for a, want := range map[string]string{"A1": "Rent", "A2": "rental car", "C1": "Rent", "C2": "Total rent: $5"} {122+ if got := s.Cell(at(a)).Input; got != want {123+ t.Errorf("%s = %q after undo, want %q", a, got, want)124+ }125+ }126+}