private void btnRelation_Click(object sender, EventArgs e) { this.IsChecked_btnRectRed = false; this.IsChecked_btnRectBlue = false; this.IsChecked_btnSelect = false; if (Selected.Count == 2) { Point Start = GetNearestPoint(Selected[1], Selected[0].Center()); Point End = GetNearestPoint(Selected[0], Selected[1].Center()); Rel = new Relation(Start, End); Rel.EventList.Add(Selected[0]); Rel.EventList.Add(Selected[1]); Rel.HierarchyID[0] = Canvas_ID; Rel.HierarchyID[1] = Guid.NewGuid(); CmdAddRelation CmdAddRelation = new CmdAddRelation(); Rel.Username = Username; CmdAddRelation.ID_Command = Guid.NewGuid(); CmdAddRelation.Execute(Rel); CmdAddRelation.hierarchyID = Rel.HierarchyID; Command_manager = Manager.SaveCommand(CmdAddRelation, CmdAddRelation.isUndo, CmdAddRelation.isRedo); BinaryFormatter bf = new BinaryFormatter(); using (MemoryStream data = new MemoryStream()) { bf.Serialize(data, CmdAddRelation); ServerStream_priv.Write(data.ToArray(), 0, data.ToArray().Length); ServerStream_priv.Flush(); } } }
public UndoRedoManager() { Commands = new UndoRedoWrapper[500]; LastCommand = new Dictionary <Guid, int>(); Counter = 0; UndoCounter = 0; }
public UndoRedoWrapper Inverse(UndoRedoWrapper command) { UndoRedoWrapper helperCommand = command; helperCommand.IsInverse = true; return(helperCommand); }
public bool ConflictAll(int position) { bool result = false; UndoRedoWrapper[] tempCommands_array = new UndoRedoWrapper[Commands.Length]; for (int i = 0; i < Counter; i++) { tempCommands_array[i] = Commands[i]; } for (int i = position; i < Counter - 1; i++) { if (CheckingUndo(tempCommands_array[i], tempCommands_array[i + 1])) { result = false; } else { if (Conflict(tempCommands_array[i], tempCommands_array[i + 1])) { result = true; break; } else { result = false; Swap(tempCommands_array[i], tempCommands_array[i + 1], tempCommands_array); } } } return(result); }
public bool CheckingUndo(UndoRedoWrapper command1, UndoRedoWrapper command2) { bool result = false; for (int i = Counter - 1; i >= 0; i--) { if (Commands[Commands[i].UndoCommand].ID_Command == command2.ID_Command) { result = true; } } return(result); }
private void btnUndo_Click(object sender, EventArgs e) { Command_Interface.ICommand CmdUndo; int Position = Manager.GetCommand(Username); if (Manager.Commands[Position].IsUndo) { Command_manager = Manager.Commands[Position]; Command_manager = Manager.Commands[Command_manager.PrevCommand]; Inverse_command = new Undo_Redo.UndoRedoWrapper(Command_manager.Command); CmdUndo = Inverse_command.Command; } else { Command_manager = Manager.Commands[Position]; Inverse_command = new Undo_Redo.UndoRedoWrapper(Command_manager.Command); CmdUndo = Manager.GetCommandByPosition(Position); } if (Manager.ConflictAll(Position)) { Console.WriteLine("There was some error acquired!"); } else { CmdUndo.IsUndo = true; CmdUndo.ID_Command = Guid.NewGuid(); CmdUndo.IsInverse = true; Inverse_command = Manager.Inverse(Command_manager); Inverse_command = Manager.SaveCommand(CmdUndo, CmdUndo.IsUndo, CmdUndo.IsRedo); btnRedo.Enabled = true; BinaryFormatter bf = new BinaryFormatter(); using (MemoryStream data = new MemoryStream()) { bf.Serialize(data, CmdUndo); ServerStream_priv.Write(data.ToArray(), 0, data.ToArray().Length); ServerStream_priv.Flush(); } } }
public void Swap(UndoRedoWrapper command1, UndoRedoWrapper command2, UndoRedoWrapper[] commands_array) { int helper1 = 0; int helper2 = 0; for (int i = 0; i < Counter; i++) { if (Commands[i] == command1) { helper1 = i; } else if (Commands[i] == command2) { helper2 = i; } } commands_array[helper1] = command2; commands_array[helper2] = command1; }
public void SetCommand(UndoRedoWrapper command) { if (LastCommand.ContainsKey(command.Command.Username)) { int position = 0; for (int i = Counter; i >= 0; i--) { if (command == Commands[i]) { position = i; } } LastCommand[command.Command.Username] = position; } else { LastCommand.Add(command.Command.Username, Counter); } }
private void btnRedo_Click(object sender, EventArgs e) { Command_Interface.ICommand cmdRedo; int position = Manager.GetCommand(Username); if (Manager.Commands[position].IsUndo) { Command_manager = Manager.Commands[position]; Command_manager = Manager.Commands[Command_manager.UndoCommand]; Redo_command = new Undo_Redo.UndoRedoWrapper(Command_manager.Command); cmdRedo = Redo_command.Command; if (Manager.ConflictAll(position)) { Console.WriteLine("There was some error acquired!"); } else { cmdRedo.IsUndo = false; cmdRedo.IsRedo = true; cmdRedo.ID_Command = Guid.NewGuid(); Redo_command = Manager.SaveCommand(cmdRedo, cmdRedo.IsUndo, cmdRedo.IsRedo); Console.WriteLine(Manager.GetCommand(Username)); BinaryFormatter bf = new BinaryFormatter(); using (MemoryStream data = new MemoryStream()) { bf.Serialize(data, cmdRedo); ServerStream_priv.Write(data.ToArray(), 0, data.ToArray().Length); ServerStream_priv.Flush(); } } btnRedo.Enabled = false; } }
public bool Conflict(UndoRedoWrapper command1, UndoRedoWrapper command2) { int command1_level = 0; int command2_level = 0; for (int i = 0; i < 5; i++) { if (command1.Command.HierarchyID[i] == new Guid("00000000-0000-0000-0000-000000000000")) { command1_level = i; break; } } for (int i = 0; i < 5; i++) { if (command2.Command.HierarchyID[i] == new Guid("00000000-0000-0000-0000-000000000000")) { command2_level = i; break; } } bool result = false; for (int i = 0; i < Math.Max(command2_level, command1_level); i++) { if (command1.Command.HierarchyID[i] == command2.Command.HierarchyID[i] || i > Math.Min(command1_level - 1, command2_level - 1)) { result = true; } else { result = false; break; } } return(result); }
private void btnDelete_Click(object sender, EventArgs e) { this.IsChecked_btnRectRed = false; this.IsChecked_btnRectBlue = false; this.IsChecked_btnSelect = false; if (Selected.Count == 1) { for (int i = 0; i < Objects.Count; i++) { if (Selected[0] == Objects[i]) { Objects[i].Moved = false; Objects[i].Deleted = true; if (Objects[i].Name == "Rectangle Red") { CmdDeleteRectangleRed CmdDeleteEventOne = new CmdDeleteRectangleRed(); Rect_Red = (RectangleRed)Objects[i]; Rect_Red.Username = Username; CmdDeleteEventOne.ID_Command = Guid.NewGuid(); CmdDeleteEventOne.Execute(Rect_Red); CmdDeleteEventOne.hierarchyID = Rect.HierarchyID; Command_manager = Manager.SaveCommand(CmdDeleteEventOne, CmdDeleteEventOne.isUndo, CmdDeleteEventOne.isRedo); BinaryFormatter bf = new BinaryFormatter(); using (MemoryStream data = new MemoryStream()) { bf.Serialize(data, CmdDeleteEventOne); ServerStream_priv.Write(data.ToArray(), 0, data.ToArray().Length); ServerStream_priv.Flush(); } } else if (Objects[i].Name == "Rectangle Blue") { CmdDeleteRectangleBlue CmdDeleteEventTwo = new CmdDeleteRectangleBlue(); Rect_Blue = (RectangleBlue)Objects[i]; Rect_Blue.Username = Username; CmdDeleteEventTwo.ID_Command = Guid.NewGuid(); CmdDeleteEventTwo.Execute(Rect_Blue); CmdDeleteEventTwo.hierarchyID = Rect.HierarchyID; Command_manager = Manager.SaveCommand(CmdDeleteEventTwo, CmdDeleteEventTwo.isUndo, CmdDeleteEventTwo.isRedo); BinaryFormatter bf = new BinaryFormatter(); using (MemoryStream data = new MemoryStream()) { bf.Serialize(data, CmdDeleteEventTwo); ServerStream_priv.Write(data.ToArray(), 0, data.ToArray().Length); ServerStream_priv.Flush(); } } else if (Objects[i].Name == "Relation") { CmdDeleteRelation CmdDeleteRelation = new CmdDeleteRelation(); Rel = (Relation)Objects[i]; Rel.Username = Username; CmdDeleteRelation.ID_Command = Guid.NewGuid(); CmdDeleteRelation.Execute(Rel); CmdDeleteRelation.hierarchyID = Rel.HierarchyID; Command_manager = Manager.SaveCommand(CmdDeleteRelation, CmdDeleteRelation.isUndo, CmdDeleteRelation.isRedo); BinaryFormatter bf = new BinaryFormatter(); using (MemoryStream data = new MemoryStream()) { bf.Serialize(data, CmdDeleteRelation); ServerStream_priv.Write(data.ToArray(), 0, data.ToArray().Length); ServerStream_priv.Flush(); } } Selected.Clear(); break; } } } }
//---------------------------------------------------------------------------- private void pnlCenter_MouseClick(object sender, MouseEventArgs e) { if (this.IsChecked_btnRectRed) { int x = e.Location.X; int y = e.Location.Y; Rect_Red = new RectangleRed(x, y); Rect_Red.Username = Username; Rect_Red.HierarchyID[0] = Canvas_ID; Rect_Red.HierarchyID[1] = Guid.NewGuid(); CmdAddRectangleRed CmdAddRect = new CmdAddRectangleRed(); CmdAddRect.username = Username; CmdAddRect.ID_Command = Guid.NewGuid(); CmdAddRect.Execute(Rect_Red); CmdAddRect.hierarchyID = Rect_Red.HierarchyID; CmdAddRect.eventList = Rect_Red.EventList; Command_manager = Manager.SaveCommand(CmdAddRect, CmdAddRect.isUndo, CmdAddRect.isRedo); BinaryFormatter bf = new BinaryFormatter(); using (MemoryStream data = new MemoryStream()) { bf.Serialize(data, CmdAddRect); ServerStream_priv.Write(data.ToArray(), 0, data.ToArray().Length); ServerStream_priv.Flush(); } } else if (this.IsChecked_btnRectBlue) { int x = e.Location.X; int y = e.Location.Y; Rect_Blue = new RectangleBlue(x, y); CmdAddRectangleBlue CmdAddRect = new CmdAddRectangleBlue(); Rect_Blue.Username = Username; Rect_Blue.HierarchyID[0] = Canvas_ID; Rect_Blue.HierarchyID[1] = Guid.NewGuid(); CmdAddRect.ID_Command = Guid.NewGuid(); CmdAddRect.eventList = Rect_Blue.EventList; CmdAddRect.Execute(Rect_Blue); CmdAddRect.hierarchyID = Rect_Blue.HierarchyID; Command_manager = Manager.SaveCommand(CmdAddRect, CmdAddRect.isUndo, CmdAddRect.isRedo); BinaryFormatter bf = new BinaryFormatter(); using (MemoryStream data = new MemoryStream()) { bf.Serialize(data, CmdAddRect); ServerStream_priv.Write(data.ToArray(), 0, data.ToArray().Length); ServerStream_priv.Flush(); } } else if (this.IsChecked_btnSelect) { int x = e.Location.X; int y = e.Location.Y; if (this.CheckUnselection(x, y, Objects)) { for (int i = Objects.Count - 1; i >= 0; i--) { if (Objects[i].Name == "Relation") { Point Start = GetNearestPoint(Objects[i].EventList[0], Objects[i].EventList[1].Center()); Point End = GetNearestPoint(Objects[i].EventList[1], Objects[i].EventList[0].Center()); bool helper = CheckSelectionLine(x, y, End.X, End.Y, Start.X, Start.Y); if (helper) { SelectRelation((Relation)Objects[i]); break; } } else if (Objects[i].Name == "Label") { bool helper = this.CheckSelection(x, y, Objects[i].X, Objects[i].Y, Objects[i].X + 75, Objects[i].Y + 15); if (helper) { SelectLabelEvent((Objects.Label)Objects[i]); break; } } else { bool helper = this.CheckSelection(x, y, Objects[i].X, Objects[i].Y, Objects[i].X + 150, Objects[i].Y + 70); if (helper) { if (Objects[i].Name == "Rectangle Red") { SelectRectangleRed((RectangleRed)Objects[i]); break; } else if (Objects[i].Name == "Rectangle Blue") { SelectRectangleBlue((RectangleBlue)Objects[i]); break; } } } } } else { for (int i = Objects.Count - 1; i >= 0; i--) { Objects[i].Unselect(pnlCenter); Objects[i].Selected = false; Selected.Clear(); } } } }
private void btnAddLabel_Click(object sender, EventArgs e) { Objects.Label Label_object = new Objects.Label(); if (Selected.Count == 1) { CmdAddLabel CmdLabel = new CmdAddLabel(); if (!Selected[0].EventList.Any()) { Label_object = new Objects.Label(Selected[0].X + 20, Selected[0].Y + 10); Label_object.EventList.Add(Selected[0]); Label_object.Username = Username; for (int i = 0; i < 5; i++) { if (Label_object.EventList[0].HierarchyID[i] != new Guid("00000000-0000-0000-0000-000000000000")) { Label_object.HierarchyID[i] = Label_object.EventList[0].HierarchyID[i]; } else { Label_object.HierarchyID[i] = Guid.NewGuid(); } } } else if (Selected[0].EventList.Count == 1) { Label_object = new Objects.Label(Selected[0].X + 20, Selected[0].Y + 30); Label_object.EventList.Add(Selected[0]); Label_object.Username = Username; for (int i = 0; i < 5; i++) { if (Label_object.EventList[0].HierarchyID[i] != new Guid("00000000-0000-0000-0000-000000000000")) { Label_object.HierarchyID[i] = Label_object.EventList[0].HierarchyID[i]; } else { Label_object.HierarchyID[i] = Guid.NewGuid(); } } } else if (Selected[0].EventList.Count == 2) { Label_object = new Objects.Label(Selected[0].X + 20, Selected[0].Y + 50); Label_object.EventList.Add(Selected[0]); Label_object.Username = Username; for (int i = 0; i < 5; i++) { if (Label_object.EventList[0].HierarchyID[i] != new Guid("00000000-0000-0000-0000-000000000000")) { Label_object.HierarchyID[i] = Label_object.EventList[0].HierarchyID[i]; } else { Label_object.HierarchyID[i] = Guid.NewGuid(); } } } Selected[0].EventList.Add(Label_object); CmdLabel.username = Username; CmdLabel.ID_Command = Guid.NewGuid(); CmdLabel.Execute(Label_object); CmdLabel.hierarchyID = Label_object.HierarchyID; Command_manager = Manager.SaveCommand(CmdLabel, CmdLabel.isUndo, CmdLabel.isRedo); BinaryFormatter bf = new BinaryFormatter(); using (MemoryStream data = new MemoryStream()) { bf.Serialize(data, CmdLabel); ServerStream_priv.Write(data.ToArray(), 0, data.ToArray().Length); ServerStream_priv.Flush(); } } }
private void GetContent() { while (true) { ServerStream_priv = ClientSocket.GetStream(); byte[] inStream = new byte[10025]; int n = 0; n = ServerStream_priv.Read(inStream, 0, 10025); if (n != 0) { byte[] data = inStream; BinaryFormatter bf = new BinaryFormatter(); using (MemoryStream ms = new MemoryStream(data)) { object obj = bf.Deserialize(ms); if (obj.GetType() == typeof(Undo_Redo.UndoRedoWrapper)) { this.Undo_command = (Undo_Redo.UndoRedoWrapper)obj; if (Undo_command.Command.Username != Username) { Undo_command = Manager.SaveCommand(Undo_command.Command, Undo_command.Command.IsUndo, Undo_command.Command.IsRedo); } if (Manager.Counter > 1) { if (Counter > 2) { CmdLargeRepair cmdLargeRepair = new CmdLargeRepair(); cmdLargeRepair.isLargeRepair = true; cmdLargeRepair.ID_Command = Guid.NewGuid(); cmdLargeRepair.username = Username; BinaryFormatter bf1 = new BinaryFormatter(); using (MemoryStream data1 = new MemoryStream()) { bf1.Serialize(data1, cmdLargeRepair); ServerStream_priv.Write(data1.ToArray(), 0, data1.ToArray().Length); ServerStream_priv.Flush(); } } else if (Manager.Commands[Manager.Counter - 1].ID_prevCommand != Undo_command.ID_prevCommand) { Manager.Swap(Manager.Commands[Manager.Counter - 2], Manager.Commands[Manager.Counter - 1], Manager.Commands); Counter++; } } this.Rect = Undo_command.Command; if (Rect.EventName == "Rectangle Red") { this.Rect_Red = new RectangleRed(Rect.X, Rect.Y, Rect.Selected, Rect.Deleted, Rect.Moved, Rect.Username, Rect.MovingHelperX, Rect.MovingHelperY, Rect.IsUndo, Rect.IsRedo); Rect_Red.HierarchyID = Rect.HierarchyID; Rect_Red.EventList = Rect.EventList; if (Rect_Red.IsUndo && Rect_Red.Deleted) { DeleteRectangleRed_Invoker_Inverse(this.Rect_Red); } else if (Rect_Red.IsUndo) { DrawRectangleRed_Invoker_Inverse(this.Rect_Red); } else if (Rect_Red.Moved) { MoveRectangleRed_Invoker(this.Rect_Red); } else if (Rect_Red.Deleted) { DeleteRectangleRed_Invoker(this.Rect_Red); } else if (Rect_Red.Selected) { SelectRectangleRed(this.Rect_Red); } else { DrawRectRed(this.Rect_Red); } } else if (Rect.EventName == "Rectangle Blue") { this.Rect_Blue = new RectangleBlue(Rect.X, Rect.Y, Rect.Selected, Rect.Deleted, Rect.Moved, Rect.Username, Rect.MovingHelperX, Rect.MovingHelperY, Rect.IsUndo, Rect.IsRedo); Rect_Blue.HierarchyID = Rect.HierarchyID; Rect_Blue.EventList = Rect.EventList; if (Rect_Blue.IsUndo && Rect_Blue.Deleted) { DeleteRectangleBlue_Invoker_Inverse(this.Rect_Blue); } else if (Rect_Blue.IsUndo) { DrawRectangleBlue_Invoker_Inverse(this.Rect_Blue); } else if (Rect_Blue.Moved) { MoveRectangleBlue_Invoker(this.Rect_Blue); } else if (Rect_Blue.Deleted) { DeleteRectangleBlue_Invoker(this.Rect_Blue); } else if (Rect_Blue.Selected) { SelectRectangleBlue(this.Rect_Blue); } else { DrawRectBlue(this.Rect_Blue); } } else if (Rect.EventName == "Relation") { this.Rel = new Relation(Rect.Start, Rect.End, Rect.Selected, Rect.Deleted, Rect.Moved, Rect.Username, Rect.IsUndo, Rect.IsRedo); Rel.EventList.Add(Rect.EventList[0]); Rel.EventList.Add(Rect.EventList[1]); Rel.HierarchyID = Rect.HierarchyID; if (Rel.IsUndo && Rel.Deleted) { DeleteRelation_Invoker_Inverse(Rel); } else if (Rel.IsUndo) { DrawRelation_Invoker_Inverse(Rel); } else if (Rel.Deleted) { DeleteRelation_Invoker(Rel); } else if (Rel.Moved) { MoveRelation_Invoker(Rel); } else { DrawRelation(Rel); } } else if (Rect.EventName == "Label") { this.Lab = new Objects.Label(Rect.X, Rect.Y, Rect.Selected, Rect.Deleted, Rect.Moved, Rect.Username, Rect.MovingHelperX, Rect.MovingHelperY, Rect.IsUndo, Rect.IsRedo); Lab.HierarchyID = Rect.HierarchyID; Lab.EventList = Rect.EventList; if (Lab.IsUndo && Lab.Deleted) { DeleteLabel_Invoker_Inverse(this.Lab); } else if (Lab.IsUndo) { DrawLabel_Invoker_Inverse(this.Lab); } else if (Lab.Deleted) { DeleteLabel_Invoker(this.Lab); } else if (Lab.Selected) { SelectLabelEvent(this.Lab); } else { DrawLabel(this.Lab); } } } else { Console.WriteLine("This is large repair!"); Manager.Commands = (Undo_Redo.UndoRedoWrapper[])obj; } } } else { break; } } }
public UndoRedoWrapper SaveCommand(Command_Interface.ICommand command, bool isUndo, bool isRedo) { UndoRedoWrapper tempCommand = new UndoRedoWrapper(command); if (GetCommand(command.Username) != -1) { tempCommand.PrevCommand = GetCommand(command.Username); if (isUndo) { tempCommand.IsUndo = true; if (Commands[tempCommand.PrevCommand].IsUndo) { if (Counter == 0) { tempCommand.ID_prevCommand = tempCommand.ID_Command; } else { tempCommand.ID_prevCommand = Commands[Counter - 1].ID_Command; } tempCommand.UndoCommand = Commands[tempCommand.PrevCommand].PrevCommand; tempCommand.PrevCommand = Commands[tempCommand.UndoCommand].PrevCommand; tempCommand.Command.HierarchyID = Commands[tempCommand.UndoCommand].Command.HierarchyID; tempCommand.Command.EventList = Commands[tempCommand.UndoCommand].Command.EventList; Commands[Counter] = tempCommand; Counter++; UndoCounter--; tempCommand.Username = command.Username; SetCommand(tempCommand); return(tempCommand); } else { if (Counter == 0) { tempCommand.ID_prevCommand = tempCommand.ID_Command; } else { tempCommand.ID_prevCommand = Commands[Counter - 1].ID_Command; } tempCommand.UndoCommand = tempCommand.PrevCommand; tempCommand.PrevCommand = Commands[tempCommand.PrevCommand].PrevCommand; tempCommand.Command.HierarchyID = Commands[tempCommand.UndoCommand].Command.HierarchyID; tempCommand.Command.EventList = Commands[tempCommand.UndoCommand].Command.EventList; Commands[Counter] = tempCommand; Counter++; UndoCounter--; tempCommand.Username = command.Username; SetCommand(tempCommand); return(tempCommand); } } else if (isRedo) { tempCommand.IsRedo = true; if (Counter == 0) { tempCommand.ID_prevCommand = tempCommand.ID_Command; } else { tempCommand.ID_prevCommand = Commands[Counter - 1].ID_Command; } tempCommand.IsRedo = true; Commands[tempCommand.PrevCommand].RedoCommand = Counter; tempCommand.Command.HierarchyID = Commands[tempCommand.PrevCommand].Command.HierarchyID; tempCommand.Command.EventList = Commands[tempCommand.PrevCommand].Command.EventList; tempCommand.PrevCommand = Commands[tempCommand.PrevCommand].PrevCommand; Commands[Counter] = tempCommand; Counter++; UndoCounter++; tempCommand.Username = command.Username; SetCommand(tempCommand); return(tempCommand); } else { if (Commands[tempCommand.PrevCommand].IsUndo || Commands[tempCommand.PrevCommand].IsRedo) { tempCommand.PrevCommand = Commands[tempCommand.PrevCommand].PrevCommand; if (Counter == 0) { tempCommand.ID_prevCommand = tempCommand.ID_Command; } else { tempCommand.ID_prevCommand = Commands[Counter - 1].ID_Command; } Commands[Counter] = tempCommand; command.PrevCommand = tempCommand.PrevCommand; Counter++; UndoCounter++; tempCommand.Username = command.Username; SetCommand(tempCommand); return(tempCommand); } else { if (Counter == 0) { tempCommand.ID_prevCommand = tempCommand.ID_Command; } else { tempCommand.ID_prevCommand = Commands[Counter - 1].ID_Command; } Commands[Counter] = tempCommand; command.PrevCommand = tempCommand.PrevCommand; Counter++; UndoCounter++; tempCommand.Username = command.Username; SetCommand(tempCommand); return(tempCommand); } } } else { if (Counter == 0) { tempCommand.ID_prevCommand = tempCommand.ID_Command; } else { tempCommand.ID_prevCommand = Commands[Counter - 1].ID_Command; } tempCommand.PrevCommand = Counter; tempCommand.Command.HierarchyID = command.HierarchyID; command.PrevCommand = tempCommand.PrevCommand; Commands[Counter] = tempCommand; tempCommand.Username = command.Username; SetCommand(tempCommand); Counter++; UndoCounter++; return(tempCommand); } }