view FrmNewUnitFromTree.cs @ 210:694f23814ec2

Re #354: Single-button Add Unit * Make the form translatable * Update FrmArmyTree so it doesn't look out of place (ContextMenuStrip and update the icons) * Add "change selection on right-click" code to solve calculation issues * Hide categories that don't have entries (assume they're not relevant to that race) Also: * Clean up code and replace space indents with tabs
author IBBoard <dev@ibboard.co.uk>
date Sat, 20 Aug 2011 20:58:16 +0100
parents a11faa64c333
children
line wrap: on
line source

using System;
using System.ComponentModel;
using System.Windows.Forms;
using IBBoard.Lang;
using IBBoard.WarFoundry.API;
using IBBoard.WarFoundry.API.Objects;
using IBBoard.Windows.Forms;
using IBBoard.Windows.Forms.I18N;

namespace IBBoard.WarFoundry.GUI.WinForms
{
	public partial class FrmNewUnitFromTree : IBBForm
	{
		public FrmNewUnitFromTree()
		{
			InitializeComponent();
			WarFoundryCore.ArmyChanged += new ArmyChangedDelegate(ArmyChanged);
			TranslateForm();
			Translation.TranslationChanged += new MethodInvoker(TranslateForm);
		}

		private void TranslateForm()
		{
			ControlTranslator.TranslateControl(this);
			ControlTranslator.TranslateComponent(addUnitMenuItem);
		}

		private void ArmyChanged(Army oldArmy, Army newArmy)
		{
			unitTypeTree.Nodes.Clear();

			if (newArmy != null)
			{
				BuildTree(newArmy.Race);
			}
		}

		private void BuildTree(Race race)
		{
			foreach (Category cat in race.Categories)
			{
				UnitType[] unitTypes = race.GetUnitTypes(cat);

				if (unitTypes.Length > 0)
				{
					AddCategoryUnitTypesToTree(cat, unitTypes);
				}
			}

			unitTypeTree.Show();
		}

		private void AddCategoryUnitTypesToTree(Category cat, UnitType[] unitTypes)
		{
			TreeNode[] unitNodes = new TreeNode[unitTypes.Length];

			for (int i = 0; i < unitTypes.Length; i++)
			{
				UnitType unitType = unitTypes[i];
				TreeNode temp = new TreeNode(unitType.Name);
				temp.Tag = unitType;
				unitNodes[i] = temp;
			}

			TreeNode catTemp = new TreeNode(cat.Name, unitNodes);
			catTemp.Tag = cat;
			unitTypeTree.Nodes.Add(catTemp);
			catTemp.ExpandAll();
		}

		private void unitTypeTree_DoubleClick(object sender, EventArgs e)
		{
			AddUnitType();
		}

		private void AddUnitType()
		{
			TreeNode selected = unitTypeTree.SelectedNode;
			AddUnitType(selected);
		}

		private void AddUnitType(TreeNode selected)
		{
			object tagData = selected.Tag;

			if (tagData is UnitType)
			{
				UnitType unit = (UnitType)tagData;
				Category cat = (Category)selected.Parent.Tag;
				MdiParent.CreateUnitInCategory(unit, cat);
			}
		}

		public new FrmMain MdiParent
		{
			get { return (FrmMain)base.MdiParent; }
			set { base.MdiParent = value; }
		}

		private void AddUnitClicked(object sender, EventArgs e)
		{
			TreeNode node = unitTypeTree.SelectedNode;

			if (node != null)
			{
				AddUnitType(node);
			}
		}

		private void contextMenu_Opening(object sender, CancelEventArgs e)
		{
			TreeNode node = unitTypeTree.SelectedNode;
			e.Cancel = (node == null || !(node.Tag is UnitType));
		}

		private void unitTypeTree_MouseDown(object sender, MouseEventArgs e)
		{
			if (e.Button == MouseButtons.Right)
			{
				TreeNode tn = unitTypeTree.GetNodeAt(e.X, e.Y);
				unitTypeTree.SelectedNode = tn;
			}
		}
	}
}