using System; using System.Threading.Tasks; using System.Windows.Forms; using CarManagerV3.Util; namespace CarManagerV3 { public partial class CarDetailsForm : Form { public Car car; public CarDetailsForm(Car car) { InitializeComponent(); this.car = car; tbxMake.Text = car.Make; tbxModel.Text = car.Model; nudYear.Value = car.Year; tbxColor.Text = car.Color; nudMileage.Value = car.Mileage; nudPrice.Value = car.Price; tbxAge.Text = car.AgeString; pbxCarImage.Image = ImageManager.GetImage(car); if (car.Id == "0") { lblID.Text = "New Car"; } else { lblID.Text = $"ID: {car.Id}"; } SetAutoCompleteForMake(); SetAutoCompleteForModel(); SetAutoCompleteForColor(); } private void SetAutoCompleteForMake() { var makes = CarCompletions.GetCarBrands(); var makeAutoComplete = new AutoCompleteStringCollection(); makeAutoComplete.AddRange(makes.ToArray()); tbxMake.AutoCompleteMode = AutoCompleteMode.SuggestAppend; tbxMake.AutoCompleteSource = AutoCompleteSource.CustomSource; tbxMake.AutoCompleteCustomSource = makeAutoComplete; } private void SetAutoCompleteForModel() { var models = CarCompletions.GetCarModels(tbxMake.Text); var modelAutoComplete = new AutoCompleteStringCollection(); modelAutoComplete.AddRange(models.ToArray()); tbxModel.AutoCompleteMode = AutoCompleteMode.SuggestAppend; tbxModel.AutoCompleteSource = AutoCompleteSource.CustomSource; tbxModel.AutoCompleteCustomSource = modelAutoComplete; } private void SetAutoCompleteForColor() { var colors = CarCompletions.CommonColors; var colorAutoComplete = new AutoCompleteStringCollection(); colorAutoComplete.AddRange(colors.ToArray()); tbxColor.AutoCompleteMode = AutoCompleteMode.SuggestAppend; tbxColor.AutoCompleteSource = AutoCompleteSource.CustomSource; tbxColor.AutoCompleteCustomSource = colorAutoComplete; } /// /// Updates a car property safely by executing the update action and reverting it if an exception occurs. /// /// The update action. /// The action to perform when the update fails. private void SafeUpdate(Action updateAction, Action revertAction) { try { updateAction(); } catch (ArgumentException ex) { MessageBox.Show(ex.Message, "Invalid Input", MessageBoxButtons.OK, MessageBoxIcon.Error); revertAction(); } } //private string ValueOrFormer(string newValue, string oldValue) //{ // return string.IsNullOrWhiteSpace(newValue) ? oldValue : newValue; //} private T ValueOrFormer(T newValue, T oldValue) { if (newValue is string str) { return string.IsNullOrWhiteSpace(str) ? oldValue : newValue; } return newValue; } private void tbxMake_TextChanged(object sender, EventArgs e) { SafeUpdate( () => car.Make = ValueOrFormer(tbxMake.Text, car.Make), () => tbxMake.Text = car.Make ); SetAutoCompleteForModel(); } private void tbxModel_TextChanged(object sender, EventArgs e) { SafeUpdate( () => car.Model = ValueOrFormer(tbxModel.Text, car.Model), () => tbxModel.Text = car.Model ); } private void nudYear_ValueChanged(object sender, EventArgs e) { SafeUpdate( () => { car.Year = (int)ValueOrFormer(nudYear.Value, car.Year); tbxAge.Text = car.AgeString; }, () => nudYear.Value = car.Year ); } private void tbxColor_TextChanged(object sender, EventArgs e) { SafeUpdate( () => car.Color = ValueOrFormer(tbxColor.Text, car.Color), () => tbxColor.Text = car.Color ); } private void nudMileage_ValueChanged(object sender, EventArgs e) { SafeUpdate( () => car.Mileage = (int)nudMileage.Value, () => nudMileage.Value = car.Mileage ); } private void nudPrice_ValueChanged(object sender, EventArgs e) { SafeUpdate( () => car.Price = nudPrice.Value, () => nudPrice.Value = car.Price ); } private async void btnSave_Click(object sender, EventArgs e) { // save car to cars.csv and close form //saving car... popuo btnSave.Enabled = false; btnDelete.Enabled = false; var msgbox = new PleaseWait(); msgbox.Show(); await Task.Run(() => { if(car.Id == "0") { car = StateManager.CreateCar(car.Make, car.Model, car.Year, car.Color, car.Mileage, car.Price); } else { StateManager.UpdateCar(car); } Console.WriteLine("Saved car: " + car.Id); }); Console.WriteLine("Car saved. " + car.Id); btnSave.Enabled = true; btnDelete.Enabled = true; this.Close(); msgbox.Close(); } private void btnDelete_Click(object sender, EventArgs e) { if(car.Id == "0") { //just close form if car is not saved yet this.Close(); return; } //are you sure? var result = MessageBox.Show("Are you sure you want to delete this car?", "Delete Car", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); if (result == DialogResult.Yes) { Console.WriteLine("Deleting car: " + car.Id); StateManager.RemoveCar(car); this.Close(); } } protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { // Ctrl+S to save, Esc to close, Delete to delete if (keyData == (Keys.Control | Keys.S)) { btnSave.PerformClick(); return true; // Indicate that the key has been handled } if (keyData == Keys.Escape) { this.Close(); return true; // Indicate that the key has been handled } if (keyData == Keys.Delete) { btnDelete.PerformClick(); return true; // Indicate that the key has been handled } return base.ProcessCmdKey(ref msg, keyData); } private void tbxMake_Leave(object sender, EventArgs e) { tbxMake.Text = ValueOrFormer(tbxMake.Text, car.Make); } private void tbxModel_Leave(object sender, EventArgs e) { tbxModel.Text = ValueOrFormer(tbxModel.Text, car.Model); } private void tbxColor_Leave(object sender, EventArgs e) { tbxColor.Text = ValueOrFormer(tbxColor.Text, car.Color); } } }