view UI/EquipmentAmountControl.cs @ 83:6d5cb8c7b6ed

Fixes #204: Use new limits in WinForms UI * Set initial amounts correctly * Disable percentage option when all that can be done is "equip all" * Remove unused references to "INFINITY"
author IBBoard <dev@ibboard.co.uk>
date Fri, 30 Oct 2009 21:00:04 +0000
parents 9dc22147c2db
children 0bb9f40d44eb
line wrap: on
line source

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using IBBoard.CustomMath;
using IBBoard.Limits;
using IBBoard.WarFoundry.API;
using IBBoard.WarFoundry.API.Objects;
using IBBoard.WarFoundry.API.Util;

namespace IBBoard.WarFoundry.GUI.WinForms.UI
{
	public partial class EquipmentAmountControl : UserControl
	{
		private Unit unit;
		private UnitEquipmentItem equip;
		public event EventHandler ValueChanged;

		public EquipmentAmountControl()
		{
			InitializeComponent();
		}

		public void SetUnit(Unit equipUnit)
		{
			unit = equipUnit;
		}

		public void SetUnitEquipmentItem(UnitEquipmentItem unitEquipment)
		{
			equip = unitEquipment;
			SetWidgetValues();
			SetUnitEquipmentItemAmount();
		}

		private void OnValueChanged()
		{
			if (ValueChanged != null)
			{
				ValueChanged(this, new EventArgs());
			}
		}

		private void SetWidgetValues()
		{
			if (equip != null)
			{
				bool equipIsRatioLimit = UnitEquipmentUtil.IsEquipmentRatioLimited(unit, equip);
				double maxPercent = UnitEquipmentUtil.GetMaxEquipmentPercentage(unit, equip);
				double minPercent = UnitEquipmentUtil.GetMinEquipmentPercentage(unit, equip);
				int maxNumber = UnitEquipmentUtil.GetMaxEquipmentCount(unit, equip);
				int minNumber = UnitEquipmentUtil.GetMinEquipmentCount(unit, equip);

				SetUpDownControlMinMaxes(minPercent, maxPercent, minNumber, maxNumber);

				if (equipIsRatioLimit)
				{
					SetEquipmentAmountsFromPercentage(minPercent);
				}
				else
				{
					SetEquipmentAmountsFromNumber(minNumber);
				}

				rbEquipAll.Enabled = equipIsRatioLimit && maxPercent == 100;
				rbEquipAll.Checked = equipIsRatioLimit && minPercent == 100;
				percentage.Enabled = equipIsRatioLimit && minPercent != 100;
				rbPercentage.Enabled = percentage.Enabled;
				rbPercentage.Checked = equipIsRatioLimit && !rbEquipAll.Checked;
				numeric.Enabled = !equipIsRatioLimit || minPercent != 100;
				rbNumeric.Enabled = numeric.Enabled;
				rbNumeric.Checked = !equipIsRatioLimit;
			}
			else
			{
				Enabled = false;
			}
		}

		private void SetUpDownControlMinMaxes(double minPercent, double maxPercent, int minNumber, int maxNumber)
		{
			percentage.ValueChanged -= percentage_ValueChanged;
			numeric.ValueChanged -= numeric_ValueChanged;
			SetUpDownControlMinMax(percentage, minPercent, maxPercent);
			SetUpDownControlMinMax(numeric, (decimal) minNumber, (decimal) maxNumber);
			percentage.ValueChanged += percentage_ValueChanged;
			numeric.ValueChanged += numeric_ValueChanged;
		}

		private void SetUpDownControlMinMax(NumericUpDown upDownControl, double min, double max)
		{
			SetUpDownControlMinMax(upDownControl, (decimal)min, (decimal)max);
		}

		private void SetUpDownControlMinMax(NumericUpDown upDownControl, decimal min, decimal max)
		{
			upDownControl.Minimum = min;
			upDownControl.Maximum = max;
		}

		private void rbEquipAll_CheckedChanged(object sender, EventArgs e)
		{
			bool equipAll = rbEquipAll.Checked;
			numeric.Enabled = !equipAll;
			percentage.Enabled = !equipAll;

			if (equipAll)
			{
				numeric.Value = unit.Size;
				percentage.Value = 100;
			}

			radioCheckedChanged(sender, e);
		}

		private void percentage_ValueChanged(object sender, EventArgs e)
		{
			SetNumericValueFromPercentage();
			rbEquipAll.Checked = (percentage.Value == 100 && !rbNumeric.Checked);
			OnValueChanged();
		}

		private void SetNumericValueFromPercentage()
		{
			double percent = (double)percentage.Value;
			numeric.Value = CalculateNumericValueFromPercentage(percent);
		}

		private decimal CalculateNumericValueFromPercentage(double percent)
		{
			return (decimal) IBBMath.Round(unit.Size * (percent / 100.0), equip.RoundNumberUp);
		}

		private void numeric_ValueChanged(object sender, EventArgs e)
		{
			SetPercentageValueFromNumeric();
			OnValueChanged();
		}

		private void SetPercentageValueFromNumeric()
		{
			int number = (int)numeric.Value;
			percentage.Value = CalcualtePercentageValueFromNumber(number);
		}

		private decimal CalcualtePercentageValueFromNumber(int number)
		{
			return (decimal) Math.Round((number / (unit.Size * 1.0)) * 100, 1);
		}

		public double EquipmentAmount
		{
			get
			{
				double val = 0;

				if (rbNumeric.Checked)
				{
					val = (double) numeric.Value;
				}
				else if (rbPercentage.Checked)
				{
					val = (double) percentage.Value;
				}
				else if (rbEquipAll.Checked)
				{
					val = 100;
				}
				else
				{
					val = 0;
				}

				return val;
			}
		}

		public bool IsRatioEquipmentAmount
		{
			get
			{
				return !rbNumeric.Checked;
			}
		}

		private void SetUnitEquipmentItemAmount()
		{
			double equipAmountNum = unit.GetEquipmentAmount(equip);

			if (equipAmountNum > 0)
			{
				bool isRatio = unit.GetEquipmentAmountIsRatio(equip);

				if (isRatio)
				{
					SetEquipmentAmountsFromPercentage(equipAmountNum);
				}
				else
				{
					int equipAmount = (int) equipAmountNum;
					SetEquipmentAmountsFromNumber(equipAmount);
				}
			}
		}

		private void SetEquipmentAmountsFromPercentage(double equipAmountNum)
		{
			numeric.Value = CalculateNumericValueFromPercentage(equipAmountNum);
			percentage.Value = (decimal) equipAmountNum;
		}

		private void SetEquipmentAmountsFromNumber(int equipAmount)
		{
			percentage.Value = CalcualtePercentageValueFromNumber(equipAmount);
			numeric.Value = equipAmount;
		}

		private void radioCheckedChanged(object sender, EventArgs e)
		{
			OnValueChanged();
		}
	}
}