public void Undo() { if (!history.CanUndo) { return; } HistoryAction action = history.Undo(); action.Undo(this); }
public void Redo() { if (!history.CanRedo) { return; } HistoryAction action = history.Redo(); action.Redo(this); }
public HistoryAction Redo() { if (!CanRedo) { throw new Exception("Cannot redo."); } HistoryAction action = redoStack.Pop(); undoStack.Push(action); return(action); }
public void Add(HistoryAction action) { if (!isActive) { return; } if (!TryMerge(action)) { undoStack.Push(action); } redoStack.Clear(); }
private bool TryMerge(HistoryAction action) { if (!(action is IMergable)) { return(false); } if (undoStack.Count == 0) { return(false); } if (!(undoStack.Peek() is IMergable)) { return(false); } return((undoStack.Peek() as IMergable).Merge(action)); }
public bool Merge(HistoryAction action) { if (!(action is TextAction)) { return(false); } TextAction newAction = (action as TextAction); if (this.ActiveSheet != newAction.ActiveSheet) { return(false); } if (this.RowNumber != newAction.RowNumber) { return(false); } if (this.isTyping && newAction.isTyping && this.typingAtIndex + 1 == newAction.typingAtIndex && //typing continues from same position this.NewText[typingAtIndex] != ' ') //break action at space { this.NewText = newAction.NewText; this.typingAtIndex = newAction.typingAtIndex; return(true); } if (this.isDeleting && newAction.isDeleting && this.deletingAtIndex - 1 == newAction.deletingAtIndex && //deleting continues from same position this.PreviousText[deletingAtIndex] != ' ') //break action at space { this.NewText = newAction.NewText; this.deletingAtIndex = newAction.deletingAtIndex; return(true); } return(false); }