view FrmNewUnit.cs @ 110:76b73f15d07e

Re #344: Show unit requirement failures * First pass using new Requirement objects on FrmNewUnit - needs more testing and styling * Remove old references from main window until we get a replacement
author IBBoard <dev@ibboard.co.uk>
date Mon, 01 Aug 2011 20:22:48 +0000
parents b4416ca69153
children f23e5b40ca9d
line wrap: on
line source

// This file (FrmNewUnit.cs) is a part of the IBBoard.WarFoundry.GTK 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.Collections.Generic;
using Gtk;
using IBBoard.GtkSharp.Translatable;
using IBBoard.WarFoundry.API.Objects;
using log4net;
using IBBoard.Lang;
using IBBoard.WarFoundry.API.Objects.Requirement;
using System.Text;

namespace IBBoard.WarFoundry.GUI.GTK
{
	public partial class FrmNewUnit : TranslatableDialog
	{
		private ILog logger = LogManager.GetLogger(typeof(FrmNewUnit));
		private UnitType unitType;
		private Army unitArmy;
		private Category cat;

		public FrmNewUnit(Race race, Category category, Army army)
		{
			this.Build();
			unitArmy = army;
			cat = category;
			
			TreeViewColumn unitTypeColumn = new TreeViewColumn();
			CellRendererText unitTypeCell = new CellRendererText();
			unitTypeColumn.PackStart(unitTypeCell, true);
			lstUnitTypes.AppendColumn(unitTypeColumn);
			unitTypeColumn.SetCellDataFunc(unitTypeCell, new TreeCellDataFunc(RenderUnitTypeName));
			ListStore store = new ListStore(typeof(UnitType));
			UnitType[] types = race.GetUnitTypes(cat);
			logger.DebugFormat("Listing {0} unit types in {1}", types.Length, cat.Name);
			
			foreach (UnitType type in types)
			{
				logger.DebugFormat("Adding unit type {0}", type.Name);
				store.AppendValues(type);
			}
			
			lstUnitTypes.Model = store;
			lstUnitTypes.Selection.Changed += new EventHandler(OnSelectionChanged);

			Translation.TranslationChanged += Retranslate;
			Translate();
		}

		private void Retranslate()
		{
			Translate();
		}

		public override void Dispose()
		{
			Translation.TranslationChanged -= Retranslate;
			base.Dispose();
		}

		protected override void Translate()
		{
			base.Translate();
			lstUnitTypes.Columns[0].Title = Translation.GetTranslation("frmNewUnitNewUnitColumn", "unit type");
			Title = Translation.GetTranslation(Name, "Create new unit", cat.Name);
		}

		private void RenderUnitTypeName(TreeViewColumn column, CellRenderer cell, TreeModel model, TreeIter iter)
		{
			UnitType type = (UnitType)model.GetValue(iter, 0);
			(cell as CellRendererText).Text = type.Name;
		}

		protected virtual void OnSelectionChanged(object o, EventArgs e)
		{
			SetSelectUnitEnabledVal();
		}

		public UnitType SelectedUnit
		{
			get { return unitType; }
		}

		private UnitType GetSelectedUnitType()
		{		
			TreeModel model;
			TreeIter iter;
			lstUnitTypes.Selection.GetSelected(out model, out iter);
			UnitType toReturn = null;
			
			if (model != null)
			{
				toReturn = (UnitType)model.GetValue(iter, 0);
			}
			
			return toReturn;
		}

		private void SetSelectUnitEnabledVal()
		{
			UnitType type = GetSelectedUnitType();
			
			if (type != null)
			{
				bttnCreate.Sensitive = true;
				ICollection<string> failureMessages;
				Validation result = RequirementHandler.AllowsAdding(type, unitArmy, out failureMessages);
				bool validationFailed = !Validates.AsOkay(result);
				lblNewUnitWarning.Visible = validationFailed;

				if (validationFailed)
				{
					StringBuilder sb = new StringBuilder();

					foreach (string msg in failureMessages)
					{
						sb.AppendLine(msg);
					}

					lblNewUnitWarning.Text = sb.ToString();
				}
			}
			else
			{
				bttnCreate.Sensitive = false;
				lblNewUnitWarning.Visible = false;
			}
		}

		protected virtual void OnButtonCancelActivated(object sender, System.EventArgs e)
		{
			Respond(ResponseType.Cancel);
		}

		protected virtual void OnRowActivated(object o, Gtk.RowActivatedArgs args)
		{
			unitType = GetSelectedUnitType();
			Respond(ResponseType.Ok);
		}

		protected virtual void OnButtonOkClicked(object sender, System.EventArgs e)
		{
			unitType = GetSelectedUnitType();
			Respond(ResponseType.Ok);
		}
	}
}