Advertisement
Layvu

Seminary3

Feb 19th, 2023 (edited)
49
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.90 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4.  
  5. namespace Seminary3
  6. {
  7.     public enum ActionName : byte
  8.     {
  9.         Insertion,
  10.         Deletion,
  11.         CursorMovemention
  12.     }
  13.  
  14.     public class Command
  15.     {
  16.         public Command(ActionName typeAction, int elementPosition, char element)
  17.         {
  18.             TypeAction = typeAction;
  19.             ElementPosition = elementPosition;
  20.             Element = element;
  21.         }
  22.  
  23.         public ActionName TypeAction { get; }
  24.         public int ElementPosition { get; }
  25.         public char Element { get; }
  26.     }
  27.  
  28.     class Cursor
  29.     {
  30.         public static int Position { get; set; }
  31.     }
  32.  
  33.     class TextEditor
  34.     {
  35.         public TextEditor(List<char> inputText)
  36.         {
  37.             Text = inputText;
  38.             UndoCommandsStack = new Stack<Command>();
  39.             RedoCommandsStack = new Stack<Command>();
  40.         }
  41.  
  42.         private static List<char> Text { get; set; }
  43.        
  44.         private Stack<Command> UndoCommandsStack { get; }
  45.         private Stack<Command> RedoCommandsStack { get; }
  46.         private static Stack<Command> ExecutedCommands { get; set; }
  47.        
  48.        
  49.         public void MoveCursorTo(int position)
  50.         {
  51.             Cursor.Position = position;
  52.            
  53.             var newCommand = new Command(ActionName.CursorMovemention, position, default);
  54.             ExecutedCommands.Push(newCommand);
  55.         }
  56.  
  57.         public static void InsertChar(char inputSymbol)
  58.         {
  59.             Text.Insert(Cursor.Position, inputSymbol);
  60.             Cursor.Position++;
  61.            
  62.             var newCommand = new Command(ActionName.Insertion, Cursor.Position, inputSymbol);
  63.             ExecutedCommands.Push(newCommand);
  64.         }
  65.  
  66.         public void DeleteChar()
  67.         {
  68.             var delSymbol = Text[Cursor.Position];
  69.             Text.RemoveAt(Cursor.Position);
  70.             if (Cursor.Position > 0) Cursor.Position--;
  71.            
  72.             var newCommand = new Command(
  73.                 ActionName.Deletion, Cursor.Position, delSymbol);
  74.             ExecutedCommands.Push(newCommand);
  75.         }
  76.  
  77.         private bool CanUndo() => ExecutedCommands.Count != 0;
  78.        
  79.         public void Undo()
  80.         {
  81.             if (CanUndo())
  82.             {
  83.                 var lastCommand = ExecutedCommands.Pop();
  84.                 if (lastCommand.TypeAction == ActionName.Insertion)
  85.                     Text.RemoveAt(lastCommand.ElementPosition);
  86.                 else if (lastCommand.TypeAction == ActionName.Deletion)
  87.                     Text.Insert(lastCommand.ElementPosition, lastCommand.Element);
  88.                 else
  89.                     Cursor.Position = lastCommand.ElementPosition;
  90.                
  91.                 UndoCommandsStack.Push(lastCommand);
  92.             }
  93.             else
  94.                 throw new InvalidOperationException();
  95.         }
  96.  
  97.         private bool CanRedo() => UndoCommandsStack.Count != 0;
  98.        
  99.         public void Redo()
  100.         {
  101.             if (CanRedo())
  102.             {
  103.                 Command lastCommand = UndoCommandsStack.Pop();
  104.                 if (lastCommand.TypeAction == ActionName.Insertion)
  105.                 {
  106.                     Text.Insert(lastCommand.ElementPosition, lastCommand.Element);
  107.                     Cursor.Position++;
  108.                 }
  109.                 else if (lastCommand.TypeAction == ActionName.Deletion)
  110.                 {
  111.                     Text.RemoveAt(lastCommand.ElementPosition);
  112.                     if (Cursor.Position > 0) Cursor.Position--;
  113.                 }
  114.                 else
  115.                     Cursor.Position = lastCommand.ElementPosition;
  116.  
  117.                 RedoCommandsStack.Push(lastCommand);
  118.             }
  119.             else
  120.                 throw new InvalidOperationException();
  121.         }
  122.     }
  123.    
  124.     class Program
  125.     {
  126.         public static void Main()
  127.         {
  128.         }
  129.     }
  130. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement