changeset 34:3ceb0efd261f

Re #118: Allow equipment amounts of "ratio" equipment to be define as absolute or ratio amounts * Use new commands created in previous revision Re #122: Make usage of percentage or ratio common * Make sure all usage of percentages are correct Re #117: Add percentage and number boxes to equipment item dialogs * Fix some enable/disable inconsistencies for percentage amounts * Fix problems where fixed limits weren't honoured by widgets
author IBBoard <dev@ibboard.co.uk>
date Thu, 13 Aug 2009 21:16:21 +0000
parents 67c283ea77a7
children 27b1837c837e
files FrmEditUnitEquipment.cs FrmNewUnitEquipment.cs FrmReplaceUnitEquipment.cs FrmUnit.cs Util/UnitEquipmentChoice.cs
diffstat 5 files changed, 302 insertions(+), 288 deletions(-) [+]
line wrap: on
line diff
--- a/FrmEditUnitEquipment.cs	Sun Aug 09 12:05:24 2009 +0000
+++ b/FrmEditUnitEquipment.cs	Thu Aug 13 21:16:21 2009 +0000
@@ -46,9 +46,9 @@
 
 			if (equipItem.IsRatioLimit)
 			{
-				numEquipAmount.Minimum = (decimal)Math.Round(equipItem.MinNumber * 100.0, 2);
-				numEquipAmount.Maximum = (decimal)Math.Round(equipItem.MaxNumber * 100.0, 2);
-				numEquipAmount.Value = (decimal)Math.Round(equipAmount * 100, 2);
+				numEquipAmount.Minimum = (decimal)Math.Round(equipItem.MinPercentage, 2);
+				numEquipAmount.Maximum = (decimal)Math.Round(equipItem.MaxPercentage, 2);
+				numEquipAmount.Value = (decimal)Math.Round(equipAmount, 2);
 				cbEquipAll.Enabled = false;
 				lblPercent.Visible = true;
 				numEquipAmount.Width = 120;
@@ -210,18 +210,18 @@
 			{
 				if (equipAmount != WarFoundryCore.INFINITY)
 				{
-					commandStack.Execute(new SetUnitEquipmentAmountCommand(unit, equipItem, WarFoundryCore.INFINITY));
+					commandStack.Execute(new SetUnitEquipmentNumericAmountCommand(unit, equipItem, WarFoundryCore.INFINITY));
 				}
 			}
 			else if (numEquipAmount.Value != (decimal)equipAmount)
 			{
 				if (equipItem.IsRatioLimit)
 				{
-					commandStack.Execute(new SetUnitEquipmentAmountCommand(unit, equipItem, ((double)numEquipAmount.Value / 100.0)));
+					commandStack.Execute(new SetUnitEquipmentRatioAmountCommand(unit, equipItem, (double)numEquipAmount.Value));
 				}
 				else
-				{
-					commandStack.Execute(new SetUnitEquipmentAmountCommand(unit, equipItem, (double)numEquipAmount.Value));
+				{
+					commandStack.Execute(new SetUnitEquipmentNumericAmountCommand(unit, equipItem, (int)numEquipAmount.Value));
 				}
 			}
 
--- a/FrmNewUnitEquipment.cs	Sun Aug 09 12:05:24 2009 +0000
+++ b/FrmNewUnitEquipment.cs	Thu Aug 13 21:16:21 2009 +0000
@@ -1,272 +1,276 @@
-// This file (FrmNewUnitEquipment.cs) is a part of the IBBoard.WarFoundry.GUI.WinForms project and is copyright 2009 IBBoard.
-//
-// The file and the library/program it is in are licensed under the GNU LGPL license, either version 3 of the License or (at your option) any later version. Please see COPYING.LGPL for more information and the full license.
-
-using System;
-using System.Drawing;
-using System.Collections;
-using System.ComponentModel;
-using System.Windows.Forms;
-using IBBoard;
-using IBBoard.Commands;
-using IBBoard.WarFoundry.API;
-using IBBoard.WarFoundry.API.Commands;
-using IBBoard.WarFoundry.API.Objects;
-
-namespace IBBoard.WarFoundry
-{
-	/// <summary>
-	/// Summary description for FrmNewUnitEquipment.
-	/// </summary>
-	public class FrmNewUnitEquipment : System.Windows.Forms.Form
-	{
-		private Unit unit;
-		private bool required;
-		private CommandStack commandStack;
-
-		private System.Windows.Forms.NumericUpDown numEquipAmount;
-		private System.Windows.Forms.Label lblPercent;
-		private System.Windows.Forms.Label lblAmount;
-		private System.Windows.Forms.Button bttnCancel;
-		private System.Windows.Forms.Button bttnOkay;
-		private System.Windows.Forms.CheckBox cbEquipAll;
-		private System.Windows.Forms.Label lblItem;
-		private System.Windows.Forms.ListBox listItems;
-		/// <summary>
-		/// Required designer variable.
-		/// </summary>
-		private System.ComponentModel.Container components = null;
-
-		public FrmNewUnitEquipment(Unit unit, CommandStack stack)
-		{
-			commandStack = stack;
-			this.unit = unit;
-			InitializeComponent();
-			this.Text = "New equipment for " + unit.Name;
-			object[] items = Arrays.Subtract(unit.GetAllowedOptionalEquipment(), unit.GetEquipment());
-			listItems.Items.AddRange(items);
-		}
-
-		/// <summary>
-		/// Clean up any resources being used.
-		/// </summary>
-		protected override void Dispose( bool disposing )
-		{
-			if( disposing )
-			{
-				if(components != null)
-				{
-					components.Dispose();
-				}
-			}
-			base.Dispose( disposing );
-		}
-
-		#region Windows Form Designer generated code
-		/// <summary>
-		/// Required method for Designer support - do not modify
-		/// the contents of this method with the code editor.
-		/// </summary>
-		private void InitializeComponent()
-		{
-			this.numEquipAmount = new System.Windows.Forms.NumericUpDown();
-			this.lblPercent = new System.Windows.Forms.Label();
-			this.lblAmount = new System.Windows.Forms.Label();
-			this.bttnCancel = new System.Windows.Forms.Button();
-			this.bttnOkay = new System.Windows.Forms.Button();
-			this.cbEquipAll = new System.Windows.Forms.CheckBox();
-			this.lblItem = new System.Windows.Forms.Label();
-			this.listItems = new System.Windows.Forms.ListBox();
-			((System.ComponentModel.ISupportInitialize)(this.numEquipAmount)).BeginInit();
-			this.SuspendLayout();
-			// 
-			// numEquipAmount
-			// 
-			this.numEquipAmount.Enabled = false;
-			this.numEquipAmount.Location = new System.Drawing.Point(88, 80);
-			this.numEquipAmount.Name = "numEquipAmount";
-			this.numEquipAmount.Size = new System.Drawing.Size(144, 20);
-			this.numEquipAmount.TabIndex = 0;
-			this.numEquipAmount.ValueChanged += new System.EventHandler(this.numEquipAmount_ValueChanged);
-			// 
-			// lblPercent
-			// 
-			this.lblPercent.Location = new System.Drawing.Point(208, 80);
-			this.lblPercent.Name = "lblPercent";
-			this.lblPercent.Size = new System.Drawing.Size(16, 16);
-			this.lblPercent.TabIndex = 1;
-			this.lblPercent.Text = "%";
-			this.lblPercent.Visible = false;
-			// 
-			// lblAmount
-			// 
-			this.lblAmount.Location = new System.Drawing.Point(8, 80);
-			this.lblAmount.Name = "lblAmount";
-			this.lblAmount.Size = new System.Drawing.Size(72, 23);
-			this.lblAmount.TabIndex = 2;
-			this.lblAmount.Text = "amount";
-			this.lblAmount.TextAlign = System.Drawing.ContentAlignment.TopRight;
-			// 
-			// bttnCancel
-			// 
-			this.bttnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
-			this.bttnCancel.FlatStyle = System.Windows.Forms.FlatStyle.System;
-			this.bttnCancel.Location = new System.Drawing.Point(160, 136);
-			this.bttnCancel.Name = "bttnCancel";
-			this.bttnCancel.TabIndex = 3;
-			this.bttnCancel.Text = "cancel";
-			this.bttnCancel.Click += new System.EventHandler(this.bttnCancel_Click);
-			// 
-			// bttnOkay
-			// 
-			this.bttnOkay.Enabled = false;
-			this.bttnOkay.FlatStyle = System.Windows.Forms.FlatStyle.System;
-			this.bttnOkay.Location = new System.Drawing.Point(8, 136);
-			this.bttnOkay.Name = "bttnOkay";
-			this.bttnOkay.TabIndex = 4;
-			this.bttnOkay.Text = "okay";
-			this.bttnOkay.Click += new System.EventHandler(this.bttnOkay_Click);
-			// 
-			// cbEquipAll
-			// 
-			this.cbEquipAll.Enabled = false;
-			this.cbEquipAll.FlatStyle = System.Windows.Forms.FlatStyle.System;
-			this.cbEquipAll.Location = new System.Drawing.Point(88, 104);
-			this.cbEquipAll.Name = "cbEquipAll";
-			this.cbEquipAll.TabIndex = 5;
-			this.cbEquipAll.Text = "equip all";
-			this.cbEquipAll.CheckedChanged += new System.EventHandler(this.cbEquipAll_CheckedChanged);
-			// 
-			// lblItem
-			// 
-			this.lblItem.Location = new System.Drawing.Point(0, 8);
-			this.lblItem.Name = "lblItem";
-			this.lblItem.Size = new System.Drawing.Size(80, 23);
-			this.lblItem.TabIndex = 6;
-			this.lblItem.Text = "item";
-			this.lblItem.TextAlign = System.Drawing.ContentAlignment.TopRight;
-			// 
-			// listItems
-			// 
-			this.listItems.Location = new System.Drawing.Point(88, 8);
-			this.listItems.Name = "listItems";
-			this.listItems.Size = new System.Drawing.Size(144, 69);
-			this.listItems.TabIndex = 7;
-			this.listItems.SelectedIndexChanged += new System.EventHandler(this.listItems_SelectedIndexChanged);
-			// 
-			// FrmNewUnitEquipment
-			// 
-			this.AcceptButton = this.bttnOkay;
-			this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
-			this.CancelButton = this.bttnCancel;
-			this.ClientSize = new System.Drawing.Size(240, 164);
-			this.ControlBox = false;
-			this.Controls.Add(this.listItems);
-			this.Controls.Add(this.lblItem);
-			this.Controls.Add(this.cbEquipAll);
-			this.Controls.Add(this.bttnOkay);
-			this.Controls.Add(this.bttnCancel);
-			this.Controls.Add(this.lblAmount);
-			this.Controls.Add(this.numEquipAmount);
-			this.Controls.Add(this.lblPercent);
-			this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
-			this.Name = "FrmNewUnitEquipment";
-			this.ShowInTaskbar = false;
-			this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
-			this.Text = "FrmEditUnitEquipment";
-			((System.ComponentModel.ISupportInitialize)(this.numEquipAmount)).EndInit();
-			this.ResumeLayout(false);
-
-		}
-		#endregion
-
-		private void bttnOkay_Click(object sender, System.EventArgs e)
-		{
-			setValue();
-			this.Close();
-		}
-
-		private void setValue()
-		{
-			UnitEquipmentItem equipItem = (UnitEquipmentItem)listItems.SelectedItem;
-
-			if (cbEquipAll.Checked)
-			{
-				commandStack.Execute(new SetUnitEquipmentAmountCommand(unit, equipItem, WarFoundryCore.INFINITY));
-			}
-			else
-			{
-				if (equipItem.IsRatioLimit)
-				{
-					commandStack.Execute(new SetUnitEquipmentAmountCommand(unit, equipItem, (double)numEquipAmount.Value / 100.0));
-				}
-				else
-				{
-					commandStack.Execute(new SetUnitEquipmentAmountCommand(unit, equipItem, (double)numEquipAmount.Value));
-				}
-			}
-		}
-
-		private void bttnCancel_Click(object sender, System.EventArgs e)
-		{
-			this.Close();
-		}
-
-		private void cbEquipAll_CheckedChanged(object sender, System.EventArgs e)
-		{
-			numEquipAmount.Enabled = ((UnitEquipmentItem)listItems.SelectedItem).MinNumber != WarFoundryCore.INFINITY && !cbEquipAll.Checked;
-			setOkayButton();
-		}
-
-		private void listItems_SelectedIndexChanged(object sender, System.EventArgs e)
-		{
-			refreshNumber();
-			setOkayButton();
-		}
-
-		private void refreshNumber()
-		{
-			if (listItems.SelectedIndex > -1)
-			{
-				UnitEquipmentItem equipItem = (UnitEquipmentItem)listItems.SelectedItem;
-				required = equipItem.IsRequired;
-
-				if (equipItem.IsRatioLimit)
-				{
-					numEquipAmount.Minimum = (decimal)Math.Round(equipItem.MinNumber * 100.0, 2);
-					numEquipAmount.Maximum = (decimal)Math.Round(equipItem.MaxNumber * 100.0, 2);
-					numEquipAmount.Value = numEquipAmount.Minimum;
-					cbEquipAll.Enabled = false;
-					lblPercent.Visible = true;
-					numEquipAmount.Width = 120;
-				}
-				else
-				{
-					numEquipAmount.Minimum = (decimal)(equipItem.MinNumber != WarFoundryCore.INFINITY ? equipItem.MinNumber : unit.Size);
-					numEquipAmount.Maximum = (decimal)(equipItem.MaxNumber != WarFoundryCore.INFINITY ? equipItem.MaxNumber : unit.Size);
-					numEquipAmount.Value = numEquipAmount.Minimum;
-					cbEquipAll.Enabled = equipItem.MinNumber != WarFoundryCore.INFINITY;
-					cbEquipAll.Checked = equipItem.MinNumber == WarFoundryCore.INFINITY;
-					numEquipAmount.Width = 144;
-				}
-			}
-			else
-			{
-				numEquipAmount.Minimum = 0;
-				numEquipAmount.Value = 0;
-				numEquipAmount.Enabled = false;
-				cbEquipAll.Enabled = false;
-			}
-		}
-
-		private void setOkayButton()
-		{
-			bttnOkay.Enabled = listItems.SelectedIndex > -1 && (cbEquipAll.Checked || (numEquipAmount.Enabled && numEquipAmount.Value > 0));
-		}
-
-		private void numEquipAmount_ValueChanged(object sender, System.EventArgs e)
-		{			
-			setOkayButton();
-		}
-	}
-}
+// This file (FrmNewUnitEquipment.cs) is a part of the IBBoard.WarFoundry.GUI.WinForms project and is copyright 2009 IBBoard.
+//
+// The file and the library/program it is in are licensed under the GNU LGPL license, either version 3 of the License or (at your option) any later version. Please see COPYING.LGPL for more information and the full license.
+
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using IBBoard;
+using IBBoard.Commands;
+using IBBoard.Lang;
+using IBBoard.WarFoundry.API;
+using IBBoard.WarFoundry.API.Commands;
+using IBBoard.WarFoundry.API.Objects;
+
+namespace IBBoard.WarFoundry
+{
+	/// <summary>
+	/// Summary description for FrmNewUnitEquipment.
+	/// </summary>
+	public class FrmNewUnitEquipment : System.Windows.Forms.Form
+	{
+		private Unit unit;
+		private bool required;
+		private CommandStack commandStack;
+
+		private System.Windows.Forms.NumericUpDown numEquipAmount;
+		private System.Windows.Forms.Label lblPercent;
+		private System.Windows.Forms.Label lblAmount;
+		private System.Windows.Forms.Button bttnCancel;
+		private System.Windows.Forms.Button bttnOkay;
+		private System.Windows.Forms.CheckBox cbEquipAll;
+		private System.Windows.Forms.Label lblItem;
+		private System.Windows.Forms.ListBox listItems;
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.Container components = null;
+
+		public FrmNewUnitEquipment(Unit unit, CommandStack stack)
+		{
+			commandStack = stack;
+			this.unit = unit;
+			InitializeComponent();
+			this.Text = "New equipment for " + unit.Name;
+			object[] items = Arrays.Subtract(unit.GetAllowedOptionalEquipment(), unit.GetEquipment());
+			listItems.Items.AddRange(items);
+		}
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if(components != null)
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		#region Windows Form Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+			this.numEquipAmount = new System.Windows.Forms.NumericUpDown();
+			this.lblPercent = new System.Windows.Forms.Label();
+			this.lblAmount = new System.Windows.Forms.Label();
+			this.bttnCancel = new System.Windows.Forms.Button();
+			this.bttnOkay = new System.Windows.Forms.Button();
+			this.cbEquipAll = new System.Windows.Forms.CheckBox();
+			this.lblItem = new System.Windows.Forms.Label();
+			this.listItems = new System.Windows.Forms.ListBox();
+			((System.ComponentModel.ISupportInitialize)(this.numEquipAmount)).BeginInit();
+			this.SuspendLayout();
+			// 
+			// numEquipAmount
+			// 
+			this.numEquipAmount.Enabled = false;
+			this.numEquipAmount.Location = new System.Drawing.Point(88, 80);
+			this.numEquipAmount.Name = "numEquipAmount";
+			this.numEquipAmount.Size = new System.Drawing.Size(144, 20);
+			this.numEquipAmount.TabIndex = 0;
+			this.numEquipAmount.ValueChanged += new System.EventHandler(this.numEquipAmount_ValueChanged);
+			// 
+			// lblPercent
+			// 
+			this.lblPercent.Location = new System.Drawing.Point(208, 80);
+			this.lblPercent.Name = "lblPercent";
+			this.lblPercent.Size = new System.Drawing.Size(16, 16);
+			this.lblPercent.TabIndex = 1;
+			this.lblPercent.Text = "%";
+			this.lblPercent.Visible = false;
+			// 
+			// lblAmount
+			// 
+			this.lblAmount.Location = new System.Drawing.Point(8, 80);
+			this.lblAmount.Name = "lblAmount";
+			this.lblAmount.Size = new System.Drawing.Size(72, 23);
+			this.lblAmount.TabIndex = 2;
+			this.lblAmount.Text = "amount";
+			this.lblAmount.TextAlign = System.Drawing.ContentAlignment.TopRight;
+			// 
+			// bttnCancel
+			// 
+			this.bttnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+			this.bttnCancel.FlatStyle = System.Windows.Forms.FlatStyle.System;
+			this.bttnCancel.Location = new System.Drawing.Point(160, 136);
+			this.bttnCancel.Name = "bttnCancel";
+			this.bttnCancel.TabIndex = 3;
+			this.bttnCancel.Text = "cancel";
+			this.bttnCancel.Click += new System.EventHandler(this.bttnCancel_Click);
+			// 
+			// bttnOkay
+			// 
+			this.bttnOkay.Enabled = false;
+			this.bttnOkay.FlatStyle = System.Windows.Forms.FlatStyle.System;
+			this.bttnOkay.Location = new System.Drawing.Point(8, 136);
+			this.bttnOkay.Name = "bttnOkay";
+			this.bttnOkay.TabIndex = 4;
+			this.bttnOkay.Text = "okay";
+			this.bttnOkay.Click += new System.EventHandler(this.bttnOkay_Click);
+			// 
+			// cbEquipAll
+			// 
+			this.cbEquipAll.Enabled = false;
+			this.cbEquipAll.FlatStyle = System.Windows.Forms.FlatStyle.System;
+			this.cbEquipAll.Location = new System.Drawing.Point(88, 104);
+			this.cbEquipAll.Name = "cbEquipAll";
+			this.cbEquipAll.TabIndex = 5;
+			this.cbEquipAll.Text = "equip all";
+			this.cbEquipAll.CheckedChanged += new System.EventHandler(this.cbEquipAll_CheckedChanged);
+			// 
+			// lblItem
+			// 
+			this.lblItem.Location = new System.Drawing.Point(0, 8);
+			this.lblItem.Name = "lblItem";
+			this.lblItem.Size = new System.Drawing.Size(80, 23);
+			this.lblItem.TabIndex = 6;
+			this.lblItem.Text = "item";
+			this.lblItem.TextAlign = System.Drawing.ContentAlignment.TopRight;
+			// 
+			// listItems
+			// 
+			this.listItems.Location = new System.Drawing.Point(88, 8);
+			this.listItems.Name = "listItems";
+			this.listItems.Size = new System.Drawing.Size(144, 69);
+			this.listItems.TabIndex = 7;
+			this.listItems.SelectedIndexChanged += new System.EventHandler(this.listItems_SelectedIndexChanged);
+			// 
+			// FrmNewUnitEquipment
+			// 
+			this.AcceptButton = this.bttnOkay;
+			this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
+			this.CancelButton = this.bttnCancel;
+			this.ClientSize = new System.Drawing.Size(240, 164);
+			this.ControlBox = false;
+			this.Controls.Add(this.listItems);
+			this.Controls.Add(this.lblItem);
+			this.Controls.Add(this.cbEquipAll);
+			this.Controls.Add(this.bttnOkay);
+			this.Controls.Add(this.bttnCancel);
+			this.Controls.Add(this.lblAmount);
+			this.Controls.Add(this.numEquipAmount);
+			this.Controls.Add(this.lblPercent);
+			this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+			this.Name = "FrmNewUnitEquipment";
+			this.ShowInTaskbar = false;
+			this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+			this.Text = "FrmEditUnitEquipment";
+			((System.ComponentModel.ISupportInitialize)(this.numEquipAmount)).EndInit();
+			this.ResumeLayout(false);
+
+		}
+		#endregion
+
+		private void bttnOkay_Click(object sender, System.EventArgs e)
+		{
+			setValue();
+			this.Close();
+		}
+
+		private void setValue()
+		{
+			UnitEquipmentItem equipItem = (UnitEquipmentItem)listItems.SelectedItem;
+
+			if (cbEquipAll.Checked)
+			{
+				commandStack.Execute(new SetUnitEquipmentNumericAmountCommand(unit, equipItem, WarFoundryCore.INFINITY));
+			}
+			else
+			{
+				if (equipItem.IsRatioLimit)
+				{
+					commandStack.Execute(new SetUnitEquipmentRatioAmountCommand(unit, equipItem, (double)numEquipAmount.Value / 100.0));
+				}
+				else
+				{
+					commandStack.Execute(new SetUnitEquipmentNumericAmountCommand(unit, equipItem, (int)numEquipAmount.Value));
+				}
+			}
+		}
+
+		private void bttnCancel_Click(object sender, System.EventArgs e)
+		{
+			this.Close();
+		}
+
+		private void cbEquipAll_CheckedChanged(object sender, System.EventArgs e)
+		{
+			numEquipAmount.Enabled = ((UnitEquipmentItem)listItems.SelectedItem).MinNumber != WarFoundryCore.INFINITY && !cbEquipAll.Checked;
+			setOkayButton();
+		}
+
+		private void listItems_SelectedIndexChanged(object sender, System.EventArgs e)
+		{
+			refreshNumber();
+			setOkayButton();
+		}
+
+		private void refreshNumber()
+		{
+			if (listItems.SelectedIndex > -1)
+			{
+				UnitEquipmentItem equipItem = (UnitEquipmentItem)listItems.SelectedItem;
+				required = equipItem.IsRequired;
+
+				if (equipItem.IsRatioLimit)
+				{
+					numEquipAmount.Minimum = (decimal) equipItem.MinPercentage;
+					numEquipAmount.Maximum = (decimal) equipItem.MaxPercentage;
+					numEquipAmount.Enabled = true;
+					numEquipAmount.Value = numEquipAmount.Minimum;
+					cbEquipAll.Enabled = false;
+					lblPercent.Visible = true;
+					numEquipAmount.Width = 120;
+				}
+				else
+				{
+					numEquipAmount.Minimum = (decimal)(equipItem.MinNumber != WarFoundryCore.INFINITY ? Math.Min(equipItem.MinNumber, unit.Size) : unit.Size);
+					numEquipAmount.Maximum = (decimal)(equipItem.MaxNumber != WarFoundryCore.INFINITY ? Math.Min(equipItem.MaxNumber, unit.Size) : unit.Size);
+					numEquipAmount.Value = numEquipAmount.Minimum;
+					numEquipAmount.Enabled = equipItem.MinNumber != WarFoundryCore.INFINITY;
+					cbEquipAll.Enabled = equipItem.MinNumber != WarFoundryCore.INFINITY && equipItem.MaxNumber == WarFoundryCore.INFINITY;
+					cbEquipAll.Checked = equipItem.MinNumber == WarFoundryCore.INFINITY;
+					lblPercent.Visible = false;
+					numEquipAmount.Width = 144;
+				}
+			}
+			else
+			{
+				numEquipAmount.Minimum = 0;
+				numEquipAmount.Value = 0;
+				numEquipAmount.Enabled = false;
+				cbEquipAll.Enabled = false;
+			}
+		}
+
+		private void setOkayButton()
+		{
+			bttnOkay.Enabled = listItems.SelectedIndex > -1 && (cbEquipAll.Checked || (numEquipAmount.Enabled && numEquipAmount.Value > 0));
+		}
+
+		private void numEquipAmount_ValueChanged(object sender, System.EventArgs e)
+		{			
+			setOkayButton();
+		}
+	}
+}
--- a/FrmReplaceUnitEquipment.cs	Sun Aug 09 12:05:24 2009 +0000
+++ b/FrmReplaceUnitEquipment.cs	Thu Aug 13 21:16:21 2009 +0000
@@ -194,17 +194,17 @@
 
 			if (cbEquipAll.Checked)
 			{
-                commandStack.Execute(new ReplaceUnitEquipmentCommand(unit, oldItem, equipItem, WarFoundryCore.INFINITY));
+                commandStack.Execute(new ReplaceUnitEquipmentWithNumericAmountItemCommand(unit, oldItem, equipItem, WarFoundryCore.INFINITY));
 			}
 			else
 			{
                 if (equipItem.IsRatioLimit)
 				{
-                    commandStack.Execute(new ReplaceUnitEquipmentCommand(unit, oldItem, equipItem, (double)numEquipAmount.Value / 100.0));
+                    commandStack.Execute(new ReplaceUnitEquipmentWithRatioAmountItemCommand(unit, oldItem, equipItem, (double)numEquipAmount.Value));
 				}
 				else
-				{
-                    commandStack.Execute(new ReplaceUnitEquipmentCommand(unit, oldItem, equipItem, (double)numEquipAmount.Value));
+				{
+					commandStack.Execute(new ReplaceUnitEquipmentWithNumericAmountItemCommand(unit, oldItem, equipItem, (int)numEquipAmount.Value));
 				}
 			}
 		}
--- a/FrmUnit.cs	Sun Aug 09 12:05:24 2009 +0000
+++ b/FrmUnit.cs	Thu Aug 13 21:16:21 2009 +0000
@@ -19,8 +19,6 @@
 
 namespace IBBoard.WarFoundry.WinForms
 {
-	///TODO: Separate weapons out into optional and required, where required only has button for replacing
-
 	/// <summary>
 	/// Summary description for FrmUnit.
 	/// </summary>
@@ -504,7 +502,7 @@
 
 		private void removeWeapon()
 		{
-			commandStack.Execute(new SetUnitEquipmentAmountCommand(unit, ((UnitEquipmentChoice) optList.SelectedItem).Item, 0));
+			commandStack.Execute(new SetUnitEquipmentNumericAmountCommand(unit, ((UnitEquipmentChoice) optList.SelectedItem).Item, 0));
 		}
 
 		private void bttnRemoveWeapon_Click(object sender, System.EventArgs e)
--- a/Util/UnitEquipmentChoice.cs	Sun Aug 09 12:05:24 2009 +0000
+++ b/Util/UnitEquipmentChoice.cs	Thu Aug 13 21:16:21 2009 +0000
@@ -29,8 +29,20 @@
 
         public override string ToString()
         {
-            return String.Format("{0} (For {1} at {2}pts each)", item.Name, UnitEquipmentItem.FormatEquipmentAmount(item, unit.GetEquipmentAmount(item)), item.Cost);
-        }
+            return String.Format("{0} (For {1} at {2}pts each)", item.Name, GetAmountString(), item.Cost);
+        }
+
+		private string GetAmountString()
+		{
+			if (unit.GetEquipmentAmountIsRatio(item))
+			{
+				return UnitEquipmentRatioSelection.GetEquipmentAmountString(unit.GetEquipmentAmount(item));
+			}
+			else
+			{
+				return UnitEquipmentNumericSelection.GetEquipmentAmountString(unit.GetEquipmentAmount(item));
+			}
+		}
 
         public UnitEquipmentItem Item
         {