1
0
This commit is contained in:
2024-05-15 01:11:15 +03:00
parent 81b1c8d946
commit a14397932a
21 changed files with 447 additions and 81 deletions

View File

@@ -5,25 +5,58 @@ VisualStudioVersion = 17.7.34202.233
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tool", "Tool\Tool.csproj", "{73C85CBC-5C3A-4F43-8B10-1462B52F709E}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lab2", "Lab2\Lab2.csproj", "{BC81743D-B4D3-4D25-A966-AD697757E98C}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Lab2", "Lab2\Lab2.csproj", "{BC81743D-B4D3-4D25-A966-AD697757E98C}"
ProjectSection(ProjectDependencies) = postProject
{5E9876F7-1F15-4759-8D96-D950649BBDD7} = {5E9876F7-1F15-4759-8D96-D950649BBDD7}
{73C85CBC-5C3A-4F43-8B10-1462B52F709E} = {73C85CBC-5C3A-4F43-8B10-1462B52F709E}
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{73C85CBC-5C3A-4F43-8B10-1462B52F709E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{73C85CBC-5C3A-4F43-8B10-1462B52F709E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{73C85CBC-5C3A-4F43-8B10-1462B52F709E}.Debug|x64.ActiveCfg = Debug|Any CPU
{73C85CBC-5C3A-4F43-8B10-1462B52F709E}.Debug|x64.Build.0 = Debug|Any CPU
{73C85CBC-5C3A-4F43-8B10-1462B52F709E}.Debug|x86.ActiveCfg = Debug|Any CPU
{73C85CBC-5C3A-4F43-8B10-1462B52F709E}.Debug|x86.Build.0 = Debug|Any CPU
{73C85CBC-5C3A-4F43-8B10-1462B52F709E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{73C85CBC-5C3A-4F43-8B10-1462B52F709E}.Release|Any CPU.Build.0 = Release|Any CPU
{73C85CBC-5C3A-4F43-8B10-1462B52F709E}.Release|x64.ActiveCfg = Release|Any CPU
{73C85CBC-5C3A-4F43-8B10-1462B52F709E}.Release|x64.Build.0 = Release|Any CPU
{73C85CBC-5C3A-4F43-8B10-1462B52F709E}.Release|x86.ActiveCfg = Release|Any CPU
{73C85CBC-5C3A-4F43-8B10-1462B52F709E}.Release|x86.Build.0 = Release|Any CPU
{BC81743D-B4D3-4D25-A966-AD697757E98C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BC81743D-B4D3-4D25-A966-AD697757E98C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BC81743D-B4D3-4D25-A966-AD697757E98C}.Debug|x64.ActiveCfg = Debug|Any CPU
{BC81743D-B4D3-4D25-A966-AD697757E98C}.Debug|x64.Build.0 = Debug|Any CPU
{BC81743D-B4D3-4D25-A966-AD697757E98C}.Debug|x86.ActiveCfg = Debug|Any CPU
{BC81743D-B4D3-4D25-A966-AD697757E98C}.Debug|x86.Build.0 = Debug|Any CPU
{BC81743D-B4D3-4D25-A966-AD697757E98C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BC81743D-B4D3-4D25-A966-AD697757E98C}.Release|Any CPU.Build.0 = Release|Any CPU
{BC81743D-B4D3-4D25-A966-AD697757E98C}.Release|x64.ActiveCfg = Release|Any CPU
{BC81743D-B4D3-4D25-A966-AD697757E98C}.Release|x64.Build.0 = Release|Any CPU
{BC81743D-B4D3-4D25-A966-AD697757E98C}.Release|x86.ActiveCfg = Release|Any CPU
{BC81743D-B4D3-4D25-A966-AD697757E98C}.Release|x86.Build.0 = Release|Any CPU
{5E9876F7-1F15-4759-8D96-D950649BBDD7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5E9876F7-1F15-4759-8D96-D950649BBDD7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5E9876F7-1F15-4759-8D96-D950649BBDD7}.Debug|x64.ActiveCfg = Debug|Any CPU
{5E9876F7-1F15-4759-8D96-D950649BBDD7}.Debug|x64.Build.0 = Debug|Any CPU
{5E9876F7-1F15-4759-8D96-D950649BBDD7}.Debug|x86.ActiveCfg = Debug|Any CPU
{5E9876F7-1F15-4759-8D96-D950649BBDD7}.Debug|x86.Build.0 = Debug|Any CPU
{5E9876F7-1F15-4759-8D96-D950649BBDD7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5E9876F7-1F15-4759-8D96-D950649BBDD7}.Release|Any CPU.Build.0 = Release|Any CPU
{5E9876F7-1F15-4759-8D96-D950649BBDD7}.Release|x64.ActiveCfg = Release|Any CPU
{5E9876F7-1F15-4759-8D96-D950649BBDD7}.Release|x64.Build.0 = Release|Any CPU
{5E9876F7-1F15-4759-8D96-D950649BBDD7}.Release|x86.ActiveCfg = Release|Any CPU
{5E9876F7-1F15-4759-8D96-D950649BBDD7}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@@ -0,0 +1,20 @@
namespace Patterns
{
/// <summary>
/// Абстрактная фабрика ручных и электрических инструментов
/// </summary>
public abstract class AbstractToolFactory : IToolFactory
{
/// <summary>
/// Создание ручного инструмента
/// </summary>
/// <returns>Экземпляр ручного инструмента</returns>
public abstract ManualTool CreateManualTool();
/// <summary>
/// Создание электрического инструмента
/// </summary>
/// <returns>Экземпляр электрического инструмента</returns>
public abstract ElectricTool CreateElectricTool();
}
}

View File

@@ -0,0 +1,20 @@
namespace Patterns
{
/// <summary>
/// Интерфейс фабрики ручных и электрических инструментов
/// </summary>
public interface IToolFactory
{
/// <summary>
/// Создание ручного инструмента
/// </summary>
/// <returns>Экземпляр ручного инструмента</returns>
ManualTool CreateManualTool();
/// <summary>
/// Создание электрического инструмента
/// </summary>
/// <returns>Экземпляр электрического инструмента</returns>
ElectricTool CreateElectricTool();
}
}

View File

@@ -0,0 +1,55 @@
using System;
namespace Patterns
{
/// <summary>
/// Фабрика прототипов ручных и электрических инструментов
/// </summary>
public class PrototypeFactory : AbstractToolFactory
{
/// <summary>
/// Прототип ручного инструмента
/// </summary>
private ManualTool _manualTool;
/// <summary>
/// Прототип электрического инструмента
/// </summary>
private ElectricTool _electricTool;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="parManualTool">Прототип ручного инструмента</param>
/// <param name="parElectricTool">Прототип электрического инструмента</param>
/// <exception cref="ArgumentNullException">Выбрасывается, когда один из параметров равен null</exception>
public PrototypeFactory(ManualTool parManualTool, ElectricTool parElectricTool)
{
if (parManualTool == null)
throw new ArgumentNullException(nameof(parManualTool));
if (parElectricTool == null)
throw new ArgumentNullException(nameof(parElectricTool));
_manualTool = parManualTool;
_electricTool = parElectricTool;
}
/// <summary>
/// Создание ручного инструмента по прототипу
/// </summary>
/// <returns>Экземпляр ручного инструмента</returns>
public override ManualTool CreateManualTool()
{
return (ManualTool)_manualTool.Clone();
}
/// <summary>
/// Создание электрического инструмента по прототипу
/// </summary>
/// <returns>Экземпляр электрического инструмента</returns>
public override ElectricTool CreateElectricTool()
{
return (ElectricTool)_electricTool.Clone();
}
}
}

View File

@@ -0,0 +1,26 @@
namespace Patterns
{
/// <summary>
/// Фабрика ножниц и тримеров
/// </summary>
public class ScissorsAndTrimmerFactory : AbstractToolFactory
{
/// <summary>
/// Создание ножниц
/// </summary>
/// <returns>Экземпляр ножниц</returns>
public override ManualTool CreateManualTool()
{
return new Scissors("Si00", Material.Wood, 1, 1, 1);
}
/// <summary>
/// Создание тримера
/// </summary>
/// <returns>Экземпляр тримера</returns>
public override ElectricTool CreateElectricTool()
{
return new Trimmer("Tr00", Material.Wood, 1, 1);
}
}
}

View File

@@ -0,0 +1,26 @@
namespace Patterns
{
/// <summary>
/// Фабрика кос и газонокосилок
/// </summary>
public class ScytheAndLawnmowerFactory : AbstractToolFactory
{
/// <summary>
/// Создание косы
/// </summary>
/// <returns>Экземпляр косы</returns>
public override ManualTool CreateManualTool()
{
return new Scythe("Sc00", Material.Wood, 1, 1, BladeType.Straight);
}
/// <summary>
/// Создание газонокосилки
/// </summary>
/// <returns>Экземпляр газонокосилки</returns>
public override ElectricTool CreateElectricTool()
{
return new Lawnmower("La00", Material.Wood, 1, 1, 1);
}
}
}

View File

@@ -0,0 +1,14 @@
namespace Patterns
{
/// <summary>
/// Фабричный метод для создания фабрик
/// </summary>
public interface IToolFactoryMethod
{
/// <summary>
/// Создание фабрики
/// </summary>
/// <returns>Фабрика</returns>
IToolFactory CreateFactory();
}
}

View File

@@ -0,0 +1,36 @@
using Lab2;
using System;
namespace Patterns
{
/// <summary>
/// Фабричный метод для фабрики прототипов
/// </summary>
public class PrototypeFactoryMethod : IToolFactoryMethod
{
/// <summary>
/// Создание фабрики прототипов
/// </summary>
/// <returns>Фабрика прототипов</returns>
/// <exception cref="InvalidOperationException">Выбрасывается, когда нельзя создать фабрику</exception>
public IToolFactory CreateFactory()
{
var scissors = new Scissors("", Material.Wood, 1, 1, 1);
var lawnmower = new Lawnmower("", Material.Wood, 1, 1, 1);
if (Util.ShowEditForm(scissors, false, true) && Util.ShowEditForm(lawnmower, false, true))
return new PrototypeFactory(scissors, lawnmower);
throw new InvalidOperationException("Can't create factory");
}
/// <summary>
/// Получения названия создаваемой фабрики
/// </summary>
/// <returns>Название</returns>
public override string ToString()
{
return "Prototype Factory";
}
}
}

View File

@@ -0,0 +1,26 @@
namespace Patterns
{
/// <summary>
/// Фабричный метод для фабрик ножниц и тримеров
/// </summary>
public class ScissorsAndTrimmerFactoryMethod : IToolFactoryMethod
{
/// <summary>
/// Создание фабрики ножниц и тримеров
/// </summary>
/// <returns>Фабрика ножниц и тримеров</returns>
public IToolFactory CreateFactory()
{
return new ScissorsAndTrimmerFactory();
}
/// <summary>
/// Получения названия создаваемой фабрики
/// </summary>
/// <returns>Название</returns>
public override string ToString()
{
return "Scissors and Trimmer Factory";
}
}
}

View File

@@ -0,0 +1,26 @@
namespace Patterns
{
/// <summary>
/// Фабричный метод для фабрик кос и газонокосилок
/// </summary>
public class ScytheAndLawnmowerFactoryMethod : IToolFactoryMethod
{
/// <summary>
/// Создание фабрики кос и газонокосилок
/// </summary>
/// <returns>Фабрика кос и газонокосилок</returns>
public IToolFactory CreateFactory()
{
return new ScytheAndLawnmowerFactory();
}
/// <summary>
/// Получения названия создаваемой фабрики
/// </summary>
/// <returns>Название</returns>
public override string ToString()
{
return "Scythe and Lawnmower Factory";
}
}
}

View File

@@ -37,6 +37,6 @@
<TextBox x:Name="_fuelСapacityTextBox" Grid.Row="4" Grid.Column="1" Margin="5,5,5,5" Text="{Binding FuelCapacity, UpdateSourceTrigger=Explicit}" />
<Button Name="_saveButton" Click="SaveButton_Click" Content="Save" Grid.Row="5" Grid.Column="0" Margin="5,5,5,5" />
<Button Content="Cancel" IsCancel="True" Grid.Row="5" Grid.Column="1" Margin="5,5,5,5" />
<Button Name="_cancelButton" Content="Cancel" IsCancel="True" Grid.Row="5" Grid.Column="1" Margin="5,5,5,5" />
</Grid>
</Window>

View File

@@ -20,6 +20,10 @@ namespace Lab2
/// </summary>
private readonly bool _readOnly;
/// <summary>
/// Признак невозможности отмены
/// </summary>
private readonly bool _isForced;
/// <summary>
/// Газонокосилка для редактирования
/// </summary>
private readonly Lawnmower _lawnmower;
@@ -29,8 +33,9 @@ namespace Lab2
/// </summary>
/// <param name="parLawnmower">Газонокосилка для редактирования</param>
/// <param name="parReadOnly">Доступность полей формы</param>
/// <param name="parIsForced">Признак невозможности отмены</param>
/// <exception cref="ArgumentNullException">Выбрасывается, когда газонокосилка равна null</exception>
public CreateLawnmower(Lawnmower parLawnmower, bool parReadOnly = false)
public CreateLawnmower(Lawnmower parLawnmower, bool parReadOnly = false, bool parIsForced = false)
{
if (parLawnmower == null)
throw new ArgumentNullException(nameof(parLawnmower));
@@ -41,6 +46,7 @@ namespace Lab2
_lawnmower = parLawnmower;
_readOnly = parReadOnly;
_isForced = parIsForced;
DataContext = _lawnmower;
Title = $"Lawnmower {_lawnmower.Id}";
@@ -49,6 +55,9 @@ namespace Lab2
if (_readOnly)
_saveButton.Content = "Ok";
if (_isForced)
_cancelButton.Visibility = Visibility.Collapsed;
}
/// <summary>
@@ -92,7 +101,12 @@ namespace Lab2
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
if (!_save)
{
if (_isForced)
e.Cancel = true;
return;
}
try
{

View File

@@ -37,6 +37,6 @@
<TextBox x:Name="_bladeSizeTextBox" Grid.Row="4" Grid.Column="1" Margin="5,5,5,5" Text="{Binding BladeSize, UpdateSourceTrigger=Explicit}" />
<Button Name="_saveButton" Click="SaveButton_Click" Content="Save" Grid.Row="5" Grid.Column="0" Margin="5,5,5,5" />
<Button Content="Cancel" IsCancel="True" Grid.Row="5" Grid.Column="1" Margin="5,5,5,5" />
<Button Name="_cancelButton" Content="Cancel" IsCancel="True" Grid.Row="5" Grid.Column="1" Margin="5,5,5,5" />
</Grid>
</Window>

View File

@@ -20,6 +20,10 @@ namespace Lab2
/// </summary>
private readonly bool _readOnly;
/// <summary>
/// Признак невозможности отмены
/// </summary>
private readonly bool _isForced;
/// <summary>
/// Ножницы для редактирования
/// </summary>
private readonly Scissors _scissors;
@@ -29,8 +33,9 @@ namespace Lab2
/// </summary>
/// <param name="parScissors">Ножницы для редактирования</param>
/// <param name="parReadOnly">Доступность полей формы</param>
/// <param name="parIsForced">Признак невозможности отмены</param>
/// <exception cref="ArgumentNullException">Выбрасывается, когда ножницы равны null</exception>
public CreateScissors(Scissors parScissors, bool parReadOnly = false)
public CreateScissors(Scissors parScissors, bool parReadOnly = false, bool parIsForced = false)
{
if (parScissors == null)
throw new ArgumentNullException(nameof(parScissors));
@@ -41,6 +46,7 @@ namespace Lab2
_scissors = parScissors;
_readOnly = parReadOnly;
_isForced = parIsForced;
DataContext = _scissors;
Title = $"Scissors {_scissors.Id}";
@@ -49,6 +55,9 @@ namespace Lab2
if (_readOnly)
_saveButton.Content = "Ok";
if (_isForced)
_cancelButton.Visibility = Visibility.Collapsed;
}
/// <summary>
@@ -92,7 +101,12 @@ namespace Lab2
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
if (!_save)
{
if (_isForced)
e.Cancel = true;
return;
}
try
{

View File

@@ -37,6 +37,6 @@
<ComboBox x:Name="_bladeTypeComboBox" Grid.Row="4" Grid.Column="1" Margin="5,5,5,5" Text="{Binding BladeType, UpdateSourceTrigger=Explicit}" />
<Button Name="_saveButton" Click="SaveButton_Click" Content="Save" Grid.Row="5" Grid.Column="0" Margin="5,5,5,5" />
<Button Content="Cancel" IsCancel="True" Grid.Row="5" Grid.Column="1" Margin="5,5,5,5" />
<Button Name="_cancelButton" Content="Cancel" IsCancel="True" Grid.Row="5" Grid.Column="1" Margin="5,5,5,5" />
</Grid>
</Window>

View File

@@ -20,6 +20,10 @@ namespace Lab2
/// </summary>
private readonly bool _readOnly;
/// <summary>
/// Признак невозможности отмены
/// </summary>
private readonly bool _isForced;
/// <summary>
/// Коса для редактирования
/// </summary>
private readonly Scythe _scythe;
@@ -29,8 +33,9 @@ namespace Lab2
/// </summary>
/// <param name="parScythe">Коса для редактирования</param>
/// <param name="parReadOnly">Доступность полей формы</param>
/// <param name="parIsForced">Признак невозможности отмены</param>
/// <exception cref="ArgumentNullException">Выбрасывается, когда коса равна null</exception>
public CreateScythe(Scythe parScythe, bool parReadOnly = false)
public CreateScythe(Scythe parScythe, bool parReadOnly = false, bool parIsForced = false)
{
if (parScythe == null)
throw new ArgumentNullException(nameof(parScythe));
@@ -42,6 +47,7 @@ namespace Lab2
_scythe = parScythe;
_readOnly = parReadOnly;
_isForced = parIsForced;
DataContext = _scythe;
Title = $"Scythe {_scythe.Id}";
@@ -50,6 +56,9 @@ namespace Lab2
if (_readOnly)
_saveButton.Content = "Ok";
if (_isForced)
_cancelButton.Visibility = Visibility.Collapsed;
}
/// <summary>
@@ -93,7 +102,12 @@ namespace Lab2
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
if (!_save)
{
if (_isForced)
e.Cancel = true;
return;
}
try
{

View File

@@ -37,6 +37,6 @@
<ComboBox x:Name="_modeComboBox" Grid.Row="4" Grid.Column="1" Margin="5,5,5,5" Text="{Binding Mode, UpdateSourceTrigger=Explicit}" />
<Button Name="_saveButton" Click="SaveButton_Click" Content="Save" Grid.Row="5" Grid.Column="0" Margin="5,5,5,5" />
<Button Content="Cancel" IsCancel="True" Grid.Row="5" Grid.Column="1" Margin="5,5,5,5" />
<Button Name="_cancelButton" Content="Cancel" IsCancel="True" Grid.Row="5" Grid.Column="1" Margin="5,5,5,5" />
</Grid>
</Window>

View File

@@ -20,6 +20,10 @@ namespace Lab2
/// </summary>
private readonly bool _readOnly;
/// <summary>
/// Признак невозможности отмены
/// </summary>
private readonly bool _isForced;
/// <summary>
/// Триммер для редактирования
/// </summary>
private readonly Trimmer _trimmer;
@@ -29,8 +33,9 @@ namespace Lab2
/// </summary>
/// <param name="parTrimmer">Триммер для редактирования</param>
/// <param name="parReadOnly">Доступность полей формы</param>
/// <param name="parIsForced">Признак невозможности отмены</param>
/// <exception cref="ArgumentNullException">Выбрасывается, когда триммер равен null</exception>
public CreateTrimmer(Trimmer parTrimmer, bool parReadOnly = false)
public CreateTrimmer(Trimmer parTrimmer, bool parReadOnly = false, bool parIsForced = false)
{
if (parTrimmer == null)
throw new ArgumentNullException(nameof(parTrimmer));
@@ -42,6 +47,7 @@ namespace Lab2
_trimmer = parTrimmer;
_readOnly = parReadOnly;
_isForced = parIsForced;
DataContext = _trimmer;
Title = $"Trimmer {_trimmer.Id}";
@@ -50,6 +56,9 @@ namespace Lab2
if (_readOnly)
_saveButton.Content = "Ok";
if (_isForced)
_cancelButton.Visibility = Visibility.Collapsed;
}
/// <summary>
@@ -93,7 +102,12 @@ namespace Lab2
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
if (!_save)
{
if (_isForced)
e.Cancel = true;
return;
}
try
{

View File

@@ -17,20 +17,19 @@
<Grid Grid.Row="0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1.15*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="1.1*"/>
<ColumnDefinition Width="1.45*"/>
<ColumnDefinition Width="0.8*"/>
<ColumnDefinition Width="0.8*"/>
<ColumnDefinition Width="0.8*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Button Click="CreateScissorsButton_Click" Content="Add Scissors" Grid.Column="0" Margin="5,5,5,5" />
<Button Click="CreateScytheButton_Click" Content="Add Scythe" Grid.Column="1" Margin="5,5,5,5" />
<Button Click="CreateTrimmerButton_Click" Content="Add Trimmer" Grid.Column="2" Margin="5,5,5,5" />
<Button Click="CreateLawnmowerButton_Click" Content="Add Lawnmower" Grid.Column="3" Margin="5,5,5,5" />
<Button Click="EditSelectedButton_Click" Content="Edit" Grid.Column="4" Margin="5,5,5,5" />
<Button Click="DeleteSelectedButton_Click" Content="Delete" Grid.Column="5" Margin="5,5,5,5" />
<Button Click="GenerateButton_Click" Content="Generate" Grid.Column="6" Margin="5,5,5,5" />
<ComboBox IsEditable="False" Grid.Column="0" Margin="5,5,5,5" ItemsSource="{Binding FactoryMethods}" SelectedItem="{Binding SelectedMethod}" />
<Button Click="CreateManualToolButton_Click" Content="Add Manual Tool" Grid.Column="1" Margin="5,5,5,5" />
<Button Click="CreateElectricToolButton_Click" Content="Add Electric Tool" Grid.Column="2" Margin="5,5,5,5" />
<Button Click="EditSelectedButton_Click" Content="Edit" Grid.Column="3" Margin="5,5,5,5" />
<Button Click="DeleteSelectedButton_Click" Content="Delete" Grid.Column="4" Margin="5,5,5,5" />
<Button Click="GenerateButton_Click" Content="Generate" Grid.Column="5" Margin="5,5,5,5" />
</Grid>
</Grid>
</Grid>

View File

@@ -1,6 +1,9 @@
using System;
using System.Windows;
using System.Collections.ObjectModel;
using Patterns;
using System.Collections.Generic;
using System.Linq;
namespace Lab2
{
@@ -19,6 +22,44 @@ namespace Lab2
/// </summary>
private Random _random = new();
/// <summary>
/// Список фабрик
/// </summary>
private List<IToolFactoryMethod> _factoryMethods = new()
{
new ScissorsAndTrimmerFactoryMethod(),
new ScytheAndLawnmowerFactoryMethod(),
new PrototypeFactoryMethod(),
};
/// <summary>
/// Текущая фабрика
/// </summary>
private IToolFactory _currentFactory;
/// <summary>
/// Выбранный фабричный метод
/// </summary>
private IToolFactoryMethod _selectedMethod;
/// <summary>
/// Список фабрик
/// </summary>
public ICollection<IToolFactoryMethod> FactoryMethods => _factoryMethods;
/// <summary>
/// Выбранный фабричный метод
/// </summary>
public IToolFactoryMethod SelectedMethod
{
get => _selectedMethod;
set
{
_selectedMethod = value;
_currentFactory = value.CreateFactory();
}
}
/// <summary>
/// Конструктор
/// </summary>
@@ -26,6 +67,9 @@ namespace Lab2
{
InitializeComponent();
SelectedMethod = _factoryMethods.First();
DataContext = this;
_dataGrid.ItemsSource = _tools;
}
@@ -51,33 +95,6 @@ namespace Lab2
return _tools[_dataGrid.SelectedIndex];
}
/// <summary>
/// Открывает форму редактирования
/// </summary>
/// <param name="parTool"> Инструмент </param>
/// <returns> True, если редактирование прошло успешно, иначе - false </returns>
private bool ShowEditForm(Tool parTool, bool parReadOnly = false)
{
Window? form = parTool switch
{
Scissors scissors => new CreateScissors(scissors, parReadOnly),
Scythe scythe => new CreateScythe(scythe, parReadOnly),
Trimmer trimmer => new CreateTrimmer(trimmer, parReadOnly),
Lawnmower lawnmower => new CreateLawnmower(lawnmower, parReadOnly),
_ => null,
};
if (form == null)
return false;
var result = form.ShowDialog();
_dataGrid.Items.Refresh();
return result ?? false;
}
/// <summary>
/// Генерирует случайный триммер
/// </summary>
@@ -115,47 +132,23 @@ namespace Lab2
}
/// <summary>
/// Обработчик события нажатия на кнопку "Add Scissors"
/// Обработчик события нажатия на кнопку "Add Manual Tool"
/// </summary>
private void CreateScissorsButton_Click(object sender, RoutedEventArgs e)
private void CreateManualToolButton_Click(object sender, RoutedEventArgs e)
{
var scissors = new Scissors("", Material.Wood, 1, 1, 1);
if (ShowEditForm(scissors))
_tools.Add(scissors);
var tool = _currentFactory.CreateManualTool();
if (Util.ShowEditForm(tool))
_tools.Add(tool);
}
/// <summary>
/// Обработчик события нажатия на кнопку "Add Scythe"
/// Обработчик события нажатия на кнопку "Add Electric Tool"
/// </summary>
private void CreateScytheButton_Click(object sender, RoutedEventArgs e)
private void CreateElectricToolButton_Click(object sender, RoutedEventArgs e)
{
var scythe = new Scythe("", Material.Wood, 1, 1, BladeType.Straight);
if (ShowEditForm(scythe))
_tools.Add(scythe);
}
/// <summary>
/// Обработчик события нажатия на кнопку "Add Trimmer"
/// </summary>
private void CreateTrimmerButton_Click(object sender, RoutedEventArgs e)
{
var trimmer = new Trimmer("", Material.Wood, 1, 1);
if (ShowEditForm(trimmer))
_tools.Add(trimmer);
}
/// <summary>
/// Обработчик события нажатия на кнопку "Add Lawnmower"
/// </summary>
private void CreateLawnmowerButton_Click(object sender, RoutedEventArgs e)
{
var lawnmower = new Lawnmower("", Material.Wood, 1, 1, 1);
if (ShowEditForm(lawnmower))
_tools.Add(lawnmower);
var tool = _currentFactory.CreateElectricTool();
if (Util.ShowEditForm(tool))
_tools.Add(tool);
}
/// <summary>
@@ -167,7 +160,9 @@ namespace Lab2
if (item == null)
return;
ShowEditForm(item);
Util.ShowEditForm(item);
_dataGrid.Items.Refresh();
}
/// <summary>
@@ -179,7 +174,7 @@ namespace Lab2
if (selected == null)
return;
if (!ShowEditForm(selected, true))
if (!Util.ShowEditForm(selected, true))
return;
_tools.Remove(selected);

34
Lab2/src/Form/Util.cs Normal file
View File

@@ -0,0 +1,34 @@
using System.Windows;
namespace Lab2
{
/// <summary>
/// Класс для утилит форм
/// </summary>
public static class Util
{
/// <summary>
/// Открывает форму редактирования
/// </summary>
/// <param name="parTool"> Инструмент </param>
/// <returns> True, если редактирование прошло успешно, иначе - false </returns>
public static bool ShowEditForm(Tool parTool, bool parReadOnly = false, bool parIsForced = false)
{
Window? form = parTool switch
{
Scissors scissors => new CreateScissors(scissors, parReadOnly, parIsForced),
Scythe scythe => new CreateScythe(scythe, parReadOnly, parIsForced),
Trimmer trimmer => new CreateTrimmer(trimmer, parReadOnly, parIsForced),
Lawnmower lawnmower => new CreateLawnmower(lawnmower, parReadOnly, parIsForced),
_ => null,
};
if (form == null)
return false;
var result = form.ShowDialog();
return result ?? false;
}
}
}