view FrmUnit.cs @ 66:68d4f7499212

Re #176: Bug when saving recently edited army * Make save button available whether army has previously been saved or not (partly for usability and partly to try to trigger bug) Bug seems to occur when opening an army as the first action, adding a unit and saving it, but not when creating a new army as the first action, then loading an old army as the second action, then adding a unit and saving it
author IBBoard <dev@ibboard.co.uk>
date Sat, 26 Sep 2009 09:51:53 +0000
parents 0e7c257ca8d6
children 9a215113c84c
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.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 System.Windows.Forms.Label lblUnitSize;
		private System.Windows.Forms.Button bttnAddWeapon;
		private System.Windows.Forms.Button bttnRemoveWeapon;
		private System.Windows.Forms.Label lblEquip;
		private System.Windows.Forms.ListBox equipmentList;
		private System.Windows.Forms.Button bttnReplaceWeapon;
		private System.Windows.Forms.Button bttnEditWeapon;
		private Label lblPoints;
		/// <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();

			tbUnitName.Text = unit.Name;
			Text = 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);

			if (unit.UnitType.MaxSize == unit.UnitType.MinSize)
			{
				unitSize.Value = unit.UnitType.MaxSize;
				unitSize.Visible = false;
				lblUnitSize.Visible = false;
			}
			else
			{
				unitSize.Value = unit.Size;
				unitSize.Maximum = (unit.UnitType.MaxSize == WarFoundryCore.INFINITY ? int.MaxValue : unit.UnitType.MaxSize);
				unitSize.Minimum = unit.UnitType.MinSize;
			}

			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 System.Windows.Forms.Label();
			this.lblEquip = new System.Windows.Forms.Label();
			this.bttnAddWeapon = new System.Windows.Forms.Button();
			this.bttnRemoveWeapon = new System.Windows.Forms.Button();
			this.equipmentList = new System.Windows.Forms.ListBox();
			this.bttnReplaceWeapon = new System.Windows.Forms.Button();
			this.bttnEditWeapon = new System.Windows.Forms.Button();
			this.lblPoints = new System.Windows.Forms.Label();
			((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(8, 123);
			this.lblEquip.Name = "lblEquip";
			this.lblEquip.Size = new System.Drawing.Size(88, 32);
			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)";
			// 
			// FrmUnit
			// 
			this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
			this.ClientSize = new System.Drawing.Size(616, 314);
			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.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;
			}
		}

		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
				{
					int idx = equipmentList.Items.IndexOf(equipChoice);

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

		private void EditWeapon()
		{
			FrmEditUnitEquipment editEquip = new FrmEditUnitEquipment(Unit, GetSelectedUnitEquipmentItem(), 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();
		}
	}
}