using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Security.AccessControl; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Xml.Linq; using GtaVUsersInfo.Helpers; using GtaVUsersInfo.Controls; using Newtonsoft.Json; using System.IO; using System.Data.Common; using GtaVUsersInfo.Forms; using System.Collections; using System.Security.Cryptography; using GtaVUsersInfo.Sources; using OpenQA.Selenium.DevTools.V127.Page; using Microsoft.VisualBasic.ApplicationServices; using static System.Windows.Forms.VisualStyles.VisualStyleElement; namespace GtaVUsersInfo { public partial class MainForm : Form { private List debugControlsList; private List carList; private List parameters; private List cars; private FontSettings fontSettings; private Font defaultFont; private Color defaultColor; private List dtControls; private WindowParameters window; private bool isUser; public MainForm() { InitializeComponent(); defaultFont = new Font("Arial", 11, FontStyle.Regular); defaultColor = Color.Black; debugControlsList = new List { parserButton, readJsonButton }; this.visible(debugControlsList, false); carList = LoadCarsFromJson(Resources.carJsonPath); cars = new List(); parameters = new List { new ParameterControl("Имя"), new ParameterControl("Деньги") }; carsItems.ContextMenuStrip = new CarPanelMenuStrip(addCar_Click).Menu; parametersPanel.ContextMenuStrip = new ParameterPanelMenuStrip(addNewParameter).Menu; dtControls = new List { parserButton, readJsonButton }; fontSettings = FontSettings.LoadFontSettings(); if (fontSettings != null) { fontSettings.FontSettingsEdit(dtControls); FontSettings.ChangeFontInControls(this, fontSettings); } else { fontSettings = new FontSettings(defaultFont, defaultColor, dtControls); FontSettings.ChangeFontInControls(this, fontSettings); FontSettings.SaveFontSettings(fontSettings); } isUser = false; window = WindowParameters.LoadWindowParameters(); if (window != null) { if (window.prevFile != null) { Cars_Parameters lists = LoadDataFromFile(window.prevFile); if (lists != null) { cars = lists.cars.Select(car => new CarControl(car)).ToList(); parameters = lists.parameters.Select(parameter => new ParameterControl(parameter)).ToList(); AllPanelCreate(); } } WindowResize(); } else { window = new WindowParameters(new Size(this.Width, this.Height), new Size(this.splitterLeft.SplitPosition, this.splitterRigth.SplitPosition)); WindowParameters.SaveWindowParameters(window); WindowResize(); } isUser = true; } private void MainForm_Load(object sender, EventArgs e) { AllPanelCreate(); } private void AllPanelCreate() { ParameterPanelCreate(); CarPanelCreate(); FontSettings.ChangeFontInControls(this, fontSettings); } private void WindowResize() { this.Width = window.width; this.Height = window.height; this.splitterLeft.SplitPosition = window.leftPos; this.splitterRigth.SplitPosition = window.rightPos; } private void ParameterPanelCreate() { parametersPanel.Controls.Clear(); foreach (Control param in parameters) { param.Dock = DockStyle.Top; (param as ParameterControl).MenuStrip = new ParameterItemMenuStrip(addNewParameter, deleteParameter, param as ParameterControl).Menu; parametersPanel.Controls.Add(param); parametersPanel.Controls.SetChildIndex(param, 0); } } private void CarPanelCreate() { carsItems.Controls.Clear(); foreach (CarControl car in cars) { car.MenuStrip = new CarItemMenuStrip(addCar_Click, editCar, deleteCar, car).Menu; carsItems.Controls.Add(car); } } public static List LoadCarsFromJson(string filePath) { try { string json = File.ReadAllText(filePath); List cars = JsonConvert.DeserializeObject>(json); return cars; } catch (FileNotFoundException) { ErrorsShow.ShowErrorMessage($"Файл с автомобилями не найден: {filePath}"); return new List(); } catch (JsonException ex) { ErrorsShow.ShowErrorMessage($"Ошибка при десериализации JSON автомобилей: {ex.Message}"); return new List(); } catch (Exception ex) { ErrorsShow.ShowErrorMessage($"Произошла неожиданная ошибка при открытии файла с автомобилями: {ex.Message}"); return new List(); } } #region Methods private void visible(List controls, bool isVisible) { controls.ForEach(control => { control.Visible = isVisible; control.Enabled = isVisible; }); } private void readJsonButton_Click(object sender, EventArgs e) { carList = LoadCarsFromJson(Resources.carJsonPath); } private void debugCheck_CheckedChanged(object sender, EventArgs e) { this.visible(debugControlsList, debugCheck.Checked); } #endregion async private void parserButton_Click(object sender, EventArgs e) { using (var parser = new CarParser()) { var cars = await parser.ParseCarsFromPages(25); parser.SaveToJson(cars, Resources.carJsonPath); ErrorsShow.ShowInfoMessage($"Данные сохранены: {Resources.carJsonPath}"); } carList = LoadCarsFromJson(Resources.carJsonPath); } #region Методы автомобильной панели private void addCar_Click(object sender, EventArgs e) { if (carList.Count <= 0) { ErrorsShow.ShowErrorMessage($"Список автомобилей пуст, ошибка чтения файла: {Resources.carJsonPath}"); return; } Car car = new Car(); using (AddCars form = new AddCars(carList, car)) { form.ChangeFonts(fontSettings); form.ShowDialog(); } if (car.Name != null) { CarControl item = new CarControl(car); cars.Add(item); AllPanelCreate(); } } private void editCar(object sender, EventArgs e) { if (carList.Count <= 0) { ErrorsShow.ShowErrorMessage($"Список автомобилей пуст, ошибка чтения файла: {Resources.carJsonPath}"); return; } ToolStripMenuItem clickedMenuItem = sender as ToolStripMenuItem; if (clickedMenuItem == null) return; CarItemMenuStrip menu = clickedMenuItem.Tag as CarItemMenuStrip; if (menu == null) return; CarControl carItem = menu.Car; if (carItem == null) return; Car car = new Car(); using (AddCars form = new AddCars(carList, car)) { form.ShowDialog(); } if (car.Name != null) { carItem.EditCar(car); } } private void deleteCar(object sender, EventArgs e) { if (carList.Count <= 0) { ErrorsShow.ShowErrorMessage($"Список автомобилей пуст, ошибка чтения файла: {Resources.carJsonPath}"); return; } ToolStripMenuItem clickedMenuItem = sender as ToolStripMenuItem; if (clickedMenuItem == null) return; CarItemMenuStrip menu = clickedMenuItem.Tag as CarItemMenuStrip; if (menu == null) return; CarControl carItem = menu.Car; if (carItem == null) return; if (cars.Contains(carItem)) { DialogResult result = ErrorsShow.ShowQuestMessage( $"Вы точно хотите удалить автомобиль: {carItem.Car.Name} - {carItem.Car.Price}?" ); if (result == DialogResult.Yes) { cars.Remove(carItem); AllPanelCreate(); } if (result == DialogResult.Cancel) { return; } } } #endregion #region Методы панели параметров private void addParameter_Click(object sender, EventArgs e) { ParameterControl parameter = new ParameterControl(); using (AddParameter form = new AddParameter(parameters, parameter)) { form.ChangeFonts(fontSettings); form.ShowDialog(); } if (!string.IsNullOrEmpty(parameter.ParamName)) { parameter.Dock = DockStyle.Top; parameters.Add(parameter); AllPanelCreate(); } } private void addNewParameter(object sender, EventArgs e) { addParameter_Click(sender, e); } private void deleteParameter(object sender, EventArgs e) { if (parameters.Count <= 0) { ErrorsShow.ShowErrorMessage($"Список параметров пуст"); return; } ToolStripMenuItem clickedMenuItem = sender as ToolStripMenuItem; if (clickedMenuItem == null) return; ParameterItemMenuStrip menu = clickedMenuItem.Tag as ParameterItemMenuStrip; if (menu == null) return; ParameterControl parameterControl = menu.Parameter; if (parameterControl == null) return; if (parameters.Contains(parameterControl)) { DialogResult result = ErrorsShow.ShowQuestMessage( $"Вы точно хотите удалить элемент: {parameterControl.ParamName}?" ); if (result == DialogResult.Yes) { parameters.Remove(parameterControl); AllPanelCreate(); } if (result == DialogResult.Cancel) { return; } } } #endregion #region Раскрывающийся список "Файл" private void openFileToolStripMenuItem_Click(object sender, EventArgs e) { Cars_Parameters lists = LoadDataFromFile(); if (lists != null) { cars = lists.cars.Select(car => new CarControl(car)).ToList(); parameters = lists.parameters.Select(parameter => new ParameterControl(parameter)).ToList(); AllPanelCreate(); } } private void saveToolStripMenuItem_Click(object sender, EventArgs e) { SaveDataToFile("JSON files (*.json)|*.json|All files (*.*)|*.*"); AllPanelCreate(); } private void saveAsКакToolStripMenuItem_Click(object sender, EventArgs e) { SaveDataToFile("All files (*.*)|*.*"); } public void SaveDataToFile(string filter) { Cars_Parameters data = new Cars_Parameters(Car.ConvertToCarList(cars), Parameter.ConvertToParameterList(parameters)); SaveFileDialog saveFileDialog = new SaveFileDialog(); saveFileDialog.Filter = filter; if (saveFileDialog.ShowDialog() == DialogResult.OK) { // Сериализуем данные в JSON string jsonData = JsonConvert.SerializeObject(data, Formatting.Indented); // Записываем данные в файл File.WriteAllText(saveFileDialog.FileName, jsonData); } } public Cars_Parameters LoadDataFromFile() { OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "JSON files (*.json)|*.json|All files (*.*)|*.*"; if (openFileDialog.ShowDialog() == DialogResult.OK) { // Читаем данные из файла string jsonData = File.ReadAllText(openFileDialog.FileName); // Десериализуем данные в объект ListData Cars_Parameters data = JsonConvert.DeserializeObject(jsonData); var split = openFileDialog.FileName.Split('\\'); this.Text = split[split.Length - 1]; window.prevFile = openFileDialog.FileName; SaveWindowSize(); return data; } return null; // Если пользователь отменил выбор файла } public Cars_Parameters LoadDataFromFile(string filePath) { if (!File.Exists(filePath)) { ErrorsShow.ShowErrorMessage($"Ошибка открытия файла: {filePath}"); return null; } // Читаем данные из файла string jsonData = File.ReadAllText(filePath); // Десериализуем данные в объект ListData Cars_Parameters data = JsonConvert.DeserializeObject(jsonData); var split = filePath.Split('\\'); this.Text = split[split.Length - 1]; return data; } private void newToolStripMenuItem_Click(object sender, EventArgs e) { DialogResult result = ErrorsShow.ShowQuestMessage("Хотите сохранить текущего персонажа?"); if (result == DialogResult.Yes) { SaveDataToFile("JSON files (*.json)|*.json|All files (*.*)|*.*"); } if (result == DialogResult.Cancel) { return; } cars = new List(); parameters = new List { new ParameterControl("Имя"), new ParameterControl("Деньги") }; this.Text = "null"; window.prevFile = null; SaveWindowSize(); AllPanelCreate(); } private void exitToolStripMenuItem_Click(object sender, EventArgs e) { this.Close(); } private void MainForm_FormClosing(object sender, FormClosingEventArgs e) { DialogResult result = ErrorsShow.ShowQuestMessage("Хотите сохранить текущего персонажа?"); if (result == DialogResult.Yes) { SaveDataToFile("JSON files (*.json)|*.json|All files (*.*)|*.*"); } if (result == DialogResult.Cancel) { e.Cancel = true; return; } } #endregion #region Раскрывающийся список "Стили" private void colorTextToolStripMenuItem_Click(object sender, EventArgs e) { using (ColorDialog colorDialog = new ColorDialog()) { if (colorDialog.ShowDialog() == DialogResult.OK) { fontSettings.FontSettingsEdit(colorDialog.Color); FontSettings.ChangeFontInControls(this, fontSettings); FontSettings.SaveFontSettings(fontSettings); } } } private void styleTextToolStripMenuItem_Click(object sender, EventArgs e) { using (FontDialog fontDialog = new FontDialog()) { if (fontDialog.ShowDialog() == DialogResult.OK) { fontSettings.FontSettingsEdit(fontDialog.Font); FontSettings.ChangeFontInControls(this, fontSettings); FontSettings.SaveFontSettings(fontSettings); } } } private void defaultToolStripMenuItem_Click(object sender, EventArgs e) { fontSettings.FontSettingsEdit(defaultFont); fontSettings.FontSettingsEdit(defaultColor); FontSettings.ChangeFontInControls(this, fontSettings); FontSettings.SaveFontSettings(fontSettings); } #endregion private void SaveWindowSize() { if (isUser) { window = new WindowParameters(new Size(this.Width, this.Height), new Size(this.splitterLeft.SplitPosition, this.splitterRigth.SplitPosition), window.prevFile); WindowParameters.SaveWindowParameters(window); } } private void MainForm_Resize(object sender, EventArgs e) { SaveWindowSize(); } private void SplitterMoved(object sender, SplitterEventArgs e) { SaveWindowSize(); } } }