view FrmUnit.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 f4d3e64bdb18
children 18d607b0249b
line wrap: on
line source

// This file (FrmUnit.cs) is a part of the IBBoard.WarFoundry.GUI.WinForms project and is copyright 2007, 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.Data;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;
using IBBoard.Commands;
using IBBoard.Lang;
using IBBoard.Windows.Forms;
using IBBoard.Windows.Forms.I18N;
using IBBoard.WarFoundry.API;
using IBBoard.WarFoundry.API.Commands;
using IBBoard.WarFoundry.API.Objects;
using IBBoard.WarFoundry.GUI.WinForms.UI;
using IBBoard.WarFoundry.GUI.WinForms.Util;

namespace IBBoard.WarFoundry.GUI.WinForms
{
	/// <summary>
	/// Summary description for FrmUnit.
	/// </summary>
	public class FrmUnit : IBBoard.Windows.Forms.IBBForm
	{
		private Unit unit;
		private Dictionary<UnitEquipmentItem, UnitEquipmentChoice> equipmentChoices = new Dictionary<UnitEquipmentItem, UnitEquipmentChoice>();
		private CommandStack commandStack;
		private System.Windows.Forms.DataGrid statsGrid;
		private System.Windows.Forms.TextBox tbUnitName;
		private System.Windows.Forms.NumericUpDown unitSize;
		private IBBLabel lblUnitSize;
		private IBBButton bttnAddWeapon;
		private IBBButton bttnRemoveWeapon;
		private IBBLabel lblEquip;
		private System.Windows.Forms.ListBox equipmentList;
		private IBBButton bttnReplaceWeapon;
		private IBBButton bttnEditWeapon;
		private Label lblPoints;
		private IBBLabel lblNotes;
		private TextBox notes;
		private ListBox abilitiesList;
		private IBBLabel lblAbilities;
		/// <summary>
		/// Required designer variable.
		/// </summary>
		private System.ComponentModel.Container components = null;

		public FrmUnit(Unit toDisplay, CommandStack cmdStack)
		{
			unit = toDisplay;
			commandStack = cmdStack;
			//
			// Required for Windows Form Designer support
			//
			InitializeComponent();
			ControlTranslator.TranslateControl(this);
			tbUnitName.Text = unit.Name;
			Text = Translation.GetTranslation("FrmUnit", "{0}", unit.Name);
			unit.NameChanged += new StringValChangedDelegate(unit_NameChanged);
			unit.UnitSizeChanged += new IntValChangedDelegate(unit_UnitSizeChanged);
			unit.UnitEquipmentAmountChanged += new DoubleValChangedDelegate(unit_UnitEquipmentAmountChanged);
			unit.PointsValueChanged += new DoubleValChangedDelegate(unit_PointsValueChanged);

			unitSize.Value = unit.Size;
			unitSize.Maximum = (unit.UnitType.MaxSize == WarFoundryCore.INFINITY ? int.MaxValue : unit.UnitType.MaxSize);
			unitSize.Minimum = unit.UnitType.MinSize;
			unitSize.Enabled = (unitSize.Maximum != unitSize.Minimum);

			notes.Text = unit.UnitType.Notes;
			abilitiesList.DataSource = new List<Ability>(unit.UnitType.GetRequiredAbilities());
			abilitiesList.DisplayMember = "Name";
			SetPointsValueText();
			SetStats();
			SetWeapons();
		}

		void unit_PointsValueChanged(WarFoundryObject obj, double oldValue, double newValue)
		{
			SetPointsValueText();
		}

		private void SetPointsValueText()
		{
			lblPoints.Text = "(" + unit.Points + " pts)";
		}

		private void SetStats()
		{
			DataTable dt = new DataTable();
			Stat[] stats = unit.UnitStatsArrayWithName;
			int statsCount = stats.Length;
			DataColumn[] dc = new DataColumn[statsCount];

			DataGridTableStyle dgStyle = new DataGridTableStyle();
			dgStyle.RowHeadersVisible = false;

			Stat stat = stats[0];
			DataColumn tempCol = new DataColumn(stat.ParentSlotName);
			tempCol.DataType = stat.GetType();

			for (int i = 0; i < statsCount; i++)
			{
				stat = stats[i];
				tempCol = new DataColumn(stat.ParentSlotName);
				tempCol.DataType = stat.GetType();
				dc[i] = tempCol;
				DataGridColumnStyle colStyle = new StatColumnStyle();
				colStyle.Width = 40;
				colStyle.MappingName = stat.ParentSlotName;
				colStyle.HeaderText = stat.ParentSlotName;
				colStyle.Alignment = HorizontalAlignment.Center;
				colStyle.ReadOnly = true;
				dgStyle.GridColumnStyles.Add(colStyle);
			}

			DataGridColumnStyle nameColStyle = dgStyle.GridColumnStyles[0];
			nameColStyle.HeaderText = Translation.GetTranslation("UnitName", "Name");
			nameColStyle.Alignment = HorizontalAlignment.Left;
			nameColStyle.Width = statsGrid.ClientSize.Width - ((stats.Length - 1) * 40) - 4;

			dt.Columns.AddRange(dc);

			DataRow dr = dt.NewRow();
			dr.ItemArray = stats;
			dt.Rows.Add(dr);
			statsGrid.DataSource = dt;
			statsGrid.TableStyles.Add(dgStyle);
		}

		private void SetWeapons()
		{
			foreach (UnitEquipmentItem item in unit.GetEquipment())
			{
				equipmentList.Items.Add(GetEquipmentChoice(item));
			}
		}

		private UnitEquipmentChoice GetEquipmentChoice(UnitEquipmentItem item)
		{
			UnitEquipmentChoice choice = null;
			equipmentChoices.TryGetValue(item, out choice);

			if (choice == null)
			{
				choice = new UnitEquipmentChoice(Unit, item);
				equipmentChoices[item] = choice;
			}

			return choice;
		}

		/// <summary>
		/// Clean up any resources being used.
		/// </summary>
		protected override void Dispose(bool disposing)
		{
			//remove our leave events so that disposing doesn't trigger them
			tbUnitName.Leave -= new System.EventHandler(this.tbUnitName_Leave);
			unitSize.Leave -= new System.EventHandler(this.unitSize_Leave);

			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.statsGrid = new System.Windows.Forms.DataGrid();
			this.tbUnitName = new System.Windows.Forms.TextBox();
			this.unitSize = new System.Windows.Forms.NumericUpDown();
			this.lblUnitSize = new IBBoard.Windows.Forms.IBBLabel();
			this.lblEquip = new IBBoard.Windows.Forms.IBBLabel();
			this.bttnAddWeapon = new IBBoard.Windows.Forms.IBBButton();
			this.bttnRemoveWeapon = new IBBoard.Windows.Forms.IBBButton();
			this.equipmentList = new System.Windows.Forms.ListBox();
			this.bttnReplaceWeapon = new IBBoard.Windows.Forms.IBBButton();
			this.bttnEditWeapon = new IBBoard.Windows.Forms.IBBButton();
			this.lblPoints = new System.Windows.Forms.Label();
			this.lblNotes = new IBBoard.Windows.Forms.IBBLabel();
			this.notes = new System.Windows.Forms.TextBox();
			this.abilitiesList = new System.Windows.Forms.ListBox();
			this.lblAbilities = new IBBoard.Windows.Forms.IBBLabel();
			((System.ComponentModel.ISupportInitialize) (this.statsGrid)).BeginInit();
			((System.ComponentModel.ISupportInitialize) (this.unitSize)).BeginInit();
			this.SuspendLayout();
			// 
			// statsGrid
			// 
			this.statsGrid.AllowNavigation = false;
			this.statsGrid.AllowSorting = false;
			this.statsGrid.AlternatingBackColor = System.Drawing.SystemColors.Control;
			this.statsGrid.Anchor = ((System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
						| System.Windows.Forms.AnchorStyles.Right)));
			this.statsGrid.BackgroundColor = System.Drawing.SystemColors.Control;
			this.statsGrid.CaptionVisible = false;
			this.statsGrid.CausesValidation = false;
			this.statsGrid.DataMember = "";
			this.statsGrid.GridLineColor = System.Drawing.SystemColors.ControlDarkDark;
			this.statsGrid.HeaderForeColor = System.Drawing.SystemColors.ControlText;
			this.statsGrid.Location = new System.Drawing.Point(8, 32);
			this.statsGrid.Name = "statsGrid";
			this.statsGrid.PreferredColumnWidth = 40;
			this.statsGrid.ReadOnly = true;
			this.statsGrid.RowHeadersVisible = false;
			this.statsGrid.SelectionBackColor = System.Drawing.SystemColors.Control;
			this.statsGrid.SelectionForeColor = System.Drawing.SystemColors.WindowText;
			this.statsGrid.Size = new System.Drawing.Size(600, 88);
			this.statsGrid.TabIndex = 0;
			this.statsGrid.TabStop = false;
			// 
			// tbUnitName
			// 
			this.tbUnitName.Location = new System.Drawing.Point(8, 8);
			this.tbUnitName.Name = "tbUnitName";
			this.tbUnitName.Size = new System.Drawing.Size(344, 20);
			this.tbUnitName.TabIndex = 1;
			this.tbUnitName.Leave += new System.EventHandler(this.tbUnitName_Leave);
			this.tbUnitName.KeyDown += new System.Windows.Forms.KeyEventHandler(this.tbUnitName_KeyDown);
			// 
			// unitSize
			// 
			this.unitSize.Anchor = ((System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
			this.unitSize.Location = new System.Drawing.Point(528, 8);
			this.unitSize.Name = "unitSize";
			this.unitSize.Size = new System.Drawing.Size(80, 20);
			this.unitSize.TabIndex = 1;
			this.unitSize.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
			this.unitSize.Value = new decimal(new int[] {
            1,
            0,
            0,
            0});
			this.unitSize.Leave += new System.EventHandler(this.unitSize_Leave);
			this.unitSize.KeyDown += new System.Windows.Forms.KeyEventHandler(this.unitSize_KeyDown);
			// 
			// lblUnitSize
			// 
			this.lblUnitSize.Anchor = ((System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
			this.lblUnitSize.Location = new System.Drawing.Point(452, 8);
			this.lblUnitSize.Name = "lblUnitSize";
			this.lblUnitSize.Size = new System.Drawing.Size(72, 23);
			this.lblUnitSize.TabIndex = 0;
			this.lblUnitSize.Text = "unit size";
			this.lblUnitSize.TextAlign = System.Drawing.ContentAlignment.TopRight;
			// 
			// lblEquip
			// 
			this.lblEquip.Location = new System.Drawing.Point(15, 126);
			this.lblEquip.Name = "lblEquip";
			this.lblEquip.Size = new System.Drawing.Size(81, 108);
			this.lblEquip.TabIndex = 3;
			this.lblEquip.Text = "equipment";
			this.lblEquip.TextAlign = System.Drawing.ContentAlignment.TopRight;
			// 
			// bttnAddWeapon
			// 
			this.bttnAddWeapon.Anchor = ((System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
			this.bttnAddWeapon.FlatStyle = System.Windows.Forms.FlatStyle.System;
			this.bttnAddWeapon.Location = new System.Drawing.Point(516, 126);
			this.bttnAddWeapon.Name = "bttnAddWeapon";
			this.bttnAddWeapon.Size = new System.Drawing.Size(88, 22);
			this.bttnAddWeapon.TabIndex = 4;
			this.bttnAddWeapon.Text = "add";
			this.bttnAddWeapon.Click += new System.EventHandler(this.bttnAddWeapon_Click);
			// 
			// bttnRemoveWeapon
			// 
			this.bttnRemoveWeapon.Anchor = ((System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
			this.bttnRemoveWeapon.Enabled = false;
			this.bttnRemoveWeapon.FlatStyle = System.Windows.Forms.FlatStyle.System;
			this.bttnRemoveWeapon.Location = new System.Drawing.Point(516, 210);
			this.bttnRemoveWeapon.Name = "bttnRemoveWeapon";
			this.bttnRemoveWeapon.Size = new System.Drawing.Size(88, 22);
			this.bttnRemoveWeapon.TabIndex = 5;
			this.bttnRemoveWeapon.Text = "remove";
			this.bttnRemoveWeapon.Click += new System.EventHandler(this.bttnRemoveWeapon_Click);
			// 
			// equipmentList
			// 
			this.equipmentList.Anchor = ((System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
						| System.Windows.Forms.AnchorStyles.Right)));
			this.equipmentList.Location = new System.Drawing.Point(102, 126);
			this.equipmentList.Name = "equipmentList";
			this.equipmentList.Size = new System.Drawing.Size(408, 108);
			this.equipmentList.TabIndex = 6;
			this.equipmentList.DoubleClick += new System.EventHandler(this.equipmentList_DoubleClick);
			this.equipmentList.SelectedIndexChanged += new System.EventHandler(this.equipmentList_SelectedIndexChanged);
			// 
			// bttnReplaceWeapon
			// 
			this.bttnReplaceWeapon.Anchor = ((System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
			this.bttnReplaceWeapon.Enabled = false;
			this.bttnReplaceWeapon.FlatStyle = System.Windows.Forms.FlatStyle.System;
			this.bttnReplaceWeapon.Location = new System.Drawing.Point(516, 182);
			this.bttnReplaceWeapon.Name = "bttnReplaceWeapon";
			this.bttnReplaceWeapon.Size = new System.Drawing.Size(88, 22);
			this.bttnReplaceWeapon.TabIndex = 10;
			this.bttnReplaceWeapon.Text = "replace";
			this.bttnReplaceWeapon.Click += new System.EventHandler(this.bttnReplaceWeapon_Click);
			// 
			// bttnEditWeapon
			// 
			this.bttnEditWeapon.Anchor = ((System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
			this.bttnEditWeapon.Enabled = false;
			this.bttnEditWeapon.FlatStyle = System.Windows.Forms.FlatStyle.System;
			this.bttnEditWeapon.Location = new System.Drawing.Point(516, 154);
			this.bttnEditWeapon.Name = "bttnEditWeapon";
			this.bttnEditWeapon.Size = new System.Drawing.Size(88, 22);
			this.bttnEditWeapon.TabIndex = 11;
			this.bttnEditWeapon.Text = "edit";
			this.bttnEditWeapon.Click += new System.EventHandler(this.bttnEditWeapon_Click);
			// 
			// lblPoints
			// 
			this.lblPoints.Location = new System.Drawing.Point(358, 8);
			this.lblPoints.Name = "lblPoints";
			this.lblPoints.Size = new System.Drawing.Size(88, 21);
			this.lblPoints.TabIndex = 12;
			this.lblPoints.Text = "(points)";
			// 
			// lblNotes
			// 
			this.lblNotes.Location = new System.Drawing.Point(13, 317);
			this.lblNotes.Name = "lblNotes";
			this.lblNotes.Size = new System.Drawing.Size(84, 62);
			this.lblNotes.TabIndex = 13;
			this.lblNotes.Text = "notes";
			this.lblNotes.TextAlign = System.Drawing.ContentAlignment.TopRight;
			// 
			// notes
			// 
			this.notes.Location = new System.Drawing.Point(102, 317);
			this.notes.Multiline = true;
			this.notes.Name = "notes";
			this.notes.ReadOnly = true;
			this.notes.Size = new System.Drawing.Size(408, 62);
			this.notes.TabIndex = 14;
			// 
			// abilitiesList
			// 
			this.abilitiesList.FormattingEnabled = true;
			this.abilitiesList.Location = new System.Drawing.Point(102, 240);
			this.abilitiesList.Name = "abilitiesList";
			this.abilitiesList.Size = new System.Drawing.Size(408, 69);
			this.abilitiesList.TabIndex = 15;
			// 
			// lblAbilities
			// 
			this.lblAbilities.Location = new System.Drawing.Point(13, 240);
			this.lblAbilities.Name = "lblAbilities";
			this.lblAbilities.Size = new System.Drawing.Size(84, 62);
			this.lblAbilities.TabIndex = 16;
			this.lblAbilities.Text = "abilities";
			this.lblAbilities.TextAlign = System.Drawing.ContentAlignment.TopRight;
			// 
			// FrmUnit
			// 
			this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
			this.ClientSize = new System.Drawing.Size(616, 391);
			this.Controls.Add(this.lblAbilities);
			this.Controls.Add(this.abilitiesList);
			this.Controls.Add(this.notes);
			this.Controls.Add(this.lblNotes);
			this.Controls.Add(this.lblPoints);
			this.Controls.Add(this.bttnEditWeapon);
			this.Controls.Add(this.bttnReplaceWeapon);
			this.Controls.Add(this.equipmentList);
			this.Controls.Add(this.bttnRemoveWeapon);
			this.Controls.Add(this.bttnAddWeapon);
			this.Controls.Add(this.lblEquip);
			this.Controls.Add(this.lblUnitSize);
			this.Controls.Add(this.unitSize);
			this.Controls.Add(this.tbUnitName);
			this.Controls.Add(this.statsGrid);
			this.Name = "FrmUnit";
			this.ShowIcon = false;
			this.ShowInTaskbar = false;
			this.Text = "FrmUnit";
			this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmUnit_FormClosing);
			((System.ComponentModel.ISupportInitialize) (this.statsGrid)).EndInit();
			((System.ComponentModel.ISupportInitialize) (this.unitSize)).EndInit();
			this.ResumeLayout(false);
			this.PerformLayout();

		}
		#endregion

		public Unit Unit
		{
			get { return unit; }
		}

		private void tbUnitName_Leave(object sender, System.EventArgs e)
		{
			UpdateUnitName();
		}

		private void tbUnitName_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
		{
			if (e.KeyCode == Keys.Enter)
			{
				UpdateUnitName();
			}
		}

		private void UpdateUnitName()
		{
			if (unit.Name != tbUnitName.Text)
			{
				commandStack.Execute(new SetNameCommand(unit, tbUnitName.Text));
			}
		}

		private void unitSize_Leave(object sender, System.EventArgs e)
		{
			UpdateUnitSize();
		}

		private void unitSize_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
		{
			if (e.KeyCode == Keys.Enter)
			{
				UpdateUnitSize();
			}
		}

		private void UpdateUnitSize()
		{
			if (unit.Size != unitSize.Value)
			{
				commandStack.Execute(new SetUnitSizeCommand(unit, (int) unitSize.Value));
			}
		}

		private void unit_NameChanged(WarFoundryObject obj, string oldValue, string newValue)
		{
			if (obj is Unit && obj.Equals(unit))
			{
				Unit u = (Unit) obj;
				tbUnitName.Text = obj.Name;
				Text = obj.Name;
			}
		}

		private void unit_UnitSizeChanged(WarFoundryObject obj, int oldValue, int newValue)
		{
			if (obj is Unit && obj.Equals(unit))
			{
				unitSize.Value = newValue;

				foreach (UnitEquipmentChoice choice in equipmentChoices.Values)
				{
					SetEquipmentListValue(choice);
				}
			}
		}

		private void equipmentList_SelectedIndexChanged(object sender, System.EventArgs e)
		{
			SetButtonsEnabledState();
		}

		private void SetButtonsEnabledState()
		{

			UnitEquipmentItem equipItem = GetSelectedUnitEquipmentItem();
			bttnReplaceWeapon.Enabled = (equipItem != null && equipItem.HasAlternatives());
			bttnEditWeapon.Enabled = (equipItem != null);
			bttnRemoveWeapon.Enabled = (equipItem != null && !equipItem.IsRequired);
		}

		private void unit_UnitEquipmentAmountChanged(WarFoundryObject obj, double oldValue, double newValue)
		{
			if (obj is UnitEquipmentItem)
			{
				UnitEquipmentItem equip = (UnitEquipmentItem) obj;
				UnitEquipmentChoice equipChoice = GetEquipmentChoice(equip);

				if (newValue == 0)
				{
					equipmentList.Items.Remove(equipChoice);
				}
				else
				{
					SetEquipmentListValue(equipChoice);
				}
			}
		}

		private void SetEquipmentListValue(UnitEquipmentChoice equipChoice)
		{
			int idx = equipmentList.Items.IndexOf(equipChoice);

			if (idx > -1)
			{
				equipmentList.Items[idx] = equipChoice;
			}
			else
			{
				equipmentList.Items.Add(equipChoice);
			}
		}

		private void EditWeapon()
		{
			UnitEquipmentItem item = GetSelectedUnitEquipmentItem();

			if (item != null)
			{
				FrmEditUnitEquipment editEquip = new FrmEditUnitEquipment(Unit, item, commandStack);
				editEquip.ShowDialog(this);
			}
		}

		private UnitEquipmentItem GetSelectedUnitEquipmentItem()
		{
			UnitEquipmentChoice selectedItem = GetSelectedUnitEquipmentChoice();
			UnitEquipmentItem equipItem = null;

			if (selectedItem!=null)
			{
				equipItem = selectedItem.Item;
			}

			return equipItem;
		}

		private UnitEquipmentChoice GetSelectedUnitEquipmentChoice()
		{
			return (UnitEquipmentChoice) equipmentList.SelectedItem;
		}

		private void bttnEditWeapon_Click(object sender, System.EventArgs e)
		{
			EditWeapon();
		}

		private void equipmentList_DoubleClick(object sender, System.EventArgs e)
		{
			EditWeapon();
		}

		private void AddWeapon()
		{
			FrmNewUnitEquipment newEquip = new FrmNewUnitEquipment(Unit, commandStack);
			newEquip.ShowDialog(this);
		}

		private void bttnAddWeapon_Click(object sender, System.EventArgs e)
		{
			AddWeapon();
		}

		private void RemoveWeapon()
		{
			commandStack.Execute(new SetUnitEquipmentNumericAmountCommand(unit, GetSelectedUnitEquipmentItem(), 0));
		}

		private void bttnRemoveWeapon_Click(object sender, System.EventArgs e)
		{
			RemoveWeapon();
		}

		private void bttnReplaceWeapon_Click(object sender, System.EventArgs e)
		{
			FrmReplaceUnitEquipment replace = new FrmReplaceUnitEquipment(unit, GetSelectedUnitEquipmentItem(), commandStack);
			replace.ShowDialog(this);
		}

		private void FrmUnit_FormClosing(object sender, FormClosingEventArgs e)
		{
			UpdateUnitName();
			UpdateUnitSize();
		}
	}
}