Advertisement
_takumi

MainControl.cs

Dec 10th, 2019
355
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 16.40 KB | None | 0 0
  1. using MyLibrary;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Drawing;
  5. using System.IO;
  6. using System.Windows.Forms;
  7. using System.Linq;
  8. using System.Reflection;
  9.  
  10. namespace PolygonDraft
  11. {
  12.     //TODO: save custom colors
  13.     //C:\Users\Максим\source\repos\MyLibrary\MyLibrary\bin\Debug\MyLibrary.dll
  14.     public partial class MainControl : Form, IOriginator
  15.     {
  16.         private Polygon _polygon = new Polygon(hullColor: Color.Black,
  17.                                                vertexColor: Color.FromArgb(64, 0, 128),
  18.                                                vertexSize: 25);
  19.         private DragDropCmd _dragDropCmd;
  20.         private DeleteVertexCmd _deleteCmd;
  21.         private List<Type> _pluggedInTypes;
  22.  
  23.         public MainControl()
  24.         {
  25.             InitializeComponent();
  26.             //System.Runtime.ProfileOptimization.SetProfileRoot("");
  27.             ChangeTypeCmd.Form = this;
  28.             ChangeShapeCmd.Collection = ShapeToolStripMenuItem.DropDownItems;
  29.             ChangeBackColorCmd.Form = this;
  30.             //CreateToolStripItemCmd.Collection = shapeToolStripMenuItem.DropDownItems;
  31.             TriangleToolStripMenuItem.Checked = true;
  32.         }
  33.  
  34.         public Type ChosenType { get; set; } = typeof(Triangle);
  35.  
  36.         private void MainControl_KeyDown(object sender, KeyEventArgs e)
  37.         {
  38.             if (e.Control && e.KeyCode == Keys.Z)
  39.             {
  40.                 undoButton.PerformClick();
  41.             }
  42.             else if (e.Control && e.KeyCode == Keys.Y)
  43.             {
  44.                 redoButton.PerformClick();
  45.             }
  46.         }
  47.  
  48.         private void UndoButton_Click(object sender, EventArgs e)
  49.         {
  50.             UndoRedoManager.Undo();
  51.             Invalidate();
  52.         }
  53.  
  54.         private void RedoButton_Click(object sender, EventArgs e)
  55.         {
  56.             UndoRedoManager.Redo();
  57.             Invalidate();
  58.         }
  59.  
  60.         private void Form1_MouseDown(object sender, MouseEventArgs e)
  61.         {
  62.             if (e.Button == MouseButtons.Left && DragDropCmd.CanDrag(_polygon, e.X, e.Y)) // Drag and drop
  63.             {
  64.                 _dragDropCmd = new DragDropCmd(_polygon);
  65.                 _dragDropCmd.DragStart(e.X, e.Y);
  66.                 return;
  67.             }
  68.             else if (e.Button == MouseButtons.Right) // Удаление
  69.             {
  70.                 if (DeleteVertexCmd.CanDelete(_polygon, e.Location))
  71.                 {
  72.                     _deleteCmd = new DeleteVertexCmd(_polygon, e.Location);
  73.                     if (_dragDropCmd == null)
  74.                     {
  75.                         _deleteCmd.Execute();
  76.                         UndoRedoManager.AddCmd(_deleteCmd);
  77.                         _deleteCmd = null;
  78.                     }
  79.                     Invalidate();
  80.                 }
  81.                 return;
  82.             }
  83.             Vertex vertex = (Vertex)Activator.CreateInstance(ChosenType, e.X, e.Y, _polygon.VertexColor,
  84.                 _polygon.HullColor, _polygon.VertexSize);
  85.             AddVertexCmd addVertexCmd = new AddVertexCmd(vertex, _polygon);
  86.             List<Vertex> verticesToDelete = _polygon.VerticesToDelete(vertex);
  87.             if (verticesToDelete.Count != 0)
  88.             {
  89.                 DeleteVertexCmd deleteCmd = new DeleteVertexCmd(_polygon, verticesToDelete);
  90.                 deleteCmd.Execute();
  91.                 addVertexCmd.Execute();
  92.                 UndoRedoManager.AddCmd(addVertexCmd, deleteCmd);
  93.             }
  94.             else
  95.             {
  96.                 addVertexCmd.Execute();
  97.                 UndoRedoManager.AddCmd(addVertexCmd);
  98.             }
  99.             Invalidate();
  100.         }
  101.  
  102.         private void Form1_MouseMove(object sender, MouseEventArgs e)
  103.         {
  104.             _dragDropCmd?.DragDo(e.X, e.Y);
  105.             Invalidate();
  106.         }
  107.  
  108.         private void Form1_MouseUp(object sender, MouseEventArgs e)
  109.         {
  110.             _dragDropCmd?.DragEnd();
  111.             _deleteCmd?.Execute();
  112.             List<Vertex> toDelete = _polygon.VerticesToDelete();
  113.             if (toDelete.Count != 0) // If dragDrop has deleted vertices
  114.             {
  115.                 _deleteCmd = new DeleteVertexCmd(_polygon, toDelete);
  116.                 UndoRedoManager.AddCmd(_dragDropCmd, _deleteCmd);
  117.                 _dragDropCmd = null;
  118.             }
  119.             if (_dragDropCmd != null && _deleteCmd != null) // If a vertex was deleted on drag n drop
  120.                 UndoRedoManager.AddCmd(_dragDropCmd, _deleteCmd);
  121.             else if (_dragDropCmd != null) // Simple drag n drop
  122.                 UndoRedoManager.AddCmd(_dragDropCmd);
  123.             _deleteCmd = null;
  124.             _dragDropCmd = null;
  125.             if (_polygon.Count >= 3)
  126.                 _polygon.MakeConvex();
  127.             Invalidate();
  128.         }
  129.  
  130.         private void Form1_Paint(object sender, PaintEventArgs e)
  131.         {
  132.             e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; //Уменьшаем пикселизацию
  133.             _polygon.Draw(e.Graphics);
  134.         }
  135.  
  136.         private void ТреугольникToolStripMenuItem_Click(object sender, EventArgs e)
  137.         {
  138.             //_type = typeof(Triangle);
  139.             //foreach (ToolStripMenuItem tool in формаToolStripMenuItem.DropDownItems)
  140.             //    tool.Checked = false;
  141.             //triangleToolStripMenuItem.Checked = true;
  142.             if (ChosenType == typeof(Triangle))
  143.                 return;
  144.             ChangeTypeCmd typeCmd = new ChangeTypeCmd(ChosenType, typeof(Triangle));
  145.             typeCmd.Execute();
  146.             ChangeShapeCmd shapeCmd = new ChangeShapeCmd(IndexOfCheckedItem(),
  147.                 ShapeToolStripMenuItem.DropDownItems.IndexOf(TriangleToolStripMenuItem));
  148.             shapeCmd.Execute();
  149.             UndoRedoManager.AddCmd(typeCmd, shapeCmd);
  150.         }
  151.  
  152.         //private void КругToolStripMenuItem_Click(object sender, EventArgs e)
  153.         //{
  154.         //    //_type = typeof(Circle);
  155.         //    //foreach (ToolStripMenuItem tool in формаToolStripMenuItem.DropDownItems)
  156.         //    //    tool.Checked = false;
  157.         //    //circleToolStripMenuItem.Checked = true;
  158.         //    if (ChosenType == typeof(Circle))
  159.         //        return;
  160.         //    ChangeTypeCmd typeCmd = new ChangeTypeCmd(ChosenType, typeof(Circle));
  161.         //    typeCmd.Execute();
  162.         //    ChangeShapeCmd shapeCmd = new ChangeShapeCmd(IndexOfCheckedItem(),
  163.         //        shapeToolStripMenuItem.DropDownItems.IndexOf(CircleToolStripMenuItem));
  164.         //    shapeCmd.Execute();
  165.         //    UndoRedoManager.AddCmd(typeCmd, shapeCmd);
  166.         //}
  167.  
  168.         //private void КвадратToolStripMenuItem_Click(object sender, EventArgs e)
  169.         //{
  170.         //    //_type = typeof(Square);
  171.         //    //foreach (ToolStripMenuItem tool in формаToolStripMenuItem.DropDownItems)
  172.         //    //    tool.Checked = false;
  173.         //    //squareToolStripMenuItem.Checked = true;
  174.         //    if (ChosenType == typeof(Square))
  175.         //        return;
  176.         //    ChangeTypeCmd typeCmd = new ChangeTypeCmd(ChosenType, typeof(Square));
  177.         //    typeCmd.Execute();
  178.         //    int prevIndex = IndexOfCheckedItem();
  179.         //    int newIndex = shapeToolStripMenuItem.DropDownItems.IndexOf(SquareToolStripMenuItem);
  180.         //    ChangeShapeCmd shapeCmd = new ChangeShapeCmd(IndexOfCheckedItem(),
  181.         //        shapeToolStripMenuItem.DropDownItems.IndexOf(SquareToolStripMenuItem));
  182.         //    shapeCmd.Execute();
  183.         //    UndoRedoManager.AddCmd(typeCmd, shapeCmd);
  184.         //}
  185.  
  186.         private void ГраницаToolStripMenuItem_Click(object sender, EventArgs e)
  187.         {
  188.             using (ColorDialog hullDialog = new ColorDialog() { Color = _polygon.HullColor })
  189.             {
  190.                 if (hullDialog.ShowDialog() == DialogResult.OK)
  191.                 {
  192.                     ChangeHullColorCmd cmd = new ChangeHullColorCmd(_polygon,
  193.                                                                     hullDialog.Color);
  194.                     cmd.Execute();
  195.                     UndoRedoManager.AddCmd(cmd);
  196.                     Invalidate();
  197.                 }
  198.             }
  199.         }
  200.  
  201.         private void ЗаливкаToolStripMenuItem_Click(object sender, EventArgs e)
  202.         {
  203.             using (ColorDialog vertexColorDialog = new ColorDialog() { Color = _polygon.VertexColor })
  204.             {
  205.                 if (vertexColorDialog.ShowDialog() == DialogResult.OK)
  206.                 {
  207.                     ChangeVertexColorCmd cmd = new ChangeVertexColorCmd(
  208.                         _polygon,
  209.                         vertexColorDialog.Color);
  210.                     cmd.Execute();
  211.                     UndoRedoManager.AddCmd(cmd);
  212.                     Invalidate();
  213.                 }
  214.             }
  215.         }
  216.  
  217.         private void ФонToolStripMenuItem_Click(object sender, EventArgs e)
  218.         {
  219.             using (ColorDialog backColorDialog = new ColorDialog() { Color = BackColor })
  220.             {
  221.                 if (backColorDialog.ShowDialog() == DialogResult.OK)
  222.                 {
  223.                     ChangeBackColorCmd cmd = new ChangeBackColorCmd(BackColor,
  224.                                                                     backColorDialog.Color);
  225.                     cmd.Execute();
  226.                     UndoRedoManager.AddCmd(cmd);
  227.                     Invalidate();
  228.                 }
  229.             }
  230.         }
  231.  
  232.         private void РазмерToolStripMenuItem_Click(object sender, EventArgs e)
  233.         {
  234.             ChangeSizeCmd cmd = new ChangeSizeCmd(null, default, default);
  235.             int prevSize = _polygon.VertexSize;
  236.             TrackBar ResizeBar = new TrackBar
  237.             {
  238.                 Minimum = 5,
  239.                 Maximum = 150,
  240.                 Value = _polygon.VertexSize,
  241.                 Orientation = Orientation.Horizontal,
  242.                 TickStyle = TickStyle.None,
  243.                 Location = new Point(0, 0),
  244.                 Width = 420,
  245.                 Height = 125,
  246.                 Name = "ResizeBar"
  247.             };
  248.             ResizeBar.Scroll += (_, __) =>
  249.             {
  250.                 cmd = new ChangeSizeCmd(_polygon, prevSize, ResizeBar.Value);
  251.                 cmd.Execute();
  252.                 Invalidate();
  253.             };
  254.             ResizeBar.MouseUp += (_, __) =>
  255.             {
  256.                 if (prevSize != ResizeBar.Value)
  257.                     UndoRedoManager.AddCmd(cmd);
  258.             };
  259.  
  260.             Form SizeChanger = new Form
  261.             {
  262.                 ClientSize = new Size(ResizeBar.Width, ResizeBar.Height),
  263.                 FormBorderStyle = FormBorderStyle.FixedSingle,
  264.                 MinimizeBox = false,
  265.                 MaximizeBox = false,
  266.                 Visible = true,
  267.                 Text = "RadiusChanger"
  268.             };
  269.  
  270.             SizeChanger.Controls.Add(ResizeBar);
  271.             SizeChanger.FormClosed += (_, __) => SizeChanger.Dispose();
  272.             SizeChanger.ActiveControl = SizeChanger.Controls["ResizeBar"];
  273.         }
  274.  
  275.         private void Start_Click(object sender, EventArgs e)
  276.         {
  277.             randTimer.Start();
  278.             Invalidate();
  279.         }
  280.  
  281.         private void Stop_Click(object sender, EventArgs e)
  282.         {
  283.             randTimer.Stop();
  284.             Invalidate();
  285.         }
  286.  
  287.         private void RandTimer_Tick(object sender, EventArgs e)
  288.         {
  289.             _polygon.Move();
  290.             Invalidate();
  291.         }
  292.  
  293.         private void Form1_FormClosing(object sender, FormClosingEventArgs e)
  294.         {
  295.             Application.Exit();
  296.         }
  297.  
  298.         private int IndexOfCheckedItem()
  299.         {
  300.             int index = 0;
  301.             for (int i = 0; i < ShapeToolStripMenuItem.DropDownItems.Count; i++)
  302.             {
  303.                 if (((ToolStripMenuItem)ShapeToolStripMenuItem.DropDownItems[i]).Checked)
  304.                 {
  305.                     index = i;
  306.                     break;
  307.                 }
  308.             }
  309.             return index;
  310.         }
  311.  
  312.         public void SetMemento(MCMemento memento)
  313.         {
  314.             dynamic state = memento.GetState();
  315.             _polygon = state.Polygon;
  316.             BackColor = state.BackColor;
  317.             _pluggedInTypes = state.PluggedInTypes;
  318.             ChosenType = state.Type;
  319.             ShapeToolStripMenuItem.DropDownItems.Clear();
  320.             foreach (Type type in _pluggedInTypes)
  321.                 CreateToolStripMenuItem(type);
  322.             //foreach (ToolStripMenuItem tool in ShapeToolStripMenuItem.DropDownItems)
  323.             //    tool.Checked = false;
  324.             ((ToolStripMenuItem)ShapeToolStripMenuItem.DropDownItems[state.Index]).Checked = true;
  325.             ChangeTypeCmd.Form = this;
  326.             ChangeShapeCmd.Collection = ShapeToolStripMenuItem.DropDownItems;
  327.             ChangeBackColorCmd.Form = this;
  328.         }
  329.  
  330.         public IMemento CreateMemento()
  331.         {
  332.             return new MCMemento(_polygon,
  333.                                  BackColor,
  334.                                  ChosenType,
  335.                                  IndexOfCheckedItem(),
  336.                                  _pluggedInTypes);
  337.         }
  338.  
  339.         #region Save load
  340.         private void SaveAsToolStripMenuItem_click(object sender, EventArgs e)
  341.         {
  342.             using (SaveFileDialog saveDialog = new SaveFileDialog() { DefaultExt = ".bin" })
  343.             {
  344.                 string path;
  345.                 if (saveDialog.ShowDialog() == DialogResult.OK)
  346.                     path = saveDialog.FileName;
  347.                 else
  348.                     return;
  349.                 SaveOpenManager.Save(path, FileMode.Create, CreateMemento());
  350.             }
  351.         }
  352.  
  353.         private void OpenToolStripMenuItem_Click(object sender, EventArgs e)
  354.         {
  355.             using (OpenFileDialog openDialog = new OpenFileDialog())
  356.             {
  357.                 string path;
  358.                 if (openDialog.ShowDialog() == DialogResult.OK)
  359.                     path = openDialog.FileName;
  360.                 else
  361.                     return;
  362.                 UndoRedoManager.ClearLog();
  363.                 MCMemento McMemento =
  364.                     (MCMemento)SaveOpenManager.Load(path, FileMode.Open);
  365.                 SetMemento(McMemento);
  366.             }
  367.             Invalidate();
  368.         }
  369.         #endregion
  370.  
  371.         private void MainControl_DragEnter(object sender, DragEventArgs e)
  372.         {
  373.             if (e.Data.GetDataPresent(DataFormats.FileDrop))
  374.                 e.Effect = DragDropEffects.Copy;
  375.         }
  376.  
  377.         private void MainControl_DragDrop(object sender, DragEventArgs e)
  378.         {
  379.             List<string> paths = new List<string>();
  380.             foreach (string path in (string[])e.Data.GetData(DataFormats.FileDrop))
  381.             {
  382.                 if (Directory.Exists(path))
  383.                     paths.AddRange(Directory.GetFiles(path, "*.dll", SearchOption.AllDirectories));
  384.                 else if (Path.GetExtension(path) == ".dll")
  385.                     paths.Add(path);
  386.             }
  387.             foreach (string path in paths)
  388.             {
  389.                 _pluggedInTypes = (from type in Assembly.LoadFrom(path).GetExportedTypes()
  390.                                    where type.BaseType.Equals(typeof(Vertex))
  391.                                    select type).ToList();
  392.                 _pluggedInTypes.ForEach(type => CreateToolStripMenuItem(type));
  393.             }
  394.         }
  395.  
  396.         public ToolStripMenuItem CreateToolStripMenuItem(Type type)
  397.         {
  398.             ToolStripMenuItem newMenuItem = new ToolStripMenuItem(type.Name);
  399.             newMenuItem.Name = type.Name;
  400.  
  401.             newMenuItem.Click += (_, __) =>
  402.             {
  403.                 //foreach (ToolStripMenuItem item in shapeToolStripMenuItem.DropDownItems)
  404.                 //    item.Checked = false;
  405.                 int index = ShapeToolStripMenuItem.DropDownItems.IndexOf(newMenuItem);
  406.                 //ToolStripMenuItem tmp = shapeToolStripMenuItem.DropDownItems[index]
  407.                 //                        as ToolStripMenuItem;
  408.                 //tmp.Checked = true;
  409.                 ChangeShapeCmd shapeCmd = new ChangeShapeCmd(IndexOfCheckedItem(), index);
  410.                 shapeCmd.Execute();
  411.                 ChangeTypeCmd typeCmd = new ChangeTypeCmd(ChosenType, type);
  412.                 typeCmd.Execute();
  413.                 UndoRedoManager.AddCmd(typeCmd, shapeCmd);
  414.             };
  415.             ShapeToolStripMenuItem.DropDownItems.Add(newMenuItem);
  416.             return newMenuItem;
  417.         }
  418.  
  419.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement