using System;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace CarManagerV3
{
public partial class CarDetailsForm : Form
{
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);
lblID.Text = $"ID: {car.Id}";
}
///
/// 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
);
}
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(() =>
{
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)
{
//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)
{
if (keyData == Keys.Enter)
{
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);
}
}
}