view FrmReplaceUnitEquipment.cs @ 113:c1a3993297b1

Re #115: Typing number for equipment amount doesn't update Okay button * Switch to using ControlTranslator for the EquipmentAmountControl to resolve issues with the VisualStudio form designer erroring out because the translations aren't initialised (they still won't be, but it seems to be happy now)
author IBBoard <dev@ibboard.co.uk>
date Thu, 24 Dec 2009 10:52:03 +0000
parents 3e78af88ceb3
children b7899d084a14
line wrap: on
line source

// This file (FrmReplaceUnitEquipment.cs) is a part of the IBBoard.WarFoundry.GUI.WinForms project and is copyright 2008, 2009 IBBoard.
//
// The file and the library/program it is in are licensed and distributed, without warranty, under the GNU Affero GPL license, either version 3 of the License or (at your option) any later version. Please see COPYING for more information and the full license.

using System;
using System.Drawing;
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;
using IBBoard.WarFoundry.API.Util;

namespace IBBoard.WarFoundry
{
	/// <summary>
	/// Summary description for FrmNewUnitEquipment.
	/// </summary>
	public class FrmReplaceUnitEquipment : System.Windows.Forms.Form
	{
		private Unit unit;
		private UnitEquipmentItem oldItem;
		private CommandStack commandStack;
		private System.Windows.Forms.Label lblAmount;
		private System.Windows.Forms.Button bttnCancel;
		private System.Windows.Forms.Button bttnOkay;
		private System.Windows.Forms.Label lblItem;
		private System.Windows.Forms.ListBox listItems;
		private IBBoard.WarFoundry.GUI.WinForms.UI.EquipmentAmountControl equipmentAmount;
		/// <summary>
		/// Required designer variable.
		/// </summary>
		private System.ComponentModel.Container components = null;

		public FrmReplaceUnitEquipment(Unit unit, UnitEquipmentItem item, CommandStack stack)
		{
			commandStack = stack;
			this.unit = unit;
			oldItem = item;
			InitializeComponent();
			this.Text = "Replace " + item.EquipmentItem.Name + " with new equipment";
			object[] items = Arrays.Subtract(unit.UnitType.GetEquipmentItemsByExclusionGroups(item.MutexGroups), unit.GetEquipment());
			listItems.Items.AddRange(items);
			equipmentAmount.SetUnit(unit);
		}

		/// <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.lblAmount = new System.Windows.Forms.Label();
			this.bttnCancel = new System.Windows.Forms.Button();
			this.bttnOkay = new System.Windows.Forms.Button();
			this.lblItem = new System.Windows.Forms.Label();
			this.listItems = new System.Windows.Forms.ListBox();
			this.equipmentAmount = new IBBoard.WarFoundry.GUI.WinForms.UI.EquipmentAmountControl();
			this.SuspendLayout();
			// 
			// 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(159, 184);
			this.bttnCancel.Name = "bttnCancel";
			this.bttnCancel.Size = new System.Drawing.Size(75, 23);
			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(11, 184);
			this.bttnOkay.Name = "bttnOkay";
			this.bttnOkay.Size = new System.Drawing.Size(75, 23);
			this.bttnOkay.TabIndex = 4;
			this.bttnOkay.Text = "okay";
			this.bttnOkay.Click += new System.EventHandler(this.bttnOkay_Click);
			// 
			// 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(86, 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);
			// 
			// equipmentAmount
			// 
			this.equipmentAmount.Location = new System.Drawing.Point(86, 83);
			this.equipmentAmount.Name = "equipmentAmount";
			this.equipmentAmount.Size = new System.Drawing.Size(155, 77);
			this.equipmentAmount.TabIndex = 8;
			// 
			// FrmReplaceUnitEquipment
			// 
			this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
			this.ClientSize = new System.Drawing.Size(246, 219);
			this.ControlBox = false;
			this.Controls.Add(this.equipmentAmount);
			this.Controls.Add(this.listItems);
			this.Controls.Add(this.lblItem);
			this.Controls.Add(this.bttnOkay);
			this.Controls.Add(this.bttnCancel);
			this.Controls.Add(this.lblAmount);
			this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
			this.Name = "FrmReplaceUnitEquipment";
			this.ShowInTaskbar = false;
			this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
			this.Text = "FrmEditUnitEquipment";
			this.ResumeLayout(false);

		}
		#endregion

		private void bttnOkay_Click(object sender, System.EventArgs e)
		{
			SetValue();
			this.Close();
		}

		private void SetValue()
		{
			UnitEquipmentItem equipItem = (UnitEquipmentItem)listItems.SelectedItem;
			bool setValue = true;
			double amount = equipmentAmount.EquipmentAmount;

			if (amount == 0)
			{
				if (equipItem.IsRequired)
				{
					MessageBox.Show(this, "This item is required and cannot be removed. It must have a quantity of at least one or be replaced by an alternative.", "Required item", MessageBoxButtons.OK, MessageBoxIcon.Warning);
					setValue = false;
				}
				else
				{
					DialogResult dr = MessageBox.Show(this, "This will remove the item from the unit. Continue?", "Confirm remove", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);

					if (dr != DialogResult.Yes)
					{
						setValue = false;
					}
				}
			}

			double oldAmount = UnitEquipmentUtil.GetEquipmentAmount(unit, equipItem);

			if (setValue && oldAmount != amount)
			{
				if (equipmentAmount.IsRatioEquipmentAmount)
				{
					commandStack.Execute(new ReplaceUnitEquipmentWithRatioAmountItemCommand(unit, oldItem, equipItem, amount));
				}
				else
				{
					commandStack.Execute(new ReplaceUnitEquipmentWithNumericAmountItemCommand(unit, oldItem, equipItem, (int)amount));
				}
			}
		}

		private void bttnCancel_Click(object sender, System.EventArgs e)
		{
			this.Close();
		}

		private void listItems_SelectedIndexChanged(object sender, System.EventArgs e)
		{
			equipmentAmount.SetUnitEquipmentItem((UnitEquipmentItem)listItems.SelectedItem);
			SetOkayButton();
		}

		private void SetOkayButton()
		{
			double equipAmount = equipmentAmount.EquipmentAmount;
			bttnOkay.Enabled = equipAmount > 0 || equipAmount == WarFoundryCore.INFINITY || (listItems.SelectedItem != null && !((UnitEquipmentItem) listItems.SelectedItem).IsRequired);
		}

		private void numEquipAmount_ValueChanged(object sender, System.EventArgs e)
		{			
			SetOkayButton();
		}
	}
}