From b23f4d39e42d1dd1da7d4ad76d6bc8cbb2f27403 Mon Sep 17 00:00:00 2001
From: NikGapon <45200250+NikGapon@users.noreply.github.com>
Date: Mon, 5 Dec 2022 18:47:34 +0400
Subject: [PATCH 1/3] lab 8 out todo

---
 Airbus/Airbus/AirplaneCompareByColor.cs       | 17 ++++++
 Airbus/Airbus/AirplaneCompareByType.cs        | 56 +++++++++++++++++++
 Airbus/Airbus/DrawningObjectAirplane.cs       | 31 +++++++++-
 .../Airbus/FormMapWithSetAirplane.Designer.cs | 30 +++++++++-
 Airbus/Airbus/FormMapWithSetAirplane.cs       | 17 ++++++
 Airbus/Airbus/IDrawningObject.cs              |  2 +-
 Airbus/Airbus/MapWithSetAirplaneGeneric.cs    |  6 +-
 Airbus/Airbus/SetAirplaneGeneric.cs           | 10 +++-
 8 files changed, 163 insertions(+), 6 deletions(-)
 create mode 100644 Airbus/Airbus/AirplaneCompareByColor.cs
 create mode 100644 Airbus/Airbus/AirplaneCompareByType.cs

diff --git a/Airbus/Airbus/AirplaneCompareByColor.cs b/Airbus/Airbus/AirplaneCompareByColor.cs
new file mode 100644
index 0000000..4c30e0c
--- /dev/null
+++ b/Airbus/Airbus/AirplaneCompareByColor.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Airbus
+{
+    internal class AirplaneCompareByColor : IComparer<IDrawningObject>
+    {
+        public int Compare(IDrawningObject? x, IDrawningObject? y)
+        {
+            // TODO реализовать логику сравнения
+            throw new NotImplementedException();
+        }
+    }
+    }
diff --git a/Airbus/Airbus/AirplaneCompareByType.cs b/Airbus/Airbus/AirplaneCompareByType.cs
new file mode 100644
index 0000000..04d80f3
--- /dev/null
+++ b/Airbus/Airbus/AirplaneCompareByType.cs
@@ -0,0 +1,56 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Airbus
+{
+    internal class AirplaneCompareByType : IComparer<IDrawningObject>
+    {
+        public int Compare(IDrawningObject? x, IDrawningObject? y)
+        {
+            if (x == null && y == null)
+            {
+                return 0;
+            }
+            if (x == null && y != null)
+            {
+                return 1;
+            }
+            if (x != null && y == null)
+            {
+                return -1;
+            }
+            var xAirplane = x as DrawningObjectAirplane;
+            var yAirplane = y as DrawningObjectAirplane;
+            if (xAirplane == null && yAirplane == null)
+            {
+                return 0;
+            }
+            if (xAirplane == null && yAirplane != null)
+            {
+                return 1;
+            }
+            if (xAirplane != null && yAirplane == null)
+            {
+                return -1;
+            }
+            if (xAirplane.GetAirplane.GetType().Name != yAirplane.GetAirplane.GetType().Name)
+            {
+                if (xAirplane.GetAirplane.GetType().Name == "DrawingAirplane")
+                {
+                    return -1;
+                }
+                return 1;
+            }
+            var speedCompare =
+            xAirplane.GetAirplane.airplane.Speed.CompareTo(yAirplane.GetAirplane.airplane.Speed);
+            if (speedCompare != 0)
+            {
+                return speedCompare;
+            }
+            return xAirplane.GetAirplane.airplane.Weight.CompareTo(yAirplane.GetAirplane.airplane.Weight);
+        }
+    }
+}
diff --git a/Airbus/Airbus/DrawningObjectAirplane.cs b/Airbus/Airbus/DrawningObjectAirplane.cs
index 5ec45c4..4d22429 100644
--- a/Airbus/Airbus/DrawningObjectAirplane.cs
+++ b/Airbus/Airbus/DrawningObjectAirplane.cs
@@ -14,6 +14,7 @@ namespace Airbus
         {
             _airplane = airplane;
         }
+        public DrawningAirplane GetAirplane => _airplane;
         public float Step => _airplane?.airplane?.Step ?? 0;
         public void DrawningObject(Graphics g)
         {
@@ -27,7 +28,7 @@ namespace Airbus
         {
             _airplane?.MoveTransport(direction);
         }
-        public void SetObject(int x, int y, int width, int height)
+        public void SetObject(int x, int y, int width, int height)  
         {
             _airplane?.SetPosition(x, y, width, height);
         }
@@ -35,5 +36,33 @@ namespace Airbus
         public string GetInfo() => _airplane?.GetDataForSave();
         public static IDrawningObject Create(string data) => new DrawningObjectAirplane(data.CreateDrawningAirplane());
 
+        public bool Equals(IDrawningObject? other)
+        {
+            if (other == null)
+            {
+                return false;
+            }
+            var otherAirplane = other as DrawningObjectAirplane;
+            if (otherAirplane == null)
+            {
+                return false;
+            }
+            var airplane = _airplane.airplane;
+            var otherAirplaneAirplane = otherAirplane._airplane.airplane;
+            if (airplane.Speed != otherAirplaneAirplane.Speed)
+            {
+                return false;
+            }
+            if (airplane.Weight != otherAirplaneAirplane.Weight)
+            {
+                return false;
+            }
+            if (airplane.BodyColor != otherAirplaneAirplane.BodyColor)
+            {
+                return false;
+            }
+            // TODO доделать проверки в случае продвинутого объекта
+            return true;
+        }
     }
 }
diff --git a/Airbus/Airbus/FormMapWithSetAirplane.Designer.cs b/Airbus/Airbus/FormMapWithSetAirplane.Designer.cs
index 4d1a28d..7eb3e71 100644
--- a/Airbus/Airbus/FormMapWithSetAirplane.Designer.cs
+++ b/Airbus/Airbus/FormMapWithSetAirplane.Designer.cs
@@ -51,6 +51,8 @@
             this.LoadToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
             this.openFileDialog = new System.Windows.Forms.OpenFileDialog();
             this.saveFileDialog = new System.Windows.Forms.SaveFileDialog();
+            this.buttonSortByType = new System.Windows.Forms.Button();
+            this.buttonSortByColor = new System.Windows.Forms.Button();
             this.groupBoxTools.SuspendLayout();
             this.groupBoxMaps.SuspendLayout();
             ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit();
@@ -59,6 +61,8 @@
             // 
             // groupBoxTools
             // 
+            this.groupBoxTools.Controls.Add(this.buttonSortByColor);
+            this.groupBoxTools.Controls.Add(this.buttonSortByType);
             this.groupBoxTools.Controls.Add(this.groupBoxMaps);
             this.groupBoxTools.Controls.Add(this.buttonDown);
             this.groupBoxTools.Controls.Add(this.buttonRight);
@@ -267,14 +271,14 @@
             // SaveToolStripMenuItem
             // 
             this.SaveToolStripMenuItem.Name = "SaveToolStripMenuItem";
-            this.SaveToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
+            this.SaveToolStripMenuItem.Size = new System.Drawing.Size(141, 22);
             this.SaveToolStripMenuItem.Text = "Сохранение";
             this.SaveToolStripMenuItem.Click += new System.EventHandler(this.SaveToolStripMenuItem_Click);
             // 
             // LoadToolStripMenuItem
             // 
             this.LoadToolStripMenuItem.Name = "LoadToolStripMenuItem";
-            this.LoadToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
+            this.LoadToolStripMenuItem.Size = new System.Drawing.Size(141, 22);
             this.LoadToolStripMenuItem.Text = "Загрузка";
             this.LoadToolStripMenuItem.Click += new System.EventHandler(this.LoadToolStripMenuItem_Click);
             // 
@@ -286,6 +290,26 @@
             // 
             this.saveFileDialog.Filter = "txt file | *.txt";
             // 
+            // buttonSortByType
+            // 
+            this.buttonSortByType.Location = new System.Drawing.Point(12, 326);
+            this.buttonSortByType.Name = "buttonSortByType";
+            this.buttonSortByType.Size = new System.Drawing.Size(83, 38);
+            this.buttonSortByType.TabIndex = 11;
+            this.buttonSortByType.Text = "Сортировать по типу";
+            this.buttonSortByType.UseVisualStyleBackColor = true;
+            this.buttonSortByType.Click += new System.EventHandler(this.buttonSortByType_Click);
+            // 
+            // buttonSortByColor
+            // 
+            this.buttonSortByColor.Location = new System.Drawing.Point(101, 326);
+            this.buttonSortByColor.Name = "buttonSortByColor";
+            this.buttonSortByColor.Size = new System.Drawing.Size(93, 38);
+            this.buttonSortByColor.TabIndex = 12;
+            this.buttonSortByColor.Text = "Сортировать по цвету";
+            this.buttonSortByColor.UseVisualStyleBackColor = true;
+            this.buttonSortByColor.Click += new System.EventHandler(this.buttonSortByColor_Click);
+            // 
             // FormMapWithSetAirplane
             // 
             this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
@@ -334,5 +358,7 @@
         private ToolStripMenuItem LoadToolStripMenuItem;
         private OpenFileDialog openFileDialog;
         private SaveFileDialog saveFileDialog;
+        private Button buttonSortByColor;
+        private Button buttonSortByType;
     }
 }
\ No newline at end of file
diff --git a/Airbus/Airbus/FormMapWithSetAirplane.cs b/Airbus/Airbus/FormMapWithSetAirplane.cs
index 3eb424c..3f56206 100644
--- a/Airbus/Airbus/FormMapWithSetAirplane.cs
+++ b/Airbus/Airbus/FormMapWithSetAirplane.cs
@@ -296,5 +296,22 @@ namespace Airbus
             pictureBox.Image = _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].MoveObject(dir);
 
         }
+
+        private void buttonSortByType_Click(object sender, EventArgs e)
+        {
+            if (listBoxMaps.SelectedIndex == -1)
+            {
+                return;
+            }
+            _mapsCollection[listBoxMaps.SelectedItem?.ToString() ??
+           string.Empty].Sort(new AirplaneCompareByType());
+            pictureBox.Image =
+           _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].ShowSet();
+        }
+
+        private void buttonSortByColor_Click(object sender, EventArgs e)
+        {
+
+        }
     }
 }
diff --git a/Airbus/Airbus/IDrawningObject.cs b/Airbus/Airbus/IDrawningObject.cs
index 1195eac..d71f508 100644
--- a/Airbus/Airbus/IDrawningObject.cs
+++ b/Airbus/Airbus/IDrawningObject.cs
@@ -6,7 +6,7 @@ using System.Threading.Tasks;
 
 namespace Airbus
 {
-    internal interface IDrawningObject
+    internal interface IDrawningObject : IEquatable<IDrawningObject>
     {
         public float Step { get; }
         void SetObject(int x, int y, int width, int height);
diff --git a/Airbus/Airbus/MapWithSetAirplaneGeneric.cs b/Airbus/Airbus/MapWithSetAirplaneGeneric.cs
index 4209b36..0c2dae2 100644
--- a/Airbus/Airbus/MapWithSetAirplaneGeneric.cs
+++ b/Airbus/Airbus/MapWithSetAirplaneGeneric.cs
@@ -7,7 +7,7 @@ using System.Threading.Tasks;
 namespace Airbus
 {
     internal class MapWithSetAirplaneGeneric<T, U>
-    where T : class, IDrawningObject
+    where T : class, IDrawningObject, IEquatable<T>
     where U : AbstractMap
     {
         /// <summary>
@@ -201,5 +201,9 @@ namespace Airbus
                 _setAirplane.Insert(DrawningObjectAirplane.Create(rec) as T);
             }
         }
+        public void Sort(IComparer<T> comparer)
+        {
+            _setAirplane.SortSet(comparer);
+        }
     }
 }
diff --git a/Airbus/Airbus/SetAirplaneGeneric.cs b/Airbus/Airbus/SetAirplaneGeneric.cs
index 8280990..c3cabec 100644
--- a/Airbus/Airbus/SetAirplaneGeneric.cs
+++ b/Airbus/Airbus/SetAirplaneGeneric.cs
@@ -7,7 +7,7 @@ using System.Threading.Tasks;
 namespace Airbus
 {
     internal class SetAirplaneGeneric<T>
-        where T : class
+        where T : class, IEquatable<T>
     {
         private readonly List<T> _places;
         public int Count => _places.Count;
@@ -80,6 +80,14 @@ namespace Airbus
                 }
             }
         }
+        public void SortSet(IComparer<T> comparer)
+        {
+            if (comparer == null)
+            {
+                return;
+            }
+            _places.Sort(comparer);
+        }
 
     }
 }
-- 
2.25.1


From a617fa173075b34099ab5712c1af52f218075814 Mon Sep 17 00:00:00 2001
From: NikGapon <45200250+NikGapon@users.noreply.github.com>
Date: Mon, 5 Dec 2022 20:45:04 +0400
Subject: [PATCH 2/3] lab 8 complete

---
 Airbus/Airbus/AbstractMap.cs            | 29 +++++++++++++-
 Airbus/Airbus/AirplaneCompareByColor.cs | 52 +++++++++++++++++++++++--
 Airbus/Airbus/AirplaneCompareByType.cs  |  2 +-
 Airbus/Airbus/DrawningObjectAirplane.cs | 17 +++++++-
 Airbus/Airbus/FormMapWithSetAirplane.cs |  7 +++-
 Airbus/Airbus/SetAirplaneGeneric.cs     |  4 ++
 6 files changed, 104 insertions(+), 7 deletions(-)

diff --git a/Airbus/Airbus/AbstractMap.cs b/Airbus/Airbus/AbstractMap.cs
index da78b80..4330bc9 100644
--- a/Airbus/Airbus/AbstractMap.cs
+++ b/Airbus/Airbus/AbstractMap.cs
@@ -6,7 +6,7 @@ using System.Threading.Tasks;
 
 namespace Airbus
 {
-    internal abstract class AbstractMap
+    internal abstract class AbstractMap : IEquatable<AbstractMap>
     {
         private IDrawningObject _drawningObject = null;
 
@@ -118,5 +118,32 @@ namespace Airbus
         protected abstract void GenerateMap();
         protected abstract void DrawRoadPart(Graphics g, int i, int j);
         protected abstract void DrawBarrierPart(Graphics g, int i, int j);
+
+        public bool Equals(AbstractMap? other)
+        {
+            if (other == null ||
+                _map != other._map ||
+                _width != other._width ||
+                _size_x != other._size_x ||
+                _size_y != other._size_y ||
+                _height != other._height ||
+                GetType() != other.GetType() ||
+                _map.GetLength(0) != other._map.GetLength(0) ||
+                _map.GetLength(1) != other._map.GetLength(1))
+            {
+                return false;
+            }
+            for (int i = 0; i < _map.GetLength(0); i++)
+            {
+                for (int j = 0; j < _map.GetLength(1); j++)
+                {
+                    if (_map[i, j] != other._map[i, j])
+                    {
+                        return false;
+                    }
+                }
+            }
+            return true;
+        }
     }
 }
diff --git a/Airbus/Airbus/AirplaneCompareByColor.cs b/Airbus/Airbus/AirplaneCompareByColor.cs
index 4c30e0c..82a073d 100644
--- a/Airbus/Airbus/AirplaneCompareByColor.cs
+++ b/Airbus/Airbus/AirplaneCompareByColor.cs
@@ -10,8 +10,54 @@ namespace Airbus
     {
         public int Compare(IDrawningObject? x, IDrawningObject? y)
         {
-            // TODO реализовать логику сравнения
-            throw new NotImplementedException();
+            if (x == null && y == null)
+            {
+                return 0;
+            }
+            if (x == null && y != null)
+            {
+                return 1;
+            }
+            if (x != null && y == null)
+            {
+                return -1;
+            }
+            var xAirplane = x as DrawningObjectAirplane;
+            var yAirplane = y as DrawningObjectAirplane;
+            if (xAirplane == null && yAirplane == null)
+            {
+                return 0;
+            }
+            if (xAirplane == null && yAirplane != null)
+            {
+                return 1;
+            }
+            if (xAirplane != null && yAirplane == null)
+            {
+                return -1;
+            }
+            string xAirplaneColor = xAirplane.GetAirplane.airplane.BodyColor.Name;
+            string yAirplaneColor = yAirplane.GetAirplane.airplane.BodyColor.Name;
+            if (xAirplaneColor != yAirplaneColor)
+            {
+                return xAirplaneColor.CompareTo(yAirplaneColor);
+            }
+            if (xAirplane.GetAirplane.airplane is EntityAirbus xContainerShip && yAirplane.GetAirplane.airplane is EntityAirbus yContainerShip)
+            {
+                string xShipDopColor = xContainerShip.DopColor.Name;
+                string yShipDopColor = yContainerShip.DopColor.Name;
+                var dopColorCompare = xShipDopColor.CompareTo(yShipDopColor);
+                if (dopColorCompare != 0)
+                {
+                    return dopColorCompare;
+                }
+            }
+            var speedCompare = xAirplane.GetAirplane.airplane.Speed.CompareTo(yAirplane.GetAirplane.airplane.Speed);
+            if (speedCompare != 0)
+            {
+                return speedCompare;
+            }
+            return xAirplane.GetAirplane.airplane.Weight.CompareTo(yAirplane.GetAirplane.airplane.Weight);
         }
     }
-    }
+}
\ No newline at end of file
diff --git a/Airbus/Airbus/AirplaneCompareByType.cs b/Airbus/Airbus/AirplaneCompareByType.cs
index 04d80f3..443f53a 100644
--- a/Airbus/Airbus/AirplaneCompareByType.cs
+++ b/Airbus/Airbus/AirplaneCompareByType.cs
@@ -38,7 +38,7 @@ namespace Airbus
             }
             if (xAirplane.GetAirplane.GetType().Name != yAirplane.GetAirplane.GetType().Name)
             {
-                if (xAirplane.GetAirplane.GetType().Name == "DrawingAirplane")
+                if (xAirplane.GetAirplane.GetType().Name == "DrawningAirplane")
                 {
                     return -1;
                 }
diff --git a/Airbus/Airbus/DrawningObjectAirplane.cs b/Airbus/Airbus/DrawningObjectAirplane.cs
index 4d22429..cf2c6d1 100644
--- a/Airbus/Airbus/DrawningObjectAirplane.cs
+++ b/Airbus/Airbus/DrawningObjectAirplane.cs
@@ -61,7 +61,22 @@ namespace Airbus
             {
                 return false;
             }
-            // TODO доделать проверки в случае продвинутого объекта
+
+            if (airplane is EntityAirbus airbus && otherAirplaneAirplane is EntityAirbus otherAirbus)
+            {
+                if (airbus.DopColor != otherAirbus.DopColor)
+                {
+                    return false;
+                }
+                if (airbus.Engine != otherAirbus.Engine)
+                {
+                    return false;
+                }
+                if (airbus.Compartment != otherAirbus.Compartment)
+                {
+                    return false;
+                }
+            }
             return true;
         }
     }
diff --git a/Airbus/Airbus/FormMapWithSetAirplane.cs b/Airbus/Airbus/FormMapWithSetAirplane.cs
index 3f56206..f66c9b6 100644
--- a/Airbus/Airbus/FormMapWithSetAirplane.cs
+++ b/Airbus/Airbus/FormMapWithSetAirplane.cs
@@ -311,7 +311,12 @@ namespace Airbus
 
         private void buttonSortByColor_Click(object sender, EventArgs e)
         {
-
+            if (listBoxMaps.SelectedIndex == -1)
+            {
+                return;
+            }
+            _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].Sort(new AirplaneCompareByColor());
+            pictureBox.Image = _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].ShowSet();
         }
     }
 }
diff --git a/Airbus/Airbus/SetAirplaneGeneric.cs b/Airbus/Airbus/SetAirplaneGeneric.cs
index c3cabec..82104a2 100644
--- a/Airbus/Airbus/SetAirplaneGeneric.cs
+++ b/Airbus/Airbus/SetAirplaneGeneric.cs
@@ -24,6 +24,10 @@ namespace Airbus
 
         public int Insert(T airplane, int position)
         {
+            if (_places.Contains(airplane))
+            {
+                return -1;
+            }
             if (Count == _maxCount)
                 throw new StorageOverflowException(_maxCount);
             if (position < 0 || position > _places.Count) return -1;
-- 
2.25.1


From a09e502cd7f25057adf12506deb6d86f722b3b88 Mon Sep 17 00:00:00 2001
From: NikGapon <45200250+NikGapon@users.noreply.github.com>
Date: Thu, 8 Dec 2022 19:51:28 +0400
Subject: [PATCH 3/3] type sort fix and small name fix

---
 Airbus/Airbus/AirplaneCompareByColor.cs | 8 ++++----
 Airbus/Airbus/DrawningObjectAirplane.cs | 4 ++++
 Airbus/Airbus/SetAirplaneGeneric.cs     | 6 +++---
 3 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/Airbus/Airbus/AirplaneCompareByColor.cs b/Airbus/Airbus/AirplaneCompareByColor.cs
index 82a073d..83d2f4d 100644
--- a/Airbus/Airbus/AirplaneCompareByColor.cs
+++ b/Airbus/Airbus/AirplaneCompareByColor.cs
@@ -42,11 +42,11 @@ namespace Airbus
             {
                 return xAirplaneColor.CompareTo(yAirplaneColor);
             }
-            if (xAirplane.GetAirplane.airplane is EntityAirbus xContainerShip && yAirplane.GetAirplane.airplane is EntityAirbus yContainerShip)
+            if (xAirplane.GetAirplane.airplane is EntityAirbus xAirbus && yAirplane.GetAirplane.airplane is EntityAirbus yAirbus)
             {
-                string xShipDopColor = xContainerShip.DopColor.Name;
-                string yShipDopColor = yContainerShip.DopColor.Name;
-                var dopColorCompare = xShipDopColor.CompareTo(yShipDopColor);
+                string xAirplaneDopColor = xAirbus.DopColor.Name;
+                string yAirplaneDopColor = yAirbus.DopColor.Name;
+                var dopColorCompare = xAirplaneDopColor.CompareTo(yAirplaneDopColor);
                 if (dopColorCompare != 0)
                 {
                     return dopColorCompare;
diff --git a/Airbus/Airbus/DrawningObjectAirplane.cs b/Airbus/Airbus/DrawningObjectAirplane.cs
index cf2c6d1..7f5ff50 100644
--- a/Airbus/Airbus/DrawningObjectAirplane.cs
+++ b/Airbus/Airbus/DrawningObjectAirplane.cs
@@ -49,6 +49,10 @@ namespace Airbus
             }
             var airplane = _airplane.airplane;
             var otherAirplaneAirplane = otherAirplane._airplane.airplane;
+            if (airplane.GetType() != otherAirplaneAirplane.GetType())
+            {
+                return false;
+            }
             if (airplane.Speed != otherAirplaneAirplane.Speed)
             {
                 return false;
diff --git a/Airbus/Airbus/SetAirplaneGeneric.cs b/Airbus/Airbus/SetAirplaneGeneric.cs
index 82104a2..da02b91 100644
--- a/Airbus/Airbus/SetAirplaneGeneric.cs
+++ b/Airbus/Airbus/SetAirplaneGeneric.cs
@@ -72,11 +72,11 @@ namespace Airbus
         }
         public IEnumerable<T> GetAirplanes()
         {
-            foreach (var car in _places)
+            foreach (var airplane in _places)
             {
-                if (car != null)
+                if (airplane != null)
                 {
-                    yield return car;
+                    yield return airplane;
                 }
                 else
                 {
-- 
2.25.1