changeset 113:4a33b3012100 WarFoundry_v0.1RC1

* Tag v0.1RC1 release no-open-ticket
author IBBoard <dev@ibboard.co.uk>
date Mon, 17 Jan 2011 19:43:47 +0000
parents 146b7a893a01
children 8b99d6aa623f
files App-lrg.png AssemblyInfo.cs FrmAbout.cs FrmAboutCredits.cs FrmAddEquipment.cs FrmEditEquipment.cs FrmMainWindow.cs FrmNewArmy.cs FrmNewUnit.cs FrmPreferences.cs FrmReplaceEquipment.cs IBBoard.WarFoundry.GUI.GTK.csproj IBBoard.WarFoundry.GUI.GTK.sln UIControl/AbstractBaseEquipmentUIControl.cs UIControl/AddEquipmentUIControl.cs UIControl/EditEquipmentUIControl.cs UIControl/Interfaces/IAddEquipmentUI.cs UIControl/Interfaces/IBaseEquipmentUI.cs UIControl/Interfaces/IEditEquipmentUI.cs UIControl/Interfaces/IReplaceEquipmentUI.cs UIControl/Interfaces/ISelectableItemEquipmentUI.cs UIControl/ReplaceEquipmentUIControl.cs Util/GtkWarFoundryUtil.cs WarFoundry-GTK.exe.log4net WarFoundry-GTKPref.xml WarFoundryGTK.exe.log4net WarFoundryGTKPref.xml Widgets/UnitDisplayWidget.cs gtk-gui/IBBoard.WarFoundry.GTK.FrmMainWindow.cs gtk-gui/IBBoard.WarFoundry.GTK.FrmNewArmy.cs gtk-gui/IBBoard.WarFoundry.GTK.FrmNewUnit.cs gtk-gui/IBBoard.WarFoundry.GTK.Widgets.UnitDisplayWidget.cs gtk-gui/IBBoard.WarFoundry.GUI.GTK.FrmAbout.cs gtk-gui/IBBoard.WarFoundry.GUI.GTK.FrmAboutCredits.cs gtk-gui/IBBoard.WarFoundry.GUI.GTK.FrmAddEquipment.cs gtk-gui/IBBoard.WarFoundry.GUI.GTK.FrmEditEquipment.cs gtk-gui/IBBoard.WarFoundry.GUI.GTK.FrmMainWindow.cs gtk-gui/IBBoard.WarFoundry.GUI.GTK.FrmNewArmy.cs gtk-gui/IBBoard.WarFoundry.GUI.GTK.FrmNewUnit.cs gtk-gui/IBBoard.WarFoundry.GUI.GTK.FrmPreferences.cs gtk-gui/IBBoard.WarFoundry.GUI.GTK.FrmReplaceEquipment.cs gtk-gui/IBBoard.WarFoundry.GUI.GTK.Widgets.UnitDisplayWidget.cs gtk-gui/generated.cs gtk-gui/gui.stetic gtk-gui/objects.xml translations/en.translation translations/fr.translation
diffstat 47 files changed, 6674 insertions(+), 1604 deletions(-) [+]
line wrap: on
line diff
Binary file App-lrg.png has changed
--- a/AssemblyInfo.cs	Sun Jan 31 20:46:06 2010 +0000
+++ b/AssemblyInfo.cs	Mon Jan 17 19:43:47 2011 +0000
@@ -16,7 +16,7 @@
 [assembly: AssemblyConfiguration("")]
 [assembly: AssemblyCompany("")]
 [assembly: AssemblyProduct("IBBoard.WarFoundry.GTK")]
-[assembly: AssemblyCopyright("IBBoard 2009")]
+[assembly: AssemblyCopyright("IBBoard 2009-2011")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
 
@@ -27,7 +27,7 @@
 // You can specify all values by your own or you can build default build and revision
 // numbers with the '*' character (the default):
 
-[assembly: AssemblyVersion("1.0.0.*")]
+[assembly: AssemblyVersion("0.0.*")]
 
 // The following attributes specify the key for the sign of your assembly. See the
 // .NET Framework documentation for more information about signing.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/FrmAbout.cs	Mon Jan 17 19:43:47 2011 +0000
@@ -0,0 +1,57 @@
+//  This file (FrmAbout.cs) is a part of the IBBoard.WarFoundry.GUI.GTK project and is copyright 2010 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 Gtk;
+using IBBoard.GtkSharp.Translatable;
+using IBBoard.Lang;
+
+namespace IBBoard.WarFoundry.GUI.GTK
+{
+	public partial class FrmAbout : TranslatableDialog
+	{
+		private static FrmAbout frm;
+
+		public static FrmAbout GetForm()
+		{
+			if (frm == null)
+			{
+				frm = new FrmAbout();
+			}
+			
+			return frm;
+		}
+
+		private FrmAbout()
+		{
+			this.Build();
+			Translation.TranslationChanged += Retranslate;
+			Translate();
+		}
+
+		private void Retranslate()
+		{
+			Translate();
+		}
+
+		public override void Dispose()
+		{
+			Translation.TranslationChanged -= Retranslate;
+			base.Dispose();
+		}
+
+		protected virtual void CloseClicked(object sender, System.EventArgs e)
+		{
+			Respond(ResponseType.Close);
+		}
+
+		protected virtual void BttnCreditsClicked(object sender, System.EventArgs e)
+		{
+			FrmAboutCredits credits = new FrmAboutCredits();
+			credits.Run();
+			credits.Hide();
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/FrmAboutCredits.cs	Mon Jan 17 19:43:47 2011 +0000
@@ -0,0 +1,31 @@
+//  This file (FrmAboutCredits.cs) is a part of the IBBoard.WarFoundry.GUI.GTK project and is copyright 2010 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 IBBoard.GtkSharp.Translatable;
+using IBBoard.Lang;
+
+namespace IBBoard.WarFoundry.GUI.GTK
+{
+	public partial class FrmAboutCredits : TranslatableDialog
+	{
+		public FrmAboutCredits()
+		{
+			this.Build();
+			Translation.TranslationChanged += Retranslate;
+			Translate();
+		}
+
+		private void Retranslate()
+		{
+			Translate();
+		}
+
+		public override void Dispose()
+		{
+			Translation.TranslationChanged -= Retranslate;
+			base.Dispose();
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/FrmAddEquipment.cs	Mon Jan 17 19:43:47 2011 +0000
@@ -0,0 +1,274 @@
+//  This file (FrmAddEquipment.cs) is a part of the IBBoard.WarFoundry.GUI.GTK project and is copyright 2010 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 Gtk;
+using IBBoard.GtkSharp;
+using IBBoard.GtkSharp.Translatable;
+using IBBoard.WarFoundry.API.Objects;
+using IBBoard.WarFoundry.GUI.GTK.UIControl.Interfaces;
+using IBBoard.WarFoundry.GUI.GTK.Util;
+using log4net;
+using IBBoard.Lang;
+
+namespace IBBoard.WarFoundry.GUI.GTK
+{
+	public partial class FrmAddEquipment : TranslatableDialog, IAddEquipmentUI
+	{
+		private static ILog log = LogManager.GetLogger(typeof(FrmAddEquipment));
+
+		public event SingleArgMethodInvoker<UnitEquipmentItem> UnitEquipmentItemChoiceChanged;
+		public event MethodInvoker UnitEquipmentAmountTypeChanged;
+		public event MethodInvoker UnitEquipmentAmountChanged;
+
+		private bool isRatioLimited;
+
+		public FrmAddEquipment()
+		{
+			this.Build();
+			lstEquipment.Selection.Changed += OnSelectionChanged;
+			TreeViewColumn equipColumn = new TreeViewColumn();
+			CellRendererText equipCell = new CellRendererText();
+			equipColumn.PackStart(equipCell, true);
+			equipColumn.SetCellDataFunc(equipCell, GtkWarFoundryUtil.RenderWarFoundryObjectName);
+			lstEquipment.AppendColumn(equipColumn);
+			Translation.TranslationChanged += Retranslate;
+			Translate();
+		}
+
+		private void Retranslate()
+		{
+			Translate();
+		}
+
+		public override void Dispose()
+		{
+			Translation.TranslationChanged -= Retranslate;
+			base.Dispose();
+		}
+
+		protected override void Translate()
+		{
+			base.Translate();
+			lstEquipment.Columns[0].Title = Translation.GetTranslation("frmAddEquipmentColumnTitle", "equipment");
+		}
+
+		private void OnUnitEquipmentAmountChanged()
+		{
+			if (UnitEquipmentAmountChanged != null)
+			{
+				UnitEquipmentAmountChanged();
+			}
+		}
+
+		private void OnUnitEquipmentAmountTypeChanged()
+		{
+			if (UnitEquipmentAmountChanged != null)
+			{
+				UnitEquipmentAmountTypeChanged();
+			}
+		}
+
+		protected void OnSelectionChanged(object o, EventArgs e)
+		{
+			if (UnitEquipmentItemChoiceChanged != null)
+			{
+				UnitEquipmentItemChoiceChanged(SelectedUnitEquipmentItem);
+			}
+		}
+
+		public void SetUnitEquipmentItems(UnitEquipmentItem[] items)
+		{
+			ListStore store = new ListStore(typeof(UnitEquipmentItem));
+			
+			foreach (UnitEquipmentItem equipItem in items)
+			{
+				store.AppendValues(equipItem);
+			}
+			
+			lstEquipment.Model = store;
+		}
+
+		public void SetUnitEquipmentLimits(bool isRatioLimit, double minPercent, double maxPercent, int minNumber, int maxNumber)
+		{
+			log.DebugFormat("IsRatio? {0}. Limits: {1}->{2}, {3}%->{4}%", isRatioLimit, minNumber, maxNumber, minPercent, maxPercent);
+			numericAmount.SetRange(minNumber, maxNumber);
+			percentageAmount.SetRange(minPercent, maxPercent);
+			
+			if (isRatioLimit)
+			{
+				if (minPercent == 100)
+				{
+					rbEquipAll.Active = true;
+				}
+				else
+				{
+					rbEquipPercent.Active = true;
+				}
+			}
+			else
+			{
+				rbEquipNumeric.Active = true;
+			}
+			
+			isRatioLimited = isRatioLimit;
+		}
+
+		public void SetUnitEquipmentLimitsEnabled(bool isEnabled)
+		{
+			SetNumericAmountEnabledState(isEnabled);
+			SetPercentageAmountEnabledState(isEnabled);
+		}
+
+		public bool ShowControl()
+		{
+			int result = Run();
+			bool okayClicked = (result == (int)ResponseType.Ok);
+			this.Hide();
+			return okayClicked;
+		}
+
+		protected virtual void CancelButtonClicked(object sender, System.EventArgs e)
+		{
+			log.Debug("Cancel clicked");
+			Respond(ResponseType.Cancel);
+		}	
+
+		protected virtual void OkayButtonClicked(object sender, System.EventArgs e)
+		{
+			log.Debug("Okay clicked");
+			Respond(ResponseType.Ok);
+		}		
+
+		public void SetOkayEnabledState(bool enabled)
+		{
+			bttnOkay.Sensitive = enabled;
+		}
+
+		protected virtual void SpinButtonValueChanged(object sender, System.EventArgs e)
+		{
+			OnUnitEquipmentAmountChanged();
+		}		
+
+		protected virtual void RadioButtonClicked(object sender, System.EventArgs e)
+		{
+			OnUnitEquipmentAmountTypeChanged();
+		}
+
+		public void SetNumericAmountEnabledState(bool enabled)
+		{
+			double minPercent = GetMinPercentage();
+			rbEquipNumeric.Sensitive = enabled && !(isRatioLimited && minPercent == 100);
+			numericAmount.Sensitive = rbEquipNumeric.Sensitive;
+		}		
+
+		public void SetPercentageAmountEnabledState(bool enabled)
+		{
+			if (enabled)
+			{
+				double minPercentage = GetMinPercentage();
+				rbEquipPercent.Sensitive = isRatioLimited && minPercentage != 100;
+				percentageAmount.Sensitive = rbEquipPercent.Sensitive;
+				double maxPercentage = GetMaxPercentage();				
+				rbEquipAll.Sensitive = isRatioLimited && maxPercentage == 100;
+				lblEquipAll.Sensitive = rbEquipAll.Sensitive;
+			}
+			else
+			{
+				rbEquipPercent.Sensitive = false;
+				percentageAmount.Sensitive = false;
+				rbEquipAll.Sensitive = false;
+				lblEquipAll.Sensitive = false;
+			}
+		}
+
+		private double GetMaxPercentage()
+		{
+			double min, max;
+			percentageAmount.GetRange(out min, out max);
+			return max;
+		}
+
+		private double GetMinPercentage()
+		{
+			double min, max;
+			percentageAmount.GetRange(out min, out max);
+			return min;
+		}
+
+		public void ListenToWidgets()
+		{
+			rbEquipAll.Clicked += RadioButtonClicked;
+			rbEquipNumeric.Clicked += RadioButtonClicked;
+			rbEquipPercent.Clicked += RadioButtonClicked;
+			numericAmount.ValueChanged += SpinButtonValueChanged;
+			percentageAmount.ValueChanged += SpinButtonValueChanged;
+			lstEquipment.Selection.Changed += OnSelectionChanged;
+		}
+
+		public void IgnoreWidgets()
+		{
+			rbEquipAll.Clicked -= RadioButtonClicked;
+			rbEquipNumeric.Clicked -= RadioButtonClicked;
+			rbEquipPercent.Clicked -= RadioButtonClicked;
+			numericAmount.ValueChanged -= SpinButtonValueChanged;
+			percentageAmount.ValueChanged -= SpinButtonValueChanged;
+			lstEquipment.Selection.Changed -= OnSelectionChanged;
+		}
+
+		public UnitEquipmentItem SelectedUnitEquipmentItem
+		{
+			get
+			{
+				return (UnitEquipmentItem)TreeUtils.GetSelectedItem(lstEquipment);
+			}
+		}
+
+		public bool IsRatioEquipmentAmount
+		{
+			get
+			{
+				return !rbEquipNumeric.Active;
+			}
+		}
+
+		public int EquipmentNumericAmount
+		{
+			get
+			{
+				return (int)numericAmount.Value;
+			}
+			
+			set
+			{
+				numericAmount.Value = value;
+			}
+		}
+
+		public double EquipmentPercentageAmount
+		{
+			get
+			{
+				double percent;
+				
+				if (rbEquipAll.Active)
+				{
+					percent = 100;
+				}
+				else
+				{
+					percent = percentageAmount.Value;
+				}
+				
+				return percent;
+			}
+			
+			set
+			{
+				percentageAmount.Value = value;
+			}
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/FrmEditEquipment.cs	Mon Jan 17 19:43:47 2011 +0000
@@ -0,0 +1,236 @@
+//  This file (FrmEditEquipment.cs) is a part of the IBBoard.WarFoundry.GUI.GTK project and is copyright 2010 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 IBBoard.WarFoundry.GUI.GTK.UIControl.Interfaces;
+using IBBoard.WarFoundry.API.Objects;
+using Gtk;
+using IBBoard.WarFoundry.GUI.GTK.Util;
+using IBBoard.GtkSharp;
+using log4net.Repository.Hierarchy;
+using log4net;
+using IBBoard.GtkSharp.Translatable;
+using IBBoard.Lang;
+
+namespace IBBoard.WarFoundry.GUI.GTK
+{
+	public partial class FrmEditEquipment : TranslatableDialog, IEditEquipmentUI
+	{
+		private static ILog log = LogManager.GetLogger(typeof(FrmAddEquipment));
+
+		public event SingleArgMethodInvoker<UnitEquipmentItem> UnitEquipmentItemChoiceChanged;
+		public event MethodInvoker UnitEquipmentAmountTypeChanged;
+		public event MethodInvoker UnitEquipmentAmountChanged;
+
+		private bool isRatioLimited;
+
+		public FrmEditEquipment()
+		{
+			this.Build();
+			Translation.TranslationChanged += Retranslate;
+			Translate();
+		}
+
+		private void Retranslate()
+		{
+			Translate();
+		}
+
+		public override void Dispose()
+		{
+			Translation.TranslationChanged -= Retranslate;
+			base.Dispose();
+		}
+
+		public void ListenToWidgets()
+		{
+			rbEquipAll.Clicked += RadioButtonClicked;
+			rbEquipNumeric.Clicked += RadioButtonClicked;
+			rbEquipPercent.Clicked += RadioButtonClicked;
+			numericAmount.ValueChanged += SpinButtonValueChanged;
+			percentageAmount.ValueChanged += SpinButtonValueChanged;
+		}
+
+		public void IgnoreWidgets()
+		{
+			rbEquipAll.Clicked -= RadioButtonClicked;
+			rbEquipNumeric.Clicked -= RadioButtonClicked;
+			rbEquipPercent.Clicked -= RadioButtonClicked;
+			numericAmount.ValueChanged -= SpinButtonValueChanged;
+			percentageAmount.ValueChanged -= SpinButtonValueChanged;
+		}
+
+		private void OnUnitEquipmentAmountChanged()
+		{
+			if (UnitEquipmentAmountChanged != null)
+			{
+				UnitEquipmentAmountChanged();
+			}
+		}
+
+		private void OnUnitEquipmentAmountTypeChanged()
+		{
+			if (UnitEquipmentAmountChanged != null)
+			{
+				UnitEquipmentAmountTypeChanged();
+			}
+		}
+
+		public void SetUnitEquipmentLimits(bool isRatioLimit, double minPercent, double maxPercent, int minNumber, int maxNumber)
+		{
+			log.DebugFormat("IsRatio? {0}. Limits: {1}->{2}, {3}%->{4}%", isRatioLimit, minNumber, maxNumber, minPercent, maxPercent);
+			numericAmount.SetRange(minNumber, maxNumber);
+			percentageAmount.SetRange(minPercent, maxPercent);			
+			SetEquipmentAmountType(isRatioLimit);
+			isRatioLimited = isRatioLimit;
+		}
+
+		public void SetEquipmentAmountType(bool isRatioAmount)
+		{
+			if (isRatioAmount)
+			{
+				if (percentageAmount.Value == 100)
+				{
+					rbEquipAll.Active = true;
+				}
+				else
+				{
+					rbEquipPercent.Active = true;
+				}
+			}
+			else
+			{
+				rbEquipNumeric.Active = true;
+			}
+		}
+
+		public void SetUnitEquipmentLimitsEnabled(bool isEnabled)
+		{
+			SetNumericAmountEnabledState(isEnabled);
+			SetPercentageAmountEnabledState(isEnabled);
+		}
+
+		public bool ShowControl()
+		{
+			int result = Run();
+			bool okayClicked = (result == (int)ResponseType.Ok);
+			this.Hide();
+			return okayClicked;
+		}
+
+		protected virtual void CancelButtonClicked(object sender, System.EventArgs e)
+		{
+			log.Debug("Cancel clicked");
+			Respond(ResponseType.Cancel);
+		}	
+
+		protected virtual void OkayButtonClicked(object sender, System.EventArgs e)
+		{
+			log.Debug("Okay clicked");
+			Respond(ResponseType.Ok);
+		}		
+
+		public void SetOkayEnabledState(bool enabled)
+		{
+			bttnOkay.Sensitive = enabled;
+		}
+
+		protected virtual void SpinButtonValueChanged(object sender, System.EventArgs e)
+		{
+			OnUnitEquipmentAmountChanged();
+		}		
+
+		protected virtual void RadioButtonClicked(object sender, System.EventArgs e)
+		{
+			OnUnitEquipmentAmountTypeChanged();
+		}
+
+		public void SetNumericAmountEnabledState(bool enabled)
+		{
+			double minPercent = GetMinPercentage();
+			rbEquipNumeric.Sensitive = enabled && !(isRatioLimited && minPercent == 100);
+			numericAmount.Sensitive = rbEquipNumeric.Sensitive;
+		}		
+
+		public void SetPercentageAmountEnabledState(bool enabled)
+		{
+			if (enabled)
+			{
+				double minPercentage = GetMinPercentage();
+				rbEquipPercent.Sensitive = isRatioLimited && minPercentage != 100;
+				percentageAmount.Sensitive = rbEquipPercent.Sensitive;
+				double maxPercentage = GetMaxPercentage();				
+				rbEquipAll.Sensitive = isRatioLimited && maxPercentage == 100;
+				lblEquipAll.Sensitive = rbEquipAll.Sensitive;
+			}
+			else
+			{
+				rbEquipPercent.Sensitive = false;
+				percentageAmount.Sensitive = false;
+				rbEquipAll.Sensitive = false;
+				lblEquipAll.Sensitive = false;
+			}
+		}
+
+		private double GetMaxPercentage()
+		{
+			double min, max;
+			percentageAmount.GetRange(out min, out max);
+			return max;
+		}
+
+		private double GetMinPercentage()
+		{
+			double min, max;
+			percentageAmount.GetRange(out min, out max);
+			return min;
+		}		
+
+		public bool IsRatioEquipmentAmount
+		{
+			get
+			{
+				return !rbEquipNumeric.Active;
+			}
+		}
+
+		public int EquipmentNumericAmount
+		{
+			get
+			{
+				return (int)numericAmount.Value;
+			}
+			
+			set
+			{
+				numericAmount.Value = value;
+			}
+		}
+
+		public double EquipmentPercentageAmount
+		{
+			get
+			{
+				double percent;
+				
+				if (rbEquipAll.Active)
+				{
+					percent = 100;
+				}
+				else
+				{
+					percent = percentageAmount.Value;
+				}
+				
+				return percent;
+			}
+			
+			set
+			{
+				percentageAmount.Value = value;
+			}
+		}
+	}
+}
+
--- a/FrmMainWindow.cs	Sun Jan 31 20:46:06 2010 +0000
+++ b/FrmMainWindow.cs	Mon Jan 17 19:43:47 2011 +0000
@@ -3,69 +3,95 @@
 // 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.IO;
 using System.Collections.Generic;
 using System.Configuration;
+using System.IO;
+using GLib;
 using Gtk;
 using IBBoard;
 using IBBoard.Commands;
+using IBBoard.CustomMath;
 using IBBoard.GtkSharp;
+using IBBoard.GtkSharp.Translatable;
 using IBBoard.IO;
 using IBBoard.Lang;
 using IBBoard.Logging;
-using IBBoard.CustomMath;
 using IBBoard.WarFoundry.API;
+using IBBoard.WarFoundry.API.Commands;
 using IBBoard.WarFoundry.API.Exporters;
 using IBBoard.WarFoundry.API.Factories;
 using IBBoard.WarFoundry.API.Factories.Xml;
 using IBBoard.WarFoundry.API.Objects;
-using IBBoard.WarFoundry.API.Commands;
+using IBBoard.WarFoundry.API.Requirements;
 using IBBoard.WarFoundry.API.Savers;
-using IBBoard.WarFoundry.API.Requirements;
-using IBBoard.WarFoundry.GTK.Widgets;
+using IBBoard.WarFoundry.GUI.GTK.Widgets;
 using IBBoard.WarFoundry.Plugin.Rollcall;
 using IBBoard.Xml;
 using log4net;
+using WFObjects = IBBoard.WarFoundry.API.Objects;
+using System.Collections;
 
-namespace IBBoard.WarFoundry.GTK
+namespace IBBoard.WarFoundry.GUI.GTK
 {
-	public partial class FrmMainWindow: Gtk.Window
+	public partial class FrmMainWindow: TranslatableWindowWithActions
 	{
 		private static readonly string AppTitle = "WarFoundry";
 		private const int CATEGORY_BUTTON_SEPARATOR_INDEX = 6;
-
 		private Preferences preferences;
 		private ILog logger = LogManager.GetLogger(typeof(FrmMainWindow));
-
 		private CommandStack commandStack;
-		private Dictionary<ToolButton, Category> categoryMap = new Dictionary<ToolButton, Category>();
-		private Dictionary<IBBoard.WarFoundry.API.Objects.Unit, UnitDisplayWidget> unitToWidgetMap = new Dictionary<IBBoard.WarFoundry.API.Objects.Unit,UnitDisplayWidget>();
-
+		private Dictionary<WFObjects.Unit, UnitDisplayWidget> unitToWidgetMap = new Dictionary<WFObjects.Unit,UnitDisplayWidget>();
 		private ObjectAddDelegate UnitAddedMethod;
 		private ObjectRemoveDelegate UnitRemovedMethod;
 		private DoubleValChangedDelegate PointsValueChangedMethod;
 		private FailedUnitRequirementDelegate FailedUnitRequirementMethod;
 		private StringValChangedDelegate UnitNameChangedMethod;
-
 		private GameSystem system;
 		private string loadedArmyPath;
-
 		private MenuToolButton undoMenuButton, redoMenuButton;
 
-		public static void Main (string[] args)
+		public static void Main(string[] args)
 		{
 			try
 			{
+				ExceptionManager.UnhandledException += HandleUnhandledException;
 				Application.Init();
 				FrmMainWindow win = new FrmMainWindow(args);
 				win.Show();
 				Application.Run();
 				LogManager.GetLogger(typeof(FrmMainWindow)).Debug("Application ended");
 			}
-			catch(Exception ex)
+			catch (Exception ex)
+			{
+				HandleUnhandledException(ex);
+			}
+		}
+
+		private static void HandleUnhandledException(UnhandledExceptionArgs args)
+		{
+			object obj = args.ExceptionObject;
+			Exception ex = null;
+			
+			if (obj is Exception)
 			{
-				LogManager.GetLogger(typeof(FrmMainWindow)).Fatal("("+ex.GetType().Name+") "+ex.Message + Environment.NewLine + ex.StackTrace);
+				ex = (Exception)obj;
+			}
+			else
+			{
+				ex = new Exception("GLib returned unexpected exception object type " + obj.GetType());
 			}
+			
+			HandleUnhandledException(ex);
+		}
+
+		private static void HandleUnhandledException(Exception ex)
+		{
+			string msg = String.Format("({0}) {1}", ex.GetType().FullName, ex.Message);
+			LogManager.GetLogger(typeof(FrmMainWindow)).Fatal(msg, ex);
+			MessageDialog dialog = new MessageDialog(null, DialogFlags.Modal, MessageType.Error, ButtonsType.Ok, false, "An unhandled exception occurred. Please check the log for more details.");
+			dialog.Run();
+			dialog.Hide();
+			dialog.Dispose();
 		}
 
 		public FrmMainWindow() : this(new string[0])
@@ -73,35 +99,33 @@
 			//Do nothing extra
 		}
 
-		public FrmMainWindow (string[] args): base (Gtk.WindowType.Toplevel)
+		public FrmMainWindow(string[] args) : base(Gtk.WindowType.Toplevel)
 		{
 			logger.Info("Opening FrmMainWindow");
-			Build ();
+			Build();
 			//Replace the undo/redo buttons with menu versions, which Monodevelop's GUI editor doesn't currently support
 			redoMenuButton = new MenuToolButton("gtk-redo");
-			redoMenuButton.Label = "Redo";
-			redoMenuButton.TooltipText = "Redo";
-			redoMenuButton.Clicked+= redoTBButtonActivated;
+			redoMenuButton.Name = "bttnRedo";
+			redoMenuButton.Clicked += redoTBButtonActivated;
+			redoMenuButton.Sensitive = false;
 			toolbar.Insert(redoMenuButton, CATEGORY_BUTTON_SEPARATOR_INDEX);
 			undoMenuButton = new MenuToolButton("gtk-undo");
-			undoMenuButton.Label = "Undo";
-			undoMenuButton.TooltipText = "Undo";
-			undoMenuButton.Clicked+= undoTBButtonActivated;
+			undoMenuButton.Name = "bttnUndo";
+			undoMenuButton.Clicked += undoTBButtonActivated;
+			undoMenuButton.Sensitive = false;
 			toolbar.Insert(undoMenuButton, CATEGORY_BUTTON_SEPARATOR_INDEX);
-			toolbar.Remove(toolbar.Children[CATEGORY_BUTTON_SEPARATOR_INDEX-1]);
-			toolbar.Remove(toolbar.Children[CATEGORY_BUTTON_SEPARATOR_INDEX-2]);
+			toolbar.Remove(toolbar.Children[CATEGORY_BUTTON_SEPARATOR_INDEX - 1]);
+			toolbar.Remove(toolbar.Children[CATEGORY_BUTTON_SEPARATOR_INDEX - 2]);
 			toolbar.ShowAll();
 
-			Title = AppTitle;
-			TreeViewColumn mainColumn = new TreeViewColumn ();
-			mainColumn.Title = "Army Categories";
-			CellRendererText mainCell = new CellRendererText ();
-			mainColumn.PackStart (mainCell, true);
+			TreeViewColumn mainColumn = new TreeViewColumn();
+			CellRendererText mainCell = new CellRendererText();
+			mainColumn.PackStart(mainCell, true);
 			treeUnits.AppendColumn(mainColumn);
 			mainColumn.SetCellDataFunc(mainCell, new TreeCellDataFunc(RenderCategoryTreeObjectName));
 			treeUnits.Model = new TreeStore(typeof(WarFoundryObject));
 			logger.Debug("Loading preferences");
-			Preferences = new Preferences("WarFoundryGTK");
+			Preferences = new Preferences("WarFoundry-GTK");
 			logger.Debug("Loading translations");
 
 			try
@@ -119,11 +143,12 @@
 
 			logger.Debug("Initialising");
 			commandStack = new CommandStack();
-			commandStack.CommandStackUpdated+=new MethodInvoker(commandStack_CommandStackUpdated);
-			WarFoundryCore.GameSystemChanged+= new GameSystemChangedDelegate(OnGameSystemChanged);
-			WarFoundryCore.ArmyChanged+= new ArmyChangedDelegate(OnArmyChanged);
-			Destroyed+= new EventHandler(OnWindowDestroyed);
-			//TODO: Translate and subscribe to other events
+			commandStack.CommandStackUpdated += new MethodInvoker(commandStack_CommandStackUpdated);
+			WarFoundryCore.GameSystemChanged += new GameSystemChangedDelegate(OnGameSystemChanged);
+			WarFoundryCore.ArmyChanged += new ArmyChangedDelegate(OnArmyChanged);
+			Destroyed += new EventHandler(OnWindowDestroyed);
+			Translation.TranslationChanged += Retranslate;
+			Translate();
 			UnitAddedMethod = new ObjectAddDelegate(OnUnitAdded);
 			UnitRemovedMethod = new ObjectRemoveDelegate(OnUnitRemoved);
 			PointsValueChangedMethod = new DoubleValChangedDelegate(OnPointsValueChanged);
@@ -159,10 +184,14 @@
 							WarFoundryCore.CurrentArmy = (Army)loadedObject;
 							logger.InfoFormat("Loaded army from {0}", file.FullName);
 						}
-						else if (loadedObject is GameSystem)
+						else
 						{
-							WarFoundryCore.CurrentGameSystem = (GameSystem)loadedObject;
-							logger.InfoFormat("Loaded game system from {0}", file.FullName);
+							if (loadedObject is GameSystem)
+							{
+								WarFoundryCore.CurrentGameSystem = (GameSystem)loadedObject;
+								logger.InfoFormat("Loaded game system from {0}", file.FullName);
+							}
+
 						}
 					}
 				}
@@ -176,12 +205,12 @@
 			{
 				string gameSystemID = Preferences.GetStringProperty("currSystem");
 
-				if (gameSystemID!=null && !"".Equals(gameSystemID))
+				if (gameSystemID != null && !"".Equals(gameSystemID))
 				{
 					logger.Debug("Attempting to load current game system from properties");
 					GameSystem sys = WarFoundryLoader.GetDefault().GetGameSystem(gameSystemID);
 
-					if (sys!=null)
+					if (sys != null)
 					{
 						WarFoundryCore.CurrentGameSystem = sys;
 						logger.InfoFormat("Loaded game system {0} from properties", gameSystemID);
@@ -190,9 +219,28 @@
 			}
 		}
 
-		private void FileLoadingFinished (List<FileLoadFailure> failures)
+		protected override void Translate()
+		{
+			base.Translate();
+			SetAppTitle();
+			treeUnits.GetColumn(0).Title = Translation.GetTranslation("armyCategoryColumnTitle", "categories");
+			RebuildUndoRedoMenus();
+		}
+
+		private void Retranslate()
 		{
-			foreach(FileLoadFailure failure in failures)
+			Translate();
+		}
+
+		public override void Dispose()
+		{
+			Translation.TranslationChanged -= Retranslate;
+			base.Dispose();
+		}
+
+		private void FileLoadingFinished(List<FileLoadFailure> failures)
+		{
+			foreach (FileLoadFailure failure in failures)
 			{
 				logger.Warn("Failed to load " + failure.FailedFile.FullName + ": " + failure.Message);
 			}
@@ -218,11 +266,15 @@
 
 				(cell as CellRendererText).Text = name;
 			}
-			else if (o is IBBoard.WarFoundry.API.Objects.Unit)
+			else
 			{
-				IBBoard.WarFoundry.API.Objects.Unit u = (IBBoard.WarFoundry.API.Objects.Unit)o;
-				string name = Translation.GetTranslation("unitTreeCatName", "{0} - {1}pts", u.Name, u.Points);
-				(cell as CellRendererText).Text = name;
+				if (o is WFObjects.Unit)
+				{
+					WFObjects.Unit u = (WFObjects.Unit)o;
+					string name = Translation.GetTranslation("unitTreeCatName", "{0} - {1}pts", u.Name, u.Points);
+					(cell as CellRendererText).Text = name;
+				}
+
 			}
 		}
 
@@ -234,24 +286,33 @@
 
 		private void OnUnitNameChanged(WarFoundryObject val, string oldValue, string newValue)
 		{
-			IBBoard.WarFoundry.API.Objects.Unit unit = (IBBoard.WarFoundry.API.Objects.Unit)val;
+			WFObjects.Unit unit = (WFObjects.Unit)val;
+			logger.DebugFormat("Unit name changed for {0} - now called {1}", unit.ID, unit.Name);
 			UnitDisplayWidget widget;
 			unitToWidgetMap.TryGetValue(unit, out widget);
-
-			if (widget!=null)
+			
+			if (widget != null)
 			{
-				unitsNotebook.SetTabLabel(widget, NotebookUtil.CreateNotebookTabLabelWithClose(unitsNotebook, widget, newValue));
+				unitsNotebook.SetTabLabel(widget, NotebookUtil.CreateNotebookTabLabelWithClose(unitsNotebook, widget, unit.Name));
 			}
+			
+			treeUnits.QueueDraw();
 		}
 
 		private void OnUnitAdded(WarFoundryObject val)
 		{
-			IBBoard.WarFoundry.API.Objects.Unit unit = (IBBoard.WarFoundry.API.Objects.Unit)val;
-			unit.NameChanged+= UnitNameChangedMethod;
+			WFObjects.Unit unit = (WFObjects.Unit)val;
+			unit.NameChanged += UnitNameChangedMethod;
+			unit.PointsValueChanged += HandleUnitPointsValueChanged;
 			AddUnitToTree(unit);
 		}
 
-		private void AddUnitToTree(IBBoard.WarFoundry.API.Objects.Unit unit)
+		private void HandleUnitPointsValueChanged(WarFoundryObject obj, double oldValue, double newValue)
+		{			
+			treeUnits.QueueDraw();
+		}
+
+		private void AddUnitToTree(WFObjects.Unit unit)
 		{
 			TreeStore model = (TreeStore)treeUnits.Model;
 			TreeIter iter;
@@ -278,14 +339,13 @@
 
 		private void OnUnitRemoved(WarFoundryObject obj)
 		{
-			IBBoard.WarFoundry.API.Objects.Unit unit = (IBBoard.WarFoundry.API.Objects.Unit)obj;
-			unit.NameChanged-= UnitNameChangedMethod;
+			WFObjects.Unit unit = (WFObjects.Unit)obj;
+			unit.NameChanged -= UnitNameChangedMethod;
 			RemoveUnitFromTree(unit);
-
-			//See if unit has a tab open and close it if it does
+			RemoveUnitTab(unit);
 		}
 
-		private void RemoveUnitFromTree(IBBoard.WarFoundry.API.Objects.Unit unit)
+		private void RemoveUnitFromTree(WFObjects.Unit unit)
 		{
 			TreeStore model = (TreeStore)treeUnits.Model;
 			TreeIter iter;
@@ -328,9 +388,19 @@
 			while (model.IterNext(ref iter));
 		}
 
+		private void RemoveUnitTab(WFObjects.Unit unit)
+		{
+			UnitDisplayWidget widget = DictionaryUtils.GetValue(unitToWidgetMap, unit);
+			
+			if (widget != null)
+			{
+				unitsNotebook.Remove(widget);
+			}
+		}
+
 		private void OnPointsValueChanged(WarFoundryObject obj, double before, double after)
 		{
-			//Set points in panel
+			SetPointsPanelText();
 		}
 
 		private void OnFailedUnitRequirement(List<FailedUnitRequirement> failedRequirement)
@@ -344,14 +414,9 @@
 			set { preferences = value; }
 		}
 
-		/*public AbstractNativeWarFoundryFactory Factory
+		protected void OnDeleteEvent(object sender, DeleteEventArgs a)
 		{
-			get { return WarFoundryFactoryFactory.GetFactoryFactory().GetFactory(Constants.ExecutablePath, factoryType); }
-		}*/
-
-		protected void OnDeleteEvent (object sender, DeleteEventArgs a)
-		{
-			Application.Quit ();
+			Application.Quit();
 			a.RetVal = true;
 		}
 
@@ -367,6 +432,7 @@
 
 		protected virtual void OnReloadFilesActivated(object sender, System.EventArgs e)
 		{
+			WarFoundryLoader.GetDefault().LoadFiles();
 		}
 
 		protected virtual void OnSaveArmyAsActivated(object sender, System.EventArgs e)
@@ -393,20 +459,21 @@
 		{
 			if (sender is ToolButton)
 			{
-				Category cat = null;
-				categoryMap.TryGetValue((ToolButton)sender, out cat);
+				ToolButton toolButton = (ToolButton)sender;
+				Category cat = (Category)toolButton.Data["Category"];
 
-				if (cat!=null)
+				if (cat != null)
 				{
 					logger.DebugFormat("Show FrmNewUnit for {0}", cat.Name);
 					FrmNewUnit newUnit = new FrmNewUnit(WarFoundryCore.CurrentArmy.Race, cat, WarFoundryCore.CurrentArmy);
 					ResponseType response = (ResponseType)newUnit.Run();
 					newUnit.Hide();
 
-					if (response==ResponseType.Ok)
+					if (response == ResponseType.Ok)
 					{
 						CreateAndAddUnitCommand cmd = new CreateAndAddUnitCommand(newUnit.SelectedUnit, WarFoundryCore.CurrentArmy.GetCategory(cat));
 						commandStack.Execute(cmd);
+						ShowUnitWidget(cmd.Unit);
 					}
 
 					newUnit.Dispose();
@@ -421,17 +488,21 @@
 
 		private void SetAppTitle()
 		{
-			if (WarFoundryCore.CurrentArmy!=null)
+			if (WarFoundryCore.CurrentArmy != null)
 			{
 				Title = AppTitle + " - " + WarFoundryCore.CurrentGameSystem.Name + " - " + WarFoundryCore.CurrentArmy.Name;
 			}
-			else if (WarFoundryCore.CurrentGameSystem!=null)
-			{
-				Title = AppTitle + " - " + WarFoundryCore.CurrentGameSystem.Name;
-			}
 			else
 			{
-				Title = AppTitle;
+				if (WarFoundryCore.CurrentGameSystem != null)
+				{
+					Title = AppTitle + " - " + WarFoundryCore.CurrentGameSystem.Name;
+				}
+				else
+				{
+					Title = AppTitle;
+				}
+
 			}
 		}
 
@@ -441,7 +512,7 @@
 			SetAppTitle();
 			RemoveCategoryButtons();
 
-			if (system!=null)
+			if (system != null)
 			{
 				AddCategoryButtons(system.Categories);
 			}
@@ -453,12 +524,12 @@
 			SetAppTitle();
 			SetArmyTree(newArmy);
 
-			if (oldArmy!=null)
+			if (oldArmy != null)
 			{
-				oldArmy.UnitAdded-= UnitAddedMethod;
-				oldArmy.UnitRemoved-= UnitRemovedMethod;
-				oldArmy.PointsValueChanged-= PointsValueChangedMethod;
-				oldArmy.FailedRequirement-=FailedUnitRequirementMethod;
+				oldArmy.UnitAdded -= UnitAddedMethod;
+				oldArmy.UnitRemoved -= UnitRemovedMethod;
+				oldArmy.PointsValueChanged -= PointsValueChangedMethod;
+				oldArmy.FailedRequirement -= FailedUnitRequirementMethod;
 			}
 
 			unitToWidgetMap.Clear();
@@ -468,16 +539,16 @@
 				unitsNotebook.RemovePage(0);
 			}
 
-			if (newArmy==null)
+			if (newArmy == null)
 			{
 				DisableCategoryButtons();
 			}
 			else
 			{
-				newArmy.UnitAdded+= UnitAddedMethod;
-				newArmy.UnitRemoved+= UnitRemovedMethod;
-				newArmy.PointsValueChanged+= PointsValueChangedMethod;
-				newArmy.FailedRequirement+=FailedUnitRequirementMethod;
+				newArmy.UnitAdded += UnitAddedMethod;
+				newArmy.UnitRemoved += UnitRemovedMethod;
+				newArmy.PointsValueChanged += PointsValueChangedMethod;
+				newArmy.FailedRequirement += FailedUnitRequirementMethod;
 				//TODO: Clear all buttons
 				EnableCategoryButtons();
 
@@ -488,13 +559,15 @@
 				}
 			}
 
-			miCloseArmy.Sensitive = newArmy!=null;
-			miSaveArmyAs.Sensitive = newArmy!=null;
-			miExportArmy.Sensitive = newArmy!=null;
+			bool nonNullNewArmy = (newArmy != null);
+			miCloseArmy.Sensitive = nonNullNewArmy;
+			miSaveArmyAs.Sensitive = nonNullNewArmy;
+			miExportArmyAs.Sensitive = nonNullNewArmy;
+			hpaned2.Visible = nonNullNewArmy;
 			loadedArmyPath = null;
 			//New army has no changes, so we can't save it
 			miSaveArmy.Sensitive = false;
-			saveArmyButton.Sensitive = false;
+			bttnSaveArmy.Sensitive = false;
 
 			CommandStack.Reset();
 			SetPointsPanelText();
@@ -507,7 +580,7 @@
 			store.Clear();
 			TreeIter iter;
 
-			if (army!=null)
+			if (army != null)
 			{
 				logger.Debug("Loading in categories to tree");
 
@@ -516,7 +589,7 @@
 					logger.DebugFormat("Append category {0}", cat.Name);
 					iter = store.AppendValues(cat);
 
-					foreach (IBBoard.WarFoundry.API.Objects.Unit unit in cat.GetUnits())
+					foreach (WFObjects.Unit unit in cat.GetUnits())
 					{
 						store.AppendValues(iter, unit);
 					}
@@ -539,7 +612,7 @@
 		private void SetCategoryButtonsSensitive(bool state)
 		{
 			int toolbarButtonCount = toolbar.Children.Length - 1;
-			logger.Debug("Last button index: "+toolbarButtonCount);
+			logger.Debug("Last button index: " + toolbarButtonCount);
 
 			for (int i = toolbarButtonCount; i > CATEGORY_BUTTON_SEPARATOR_INDEX; i--)
 			{
@@ -556,13 +629,11 @@
 			{
 				toolbar.Remove(toolbar.Children[i]);
 			}
-
-			categoryMap.Clear();
 		}
 
 		private void AddCategoryButtons(Category[] cats)
 		{
-			if (cats!=null && cats.Length > 0)
+			if (cats != null && cats.Length > 0)
 			{
 				logger.DebugFormat("Toolbar button count: {0}. Adding {1} categories.", toolbar.Children.Length, cats.Length);
 
@@ -570,22 +641,28 @@
 				{
 					ToolButton button = new ToolButton("gtk-add");
 					button.Label = cat.Name;
-					button.TooltipText = "Add unit from "+cat.Name;
-					//TODO: See if we can associate data in some way, the same as we can with SWF. For now we just use the map.
-					categoryMap.Add(button, cat);
-					button.Clicked+= new System.EventHandler(OnAddUnitActivated);
+					button.TooltipText = Translation.GetTranslation("bttnCreateFromCat", "{0}", cat.Name);
+					button.Data["Category"] = cat;
+					button.Clicked += new System.EventHandler(OnAddUnitActivated);
 					toolbar.Insert(button, -1);
 				}
 			}
 
-			toolbar.Children[CATEGORY_BUTTON_SEPARATOR_INDEX].Visible = cats!=null && cats.Length>0;
+			toolbar.Children[CATEGORY_BUTTON_SEPARATOR_INDEX].Visible = cats != null && cats.Length > 0;
 
 			toolbar.ShowAll();
 		}
 
 		private void SetPointsPanelText()
 		{
-			//TODO: Set the points value in the status bar
+			if (WarFoundryCore.CurrentArmy != null)
+			{
+				lblTotalPoints.Text = Translation.GetTranslation("statusPanelPoints", "{0}pts of {1} pts", WarFoundryCore.CurrentArmy.Points, WarFoundryCore.CurrentArmy.MaxPoints);
+			}
+			else
+			{
+				lblTotalPoints.Text = "";
+			}
 		}
 
 		private void commandStack_CommandStackUpdated()
@@ -594,85 +671,115 @@
 			miUndo.Sensitive = undoMenuButton.Sensitive;
 			redoMenuButton.Sensitive = commandStack.CanRedo();
 			miRedo.Sensitive = redoMenuButton.Sensitive;
+
+			RebuildUndoRedoMenus();
+
+			bttnSaveArmy.Sensitive = commandStack.IsDirty() && WarFoundryCore.CurrentArmy != null;
+			miSaveArmy.Sensitive = commandStack.IsDirty() && WarFoundryCore.CurrentArmy != null;
+		}
+
+		private void RebuildUndoRedoMenus()
+		{
 			int redoLength = commandStack.RedoLength;
-			//TODO: Build menus for undo/redo and find way of adding tooltips
-			/*int maxRedo = Math.Min(10, redoLength);
-			MenuItem[] menuItems = null;
-
+			int maxRedo = Math.Min(10, redoLength);
+			
 			if (redoLength > 0)
 			{
-				menuItems = new MenuItem[maxRedo];
+				Menu menu = new Menu();
 				Command com;
 				MenuItem mi;
-
+			
 				for (int i = 0; i < maxRedo; i++)
 				{
-					com = commandStack.PeekRedoCommand(i+1);
-
+					com = commandStack.PeekRedoCommand(i + 1);
+			
 					if (com == null)
 					{
 						break;
 					}
-
+			
 					mi = new MenuItem(com.Description);
-					mi.Click+=new EventHandler(redoMenu_Click);
-					menuItems[i] = mi;
+					mi.Activated += new EventHandler(RedoMenuActivated);
+					menu.Append(mi);
 				}
+				
+				menu.ShowAll();
+				redoMenuButton.Menu = menu;
 			}
-
-			redoMenu.MenuItems.Clear();
-
-			if (menuItems!=null && menuItems[0]!=null)
+			else
 			{
-				bttnRedo.ToolTipText = menuItems[0].Text;
-				redoMenu.MenuItems.AddRange(menuItems);
-			}*/
-			//TODO: Put above code back when we have a dropdown version of the redo button
-			if (redoLength > 0)
-			{
-				//redoMenuButton.Tooltip = CommandStack.PeekRedoCommand().Description;
+				redoMenuButton.Menu = null;
 			}
-
+			
 			int undoLength = commandStack.UndoLength;
-			/*int maxUndo = Math.Min(10, undoLength);
-			MenuItem[] menuItemsUndo = null;
-
+			int maxUndo = Math.Min(10, undoLength);
+			
 			if (undoLength > 0)
 			{
-				menuItemsUndo = new MenuItem[maxUndo];
+				Menu menu = new Menu();
 				Command com;
 				MenuItem mi;
-
+			
 				for (int i = 0; i < maxUndo; i++)
 				{
-					com = commandStack.PeekUndoCommand(i+1);
-
+					com = commandStack.PeekUndoCommand(i + 1);
+			
 					if (com == null)
 					{
 						break;
 					}
-
+			
 					mi = new MenuItem(com.UndoDescription);
-					mi.Click+=new EventHandler(undoMenu_Click);
-					menuItemsUndo[i] = mi;
+					mi.Activated += new EventHandler(UndoMenuActivated);
+					menu.Add(mi);
+				}
+				
+				menu.ShowAll();
+				undoMenuButton.Menu = menu;
+			}
+			else
+			{
+				undoMenuButton.Menu = null;
+			}
+		}
+
+		private void RedoMenuActivated(object sender, EventArgs e)
+		{
+			if (sender is MenuItem)
+			{
+				MenuItem item = (MenuItem)sender;
+				//we know it's an redo menu item so find it's index and redo everything
+				
+				int max = Arrays.IndexOf(((Menu)redoMenuButton.Menu).Children, item);
+				
+				if (max >= 0)
+				{
+					for (int i = 0; i <= max; i++)
+					{
+						commandStack.Redo();
+					}
 				}
 			}
+		}
 
-			undoMenu.MenuItems.Clear();
-
-			if (menuItemsUndo!=null && menuItemsUndo[0]!=null)
+		private void UndoMenuActivated(object sender, EventArgs e)
+		{
+			if (sender is MenuItem)
 			{
-				bttnUndo.ToolTipText = menuItemsUndo[0].Text;
-				undoMenu.MenuItems.AddRange(menuItemsUndo);
-			}*/
-			//TODO: Put above code back when we have a dropdown version of the undo button
-			if (undoLength > 0)
-			{
-				//undoMenuButton.Tooltip = CommandStack.PeekUndoCommand().UndoDescription;
+				
+				MenuItem item = (MenuItem)sender;
+				//we know it's an undo menu item so find it's index and undo everything
+				
+				int max = Arrays.IndexOf(((Menu)undoMenuButton.Menu).Children, item);
+				
+				if (max >= 0)
+				{
+					for (int i = 0; i <= max; i++)
+					{
+						commandStack.Undo();
+					}
+				}
 			}
-
-			saveArmyButton.Sensitive = commandStack.IsDirty() && WarFoundryCore.CurrentArmy!=null;
-			miSaveArmy.Sensitive = commandStack.IsDirty() && WarFoundryCore.CurrentArmy!=null;
 		}
 
 		private bool SaveCurrentArmyOrSaveAs()
@@ -689,10 +796,13 @@
 
 		private bool OpenArmy()
 		{
-			FileChooserDialog fileDialog = new FileChooserDialog("Open army", this, FileChooserAction.Open, "Cancel", ResponseType.Cancel, "Open", ResponseType.Accept);
+			string title = Translation.GetTranslation("openArmyDialog", "open army");
+			string cancelText = Translation.GetTranslation("bttnCancel", "cancel");
+			string openText = Translation.GetTranslation("bttnOpen", "open");
+			FileChooserDialog fileDialog = new FileChooserDialog(title, this, FileChooserAction.Open, cancelText, ResponseType.Cancel, openText, ResponseType.Accept);
 			FileFilter filter = new FileFilter();
 			filter.AddPattern("*.army");
-			filter.Name = "WarFoundry Army files (*.army)";
+			filter.Name = Translation.GetTranslation("armyFileFilter", "WarFoundry .army files");
 			fileDialog.AddFilter(filter);
 			int response = fileDialog.Run();
 			string filePath = null;
@@ -710,7 +820,16 @@
 			if (filePath != null)
 			{
 				FileInfo file = new FileInfo(filePath);
-				Army army = WarFoundryLoader.GetDefault().LoadArmy(file);
+				Army army = null;
+
+				try
+				{
+					army = WarFoundryLoader.GetDefault().LoadArmy(file);
+				}
+				catch (Exception ex)
+				{
+					logger.Error("Error while loading army file " + filePath, ex);
+				}
 
 				if (army != null)
 				{
@@ -722,9 +841,8 @@
 				}
 				else
 				{
-					logger.ErrorFormat("Failed to load {0} as an army file", filePath);
-					MessageDialog dialog = new MessageDialog(this, DialogFlags.Modal, MessageType.Error, ButtonsType.Ok, file.Name + " could not be loaded.\n\nIf the file is an army file then please check your file loaders.");
-					dialog.Title = "Failed to open army";
+					MessageDialog dialog = new MessageDialog(this, DialogFlags.Modal, MessageType.Error, ButtonsType.Ok, Translation.GetTranslation("OpenFailed", "File open failed. Please check log file"));
+					dialog.Title = Translation.GetTranslation("OpenFailedTitle", "File open failed");
 					dialog.Run();
 					dialog.Hide();
 					dialog.Dispose();
@@ -742,7 +860,7 @@
 		{
 			bool success = false;
 
-			if (loadedArmyPath!=null)
+			if (loadedArmyPath != null)
 			{
 				success = SaveArmyToPath(WarFoundryCore.CurrentArmy, loadedArmyPath);
 			}
@@ -752,10 +870,13 @@
 
 		private bool SaveCurrentArmyAs()
 		{
-			FileChooserDialog fileDialog = new FileChooserDialog("Save file as", this, FileChooserAction.Save, "Cancel", ResponseType.Cancel, "Save", ResponseType.Accept);
+			string title = Translation.GetTranslation("saveArmyDialog", "save army");
+			string cancelText = Translation.GetTranslation("bttnCancel", "cancel");
+			string saveText = Translation.GetTranslation("bttnSave", "save");
+			FileChooserDialog fileDialog = new FileChooserDialog(title, this, FileChooserAction.Save, cancelText, ResponseType.Cancel, saveText, ResponseType.Accept);
 			FileFilter filter = new FileFilter();
 			filter.AddPattern("*.army");
-			filter.Name = "WarFoundry Army files (*.army)";
+			filter.Name = Translation.GetTranslation("armyFileFilter", "WarFoundry .army files");
 			fileDialog.AddFilter(filter);
 			int response = fileDialog.Run();
 			string filePath = null;
@@ -770,25 +891,36 @@
 			
 			return SaveArmyToPath(WarFoundryCore.CurrentArmy, filePath);
 		}
-		
+
 		private bool SaveArmyToPath(Army army, string filePath)
 		{
 			bool success = false;
 			
-			if (filePath!=null)
+			if (filePath != null)
 			{
-				if (WarFoundrySaver.GetSaver().Save(WarFoundryCore.CurrentArmy, filePath))
+				bool saveSuccess = false;
+
+				try
+				{
+					saveSuccess = WarFoundrySaver.GetSaver().Save(WarFoundryCore.CurrentArmy, filePath);
+				}
+				catch (Exception ex)
+				{
+					logger.Error("Error while saving army file to " + filePath, ex);
+				}
+
+				if (saveSuccess)
 				{
 					miSaveArmy.Sensitive = false;
-					saveArmyButton.Sensitive = false;
+					bttnSaveArmy.Sensitive = false;
 					CommandStack.setCleanMark();
 					loadedArmyPath = filePath;
 					success = true;
 				}
 				else
 				{
-					MessageDialog dialog = new MessageDialog(this, DialogFlags.Modal, MessageType.Error, ButtonsType.Ok, "Failed to save file to "+filePath);
-					dialog.Title = "Army save failed";
+					MessageDialog dialog = new MessageDialog(this, DialogFlags.Modal, MessageType.Error, ButtonsType.Ok,  Translation.GetTranslation("SaveFailed", "File save failed. Please check log file"));
+					dialog.Title = Translation.GetTranslation("SaveFailedTitle", "File save failed");
 					dialog.Run();
 					dialog.Hide();
 					dialog.Dispose();
@@ -801,13 +933,20 @@
 
 		private bool CloseCurrentArmy()
 		{
-			if (WarFoundryCore.CurrentArmy!=null)
+			if (WarFoundryCore.CurrentArmy != null)
 			{
 				bool canClose = false;
 
 				if (CommandStack.IsDirty())
 				{
-					MessageDialog dia  = new MessageDialog(this, DialogFlags.DestroyWithParent, MessageType.Question, ButtonsType.YesNo, "The army \""+WarFoundryCore.CurrentArmy.Name+"\" has been modified.\r\nSave changes before closing army?");
+					string message = Translation.GetTranslation("SaveChangesQuestion", "Save changes to army before closing?", WarFoundryCore.CurrentArmy.Name);
+					MessageDialog dia = new MessageDialog(this, DialogFlags.DestroyWithParent, MessageType.Question, ButtonsType.None, message);
+					dia.AddButton(Translation.GetTranslation("bttnDiscard", "lose changes"), ResponseType.No);
+					Button button = (Button)dia.AddButton(Translation.GetTranslation("bttnCancel", "cancel"), ResponseType.Cancel);
+					button.Image = new Image("gtk-cancel", IconSize.Button);
+					button = (Button)dia.AddButton(Translation.GetTranslation("bttnSave", "save"), ResponseType.Yes);
+					button.Image = new Image("gtk-save", IconSize.Button);
+					dia.Title = Translation.GetTranslation("SaveChangesTitle", "Save changes?");
 					ResponseType dr = (ResponseType)dia.Run();
 					dia.Hide();
 					dia.Dispose();
@@ -818,15 +957,19 @@
 						//If they cancel the save as then assume they don't want to close
 						canClose = SaveCurrentArmyOrSaveAs();
 					}
-					else if (dr == ResponseType.No)
-					{
-						//They don't care about their changes
-						canClose = true;
-					}
 					else
 					{
-						//Assume cancel or close with the X button
-						canClose = false;
+						if (dr == ResponseType.No)
+						{
+							//They don't care about their changes
+							canClose = true;
+						}
+						else
+						{
+							//Assume cancel or close with the X button
+							canClose = false;
+						}
+
 					}
 				}
 				else
@@ -875,75 +1018,74 @@
 			newArmy.Destroy();
 		}
 
-		protected virtual void undoTBButtonActivated (object sender, System.EventArgs e)
+		protected virtual void undoTBButtonActivated(object sender, System.EventArgs e)
 		{
 			CommandStack.Undo();
 		}
 
-		protected virtual void redoTBButtonActivated (object sender, System.EventArgs e)
+		protected virtual void redoTBButtonActivated(object sender, System.EventArgs e)
 		{
 			CommandStack.Redo();
 		}
 
-		protected virtual void saveTBButtonActivated (object sender, System.EventArgs e)
+		protected virtual void saveTBButtonActivated(object sender, System.EventArgs e)
 		{
 			SaveCurrentArmyOrSaveAs();
 		}
 
-		protected virtual void openTBButtonActivated (object sender, System.EventArgs e)
+		protected virtual void openTBButtonActivated(object sender, System.EventArgs e)
 		{
 			OpenArmy();
 		}
 
-		protected virtual void newTBButtonActivated (object sender, System.EventArgs e)
+		protected virtual void newTBButtonActivated(object sender, System.EventArgs e)
 		{
 			CreateNewArmy();
 		}
 
-		protected virtual void ArmyRowActivated (object o, Gtk.RowActivatedArgs args)
+		protected virtual void ArmyRowActivated(object o, Gtk.RowActivatedArgs args)
 		{
 			object obj = TreeUtils.GetItemAtPath(treeUnits, args.Path);
 
-			if (obj is IBBoard.WarFoundry.API.Objects.Unit)
+			if (obj is WFObjects.Unit)
 			{
-				IBBoard.WarFoundry.API.Objects.Unit unit = (IBBoard.WarFoundry.API.Objects.Unit)obj;
-
-				UnitDisplayWidget widget;
-				unitToWidgetMap.TryGetValue(unit, out widget);
-
-				if (widget!=null)
-				{
-					logger.DebugFormat("Selecting existing page for "+unit.Name);
-					unitsNotebook.Page = unitsNotebook.PageNum(widget);
-				}
-				else
-				{
-					widget = new UnitDisplayWidget(unit, CommandStack);
-					logger.Debug("Adding page for "+unit.Name);
-					unitToWidgetMap[unit] = widget;
-					widget.Destroyed+= new EventHandler(UnitWidgetDestroyed);
-					int pageNum = NotebookUtil.AddPageToNotebookWithCloseButton(unitsNotebook, widget, unit.Name);
-					logger.Debug("Page added at index "+pageNum);
-					unitsNotebook.ShowAll();
-					unitsNotebook.Page = pageNum;
-				}
+				WFObjects.Unit unit = (WFObjects.Unit)obj;
+				ShowUnitWidget(unit);
 			}
 		}
 
-		private void UnitWidgetDestroyed(object sender, EventArgs e)
+		private void ShowUnitWidget(WFObjects.Unit unit)
 		{
-			if (sender is UnitDisplayWidget)
+			UnitDisplayWidget widget;
+			unitToWidgetMap.TryGetValue(unit, out widget);
+
+			if (widget != null)
 			{
-				unitToWidgetMap.Remove(((UnitDisplayWidget)sender).Unit);
+				logger.DebugFormat("Selecting existing page for " + unit.Name);
+				unitsNotebook.Page = unitsNotebook.PageNum(widget);
+			}
+			else
+			{
+				widget = new UnitDisplayWidget(unit, CommandStack);
+				logger.Debug("Adding page for " + unit.Name);
+				unitToWidgetMap[unit] = widget;
+				int pageNum = NotebookUtil.AddPageToNotebookWithCloseButton(unitsNotebook, widget, unit.Name);
+				logger.Debug("Page added at index " + pageNum);
+				unitsNotebook.ShowAll();
+				unitsNotebook.CurrentPage = pageNum;
+				unitsNotebook.SetTabReorderable(widget, true);
 			}
 		}
 
-		protected virtual void OnMiExportAsBasicHtmlActivated (object sender, System.EventArgs e)
+		protected virtual void OnMiExportAsBasicHtmlActivated(object sender, System.EventArgs e)
 		{
-			FileChooserDialog fileDialog = new FileChooserDialog("Export army", this, FileChooserAction.Save, "Cancel", ResponseType.Cancel, "Export", ResponseType.Accept);
+			string exportArmyTitle = Translation.GetTranslation("exportBasicHtmlDialogTitle", "export army");
+			string cancelText = Translation.GetTranslation("exportBasicHtmlCancel", "cancel");
+			string exportText = Translation.GetTranslation("exportBasicHtmlExport", "export");
+			FileChooserDialog fileDialog = new FileChooserDialog(exportArmyTitle, this, FileChooserAction.Save, cancelText, ResponseType.Cancel, exportText, ResponseType.Accept);
 			FileFilter filter = new FileFilter();
 			filter.AddPattern("*.html");
-			filter.Name = "HTML pages (*.html)";
+			filter.Name = Translation.GetTranslation("exportBasicHtmlHtmlFilter", "HTML pages (*.html)");
 			fileDialog.AddFilter(filter);
 			int response = fileDialog.Run();
 			string filePath = null;
@@ -964,16 +1106,16 @@
 			}
 		}
 
-		protected virtual void OnTreeUnitsPopupMenu (object o, Gtk.PopupMenuArgs args)
+		protected virtual void OnTreeUnitsPopupMenu(object o, Gtk.PopupMenuArgs args)
 		{
 			object selectedItem = TreeUtils.GetSelectedItem(treeUnits);
 
-			if (selectedItem is IBBoard.WarFoundry.API.Objects.Unit)
+			if (selectedItem is WFObjects.Unit)
 			{
 				Menu menu = new Menu();
-				ImageMenuItem delete = new ImageMenuItem("Remove unit");
+				ImageMenuItem delete = new ImageMenuItem(Translation.GetTranslation("menuRemoveUnit", "remove unit"));
 				delete.Image = new Gtk.Image(Stock.Delete, IconSize.Menu);
-				delete.Activated+= new EventHandler(OnUnitDelete);
+				delete.Activated += new EventHandler(OnUnitDelete);
 				delete.Data["unit"] = selectedItem;
 				menu.Append(delete);
 				menu.ShowAll();
@@ -983,17 +1125,65 @@
 
 		private void OnUnitDelete(object o, EventArgs args)
 		{
-			RemoveUnitCommand command = new RemoveUnitCommand((IBBoard.WarFoundry.API.Objects.Unit)((ImageMenuItem)o).Data["unit"]);
+			RemoveUnitCommand command = new RemoveUnitCommand((WFObjects.Unit)((ImageMenuItem)o).Data["unit"]);
 			commandStack.Execute(command);
 		}
 
 		[GLib.ConnectBefore]
-		protected virtual void UnitTreeButtonPressed (object o, Gtk.ButtonPressEventArgs args)
+
+		protected virtual void UnitTreeButtonPressed(object o, Gtk.ButtonPressEventArgs args)
 		{
+			TreePath path;
+			treeUnits.GetPathAtPos((int)args.Event.X, (int)args.Event.Y, out path);
+			
+			if (!treeUnits.Selection.PathIsSelected(path))
+			{
+				treeUnits.Selection.SelectPath(path);
+			}
+			
 			if (args.Event.Type == Gdk.EventType.ButtonPress && args.Event.Button == 3)
 			{
 				OnTreeUnitsPopupMenu(o, null);
 			}
 		}
+
+		protected virtual void NotebookPageRemoved(object o, Gtk.RemovedArgs args)
+		{
+			Widget widget = args.Widget;
+			
+			if (widget is UnitDisplayWidget)
+			{
+				unitToWidgetMap.Remove(((UnitDisplayWidget)widget).Unit);
+			}
+		}
+
+		protected virtual void HelpAboutActivated(object sender, System.EventArgs e)
+		{
+			FrmAbout form = FrmAbout.GetForm();
+			form.Run();
+			form.Hide();
+		}
+
+		protected virtual void miPreferencesClicked(object sender, System.EventArgs e)
+		{
+			FrmPreferences form = new FrmPreferences(Preferences);
+			form.Run();
+			form.Hide();
+		}
+
+		public override ICollection<Action> Actions
+		{
+			get
+			{
+				List<Action> actions = new List<Action>();
+
+				foreach (ActionGroup actionGroup in this.UIManager.ActionGroups)
+				{
+					actions.AddRange(actionGroup.ListActions());
+				}
+
+				return actions;
+			}
+		}
 	}
 }
--- a/FrmNewArmy.cs	Sun Jan 31 20:46:06 2010 +0000
+++ b/FrmNewArmy.cs	Mon Jan 17 19:43:47 2011 +0000
@@ -9,16 +9,18 @@
 using IBBoard.WarFoundry.API.Objects;
 using IBBoard.GtkSharp;
 using log4net;
+using IBBoard.WarFoundry.GUI.GTK.Util;
+using IBBoard.GtkSharp.Translatable;
 
-namespace IBBoard.WarFoundry.GTK
+namespace IBBoard.WarFoundry.GUI.GTK
 {	
-	public partial class FrmNewArmy : Dialog, ITranslatable
+	public partial class FrmNewArmy : TranslatableDialog, ITranslatable
 	{
 		private ILog logger = LogManager.GetLogger(typeof(FrmNewArmy));
 		private Race race;
 		private string armyName;
 		private int pointsValue;
-		
+
 		public FrmNewArmy(GameSystem gameSystem)
 		{
 			this.Build();
@@ -26,6 +28,15 @@
 			GameSystem[] gameSystems = WarFoundryLoader.GetDefault().GetGameSystems();
 			ComboBoxUtils.FillCombo(systemCombo, gameSystems, delegate(GameSystem sys){return sys.Name;});
 			
+			lstRaces.Selection.Changed += new EventHandler(OnSelectionChanged);
+			
+			TreeViewColumn raceColumn = new TreeViewColumn();
+			raceColumn.Title = Translation.GetTranslation("frmNewArmyRaceColumn", "race");
+			CellRendererText raceCell = new CellRendererText();
+			raceColumn.PackStart(raceCell, true);
+			lstRaces.AppendColumn(raceColumn);
+			raceColumn.SetCellDataFunc(raceCell, GtkWarFoundryUtil.RenderWarFoundryObjectName);
+			
 			if (gameSystem != null)
 			{
 				ComboBoxUtils.SelectItem(systemCombo, gameSystem);
@@ -35,32 +46,25 @@
 				ComboBoxUtils.SelectIndex(systemCombo, 0);
 			}
 			
-			lstRaces.Selection.Changed+= new EventHandler(OnSelectionChanged);
-			
-			TreeViewColumn raceColumn = new TreeViewColumn ();
-			raceColumn.Title = "Race";
-			CellRendererText raceCell = new CellRendererText ();
-			raceColumn.PackStart (raceCell, true);
-			lstRaces.AppendColumn(raceColumn);
-			raceColumn.SetCellDataFunc(raceCell, new TreeCellDataFunc(RenderRaceName));
+			Translation.TranslationChanged += Retranslate;
+			Translate();
+		}
+
+		private void Retranslate()
+		{
+			Translate();
+		}
 
-			
-			if (gameSystem!=null)
-			{
-				SetRaces(gameSystem);
-			}
-		}
-		
-		public string Text
+		public override void Dispose()
 		{
-			get { return Title; }
-			set { Title = value; }
+			Translation.TranslationChanged -= Retranslate;
+			base.Dispose();
 		}
-		
-		private void RenderRaceName(TreeViewColumn column, CellRenderer cell, TreeModel model, TreeIter iter)
+
+		protected override void Translate()
 		{
-			Race r = (Race)model.GetValue(iter, 0);
-			(cell as CellRendererText).Text = r.Name;
+			base.Translate();
+			ControlTranslator.TranslateButtons(bttnCreate, bttnCancel);
 		}
 
 		protected virtual void OnSelectionChanged(object o, EventArgs e)
@@ -68,51 +72,60 @@
 			logger.Debug("Race selection changed");
 			SetOkayButtonState();
 		}
-		
+
 		private void SetOkayButtonState()
 		{
-			bttnCreate.Sensitive = (lstRaces.Selection.CountSelectedRows() == 1 && txtArmyName.Text!="" && sbPointsValue.Value > 0);
+			bttnCreate.Sensitive = (lstRaces.Selection.CountSelectedRows() == 1 && txtArmyName.Text != "" && sbPointsValue.Value > 0);
 		}
 
-		protected virtual void OnCreateClicked (object sender, System.EventArgs e)
+		protected virtual void OnCreateClicked(object sender, System.EventArgs e)
 		{
 			TreeModel model;
 			TreeIter iter;
-			lstRaces.Selection.GetSelected (out model, out iter);
-			race = (Race) model.GetValue(iter, 0);
+			lstRaces.Selection.GetSelected(out model, out iter);
+			race = (Race)model.GetValue(iter, 0);
 			armyName = txtArmyName.Text;
 			pointsValue = (int)sbPointsValue.Value;
 			Respond(ResponseType.Ok);
 		}
 
-		protected virtual void OnCancelClicked (object sender, System.EventArgs e)
+		protected virtual void OnCancelClicked(object sender, System.EventArgs e)
 		{
 			Respond(ResponseType.Cancel);
 		}
 
-		protected virtual void OnTextChanged (object sender, System.EventArgs e)
+		protected virtual void OnTextChanged(object sender, System.EventArgs e)
+		{
+			SetOkayButtonState();
+		}
+
+		protected virtual void OnSpinChangeValue(object o, Gtk.ChangeValueArgs args)
 		{
 			SetOkayButtonState();
 		}
 
-		protected virtual void OnSpinChangeValue (object o, Gtk.ChangeValueArgs args)
+		protected virtual void OnSpinValueChanged(object sender, System.EventArgs e)
 		{
 			SetOkayButtonState();
 		}
 
-		protected virtual void OnSpinValueChanged (object sender, System.EventArgs e)
-		{
-			SetOkayButtonState();
-		}
-		
-		protected virtual void OnSystemComboChanged (object sender, System.EventArgs e)
+		protected virtual void OnSystemComboChanged(object sender, System.EventArgs e)
 		{
 			GameSystem system = ComboBoxUtils.GetSelectedItem<GameSystem>(systemCombo);
 			SetRaces(system);
+			ListStore model = (ListStore)lstRaces.Model;
+
+			if (model.IterNChildren() == 1)
+			{
+				TreeIter iter;
+				model.GetIterFirst(out iter);
+				lstRaces.Selection.SelectIter(iter);
+			}
+
 			logger.Debug("System selection changed: " + (system == null ? "null" : system.Name));
 			SetOkayButtonState();
 		}
-		
+
 		private void SetRaces(GameSystem system)
 		{	
 			ListStore store = new ListStore(typeof(Race));
@@ -127,18 +140,18 @@
 			
 			lstRaces.Model = store;
 		}
-		
+
 		public Race SelectedRace
 		{
 			get { return race; }
 		}
-		
+
 		public string ArmyName
 		{
 			get { return armyName; }
 		}
-		
-		public int ArmySize 
+
+		public int ArmySize
 		{
 			get { return pointsValue; }
 		}
--- a/FrmNewUnit.cs	Sun Jan 31 20:46:06 2010 +0000
+++ b/FrmNewUnit.cs	Mon Jan 17 19:43:47 2011 +0000
@@ -4,31 +4,33 @@
 
 using System;
 using System.Collections.Generic;
+using Gtk;
+using IBBoard.GtkSharp.Translatable;
 using IBBoard.WarFoundry.API.Objects;
 using IBBoard.WarFoundry.API.Requirements;
-using Gtk;
 using log4net;
+using IBBoard.Lang;
 
-namespace IBBoard.WarFoundry.GTK
+namespace IBBoard.WarFoundry.GUI.GTK
 {
-	public partial class FrmNewUnit : Gtk.Dialog
+	public partial class FrmNewUnit : TranslatableDialog
 	{
 		private ILog logger = LogManager.GetLogger(typeof(FrmNewUnit));
-		
 		private UnitType unitType;
 		private Army unitArmy;
-		
-		public FrmNewUnit(Race race, Category cat, Army army)
+		private Category cat;
+
+		public FrmNewUnit(Race race, Category category, Army army)
 		{
 			this.Build();
 			unitArmy = army;
+			cat = category;
 			
-			TreeViewColumn unitTypeColumn = new TreeViewColumn ();
-			unitTypeColumn.Title = "Unit Type";
-			CellRendererText unitTypeCell = new CellRendererText ();
+			TreeViewColumn unitTypeColumn = new TreeViewColumn();
+			CellRendererText unitTypeCell = new CellRendererText();
 			unitTypeColumn.PackStart(unitTypeCell, true);
 			lstUnitTypes.AppendColumn(unitTypeColumn);
-			unitTypeColumn.SetCellDataFunc (unitTypeCell, new TreeCellDataFunc(RenderUnitTypeName));
+			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);
@@ -40,47 +42,68 @@
 			}
 			
 			lstUnitTypes.Model = store;
-			lstUnitTypes.Selection.Changed+= new EventHandler(OnSelectionChanged);
+			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);
+			lstUnitTypes.Selection.GetSelected(out model, out iter);
 			UnitType toReturn = null;
 			
-			if (model!=null)
+			if (model != null)
 			{
-				toReturn = (UnitType) model.GetValue(iter, 0);
+				toReturn = (UnitType)model.GetValue(iter, 0);
 			}
 			
 			return toReturn;
 		}
-		
+
 		private void SetSelectUnitEnabledVal()
 		{
 			UnitType type = GetSelectedUnitType();
 			
-			if (type!=null)
+			if (type != null)
 			{
-				buttonOk.Sensitive = true;
+				bttnCreate.Sensitive = true;
 				List<FailedUnitRequirement> fails = unitArmy.CanAddUnitType(type);
 				lblNewUnitWarning.Visible = (fails != null);
 
@@ -92,23 +115,23 @@
 			}
 			else
 			{
-				buttonOk.Sensitive = false;
+				bttnCreate.Sensitive = false;
 				lblNewUnitWarning.Visible = false;
 			}
 		}
 
-		protected virtual void OnButtonCancelActivated (object sender, System.EventArgs e)
+		protected virtual void OnButtonCancelActivated(object sender, System.EventArgs e)
 		{
 			Respond(ResponseType.Cancel);
 		}
 
-		protected virtual void OnRowActivated (object o, Gtk.RowActivatedArgs args)
+		protected virtual void OnRowActivated(object o, Gtk.RowActivatedArgs args)
 		{
 			unitType = GetSelectedUnitType();
 			Respond(ResponseType.Ok);
 		}
 
-		protected virtual void OnButtonOkClicked (object sender, System.EventArgs e)
+		protected virtual void OnButtonOkClicked(object sender, System.EventArgs e)
 		{
 			unitType = GetSelectedUnitType();
 			Respond(ResponseType.Ok);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/FrmPreferences.cs	Mon Jan 17 19:43:47 2011 +0000
@@ -0,0 +1,120 @@
+//  This file (FrmPreferences.cs) is a part of the IBBoard.WarFoundry.GUI.GTK project and is copyright 2011 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 IBBoard.GtkSharp.Translatable;
+using IBBoard.Lang;
+using Gtk;
+using System.Collections.Generic;
+using IBBoard.GtkSharp;
+using System.Globalization;
+using log4net;
+
+namespace IBBoard.WarFoundry.GUI.GTK
+{
+	public partial class FrmPreferences : TranslatableDialog
+	{
+		private ILog logger = LogManager.GetLogger(typeof(FrmPreferences));
+		private Preferences prefs;
+		private string initialLang;
+
+		public FrmPreferences(Preferences preferences)
+		{
+			prefs = preferences;
+			initialLang = Translation.GetTranslationLanguage();
+			this.Build();
+			BuildPreferenceCategoryTree();
+			BuildLanguageList();
+
+			Translation.TranslationChanged += Retranslate;
+			Translate();
+		}
+
+		private void Retranslate()
+		{
+			Translate();
+		}
+
+		public override void Dispose()
+		{
+			Translation.TranslationChanged -= Retranslate;
+			base.Dispose();
+		}
+
+		protected override void Translate()
+		{
+			base.Translate();
+			frameLabel.Text = Translation.GetTranslation("languagesGroup", "languages");
+			TreeStore model = ((TreeStore)preferencesTree.Model);
+			TreeIter iter;
+			model.GetIterFirst(out iter);
+			model.SetValue(iter, 0, Translation.GetTranslation("languagePrefSection", "Language"));
+		}
+
+		private void RenderPreference(TreeViewColumn column, CellRenderer cell, TreeModel model, TreeIter iter)
+		{
+			object obj = model.GetValue(iter, 0);
+
+			if (obj is string)
+			{
+				(cell as CellRendererText).Text = (string)obj;
+			}
+		}
+
+		private void BuildPreferenceCategoryTree()
+		{
+			TreeViewColumn mainColumn = new TreeViewColumn();
+			CellRendererText mainCell = new CellRendererText();
+			mainColumn.PackStart(mainCell, true);
+			preferencesTree.AppendColumn(mainColumn);
+			mainColumn.SetCellDataFunc(mainCell, new TreeCellDataFunc(RenderPreference));
+			TreeStore model = new TreeStore(typeof(string));
+			preferencesTree.Model = model;
+			model.AppendValues(Translation.GetTranslation("languagePrefSection", "Language"));
+		}
+
+		private void BuildLanguageList()
+		{
+			ICollection<TranslationLanguage> langs = Translation.GetLanguages();
+			List<TranslationLanguage> sortedLangs = new List<TranslationLanguage>(langs);
+			sortedLangs.Sort(CompareLanguages);
+			ComboBoxUtils.FillCombo(languageList, sortedLangs, delegate(TranslationLanguage lang){return lang.Name;});
+			ComboBoxUtils.SelectItem(languageList, Translation.GetTranslationSet(initialLang).Language);
+		}
+
+		private int CompareLanguages(TranslationLanguage lang1, TranslationLanguage lang2)
+		{
+			CompareOptions options = CompareOptions.IgnoreCase | CompareOptions.IgnoreKanaType | CompareOptions.IgnoreWidth;
+			return CultureInfo.CurrentCulture.CompareInfo.Compare(lang1.Name, lang2.Name, options);
+		}
+
+		protected virtual void bttnOkayClicked(object sender, System.EventArgs e)
+		{
+			prefs["language"] = Translation.GetTranslationLanguage();
+			prefs.Save();
+			Respond(ResponseType.Ok);
+		}
+
+		protected virtual void bttnCancelClicked(object sender, System.EventArgs e)
+		{
+			Translation.LoadTranslation(initialLang);
+			Respond(ResponseType.Cancel);
+		}
+
+		protected virtual void languageListChanged(object sender, System.EventArgs e)
+		{
+			TranslationLanguage selectedLang = ComboBoxUtils.GetSelectedItem<TranslationLanguage>(languageList);
+			string code = selectedLang == null ? "" : selectedLang.Code;
+			logger.Debug("New language: " + code);
+			Translation.LoadTranslation(code);
+			bttnOkay.Sensitive = !initialLang.Equals(code);
+
+		}
+
+
+
+
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/FrmReplaceEquipment.cs	Mon Jan 17 19:43:47 2011 +0000
@@ -0,0 +1,269 @@
+//  This file (FrmAddEquipment.cs) is a part of the IBBoard.WarFoundry.GUI.GTK project and is copyright 2010 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 Gtk;
+using IBBoard.GtkSharp;
+using IBBoard.GtkSharp.Translatable;
+using IBBoard.Lang;
+using IBBoard.WarFoundry.API.Objects;
+using IBBoard.WarFoundry.GUI.GTK.UIControl.Interfaces;
+using IBBoard.WarFoundry.GUI.GTK.Util;
+using log4net;
+
+namespace IBBoard.WarFoundry.GUI.GTK
+{
+	public partial class FrmReplaceEquipment : TranslatableDialog, IReplaceEquipmentUI
+	{
+		private static ILog log = LogManager.GetLogger(typeof(FrmReplaceEquipment));
+
+		public event SingleArgMethodInvoker<UnitEquipmentItem> UnitEquipmentItemChoiceChanged;
+		public event MethodInvoker UnitEquipmentAmountTypeChanged;
+		public event MethodInvoker UnitEquipmentAmountChanged;
+
+		private bool isRatioLimited;
+
+		public FrmReplaceEquipment()
+		{
+			this.Build();
+			lstEquipment.Selection.Changed += OnSelectionChanged;
+			TreeViewColumn equipColumn = new TreeViewColumn();
+			equipColumn.Title = "Equipment";
+			CellRendererText equipCell = new CellRendererText();
+			equipColumn.PackStart(equipCell, true);
+			equipColumn.SetCellDataFunc(equipCell, GtkWarFoundryUtil.RenderWarFoundryObjectName);
+			lstEquipment.AppendColumn(equipColumn);			
+
+			Translation.TranslationChanged += Retranslate;
+			Translate();
+		}
+
+		private void Retranslate()
+		{
+			Translate();
+		}
+
+		public override void Dispose()
+		{
+			Translation.TranslationChanged -= Retranslate;
+			base.Dispose();
+		}
+
+		public void ListenToWidgets()
+		{
+			rbEquipAll.Clicked += RadioButtonClicked;
+			rbEquipNumeric.Clicked += RadioButtonClicked;
+			rbEquipPercent.Clicked += RadioButtonClicked;
+			numericAmount.ValueChanged += SpinButtonValueChanged;
+			percentageAmount.ValueChanged += SpinButtonValueChanged;
+			lstEquipment.Selection.Changed += OnSelectionChanged;
+		}
+
+		public void IgnoreWidgets()
+		{
+			rbEquipAll.Clicked -= RadioButtonClicked;
+			rbEquipNumeric.Clicked -= RadioButtonClicked;
+			rbEquipPercent.Clicked -= RadioButtonClicked;
+			numericAmount.ValueChanged -= SpinButtonValueChanged;
+			percentageAmount.ValueChanged -= SpinButtonValueChanged;
+			lstEquipment.Selection.Changed -= OnSelectionChanged;
+		}
+
+		private void OnUnitEquipmentAmountChanged()
+		{
+			if (UnitEquipmentAmountChanged != null)
+			{
+				UnitEquipmentAmountChanged();
+			}
+		}
+
+		private void OnUnitEquipmentAmountTypeChanged()
+		{
+			if (UnitEquipmentAmountChanged != null)
+			{
+				UnitEquipmentAmountTypeChanged();
+			}
+		}
+
+		protected void OnSelectionChanged(object o, EventArgs e)
+		{
+			if (UnitEquipmentItemChoiceChanged != null)
+			{
+				UnitEquipmentItemChoiceChanged(SelectedUnitEquipmentItem);
+			}
+		}
+
+		public void SetUnitEquipmentItems(UnitEquipmentItem[] items)
+		{
+			ListStore store = new ListStore(typeof(UnitEquipmentItem));
+			
+			foreach (UnitEquipmentItem equipItem in items)
+			{
+				store.AppendValues(equipItem);
+			}
+			
+			lstEquipment.Model = store;
+		}
+
+		public void SetUnitEquipmentLimits(bool isRatioLimit, double minPercent, double maxPercent, int minNumber, int maxNumber)
+		{
+			log.DebugFormat("IsRatio? {0}. Limits: {1}->{2}, {3}%->{4}%", isRatioLimit, minNumber, maxNumber, minPercent, maxPercent);
+			numericAmount.SetRange(minNumber, maxNumber);
+			percentageAmount.SetRange(minPercent, maxPercent);
+			isRatioLimited = isRatioLimit;
+			
+			if (isRatioLimit)
+			{
+				if (minPercent == 100)
+				{
+					rbEquipAll.Active = true;
+				}
+				else
+				{
+					rbEquipPercent.Active = true;
+				}
+			}
+			else
+			{
+				rbEquipNumeric.Active = true;
+			}
+		}
+
+		public void SetUnitEquipmentLimitsEnabled(bool isEnabled)
+		{
+			SetNumericAmountEnabledState(isEnabled);
+			SetPercentageAmountEnabledState(isEnabled);
+		}
+
+		public bool ShowControl()
+		{
+			int result = Run();
+			bool okayClicked = (result == (int)ResponseType.Ok);
+			this.Hide();
+			return okayClicked;
+		}
+
+		protected virtual void CancelButtonClicked(object sender, System.EventArgs e)
+		{
+			log.Debug("Cancel clicked");
+			Respond(ResponseType.Cancel);
+		}	
+
+		protected virtual void OkayButtonClicked(object sender, System.EventArgs e)
+		{
+			log.Debug("Okay clicked");
+			Respond(ResponseType.Ok);
+		}		
+
+		public void SetOkayEnabledState(bool enabled)
+		{
+			bttnOkay.Sensitive = enabled;
+		}
+
+		protected virtual void SpinButtonValueChanged(object sender, System.EventArgs e)
+		{
+			OnUnitEquipmentAmountChanged();
+		}		
+
+		protected virtual void RadioButtonClicked(object sender, System.EventArgs e)
+		{
+			OnUnitEquipmentAmountTypeChanged();
+		}
+
+		public void SetNumericAmountEnabledState(bool enabled)
+		{
+			double minPercent = GetMinPercentage();
+			rbEquipNumeric.Sensitive = enabled && !(isRatioLimited && minPercent == 100);
+			numericAmount.Sensitive = rbEquipNumeric.Sensitive;
+		}		
+
+		public void SetPercentageAmountEnabledState(bool enabled)
+		{
+			if (enabled)
+			{
+				double minPercentage = GetMinPercentage();
+				rbEquipPercent.Sensitive = isRatioLimited && minPercentage != 100;
+				percentageAmount.Sensitive = rbEquipPercent.Sensitive;
+				double maxPercentage = GetMaxPercentage();				
+				rbEquipAll.Sensitive = isRatioLimited && maxPercentage == 100;
+				lblEquipAll.Sensitive = rbEquipAll.Sensitive;
+			}
+			else
+			{
+				rbEquipPercent.Sensitive = false;
+				percentageAmount.Sensitive = false;
+				rbEquipAll.Sensitive = false;
+				lblEquipAll.Sensitive = false;
+			}
+		}
+
+		private double GetMaxPercentage()
+		{
+			double min, max;
+			percentageAmount.GetRange(out min, out max);
+			return max;
+		}
+
+		private double GetMinPercentage()
+		{
+			double min, max;
+			percentageAmount.GetRange(out min, out max);
+			return min;
+		}
+
+		public UnitEquipmentItem SelectedUnitEquipmentItem
+		{
+			get
+			{
+				return (UnitEquipmentItem)TreeUtils.GetSelectedItem(lstEquipment);
+			}
+		}
+
+		public bool IsRatioEquipmentAmount
+		{
+			get
+			{
+				return !rbEquipNumeric.Active;
+			}
+		}
+
+		public int EquipmentNumericAmount
+		{
+			get
+			{
+				return (int)numericAmount.Value;
+			}
+			
+			set
+			{
+				numericAmount.Value = value;
+			}
+		}
+
+		public double EquipmentPercentageAmount
+		{
+			get
+			{
+				double percent;
+				
+				if (rbEquipAll.Active)
+				{
+					percent = 100;
+				}
+				else
+				{
+					percent = percentageAmount.Value;
+				}
+				
+				return percent;
+			}
+			
+			set
+			{
+				percentageAmount.Value = value;
+			}
+		}
+	}
+}
+
--- a/IBBoard.WarFoundry.GUI.GTK.csproj	Sun Jan 31 20:46:06 2010 +0000
+++ b/IBBoard.WarFoundry.GUI.GTK.csproj	Mon Jan 17 19:43:47 2011 +0000
@@ -9,8 +9,9 @@
     <OutputType>WinExe</OutputType>
     <AppDesignerFolder>Properties</AppDesignerFolder>
     <RootNamespace>IBBoard.WarFoundry.GUI.GTK</RootNamespace>
-    <StartupObject>IBBoard.WarFoundry.GTK.FrmMainWindow</StartupObject>
+    <StartupObject>IBBoard.WarFoundry.GUI.GTK.FrmMainWindow</StartupObject>
     <ApplicationIcon>App.ico</ApplicationIcon>
+    <AssemblyName>WarFoundry-GTK</AssemblyName>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <DebugSymbols>true</DebugSymbols>
@@ -20,7 +21,6 @@
     <DefineConstants>DEBUG;TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
-    <AssemblyName>WarFoundryGTK</AssemblyName>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>pdbonly</DebugType>
@@ -29,7 +29,6 @@
     <DefineConstants>TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
-    <AssemblyName>IBBoard.WarFoundry.GUI.GTK</AssemblyName>
   </PropertyGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
@@ -46,10 +45,32 @@
     <Compile Include="FrmNewUnit.cs" />
     <Compile Include="Widgets\UnitDisplayWidget.cs" />
     <Compile Include="gtk-gui\generated.cs" />
-    <Compile Include="gtk-gui\IBBoard.WarFoundry.GTK.FrmMainWindow.cs" />
-    <Compile Include="gtk-gui\IBBoard.WarFoundry.GTK.FrmNewArmy.cs" />
-    <Compile Include="gtk-gui\IBBoard.WarFoundry.GTK.FrmNewUnit.cs" />
-    <Compile Include="gtk-gui\IBBoard.WarFoundry.GTK.Widgets.UnitDisplayWidget.cs" />
+    <Compile Include="UIControl\AddEquipmentUIControl.cs" />
+    <Compile Include="UIControl\Interfaces\IAddEquipmentUI.cs" />
+    <Compile Include="FrmAddEquipment.cs" />
+    <Compile Include="gtk-gui\IBBoard.WarFoundry.GUI.GTK.FrmAddEquipment.cs" />
+    <Compile Include="Util\GtkWarFoundryUtil.cs" />
+    <Compile Include="UIControl\EditEquipmentUIControl.cs" />
+    <Compile Include="UIControl\Interfaces\IEditEquipmentUI.cs" />
+    <Compile Include="gtk-gui\IBBoard.WarFoundry.GUI.GTK.FrmEditEquipment.cs" />
+    <Compile Include="FrmEditEquipment.cs" />
+    <Compile Include="UIControl\AbstractBaseEquipmentUIControl.cs" />
+    <Compile Include="UIControl\Interfaces\IBaseEquipmentUI.cs" />
+    <Compile Include="UIControl\Interfaces\ISelectableItemEquipmentUI.cs" />
+    <Compile Include="UIControl\Interfaces\IReplaceEquipmentUI.cs" />
+    <Compile Include="FrmReplaceEquipment.cs" />
+    <Compile Include="UIControl\ReplaceEquipmentUIControl.cs" />
+    <Compile Include="gtk-gui\IBBoard.WarFoundry.GUI.GTK.FrmReplaceEquipment.cs" />
+    <Compile Include="FrmAbout.cs" />
+    <Compile Include="gtk-gui\IBBoard.WarFoundry.GUI.GTK.FrmAbout.cs" />
+    <Compile Include="gtk-gui\IBBoard.WarFoundry.GUI.GTK.FrmMainWindow.cs" />
+    <Compile Include="gtk-gui\IBBoard.WarFoundry.GUI.GTK.FrmNewArmy.cs" />
+    <Compile Include="gtk-gui\IBBoard.WarFoundry.GUI.GTK.FrmNewUnit.cs" />
+    <Compile Include="gtk-gui\IBBoard.WarFoundry.GUI.GTK.Widgets.UnitDisplayWidget.cs" />
+    <Compile Include="FrmAboutCredits.cs" />
+    <Compile Include="gtk-gui\IBBoard.WarFoundry.GUI.GTK.FrmAboutCredits.cs" />
+    <Compile Include="FrmPreferences.cs" />
+    <Compile Include="gtk-gui\IBBoard.WarFoundry.GUI.GTK.FrmPreferences.cs" />
   </ItemGroup>
   <ItemGroup>
     <Content Include="App.png" />
@@ -59,13 +80,16 @@
     <None Include="translations\en.translation">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
-    <None Include="WarFoundryGTK.exe.log4net">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </None>
     <None Include="gtk-gui\gui.stetic" />
     <None Include="gtk-gui\objects.xml" />
     <None Include="COPYING" />
-    <None Include="WarFoundryGTKPref.xml">
+    <None Include="WarFoundry-GTK.exe.log4net">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="WarFoundry-GTKPref.xml">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="translations\fr.translation">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
   </ItemGroup>
@@ -102,5 +126,11 @@
     <EmbeddedResource Include="App.ico">
       <LogicalName>App.ico</LogicalName>
     </EmbeddedResource>
+    <EmbeddedResource Include="App-lrg.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <Folder Include="UIControl\" />
+    <Folder Include="UIControl\Interfaces\" />
+    <Folder Include="Util\" />
   </ItemGroup>
 </Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IBBoard.WarFoundry.GUI.GTK.sln	Mon Jan 17 19:43:47 2011 +0000
@@ -0,0 +1,86 @@
+
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBBoard.WarFoundry.GUI.GTK", "IBBoard.WarFoundry.GUI.GTK.csproj", "{4B435E40-7FA2-41C5-96F6-5735396D2D5F}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBBoard", "..\IBBoard\IBBoard.csproj", "{5DFD64F6-FC2B-4B4F-B92E-483BAC468105}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBBoard.WarFoundry.API", "..\IBBoard.WarFoundry.API\IBBoard.WarFoundry.API.csproj", "{951E6C7A-7FBA-4F68-9D9E-F48618BB9626}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBBoard.GtkSharp", "..\IBBoard.GtkSharp\IBBoard.GtkSharp.csproj", "{06605A63-E433-42FE-93CF-0DA6630A7DF5}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBBoard.WarFoundry.Plugin.Rollcall", "..\IBBoard.WarFoundry.Plugin.Rollcall\IBBoard.WarFoundry.Plugin.Rollcall.csproj", "{182E4A7C-7CFB-4337-A9AD-AB2DCA054A53}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBBoard.Ini", "..\IBBoard.Ini\IBBoard.Ini.csproj", "{3BBDF326-7128-406C-85DF-EF049633E602}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBBoard.Ini.Tests", "..\IBBoard.Ini.Tests\IBBoard.Ini.Tests.csproj", "{47FA6D87-4A97-4019-880B-CD713B8D4C15}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBBoard.WarFoundry.API.Tests", "..\IBBoard.WarFoundry.API.Tests\IBBoard.WarFoundry.API.Tests.csproj", "{B20E808D-878E-4F6D-B1E3-84A9A49905CB}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBBoard.Tests", "..\IBBoard.Tests\IBBoard.Tests.csproj", "{4160F7B6-4CFA-41FC-B5D7-5C9AE06FEBA7}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBBoard.NUnit", "..\IBBoard.NUnit\IBBoard.NUnit.csproj", "{C52AFD32-B869-4E14-AACE-2846AD2CC742}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBBoard.NUnit.Tests", "..\IBBoard.NUnit.Tests\IBBoard.NUnit.Tests.csproj", "{2025A316-8377-4454-807C-3C4ED02DF4D5}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpZLib", "..\SharpZipLib\ICSharpCode.SharpZLib.csproj", "{0E7413FF-EB9E-4714-ACF2-BE3A6A7B2FFD}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|x86 = Debug|x86
+		Release|x86 = Release|x86
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{06605A63-E433-42FE-93CF-0DA6630A7DF5}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{06605A63-E433-42FE-93CF-0DA6630A7DF5}.Debug|x86.Build.0 = Debug|Any CPU
+		{06605A63-E433-42FE-93CF-0DA6630A7DF5}.Release|x86.ActiveCfg = Release|Any CPU
+		{06605A63-E433-42FE-93CF-0DA6630A7DF5}.Release|x86.Build.0 = Release|Any CPU
+		{0E7413FF-EB9E-4714-ACF2-BE3A6A7B2FFD}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{0E7413FF-EB9E-4714-ACF2-BE3A6A7B2FFD}.Debug|x86.Build.0 = Debug|Any CPU
+		{0E7413FF-EB9E-4714-ACF2-BE3A6A7B2FFD}.Release|x86.ActiveCfg = Release|Any CPU
+		{0E7413FF-EB9E-4714-ACF2-BE3A6A7B2FFD}.Release|x86.Build.0 = Release|Any CPU
+		{182E4A7C-7CFB-4337-A9AD-AB2DCA054A53}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{182E4A7C-7CFB-4337-A9AD-AB2DCA054A53}.Debug|x86.Build.0 = Debug|Any CPU
+		{182E4A7C-7CFB-4337-A9AD-AB2DCA054A53}.Release|x86.ActiveCfg = Release|Any CPU
+		{182E4A7C-7CFB-4337-A9AD-AB2DCA054A53}.Release|x86.Build.0 = Release|Any CPU
+		{2025A316-8377-4454-807C-3C4ED02DF4D5}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{2025A316-8377-4454-807C-3C4ED02DF4D5}.Debug|x86.Build.0 = Debug|Any CPU
+		{2025A316-8377-4454-807C-3C4ED02DF4D5}.Release|x86.ActiveCfg = Release|Any CPU
+		{2025A316-8377-4454-807C-3C4ED02DF4D5}.Release|x86.Build.0 = Release|Any CPU
+		{3BBDF326-7128-406C-85DF-EF049633E602}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{3BBDF326-7128-406C-85DF-EF049633E602}.Debug|x86.Build.0 = Debug|Any CPU
+		{3BBDF326-7128-406C-85DF-EF049633E602}.Release|x86.ActiveCfg = Release|Any CPU
+		{3BBDF326-7128-406C-85DF-EF049633E602}.Release|x86.Build.0 = Release|Any CPU
+		{4160F7B6-4CFA-41FC-B5D7-5C9AE06FEBA7}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{4160F7B6-4CFA-41FC-B5D7-5C9AE06FEBA7}.Debug|x86.Build.0 = Debug|Any CPU
+		{4160F7B6-4CFA-41FC-B5D7-5C9AE06FEBA7}.Release|x86.ActiveCfg = Release|Any CPU
+		{4160F7B6-4CFA-41FC-B5D7-5C9AE06FEBA7}.Release|x86.Build.0 = Release|Any CPU
+		{47FA6D87-4A97-4019-880B-CD713B8D4C15}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{47FA6D87-4A97-4019-880B-CD713B8D4C15}.Debug|x86.Build.0 = Debug|Any CPU
+		{47FA6D87-4A97-4019-880B-CD713B8D4C15}.Release|x86.ActiveCfg = Release|Any CPU
+		{47FA6D87-4A97-4019-880B-CD713B8D4C15}.Release|x86.Build.0 = Release|Any CPU
+		{4B435E40-7FA2-41C5-96F6-5735396D2D5F}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{4B435E40-7FA2-41C5-96F6-5735396D2D5F}.Debug|x86.Build.0 = Debug|Any CPU
+		{4B435E40-7FA2-41C5-96F6-5735396D2D5F}.Release|x86.ActiveCfg = Release|Any CPU
+		{4B435E40-7FA2-41C5-96F6-5735396D2D5F}.Release|x86.Build.0 = Release|Any CPU
+		{5DFD64F6-FC2B-4B4F-B92E-483BAC468105}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{5DFD64F6-FC2B-4B4F-B92E-483BAC468105}.Debug|x86.Build.0 = Debug|Any CPU
+		{5DFD64F6-FC2B-4B4F-B92E-483BAC468105}.Release|x86.ActiveCfg = Release|Any CPU
+		{5DFD64F6-FC2B-4B4F-B92E-483BAC468105}.Release|x86.Build.0 = Release|Any CPU
+		{951E6C7A-7FBA-4F68-9D9E-F48618BB9626}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{951E6C7A-7FBA-4F68-9D9E-F48618BB9626}.Debug|x86.Build.0 = Debug|Any CPU
+		{951E6C7A-7FBA-4F68-9D9E-F48618BB9626}.Release|x86.ActiveCfg = Release|Any CPU
+		{951E6C7A-7FBA-4F68-9D9E-F48618BB9626}.Release|x86.Build.0 = Release|Any CPU
+		{B20E808D-878E-4F6D-B1E3-84A9A49905CB}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{B20E808D-878E-4F6D-B1E3-84A9A49905CB}.Debug|x86.Build.0 = Debug|Any CPU
+		{B20E808D-878E-4F6D-B1E3-84A9A49905CB}.Release|x86.ActiveCfg = Release|Any CPU
+		{B20E808D-878E-4F6D-B1E3-84A9A49905CB}.Release|x86.Build.0 = Release|Any CPU
+		{C52AFD32-B869-4E14-AACE-2846AD2CC742}.Debug|x86.ActiveCfg = Debug|x86
+		{C52AFD32-B869-4E14-AACE-2846AD2CC742}.Debug|x86.Build.0 = Debug|x86
+		{C52AFD32-B869-4E14-AACE-2846AD2CC742}.Release|x86.ActiveCfg = Release|x86
+		{C52AFD32-B869-4E14-AACE-2846AD2CC742}.Release|x86.Build.0 = Release|x86
+	EndGlobalSection
+	GlobalSection(MonoDevelopProperties) = preSolution
+		StartupItem = IBBoard.WarFoundry.GUI.GTK.csproj
+	EndGlobalSection
+EndGlobal
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UIControl/AbstractBaseEquipmentUIControl.cs	Mon Jan 17 19:43:47 2011 +0000
@@ -0,0 +1,281 @@
+//  This file (AbstractBaseEquipmentUIControl.cs) is a part of the IBBoard.WarFoundry.GUI.GTK project and is copyright 2010 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 IBBoard.Commands;
+using IBBoard.WarFoundry.API.Objects;
+using IBBoard.WarFoundry.GUI.GTK.UIControl.Interfaces;
+using IBBoard.Lang;
+using IBBoard.WarFoundry.API.Util;
+
+namespace IBBoard.WarFoundry.GUI.GTK.UIControl
+{
+	public abstract class AbstractBaseEquipmentUIControl<UI_TYPE> where UI_TYPE : IBaseEquipmentUI
+	{
+		protected CommandStack commandStack;
+		protected Unit unit;
+		protected UI_TYPE ui;
+		protected UnitEquipmentItem equipItem;
+		protected double minPercentage, maxPercentage;
+		protected int minNumber, maxNumber;
+		protected bool isRatioAmount;
+		protected double equipmentAmount;
+
+		public AbstractBaseEquipmentUIControl(Unit unit, CommandStack commandStack)
+		{
+			this.unit = unit;
+			this.commandStack = commandStack;
+		}
+
+		private void SetupUI()
+		{
+			ui = CreateEquipmentUI();
+			ui.SetUnitEquipmentLimitsEnabled(false);
+			ui.SetOkayEnabledState(false);
+			CompleteUISetup();
+			ui.UnitEquipmentAmountChanged += HandleUnitEquipmentAmountChanged;
+			ui.UnitEquipmentAmountTypeChanged += HandleUnitEquipmentAmountChanged;
+			ui.ListenToWidgets();
+		}
+		
+		/// <summary>
+		/// Creates the UI component that will be displayed to the user and returns it
+		/// </summary>
+		/// <returns>
+		/// the UI component to display to the user
+		/// </returns>
+
+		protected abstract UI_TYPE CreateEquipmentUI();
+		
+		/// <summary>
+		/// Completes any additional user interface setup.
+		/// </summary>
+
+		protected virtual void CompleteUISetup()
+		{
+			//Do nothing
+		}
+
+		protected void HandleUnitEquipmentAmountChanged()
+		{
+			SetUnitEquipmentValuesFromUI();
+		}
+
+		protected void SetUnitEquipmentLimits(UnitEquipmentItem equip)
+		{			
+			ui.IgnoreWidgets();
+			
+			if (equip != null)
+			{
+				bool equipIsRatioLimit = UnitEquipmentUtil.IsEquipmentRatioLimited(unit, equip);
+				maxPercentage = GetMaxPercentageLimit(equip);
+				minPercentage = GetMinPercentageLimit(equip);
+				maxNumber = GetMaxNumericLimit(equip);
+				minNumber = GetMinNumericLimit(equip);
+			
+				ui.SetUnitEquipmentLimits(equipIsRatioLimit, minPercentage, maxPercentage, minNumber, maxNumber);
+				ui.SetUnitEquipmentLimitsEnabled(true);
+				ui.SetOkayEnabledState(HasNonZeroEquipmentAmount());
+				SetEquipmentAmountControlEnabledStates();
+			}
+			else
+			{
+				maxPercentage = minPercentage = 0;
+				maxNumber = minNumber = 0;
+				ui.SetUnitEquipmentLimits(false, minPercentage, maxPercentage, minNumber, maxNumber);
+				ui.SetUnitEquipmentLimitsEnabled(false);
+				ui.SetOkayEnabledState(false);
+			}
+			
+			ui.ListenToWidgets();
+		}
+
+		protected void SetUnitEquipmentValuesFromEquipment(UnitEquipmentItem equip)
+		{			
+			isRatioAmount = UnitEquipmentUtil.GetEquipmentAmountIsRatio(unit, equip);
+			equipmentAmount = UnitEquipmentUtil.GetEquipmentAmount(unit, equip);			
+			SetUnitEquipmentValues();
+			SetEquipmentAmountControlEnabledStates();
+		}
+
+		/// <summary>
+		/// Sets the unit equipment values on the UI
+		/// </summary>
+
+		protected void SetUnitEquipmentValuesFromUI()
+		{			
+			isRatioAmount = ui.IsRatioEquipmentAmount;
+			
+			if (isRatioAmount)
+			{
+				equipmentAmount = ui.EquipmentPercentageAmount;
+			}
+			else
+			{
+				int equipmentIntAmount = ui.EquipmentNumericAmount;
+				equipmentAmount = equipmentIntAmount;
+			}
+			
+			SetUnitEquipmentValues();
+		}
+
+		private void SetUnitEquipmentValues()
+		{			
+			ui.IgnoreWidgets();
+			
+			if (isRatioAmount)
+			{
+				SetEquipmentAmountsFromPercentage(equipmentAmount);
+			}
+			else
+			{
+				int equipmentIntAmount = (int)equipmentAmount;
+				SetEquipmentAmountsFromNumber(equipmentIntAmount);
+			}
+			
+			ui.SetOkayEnabledState(equipmentAmount != 0);
+			ui.ListenToWidgets();
+		}
+
+		private void SetEquipmentAmountsFromPercentage(double equipAmount)
+		{
+			if (equipAmount > maxPercentage)
+			{
+				string percentageTooLarge = Translation.GetTranslation("equipPercentageTooLarge", "the current percentage ({0}%) was larger than the maximum for the equipment item ({1}%) - the maximum value will be used instead", equipAmount, maxPercentage);
+				string percentageTooLargeTitle = Translation.GetTranslation("equipPercentageTooLargeTitle", "equipment percentage too large");
+				ShowMessage(percentageTooLarge, percentageTooLargeTitle);
+				equipAmount = maxPercentage;
+			}
+			else
+			{
+				if (equipAmount < minPercentage)
+				{
+					string percentageTooSmall = Translation.GetTranslation("equipPercentageTooSmall", "the current percentage ({0}%) was smaller than the minimum for the equipment item ({1}%) - the minimum value will be used instead", equipAmount, minPercentage);
+					string percentageTooSmallTitle = Translation.GetTranslation("equipPercentageTooSmallTitle", "equipment percentage too small");
+					ShowMessage(percentageTooSmall, percentageTooSmallTitle);
+					equipAmount = minPercentage;
+				}
+
+			}			
+			ui.EquipmentNumericAmount = CalculateNumericValueFromPercentage(equipAmount);
+			ui.EquipmentPercentageAmount = equipAmount;
+		}
+
+		private int CalculateNumericValueFromPercentage(double percent)
+		{
+			int calcedAmount = (int)CustomMath.IBBMath.Round((unit.Size * (percent / 100.0)), equipItem.RoundNumberUp);
+			return Math.Min(Math.Max(calcedAmount, minNumber), maxNumber);
+		}
+
+		private void ShowMessage(string message, string title)
+		{
+			Gtk.MessageDialog dialog = new Gtk.MessageDialog(null, Gtk.DialogFlags.Modal, Gtk.MessageType.Warning, Gtk.ButtonsType.Ok, false, message);
+			dialog.Title = title;
+			dialog.Run();
+			dialog.Hide();
+			dialog.Dispose();
+		}
+
+		private void SetEquipmentAmountsFromNumber(int equipAmount)
+		{
+			if (equipAmount > maxNumber)
+			{
+				string amountTooLarge = Translation.GetTranslation("equipNumberTooLarge", "the current amount ({0}) was larger than the maximum for the equipment item ({1}) - the maximum value will be used instead", equipAmount, maxNumber);
+				string amountTooLargeTitle = Translation.GetTranslation("equipNumberTooLargeTitle", "equipment amount too large");
+				ShowMessage(amountTooLarge, amountTooLargeTitle);
+				equipAmount = maxNumber;
+			}
+			else
+			{
+				if (equipAmount < minNumber)
+				{
+					string amountTooSmall = Translation.GetTranslation("equipNumberTooSmall", "the current amount ({0}) was smaller than the minimum for the equipment item ({1}) - the minimum value will be used instead", equipAmount, minNumber);
+					string amountTooSmallTitle = Translation.GetTranslation("equipNumberTooSmallTitle", "equipment amount too small");
+					ShowMessage(amountTooSmall, amountTooSmallTitle);
+					equipAmount = minNumber;
+				}
+
+			}			
+			ui.EquipmentPercentageAmount = CalcualtePercentageValueFromNumber(equipAmount);
+			ui.EquipmentNumericAmount = equipAmount;
+		}
+
+		private double CalcualtePercentageValueFromNumber(int number)
+		{
+			double calcedAmount = RoundPercentage(CustomMath.IBBMath.Percentage(number, unit.Size));
+			return Math.Min(Math.Max(calcedAmount, minPercentage), maxPercentage);
+		}
+
+		protected void SetEquipmentAmountControlEnabledStates()
+		{
+			ui.SetNumericAmountEnabledState(!isRatioAmount);
+			ui.SetPercentageAmountEnabledState(true);
+		}
+
+		protected double GetMaxPercentageLimit(UnitEquipmentItem equip)
+		{
+			double maxPercent = RoundPercentage(UnitEquipmentUtil.GetMaxEquipmentPercentage(unit, equip));
+			return Math.Max(0, maxPercent);
+		}
+
+		protected double GetMinPercentageLimit(UnitEquipmentItem equip)
+		{
+			double minPercent = RoundPercentage(UnitEquipmentUtil.GetMinEquipmentPercentage(unit, equip));
+			return Math.Max(0, minPercent);
+		}
+
+		protected int GetMaxNumericLimit(UnitEquipmentItem equip)
+		{
+			int maxNumber = UnitEquipmentUtil.GetMaxEquipmentCount(unit, equip);
+			return Math.Max(0, maxNumber);
+		}
+
+		protected int GetMinNumericLimit(UnitEquipmentItem equip)
+		{
+			int minNumber = UnitEquipmentUtil.GetMinEquipmentCount(unit, equip);
+			return Math.Max(0, minNumber);
+		}
+
+		protected bool HasNonZeroEquipmentAmount()
+		{
+			bool nonZero;
+			
+			if (isRatioAmount)
+			{
+				nonZero = (ui.EquipmentPercentageAmount > 0);
+			}
+			else
+			{
+				nonZero = (ui.EquipmentNumericAmount > 0);
+			}
+			
+			return nonZero;
+		}
+
+		private double RoundPercentage(double percent)
+		{
+			return Math.Round(percent, 1);
+		}
+
+		public void Show()
+		{			
+			SetupUI();
+			bool okayed = ui.ShowControl();
+			
+			if (okayed)
+			{
+				DoProcessing();
+			}
+			
+			ui.Dispose();
+		}	
+		
+		/// <summary>
+		/// Does the processing required for the control when the "OK" button was clicked
+		/// </summary>
+
+		protected abstract void DoProcessing();
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UIControl/AddEquipmentUIControl.cs	Mon Jan 17 19:43:47 2011 +0000
@@ -0,0 +1,63 @@
+//  This file (AddEquipmentUIControl.cs) is a part of the IBBoard.WarFoundry.GUI.GTK project and is copyright 2010 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 IBBoard.Commands;
+using IBBoard.WarFoundry.API.Commands;
+using IBBoard.WarFoundry.API.Objects;
+using IBBoard.WarFoundry.API.Util;
+using IBBoard.WarFoundry.GUI.GTK.UIControl.Interfaces;
+using CustomMath = IBBoard.CustomMath;
+
+namespace IBBoard.WarFoundry.GUI.GTK.UIControl
+{
+	public class AddEquipmentUIControl : AbstractBaseEquipmentUIControl<IAddEquipmentUI>
+	{		
+		public AddEquipmentUIControl(Unit unit, CommandStack commandStack) : base(unit, commandStack)
+		{
+			//Do nothing extra
+		}
+
+		//TODO Make abstract
+
+		protected override IAddEquipmentUI CreateEquipmentUI()
+		{
+			return new FrmAddEquipment();
+		}
+
+		protected override void CompleteUISetup()
+		{
+			ui.SetUnitEquipmentItems(GetEquipmentItems(unit));
+			ui.UnitEquipmentItemChoiceChanged += HandleUiUnitEquipmentItemChoiceChanged;
+		}
+
+		public static UnitEquipmentItem[] GetEquipmentItems(Unit unit)
+		{
+			return Arrays.Subtract(UnitEquipmentUtil.GetAllowedEquipmentItems(unit), unit.GetEquipment());
+		}
+
+		public static bool HasEquipmentToAdd(Unit unit)
+		{
+			return GetEquipmentItems(unit).Length > 0;
+		}
+
+		private void HandleUiUnitEquipmentItemChoiceChanged(UnitEquipmentItem equip)
+		{
+			equipItem = equip;
+			SetUnitEquipmentLimits(equip);
+		}
+
+		protected override void DoProcessing()
+		{
+			if (isRatioAmount)
+			{
+				commandStack.Execute(new SetUnitEquipmentRatioAmountCommand(unit, equipItem, equipmentAmount));
+			}
+			else
+			{
+				commandStack.Execute(new SetUnitEquipmentNumericAmountCommand(unit, equipItem, (int)equipmentAmount));
+			}
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UIControl/EditEquipmentUIControl.cs	Mon Jan 17 19:43:47 2011 +0000
@@ -0,0 +1,51 @@
+//  This file (EditEquipmentUIControl.cs) is a part of the IBBoard.WarFoundry.GUI.GTK project and is copyright 2010 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 IBBoard.Commands;
+using IBBoard.WarFoundry.API.Objects;
+using IBBoard.WarFoundry.API.Util;
+using IBBoard.WarFoundry.GUI.GTK.UIControl.Interfaces;
+using IBBoard.WarFoundry.API.Commands;
+using CustomMath = IBBoard.CustomMath;
+using IBBoard.Lang;
+using IBBoard.WarFoundry.GUI.GTK;
+
+namespace IBBoard.WarFoundry.GUI.GTK.UIControl
+{
+	public class EditEquipmentUIControl : AbstractBaseEquipmentUIControl<IEditEquipmentUI>
+	{		
+		public EditEquipmentUIControl(Unit unit, UnitEquipmentItem item, CommandStack commandStack) : base(unit, commandStack)
+		{
+			this.equipItem = item;
+		}
+
+		//TODO Make abstract
+
+		protected override IEditEquipmentUI CreateEquipmentUI()
+		{
+			return new FrmEditEquipment();
+		}
+		
+		protected override void CompleteUISetup()
+		{
+			SetUnitEquipmentLimits(equipItem);
+			SetUnitEquipmentValuesFromEquipment(equipItem);
+			ui.SetEquipmentAmountType(UnitEquipmentUtil.GetEquipmentAmountIsRatio(unit, equipItem));
+		}
+
+		protected override void DoProcessing()
+		{
+			if (isRatioAmount)
+			{
+				commandStack.Execute(new SetUnitEquipmentRatioAmountCommand(unit, equipItem, equipmentAmount));
+			}
+			else
+			{
+				commandStack.Execute(new SetUnitEquipmentNumericAmountCommand(unit, equipItem, (int)equipmentAmount));
+			}
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UIControl/Interfaces/IAddEquipmentUI.cs	Mon Jan 17 19:43:47 2011 +0000
@@ -0,0 +1,16 @@
+//  This file (IAddEquipmentUI.cs) is a part of the IBBoard.WarFoundry.GUI.GTK project and is copyright 2010 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 IBBoard.WarFoundry.API.Objects;
+namespace IBBoard.WarFoundry.GUI.GTK.UIControl.Interfaces
+{
+	/// <summary>
+	/// The interface that UI components should implement to represent "Add Equipment" dialogs or system equivalents (e.g. console areas or HTML fragments)
+	/// </summary>
+	public interface IAddEquipmentUI : ISelectableItemEquipmentUI
+	{
+		//Marker interface
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UIControl/Interfaces/IBaseEquipmentUI.cs	Mon Jan 17 19:43:47 2011 +0000
@@ -0,0 +1,144 @@
+//  This file (IBaseEquipmentUI.cs) is a part of the IBBoard.WarFoundry.GUI.GTK project and is copyright 2010 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;
+
+namespace IBBoard.WarFoundry.GUI.GTK.UIControl.Interfaces
+{
+	/// <summary>
+	/// The base interface that all "UI control" controlled interfaces implement. It provides common definitions for all classes
+	/// </summary>
+	public interface IBaseEquipmentUI : IDisposable
+	{
+		/// <summary>
+		/// Occurs when the unit equipment amount type changes (e.g. percentage to numeric)
+		/// </summary>
+		event MethodInvoker UnitEquipmentAmountTypeChanged;
+
+		/// <summary>
+		/// Occurs when the unit equipment amount changes
+		/// </summary>
+
+		event MethodInvoker UnitEquipmentAmountChanged;
+		
+		/// <summary>
+		/// Causes the UI to listen to its widgets and fire events
+		/// </summary>
+
+		void ListenToWidgets();
+		
+		/// <summary>
+		/// Causes the UI to ignore the widgets so that changes do not fire events
+		/// </summary>
+
+		void IgnoreWidgets();
+
+		/// <summary>
+		/// Sets the limits for the currently selected equipment item
+		/// </summary>
+		/// <param name='isRatioLimit'>
+		/// <code>True</code> if the current limit is a ratio limit, else <code>false</code> for absolute limits
+		/// </param>
+		/// <param name='minPercent'>
+		/// The minimum limit as a percentage
+		/// </param>
+		/// <param name='maxPercent'>
+		/// The maximum limit as a percentage
+		/// </param>
+		/// <param name='minNumber'>
+		/// The minimum number as an absolute figure
+		/// </param>
+		/// <param name='maxNumber'>
+		/// The maximum number as an absolute figure
+		/// </param>
+
+		void SetUnitEquipmentLimits(bool isRatioLimit, double minPercent, double maxPercent, int minNumber, int maxNumber);
+
+		/// <summary>
+		/// Sets whether the unit equipment limit UI components should be enabled and able to accept input. This will 
+		/// generally pass the values on to the <see cref="SetNumericAmountEnabledState(bool)"/> and
+		/// <see cref="SetPercentageAmountEnabledState(bool)"/> methods and is included for convenience
+		/// </summary>
+		/// <param name='isEnabled'>
+		/// <code>True</code> if the UI components should accept input, else <code>false</code>
+		/// </param>
+
+		void SetUnitEquipmentLimitsEnabled(bool isEnabled);
+
+		/// <summary>
+		/// Shows the control and awaits a user action (close or okay)
+		/// </summary>
+		/// <returns>
+		/// <code>true</code> if the control was closed with "Okay", else <code>false</code>
+		/// </returns>
+
+		bool ShowControl();
+
+		/// <summary>
+		/// Gets a value indicating whether the equipment amount is a ratio or an absolute number.
+		/// </summary>
+		/// <value>
+		/// <c>true</c> if the selected amount is a ratio type (percentage or "all"); otherwise, <c>false</c>.
+		/// </value>
+
+		bool IsRatioEquipmentAmount
+		{
+			get;
+		}
+
+		/// <summary>
+		/// Gets and sets the numeric amount for the current equipment amount. This number is meaningless if <see cref="IsRatioEquipmentAmount"/> is <code>true</code>
+		/// </summary>
+		/// <value>
+		/// The absolue number of items taken.
+		/// </value>
+
+		int EquipmentNumericAmount
+		{
+			get;
+			set;
+		}
+
+		/// <summary>
+		/// Gets and sets the percentage amount for the current equipment amount. This number is meaningless if <see cref="IsRatioEquipmentAmount"/> is <code>false</code>
+		/// </summary>
+		/// <value>
+		/// The number of items taken as a percentage of the unit size.
+		/// </value>
+
+		double EquipmentPercentageAmount
+		{
+			get;
+			set;
+		}
+
+		/// <summary>
+		/// Sets the state of the Okay button.
+		/// </summary>
+		/// <param name='enabled'>
+		/// <code>true</code> to enable the button, else <code>false</code>
+		/// </param>
+
+		void SetOkayEnabledState(bool enabled);
+
+		/// <summary>
+		/// Sets the state of the numeric equipment amount control.
+		/// </summary>
+		/// <param name='enabled'>
+		/// <code>true</code> to enable the control, else <code>false</code>
+		/// </param>
+
+		void SetNumericAmountEnabledState(bool enabled);
+
+		/// <summary>
+		/// Sets the state of the percentage equipment amount control.
+		/// </summary>
+		/// <param name='enabled'>
+		/// <code>true</code> to enable the control, else <code>false</code>
+		/// </param>
+
+		void SetPercentageAmountEnabledState(bool enabled);
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UIControl/Interfaces/IEditEquipmentUI.cs	Mon Jan 17 19:43:47 2011 +0000
@@ -0,0 +1,24 @@
+//  This file (IEditEquipmentUI.cs) is a part of the IBBoard.WarFoundry.GUI.GTK project and is copyright 2010 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 IBBoard.WarFoundry.API.Objects;
+
+namespace IBBoard.WarFoundry.GUI.GTK.UIControl.Interfaces
+{
+	/// <summary>
+	/// The interface that UI components should implement to represent "Edit Equipment" dialogs or system equivalents (e.g. console areas or HTML fragments)
+	/// </summary>
+	public interface IEditEquipmentUI : IBaseEquipmentUI
+	{
+		/// <summary>
+		/// Sets the type of the equipment amount.
+		/// </summary>
+		/// <param name='isRatioLimit'>
+		/// <code>True</code> for ratio selection amounts, else <code>false</code> for numeric amounts
+		/// </param>
+		void SetEquipmentAmountType(bool isRatioLimit);
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UIControl/Interfaces/IReplaceEquipmentUI.cs	Mon Jan 17 19:43:47 2011 +0000
@@ -0,0 +1,17 @@
+//  This file (IReplaceEquipmentUI.cs) is a part of the IBBoard.WarFoundry.GUI.GTK project and is copyright 2010 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;
+
+namespace IBBoard.WarFoundry.GUI.GTK.UIControl.Interfaces
+{
+	/// <summary>
+	/// The interface that UI components should implement to represent "Replace Equipment" dialogs or system equivalents (e.g. console areas or HTML fragments)
+	/// </summary>
+	public interface IReplaceEquipmentUI : ISelectableItemEquipmentUI
+	{
+		//Marker interface
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UIControl/Interfaces/ISelectableItemEquipmentUI.cs	Mon Jan 17 19:43:47 2011 +0000
@@ -0,0 +1,38 @@
+//  This file (ISelectableItemEquipmentUI.cs) is a part of the IBBoard.WarFoundry.GUI.GTK project and is copyright 2010 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 IBBoard.WarFoundry.API.Objects;
+namespace IBBoard.WarFoundry.GUI.GTK.UIControl.Interfaces
+{
+	/// <summary>
+	/// 
+	/// </summary>
+	public interface ISelectableItemEquipmentUI : IBaseEquipmentUI
+	{
+		/// <summary>
+		/// Should be fired when unit equipment item choice changes.
+		/// </summary>
+		event SingleArgMethodInvoker<UnitEquipmentItem> UnitEquipmentItemChoiceChanged;
+
+		/// <summary>
+		/// Sets the equipment items that should be displayed on the form
+		/// </summary>
+		/// <param name='items'>
+		/// The equipment items that should be displayed on the form
+		/// </param>
+		void SetUnitEquipmentItems(UnitEquipmentItem[] items);
+
+		/// <summary>
+		/// Gets the selected equipment item.
+		/// </summary>
+		/// <value>
+		/// The selected equipment item.
+		/// </value>
+		UnitEquipmentItem SelectedUnitEquipmentItem
+		{
+			get;
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UIControl/ReplaceEquipmentUIControl.cs	Mon Jan 17 19:43:47 2011 +0000
@@ -0,0 +1,60 @@
+//  This file (AddEquipmentUIControl.cs) is a part of the IBBoard.WarFoundry.GUI.GTK project and is copyright 2010 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 IBBoard.Commands;
+using IBBoard.WarFoundry.API.Commands;
+using IBBoard.WarFoundry.API.Objects;
+using IBBoard.WarFoundry.API.Util;
+using IBBoard.WarFoundry.GUI.GTK.UIControl.Interfaces;
+using CustomMath = IBBoard.CustomMath;
+
+namespace IBBoard.WarFoundry.GUI.GTK.UIControl
+{
+	public class ReplaceEquipmentUIControl : AbstractBaseEquipmentUIControl<IReplaceEquipmentUI>
+	{		
+		private UnitEquipmentItem origItem;
+		
+		public ReplaceEquipmentUIControl(Unit unit, UnitEquipmentItem equipmentItem, CommandStack commandStack) : base(unit, commandStack)
+		{
+			origItem = equipmentItem;
+		}
+
+		//TODO Make abstract
+
+		protected override IReplaceEquipmentUI CreateEquipmentUI()
+		{
+			return new FrmReplaceEquipment();
+		}
+
+		protected override void CompleteUISetup()
+		{			
+			UnitType unitType = unit.UnitType;
+			string[] mutexGroups = origItem.MutexGroups;
+			UnitEquipmentItem[] mutexItems = unitType.GetEquipmentItemsByExclusionGroups(mutexGroups);
+			UnitEquipmentItem[] currentEquipment = unit.GetEquipment();
+			UnitEquipmentItem[] allowedItems = Arrays.Subtract(mutexItems, currentEquipment);
+			ui.SetUnitEquipmentItems(allowedItems);
+			ui.UnitEquipmentItemChoiceChanged += HandleUiUnitEquipmentItemChoiceChanged;
+		}
+
+		private void HandleUiUnitEquipmentItemChoiceChanged(UnitEquipmentItem equip)
+		{
+			equipItem = equip;
+			SetUnitEquipmentLimits(equip);
+		}
+
+		protected override void DoProcessing()
+		{
+			if (isRatioAmount)
+			{
+				commandStack.Execute(new ReplaceUnitEquipmentWithRatioAmountItemCommand(unit, origItem, equipItem, equipmentAmount));
+			}
+			else
+			{
+				commandStack.Execute(new ReplaceUnitEquipmentWithRatioAmountItemCommand(unit, origItem, equipItem, (int)equipmentAmount));
+			}
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Util/GtkWarFoundryUtil.cs	Mon Jan 17 19:43:47 2011 +0000
@@ -0,0 +1,17 @@
+//  This file (GtkWarFoundryUtil.cs) is a part of the IBBoard.WarFoundry.GUI.GTK project and is copyright 2010 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 IBBoard.WarFoundry.API.Objects;
+using Gtk;
+namespace IBBoard.WarFoundry.GUI.GTK.Util
+{
+	public class GtkWarFoundryUtil
+	{
+		public static void RenderWarFoundryObjectName(TreeViewColumn column, CellRenderer cell, TreeModel model, TreeIter iter)
+		{
+			WarFoundryObject equip = (WarFoundryObject)model.GetValue(iter, 0);
+			(cell as CellRendererText).Text = equip.Name;
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WarFoundry-GTK.exe.log4net	Mon Jan 17 19:43:47 2011 +0000
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<log4net>
+	<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
+		<layout type="log4net.Layout.PatternLayout">
+			<conversionPattern value="%-5p [%d{HH:MM:ss}]: %C{1}.%M() - Line: %L - %m%n" />
+		</layout>
+	</appender>
+	<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
+		<file value="logs/WarFoundry.log" />
+		<appendToFile value="false" />
+		<rollingStyle value="Size" />
+		<maxSizeRollBackups value="-1" />
+		<maximumFileSize value="100MB" />
+		<layout type="log4net.Layout.PatternLayout">
+			<conversionPattern value="%-5p [%d{HH:MM:ss}]: %C{1}.%M() - Line: %L - %m%n" />
+		</layout>
+	</appender>
+	<root>
+		<level value="DEBUG" />
+		<appender-ref ref="ConsoleAppender" />
+		<appender-ref ref="RollingLogFileAppender" />
+	</root>
+</log4net>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WarFoundry-GTKPref.xml	Mon Jan 17 19:43:47 2011 +0000
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE preferences[
+  <!ELEMENT preference (CDATA|preferenceArr+)> 
+  <!ELEMENT preferenceArr (CDATA)>
+  <!ATTLIST preference id ID #REQUIRED>
+  <!ATTLIST preference type CDATA #REQUIRED>
+  <!ATTLIST preferenceArr id ID #REQUIRED>
+]>
+<preferences>
+<preference id="language" type="System.String">en</preference>
+<preference id="currSystem" type="System.String"></preference>
+<preference id="logLevel" type="System.String">Info</preference>
+</preferences>
--- a/WarFoundryGTK.exe.log4net	Sun Jan 31 20:46:06 2010 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<log4net>
-	<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
-		<layout type="log4net.Layout.PatternLayout">
-			<conversionPattern value="%-5p [%d{HH:MM:ss}]: %C{1}.%M() - Line: %L - %m%n" />
-		</layout>
-	</appender>
-	<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
-		<file value="logs/WarFoundry.log" />
-		<appendToFile value="false" />
-		<rollingStyle value="Size" />
-		<maxSizeRollBackups value="-1" />
-		<maximumFileSize value="100MB" />
-		<layout type="log4net.Layout.PatternLayout">
-			<conversionPattern value="%-5p [%d{HH:MM:ss}]: %C{1}.%M() - Line: %L - %m%n" />
-		</layout>
-	</appender>
-	<root>
-		<level value="DEBUG" />
-		<appender-ref ref="ConsoleAppender" />
-		<appender-ref ref="RollingLogFileAppender" />
-	</root>
-</log4net>
--- a/WarFoundryGTKPref.xml	Sun Jan 31 20:46:06 2010 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!DOCTYPE preferences[
-  <!ELEMENT preference (CDATA|preferenceArr+)> 
-  <!ELEMENT preferenceArr (CDATA)>
-  <!ATTLIST preference id ID #REQUIRED>
-  <!ATTLIST preference type CDATA #REQUIRED>
-  <!ATTLIST preferenceArr id ID #REQUIRED>
-]>
-<preferences>
-<preference id="language" type="System.String">en</preference>
-<preference id="currSystem" type="System.String"></preference>
-<preference id="logLevel" type="System.String">Info</preference>
-</preferences>
--- a/Widgets/UnitDisplayWidget.cs	Sun Jan 31 20:46:06 2010 +0000
+++ b/Widgets/UnitDisplayWidget.cs	Mon Jan 17 19:43:47 2011 +0000
@@ -5,143 +5,389 @@
 using System;
 using Gtk;
 using IBBoard.Commands;
+using IBBoard.GtkSharp;
 using IBBoard.Lang;
 using IBBoard.WarFoundry.API;
+using IBBoard.WarFoundry.API.Commands;
 using IBBoard.WarFoundry.API.Objects;
-using IBBoard.WarFoundry.API.Commands;
+using IBBoard.WarFoundry.API.Util;
+using IBBoard.WarFoundry.GUI.GTK.UIControl;
+using log4net;
+using WFObjects = IBBoard.WarFoundry.API.Objects;
+using System.Collections.Generic;
+using IBBoard.GtkSharp.Translatable;
 
-namespace IBBoard.WarFoundry.GTK.Widgets
+namespace IBBoard.WarFoundry.GUI.GTK.Widgets
 {
 	[System.ComponentModel.Category("WarFoundry GTK# GUI")]
 	[System.ComponentModel.ToolboxItem(true)]
 	public partial class UnitDisplayWidget : Gtk.Bin
-	{		
-		private IBBoard.WarFoundry.API.Objects.Unit unit;
+	{
+		private static ILog log = LogManager.GetLogger(typeof(UnitDisplayWidget));
+		private WFObjects.Unit unit;
 		private CommandStack stack;
-		
-		public UnitDisplayWidget(IBBoard.WarFoundry.API.Objects.Unit sourceUnit, CommandStack commandStack)
+		private Dictionary<string, NodeView> statsViews = new Dictionary<string, NodeView>();
+
+		public UnitDisplayWidget(WFObjects.Unit sourceUnit, CommandStack commandStack)
 		{
 			this.Build();
 			stack = commandStack;
 			unit = sourceUnit;
 			unitName.Text = unit.Name;
 			unitSize.Value = unit.Size;
-			double max = unit.UnitType.MaxSize;
+			int maxSize = (unit.UnitType.MaxSize == WarFoundryCore.INFINITY ? int.MaxValue : unit.UnitType.MaxSize);
+			int minSize = unit.UnitType.MinSize;
+			unitSize.SetRange(minSize, maxSize);
+			unitSize.Sensitive = (maxSize != minSize);
+			notesView.Buffer.Text = unit.UnitType.Notes;
+			unit.NameChanged += UnitNameChanged;
+			unit.UnitSizeChanged += UnitSizeChanged;
+			unit.UnitEquipmentAmountChanged += HandleUnitUnitEquipmentAmountChanged;
+			equipmentList.Selection.Changed += HandleEquipmentListSelectionChanged;
+			SetAbilities();
+			SetStats();
+			SetWeapons();
+			SetAddButtonEnabledState();
+			ControlTranslator.TranslateWidget(this);
+		}
+
+		private void HandleEquipmentListSelectionChanged(object sender, EventArgs e)
+		{
+			SetButtonsEnabledState();	
+		}
+
+		private void SetButtonsEnabledState()
+		{			
+			UnitEquipmentItem equipItem = GetSelectedEquipmentItem();
+			bttnReplaceWeapon.Sensitive = (equipItem != null && equipItem.HasAlternatives());
+			bttnEditWeapon.Sensitive = (UnitEquipmentUtil.CanEditEquipmentAmount(unit, equipItem));
+			bttnRemoveWeapon.Sensitive = (equipItem != null && !equipItem.IsRequired);
+		}
+
+		private void SetAddButtonEnabledState()
+		{
+			bttnAddWeapon.Sensitive = AddEquipmentUIControl.HasEquipmentToAdd(unit);
+		}
+
+		private UnitEquipmentItem GetSelectedEquipmentItem()
+		{
+			return (UnitEquipmentItem)TreeUtils.GetSelectedItem(equipmentList);
+		}
+
+		private void SetAbilities()
+		{
+			CellRendererText renderer = new CellRendererText();
+			abilitiesList.AppendColumn("", renderer, new TreeCellDataFunc(RenderAbility));
 			
-			if (max == -1)
+			ListStore model = new ListStore(typeof(Ability));
+			
+			foreach (Ability ability in unit.UnitType.GetRequiredAbilities())
 			{
-				max = double.MaxValue;
+				model.AppendValues(ability);
 			}
 			
-			unitSize.SetRange(unit.UnitType.MinSize, max);
-			unit.NameChanged+= new StringValChangedDelegate(UnitNameChanged);
-			unit.UnitSizeChanged+= new IntValChangedDelegate(UnitSizeChanged);
-			SetStats();
+			abilitiesList.Model = model;
+		}
+
+		public void RenderAbility(TreeViewColumn column, CellRenderer cell, TreeModel model, TreeIter iter)
+		{
+			object o = model.GetValue(iter, 0);
+			
+			if (o is Ability)
+			{
+				Ability ability = (Ability)o;
+				(cell as CellRendererText).Text = ability.Name;
+			}			
+						
 		}
 
 		private void SetStats()
 		{
-            //GameSystem system = unit.Army.GameSystem;
-            //SystemStats stats = system.StandardSystemStats;
-            CellRendererText renderer = new CellRendererText();
-            unitStats.AppendColumn(Translation.GetTranslation("UnitNameColumn", "Unit Type", null), renderer, new TreeCellDataFunc(RenderUnitName));
-            
-            TreeCellDataFunc statFunc = new TreeCellDataFunc(RenderUnitStat);
-            Stat[] stats = unit.UnitStatsArray;
-			
-			int length = stats.Length;
+			Stat[][] stats = unit.UnitStatsArraysWithName;
+			string[] statsIDs = unit.UnitStatsArrayIDs;
+			int statsCount = stats.Length;
+			log.DebugFormat("Unit {0} has {1} stats arrays", unit.UnitType.Name, statsCount);
 
-			for (int i = 0; i < length; i++)
+			for (int i = 0; i < statsCount; i++)
 			{
-	            unitStats.AppendColumn(stats[i].ParentSlotName, renderer, statFunc);
+				NodeView statsGrid = GetStatsView(statsIDs[i]);
+				TreeStore model = (TreeStore)statsGrid.Model;
+				log.DebugFormat("Adding row to data table for {0}", statsIDs[i]);
+				log.DebugFormat("TreeStore supports {0} columns", model.NColumns);
+				model.AppendValues((object)stats[i]);
+			}
+		}
+
+		private NodeView GetStatsView(string statsID)
+		{
+			NodeView statsView;
+
+			if (statsViews.ContainsKey(statsID))
+			{
+				statsView = DictionaryUtils.GetValue(statsViews, statsID);
+			}
+			else
+			{
+				statsView = CreateStatsView(statsID);
+				statsViews[statsID] = statsView;
 			}
 
-			TreeStore model = new TreeStore(typeof(IBBoard.WarFoundry.API.Objects.Unit));
-			model.AppendValues(unit);
-			unitStats.Model = model;
+			return statsView;
 		}
-		
-		private void RenderUnitName(TreeViewColumn column, CellRenderer cell, TreeModel model, TreeIter iter)
+
+		private NodeView CreateStatsView(string statsID)
 		{
-			object o = model.GetValue(iter, 0);
-			
-			if (o is IBBoard.WarFoundry.API.Objects.Unit)
+			log.DebugFormat("Create NodeView for stats ID {0}", statsID);
+			SystemStats sysStats = unit.Race.GameSystem.GetSystemStatsForID(statsID);
+			StatSlot[] sysStatSlots = sysStats.StatSlots;
+			int statsCount = sysStatSlots.Length;
+			NodeView statsGrid = CreateNodeView();
+			CellRendererText renderer = new CellRendererText();
+			statsGrid.AppendColumn(Translation.GetTranslation("UnitNameColumn", "Unit Type", null), renderer, RenderUnitStat);
+
+			for (int i = 0; i < statsCount; i++)
 			{
-				IBBoard.WarFoundry.API.Objects.Unit u = (IBBoard.WarFoundry.API.Objects.Unit)o;				
-				(cell as CellRendererText).Text = u.UnitType.Name;
+				StatSlot stat = sysStatSlots[i];
+				string slotName = stat.Name;
+				statsGrid.AppendColumn(slotName, renderer, RenderUnitStat);
 			}
+			
+			statsGrid.Model = new TreeStore(typeof(Stat[]));
+			return statsGrid;
 		}
-		
+
+		private NodeView CreateNodeView()
+		{
+			NodeView nodeView = new NodeView();
+			statsRepeatBox.Add(nodeView);
+			return nodeView;
+		}
+
 		private void RenderUnitStat(TreeViewColumn column, CellRenderer cell, TreeModel model, TreeIter iter)
 		{
 			object o = model.GetValue(iter, 0);
 			
-			if (o is IBBoard.WarFoundry.API.Objects.Unit)
+			if (o is Stat[])
 			{
-				IBBoard.WarFoundry.API.Objects.Unit u = (IBBoard.WarFoundry.API.Objects.Unit)o;
-				(cell as CellRendererText).Text = u.GetStatValue(column.Title);
+				Stat[] stats = (Stat[])o;
+				(cell as CellRendererText).Text = stats[GetStatColumnIndex(column)].SlotValueString;
 			}
 		}
 
-		public IBBoard.WarFoundry.API.Objects.Unit Unit
+		private int GetStatColumnIndex(TreeViewColumn column)
+		{
+			int idx = -1;
+			TreeViewColumn[] cols = ((TreeView)column.TreeView).Columns;
+			int colCount = cols.Length;
+			
+			for (int i = 0; i < colCount; i++)
+			{
+				if (cols[i] == column)
+				{
+					idx = i;
+					break;
+				}
+			}
+			
+			return idx;
+		}
+
+		private void SetWeapons()
+		{
+			CellRendererText renderer = new CellRendererText();
+			equipmentList.AppendColumn("", renderer, new TreeCellDataFunc(RenderEquipmentLine));
+			
+			ListStore model = new ListStore(typeof(UnitEquipmentItem));
+			
+			foreach (UnitEquipmentItem item in unit.GetEquipment())
+			{
+				model.AppendValues(item);
+			}
+			
+			equipmentList.Model = model;
+		}
+
+		public void RenderEquipmentLine(TreeViewColumn column, CellRenderer cell, TreeModel model, TreeIter iter)
+		{
+			object o = model.GetValue(iter, 0);
+			
+			if (o is UnitEquipmentItem)
+			{
+				UnitEquipmentItem item = (UnitEquipmentItem)o;
+				(cell as CellRendererText).Text = GetUnitEquipmentText(item);
+			}			
+						
+		}
+
+		private string GetUnitEquipmentText(UnitEquipmentItem item)
+		{
+			string translation = "";
+
+			if (item.Cost == 0)
+			{
+				translation = Translation.GetTranslation("equipmentAmountWithZeroCost", "{0} ({1} - free)", item.Name, GetAmountString(item));
+			}
+			else
+			{
+				translation = Translation.GetTranslation("equipmentAmountWithCost", "{0} ({1} at {2}pts each)", item.Name, GetAmountString(item), item.Cost);
+			}
+
+			return translation;
+		}
+
+		private string GetAmountString(UnitEquipmentItem item)
+		{
+			double amount = UnitEquipmentUtil.GetEquipmentAmount(unit, item);
+			string amountString = "";
+			
+			if (UnitEquipmentUtil.GetEquipmentAmountIsRatio(unit, item))
+			{
+				int number = UnitEquipmentUtil.GetEquipmentAmountTaken(unit, item);
+				
+				if (amount == 100)
+				{
+					amountString = Translation.GetTranslation("equipmentChoiceAmountAll", "all ({1})", amount, number);
+				}
+				else
+				{
+					amountString = Translation.GetTranslation("equipmentChoiceAmountPercentage", "{0}% ({1})", amount, number);
+				}
+			}
+			else
+			{
+				amountString = Translation.GetTranslation("equipmentChoiceAmountNumber", "{0}", amount);
+			}
+			
+			return amountString;
+		}
+
+		public WFObjects.Unit Unit
 		{
 			get { return unit; }
 		}
-		
+
 		private void UnitNameChanged(WarFoundryObject obj, string oldValue, string newValue)
 		{
 			unitName.Text = newValue;
 		}
-		
+
 		private void UnitSizeChanged(WarFoundryObject obj, int oldValue, int newValue)
 		{
 			unitSize.Value = newValue;
 		}
 
-		protected virtual void OnUnitSizeFocusOut (object o, Gtk.FocusOutEventArgs args)
+		private void HandleUnitUnitEquipmentAmountChanged(WarFoundryObject obj, double oldValue, double newValue)
+		{
+			if (oldValue == 0)
+			{
+				((ListStore)equipmentList.Model).AppendValues(obj);
+			}
+			else
+			{
+				if (newValue == 0)
+				{
+					TreeIter treeIter = TreeUtils.GetItemIter(equipmentList, obj);
+					((ListStore)equipmentList.Model).Remove(ref treeIter);
+				}
+			}
+
+			SetAddButtonEnabledState();
+			equipmentList.QueueDraw();
+		}
+
+		protected virtual void OnUnitSizeFocusOut(object o, Gtk.FocusOutEventArgs args)
 		{
 			SetNewUnitSize();
 		}
 
 		[GLib.ConnectBefore ()]
-		protected virtual void OnUnitSizeKeyPress (object o, Gtk.KeyPressEventArgs args)
+
+		protected virtual void OnUnitSizeKeyPress(object o, Gtk.KeyPressEventArgs args)
 		{
-			if (args.Event.Key == Gdk.Key.Return)
+			if (args.Event.Key == Gdk.Key.Return || args.Event.Key == Gdk.Key.KP_Enter)
 			{
 				SetNewUnitSize();
 			}
 		}
-		
+
 		private void SetNewUnitSize()
 		{
-			if (unitSize.Value!=unit.Size)
+			if (unitSize.Value != unit.Size)
 			{
 				SetUnitSizeCommand cmd = new SetUnitSizeCommand(unit, (int)Math.Round(unitSize.Value));
 				stack.Execute(cmd);
 			}
 		}
 
-		protected virtual void OnUnitNameFocusOut (object o, Gtk.FocusOutEventArgs args)
+		protected virtual void OnUnitNameFocusOut(object o, Gtk.FocusOutEventArgs args)
 		{
 			SetNewUnitName();
 		}
 
 		[GLib.ConnectBefore ()]
-		protected virtual void OnUnitNameKeyPress (object o, Gtk.KeyPressEventArgs args)
+
+		protected virtual void OnUnitNameKeyPress(object o, Gtk.KeyPressEventArgs args)
 		{
-			if (args.Event.Key == Gdk.Key.Return)
+			if (args.Event.Key == Gdk.Key.Return || args.Event.Key == Gdk.Key.KP_Enter)
 			{
 				SetNewUnitName();
 			}
 		}
-		
+
 		private void SetNewUnitName()
 		{
-			if (unitName.Text!=unit.Name)
+			if (unitName.Text != unit.Name)
 			{
 				SetNameCommand cmd = new SetNameCommand(unit, unitName.Text);
 				stack.Execute(cmd);
 			}
 		}
+
+		private void OnBttnAddEquipmentClicked(object sender, System.EventArgs e)
+		{
+			AddEquipment();
+		}
+
+		private void AddEquipment()
+		{
+			AddEquipmentUIControl addEquipment = new AddEquipmentUIControl(unit, stack);
+			addEquipment.Show();
+		}
+
+		protected virtual void HandleRemoveButtonActivated(object sender, System.EventArgs e)
+		{
+			UnitEquipmentItem item = GetSelectedEquipmentItem();
+			log.Debug("Remove " + item);
+				
+			if (item != null)
+			{
+				SetUnitEquipmentNumericAmountCommand cmd = new SetUnitEquipmentNumericAmountCommand(unit, item, 0);
+				stack.Execute(cmd);
+			}
+		}		
+
+		protected virtual void HandleEditButtonClicked(object sender, System.EventArgs e)
+		{
+			UnitEquipmentItem item = GetSelectedEquipmentItem();
+			log.Debug("Edit " + item);
+			
+			if (item != null)
+			{
+				EditEquipmentUIControl editEquipment = new EditEquipmentUIControl(unit, item, stack);
+				editEquipment.Show();
+			}
+		}
+
+		protected virtual void HandleReplaceButtonClicked(object sender, System.EventArgs e)
+		{
+			UnitEquipmentItem item = GetSelectedEquipmentItem();
+			log.Debug("Replace " + item);
+				
+			if (item != null)
+			{
+				ReplaceEquipmentUIControl addEquipment = new ReplaceEquipmentUIControl(unit, item, stack);
+				addEquipment.Show();
+			}
+		}		
 	}
-}
+}
\ No newline at end of file
--- a/gtk-gui/IBBoard.WarFoundry.GTK.FrmMainWindow.cs	Sun Jan 31 20:46:06 2010 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,240 +0,0 @@
-// ------------------------------------------------------------------------------
-//  <autogenerated>
-//      This code was generated by a tool.
-//      
-// 
-//      Changes to this file may cause incorrect behavior and will be lost if 
-//      the code is regenerated.
-//  </autogenerated>
-// ------------------------------------------------------------------------------
-
-namespace IBBoard.WarFoundry.GTK {
-    
-    
-    public partial class FrmMainWindow {
-        
-        private Gtk.UIManager UIManager;
-        
-        private Gtk.Action menuFile;
-        
-        private Gtk.Action miCreateArmy;
-        
-        private Gtk.Action miOpenArmy;
-        
-        private Gtk.Action miSaveArmy;
-        
-        private Gtk.Action miSaveArmyAs;
-        
-        private Gtk.Action miCloseArmy;
-        
-        private Gtk.Action miReloadFiles;
-        
-        private Gtk.Action miExit;
-        
-        private Gtk.Action menuEdit;
-        
-        private Gtk.Action miUndo;
-        
-        private Gtk.Action miRedo;
-        
-        private Gtk.Action menuHelp;
-        
-        private Gtk.Action miAbout;
-        
-        private Gtk.Action miDebugInformation;
-        
-        private Gtk.Action newArmyButton;
-        
-        private Gtk.Action openArmyButton;
-        
-        private Gtk.Action saveArmyButton;
-        
-        private Gtk.Action undoActionButton;
-        
-        private Gtk.Action redoActionButton;
-        
-        private Gtk.Action goDown;
-        
-        private Gtk.Action add;
-        
-        private Gtk.Action miExportArmy;
-        
-        private Gtk.Action miExportAsBasicHtml;
-        
-        private Gtk.VBox vbox1;
-        
-        private Gtk.MenuBar menubar1;
-        
-        private Gtk.Toolbar toolbar;
-        
-        private Gtk.HPaned hpaned2;
-        
-        private Gtk.TreeView treeUnits;
-        
-        private Gtk.Notebook unitsNotebook;
-        
-        private Gtk.Statusbar statusbar1;
-        
-        protected virtual void Build() {
-            Stetic.Gui.Initialize(this);
-            // Widget IBBoard.WarFoundry.GTK.FrmMainWindow
-            this.UIManager = new Gtk.UIManager();
-            Gtk.ActionGroup w1 = new Gtk.ActionGroup("Default");
-            this.menuFile = new Gtk.Action("menuFile", Mono.Unix.Catalog.GetString("File"), null, null);
-            this.menuFile.ShortLabel = Mono.Unix.Catalog.GetString("File");
-            w1.Add(this.menuFile, null);
-            this.miCreateArmy = new Gtk.Action("miCreateArmy", Mono.Unix.Catalog.GetString("Create army"), null, "gtk-new");
-            this.miCreateArmy.ShortLabel = Mono.Unix.Catalog.GetString("Create army");
-            w1.Add(this.miCreateArmy, null);
-            this.miOpenArmy = new Gtk.Action("miOpenArmy", Mono.Unix.Catalog.GetString("Open army"), null, "gtk-open");
-            this.miOpenArmy.ShortLabel = Mono.Unix.Catalog.GetString("Open army");
-            w1.Add(this.miOpenArmy, null);
-            this.miSaveArmy = new Gtk.Action("miSaveArmy", Mono.Unix.Catalog.GetString("Save army"), null, "gtk-save");
-            this.miSaveArmy.Sensitive = false;
-            this.miSaveArmy.ShortLabel = Mono.Unix.Catalog.GetString("Save army");
-            w1.Add(this.miSaveArmy, null);
-            this.miSaveArmyAs = new Gtk.Action("miSaveArmyAs", Mono.Unix.Catalog.GetString("Save army as"), null, "gtk-save-as");
-            this.miSaveArmyAs.Sensitive = false;
-            this.miSaveArmyAs.ShortLabel = Mono.Unix.Catalog.GetString("Save army as");
-            w1.Add(this.miSaveArmyAs, null);
-            this.miCloseArmy = new Gtk.Action("miCloseArmy", Mono.Unix.Catalog.GetString("Close army"), null, "gtk-close");
-            this.miCloseArmy.Sensitive = false;
-            this.miCloseArmy.ShortLabel = Mono.Unix.Catalog.GetString("Close army");
-            w1.Add(this.miCloseArmy, null);
-            this.miReloadFiles = new Gtk.Action("miReloadFiles", Mono.Unix.Catalog.GetString("Reload files"), null, "gtk-refresh");
-            this.miReloadFiles.Sensitive = false;
-            this.miReloadFiles.ShortLabel = Mono.Unix.Catalog.GetString("Reload files");
-            w1.Add(this.miReloadFiles, null);
-            this.miExit = new Gtk.Action("miExit", Mono.Unix.Catalog.GetString("Exit"), null, "gtk-quit");
-            this.miExit.ShortLabel = Mono.Unix.Catalog.GetString("Exit");
-            w1.Add(this.miExit, null);
-            this.menuEdit = new Gtk.Action("menuEdit", Mono.Unix.Catalog.GetString("Edit"), null, null);
-            this.menuEdit.ShortLabel = Mono.Unix.Catalog.GetString("Edit");
-            w1.Add(this.menuEdit, null);
-            this.miUndo = new Gtk.Action("miUndo", Mono.Unix.Catalog.GetString("Undo"), null, "gtk-undo");
-            this.miUndo.Sensitive = false;
-            this.miUndo.ShortLabel = Mono.Unix.Catalog.GetString("Undo");
-            w1.Add(this.miUndo, null);
-            this.miRedo = new Gtk.Action("miRedo", Mono.Unix.Catalog.GetString("Redo"), null, "gtk-redo");
-            this.miRedo.Sensitive = false;
-            this.miRedo.ShortLabel = Mono.Unix.Catalog.GetString("Redo");
-            w1.Add(this.miRedo, null);
-            this.menuHelp = new Gtk.Action("menuHelp", Mono.Unix.Catalog.GetString("Help"), null, null);
-            this.menuHelp.ShortLabel = Mono.Unix.Catalog.GetString("Help");
-            w1.Add(this.menuHelp, null);
-            this.miAbout = new Gtk.Action("miAbout", Mono.Unix.Catalog.GetString("About"), null, "gtk-about");
-            this.miAbout.ShortLabel = Mono.Unix.Catalog.GetString("About");
-            w1.Add(this.miAbout, null);
-            this.miDebugInformation = new Gtk.Action("miDebugInformation", Mono.Unix.Catalog.GetString("Debug Information"), null, null);
-            this.miDebugInformation.ShortLabel = Mono.Unix.Catalog.GetString("Debug Information");
-            w1.Add(this.miDebugInformation, null);
-            this.newArmyButton = new Gtk.Action("newArmyButton", null, null, "gtk-new");
-            w1.Add(this.newArmyButton, null);
-            this.openArmyButton = new Gtk.Action("openArmyButton", null, null, "gtk-open");
-            w1.Add(this.openArmyButton, null);
-            this.saveArmyButton = new Gtk.Action("saveArmyButton", null, null, "gtk-save");
-            this.saveArmyButton.Sensitive = false;
-            w1.Add(this.saveArmyButton, null);
-            this.undoActionButton = new Gtk.Action("undoActionButton", null, null, "gtk-undo");
-            this.undoActionButton.Sensitive = false;
-            w1.Add(this.undoActionButton, null);
-            this.redoActionButton = new Gtk.Action("redoActionButton", null, null, "gtk-redo");
-            this.redoActionButton.Sensitive = false;
-            w1.Add(this.redoActionButton, null);
-            this.goDown = new Gtk.Action("goDown", null, null, null);
-            w1.Add(this.goDown, null);
-            this.add = new Gtk.Action("add", null, null, "gtk-add");
-            w1.Add(this.add, null);
-            this.miExportArmy = new Gtk.Action("miExportArmy", Mono.Unix.Catalog.GetString("Export army as..."), null, "gtk-convert");
-            this.miExportArmy.Sensitive = false;
-            this.miExportArmy.ShortLabel = Mono.Unix.Catalog.GetString("Export army");
-            w1.Add(this.miExportArmy, null);
-            this.miExportAsBasicHtml = new Gtk.Action("miExportAsBasicHtml", Mono.Unix.Catalog.GetString("Basic HTML"), null, null);
-            this.miExportAsBasicHtml.ShortLabel = Mono.Unix.Catalog.GetString("Basic HTML");
-            w1.Add(this.miExportAsBasicHtml, null);
-            this.UIManager.InsertActionGroup(w1, 0);
-            this.AddAccelGroup(this.UIManager.AccelGroup);
-            this.Name = "IBBoard.WarFoundry.GTK.FrmMainWindow";
-            this.Title = Mono.Unix.Catalog.GetString("MainWindow");
-            this.Icon = Gdk.Pixbuf.LoadFromResource("App.ico");
-            // Container child IBBoard.WarFoundry.GTK.FrmMainWindow.Gtk.Container+ContainerChild
-            this.vbox1 = new Gtk.VBox();
-            this.vbox1.Name = "vbox1";
-            // Container child vbox1.Gtk.Box+BoxChild
-            this.UIManager.AddUiFromString("<ui><menubar name='menubar1'><menu name='menuFile' action='menuFile'><menuitem name='miCreateArmy' action='miCreateArmy'/><menuitem name='miOpenArmy' action='miOpenArmy'/><menuitem name='miSaveArmy' action='miSaveArmy'/><menuitem name='miSaveArmyAs' action='miSaveArmyAs'/><menu name='miExportArmy' action='miExportArmy'><menuitem name='miExportAsBasicHtml' action='miExportAsBasicHtml'/></menu><menuitem name='miCloseArmy' action='miCloseArmy'/><separator/><menuitem name='miReloadFiles' action='miReloadFiles'/><separator/><menuitem name='miExit' action='miExit'/></menu><menu name='menuEdit' action='menuEdit'><menuitem name='miUndo' action='miUndo'/><menuitem name='miRedo' action='miRedo'/></menu><menu name='menuHelp' action='menuHelp'><menuitem name='miAbout' action='miAbout'/><menuitem name='miDebugInformation' action='miDebugInformation'/></menu></menubar></ui>");
-            this.menubar1 = ((Gtk.MenuBar)(this.UIManager.GetWidget("/menubar1")));
-            this.menubar1.Name = "menubar1";
-            this.vbox1.Add(this.menubar1);
-            Gtk.Box.BoxChild w2 = ((Gtk.Box.BoxChild)(this.vbox1[this.menubar1]));
-            w2.Position = 0;
-            w2.Expand = false;
-            w2.Fill = false;
-            // Container child vbox1.Gtk.Box+BoxChild
-            this.UIManager.AddUiFromString("<ui><toolbar name='toolbar'><toolitem name='newArmyButton' action='newArmyButton'/><toolitem name='openArmyButton' action='openArmyButton'/><toolitem name='saveArmyButton' action='saveArmyButton'/><separator/><toolitem name='undoActionButton' action='undoActionButton'/><toolitem name='redoActionButton' action='redoActionButton'/><separator/></toolbar></ui>");
-            this.toolbar = ((Gtk.Toolbar)(this.UIManager.GetWidget("/toolbar")));
-            this.toolbar.HeightRequest = 36;
-            this.toolbar.Name = "toolbar";
-            this.toolbar.ShowArrow = false;
-            this.toolbar.ToolbarStyle = ((Gtk.ToolbarStyle)(0));
-            this.toolbar.IconSize = ((Gtk.IconSize)(3));
-            this.vbox1.Add(this.toolbar);
-            Gtk.Box.BoxChild w3 = ((Gtk.Box.BoxChild)(this.vbox1[this.toolbar]));
-            w3.Position = 1;
-            w3.Expand = false;
-            w3.Fill = false;
-            // Container child vbox1.Gtk.Box+BoxChild
-            this.hpaned2 = new Gtk.HPaned();
-            this.hpaned2.CanFocus = true;
-            this.hpaned2.Name = "hpaned2";
-            this.hpaned2.Position = 178;
-            // Container child hpaned2.Gtk.Paned+PanedChild
-            this.treeUnits = new Gtk.TreeView();
-            this.treeUnits.CanFocus = true;
-            this.treeUnits.Name = "treeUnits";
-            this.hpaned2.Add(this.treeUnits);
-            Gtk.Paned.PanedChild w4 = ((Gtk.Paned.PanedChild)(this.hpaned2[this.treeUnits]));
-            w4.Resize = false;
-            // Container child hpaned2.Gtk.Paned+PanedChild
-            this.unitsNotebook = new Gtk.Notebook();
-            this.unitsNotebook.CanFocus = true;
-            this.unitsNotebook.Name = "unitsNotebook";
-            this.unitsNotebook.CurrentPage = -1;
-            this.hpaned2.Add(this.unitsNotebook);
-            this.vbox1.Add(this.hpaned2);
-            Gtk.Box.BoxChild w6 = ((Gtk.Box.BoxChild)(this.vbox1[this.hpaned2]));
-            w6.Position = 2;
-            // Container child vbox1.Gtk.Box+BoxChild
-            this.statusbar1 = new Gtk.Statusbar();
-            this.statusbar1.Name = "statusbar1";
-            this.statusbar1.Spacing = 2;
-            this.vbox1.Add(this.statusbar1);
-            Gtk.Box.BoxChild w7 = ((Gtk.Box.BoxChild)(this.vbox1[this.statusbar1]));
-            w7.Position = 3;
-            w7.Expand = false;
-            w7.Fill = false;
-            this.Add(this.vbox1);
-            if ((this.Child != null)) {
-                this.Child.ShowAll();
-            }
-            this.DefaultWidth = 832;
-            this.DefaultHeight = 659;
-            this.Show();
-            this.miCreateArmy.Activated += new System.EventHandler(this.OnCreateArmyActivated);
-            this.miOpenArmy.Activated += new System.EventHandler(this.OnOpenArmyActivated);
-            this.miSaveArmy.Activated += new System.EventHandler(this.OnSaveArmyActivated);
-            this.miSaveArmyAs.Activated += new System.EventHandler(this.OnSaveArmyAsActivated);
-            this.miCloseArmy.Activated += new System.EventHandler(this.OnCloseArmyActivated);
-            this.miReloadFiles.Activated += new System.EventHandler(this.OnReloadFilesActivated);
-            this.miExit.Activated += new System.EventHandler(this.OnExitActivated);
-            this.newArmyButton.Activated += new System.EventHandler(this.newTBButtonActivated);
-            this.openArmyButton.Activated += new System.EventHandler(this.openTBButtonActivated);
-            this.saveArmyButton.Activated += new System.EventHandler(this.saveTBButtonActivated);
-            this.undoActionButton.Activated += new System.EventHandler(this.undoTBButtonActivated);
-            this.redoActionButton.Activated += new System.EventHandler(this.redoTBButtonActivated);
-            this.miExportAsBasicHtml.Activated += new System.EventHandler(this.OnMiExportAsBasicHtmlActivated);
-            this.treeUnits.RowActivated += new Gtk.RowActivatedHandler(this.ArmyRowActivated);
-            this.treeUnits.PopupMenu += new Gtk.PopupMenuHandler(this.OnTreeUnitsPopupMenu);
-            this.treeUnits.ButtonPressEvent += new Gtk.ButtonPressEventHandler(this.UnitTreeButtonPressed);
-        }
-    }
-}
--- a/gtk-gui/IBBoard.WarFoundry.GTK.FrmNewArmy.cs	Sun Jan 31 20:46:06 2010 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,236 +0,0 @@
-// ------------------------------------------------------------------------------
-//  <autogenerated>
-//      This code was generated by a tool.
-//      
-// 
-//      Changes to this file may cause incorrect behavior and will be lost if 
-//      the code is regenerated.
-//  </autogenerated>
-// ------------------------------------------------------------------------------
-
-namespace IBBoard.WarFoundry.GTK {
-    
-    
-    public partial class FrmNewArmy {
-        
-        private Gtk.Table table1;
-        
-        private Gtk.ScrolledWindow GtkScrolledWindow;
-        
-        private Gtk.TreeView lstRaces;
-        
-        private Gtk.HBox hbox2;
-        
-        private Gtk.SpinButton sbPointsValue;
-        
-        private Gtk.Label label1;
-        
-        private Gtk.Label label2;
-        
-        private Gtk.Label label3;
-        
-        private Gtk.Label label4;
-        
-        private Gtk.ComboBoxEntry systemCombo;
-        
-        private Gtk.Entry txtArmyName;
-        
-        private Gtk.Button bttnCancel;
-        
-        private Gtk.Button bttnCreate;
-        
-        protected virtual void Build() {
-            Stetic.Gui.Initialize(this);
-            // Widget IBBoard.WarFoundry.GTK.FrmNewArmy
-            this.Events = ((Gdk.EventMask)(256));
-            this.Name = "IBBoard.WarFoundry.GTK.FrmNewArmy";
-            this.Title = Mono.Unix.Catalog.GetString("Create new army");
-            this.Icon = Stetic.IconLoader.LoadIcon(this, "gtk-new", Gtk.IconSize.Menu, 16);
-            this.WindowPosition = ((Gtk.WindowPosition)(4));
-            this.SkipPagerHint = true;
-            this.SkipTaskbarHint = true;
-            // Internal child IBBoard.WarFoundry.GTK.FrmNewArmy.VBox
-            Gtk.VBox w1 = this.VBox;
-            w1.CanFocus = true;
-            w1.Events = ((Gdk.EventMask)(256));
-            w1.Name = "dialog_VBox";
-            w1.BorderWidth = ((uint)(2));
-            // Container child dialog_VBox.Gtk.Box+BoxChild
-            this.table1 = new Gtk.Table(((uint)(4)), ((uint)(2)), false);
-            this.table1.Name = "table1";
-            this.table1.RowSpacing = ((uint)(6));
-            this.table1.ColumnSpacing = ((uint)(6));
-            // Container child table1.Gtk.Table+TableChild
-            this.GtkScrolledWindow = new Gtk.ScrolledWindow();
-            this.GtkScrolledWindow.Name = "GtkScrolledWindow";
-            this.GtkScrolledWindow.ShadowType = ((Gtk.ShadowType)(1));
-            // Container child GtkScrolledWindow.Gtk.Container+ContainerChild
-            this.lstRaces = new Gtk.TreeView();
-            this.lstRaces.HeightRequest = 150;
-            this.lstRaces.CanFocus = true;
-            this.lstRaces.Name = "lstRaces";
-            this.lstRaces.HeadersVisible = false;
-            this.lstRaces.RulesHint = true;
-            this.GtkScrolledWindow.Add(this.lstRaces);
-            this.table1.Add(this.GtkScrolledWindow);
-            Gtk.Table.TableChild w3 = ((Gtk.Table.TableChild)(this.table1[this.GtkScrolledWindow]));
-            w3.TopAttach = ((uint)(1));
-            w3.BottomAttach = ((uint)(2));
-            w3.LeftAttach = ((uint)(1));
-            w3.RightAttach = ((uint)(2));
-            w3.XOptions = ((Gtk.AttachOptions)(4));
-            w3.YOptions = ((Gtk.AttachOptions)(4));
-            // Container child table1.Gtk.Table+TableChild
-            this.hbox2 = new Gtk.HBox();
-            this.hbox2.Name = "hbox2";
-            // Container child hbox2.Gtk.Box+BoxChild
-            this.sbPointsValue = new Gtk.SpinButton(0, 2000000000, 100);
-            this.sbPointsValue.WidthRequest = 150;
-            this.sbPointsValue.CanFocus = true;
-            this.sbPointsValue.Name = "sbPointsValue";
-            this.sbPointsValue.Adjustment.PageIncrement = 1000;
-            this.sbPointsValue.ClimbRate = 100;
-            this.sbPointsValue.Numeric = true;
-            this.sbPointsValue.Value = 1000;
-            this.hbox2.Add(this.sbPointsValue);
-            Gtk.Box.BoxChild w4 = ((Gtk.Box.BoxChild)(this.hbox2[this.sbPointsValue]));
-            w4.Position = 0;
-            w4.Expand = false;
-            w4.Fill = false;
-            this.table1.Add(this.hbox2);
-            Gtk.Table.TableChild w5 = ((Gtk.Table.TableChild)(this.table1[this.hbox2]));
-            w5.TopAttach = ((uint)(3));
-            w5.BottomAttach = ((uint)(4));
-            w5.LeftAttach = ((uint)(1));
-            w5.RightAttach = ((uint)(2));
-            w5.XOptions = ((Gtk.AttachOptions)(4));
-            w5.YOptions = ((Gtk.AttachOptions)(4));
-            // Container child table1.Gtk.Table+TableChild
-            this.label1 = new Gtk.Label();
-            this.label1.Name = "label1";
-            this.label1.LabelProp = Mono.Unix.Catalog.GetString("Race");
-            this.table1.Add(this.label1);
-            Gtk.Table.TableChild w6 = ((Gtk.Table.TableChild)(this.table1[this.label1]));
-            w6.TopAttach = ((uint)(1));
-            w6.BottomAttach = ((uint)(2));
-            w6.XOptions = ((Gtk.AttachOptions)(4));
-            w6.YOptions = ((Gtk.AttachOptions)(4));
-            // Container child table1.Gtk.Table+TableChild
-            this.label2 = new Gtk.Label();
-            this.label2.Name = "label2";
-            this.label2.LabelProp = Mono.Unix.Catalog.GetString("Army name");
-            this.table1.Add(this.label2);
-            Gtk.Table.TableChild w7 = ((Gtk.Table.TableChild)(this.table1[this.label2]));
-            w7.TopAttach = ((uint)(2));
-            w7.BottomAttach = ((uint)(3));
-            w7.XOptions = ((Gtk.AttachOptions)(4));
-            w7.YOptions = ((Gtk.AttachOptions)(4));
-            // Container child table1.Gtk.Table+TableChild
-            this.label3 = new Gtk.Label();
-            this.label3.Name = "label3";
-            this.label3.LabelProp = Mono.Unix.Catalog.GetString("Points value");
-            this.table1.Add(this.label3);
-            Gtk.Table.TableChild w8 = ((Gtk.Table.TableChild)(this.table1[this.label3]));
-            w8.TopAttach = ((uint)(3));
-            w8.BottomAttach = ((uint)(4));
-            w8.XOptions = ((Gtk.AttachOptions)(4));
-            w8.YOptions = ((Gtk.AttachOptions)(4));
-            // Container child table1.Gtk.Table+TableChild
-            this.label4 = new Gtk.Label();
-            this.label4.Name = "label4";
-            this.label4.LabelProp = Mono.Unix.Catalog.GetString("game system");
-            this.table1.Add(this.label4);
-            Gtk.Table.TableChild w9 = ((Gtk.Table.TableChild)(this.table1[this.label4]));
-            w9.XOptions = ((Gtk.AttachOptions)(4));
-            w9.YOptions = ((Gtk.AttachOptions)(4));
-            // Container child table1.Gtk.Table+TableChild
-            this.systemCombo = Gtk.ComboBoxEntry.NewText();
-            this.systemCombo.Name = "systemCombo";
-            this.table1.Add(this.systemCombo);
-            Gtk.Table.TableChild w10 = ((Gtk.Table.TableChild)(this.table1[this.systemCombo]));
-            w10.LeftAttach = ((uint)(1));
-            w10.RightAttach = ((uint)(2));
-            w10.YOptions = ((Gtk.AttachOptions)(4));
-            // Container child table1.Gtk.Table+TableChild
-            this.txtArmyName = new Gtk.Entry();
-            this.txtArmyName.CanFocus = true;
-            this.txtArmyName.Name = "txtArmyName";
-            this.txtArmyName.IsEditable = true;
-            this.txtArmyName.InvisibleChar = '•';
-            this.table1.Add(this.txtArmyName);
-            Gtk.Table.TableChild w11 = ((Gtk.Table.TableChild)(this.table1[this.txtArmyName]));
-            w11.TopAttach = ((uint)(2));
-            w11.BottomAttach = ((uint)(3));
-            w11.LeftAttach = ((uint)(1));
-            w11.RightAttach = ((uint)(2));
-            w11.XOptions = ((Gtk.AttachOptions)(4));
-            w11.YOptions = ((Gtk.AttachOptions)(4));
-            w1.Add(this.table1);
-            Gtk.Box.BoxChild w12 = ((Gtk.Box.BoxChild)(w1[this.table1]));
-            w12.Position = 0;
-            w12.Expand = false;
-            w12.Fill = false;
-            w12.Padding = ((uint)(6));
-            // Internal child IBBoard.WarFoundry.GTK.FrmNewArmy.ActionArea
-            Gtk.HButtonBox w13 = this.ActionArea;
-            w13.CanFocus = true;
-            w13.Events = ((Gdk.EventMask)(256));
-            w13.Name = "WarFoundrySharp.FrmNewArmy_ActionArea";
-            w13.Spacing = 6;
-            w13.BorderWidth = ((uint)(5));
-            w13.LayoutStyle = ((Gtk.ButtonBoxStyle)(4));
-            // Container child WarFoundrySharp.FrmNewArmy_ActionArea.Gtk.ButtonBox+ButtonBoxChild
-            this.bttnCancel = new Gtk.Button();
-            this.bttnCancel.CanFocus = true;
-            this.bttnCancel.Name = "bttnCancel";
-            this.bttnCancel.UseStock = true;
-            this.bttnCancel.UseUnderline = true;
-            this.bttnCancel.Label = "gtk-cancel";
-            this.AddActionWidget(this.bttnCancel, -6);
-            Gtk.ButtonBox.ButtonBoxChild w14 = ((Gtk.ButtonBox.ButtonBoxChild)(w13[this.bttnCancel]));
-            w14.Expand = false;
-            w14.Fill = false;
-            // Container child WarFoundrySharp.FrmNewArmy_ActionArea.Gtk.ButtonBox+ButtonBoxChild
-            this.bttnCreate = new Gtk.Button();
-            this.bttnCreate.Sensitive = false;
-            this.bttnCreate.CanDefault = true;
-            this.bttnCreate.CanFocus = true;
-            this.bttnCreate.Name = "bttnCreate";
-            this.bttnCreate.UseUnderline = true;
-            // Container child bttnCreate.Gtk.Container+ContainerChild
-            Gtk.Alignment w15 = new Gtk.Alignment(0.5F, 0.5F, 0F, 0F);
-            // Container child GtkAlignment.Gtk.Container+ContainerChild
-            Gtk.HBox w16 = new Gtk.HBox();
-            w16.Spacing = 2;
-            // Container child GtkHBox.Gtk.Container+ContainerChild
-            Gtk.Image w17 = new Gtk.Image();
-            w17.Pixbuf = Stetic.IconLoader.LoadIcon(this, "gtk-ok", Gtk.IconSize.Menu, 16);
-            w16.Add(w17);
-            // Container child GtkHBox.Gtk.Container+ContainerChild
-            Gtk.Label w19 = new Gtk.Label();
-            w19.LabelProp = Mono.Unix.Catalog.GetString("C_reate");
-            w19.UseUnderline = true;
-            w16.Add(w19);
-            w15.Add(w16);
-            this.bttnCreate.Add(w15);
-            this.AddActionWidget(this.bttnCreate, -5);
-            Gtk.ButtonBox.ButtonBoxChild w23 = ((Gtk.ButtonBox.ButtonBoxChild)(w13[this.bttnCreate]));
-            w23.Position = 1;
-            w23.Expand = false;
-            w23.Fill = false;
-            if ((this.Child != null)) {
-                this.Child.ShowAll();
-            }
-            this.DefaultWidth = 370;
-            this.DefaultHeight = 348;
-            this.Show();
-            this.txtArmyName.Changed += new System.EventHandler(this.OnTextChanged);
-            this.systemCombo.Changed += new System.EventHandler(this.OnSystemComboChanged);
-            this.sbPointsValue.ChangeValue += new Gtk.ChangeValueHandler(this.OnSpinChangeValue);
-            this.sbPointsValue.ValueChanged += new System.EventHandler(this.OnSpinValueChanged);
-            this.sbPointsValue.Changed += new System.EventHandler(this.OnSpinValueChanged);
-            this.bttnCancel.Clicked += new System.EventHandler(this.OnCancelClicked);
-            this.bttnCreate.Clicked += new System.EventHandler(this.OnCreateClicked);
-        }
-    }
-}
--- a/gtk-gui/IBBoard.WarFoundry.GTK.FrmNewUnit.cs	Sun Jan 31 20:46:06 2010 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,140 +0,0 @@
-// ------------------------------------------------------------------------------
-//  <autogenerated>
-//      This code was generated by a tool.
-//      
-// 
-//      Changes to this file may cause incorrect behavior and will be lost if 
-//      the code is regenerated.
-//  </autogenerated>
-// ------------------------------------------------------------------------------
-
-namespace IBBoard.WarFoundry.GTK {
-    
-    
-    public partial class FrmNewUnit {
-        
-        private Gtk.VBox vbox2;
-        
-        private Gtk.HBox hbox1;
-        
-        private Gtk.Label label1;
-        
-        private Gtk.ScrolledWindow GtkScrolledWindow;
-        
-        private Gtk.TreeView lstUnitTypes;
-        
-        private Gtk.Label lblNewUnitWarning;
-        
-        private Gtk.Button buttonCancel;
-        
-        private Gtk.Button buttonOk;
-        
-        protected virtual void Build() {
-            Stetic.Gui.Initialize(this);
-            // Widget IBBoard.WarFoundry.GTK.FrmNewUnit
-            this.Name = "IBBoard.WarFoundry.GTK.FrmNewUnit";
-            this.Title = Mono.Unix.Catalog.GetString("Add new unit");
-            this.Icon = Stetic.IconLoader.LoadIcon(this, "gtk-new", Gtk.IconSize.Menu, 16);
-            this.WindowPosition = ((Gtk.WindowPosition)(4));
-            this.Modal = true;
-            this.SkipPagerHint = true;
-            this.SkipTaskbarHint = true;
-            // Internal child IBBoard.WarFoundry.GTK.FrmNewUnit.VBox
-            Gtk.VBox w1 = this.VBox;
-            w1.Name = "dialog1_VBox";
-            w1.BorderWidth = ((uint)(2));
-            // Container child dialog1_VBox.Gtk.Box+BoxChild
-            this.vbox2 = new Gtk.VBox();
-            this.vbox2.Name = "vbox2";
-            this.vbox2.Spacing = 6;
-            // Container child vbox2.Gtk.Box+BoxChild
-            this.hbox1 = new Gtk.HBox();
-            this.hbox1.Name = "hbox1";
-            this.hbox1.Spacing = 6;
-            // Container child hbox1.Gtk.Box+BoxChild
-            this.label1 = new Gtk.Label();
-            this.label1.Name = "label1";
-            this.label1.LabelProp = Mono.Unix.Catalog.GetString("Unit Type:");
-            this.hbox1.Add(this.label1);
-            Gtk.Box.BoxChild w2 = ((Gtk.Box.BoxChild)(this.hbox1[this.label1]));
-            w2.Position = 0;
-            w2.Expand = false;
-            w2.Fill = false;
-            // Container child hbox1.Gtk.Box+BoxChild
-            this.GtkScrolledWindow = new Gtk.ScrolledWindow();
-            this.GtkScrolledWindow.Name = "GtkScrolledWindow";
-            this.GtkScrolledWindow.ShadowType = ((Gtk.ShadowType)(1));
-            // Container child GtkScrolledWindow.Gtk.Container+ContainerChild
-            this.lstUnitTypes = new Gtk.TreeView();
-            this.lstUnitTypes.HeightRequest = 150;
-            this.lstUnitTypes.CanFocus = true;
-            this.lstUnitTypes.Name = "lstUnitTypes";
-            this.lstUnitTypes.HeadersVisible = false;
-            this.GtkScrolledWindow.Add(this.lstUnitTypes);
-            this.hbox1.Add(this.GtkScrolledWindow);
-            Gtk.Box.BoxChild w4 = ((Gtk.Box.BoxChild)(this.hbox1[this.GtkScrolledWindow]));
-            w4.Position = 1;
-            this.vbox2.Add(this.hbox1);
-            Gtk.Box.BoxChild w5 = ((Gtk.Box.BoxChild)(this.vbox2[this.hbox1]));
-            w5.Position = 0;
-            w5.Expand = false;
-            w5.Fill = false;
-            // Container child vbox2.Gtk.Box+BoxChild
-            this.lblNewUnitWarning = new Gtk.Label();
-            this.lblNewUnitWarning.Name = "lblNewUnitWarning";
-            this.lblNewUnitWarning.Xalign = 0F;
-            this.lblNewUnitWarning.Yalign = 0F;
-            this.vbox2.Add(this.lblNewUnitWarning);
-            Gtk.Box.BoxChild w6 = ((Gtk.Box.BoxChild)(this.vbox2[this.lblNewUnitWarning]));
-            w6.Position = 1;
-            w6.Expand = false;
-            w6.Fill = false;
-            w1.Add(this.vbox2);
-            Gtk.Box.BoxChild w7 = ((Gtk.Box.BoxChild)(w1[this.vbox2]));
-            w7.Position = 0;
-            w7.Expand = false;
-            w7.Fill = false;
-            // Internal child IBBoard.WarFoundry.GTK.FrmNewUnit.ActionArea
-            Gtk.HButtonBox w8 = this.ActionArea;
-            w8.Name = "dialog1_ActionArea";
-            w8.Spacing = 6;
-            w8.BorderWidth = ((uint)(5));
-            w8.LayoutStyle = ((Gtk.ButtonBoxStyle)(4));
-            // Container child dialog1_ActionArea.Gtk.ButtonBox+ButtonBoxChild
-            this.buttonCancel = new Gtk.Button();
-            this.buttonCancel.CanDefault = true;
-            this.buttonCancel.CanFocus = true;
-            this.buttonCancel.Name = "buttonCancel";
-            this.buttonCancel.UseStock = true;
-            this.buttonCancel.UseUnderline = true;
-            this.buttonCancel.Label = "gtk-cancel";
-            this.AddActionWidget(this.buttonCancel, -6);
-            Gtk.ButtonBox.ButtonBoxChild w9 = ((Gtk.ButtonBox.ButtonBoxChild)(w8[this.buttonCancel]));
-            w9.Expand = false;
-            w9.Fill = false;
-            // Container child dialog1_ActionArea.Gtk.ButtonBox+ButtonBoxChild
-            this.buttonOk = new Gtk.Button();
-            this.buttonOk.Sensitive = false;
-            this.buttonOk.CanDefault = true;
-            this.buttonOk.CanFocus = true;
-            this.buttonOk.Name = "buttonOk";
-            this.buttonOk.UseStock = true;
-            this.buttonOk.UseUnderline = true;
-            this.buttonOk.Label = "gtk-ok";
-            this.AddActionWidget(this.buttonOk, -5);
-            Gtk.ButtonBox.ButtonBoxChild w10 = ((Gtk.ButtonBox.ButtonBoxChild)(w8[this.buttonOk]));
-            w10.Position = 1;
-            w10.Expand = false;
-            w10.Fill = false;
-            if ((this.Child != null)) {
-                this.Child.ShowAll();
-            }
-            this.DefaultWidth = 400;
-            this.DefaultHeight = 318;
-            this.Show();
-            this.lstUnitTypes.RowActivated += new Gtk.RowActivatedHandler(this.OnRowActivated);
-            this.buttonCancel.Activated += new System.EventHandler(this.OnButtonCancelActivated);
-            this.buttonOk.Clicked += new System.EventHandler(this.OnButtonOkClicked);
-        }
-    }
-}
--- a/gtk-gui/IBBoard.WarFoundry.GTK.Widgets.UnitDisplayWidget.cs	Sun Jan 31 20:46:06 2010 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,273 +0,0 @@
-// ------------------------------------------------------------------------------
-//  <autogenerated>
-//      This code was generated by a tool.
-//      
-// 
-//      Changes to this file may cause incorrect behavior and will be lost if 
-//      the code is regenerated.
-//  </autogenerated>
-// ------------------------------------------------------------------------------
-
-namespace IBBoard.WarFoundry.GTK.Widgets {
-    
-    
-    public partial class UnitDisplayWidget {
-        
-        private Gtk.VBox vbox1;
-        
-        private Gtk.HBox hbox1;
-        
-        private Gtk.Entry unitName;
-        
-        private Gtk.SpinButton unitSize;
-        
-        private Gtk.ScrolledWindow GtkScrolledWindow;
-        
-        private Gtk.NodeView unitStats;
-        
-        private Gtk.HSeparator hseparator1;
-        
-        private Gtk.Table table1;
-        
-        private Gtk.ScrolledWindow GtkScrolledWindow1;
-        
-        private Gtk.NodeView optionalEquipment;
-        
-        private Gtk.ScrolledWindow GtkScrolledWindow2;
-        
-        private Gtk.NodeView requiredEquipment;
-        
-        private Gtk.Label optionalEquipmentLabel;
-        
-        private Gtk.Label requiredEquipmentLabel;
-        
-        private Gtk.VBox vbox2;
-        
-        private Gtk.Button bttnReplaceRequired;
-        
-        private Gtk.Button bttnEditRequired;
-        
-        private Gtk.VBox vbox3;
-        
-        private Gtk.Button bttnAddOptional;
-        
-        private Gtk.Button bttnEditOptional;
-        
-        private Gtk.Button bttnRemove;
-        
-        private Gtk.HBox hbox2;
-        
-        protected virtual void Build() {
-            Stetic.Gui.Initialize(this);
-            // Widget IBBoard.WarFoundry.GTK.Widgets.UnitDisplayWidget
-            Stetic.BinContainer.Attach(this);
-            this.Name = "IBBoard.WarFoundry.GTK.Widgets.UnitDisplayWidget";
-            // Container child IBBoard.WarFoundry.GTK.Widgets.UnitDisplayWidget.Gtk.Container+ContainerChild
-            this.vbox1 = new Gtk.VBox();
-            this.vbox1.Name = "vbox1";
-            this.vbox1.Spacing = 6;
-            // Container child vbox1.Gtk.Box+BoxChild
-            this.hbox1 = new Gtk.HBox();
-            this.hbox1.Name = "hbox1";
-            this.hbox1.Spacing = 6;
-            // Container child hbox1.Gtk.Box+BoxChild
-            this.unitName = new Gtk.Entry();
-            this.unitName.CanFocus = true;
-            this.unitName.Name = "unitName";
-            this.unitName.IsEditable = true;
-            this.unitName.InvisibleChar = '•';
-            this.hbox1.Add(this.unitName);
-            Gtk.Box.BoxChild w1 = ((Gtk.Box.BoxChild)(this.hbox1[this.unitName]));
-            w1.Position = 0;
-            // Container child hbox1.Gtk.Box+BoxChild
-            this.unitSize = new Gtk.SpinButton(0, 100, 1);
-            this.unitSize.CanFocus = true;
-            this.unitSize.Name = "unitSize";
-            this.unitSize.Adjustment.PageIncrement = 10;
-            this.unitSize.ClimbRate = 1;
-            this.unitSize.Numeric = true;
-            this.hbox1.Add(this.unitSize);
-            Gtk.Box.BoxChild w2 = ((Gtk.Box.BoxChild)(this.hbox1[this.unitSize]));
-            w2.Position = 1;
-            w2.Expand = false;
-            w2.Fill = false;
-            this.vbox1.Add(this.hbox1);
-            Gtk.Box.BoxChild w3 = ((Gtk.Box.BoxChild)(this.vbox1[this.hbox1]));
-            w3.Position = 0;
-            w3.Expand = false;
-            w3.Fill = false;
-            // Container child vbox1.Gtk.Box+BoxChild
-            this.GtkScrolledWindow = new Gtk.ScrolledWindow();
-            this.GtkScrolledWindow.Name = "GtkScrolledWindow";
-            this.GtkScrolledWindow.ShadowType = ((Gtk.ShadowType)(1));
-            // Container child GtkScrolledWindow.Gtk.Container+ContainerChild
-            this.unitStats = new Gtk.NodeView();
-            this.unitStats.HeightRequest = 75;
-            this.unitStats.CanFocus = true;
-            this.unitStats.Name = "unitStats";
-            this.GtkScrolledWindow.Add(this.unitStats);
-            this.vbox1.Add(this.GtkScrolledWindow);
-            Gtk.Box.BoxChild w5 = ((Gtk.Box.BoxChild)(this.vbox1[this.GtkScrolledWindow]));
-            w5.Position = 1;
-            // Container child vbox1.Gtk.Box+BoxChild
-            this.hseparator1 = new Gtk.HSeparator();
-            this.hseparator1.Name = "hseparator1";
-            this.vbox1.Add(this.hseparator1);
-            Gtk.Box.BoxChild w6 = ((Gtk.Box.BoxChild)(this.vbox1[this.hseparator1]));
-            w6.Position = 2;
-            w6.Expand = false;
-            w6.Fill = false;
-            // Container child vbox1.Gtk.Box+BoxChild
-            this.table1 = new Gtk.Table(((uint)(2)), ((uint)(3)), false);
-            this.table1.Name = "table1";
-            this.table1.RowSpacing = ((uint)(6));
-            this.table1.ColumnSpacing = ((uint)(6));
-            // Container child table1.Gtk.Table+TableChild
-            this.GtkScrolledWindow1 = new Gtk.ScrolledWindow();
-            this.GtkScrolledWindow1.Name = "GtkScrolledWindow1";
-            this.GtkScrolledWindow1.ShadowType = ((Gtk.ShadowType)(1));
-            // Container child GtkScrolledWindow1.Gtk.Container+ContainerChild
-            this.optionalEquipment = new Gtk.NodeView();
-            this.optionalEquipment.CanFocus = true;
-            this.optionalEquipment.Name = "optionalEquipment";
-            this.GtkScrolledWindow1.Add(this.optionalEquipment);
-            this.table1.Add(this.GtkScrolledWindow1);
-            Gtk.Table.TableChild w8 = ((Gtk.Table.TableChild)(this.table1[this.GtkScrolledWindow1]));
-            w8.TopAttach = ((uint)(1));
-            w8.BottomAttach = ((uint)(2));
-            w8.LeftAttach = ((uint)(1));
-            w8.RightAttach = ((uint)(2));
-            w8.YOptions = ((Gtk.AttachOptions)(4));
-            // Container child table1.Gtk.Table+TableChild
-            this.GtkScrolledWindow2 = new Gtk.ScrolledWindow();
-            this.GtkScrolledWindow2.Name = "GtkScrolledWindow2";
-            this.GtkScrolledWindow2.ShadowType = ((Gtk.ShadowType)(1));
-            // Container child GtkScrolledWindow2.Gtk.Container+ContainerChild
-            this.requiredEquipment = new Gtk.NodeView();
-            this.requiredEquipment.CanFocus = true;
-            this.requiredEquipment.Name = "requiredEquipment";
-            this.GtkScrolledWindow2.Add(this.requiredEquipment);
-            this.table1.Add(this.GtkScrolledWindow2);
-            Gtk.Table.TableChild w10 = ((Gtk.Table.TableChild)(this.table1[this.GtkScrolledWindow2]));
-            w10.LeftAttach = ((uint)(1));
-            w10.RightAttach = ((uint)(2));
-            w10.YOptions = ((Gtk.AttachOptions)(4));
-            // Container child table1.Gtk.Table+TableChild
-            this.optionalEquipmentLabel = new Gtk.Label();
-            this.optionalEquipmentLabel.Name = "optionalEquipmentLabel";
-            this.optionalEquipmentLabel.LabelProp = Mono.Unix.Catalog.GetString("Optional Equipment:");
-            this.table1.Add(this.optionalEquipmentLabel);
-            Gtk.Table.TableChild w11 = ((Gtk.Table.TableChild)(this.table1[this.optionalEquipmentLabel]));
-            w11.TopAttach = ((uint)(1));
-            w11.BottomAttach = ((uint)(2));
-            w11.XOptions = ((Gtk.AttachOptions)(4));
-            w11.YOptions = ((Gtk.AttachOptions)(4));
-            // Container child table1.Gtk.Table+TableChild
-            this.requiredEquipmentLabel = new Gtk.Label();
-            this.requiredEquipmentLabel.Name = "requiredEquipmentLabel";
-            this.requiredEquipmentLabel.LabelProp = Mono.Unix.Catalog.GetString("Required Equipment:");
-            this.table1.Add(this.requiredEquipmentLabel);
-            Gtk.Table.TableChild w12 = ((Gtk.Table.TableChild)(this.table1[this.requiredEquipmentLabel]));
-            w12.XOptions = ((Gtk.AttachOptions)(4));
-            w12.YOptions = ((Gtk.AttachOptions)(4));
-            // Container child table1.Gtk.Table+TableChild
-            this.vbox2 = new Gtk.VBox();
-            this.vbox2.Name = "vbox2";
-            this.vbox2.Spacing = 6;
-            // Container child vbox2.Gtk.Box+BoxChild
-            this.bttnReplaceRequired = new Gtk.Button();
-            this.bttnReplaceRequired.CanFocus = true;
-            this.bttnReplaceRequired.Name = "bttnReplaceRequired";
-            this.bttnReplaceRequired.UseUnderline = true;
-            this.bttnReplaceRequired.Label = Mono.Unix.Catalog.GetString("Replace");
-            this.vbox2.Add(this.bttnReplaceRequired);
-            Gtk.Box.BoxChild w13 = ((Gtk.Box.BoxChild)(this.vbox2[this.bttnReplaceRequired]));
-            w13.Position = 0;
-            w13.Expand = false;
-            w13.Fill = false;
-            // Container child vbox2.Gtk.Box+BoxChild
-            this.bttnEditRequired = new Gtk.Button();
-            this.bttnEditRequired.CanFocus = true;
-            this.bttnEditRequired.Name = "bttnEditRequired";
-            this.bttnEditRequired.UseUnderline = true;
-            this.bttnEditRequired.Label = Mono.Unix.Catalog.GetString("Edit");
-            this.vbox2.Add(this.bttnEditRequired);
-            Gtk.Box.BoxChild w14 = ((Gtk.Box.BoxChild)(this.vbox2[this.bttnEditRequired]));
-            w14.Position = 1;
-            w14.Expand = false;
-            w14.Fill = false;
-            this.table1.Add(this.vbox2);
-            Gtk.Table.TableChild w15 = ((Gtk.Table.TableChild)(this.table1[this.vbox2]));
-            w15.LeftAttach = ((uint)(2));
-            w15.RightAttach = ((uint)(3));
-            w15.XOptions = ((Gtk.AttachOptions)(4));
-            w15.YOptions = ((Gtk.AttachOptions)(4));
-            // Container child table1.Gtk.Table+TableChild
-            this.vbox3 = new Gtk.VBox();
-            this.vbox3.Name = "vbox3";
-            this.vbox3.Spacing = 6;
-            // Container child vbox3.Gtk.Box+BoxChild
-            this.bttnAddOptional = new Gtk.Button();
-            this.bttnAddOptional.CanFocus = true;
-            this.bttnAddOptional.Name = "bttnAddOptional";
-            this.bttnAddOptional.UseUnderline = true;
-            this.bttnAddOptional.Label = Mono.Unix.Catalog.GetString("Add");
-            this.vbox3.Add(this.bttnAddOptional);
-            Gtk.Box.BoxChild w16 = ((Gtk.Box.BoxChild)(this.vbox3[this.bttnAddOptional]));
-            w16.Position = 0;
-            w16.Expand = false;
-            w16.Fill = false;
-            // Container child vbox3.Gtk.Box+BoxChild
-            this.bttnEditOptional = new Gtk.Button();
-            this.bttnEditOptional.CanFocus = true;
-            this.bttnEditOptional.Name = "bttnEditOptional";
-            this.bttnEditOptional.UseUnderline = true;
-            this.bttnEditOptional.Label = Mono.Unix.Catalog.GetString("Edit");
-            this.vbox3.Add(this.bttnEditOptional);
-            Gtk.Box.BoxChild w17 = ((Gtk.Box.BoxChild)(this.vbox3[this.bttnEditOptional]));
-            w17.Position = 1;
-            w17.Expand = false;
-            w17.Fill = false;
-            // Container child vbox3.Gtk.Box+BoxChild
-            this.bttnRemove = new Gtk.Button();
-            this.bttnRemove.CanFocus = true;
-            this.bttnRemove.Name = "bttnRemove";
-            this.bttnRemove.UseUnderline = true;
-            this.bttnRemove.Label = Mono.Unix.Catalog.GetString("Remove");
-            this.vbox3.Add(this.bttnRemove);
-            Gtk.Box.BoxChild w18 = ((Gtk.Box.BoxChild)(this.vbox3[this.bttnRemove]));
-            w18.Position = 2;
-            w18.Expand = false;
-            w18.Fill = false;
-            this.table1.Add(this.vbox3);
-            Gtk.Table.TableChild w19 = ((Gtk.Table.TableChild)(this.table1[this.vbox3]));
-            w19.TopAttach = ((uint)(1));
-            w19.BottomAttach = ((uint)(2));
-            w19.LeftAttach = ((uint)(2));
-            w19.RightAttach = ((uint)(3));
-            w19.XOptions = ((Gtk.AttachOptions)(4));
-            w19.YOptions = ((Gtk.AttachOptions)(4));
-            this.vbox1.Add(this.table1);
-            Gtk.Box.BoxChild w20 = ((Gtk.Box.BoxChild)(this.vbox1[this.table1]));
-            w20.Position = 3;
-            w20.Expand = false;
-            w20.Fill = false;
-            // Container child vbox1.Gtk.Box+BoxChild
-            this.hbox2 = new Gtk.HBox();
-            this.hbox2.Name = "hbox2";
-            this.hbox2.Spacing = 6;
-            this.vbox1.Add(this.hbox2);
-            Gtk.Box.BoxChild w21 = ((Gtk.Box.BoxChild)(this.vbox1[this.hbox2]));
-            w21.Position = 4;
-            this.Add(this.vbox1);
-            if ((this.Child != null)) {
-                this.Child.ShowAll();
-            }
-            this.Show();
-            this.unitName.FocusOutEvent += new Gtk.FocusOutEventHandler(this.OnUnitNameFocusOut);
-            this.unitName.KeyPressEvent += new Gtk.KeyPressEventHandler(this.OnUnitNameKeyPress);
-            this.unitSize.FocusOutEvent += new Gtk.FocusOutEventHandler(this.OnUnitSizeFocusOut);
-            this.unitSize.KeyPressEvent += new Gtk.KeyPressEventHandler(this.OnUnitSizeKeyPress);
-        }
-    }
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gtk-gui/IBBoard.WarFoundry.GUI.GTK.FrmAbout.cs	Mon Jan 17 19:43:47 2011 +0000
@@ -0,0 +1,122 @@
+
+// This file has been generated by the GUI designer. Do not modify.
+namespace IBBoard.WarFoundry.GUI.GTK
+{
+	public partial class FrmAbout
+	{
+		private global::Gtk.Image logoImage;
+		private global::Gtk.Label label1;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableLabel lblWarFoundryDesc;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableLabel lblWarFoundryCopyright;
+		private global::Gtk.Label lblWarFoundryLink;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableButton bttnCredits;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableButton bttnClose;
+
+		protected virtual void Build()
+		{
+			global::Stetic.Gui.Initialize(this);
+			// Widget IBBoard.WarFoundry.GUI.GTK.FrmAbout
+			this.Name = "IBBoard.WarFoundry.GUI.GTK.FrmAbout";
+			this.Title = global::Mono.Unix.Catalog.GetString("About WF");
+			this.Icon = global::Gdk.Pixbuf.LoadFromResource("App.ico");
+			this.TypeHint = ((global::Gdk.WindowTypeHint)(1));
+			this.WindowPosition = ((global::Gtk.WindowPosition)(4));
+			this.Resizable = false;
+			this.AllowGrow = false;
+			this.SkipPagerHint = true;
+			this.SkipTaskbarHint = true;
+			// Internal child IBBoard.WarFoundry.GUI.GTK.FrmAbout.VBox
+			global::Gtk.VBox w1 = this.VBox;
+			w1.Name = "dialog1_VBox";
+			w1.BorderWidth = ((uint)(2));
+			// Container child dialog1_VBox.Gtk.Box+BoxChild
+			this.logoImage = new global::Gtk.Image();
+			this.logoImage.Name = "logoImage";
+			this.logoImage.Pixbuf = global::Gdk.Pixbuf.LoadFromResource("IBBoard.WarFoundry.GUI.GTK.App-lrg.png");
+			w1.Add(this.logoImage);
+			global::Gtk.Box.BoxChild w2 = ((global::Gtk.Box.BoxChild)(w1[this.logoImage]));
+			w2.Position = 0;
+			w2.Expand = false;
+			w2.Fill = false;
+			// Container child dialog1_VBox.Gtk.Box+BoxChild
+			this.label1 = new global::Gtk.Label();
+			this.label1.Name = "label1";
+			this.label1.LabelProp = global::Mono.Unix.Catalog.GetString("<span font_size=\"x-large\" weight=\"bold\">WarFoundry v0.1 RC 1</span>");
+			this.label1.UseMarkup = true;
+			w1.Add(this.label1);
+			global::Gtk.Box.BoxChild w3 = ((global::Gtk.Box.BoxChild)(w1[this.label1]));
+			w3.Position = 1;
+			w3.Expand = false;
+			w3.Fill = false;
+			// Container child dialog1_VBox.Gtk.Box+BoxChild
+			this.lblWarFoundryDesc = new global::IBBoard.GtkSharp.Translatable.TranslatableLabel();
+			this.lblWarFoundryDesc.Name = "lblWarFoundryDesc";
+			this.lblWarFoundryDesc.LabelProp = global::Mono.Unix.Catalog.GetString("WarFoundry is an open-source army creation tool that lets you create rosters for multiple game systems.");
+			this.lblWarFoundryDesc.Wrap = true;
+			this.lblWarFoundryDesc.Justify = ((global::Gtk.Justification)(2));
+			w1.Add(this.lblWarFoundryDesc);
+			global::Gtk.Box.BoxChild w4 = ((global::Gtk.Box.BoxChild)(w1[this.lblWarFoundryDesc]));
+			w4.Position = 2;
+			w4.Expand = false;
+			w4.Fill = false;
+			// Container child dialog1_VBox.Gtk.Box+BoxChild
+			this.lblWarFoundryCopyright = new global::IBBoard.GtkSharp.Translatable.TranslatableLabel();
+			this.lblWarFoundryCopyright.Name = "lblWarFoundryCopyright";
+			this.lblWarFoundryCopyright.LabelProp = global::Mono.Unix.Catalog.GetString("© 2007-2010, IBBoard and others");
+			w1.Add(this.lblWarFoundryCopyright);
+			global::Gtk.Box.BoxChild w5 = ((global::Gtk.Box.BoxChild)(w1[this.lblWarFoundryCopyright]));
+			w5.Position = 3;
+			w5.Expand = false;
+			w5.Fill = false;
+			// Container child dialog1_VBox.Gtk.Box+BoxChild
+			this.lblWarFoundryLink = new global::Gtk.Label();
+			this.lblWarFoundryLink.Name = "lblWarFoundryLink";
+			this.lblWarFoundryLink.LabelProp = global::Mono.Unix.Catalog.GetString("<a href=\"http://warfoundry.co.uk\">http://warfoundry.co.uk</a>");
+			this.lblWarFoundryLink.UseMarkup = true;
+			w1.Add(this.lblWarFoundryLink);
+			global::Gtk.Box.BoxChild w6 = ((global::Gtk.Box.BoxChild)(w1[this.lblWarFoundryLink]));
+			w6.Position = 4;
+			w6.Expand = false;
+			w6.Fill = false;
+			// Internal child IBBoard.WarFoundry.GUI.GTK.FrmAbout.ActionArea
+			global::Gtk.HButtonBox w7 = this.ActionArea;
+			w7.Name = "dialog1_ActionArea";
+			w7.Spacing = 10;
+			w7.BorderWidth = ((uint)(5));
+			w7.LayoutStyle = ((global::Gtk.ButtonBoxStyle)(4));
+			// Container child dialog1_ActionArea.Gtk.ButtonBox+ButtonBoxChild
+			this.bttnCredits = new global::IBBoard.GtkSharp.Translatable.TranslatableButton();
+			this.bttnCredits.CanFocus = true;
+			this.bttnCredits.Name = "bttnCredits";
+			this.bttnCredits.UseStock = true;
+			this.bttnCredits.UseUnderline = true;
+			this.bttnCredits.Label = "gtk-about";
+			w7.Add(this.bttnCredits);
+			global::Gtk.ButtonBox.ButtonBoxChild w8 = ((global::Gtk.ButtonBox.ButtonBoxChild)(w7[this.bttnCredits]));
+			w8.Expand = false;
+			w8.Fill = false;
+			// Container child dialog1_ActionArea.Gtk.ButtonBox+ButtonBoxChild
+			this.bttnClose = new global::IBBoard.GtkSharp.Translatable.TranslatableButton();
+			this.bttnClose.CanDefault = true;
+			this.bttnClose.CanFocus = true;
+			this.bttnClose.Name = "bttnClose";
+			this.bttnClose.UseStock = true;
+			this.bttnClose.UseUnderline = true;
+			this.bttnClose.Label = "gtk-close";
+			this.AddActionWidget(this.bttnClose, -7);
+			global::Gtk.ButtonBox.ButtonBoxChild w9 = ((global::Gtk.ButtonBox.ButtonBoxChild)(w7[this.bttnClose]));
+			w9.Position = 1;
+			w9.Expand = false;
+			w9.Fill = false;
+			if ((this.Child != null))
+			{
+				this.Child.ShowAll();
+			}
+			this.DefaultWidth = 330;
+			this.DefaultHeight = 300;
+			this.bttnClose.HasDefault = true;
+			this.Show();
+			this.bttnCredits.Clicked += new global::System.EventHandler(this.BttnCreditsClicked);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gtk-gui/IBBoard.WarFoundry.GUI.GTK.FrmAboutCredits.cs	Mon Jan 17 19:43:47 2011 +0000
@@ -0,0 +1,152 @@
+
+// This file has been generated by the GUI designer. Do not modify.
+namespace IBBoard.WarFoundry.GUI.GTK
+{
+	public partial class FrmAboutCredits
+	{
+		private global::Gtk.Table table1;
+		private global::Gtk.Label label1;
+		private global::Gtk.Label label2;
+		private global::Gtk.Label label3;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableLabel lblDevelopers;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableLabel lblTestersCommon;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableLabel lblTestersGtk;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableButton bttnClose;
+
+		protected virtual void Build()
+		{
+			global::Stetic.Gui.Initialize(this);
+			// Widget IBBoard.WarFoundry.GUI.GTK.FrmAboutCredits
+			this.Name = "IBBoard.WarFoundry.GUI.GTK.FrmAboutCredits";
+			this.Icon = global::Gdk.Pixbuf.LoadFromResource("App.ico");
+			this.TypeHint = ((global::Gdk.WindowTypeHint)(1));
+			this.WindowPosition = ((global::Gtk.WindowPosition)(4));
+			this.SkipPagerHint = true;
+			this.SkipTaskbarHint = true;
+			// Internal child IBBoard.WarFoundry.GUI.GTK.FrmAboutCredits.VBox
+			global::Gtk.VBox w1 = this.VBox;
+			w1.Name = "dialog1_VBox";
+			w1.BorderWidth = ((uint)(2));
+			// Container child dialog1_VBox.Gtk.Box+BoxChild
+			this.table1 = new global::Gtk.Table(((uint)(3)), ((uint)(2)), false);
+			this.table1.Name = "table1";
+			this.table1.RowSpacing = ((uint)(6));
+			this.table1.ColumnSpacing = ((uint)(6));
+			// Container child table1.Gtk.Table+TableChild
+			this.label1 = new global::Gtk.Label();
+			this.label1.Name = "label1";
+			this.label1.Xpad = 3;
+			this.label1.Ypad = 3;
+			this.label1.Xalign = 0F;
+			this.label1.Yalign = 0F;
+			this.label1.LabelProp = "IBBoard (Main developer and project lead)";
+			this.table1.Add(this.label1);
+			global::Gtk.Table.TableChild w2 = ((global::Gtk.Table.TableChild)(this.table1[this.label1]));
+			w2.LeftAttach = ((uint)(1));
+			w2.RightAttach = ((uint)(2));
+			w2.XOptions = ((global::Gtk.AttachOptions)(4));
+			w2.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table1.Gtk.Table+TableChild
+			this.label2 = new global::Gtk.Label();
+			this.label2.Name = "label2";
+			this.label2.Xpad = 3;
+			this.label2.Ypad = 3;
+			this.label2.Xalign = 0F;
+			this.label2.Yalign = 0F;
+			this.label2.LabelProp = global::Mono.Unix.Catalog.GetString("HeWhoWatches");
+			this.table1.Add(this.label2);
+			global::Gtk.Table.TableChild w3 = ((global::Gtk.Table.TableChild)(this.table1[this.label2]));
+			w3.TopAttach = ((uint)(1));
+			w3.BottomAttach = ((uint)(2));
+			w3.LeftAttach = ((uint)(1));
+			w3.RightAttach = ((uint)(2));
+			w3.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table1.Gtk.Table+TableChild
+			this.label3 = new global::Gtk.Label();
+			this.label3.Name = "label3";
+			this.label3.Xpad = 3;
+			this.label3.Ypad = 3;
+			this.label3.Xalign = 0F;
+			this.label3.Yalign = 0F;
+			this.label3.LabelProp = global::Mono.Unix.Catalog.GetString("Snowblizz,\r\nFrostlee,\r\nLord_Archaon,\r\nFurrie,\r\nclutch110,\r\nMollo,\r\nHeWhoWatches");
+			this.table1.Add(this.label3);
+			global::Gtk.Table.TableChild w4 = ((global::Gtk.Table.TableChild)(this.table1[this.label3]));
+			w4.TopAttach = ((uint)(2));
+			w4.BottomAttach = ((uint)(3));
+			w4.LeftAttach = ((uint)(1));
+			w4.RightAttach = ((uint)(2));
+			w4.XOptions = ((global::Gtk.AttachOptions)(4));
+			w4.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table1.Gtk.Table+TableChild
+			this.lblDevelopers = new global::IBBoard.GtkSharp.Translatable.TranslatableLabel();
+			this.lblDevelopers.Name = "lblDevelopers";
+			this.lblDevelopers.Xpad = 3;
+			this.lblDevelopers.Ypad = 3;
+			this.lblDevelopers.Xalign = 0F;
+			this.lblDevelopers.Yalign = 0F;
+			this.lblDevelopers.LabelProp = global::Mono.Unix.Catalog.GetString("developers:");
+			this.table1.Add(this.lblDevelopers);
+			global::Gtk.Table.TableChild w5 = ((global::Gtk.Table.TableChild)(this.table1[this.lblDevelopers]));
+			w5.XOptions = ((global::Gtk.AttachOptions)(4));
+			w5.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table1.Gtk.Table+TableChild
+			this.lblTestersCommon = new global::IBBoard.GtkSharp.Translatable.TranslatableLabel();
+			this.lblTestersCommon.Name = "lblTestersCommon";
+			this.lblTestersCommon.Xpad = 3;
+			this.lblTestersCommon.Ypad = 3;
+			this.lblTestersCommon.Xalign = 0F;
+			this.lblTestersCommon.Yalign = 0F;
+			this.lblTestersCommon.LabelProp = global::Mono.Unix.Catalog.GetString("testers (common):");
+			this.table1.Add(this.lblTestersCommon);
+			global::Gtk.Table.TableChild w6 = ((global::Gtk.Table.TableChild)(this.table1[this.lblTestersCommon]));
+			w6.TopAttach = ((uint)(2));
+			w6.BottomAttach = ((uint)(3));
+			w6.XOptions = ((global::Gtk.AttachOptions)(4));
+			w6.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table1.Gtk.Table+TableChild
+			this.lblTestersGtk = new global::IBBoard.GtkSharp.Translatable.TranslatableLabel();
+			this.lblTestersGtk.Name = "lblTestersGtk";
+			this.lblTestersGtk.Xpad = 3;
+			this.lblTestersGtk.Ypad = 3;
+			this.lblTestersGtk.Xalign = 0F;
+			this.lblTestersGtk.Yalign = 0F;
+			this.lblTestersGtk.LabelProp = global::Mono.Unix.Catalog.GetString("testers (GTK UI):");
+			this.table1.Add(this.lblTestersGtk);
+			global::Gtk.Table.TableChild w7 = ((global::Gtk.Table.TableChild)(this.table1[this.lblTestersGtk]));
+			w7.TopAttach = ((uint)(1));
+			w7.BottomAttach = ((uint)(2));
+			w7.XOptions = ((global::Gtk.AttachOptions)(4));
+			w7.YOptions = ((global::Gtk.AttachOptions)(4));
+			w1.Add(this.table1);
+			global::Gtk.Box.BoxChild w8 = ((global::Gtk.Box.BoxChild)(w1[this.table1]));
+			w8.Position = 0;
+			w8.Expand = false;
+			w8.Fill = false;
+			// Internal child IBBoard.WarFoundry.GUI.GTK.FrmAboutCredits.ActionArea
+			global::Gtk.HButtonBox w9 = this.ActionArea;
+			w9.Name = "dialog1_ActionArea";
+			w9.Spacing = 10;
+			w9.BorderWidth = ((uint)(5));
+			w9.LayoutStyle = ((global::Gtk.ButtonBoxStyle)(4));
+			// Container child dialog1_ActionArea.Gtk.ButtonBox+ButtonBoxChild
+			this.bttnClose = new global::IBBoard.GtkSharp.Translatable.TranslatableButton();
+			this.bttnClose.CanDefault = true;
+			this.bttnClose.CanFocus = true;
+			this.bttnClose.Name = "bttnClose";
+			this.bttnClose.UseStock = true;
+			this.bttnClose.UseUnderline = true;
+			this.bttnClose.Label = "gtk-close";
+			this.AddActionWidget(this.bttnClose, -7);
+			global::Gtk.ButtonBox.ButtonBoxChild w10 = ((global::Gtk.ButtonBox.ButtonBoxChild)(w9[this.bttnClose]));
+			w10.Expand = false;
+			w10.Fill = false;
+			if ((this.Child != null))
+			{
+				this.Child.ShowAll();
+			}
+			this.DefaultWidth = 376;
+			this.DefaultHeight = 250;
+			this.Show();
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gtk-gui/IBBoard.WarFoundry.GUI.GTK.FrmAddEquipment.cs	Mon Jan 17 19:43:47 2011 +0000
@@ -0,0 +1,237 @@
+
+// This file has been generated by the GUI designer. Do not modify.
+namespace IBBoard.WarFoundry.GUI.GTK
+{
+	public partial class FrmAddEquipment
+	{
+		private global::Gtk.Table table1;
+		private global::Gtk.ScrolledWindow GtkScrolledWindow;
+		private global::Gtk.TreeView lstEquipment;
+		private global::Gtk.HBox hbox2;
+		private global::Gtk.Table table2;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableLabel lblEquipAll;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableLabel lblPercent;
+		private global::Gtk.SpinButton numericAmount;
+		private global::Gtk.SpinButton percentageAmount;
+		private global::Gtk.RadioButton rbEquipAll;
+		private global::Gtk.RadioButton rbEquipNumeric;
+		private global::Gtk.RadioButton rbEquipPercent;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableLabel lblAmount;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableLabel lblItem;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableButton bttnCancel;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableButton bttnOkay;
+
+		protected virtual void Build()
+		{
+			global::Stetic.Gui.Initialize(this);
+			// Widget IBBoard.WarFoundry.GUI.GTK.FrmAddEquipment
+			this.Name = "IBBoard.WarFoundry.GUI.GTK.FrmAddEquipment";
+			this.Title = global::Mono.Unix.Catalog.GetString("Add equipment");
+			this.WindowPosition = ((global::Gtk.WindowPosition)(4));
+			this.Modal = true;
+			this.SkipPagerHint = true;
+			this.SkipTaskbarHint = true;
+			// Internal child IBBoard.WarFoundry.GUI.GTK.FrmAddEquipment.VBox
+			global::Gtk.VBox w1 = this.VBox;
+			w1.Name = "dialog1_VBox";
+			w1.BorderWidth = ((uint)(2));
+			// Container child dialog1_VBox.Gtk.Box+BoxChild
+			this.table1 = new global::Gtk.Table(((uint)(2)), ((uint)(2)), false);
+			this.table1.Name = "table1";
+			this.table1.RowSpacing = ((uint)(6));
+			this.table1.ColumnSpacing = ((uint)(6));
+			// Container child table1.Gtk.Table+TableChild
+			this.GtkScrolledWindow = new global::Gtk.ScrolledWindow();
+			this.GtkScrolledWindow.Name = "GtkScrolledWindow";
+			this.GtkScrolledWindow.ShadowType = ((global::Gtk.ShadowType)(1));
+			// Container child GtkScrolledWindow.Gtk.Container+ContainerChild
+			this.lstEquipment = new global::Gtk.TreeView();
+			this.lstEquipment.CanFocus = true;
+			this.lstEquipment.Name = "lstEquipment";
+			this.lstEquipment.HeadersVisible = false;
+			this.GtkScrolledWindow.Add(this.lstEquipment);
+			this.table1.Add(this.GtkScrolledWindow);
+			global::Gtk.Table.TableChild w3 = ((global::Gtk.Table.TableChild)(this.table1[this.GtkScrolledWindow]));
+			w3.LeftAttach = ((uint)(1));
+			w3.RightAttach = ((uint)(2));
+			w3.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table1.Gtk.Table+TableChild
+			this.hbox2 = new global::Gtk.HBox();
+			this.hbox2.Name = "hbox2";
+			this.hbox2.Spacing = 6;
+			// Container child hbox2.Gtk.Box+BoxChild
+			this.table2 = new global::Gtk.Table(((uint)(3)), ((uint)(3)), false);
+			this.table2.Name = "table2";
+			this.table2.RowSpacing = ((uint)(6));
+			this.table2.ColumnSpacing = ((uint)(6));
+			// Container child table2.Gtk.Table+TableChild
+			this.lblEquipAll = new global::IBBoard.GtkSharp.Translatable.TranslatableLabel();
+			this.lblEquipAll.Name = "lblEquipAll";
+			this.lblEquipAll.LabelProp = global::Mono.Unix.Catalog.GetString("equip all");
+			this.table2.Add(this.lblEquipAll);
+			global::Gtk.Table.TableChild w4 = ((global::Gtk.Table.TableChild)(this.table2[this.lblEquipAll]));
+			w4.TopAttach = ((uint)(2));
+			w4.BottomAttach = ((uint)(3));
+			w4.LeftAttach = ((uint)(1));
+			w4.RightAttach = ((uint)(2));
+			w4.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table2.Gtk.Table+TableChild
+			this.lblPercent = new global::IBBoard.GtkSharp.Translatable.TranslatableLabel();
+			this.lblPercent.Name = "lblPercent";
+			this.lblPercent.LabelProp = global::Mono.Unix.Catalog.GetString("%");
+			this.table2.Add(this.lblPercent);
+			global::Gtk.Table.TableChild w5 = ((global::Gtk.Table.TableChild)(this.table2[this.lblPercent]));
+			w5.TopAttach = ((uint)(1));
+			w5.BottomAttach = ((uint)(2));
+			w5.LeftAttach = ((uint)(2));
+			w5.RightAttach = ((uint)(3));
+			w5.XOptions = ((global::Gtk.AttachOptions)(4));
+			w5.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table2.Gtk.Table+TableChild
+			this.numericAmount = new global::Gtk.SpinButton(0, 100, 1);
+			this.numericAmount.CanFocus = true;
+			this.numericAmount.Name = "numericAmount";
+			this.numericAmount.Adjustment.PageIncrement = 10;
+			this.numericAmount.ClimbRate = 1;
+			this.numericAmount.Numeric = true;
+			this.table2.Add(this.numericAmount);
+			global::Gtk.Table.TableChild w6 = ((global::Gtk.Table.TableChild)(this.table2[this.numericAmount]));
+			w6.LeftAttach = ((uint)(1));
+			w6.RightAttach = ((uint)(2));
+			w6.XOptions = ((global::Gtk.AttachOptions)(0));
+			w6.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table2.Gtk.Table+TableChild
+			this.percentageAmount = new global::Gtk.SpinButton(0, 100, 1);
+			this.percentageAmount.CanFocus = true;
+			this.percentageAmount.Name = "percentageAmount";
+			this.percentageAmount.Adjustment.PageIncrement = 10;
+			this.percentageAmount.ClimbRate = 1;
+			this.percentageAmount.Digits = ((uint)(1));
+			this.percentageAmount.Numeric = true;
+			this.table2.Add(this.percentageAmount);
+			global::Gtk.Table.TableChild w7 = ((global::Gtk.Table.TableChild)(this.table2[this.percentageAmount]));
+			w7.TopAttach = ((uint)(1));
+			w7.BottomAttach = ((uint)(2));
+			w7.LeftAttach = ((uint)(1));
+			w7.RightAttach = ((uint)(2));
+			w7.XOptions = ((global::Gtk.AttachOptions)(0));
+			w7.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table2.Gtk.Table+TableChild
+			this.rbEquipAll = new global::Gtk.RadioButton("");
+			this.rbEquipAll.CanFocus = true;
+			this.rbEquipAll.Name = "rbEquipAll";
+			this.rbEquipAll.Active = true;
+			this.rbEquipAll.DrawIndicator = true;
+			this.rbEquipAll.UseUnderline = true;
+			this.rbEquipAll.Group = new global::GLib.SList(global::System.IntPtr.Zero);
+			this.table2.Add(this.rbEquipAll);
+			global::Gtk.Table.TableChild w8 = ((global::Gtk.Table.TableChild)(this.table2[this.rbEquipAll]));
+			w8.TopAttach = ((uint)(2));
+			w8.BottomAttach = ((uint)(3));
+			w8.XOptions = ((global::Gtk.AttachOptions)(4));
+			w8.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table2.Gtk.Table+TableChild
+			this.rbEquipNumeric = new global::Gtk.RadioButton("");
+			this.rbEquipNumeric.CanFocus = true;
+			this.rbEquipNumeric.Name = "rbEquipNumeric";
+			this.rbEquipNumeric.DrawIndicator = true;
+			this.rbEquipNumeric.UseUnderline = true;
+			this.rbEquipNumeric.Group = this.rbEquipAll.Group;
+			this.table2.Add(this.rbEquipNumeric);
+			global::Gtk.Table.TableChild w9 = ((global::Gtk.Table.TableChild)(this.table2[this.rbEquipNumeric]));
+			w9.XOptions = ((global::Gtk.AttachOptions)(4));
+			w9.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table2.Gtk.Table+TableChild
+			this.rbEquipPercent = new global::Gtk.RadioButton("");
+			this.rbEquipPercent.CanFocus = true;
+			this.rbEquipPercent.Name = "rbEquipPercent";
+			this.rbEquipPercent.DrawIndicator = true;
+			this.rbEquipPercent.UseUnderline = true;
+			this.rbEquipPercent.Group = this.rbEquipAll.Group;
+			this.table2.Add(this.rbEquipPercent);
+			global::Gtk.Table.TableChild w10 = ((global::Gtk.Table.TableChild)(this.table2[this.rbEquipPercent]));
+			w10.TopAttach = ((uint)(1));
+			w10.BottomAttach = ((uint)(2));
+			w10.XOptions = ((global::Gtk.AttachOptions)(4));
+			w10.YOptions = ((global::Gtk.AttachOptions)(4));
+			this.hbox2.Add(this.table2);
+			global::Gtk.Box.BoxChild w11 = ((global::Gtk.Box.BoxChild)(this.hbox2[this.table2]));
+			w11.Position = 0;
+			w11.Expand = false;
+			w11.Fill = false;
+			this.table1.Add(this.hbox2);
+			global::Gtk.Table.TableChild w12 = ((global::Gtk.Table.TableChild)(this.table1[this.hbox2]));
+			w12.TopAttach = ((uint)(1));
+			w12.BottomAttach = ((uint)(2));
+			w12.LeftAttach = ((uint)(1));
+			w12.RightAttach = ((uint)(2));
+			w12.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table1.Gtk.Table+TableChild
+			this.lblAmount = new global::IBBoard.GtkSharp.Translatable.TranslatableLabel();
+			this.lblAmount.Name = "lblAmount";
+			this.lblAmount.LabelProp = global::Mono.Unix.Catalog.GetString("amount:");
+			this.table1.Add(this.lblAmount);
+			global::Gtk.Table.TableChild w13 = ((global::Gtk.Table.TableChild)(this.table1[this.lblAmount]));
+			w13.TopAttach = ((uint)(1));
+			w13.BottomAttach = ((uint)(2));
+			w13.XOptions = ((global::Gtk.AttachOptions)(4));
+			w13.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table1.Gtk.Table+TableChild
+			this.lblItem = new global::IBBoard.GtkSharp.Translatable.TranslatableLabel();
+			this.lblItem.Name = "lblItem";
+			this.lblItem.LabelProp = global::Mono.Unix.Catalog.GetString("equipment");
+			this.table1.Add(this.lblItem);
+			global::Gtk.Table.TableChild w14 = ((global::Gtk.Table.TableChild)(this.table1[this.lblItem]));
+			w14.XOptions = ((global::Gtk.AttachOptions)(4));
+			w14.YOptions = ((global::Gtk.AttachOptions)(4));
+			w1.Add(this.table1);
+			global::Gtk.Box.BoxChild w15 = ((global::Gtk.Box.BoxChild)(w1[this.table1]));
+			w15.Position = 0;
+			w15.Expand = false;
+			w15.Fill = false;
+			// Internal child IBBoard.WarFoundry.GUI.GTK.FrmAddEquipment.ActionArea
+			global::Gtk.HButtonBox w16 = this.ActionArea;
+			w16.Name = "dialog1_ActionArea";
+			w16.Spacing = 10;
+			w16.BorderWidth = ((uint)(5));
+			w16.LayoutStyle = ((global::Gtk.ButtonBoxStyle)(4));
+			// Container child dialog1_ActionArea.Gtk.ButtonBox+ButtonBoxChild
+			this.bttnCancel = new global::IBBoard.GtkSharp.Translatable.TranslatableButton();
+			this.bttnCancel.CanDefault = true;
+			this.bttnCancel.CanFocus = true;
+			this.bttnCancel.Name = "bttnCancel";
+			this.bttnCancel.UseStock = true;
+			this.bttnCancel.UseUnderline = true;
+			this.bttnCancel.Label = "gtk-cancel";
+			this.AddActionWidget(this.bttnCancel, -6);
+			global::Gtk.ButtonBox.ButtonBoxChild w17 = ((global::Gtk.ButtonBox.ButtonBoxChild)(w16[this.bttnCancel]));
+			w17.Expand = false;
+			w17.Fill = false;
+			// Container child dialog1_ActionArea.Gtk.ButtonBox+ButtonBoxChild
+			this.bttnOkay = new global::IBBoard.GtkSharp.Translatable.TranslatableButton();
+			this.bttnOkay.CanDefault = true;
+			this.bttnOkay.CanFocus = true;
+			this.bttnOkay.Name = "bttnOkay";
+			this.bttnOkay.UseStock = true;
+			this.bttnOkay.UseUnderline = true;
+			this.bttnOkay.Label = "gtk-ok";
+			this.AddActionWidget(this.bttnOkay, -5);
+			global::Gtk.ButtonBox.ButtonBoxChild w18 = ((global::Gtk.ButtonBox.ButtonBoxChild)(w16[this.bttnOkay]));
+			w18.Position = 1;
+			w18.Expand = false;
+			w18.Fill = false;
+			if ((this.Child != null))
+			{
+				this.Child.ShowAll();
+			}
+			this.DefaultWidth = 400;
+			this.DefaultHeight = 300;
+			this.Show();
+			this.rbEquipNumeric.Clicked += new global::System.EventHandler(this.RadioButtonClicked);
+			this.percentageAmount.ValueChanged += new global::System.EventHandler(this.SpinButtonValueChanged);
+			this.numericAmount.ValueChanged += new global::System.EventHandler(this.SpinButtonValueChanged);
+			this.bttnCancel.Clicked += new global::System.EventHandler(this.CancelButtonClicked);
+			this.bttnOkay.Clicked += new global::System.EventHandler(this.OkayButtonClicked);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gtk-gui/IBBoard.WarFoundry.GUI.GTK.FrmEditEquipment.cs	Mon Jan 17 19:43:47 2011 +0000
@@ -0,0 +1,208 @@
+
+// This file has been generated by the GUI designer. Do not modify.
+namespace IBBoard.WarFoundry.GUI.GTK
+{
+	public partial class FrmEditEquipment
+	{
+		private global::Gtk.Table table1;
+		private global::Gtk.HBox hbox2;
+		private global::Gtk.Table table2;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableLabel lblEquipAll;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableLabel lblPercent;
+		private global::Gtk.SpinButton numericAmount;
+		private global::Gtk.SpinButton percentageAmount;
+		private global::Gtk.RadioButton rbEquipAll;
+		private global::Gtk.RadioButton rbEquipNumeric;
+		private global::Gtk.RadioButton rbEquipPercent;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableLabel lblAmount;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableButton bttnCancel;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableButton bttnOkay;
+
+		protected virtual void Build()
+		{
+			global::Stetic.Gui.Initialize(this);
+			// Widget IBBoard.WarFoundry.GUI.GTK.FrmEditEquipment
+			this.Name = "IBBoard.WarFoundry.GUI.GTK.FrmEditEquipment";
+			this.Title = global::Mono.Unix.Catalog.GetString("Edit equipment");
+			this.WindowPosition = ((global::Gtk.WindowPosition)(4));
+			this.Modal = true;
+			this.SkipPagerHint = true;
+			this.SkipTaskbarHint = true;
+			// Internal child IBBoard.WarFoundry.GUI.GTK.FrmEditEquipment.VBox
+			global::Gtk.VBox w1 = this.VBox;
+			w1.Name = "dialog1_VBox";
+			w1.BorderWidth = ((uint)(2));
+			// Container child dialog1_VBox.Gtk.Box+BoxChild
+			this.table1 = new global::Gtk.Table(((uint)(1)), ((uint)(2)), false);
+			this.table1.Name = "table1";
+			this.table1.RowSpacing = ((uint)(6));
+			this.table1.ColumnSpacing = ((uint)(6));
+			// Container child table1.Gtk.Table+TableChild
+			this.hbox2 = new global::Gtk.HBox();
+			this.hbox2.Name = "hbox2";
+			this.hbox2.Spacing = 6;
+			// Container child hbox2.Gtk.Box+BoxChild
+			this.table2 = new global::Gtk.Table(((uint)(3)), ((uint)(3)), false);
+			this.table2.Name = "table2";
+			this.table2.RowSpacing = ((uint)(6));
+			this.table2.ColumnSpacing = ((uint)(6));
+			// Container child table2.Gtk.Table+TableChild
+			this.lblEquipAll = new global::IBBoard.GtkSharp.Translatable.TranslatableLabel();
+			this.lblEquipAll.Name = "lblEquipAll";
+			this.lblEquipAll.LabelProp = global::Mono.Unix.Catalog.GetString("equip all");
+			this.table2.Add(this.lblEquipAll);
+			global::Gtk.Table.TableChild w2 = ((global::Gtk.Table.TableChild)(this.table2[this.lblEquipAll]));
+			w2.TopAttach = ((uint)(2));
+			w2.BottomAttach = ((uint)(3));
+			w2.LeftAttach = ((uint)(1));
+			w2.RightAttach = ((uint)(2));
+			w2.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table2.Gtk.Table+TableChild
+			this.lblPercent = new global::IBBoard.GtkSharp.Translatable.TranslatableLabel();
+			this.lblPercent.Name = "lblPercent";
+			this.lblPercent.LabelProp = global::Mono.Unix.Catalog.GetString("%");
+			this.table2.Add(this.lblPercent);
+			global::Gtk.Table.TableChild w3 = ((global::Gtk.Table.TableChild)(this.table2[this.lblPercent]));
+			w3.TopAttach = ((uint)(1));
+			w3.BottomAttach = ((uint)(2));
+			w3.LeftAttach = ((uint)(2));
+			w3.RightAttach = ((uint)(3));
+			w3.XOptions = ((global::Gtk.AttachOptions)(4));
+			w3.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table2.Gtk.Table+TableChild
+			this.numericAmount = new global::Gtk.SpinButton(0, 100, 1);
+			this.numericAmount.CanFocus = true;
+			this.numericAmount.Name = "numericAmount";
+			this.numericAmount.Adjustment.PageIncrement = 10;
+			this.numericAmount.ClimbRate = 1;
+			this.numericAmount.Numeric = true;
+			this.table2.Add(this.numericAmount);
+			global::Gtk.Table.TableChild w4 = ((global::Gtk.Table.TableChild)(this.table2[this.numericAmount]));
+			w4.LeftAttach = ((uint)(1));
+			w4.RightAttach = ((uint)(2));
+			w4.XOptions = ((global::Gtk.AttachOptions)(0));
+			w4.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table2.Gtk.Table+TableChild
+			this.percentageAmount = new global::Gtk.SpinButton(0, 100, 1);
+			this.percentageAmount.CanFocus = true;
+			this.percentageAmount.Name = "percentageAmount";
+			this.percentageAmount.Adjustment.PageIncrement = 10;
+			this.percentageAmount.ClimbRate = 1;
+			this.percentageAmount.Digits = ((uint)(1));
+			this.percentageAmount.Numeric = true;
+			this.table2.Add(this.percentageAmount);
+			global::Gtk.Table.TableChild w5 = ((global::Gtk.Table.TableChild)(this.table2[this.percentageAmount]));
+			w5.TopAttach = ((uint)(1));
+			w5.BottomAttach = ((uint)(2));
+			w5.LeftAttach = ((uint)(1));
+			w5.RightAttach = ((uint)(2));
+			w5.XOptions = ((global::Gtk.AttachOptions)(0));
+			w5.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table2.Gtk.Table+TableChild
+			this.rbEquipAll = new global::Gtk.RadioButton("");
+			this.rbEquipAll.CanFocus = true;
+			this.rbEquipAll.Name = "rbEquipAll";
+			this.rbEquipAll.DrawIndicator = true;
+			this.rbEquipAll.UseUnderline = true;
+			this.rbEquipAll.Group = new global::GLib.SList(global::System.IntPtr.Zero);
+			this.table2.Add(this.rbEquipAll);
+			global::Gtk.Table.TableChild w6 = ((global::Gtk.Table.TableChild)(this.table2[this.rbEquipAll]));
+			w6.TopAttach = ((uint)(2));
+			w6.BottomAttach = ((uint)(3));
+			w6.XOptions = ((global::Gtk.AttachOptions)(4));
+			w6.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table2.Gtk.Table+TableChild
+			this.rbEquipNumeric = new global::Gtk.RadioButton("");
+			this.rbEquipNumeric.CanFocus = true;
+			this.rbEquipNumeric.Name = "rbEquipNumeric";
+			this.rbEquipNumeric.DrawIndicator = true;
+			this.rbEquipNumeric.UseUnderline = true;
+			this.rbEquipNumeric.Group = this.rbEquipAll.Group;
+			this.table2.Add(this.rbEquipNumeric);
+			global::Gtk.Table.TableChild w7 = ((global::Gtk.Table.TableChild)(this.table2[this.rbEquipNumeric]));
+			w7.XOptions = ((global::Gtk.AttachOptions)(4));
+			w7.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table2.Gtk.Table+TableChild
+			this.rbEquipPercent = new global::Gtk.RadioButton("");
+			this.rbEquipPercent.CanFocus = true;
+			this.rbEquipPercent.Name = "rbEquipPercent";
+			this.rbEquipPercent.DrawIndicator = true;
+			this.rbEquipPercent.UseUnderline = true;
+			this.rbEquipPercent.Group = this.rbEquipAll.Group;
+			this.table2.Add(this.rbEquipPercent);
+			global::Gtk.Table.TableChild w8 = ((global::Gtk.Table.TableChild)(this.table2[this.rbEquipPercent]));
+			w8.TopAttach = ((uint)(1));
+			w8.BottomAttach = ((uint)(2));
+			w8.XOptions = ((global::Gtk.AttachOptions)(4));
+			w8.YOptions = ((global::Gtk.AttachOptions)(4));
+			this.hbox2.Add(this.table2);
+			global::Gtk.Box.BoxChild w9 = ((global::Gtk.Box.BoxChild)(this.hbox2[this.table2]));
+			w9.Position = 0;
+			w9.Expand = false;
+			w9.Fill = false;
+			this.table1.Add(this.hbox2);
+			global::Gtk.Table.TableChild w10 = ((global::Gtk.Table.TableChild)(this.table1[this.hbox2]));
+			w10.LeftAttach = ((uint)(1));
+			w10.RightAttach = ((uint)(2));
+			w10.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table1.Gtk.Table+TableChild
+			this.lblAmount = new global::IBBoard.GtkSharp.Translatable.TranslatableLabel();
+			this.lblAmount.Name = "lblAmount";
+			this.lblAmount.LabelProp = global::Mono.Unix.Catalog.GetString("amount:");
+			this.lblAmount.Justify = ((global::Gtk.Justification)(1));
+			this.table1.Add(this.lblAmount);
+			global::Gtk.Table.TableChild w11 = ((global::Gtk.Table.TableChild)(this.table1[this.lblAmount]));
+			w11.YOptions = ((global::Gtk.AttachOptions)(4));
+			w1.Add(this.table1);
+			global::Gtk.Box.BoxChild w12 = ((global::Gtk.Box.BoxChild)(w1[this.table1]));
+			w12.Position = 0;
+			w12.Expand = false;
+			w12.Fill = false;
+			// Internal child IBBoard.WarFoundry.GUI.GTK.FrmEditEquipment.ActionArea
+			global::Gtk.HButtonBox w13 = this.ActionArea;
+			w13.Name = "dialog1_ActionArea";
+			w13.Spacing = 10;
+			w13.BorderWidth = ((uint)(5));
+			w13.LayoutStyle = ((global::Gtk.ButtonBoxStyle)(4));
+			// Container child dialog1_ActionArea.Gtk.ButtonBox+ButtonBoxChild
+			this.bttnCancel = new global::IBBoard.GtkSharp.Translatable.TranslatableButton();
+			this.bttnCancel.CanDefault = true;
+			this.bttnCancel.CanFocus = true;
+			this.bttnCancel.Name = "bttnCancel";
+			this.bttnCancel.UseStock = true;
+			this.bttnCancel.UseUnderline = true;
+			this.bttnCancel.Label = "gtk-cancel";
+			this.AddActionWidget(this.bttnCancel, -6);
+			global::Gtk.ButtonBox.ButtonBoxChild w14 = ((global::Gtk.ButtonBox.ButtonBoxChild)(w13[this.bttnCancel]));
+			w14.Expand = false;
+			w14.Fill = false;
+			// Container child dialog1_ActionArea.Gtk.ButtonBox+ButtonBoxChild
+			this.bttnOkay = new global::IBBoard.GtkSharp.Translatable.TranslatableButton();
+			this.bttnOkay.CanDefault = true;
+			this.bttnOkay.CanFocus = true;
+			this.bttnOkay.Name = "bttnOkay";
+			this.bttnOkay.UseStock = true;
+			this.bttnOkay.UseUnderline = true;
+			this.bttnOkay.Label = "gtk-ok";
+			this.AddActionWidget(this.bttnOkay, -5);
+			global::Gtk.ButtonBox.ButtonBoxChild w15 = ((global::Gtk.ButtonBox.ButtonBoxChild)(w13[this.bttnOkay]));
+			w15.Position = 1;
+			w15.Expand = false;
+			w15.Fill = false;
+			if ((this.Child != null))
+			{
+				this.Child.ShowAll();
+			}
+			this.DefaultWidth = 280;
+			this.DefaultHeight = 175;
+			this.Show();
+			this.rbEquipPercent.Clicked += new global::System.EventHandler(this.RadioButtonClicked);
+			this.rbEquipNumeric.Clicked += new global::System.EventHandler(this.RadioButtonClicked);
+			this.rbEquipAll.Clicked += new global::System.EventHandler(this.RadioButtonClicked);
+			this.percentageAmount.ValueChanged += new global::System.EventHandler(this.SpinButtonValueChanged);
+			this.numericAmount.ValueChanged += new global::System.EventHandler(this.SpinButtonValueChanged);
+			this.bttnCancel.Clicked += new global::System.EventHandler(this.CancelButtonClicked);
+			this.bttnOkay.Clicked += new global::System.EventHandler(this.OkayButtonClicked);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gtk-gui/IBBoard.WarFoundry.GUI.GTK.FrmMainWindow.cs	Mon Jan 17 19:43:47 2011 +0000
@@ -0,0 +1,220 @@
+
+// This file has been generated by the GUI designer. Do not modify.
+namespace IBBoard.WarFoundry.GUI.GTK
+{
+	public partial class FrmMainWindow
+	{
+		private global::Gtk.UIManager UIManager;
+		private global::Gtk.Action menuFile;
+		private global::Gtk.Action miNewArmy;
+		private global::Gtk.Action miOpenArmy;
+		private global::Gtk.Action miSaveArmy;
+		private global::Gtk.Action miSaveArmyAs;
+		private global::Gtk.Action miCloseArmy;
+		private global::Gtk.Action miReloadFiles;
+		private global::Gtk.Action miExit;
+		private global::Gtk.Action menuEdit;
+		private global::Gtk.Action miUndo;
+		private global::Gtk.Action miRedo;
+		private global::Gtk.Action menuHelp;
+		private global::Gtk.Action miAbout;
+		private global::Gtk.Action miDebugInformation;
+		private global::Gtk.Action bttnNewArmy;
+		private global::Gtk.Action bttnOpenArmy;
+		private global::Gtk.Action bttnSaveArmy;
+		private global::Gtk.Action bttnUndo;
+		private global::Gtk.Action bttnRedo;
+		private global::Gtk.Action goDown;
+		private global::Gtk.Action add;
+		private global::Gtk.Action miExportArmyAs;
+		private global::Gtk.Action miExportArmyAsBasicHTML;
+		private global::Gtk.Action miPreferences;
+		private global::Gtk.VBox vbox1;
+		private global::Gtk.MenuBar menubar1;
+		private global::Gtk.Toolbar toolbar;
+		private global::Gtk.HPaned hpaned2;
+		private global::Gtk.TreeView treeUnits;
+		private global::Gtk.Notebook unitsNotebook;
+		private global::Gtk.Statusbar statusbar1;
+		private global::Gtk.Label lblTotalPoints;
+
+		protected virtual void Build()
+		{
+			global::Stetic.Gui.Initialize(this);
+			// Widget IBBoard.WarFoundry.GUI.GTK.FrmMainWindow
+			this.UIManager = new global::Gtk.UIManager();
+			global::Gtk.ActionGroup w1 = new global::Gtk.ActionGroup("Default");
+			this.menuFile = new global::Gtk.Action("menuFile", global::Mono.Unix.Catalog.GetString("File"), null, null);
+			this.menuFile.ShortLabel = global::Mono.Unix.Catalog.GetString("File");
+			w1.Add(this.menuFile, null);
+			this.miNewArmy = new global::Gtk.Action("miNewArmy", global::Mono.Unix.Catalog.GetString("Create army"), null, "gtk-new");
+			this.miNewArmy.ShortLabel = global::Mono.Unix.Catalog.GetString("Create army");
+			w1.Add(this.miNewArmy, null);
+			this.miOpenArmy = new global::Gtk.Action("miOpenArmy", global::Mono.Unix.Catalog.GetString("Open army"), null, "gtk-open");
+			this.miOpenArmy.ShortLabel = global::Mono.Unix.Catalog.GetString("Open army");
+			w1.Add(this.miOpenArmy, null);
+			this.miSaveArmy = new global::Gtk.Action("miSaveArmy", global::Mono.Unix.Catalog.GetString("Save army"), null, "gtk-save");
+			this.miSaveArmy.Sensitive = false;
+			this.miSaveArmy.ShortLabel = global::Mono.Unix.Catalog.GetString("Save army");
+			w1.Add(this.miSaveArmy, null);
+			this.miSaveArmyAs = new global::Gtk.Action("miSaveArmyAs", global::Mono.Unix.Catalog.GetString("Save army as"), null, "gtk-save-as");
+			this.miSaveArmyAs.Sensitive = false;
+			this.miSaveArmyAs.ShortLabel = global::Mono.Unix.Catalog.GetString("Save army as");
+			w1.Add(this.miSaveArmyAs, null);
+			this.miCloseArmy = new global::Gtk.Action("miCloseArmy", global::Mono.Unix.Catalog.GetString("Close army"), null, "gtk-close");
+			this.miCloseArmy.Sensitive = false;
+			this.miCloseArmy.ShortLabel = global::Mono.Unix.Catalog.GetString("Close army");
+			w1.Add(this.miCloseArmy, null);
+			this.miReloadFiles = new global::Gtk.Action("miReloadFiles", global::Mono.Unix.Catalog.GetString("Reload files"), null, "gtk-refresh");
+			this.miReloadFiles.ShortLabel = global::Mono.Unix.Catalog.GetString("Reload files");
+			w1.Add(this.miReloadFiles, null);
+			this.miExit = new global::Gtk.Action("miExit", global::Mono.Unix.Catalog.GetString("Exit"), null, "gtk-quit");
+			this.miExit.ShortLabel = global::Mono.Unix.Catalog.GetString("Exit");
+			w1.Add(this.miExit, null);
+			this.menuEdit = new global::Gtk.Action("menuEdit", global::Mono.Unix.Catalog.GetString("Edit"), null, null);
+			this.menuEdit.ShortLabel = global::Mono.Unix.Catalog.GetString("Edit");
+			w1.Add(this.menuEdit, null);
+			this.miUndo = new global::Gtk.Action("miUndo", global::Mono.Unix.Catalog.GetString("Undo"), null, "gtk-undo");
+			this.miUndo.Sensitive = false;
+			this.miUndo.ShortLabel = global::Mono.Unix.Catalog.GetString("Undo");
+			w1.Add(this.miUndo, null);
+			this.miRedo = new global::Gtk.Action("miRedo", global::Mono.Unix.Catalog.GetString("Redo"), null, "gtk-redo");
+			this.miRedo.Sensitive = false;
+			this.miRedo.ShortLabel = global::Mono.Unix.Catalog.GetString("Redo");
+			w1.Add(this.miRedo, null);
+			this.menuHelp = new global::Gtk.Action("menuHelp", global::Mono.Unix.Catalog.GetString("Help"), null, null);
+			this.menuHelp.ShortLabel = global::Mono.Unix.Catalog.GetString("Help");
+			w1.Add(this.menuHelp, null);
+			this.miAbout = new global::Gtk.Action("miAbout", global::Mono.Unix.Catalog.GetString("About"), null, "gtk-about");
+			this.miAbout.ShortLabel = global::Mono.Unix.Catalog.GetString("About");
+			w1.Add(this.miAbout, null);
+			this.miDebugInformation = new global::Gtk.Action("miDebugInformation", global::Mono.Unix.Catalog.GetString("Debug Information"), null, null);
+			this.miDebugInformation.ShortLabel = global::Mono.Unix.Catalog.GetString("Debug Information");
+			w1.Add(this.miDebugInformation, null);
+			this.bttnNewArmy = new global::Gtk.Action("bttnNewArmy", null, null, "gtk-new");
+			w1.Add(this.bttnNewArmy, null);
+			this.bttnOpenArmy = new global::Gtk.Action("bttnOpenArmy", null, null, "gtk-open");
+			w1.Add(this.bttnOpenArmy, null);
+			this.bttnSaveArmy = new global::Gtk.Action("bttnSaveArmy", null, null, "gtk-save");
+			this.bttnSaveArmy.Sensitive = false;
+			w1.Add(this.bttnSaveArmy, null);
+			this.bttnUndo = new global::Gtk.Action("bttnUndo", null, null, "gtk-undo");
+			this.bttnUndo.Sensitive = false;
+			w1.Add(this.bttnUndo, null);
+			this.bttnRedo = new global::Gtk.Action("bttnRedo", null, null, "gtk-redo");
+			this.bttnRedo.Sensitive = false;
+			w1.Add(this.bttnRedo, null);
+			this.goDown = new global::Gtk.Action("goDown", null, null, null);
+			w1.Add(this.goDown, null);
+			this.add = new global::Gtk.Action("add", null, null, "gtk-add");
+			w1.Add(this.add, null);
+			this.miExportArmyAs = new global::Gtk.Action("miExportArmyAs", global::Mono.Unix.Catalog.GetString("Export army as..."), null, "gtk-convert");
+			this.miExportArmyAs.Sensitive = false;
+			this.miExportArmyAs.ShortLabel = global::Mono.Unix.Catalog.GetString("Export army as...");
+			w1.Add(this.miExportArmyAs, null);
+			this.miExportArmyAsBasicHTML = new global::Gtk.Action("miExportArmyAsBasicHTML", global::Mono.Unix.Catalog.GetString("Basic HTML"), null, null);
+			this.miExportArmyAsBasicHTML.ShortLabel = global::Mono.Unix.Catalog.GetString("Basic HTML");
+			w1.Add(this.miExportArmyAsBasicHTML, null);
+			this.miPreferences = new global::Gtk.Action("miPreferences", global::Mono.Unix.Catalog.GetString("preferences"), null, "gtk-preferences");
+			this.miPreferences.ShortLabel = global::Mono.Unix.Catalog.GetString("preferences");
+			w1.Add(this.miPreferences, null);
+			this.UIManager.InsertActionGroup(w1, 0);
+			this.AddAccelGroup(this.UIManager.AccelGroup);
+			this.Name = "IBBoard.WarFoundry.GUI.GTK.FrmMainWindow";
+			this.Title = global::Mono.Unix.Catalog.GetString("MainWindow");
+			this.Icon = global::Gdk.Pixbuf.LoadFromResource("App.ico");
+			// Container child IBBoard.WarFoundry.GUI.GTK.FrmMainWindow.Gtk.Container+ContainerChild
+			this.vbox1 = new global::Gtk.VBox();
+			this.vbox1.Name = "vbox1";
+			// Container child vbox1.Gtk.Box+BoxChild
+			this.UIManager.AddUiFromString("<ui><menubar name='menubar1'><menu name='menuFile' action='menuFile'><menuitem name='miNewArmy' action='miNewArmy'/><menuitem name='miOpenArmy' action='miOpenArmy'/><menuitem name='miSaveArmy' action='miSaveArmy'/><menuitem name='miSaveArmyAs' action='miSaveArmyAs'/><menu name='miExportArmyAs' action='miExportArmyAs'><menuitem name='miExportArmyAsBasicHTML' action='miExportArmyAsBasicHTML'/></menu><menuitem name='miCloseArmy' action='miCloseArmy'/><separator/><menuitem name='miReloadFiles' action='miReloadFiles'/><separator/><menuitem name='miExit' action='miExit'/></menu><menu name='menuEdit' action='menuEdit'><menuitem name='miUndo' action='miUndo'/><menuitem name='miRedo' action='miRedo'/><separator/><menuitem name='miPreferences' action='miPreferences'/></menu><menu name='menuHelp' action='menuHelp'><menuitem name='miAbout' action='miAbout'/></menu></menubar></ui>");
+			this.menubar1 = ((global::Gtk.MenuBar)(this.UIManager.GetWidget("/menubar1")));
+			this.menubar1.Name = "menubar1";
+			this.vbox1.Add(this.menubar1);
+			global::Gtk.Box.BoxChild w2 = ((global::Gtk.Box.BoxChild)(this.vbox1[this.menubar1]));
+			w2.Position = 0;
+			w2.Expand = false;
+			w2.Fill = false;
+			// Container child vbox1.Gtk.Box+BoxChild
+			this.UIManager.AddUiFromString("<ui><toolbar name='toolbar'><toolitem name='bttnNewArmy' action='bttnNewArmy'/><toolitem name='bttnOpenArmy' action='bttnOpenArmy'/><toolitem name='bttnSaveArmy' action='bttnSaveArmy'/><separator/><toolitem name='bttnUndo' action='bttnUndo'/><toolitem name='bttnRedo' action='bttnRedo'/><separator/></toolbar></ui>");
+			this.toolbar = ((global::Gtk.Toolbar)(this.UIManager.GetWidget("/toolbar")));
+			this.toolbar.HeightRequest = 36;
+			this.toolbar.Name = "toolbar";
+			this.toolbar.ShowArrow = false;
+			this.toolbar.ToolbarStyle = ((global::Gtk.ToolbarStyle)(0));
+			this.toolbar.IconSize = ((global::Gtk.IconSize)(3));
+			this.vbox1.Add(this.toolbar);
+			global::Gtk.Box.BoxChild w3 = ((global::Gtk.Box.BoxChild)(this.vbox1[this.toolbar]));
+			w3.Position = 1;
+			w3.Expand = false;
+			w3.Fill = false;
+			// Container child vbox1.Gtk.Box+BoxChild
+			this.hpaned2 = new global::Gtk.HPaned();
+			this.hpaned2.CanFocus = true;
+			this.hpaned2.Name = "hpaned2";
+			this.hpaned2.Position = 178;
+			// Container child hpaned2.Gtk.Paned+PanedChild
+			this.treeUnits = new global::Gtk.TreeView();
+			this.treeUnits.CanFocus = true;
+			this.treeUnits.Name = "treeUnits";
+			this.hpaned2.Add(this.treeUnits);
+			global::Gtk.Paned.PanedChild w4 = ((global::Gtk.Paned.PanedChild)(this.hpaned2[this.treeUnits]));
+			w4.Resize = false;
+			// Container child hpaned2.Gtk.Paned+PanedChild
+			this.unitsNotebook = new global::Gtk.Notebook();
+			this.unitsNotebook.CanFocus = true;
+			this.unitsNotebook.Name = "unitsNotebook";
+			this.unitsNotebook.CurrentPage = -1;
+			this.unitsNotebook.Scrollable = true;
+			this.hpaned2.Add(this.unitsNotebook);
+			this.vbox1.Add(this.hpaned2);
+			global::Gtk.Box.BoxChild w6 = ((global::Gtk.Box.BoxChild)(this.vbox1[this.hpaned2]));
+			w6.Position = 2;
+			// Container child vbox1.Gtk.Box+BoxChild
+			this.statusbar1 = new global::Gtk.Statusbar();
+			this.statusbar1.Name = "statusbar1";
+			this.statusbar1.Spacing = 2;
+			// Container child statusbar1.Gtk.Box+BoxChild
+			this.lblTotalPoints = new global::Gtk.Label();
+			this.lblTotalPoints.Name = "lblTotalPoints";
+			this.statusbar1.Add(this.lblTotalPoints);
+			global::Gtk.Box.BoxChild w7 = ((global::Gtk.Box.BoxChild)(this.statusbar1[this.lblTotalPoints]));
+			w7.Position = 2;
+			w7.Expand = false;
+			w7.Fill = false;
+			this.vbox1.Add(this.statusbar1);
+			global::Gtk.Box.BoxChild w8 = ((global::Gtk.Box.BoxChild)(this.vbox1[this.statusbar1]));
+			w8.Position = 3;
+			w8.Expand = false;
+			w8.Fill = false;
+			this.Add(this.vbox1);
+			if ((this.Child != null))
+			{
+				this.Child.ShowAll();
+			}
+			this.DefaultWidth = 832;
+			this.DefaultHeight = 659;
+			this.hpaned2.Hide();
+			this.Show();
+			this.miNewArmy.Activated += new global::System.EventHandler(this.OnCreateArmyActivated);
+			this.miOpenArmy.Activated += new global::System.EventHandler(this.OnOpenArmyActivated);
+			this.miSaveArmy.Activated += new global::System.EventHandler(this.OnSaveArmyActivated);
+			this.miSaveArmyAs.Activated += new global::System.EventHandler(this.OnSaveArmyAsActivated);
+			this.miCloseArmy.Activated += new global::System.EventHandler(this.OnCloseArmyActivated);
+			this.miReloadFiles.Activated += new global::System.EventHandler(this.OnReloadFilesActivated);
+			this.miExit.Activated += new global::System.EventHandler(this.OnExitActivated);
+			this.miAbout.Activated += new global::System.EventHandler(this.HelpAboutActivated);
+			this.bttnNewArmy.Activated += new global::System.EventHandler(this.newTBButtonActivated);
+			this.bttnOpenArmy.Activated += new global::System.EventHandler(this.openTBButtonActivated);
+			this.bttnSaveArmy.Activated += new global::System.EventHandler(this.saveTBButtonActivated);
+			this.bttnUndo.Activated += new global::System.EventHandler(this.undoTBButtonActivated);
+			this.bttnRedo.Activated += new global::System.EventHandler(this.redoTBButtonActivated);
+			this.miExportArmyAsBasicHTML.Activated += new global::System.EventHandler(this.OnMiExportAsBasicHtmlActivated);
+			this.miPreferences.Activated += new global::System.EventHandler(this.miPreferencesClicked);
+			this.treeUnits.RowActivated += new global::Gtk.RowActivatedHandler(this.ArmyRowActivated);
+			this.treeUnits.PopupMenu += new global::Gtk.PopupMenuHandler(this.OnTreeUnitsPopupMenu);
+			this.treeUnits.ButtonPressEvent += new global::Gtk.ButtonPressEventHandler(this.UnitTreeButtonPressed);
+			this.unitsNotebook.Removed += new global::Gtk.RemovedHandler(this.NotebookPageRemoved);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gtk-gui/IBBoard.WarFoundry.GUI.GTK.FrmNewArmy.cs	Mon Jan 17 19:43:47 2011 +0000
@@ -0,0 +1,203 @@
+
+// This file has been generated by the GUI designer. Do not modify.
+namespace IBBoard.WarFoundry.GUI.GTK
+{
+	public partial class FrmNewArmy
+	{
+		private global::Gtk.Table table1;
+		private global::Gtk.ScrolledWindow GtkScrolledWindow;
+		private global::Gtk.TreeView lstRaces;
+		private global::Gtk.HBox hbox2;
+		private global::Gtk.SpinButton sbPointsValue;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableLabel lblArmyName;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableLabel lblArmySize;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableLabel lblGameSystem;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableLabel lblRaceList;
+		private global::Gtk.ComboBoxEntry systemCombo;
+		private global::Gtk.Entry txtArmyName;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableButton bttnCancel;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableButton bttnCreate;
+
+		protected virtual void Build()
+		{
+			global::Stetic.Gui.Initialize(this);
+			// Widget IBBoard.WarFoundry.GUI.GTK.FrmNewArmy
+			this.Events = ((global::Gdk.EventMask)(256));
+			this.Name = "IBBoard.WarFoundry.GUI.GTK.FrmNewArmy";
+			this.Title = global::Mono.Unix.Catalog.GetString("Create new army");
+			this.Icon = global::Stetic.IconLoader.LoadIcon(this, "gtk-new", global::Gtk.IconSize.Menu);
+			this.WindowPosition = ((global::Gtk.WindowPosition)(4));
+			this.SkipPagerHint = true;
+			this.SkipTaskbarHint = true;
+			// Internal child IBBoard.WarFoundry.GUI.GTK.FrmNewArmy.VBox
+			global::Gtk.VBox w1 = this.VBox;
+			w1.CanFocus = true;
+			w1.Events = ((global::Gdk.EventMask)(256));
+			w1.Name = "dialog_VBox";
+			w1.BorderWidth = ((uint)(2));
+			// Container child dialog_VBox.Gtk.Box+BoxChild
+			this.table1 = new global::Gtk.Table(((uint)(4)), ((uint)(2)), false);
+			this.table1.Name = "table1";
+			this.table1.RowSpacing = ((uint)(6));
+			this.table1.ColumnSpacing = ((uint)(6));
+			// Container child table1.Gtk.Table+TableChild
+			this.GtkScrolledWindow = new global::Gtk.ScrolledWindow();
+			this.GtkScrolledWindow.Name = "GtkScrolledWindow";
+			this.GtkScrolledWindow.ShadowType = ((global::Gtk.ShadowType)(1));
+			// Container child GtkScrolledWindow.Gtk.Container+ContainerChild
+			this.lstRaces = new global::Gtk.TreeView();
+			this.lstRaces.HeightRequest = 150;
+			this.lstRaces.CanFocus = true;
+			this.lstRaces.Name = "lstRaces";
+			this.lstRaces.HeadersVisible = false;
+			this.lstRaces.RulesHint = true;
+			this.GtkScrolledWindow.Add(this.lstRaces);
+			this.table1.Add(this.GtkScrolledWindow);
+			global::Gtk.Table.TableChild w3 = ((global::Gtk.Table.TableChild)(this.table1[this.GtkScrolledWindow]));
+			w3.TopAttach = ((uint)(1));
+			w3.BottomAttach = ((uint)(2));
+			w3.LeftAttach = ((uint)(1));
+			w3.RightAttach = ((uint)(2));
+			w3.XOptions = ((global::Gtk.AttachOptions)(4));
+			w3.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table1.Gtk.Table+TableChild
+			this.hbox2 = new global::Gtk.HBox();
+			this.hbox2.Name = "hbox2";
+			// Container child hbox2.Gtk.Box+BoxChild
+			this.sbPointsValue = new global::Gtk.SpinButton(0, 2000000000, 100);
+			this.sbPointsValue.WidthRequest = 150;
+			this.sbPointsValue.CanFocus = true;
+			this.sbPointsValue.Name = "sbPointsValue";
+			this.sbPointsValue.Adjustment.PageIncrement = 1000;
+			this.sbPointsValue.ClimbRate = 100;
+			this.sbPointsValue.Numeric = true;
+			this.sbPointsValue.Value = 1000;
+			this.hbox2.Add(this.sbPointsValue);
+			global::Gtk.Box.BoxChild w4 = ((global::Gtk.Box.BoxChild)(this.hbox2[this.sbPointsValue]));
+			w4.Position = 0;
+			w4.Expand = false;
+			w4.Fill = false;
+			this.table1.Add(this.hbox2);
+			global::Gtk.Table.TableChild w5 = ((global::Gtk.Table.TableChild)(this.table1[this.hbox2]));
+			w5.TopAttach = ((uint)(3));
+			w5.BottomAttach = ((uint)(4));
+			w5.LeftAttach = ((uint)(1));
+			w5.RightAttach = ((uint)(2));
+			w5.XOptions = ((global::Gtk.AttachOptions)(4));
+			w5.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table1.Gtk.Table+TableChild
+			this.lblArmyName = new global::IBBoard.GtkSharp.Translatable.TranslatableLabel();
+			this.lblArmyName.Name = "lblArmyName";
+			this.lblArmyName.LabelProp = global::Mono.Unix.Catalog.GetString("army name");
+			this.table1.Add(this.lblArmyName);
+			global::Gtk.Table.TableChild w6 = ((global::Gtk.Table.TableChild)(this.table1[this.lblArmyName]));
+			w6.TopAttach = ((uint)(2));
+			w6.BottomAttach = ((uint)(3));
+			w6.XOptions = ((global::Gtk.AttachOptions)(4));
+			w6.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table1.Gtk.Table+TableChild
+			this.lblArmySize = new global::IBBoard.GtkSharp.Translatable.TranslatableLabel();
+			this.lblArmySize.Name = "lblArmySize";
+			this.lblArmySize.LabelProp = global::Mono.Unix.Catalog.GetString("points value");
+			this.table1.Add(this.lblArmySize);
+			global::Gtk.Table.TableChild w7 = ((global::Gtk.Table.TableChild)(this.table1[this.lblArmySize]));
+			w7.TopAttach = ((uint)(3));
+			w7.BottomAttach = ((uint)(4));
+			w7.XOptions = ((global::Gtk.AttachOptions)(4));
+			w7.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table1.Gtk.Table+TableChild
+			this.lblGameSystem = new global::IBBoard.GtkSharp.Translatable.TranslatableLabel();
+			this.lblGameSystem.Name = "lblGameSystem";
+			this.lblGameSystem.LabelProp = global::Mono.Unix.Catalog.GetString("game system");
+			this.table1.Add(this.lblGameSystem);
+			global::Gtk.Table.TableChild w8 = ((global::Gtk.Table.TableChild)(this.table1[this.lblGameSystem]));
+			w8.XOptions = ((global::Gtk.AttachOptions)(4));
+			w8.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table1.Gtk.Table+TableChild
+			this.lblRaceList = new global::IBBoard.GtkSharp.Translatable.TranslatableLabel();
+			this.lblRaceList.Name = "lblRaceList";
+			this.lblRaceList.LabelProp = global::Mono.Unix.Catalog.GetString("race");
+			this.table1.Add(this.lblRaceList);
+			global::Gtk.Table.TableChild w9 = ((global::Gtk.Table.TableChild)(this.table1[this.lblRaceList]));
+			w9.TopAttach = ((uint)(1));
+			w9.BottomAttach = ((uint)(2));
+			w9.XOptions = ((global::Gtk.AttachOptions)(4));
+			w9.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table1.Gtk.Table+TableChild
+			this.systemCombo = global::Gtk.ComboBoxEntry.NewText();
+			this.systemCombo.Name = "systemCombo";
+			this.table1.Add(this.systemCombo);
+			global::Gtk.Table.TableChild w10 = ((global::Gtk.Table.TableChild)(this.table1[this.systemCombo]));
+			w10.LeftAttach = ((uint)(1));
+			w10.RightAttach = ((uint)(2));
+			w10.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table1.Gtk.Table+TableChild
+			this.txtArmyName = new global::Gtk.Entry();
+			this.txtArmyName.CanFocus = true;
+			this.txtArmyName.Name = "txtArmyName";
+			this.txtArmyName.IsEditable = true;
+			this.txtArmyName.InvisibleChar = '•';
+			this.table1.Add(this.txtArmyName);
+			global::Gtk.Table.TableChild w11 = ((global::Gtk.Table.TableChild)(this.table1[this.txtArmyName]));
+			w11.TopAttach = ((uint)(2));
+			w11.BottomAttach = ((uint)(3));
+			w11.LeftAttach = ((uint)(1));
+			w11.RightAttach = ((uint)(2));
+			w11.XOptions = ((global::Gtk.AttachOptions)(4));
+			w11.YOptions = ((global::Gtk.AttachOptions)(4));
+			w1.Add(this.table1);
+			global::Gtk.Box.BoxChild w12 = ((global::Gtk.Box.BoxChild)(w1[this.table1]));
+			w12.Position = 0;
+			w12.Expand = false;
+			w12.Fill = false;
+			w12.Padding = ((uint)(6));
+			// Internal child IBBoard.WarFoundry.GUI.GTK.FrmNewArmy.ActionArea
+			global::Gtk.HButtonBox w13 = this.ActionArea;
+			w13.CanFocus = true;
+			w13.Events = ((global::Gdk.EventMask)(256));
+			w13.Name = "WarFoundrySharp.FrmNewArmy_ActionArea";
+			w13.Spacing = 6;
+			w13.BorderWidth = ((uint)(5));
+			w13.LayoutStyle = ((global::Gtk.ButtonBoxStyle)(4));
+			// Container child WarFoundrySharp.FrmNewArmy_ActionArea.Gtk.ButtonBox+ButtonBoxChild
+			this.bttnCancel = new global::IBBoard.GtkSharp.Translatable.TranslatableButton();
+			this.bttnCancel.CanFocus = true;
+			this.bttnCancel.Name = "bttnCancel";
+			this.bttnCancel.UseStock = true;
+			this.bttnCancel.UseUnderline = true;
+			this.bttnCancel.Label = "gtk-cancel";
+			this.AddActionWidget(this.bttnCancel, -6);
+			global::Gtk.ButtonBox.ButtonBoxChild w14 = ((global::Gtk.ButtonBox.ButtonBoxChild)(w13[this.bttnCancel]));
+			w14.Expand = false;
+			w14.Fill = false;
+			// Container child WarFoundrySharp.FrmNewArmy_ActionArea.Gtk.ButtonBox+ButtonBoxChild
+			this.bttnCreate = new global::IBBoard.GtkSharp.Translatable.TranslatableButton();
+			this.bttnCreate.Sensitive = false;
+			this.bttnCreate.CanDefault = true;
+			this.bttnCreate.CanFocus = true;
+			this.bttnCreate.Name = "bttnCreate";
+			this.bttnCreate.UseStock = true;
+			this.bttnCreate.UseUnderline = true;
+			this.bttnCreate.Label = "gtk-ok";
+			this.AddActionWidget(this.bttnCreate, -5);
+			global::Gtk.ButtonBox.ButtonBoxChild w15 = ((global::Gtk.ButtonBox.ButtonBoxChild)(w13[this.bttnCreate]));
+			w15.Position = 1;
+			w15.Expand = false;
+			w15.Fill = false;
+			if ((this.Child != null))
+			{
+				this.Child.ShowAll();
+			}
+			this.DefaultWidth = 370;
+			this.DefaultHeight = 348;
+			this.Show();
+			this.txtArmyName.Changed += new global::System.EventHandler(this.OnTextChanged);
+			this.systemCombo.Changed += new global::System.EventHandler(this.OnSystemComboChanged);
+			this.sbPointsValue.ChangeValue += new global::Gtk.ChangeValueHandler(this.OnSpinChangeValue);
+			this.sbPointsValue.ValueChanged += new global::System.EventHandler(this.OnSpinValueChanged);
+			this.sbPointsValue.Changed += new global::System.EventHandler(this.OnSpinValueChanged);
+			this.bttnCancel.Clicked += new global::System.EventHandler(this.OnCancelClicked);
+			this.bttnCreate.Clicked += new global::System.EventHandler(this.OnCreateClicked);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gtk-gui/IBBoard.WarFoundry.GUI.GTK.FrmNewUnit.cs	Mon Jan 17 19:43:47 2011 +0000
@@ -0,0 +1,122 @@
+
+// This file has been generated by the GUI designer. Do not modify.
+namespace IBBoard.WarFoundry.GUI.GTK
+{
+	public partial class FrmNewUnit
+	{
+		private global::Gtk.VBox vbox2;
+		private global::Gtk.HBox hbox1;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableLabel lblUnitList;
+		private global::Gtk.ScrolledWindow GtkScrolledWindow;
+		private global::Gtk.TreeView lstUnitTypes;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableLabel lblNewUnitWarning;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableButton bttnCancel;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableButton bttnCreate;
+
+		protected virtual void Build()
+		{
+			global::Stetic.Gui.Initialize(this);
+			// Widget IBBoard.WarFoundry.GUI.GTK.FrmNewUnit
+			this.Name = "IBBoard.WarFoundry.GUI.GTK.FrmNewUnit";
+			this.Title = global::Mono.Unix.Catalog.GetString("Add new unit");
+			this.Icon = global::Stetic.IconLoader.LoadIcon(this, "gtk-new", global::Gtk.IconSize.Menu);
+			this.WindowPosition = ((global::Gtk.WindowPosition)(4));
+			this.Modal = true;
+			this.SkipPagerHint = true;
+			this.SkipTaskbarHint = true;
+			// Internal child IBBoard.WarFoundry.GUI.GTK.FrmNewUnit.VBox
+			global::Gtk.VBox w1 = this.VBox;
+			w1.Name = "dialog1_VBox";
+			w1.BorderWidth = ((uint)(2));
+			// Container child dialog1_VBox.Gtk.Box+BoxChild
+			this.vbox2 = new global::Gtk.VBox();
+			this.vbox2.Name = "vbox2";
+			this.vbox2.Spacing = 6;
+			// Container child vbox2.Gtk.Box+BoxChild
+			this.hbox1 = new global::Gtk.HBox();
+			this.hbox1.Name = "hbox1";
+			this.hbox1.Spacing = 6;
+			// Container child hbox1.Gtk.Box+BoxChild
+			this.lblUnitList = new global::IBBoard.GtkSharp.Translatable.TranslatableLabel();
+			this.lblUnitList.Name = "lblUnitList";
+			this.lblUnitList.LabelProp = global::Mono.Unix.Catalog.GetString("unit type");
+			this.hbox1.Add(this.lblUnitList);
+			global::Gtk.Box.BoxChild w2 = ((global::Gtk.Box.BoxChild)(this.hbox1[this.lblUnitList]));
+			w2.Position = 0;
+			w2.Expand = false;
+			w2.Fill = false;
+			// Container child hbox1.Gtk.Box+BoxChild
+			this.GtkScrolledWindow = new global::Gtk.ScrolledWindow();
+			this.GtkScrolledWindow.Name = "GtkScrolledWindow";
+			this.GtkScrolledWindow.ShadowType = ((global::Gtk.ShadowType)(1));
+			// Container child GtkScrolledWindow.Gtk.Container+ContainerChild
+			this.lstUnitTypes = new global::Gtk.TreeView();
+			this.lstUnitTypes.HeightRequest = 150;
+			this.lstUnitTypes.CanFocus = true;
+			this.lstUnitTypes.Name = "lstUnitTypes";
+			this.lstUnitTypes.HeadersVisible = false;
+			this.GtkScrolledWindow.Add(this.lstUnitTypes);
+			this.hbox1.Add(this.GtkScrolledWindow);
+			global::Gtk.Box.BoxChild w4 = ((global::Gtk.Box.BoxChild)(this.hbox1[this.GtkScrolledWindow]));
+			w4.Position = 1;
+			this.vbox2.Add(this.hbox1);
+			global::Gtk.Box.BoxChild w5 = ((global::Gtk.Box.BoxChild)(this.vbox2[this.hbox1]));
+			w5.Position = 0;
+			w5.Expand = false;
+			w5.Fill = false;
+			// Container child vbox2.Gtk.Box+BoxChild
+			this.lblNewUnitWarning = new global::IBBoard.GtkSharp.Translatable.TranslatableLabel();
+			this.lblNewUnitWarning.Name = "lblNewUnitWarning";
+			this.vbox2.Add(this.lblNewUnitWarning);
+			global::Gtk.Box.BoxChild w6 = ((global::Gtk.Box.BoxChild)(this.vbox2[this.lblNewUnitWarning]));
+			w6.Position = 1;
+			w6.Expand = false;
+			w6.Fill = false;
+			w1.Add(this.vbox2);
+			global::Gtk.Box.BoxChild w7 = ((global::Gtk.Box.BoxChild)(w1[this.vbox2]));
+			w7.Position = 0;
+			w7.Expand = false;
+			w7.Fill = false;
+			// Internal child IBBoard.WarFoundry.GUI.GTK.FrmNewUnit.ActionArea
+			global::Gtk.HButtonBox w8 = this.ActionArea;
+			w8.Name = "dialog1_ActionArea";
+			w8.Spacing = 6;
+			w8.BorderWidth = ((uint)(5));
+			w8.LayoutStyle = ((global::Gtk.ButtonBoxStyle)(4));
+			// Container child dialog1_ActionArea.Gtk.ButtonBox+ButtonBoxChild
+			this.bttnCancel = new global::IBBoard.GtkSharp.Translatable.TranslatableButton();
+			this.bttnCancel.CanFocus = true;
+			this.bttnCancel.Name = "bttnCancel";
+			this.bttnCancel.UseStock = true;
+			this.bttnCancel.UseUnderline = true;
+			this.bttnCancel.Label = "gtk-cancel";
+			this.AddActionWidget(this.bttnCancel, -6);
+			global::Gtk.ButtonBox.ButtonBoxChild w9 = ((global::Gtk.ButtonBox.ButtonBoxChild)(w8[this.bttnCancel]));
+			w9.Expand = false;
+			w9.Fill = false;
+			// Container child dialog1_ActionArea.Gtk.ButtonBox+ButtonBoxChild
+			this.bttnCreate = new global::IBBoard.GtkSharp.Translatable.TranslatableButton();
+			this.bttnCreate.CanFocus = true;
+			this.bttnCreate.Name = "bttnCreate";
+			this.bttnCreate.UseStock = true;
+			this.bttnCreate.UseUnderline = true;
+			this.bttnCreate.Label = "gtk-ok";
+			this.AddActionWidget(this.bttnCreate, -5);
+			global::Gtk.ButtonBox.ButtonBoxChild w10 = ((global::Gtk.ButtonBox.ButtonBoxChild)(w8[this.bttnCreate]));
+			w10.Position = 1;
+			w10.Expand = false;
+			w10.Fill = false;
+			if ((this.Child != null))
+			{
+				this.Child.ShowAll();
+			}
+			this.DefaultWidth = 403;
+			this.DefaultHeight = 259;
+			this.lblNewUnitWarning.Hide();
+			this.Show();
+			this.lstUnitTypes.RowActivated += new global::Gtk.RowActivatedHandler(this.OnRowActivated);
+			this.bttnCancel.Clicked += new global::System.EventHandler(this.OnButtonCancelActivated);
+			this.bttnCreate.Clicked += new global::System.EventHandler(this.OnButtonOkClicked);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gtk-gui/IBBoard.WarFoundry.GUI.GTK.FrmPreferences.cs	Mon Jan 17 19:43:47 2011 +0000
@@ -0,0 +1,135 @@
+
+// This file has been generated by the GUI designer. Do not modify.
+namespace IBBoard.WarFoundry.GUI.GTK
+{
+	public partial class FrmPreferences
+	{
+		private global::Gtk.HPaned hpaned1;
+		private global::Gtk.ScrolledWindow GtkScrolledWindow;
+		private global::Gtk.TreeView preferencesTree;
+		private global::Gtk.Frame prefsFrame;
+		private global::Gtk.Alignment GtkAlignment2;
+		private global::Gtk.Table table1;
+		private global::Gtk.ComboBox languageList;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableLabel lblLanguage;
+		private global::Gtk.Label frameLabel;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableButton bttnCancel;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableButton bttnOkay;
+
+		protected virtual void Build()
+		{
+			global::Stetic.Gui.Initialize(this);
+			// Widget IBBoard.WarFoundry.GUI.GTK.FrmPreferences
+			this.Name = "IBBoard.WarFoundry.GUI.GTK.FrmPreferences";
+			this.TypeHint = ((global::Gdk.WindowTypeHint)(1));
+			this.WindowPosition = ((global::Gtk.WindowPosition)(4));
+			this.SkipPagerHint = true;
+			this.SkipTaskbarHint = true;
+			// Internal child IBBoard.WarFoundry.GUI.GTK.FrmPreferences.VBox
+			global::Gtk.VBox w1 = this.VBox;
+			w1.Name = "dialog1_VBox";
+			w1.BorderWidth = ((uint)(2));
+			// Container child dialog1_VBox.Gtk.Box+BoxChild
+			this.hpaned1 = new global::Gtk.HPaned();
+			this.hpaned1.CanFocus = true;
+			this.hpaned1.Name = "hpaned1";
+			this.hpaned1.Position = 164;
+			// Container child hpaned1.Gtk.Paned+PanedChild
+			this.GtkScrolledWindow = new global::Gtk.ScrolledWindow();
+			this.GtkScrolledWindow.Name = "GtkScrolledWindow";
+			this.GtkScrolledWindow.ShadowType = ((global::Gtk.ShadowType)(1));
+			// Container child GtkScrolledWindow.Gtk.Container+ContainerChild
+			this.preferencesTree = new global::Gtk.TreeView();
+			this.preferencesTree.CanFocus = true;
+			this.preferencesTree.Name = "preferencesTree";
+			this.preferencesTree.HeadersVisible = false;
+			this.GtkScrolledWindow.Add(this.preferencesTree);
+			this.hpaned1.Add(this.GtkScrolledWindow);
+			global::Gtk.Paned.PanedChild w3 = ((global::Gtk.Paned.PanedChild)(this.hpaned1[this.GtkScrolledWindow]));
+			w3.Resize = false;
+			// Container child hpaned1.Gtk.Paned+PanedChild
+			this.prefsFrame = new global::Gtk.Frame();
+			this.prefsFrame.Name = "prefsFrame";
+			this.prefsFrame.ShadowType = ((global::Gtk.ShadowType)(1));
+			this.prefsFrame.BorderWidth = ((uint)(2));
+			// Container child prefsFrame.Gtk.Container+ContainerChild
+			this.GtkAlignment2 = new global::Gtk.Alignment(0F, 0F, 1F, 1F);
+			this.GtkAlignment2.Name = "GtkAlignment2";
+			this.GtkAlignment2.LeftPadding = ((uint)(12));
+			// Container child GtkAlignment2.Gtk.Container+ContainerChild
+			this.table1 = new global::Gtk.Table(((uint)(3)), ((uint)(2)), false);
+			this.table1.Name = "table1";
+			this.table1.RowSpacing = ((uint)(6));
+			this.table1.ColumnSpacing = ((uint)(6));
+			// Container child table1.Gtk.Table+TableChild
+			this.languageList = global::Gtk.ComboBox.NewText();
+			this.languageList.Name = "languageList";
+			this.table1.Add(this.languageList);
+			global::Gtk.Table.TableChild w4 = ((global::Gtk.Table.TableChild)(this.table1[this.languageList]));
+			w4.LeftAttach = ((uint)(1));
+			w4.RightAttach = ((uint)(2));
+			w4.XOptions = ((global::Gtk.AttachOptions)(4));
+			w4.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table1.Gtk.Table+TableChild
+			this.lblLanguage = new global::IBBoard.GtkSharp.Translatable.TranslatableLabel();
+			this.lblLanguage.Name = "lblLanguage";
+			this.lblLanguage.LabelProp = global::Mono.Unix.Catalog.GetString("language:");
+			this.table1.Add(this.lblLanguage);
+			global::Gtk.Table.TableChild w5 = ((global::Gtk.Table.TableChild)(this.table1[this.lblLanguage]));
+			w5.XOptions = ((global::Gtk.AttachOptions)(4));
+			w5.YOptions = ((global::Gtk.AttachOptions)(4));
+			this.GtkAlignment2.Add(this.table1);
+			this.prefsFrame.Add(this.GtkAlignment2);
+			this.frameLabel = new global::Gtk.Label();
+			this.frameLabel.Name = "frameLabel";
+			this.frameLabel.LabelProp = global::Mono.Unix.Catalog.GetString("<b>language</b>");
+			this.frameLabel.UseMarkup = true;
+			this.prefsFrame.LabelWidget = this.frameLabel;
+			this.hpaned1.Add(this.prefsFrame);
+			w1.Add(this.hpaned1);
+			global::Gtk.Box.BoxChild w9 = ((global::Gtk.Box.BoxChild)(w1[this.hpaned1]));
+			w9.Position = 0;
+			// Internal child IBBoard.WarFoundry.GUI.GTK.FrmPreferences.ActionArea
+			global::Gtk.HButtonBox w10 = this.ActionArea;
+			w10.Name = "dialog1_ActionArea";
+			w10.Spacing = 10;
+			w10.BorderWidth = ((uint)(5));
+			w10.LayoutStyle = ((global::Gtk.ButtonBoxStyle)(4));
+			// Container child dialog1_ActionArea.Gtk.ButtonBox+ButtonBoxChild
+			this.bttnCancel = new global::IBBoard.GtkSharp.Translatable.TranslatableButton();
+			this.bttnCancel.CanDefault = true;
+			this.bttnCancel.CanFocus = true;
+			this.bttnCancel.Name = "bttnCancel";
+			this.bttnCancel.UseStock = true;
+			this.bttnCancel.UseUnderline = true;
+			this.bttnCancel.Label = "gtk-cancel";
+			this.AddActionWidget(this.bttnCancel, -6);
+			global::Gtk.ButtonBox.ButtonBoxChild w11 = ((global::Gtk.ButtonBox.ButtonBoxChild)(w10[this.bttnCancel]));
+			w11.Expand = false;
+			w11.Fill = false;
+			// Container child dialog1_ActionArea.Gtk.ButtonBox+ButtonBoxChild
+			this.bttnOkay = new global::IBBoard.GtkSharp.Translatable.TranslatableButton();
+			this.bttnOkay.CanDefault = true;
+			this.bttnOkay.CanFocus = true;
+			this.bttnOkay.Name = "bttnOkay";
+			this.bttnOkay.UseStock = true;
+			this.bttnOkay.UseUnderline = true;
+			this.bttnOkay.Label = "gtk-ok";
+			this.AddActionWidget(this.bttnOkay, -5);
+			global::Gtk.ButtonBox.ButtonBoxChild w12 = ((global::Gtk.ButtonBox.ButtonBoxChild)(w10[this.bttnOkay]));
+			w12.Position = 1;
+			w12.Expand = false;
+			w12.Fill = false;
+			if ((this.Child != null))
+			{
+				this.Child.ShowAll();
+			}
+			this.DefaultWidth = 400;
+			this.DefaultHeight = 300;
+			this.Show();
+			this.languageList.Changed += new global::System.EventHandler(this.languageListChanged);
+			this.bttnCancel.Clicked += new global::System.EventHandler(this.bttnCancelClicked);
+			this.bttnOkay.Clicked += new global::System.EventHandler(this.bttnOkayClicked);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gtk-gui/IBBoard.WarFoundry.GUI.GTK.FrmReplaceEquipment.cs	Mon Jan 17 19:43:47 2011 +0000
@@ -0,0 +1,236 @@
+
+// This file has been generated by the GUI designer. Do not modify.
+namespace IBBoard.WarFoundry.GUI.GTK
+{
+	public partial class FrmReplaceEquipment
+	{
+		private global::Gtk.Table table1;
+		private global::Gtk.ScrolledWindow GtkScrolledWindow;
+		private global::Gtk.TreeView lstEquipment;
+		private global::Gtk.HBox hbox2;
+		private global::Gtk.Table table2;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableLabel lblEquipAll;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableLabel lblPercent;
+		private global::Gtk.SpinButton numericAmount;
+		private global::Gtk.SpinButton percentageAmount;
+		private global::Gtk.RadioButton rbEquipAll;
+		private global::Gtk.RadioButton rbEquipNumeric;
+		private global::Gtk.RadioButton rbEquipPercent;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableLabel lblAmount;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableLabel lblItem;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableButton bttnCancel;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableButton bttnOkay;
+
+		protected virtual void Build()
+		{
+			global::Stetic.Gui.Initialize(this);
+			// Widget IBBoard.WarFoundry.GUI.GTK.FrmReplaceEquipment
+			this.Name = "IBBoard.WarFoundry.GUI.GTK.FrmReplaceEquipment";
+			this.Title = global::Mono.Unix.Catalog.GetString("Add equipment");
+			this.WindowPosition = ((global::Gtk.WindowPosition)(4));
+			this.Modal = true;
+			this.SkipPagerHint = true;
+			this.SkipTaskbarHint = true;
+			// Internal child IBBoard.WarFoundry.GUI.GTK.FrmReplaceEquipment.VBox
+			global::Gtk.VBox w1 = this.VBox;
+			w1.Name = "dialog1_VBox";
+			w1.BorderWidth = ((uint)(2));
+			// Container child dialog1_VBox.Gtk.Box+BoxChild
+			this.table1 = new global::Gtk.Table(((uint)(2)), ((uint)(2)), false);
+			this.table1.Name = "table1";
+			this.table1.RowSpacing = ((uint)(6));
+			this.table1.ColumnSpacing = ((uint)(6));
+			// Container child table1.Gtk.Table+TableChild
+			this.GtkScrolledWindow = new global::Gtk.ScrolledWindow();
+			this.GtkScrolledWindow.Name = "GtkScrolledWindow";
+			this.GtkScrolledWindow.ShadowType = ((global::Gtk.ShadowType)(1));
+			// Container child GtkScrolledWindow.Gtk.Container+ContainerChild
+			this.lstEquipment = new global::Gtk.TreeView();
+			this.lstEquipment.CanFocus = true;
+			this.lstEquipment.Name = "lstEquipment";
+			this.lstEquipment.HeadersVisible = false;
+			this.GtkScrolledWindow.Add(this.lstEquipment);
+			this.table1.Add(this.GtkScrolledWindow);
+			global::Gtk.Table.TableChild w3 = ((global::Gtk.Table.TableChild)(this.table1[this.GtkScrolledWindow]));
+			w3.LeftAttach = ((uint)(1));
+			w3.RightAttach = ((uint)(2));
+			w3.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table1.Gtk.Table+TableChild
+			this.hbox2 = new global::Gtk.HBox();
+			this.hbox2.Name = "hbox2";
+			this.hbox2.Spacing = 6;
+			// Container child hbox2.Gtk.Box+BoxChild
+			this.table2 = new global::Gtk.Table(((uint)(3)), ((uint)(3)), false);
+			this.table2.Name = "table2";
+			this.table2.RowSpacing = ((uint)(6));
+			this.table2.ColumnSpacing = ((uint)(6));
+			// Container child table2.Gtk.Table+TableChild
+			this.lblEquipAll = new global::IBBoard.GtkSharp.Translatable.TranslatableLabel();
+			this.lblEquipAll.Name = "lblEquipAll";
+			this.lblEquipAll.LabelProp = global::Mono.Unix.Catalog.GetString("equip all");
+			this.table2.Add(this.lblEquipAll);
+			global::Gtk.Table.TableChild w4 = ((global::Gtk.Table.TableChild)(this.table2[this.lblEquipAll]));
+			w4.TopAttach = ((uint)(2));
+			w4.BottomAttach = ((uint)(3));
+			w4.LeftAttach = ((uint)(1));
+			w4.RightAttach = ((uint)(2));
+			w4.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table2.Gtk.Table+TableChild
+			this.lblPercent = new global::IBBoard.GtkSharp.Translatable.TranslatableLabel();
+			this.lblPercent.Name = "lblPercent";
+			this.lblPercent.LabelProp = global::Mono.Unix.Catalog.GetString("%");
+			this.table2.Add(this.lblPercent);
+			global::Gtk.Table.TableChild w5 = ((global::Gtk.Table.TableChild)(this.table2[this.lblPercent]));
+			w5.TopAttach = ((uint)(1));
+			w5.BottomAttach = ((uint)(2));
+			w5.LeftAttach = ((uint)(2));
+			w5.RightAttach = ((uint)(3));
+			w5.XOptions = ((global::Gtk.AttachOptions)(4));
+			w5.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table2.Gtk.Table+TableChild
+			this.numericAmount = new global::Gtk.SpinButton(0, 100, 1);
+			this.numericAmount.CanFocus = true;
+			this.numericAmount.Name = "numericAmount";
+			this.numericAmount.Adjustment.PageIncrement = 10;
+			this.numericAmount.ClimbRate = 1;
+			this.numericAmount.Numeric = true;
+			this.table2.Add(this.numericAmount);
+			global::Gtk.Table.TableChild w6 = ((global::Gtk.Table.TableChild)(this.table2[this.numericAmount]));
+			w6.LeftAttach = ((uint)(1));
+			w6.RightAttach = ((uint)(2));
+			w6.XOptions = ((global::Gtk.AttachOptions)(0));
+			w6.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table2.Gtk.Table+TableChild
+			this.percentageAmount = new global::Gtk.SpinButton(0, 100, 1);
+			this.percentageAmount.CanFocus = true;
+			this.percentageAmount.Name = "percentageAmount";
+			this.percentageAmount.Adjustment.PageIncrement = 10;
+			this.percentageAmount.ClimbRate = 1;
+			this.percentageAmount.Digits = ((uint)(1));
+			this.percentageAmount.Numeric = true;
+			this.table2.Add(this.percentageAmount);
+			global::Gtk.Table.TableChild w7 = ((global::Gtk.Table.TableChild)(this.table2[this.percentageAmount]));
+			w7.TopAttach = ((uint)(1));
+			w7.BottomAttach = ((uint)(2));
+			w7.LeftAttach = ((uint)(1));
+			w7.RightAttach = ((uint)(2));
+			w7.XOptions = ((global::Gtk.AttachOptions)(0));
+			w7.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table2.Gtk.Table+TableChild
+			this.rbEquipAll = new global::Gtk.RadioButton("");
+			this.rbEquipAll.CanFocus = true;
+			this.rbEquipAll.Name = "rbEquipAll";
+			this.rbEquipAll.DrawIndicator = true;
+			this.rbEquipAll.UseUnderline = true;
+			this.rbEquipAll.Group = new global::GLib.SList(global::System.IntPtr.Zero);
+			this.table2.Add(this.rbEquipAll);
+			global::Gtk.Table.TableChild w8 = ((global::Gtk.Table.TableChild)(this.table2[this.rbEquipAll]));
+			w8.TopAttach = ((uint)(2));
+			w8.BottomAttach = ((uint)(3));
+			w8.XOptions = ((global::Gtk.AttachOptions)(4));
+			w8.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table2.Gtk.Table+TableChild
+			this.rbEquipNumeric = new global::Gtk.RadioButton("");
+			this.rbEquipNumeric.CanFocus = true;
+			this.rbEquipNumeric.Name = "rbEquipNumeric";
+			this.rbEquipNumeric.DrawIndicator = true;
+			this.rbEquipNumeric.UseUnderline = true;
+			this.rbEquipNumeric.Group = this.rbEquipAll.Group;
+			this.table2.Add(this.rbEquipNumeric);
+			global::Gtk.Table.TableChild w9 = ((global::Gtk.Table.TableChild)(this.table2[this.rbEquipNumeric]));
+			w9.XOptions = ((global::Gtk.AttachOptions)(4));
+			w9.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table2.Gtk.Table+TableChild
+			this.rbEquipPercent = new global::Gtk.RadioButton("");
+			this.rbEquipPercent.CanFocus = true;
+			this.rbEquipPercent.Name = "rbEquipPercent";
+			this.rbEquipPercent.DrawIndicator = true;
+			this.rbEquipPercent.UseUnderline = true;
+			this.rbEquipPercent.Group = this.rbEquipAll.Group;
+			this.table2.Add(this.rbEquipPercent);
+			global::Gtk.Table.TableChild w10 = ((global::Gtk.Table.TableChild)(this.table2[this.rbEquipPercent]));
+			w10.TopAttach = ((uint)(1));
+			w10.BottomAttach = ((uint)(2));
+			w10.XOptions = ((global::Gtk.AttachOptions)(4));
+			w10.YOptions = ((global::Gtk.AttachOptions)(4));
+			this.hbox2.Add(this.table2);
+			global::Gtk.Box.BoxChild w11 = ((global::Gtk.Box.BoxChild)(this.hbox2[this.table2]));
+			w11.Position = 0;
+			w11.Expand = false;
+			w11.Fill = false;
+			this.table1.Add(this.hbox2);
+			global::Gtk.Table.TableChild w12 = ((global::Gtk.Table.TableChild)(this.table1[this.hbox2]));
+			w12.TopAttach = ((uint)(1));
+			w12.BottomAttach = ((uint)(2));
+			w12.LeftAttach = ((uint)(1));
+			w12.RightAttach = ((uint)(2));
+			w12.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table1.Gtk.Table+TableChild
+			this.lblAmount = new global::IBBoard.GtkSharp.Translatable.TranslatableLabel();
+			this.lblAmount.Name = "lblAmount";
+			this.lblAmount.LabelProp = global::Mono.Unix.Catalog.GetString("amount:");
+			this.table1.Add(this.lblAmount);
+			global::Gtk.Table.TableChild w13 = ((global::Gtk.Table.TableChild)(this.table1[this.lblAmount]));
+			w13.TopAttach = ((uint)(1));
+			w13.BottomAttach = ((uint)(2));
+			w13.XOptions = ((global::Gtk.AttachOptions)(4));
+			w13.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table1.Gtk.Table+TableChild
+			this.lblItem = new global::IBBoard.GtkSharp.Translatable.TranslatableLabel();
+			this.lblItem.Name = "lblItem";
+			this.lblItem.LabelProp = global::Mono.Unix.Catalog.GetString("equipment");
+			this.table1.Add(this.lblItem);
+			global::Gtk.Table.TableChild w14 = ((global::Gtk.Table.TableChild)(this.table1[this.lblItem]));
+			w14.XOptions = ((global::Gtk.AttachOptions)(4));
+			w14.YOptions = ((global::Gtk.AttachOptions)(4));
+			w1.Add(this.table1);
+			global::Gtk.Box.BoxChild w15 = ((global::Gtk.Box.BoxChild)(w1[this.table1]));
+			w15.Position = 0;
+			w15.Expand = false;
+			w15.Fill = false;
+			// Internal child IBBoard.WarFoundry.GUI.GTK.FrmReplaceEquipment.ActionArea
+			global::Gtk.HButtonBox w16 = this.ActionArea;
+			w16.Name = "dialog1_ActionArea";
+			w16.Spacing = 10;
+			w16.BorderWidth = ((uint)(5));
+			w16.LayoutStyle = ((global::Gtk.ButtonBoxStyle)(4));
+			// Container child dialog1_ActionArea.Gtk.ButtonBox+ButtonBoxChild
+			this.bttnCancel = new global::IBBoard.GtkSharp.Translatable.TranslatableButton();
+			this.bttnCancel.CanDefault = true;
+			this.bttnCancel.CanFocus = true;
+			this.bttnCancel.Name = "bttnCancel";
+			this.bttnCancel.UseStock = true;
+			this.bttnCancel.UseUnderline = true;
+			this.bttnCancel.Label = "gtk-cancel";
+			this.AddActionWidget(this.bttnCancel, -6);
+			global::Gtk.ButtonBox.ButtonBoxChild w17 = ((global::Gtk.ButtonBox.ButtonBoxChild)(w16[this.bttnCancel]));
+			w17.Expand = false;
+			w17.Fill = false;
+			// Container child dialog1_ActionArea.Gtk.ButtonBox+ButtonBoxChild
+			this.bttnOkay = new global::IBBoard.GtkSharp.Translatable.TranslatableButton();
+			this.bttnOkay.CanDefault = true;
+			this.bttnOkay.CanFocus = true;
+			this.bttnOkay.Name = "bttnOkay";
+			this.bttnOkay.UseStock = true;
+			this.bttnOkay.UseUnderline = true;
+			this.bttnOkay.Label = "gtk-ok";
+			this.AddActionWidget(this.bttnOkay, -5);
+			global::Gtk.ButtonBox.ButtonBoxChild w18 = ((global::Gtk.ButtonBox.ButtonBoxChild)(w16[this.bttnOkay]));
+			w18.Position = 1;
+			w18.Expand = false;
+			w18.Fill = false;
+			if ((this.Child != null))
+			{
+				this.Child.ShowAll();
+			}
+			this.DefaultWidth = 400;
+			this.DefaultHeight = 300;
+			this.Show();
+			this.rbEquipNumeric.Clicked += new global::System.EventHandler(this.RadioButtonClicked);
+			this.percentageAmount.ValueChanged += new global::System.EventHandler(this.SpinButtonValueChanged);
+			this.numericAmount.ValueChanged += new global::System.EventHandler(this.SpinButtonValueChanged);
+			this.bttnCancel.Clicked += new global::System.EventHandler(this.CancelButtonClicked);
+			this.bttnOkay.Clicked += new global::System.EventHandler(this.OkayButtonClicked);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gtk-gui/IBBoard.WarFoundry.GUI.GTK.Widgets.UnitDisplayWidget.cs	Mon Jan 17 19:43:47 2011 +0000
@@ -0,0 +1,262 @@
+
+// This file has been generated by the GUI designer. Do not modify.
+namespace IBBoard.WarFoundry.GUI.GTK.Widgets
+{
+	public partial class UnitDisplayWidget
+	{
+		private global::Gtk.VBox vbox1;
+		private global::Gtk.HBox hbox1;
+		private global::Gtk.Entry unitName;
+		private global::Gtk.SpinButton unitSize;
+		private global::Gtk.ScrolledWindow statsScrollPanel;
+		private global::Gtk.VBox statsRepeatBox;
+		private global::Gtk.HSeparator hseparator1;
+		private global::Gtk.HBox hbox2;
+		private global::Gtk.Table table1;
+		private global::Gtk.ScrolledWindow GtkScrolledWindow2;
+		private global::Gtk.NodeView equipmentList;
+		private global::Gtk.ScrolledWindow GtkScrolledWindow3;
+		private global::Gtk.TextView notesView;
+		private global::Gtk.ScrolledWindow GtkScrolledWindow4;
+		private global::Gtk.NodeView abilitiesList;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableLabel lblAbilities;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableLabel lblEquip;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableLabel lblNotes;
+		private global::Gtk.VBox vbox3;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableButton bttnAddWeapon;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableButton bttnEditWeapon;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableButton bttnReplaceWeapon;
+		private global::IBBoard.GtkSharp.Translatable.TranslatableButton bttnRemoveWeapon;
+
+		protected virtual void Build()
+		{
+			global::Stetic.Gui.Initialize(this);
+			// Widget IBBoard.WarFoundry.GUI.GTK.Widgets.UnitDisplayWidget
+			global::Stetic.BinContainer.Attach(this);
+			this.Name = "IBBoard.WarFoundry.GUI.GTK.Widgets.UnitDisplayWidget";
+			// Container child IBBoard.WarFoundry.GUI.GTK.Widgets.UnitDisplayWidget.Gtk.Container+ContainerChild
+			this.vbox1 = new global::Gtk.VBox();
+			this.vbox1.Name = "vbox1";
+			this.vbox1.Spacing = 6;
+			// Container child vbox1.Gtk.Box+BoxChild
+			this.hbox1 = new global::Gtk.HBox();
+			this.hbox1.Name = "hbox1";
+			this.hbox1.Spacing = 6;
+			// Container child hbox1.Gtk.Box+BoxChild
+			this.unitName = new global::Gtk.Entry();
+			this.unitName.CanFocus = true;
+			this.unitName.Name = "unitName";
+			this.unitName.IsEditable = true;
+			this.unitName.InvisibleChar = '•';
+			this.hbox1.Add(this.unitName);
+			global::Gtk.Box.BoxChild w1 = ((global::Gtk.Box.BoxChild)(this.hbox1[this.unitName]));
+			w1.Position = 0;
+			// Container child hbox1.Gtk.Box+BoxChild
+			this.unitSize = new global::Gtk.SpinButton(0, 100, 1);
+			this.unitSize.CanFocus = true;
+			this.unitSize.Name = "unitSize";
+			this.unitSize.Adjustment.PageIncrement = 10;
+			this.unitSize.ClimbRate = 1;
+			this.unitSize.Numeric = true;
+			this.hbox1.Add(this.unitSize);
+			global::Gtk.Box.BoxChild w2 = ((global::Gtk.Box.BoxChild)(this.hbox1[this.unitSize]));
+			w2.Position = 1;
+			w2.Expand = false;
+			w2.Fill = false;
+			this.vbox1.Add(this.hbox1);
+			global::Gtk.Box.BoxChild w3 = ((global::Gtk.Box.BoxChild)(this.vbox1[this.hbox1]));
+			w3.Position = 0;
+			w3.Expand = false;
+			w3.Fill = false;
+			// Container child vbox1.Gtk.Box+BoxChild
+			this.statsScrollPanel = new global::Gtk.ScrolledWindow();
+			this.statsScrollPanel.CanFocus = true;
+			this.statsScrollPanel.Name = "statsScrollPanel";
+			this.statsScrollPanel.ShadowType = ((global::Gtk.ShadowType)(1));
+			// Container child statsScrollPanel.Gtk.Container+ContainerChild
+			global::Gtk.Viewport w4 = new global::Gtk.Viewport();
+			w4.ShadowType = ((global::Gtk.ShadowType)(0));
+			// Container child GtkViewport.Gtk.Container+ContainerChild
+			this.statsRepeatBox = new global::Gtk.VBox();
+			this.statsRepeatBox.Name = "statsRepeatBox";
+			this.statsRepeatBox.Spacing = 6;
+			w4.Add(this.statsRepeatBox);
+			this.statsScrollPanel.Add(w4);
+			this.vbox1.Add(this.statsScrollPanel);
+			global::Gtk.Box.BoxChild w7 = ((global::Gtk.Box.BoxChild)(this.vbox1[this.statsScrollPanel]));
+			w7.Position = 1;
+			// Container child vbox1.Gtk.Box+BoxChild
+			this.hseparator1 = new global::Gtk.HSeparator();
+			this.hseparator1.Name = "hseparator1";
+			this.vbox1.Add(this.hseparator1);
+			global::Gtk.Box.BoxChild w8 = ((global::Gtk.Box.BoxChild)(this.vbox1[this.hseparator1]));
+			w8.Position = 2;
+			w8.Expand = false;
+			w8.Fill = false;
+			// Container child vbox1.Gtk.Box+BoxChild
+			this.hbox2 = new global::Gtk.HBox();
+			this.hbox2.Name = "hbox2";
+			this.hbox2.Spacing = 6;
+			// Container child hbox2.Gtk.Box+BoxChild
+			this.table1 = new global::Gtk.Table(((uint)(3)), ((uint)(2)), false);
+			this.table1.Name = "table1";
+			this.table1.RowSpacing = ((uint)(6));
+			this.table1.ColumnSpacing = ((uint)(6));
+			// Container child table1.Gtk.Table+TableChild
+			this.GtkScrolledWindow2 = new global::Gtk.ScrolledWindow();
+			this.GtkScrolledWindow2.Name = "GtkScrolledWindow2";
+			this.GtkScrolledWindow2.ShadowType = ((global::Gtk.ShadowType)(1));
+			// Container child GtkScrolledWindow2.Gtk.Container+ContainerChild
+			this.equipmentList = new global::Gtk.NodeView();
+			this.equipmentList.CanFocus = true;
+			this.equipmentList.Name = "equipmentList";
+			this.equipmentList.HeadersVisible = false;
+			this.GtkScrolledWindow2.Add(this.equipmentList);
+			this.table1.Add(this.GtkScrolledWindow2);
+			global::Gtk.Table.TableChild w10 = ((global::Gtk.Table.TableChild)(this.table1[this.GtkScrolledWindow2]));
+			w10.LeftAttach = ((uint)(1));
+			w10.RightAttach = ((uint)(2));
+			w10.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table1.Gtk.Table+TableChild
+			this.GtkScrolledWindow3 = new global::Gtk.ScrolledWindow();
+			this.GtkScrolledWindow3.Name = "GtkScrolledWindow3";
+			this.GtkScrolledWindow3.ShadowType = ((global::Gtk.ShadowType)(1));
+			// Container child GtkScrolledWindow3.Gtk.Container+ContainerChild
+			this.notesView = new global::Gtk.TextView();
+			this.notesView.CanFocus = true;
+			this.notesView.Name = "notesView";
+			this.notesView.Editable = false;
+			this.GtkScrolledWindow3.Add(this.notesView);
+			this.table1.Add(this.GtkScrolledWindow3);
+			global::Gtk.Table.TableChild w12 = ((global::Gtk.Table.TableChild)(this.table1[this.GtkScrolledWindow3]));
+			w12.TopAttach = ((uint)(2));
+			w12.BottomAttach = ((uint)(3));
+			w12.LeftAttach = ((uint)(1));
+			w12.RightAttach = ((uint)(2));
+			w12.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table1.Gtk.Table+TableChild
+			this.GtkScrolledWindow4 = new global::Gtk.ScrolledWindow();
+			this.GtkScrolledWindow4.Name = "GtkScrolledWindow4";
+			this.GtkScrolledWindow4.ShadowType = ((global::Gtk.ShadowType)(1));
+			// Container child GtkScrolledWindow4.Gtk.Container+ContainerChild
+			this.abilitiesList = new global::Gtk.NodeView();
+			this.abilitiesList.CanFocus = true;
+			this.abilitiesList.Name = "abilitiesList";
+			this.abilitiesList.HeadersVisible = false;
+			this.GtkScrolledWindow4.Add(this.abilitiesList);
+			this.table1.Add(this.GtkScrolledWindow4);
+			global::Gtk.Table.TableChild w14 = ((global::Gtk.Table.TableChild)(this.table1[this.GtkScrolledWindow4]));
+			w14.TopAttach = ((uint)(1));
+			w14.BottomAttach = ((uint)(2));
+			w14.LeftAttach = ((uint)(1));
+			w14.RightAttach = ((uint)(2));
+			w14.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table1.Gtk.Table+TableChild
+			this.lblAbilities = new global::IBBoard.GtkSharp.Translatable.TranslatableLabel();
+			this.lblAbilities.Name = "lblAbilities";
+			this.lblAbilities.LabelProp = global::Mono.Unix.Catalog.GetString("abilities:");
+			this.table1.Add(this.lblAbilities);
+			global::Gtk.Table.TableChild w15 = ((global::Gtk.Table.TableChild)(this.table1[this.lblAbilities]));
+			w15.TopAttach = ((uint)(1));
+			w15.BottomAttach = ((uint)(2));
+			w15.XOptions = ((global::Gtk.AttachOptions)(4));
+			w15.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table1.Gtk.Table+TableChild
+			this.lblEquip = new global::IBBoard.GtkSharp.Translatable.TranslatableLabel();
+			this.lblEquip.Name = "lblEquip";
+			this.lblEquip.LabelProp = global::Mono.Unix.Catalog.GetString("equipment:");
+			this.table1.Add(this.lblEquip);
+			global::Gtk.Table.TableChild w16 = ((global::Gtk.Table.TableChild)(this.table1[this.lblEquip]));
+			w16.XOptions = ((global::Gtk.AttachOptions)(4));
+			w16.YOptions = ((global::Gtk.AttachOptions)(4));
+			// Container child table1.Gtk.Table+TableChild
+			this.lblNotes = new global::IBBoard.GtkSharp.Translatable.TranslatableLabel();
+			this.lblNotes.Name = "lblNotes";
+			this.lblNotes.LabelProp = global::Mono.Unix.Catalog.GetString("notes:");
+			this.table1.Add(this.lblNotes);
+			global::Gtk.Table.TableChild w17 = ((global::Gtk.Table.TableChild)(this.table1[this.lblNotes]));
+			w17.TopAttach = ((uint)(2));
+			w17.BottomAttach = ((uint)(3));
+			w17.XOptions = ((global::Gtk.AttachOptions)(4));
+			w17.YOptions = ((global::Gtk.AttachOptions)(4));
+			this.hbox2.Add(this.table1);
+			global::Gtk.Box.BoxChild w18 = ((global::Gtk.Box.BoxChild)(this.hbox2[this.table1]));
+			w18.Position = 0;
+			// Container child hbox2.Gtk.Box+BoxChild
+			this.vbox3 = new global::Gtk.VBox();
+			this.vbox3.Name = "vbox3";
+			this.vbox3.Spacing = 6;
+			// Container child vbox3.Gtk.Box+BoxChild
+			this.bttnAddWeapon = new global::IBBoard.GtkSharp.Translatable.TranslatableButton();
+			this.bttnAddWeapon.CanFocus = true;
+			this.bttnAddWeapon.Name = "bttnAddWeapon";
+			this.bttnAddWeapon.UseUnderline = true;
+			this.bttnAddWeapon.Label = global::Mono.Unix.Catalog.GetString("add");
+			this.vbox3.Add(this.bttnAddWeapon);
+			global::Gtk.Box.BoxChild w19 = ((global::Gtk.Box.BoxChild)(this.vbox3[this.bttnAddWeapon]));
+			w19.Position = 0;
+			w19.Expand = false;
+			w19.Fill = false;
+			// Container child vbox3.Gtk.Box+BoxChild
+			this.bttnEditWeapon = new global::IBBoard.GtkSharp.Translatable.TranslatableButton();
+			this.bttnEditWeapon.Sensitive = false;
+			this.bttnEditWeapon.CanFocus = true;
+			this.bttnEditWeapon.Name = "bttnEditWeapon";
+			this.bttnEditWeapon.UseUnderline = true;
+			this.bttnEditWeapon.Label = global::Mono.Unix.Catalog.GetString("edit");
+			this.vbox3.Add(this.bttnEditWeapon);
+			global::Gtk.Box.BoxChild w20 = ((global::Gtk.Box.BoxChild)(this.vbox3[this.bttnEditWeapon]));
+			w20.Position = 1;
+			w20.Expand = false;
+			w20.Fill = false;
+			// Container child vbox3.Gtk.Box+BoxChild
+			this.bttnReplaceWeapon = new global::IBBoard.GtkSharp.Translatable.TranslatableButton();
+			this.bttnReplaceWeapon.Sensitive = false;
+			this.bttnReplaceWeapon.CanFocus = true;
+			this.bttnReplaceWeapon.Name = "bttnReplaceWeapon";
+			this.bttnReplaceWeapon.UseUnderline = true;
+			this.bttnReplaceWeapon.Label = global::Mono.Unix.Catalog.GetString("replace");
+			this.vbox3.Add(this.bttnReplaceWeapon);
+			global::Gtk.Box.BoxChild w21 = ((global::Gtk.Box.BoxChild)(this.vbox3[this.bttnReplaceWeapon]));
+			w21.Position = 2;
+			w21.Expand = false;
+			w21.Fill = false;
+			// Container child vbox3.Gtk.Box+BoxChild
+			this.bttnRemoveWeapon = new global::IBBoard.GtkSharp.Translatable.TranslatableButton();
+			this.bttnRemoveWeapon.Sensitive = false;
+			this.bttnRemoveWeapon.CanFocus = true;
+			this.bttnRemoveWeapon.Name = "bttnRemoveWeapon";
+			this.bttnRemoveWeapon.UseUnderline = true;
+			this.bttnRemoveWeapon.Label = global::Mono.Unix.Catalog.GetString("remove");
+			this.vbox3.Add(this.bttnRemoveWeapon);
+			global::Gtk.Box.BoxChild w22 = ((global::Gtk.Box.BoxChild)(this.vbox3[this.bttnRemoveWeapon]));
+			w22.Position = 3;
+			w22.Expand = false;
+			w22.Fill = false;
+			this.hbox2.Add(this.vbox3);
+			global::Gtk.Box.BoxChild w23 = ((global::Gtk.Box.BoxChild)(this.hbox2[this.vbox3]));
+			w23.Position = 1;
+			w23.Expand = false;
+			w23.Fill = false;
+			this.vbox1.Add(this.hbox2);
+			global::Gtk.Box.BoxChild w24 = ((global::Gtk.Box.BoxChild)(this.vbox1[this.hbox2]));
+			w24.Position = 3;
+			w24.Expand = false;
+			w24.Fill = false;
+			this.Add(this.vbox1);
+			if ((this.Child != null))
+			{
+				this.Child.ShowAll();
+			}
+			this.Show();
+			this.unitName.FocusOutEvent += new global::Gtk.FocusOutEventHandler(this.OnUnitNameFocusOut);
+			this.unitName.KeyPressEvent += new global::Gtk.KeyPressEventHandler(this.OnUnitNameKeyPress);
+			this.unitSize.FocusOutEvent += new global::Gtk.FocusOutEventHandler(this.OnUnitSizeFocusOut);
+			this.unitSize.KeyPressEvent += new global::Gtk.KeyPressEventHandler(this.OnUnitSizeKeyPress);
+			this.bttnAddWeapon.Clicked += new global::System.EventHandler(this.OnBttnAddEquipmentClicked);
+			this.bttnEditWeapon.Clicked += new global::System.EventHandler(this.HandleEditButtonClicked);
+			this.bttnReplaceWeapon.Clicked += new global::System.EventHandler(this.HandleReplaceButtonClicked);
+			this.bttnRemoveWeapon.Clicked += new global::System.EventHandler(this.HandleRemoveButtonActivated);
+		}
+	}
+}
--- a/gtk-gui/generated.cs	Sun Jan 31 20:46:06 2010 +0000
+++ b/gtk-gui/generated.cs	Mon Jan 17 19:43:47 2011 +0000
@@ -1,115 +1,129 @@
-// ------------------------------------------------------------------------------
-//  <autogenerated>
-//      This code was generated by a tool.
-//      
-// 
-//      Changes to this file may cause incorrect behavior and will be lost if 
-//      the code is regenerated.
-//  </autogenerated>
-// ------------------------------------------------------------------------------
+
+// This file has been generated by the GUI designer. Do not modify.
+namespace Stetic
+{
+	internal class Gui
+	{
+		private static bool initialized;
+
+		internal static void Initialize(Gtk.Widget iconRenderer)
+		{
+			if ((Stetic.Gui.initialized == false))
+			{
+				Stetic.Gui.initialized = true;
+			}
+		}
+	}
+
+	internal class IconLoader
+	{
+		public static Gdk.Pixbuf LoadIcon(Gtk.Widget widget, string name, Gtk.IconSize size)
+		{
+			Gdk.Pixbuf res = widget.RenderIcon(name, size, null);
+			if ((res != null))
+			{
+				return res;
+			}
+			else
+			{
+				int sz;
+				int sy;
+				global::Gtk.Icon.SizeLookup(size, out  sz, out  sy);
+				try
+				{
+					return Gtk.IconTheme.Default.LoadIcon(name, sz, 0);
+				}
+				catch (System.Exception)
+				{
+					if ((name != "gtk-missing-image"))
+					{
+						return Stetic.IconLoader.LoadIcon(widget, "gtk-missing-image", size);
+					}
+					else
+					{
+						Gdk.Pixmap pmap = new Gdk.Pixmap(Gdk.Screen.Default.RootWindow, sz, sz);
+						Gdk.GC gc = new Gdk.GC(pmap);
+						gc.RgbFgColor = new Gdk.Color(255, 255, 255);
+						pmap.DrawRectangle(gc, true, 0, 0, sz, sz);
+						gc.RgbFgColor = new Gdk.Color(0, 0, 0);
+						pmap.DrawRectangle(gc, false, 0, 0, (sz - 1), (sz - 1));
+						gc.SetLineAttributes(3, Gdk.LineStyle.Solid, Gdk.CapStyle.Round, Gdk.JoinStyle.Round);
+						gc.RgbFgColor = new Gdk.Color(255, 0, 0);
+						pmap.DrawLine(gc, (sz / 4), (sz / 4), ((sz - 1) - (sz / 4)), ((sz - 1) - (sz / 4)));
+						pmap.DrawLine(gc, ((sz - 1) - (sz / 4)), (sz / 4), (sz / 4), ((sz - 1) - (sz / 4)));
+						return Gdk.Pixbuf.FromDrawable(pmap, pmap.Colormap, 0, 0, 0, 0, sz, sz);
+					}
+				}
+			}
+		}
+	}
+
+	internal class BinContainer
+	{
+		private Gtk.Widget child;
+		private Gtk.UIManager uimanager;
 
-namespace Stetic {
-    
-    
-    internal class Gui {
-        
-        private static bool initialized;
-        
-        internal static void Initialize(Gtk.Widget iconRenderer) {
-            if ((Stetic.Gui.initialized == false)) {
-                Stetic.Gui.initialized = true;
-            }
-        }
-    }
-    
-    internal class IconLoader {
-        
-        public static Gdk.Pixbuf LoadIcon(Gtk.Widget widget, string name, Gtk.IconSize size, int sz) {
-            Gdk.Pixbuf res = widget.RenderIcon(name, size, null);
-            if ((res != null)) {
-                return res;
-            }
-            else {
-                try {
-                    return Gtk.IconTheme.Default.LoadIcon(name, sz, 0);
-                }
-                catch (System.Exception ) {
-                    if ((name != "gtk-missing-image")) {
-                        return Stetic.IconLoader.LoadIcon(widget, "gtk-missing-image", size, sz);
-                    }
-                    else {
-                        Gdk.Pixmap pmap = new Gdk.Pixmap(Gdk.Screen.Default.RootWindow, sz, sz);
-                        Gdk.GC gc = new Gdk.GC(pmap);
-                        gc.RgbFgColor = new Gdk.Color(255, 255, 255);
-                        pmap.DrawRectangle(gc, true, 0, 0, sz, sz);
-                        gc.RgbFgColor = new Gdk.Color(0, 0, 0);
-                        pmap.DrawRectangle(gc, false, 0, 0, (sz - 1), (sz - 1));
-                        gc.SetLineAttributes(3, Gdk.LineStyle.Solid, Gdk.CapStyle.Round, Gdk.JoinStyle.Round);
-                        gc.RgbFgColor = new Gdk.Color(255, 0, 0);
-                        pmap.DrawLine(gc, (sz / 4), (sz / 4), ((sz - 1) - (sz / 4)), ((sz - 1) - (sz / 4)));
-                        pmap.DrawLine(gc, ((sz - 1) - (sz / 4)), (sz / 4), (sz / 4), ((sz - 1) - (sz / 4)));
-                        return Gdk.Pixbuf.FromDrawable(pmap, pmap.Colormap, 0, 0, 0, 0, sz, sz);
-                    }
-                }
-            }
-        }
-    }
-    
-    internal class BinContainer {
-        
-        private Gtk.Widget child;
-        
-        private Gtk.UIManager uimanager;
-        
-        public static BinContainer Attach(Gtk.Bin bin) {
-            BinContainer bc = new BinContainer();
-            bin.SizeRequested += new Gtk.SizeRequestedHandler(bc.OnSizeRequested);
-            bin.SizeAllocated += new Gtk.SizeAllocatedHandler(bc.OnSizeAllocated);
-            bin.Added += new Gtk.AddedHandler(bc.OnAdded);
-            return bc;
-        }
-        
-        private void OnSizeRequested(object sender, Gtk.SizeRequestedArgs args) {
-            if ((this.child != null)) {
-                args.Requisition = this.child.SizeRequest();
-            }
-        }
-        
-        private void OnSizeAllocated(object sender, Gtk.SizeAllocatedArgs args) {
-            if ((this.child != null)) {
-                this.child.Allocation = args.Allocation;
-            }
-        }
-        
-        private void OnAdded(object sender, Gtk.AddedArgs args) {
-            this.child = args.Widget;
-        }
-        
-        public void SetUiManager(Gtk.UIManager uim) {
-            this.uimanager = uim;
-            this.child.Realized += new System.EventHandler(this.OnRealized);
-        }
-        
-        private void OnRealized(object sender, System.EventArgs args) {
-            if ((this.uimanager != null)) {
-                Gtk.Widget w;
-                w = this.child.Toplevel;
-                if (((w != null) && typeof(Gtk.Window).IsInstanceOfType(w))) {
-                    ((Gtk.Window)(w)).AddAccelGroup(this.uimanager.AccelGroup);
-                    this.uimanager = null;
-                }
-            }
-        }
-    }
-    
-    internal class ActionGroups {
-        
-        public static Gtk.ActionGroup GetActionGroup(System.Type type) {
-            return Stetic.ActionGroups.GetActionGroup(type.FullName);
-        }
-        
-        public static Gtk.ActionGroup GetActionGroup(string name) {
-            return null;
-        }
-    }
+		public static BinContainer Attach(Gtk.Bin bin)
+		{
+			BinContainer bc = new BinContainer();
+			bin.SizeRequested += new Gtk.SizeRequestedHandler(bc.OnSizeRequested);
+			bin.SizeAllocated += new Gtk.SizeAllocatedHandler(bc.OnSizeAllocated);
+			bin.Added += new Gtk.AddedHandler(bc.OnAdded);
+			return bc;
+		}
+
+		private void OnSizeRequested(object sender, Gtk.SizeRequestedArgs args)
+		{
+			if ((this.child != null))
+			{
+				args.Requisition = this.child.SizeRequest();
+			}
+		}
+
+		private void OnSizeAllocated(object sender, Gtk.SizeAllocatedArgs args)
+		{
+			if ((this.child != null))
+			{
+				this.child.Allocation = args.Allocation;
+			}
+		}
+
+		private void OnAdded(object sender, Gtk.AddedArgs args)
+		{
+			this.child = args.Widget;
+		}
+
+		public void SetUiManager(Gtk.UIManager uim)
+		{
+			this.uimanager = uim;
+			this.child.Realized += new System.EventHandler(this.OnRealized);
+		}
+
+		private void OnRealized(object sender, System.EventArgs args)
+		{
+			if ((this.uimanager != null))
+			{
+				Gtk.Widget w;
+				w = this.child.Toplevel;
+				if (((w != null) && typeof(Gtk.Window).IsInstanceOfType(w)))
+				{
+					((Gtk.Window)(w)).AddAccelGroup(this.uimanager.AccelGroup);
+					this.uimanager = null;
+				}
+			}
+		}
+	}
+
+	internal class ActionGroups
+	{
+		public static Gtk.ActionGroup GetActionGroup(System.Type type)
+		{
+			return Stetic.ActionGroups.GetActionGroup(type.FullName);
+		}
+
+		public static Gtk.ActionGroup GetActionGroup(string name)
+		{
+			return null;
+		}
+	}
 }
--- a/gtk-gui/gui.stetic	Sun Jan 31 20:46:06 2010 +0000
+++ b/gtk-gui/gui.stetic	Mon Jan 17 19:43:47 2011 +0000
@@ -5,17 +5,17 @@
     <target-gtk-version>2.12</target-gtk-version>
   </configuration>
   <import>
-    <widget-library name="../../IBBoard.GtkSharp/bin/Debug/IBBoard.GtkSharp.dll" />
-    <widget-library name="../bin/Debug/WarFoundryGTK.exe" internal="true" />
+    <widget-library name="../../IBBoard.GtkSharp/bin/Release/IBBoard.GtkSharp.dll" />
+    <widget-library name="../bin/Release/WarFoundry-GTK.exe" internal="true" />
   </import>
-  <widget class="Gtk.Window" id="IBBoard.WarFoundry.GTK.FrmMainWindow" design-size="832 659">
+  <widget class="Gtk.Window" id="IBBoard.WarFoundry.GUI.GTK.FrmMainWindow" design-size="832 659">
     <action-group name="Default">
       <action id="menuFile">
         <property name="Type">Action</property>
         <property name="Label" translatable="yes">File</property>
         <property name="ShortLabel" translatable="yes">File</property>
       </action>
-      <action id="miCreateArmy">
+      <action id="miNewArmy">
         <property name="Type">Action</property>
         <property name="Label" translatable="yes">Create army</property>
         <property name="ShortLabel" translatable="yes">Create army</property>
@@ -56,7 +56,6 @@
       <action id="miReloadFiles">
         <property name="Type">Action</property>
         <property name="Label" translatable="yes">Reload files</property>
-        <property name="Sensitive">False</property>
         <property name="ShortLabel" translatable="yes">Reload files</property>
         <property name="StockId">gtk-refresh</property>
         <signal name="Activated" handler="OnReloadFilesActivated" />
@@ -97,39 +96,40 @@
         <property name="Label" translatable="yes">About</property>
         <property name="ShortLabel" translatable="yes">About</property>
         <property name="StockId">gtk-about</property>
+        <signal name="Activated" handler="HelpAboutActivated" />
       </action>
       <action id="miDebugInformation">
         <property name="Type">Action</property>
         <property name="Label" translatable="yes">Debug Information</property>
         <property name="ShortLabel" translatable="yes">Debug Information</property>
       </action>
-      <action id="newArmyButton">
+      <action id="bttnNewArmy">
         <property name="Type">Action</property>
         <property name="Label" translatable="yes" />
         <property name="StockId">gtk-new</property>
         <signal name="Activated" handler="newTBButtonActivated" />
       </action>
-      <action id="openArmyButton">
+      <action id="bttnOpenArmy">
         <property name="Type">Action</property>
         <property name="Label" translatable="yes" />
         <property name="StockId">gtk-open</property>
         <signal name="Activated" handler="openTBButtonActivated" />
       </action>
-      <action id="saveArmyButton">
+      <action id="bttnSaveArmy">
         <property name="Type">Action</property>
         <property name="Label" translatable="yes" />
         <property name="Sensitive">False</property>
         <property name="StockId">gtk-save</property>
         <signal name="Activated" handler="saveTBButtonActivated" />
       </action>
-      <action id="undoActionButton">
+      <action id="bttnUndo">
         <property name="Type">Action</property>
         <property name="Label" translatable="yes" />
         <property name="Sensitive">False</property>
         <property name="StockId">gtk-undo</property>
         <signal name="Activated" handler="undoTBButtonActivated" />
       </action>
-      <action id="redoActionButton">
+      <action id="bttnRedo">
         <property name="Type">Action</property>
         <property name="Label" translatable="yes" />
         <property name="Sensitive">False</property>
@@ -145,19 +145,26 @@
         <property name="Label" translatable="yes" />
         <property name="StockId">gtk-add</property>
       </action>
-      <action id="miExportArmy">
+      <action id="miExportArmyAs">
         <property name="Type">Action</property>
         <property name="Label" translatable="yes">Export army as...</property>
         <property name="Sensitive">False</property>
-        <property name="ShortLabel" translatable="yes">Export army</property>
+        <property name="ShortLabel" translatable="yes">Export army as...</property>
         <property name="StockId">gtk-convert</property>
       </action>
-      <action id="miExportAsBasicHtml">
+      <action id="miExportArmyAsBasicHTML">
         <property name="Type">Action</property>
         <property name="Label" translatable="yes">Basic HTML</property>
         <property name="ShortLabel" translatable="yes">Basic HTML</property>
         <signal name="Activated" handler="OnMiExportAsBasicHtmlActivated" />
       </action>
+      <action id="miPreferences">
+        <property name="Type">Action</property>
+        <property name="Label" translatable="yes">preferences</property>
+        <property name="ShortLabel" translatable="yes">preferences</property>
+        <property name="StockId">gtk-preferences</property>
+        <signal name="Activated" handler="miPreferencesClicked" />
+      </action>
     </action-group>
     <property name="MemberName" />
     <property name="Title" translatable="yes">MainWindow</property>
@@ -170,12 +177,12 @@
             <property name="MemberName" />
             <node name="menubar1" type="Menubar">
               <node type="Menu" action="menuFile">
-                <node type="Menuitem" action="miCreateArmy" />
+                <node type="Menuitem" action="miNewArmy" />
                 <node type="Menuitem" action="miOpenArmy" />
                 <node type="Menuitem" action="miSaveArmy" />
                 <node type="Menuitem" action="miSaveArmyAs" />
-                <node type="Menu" action="miExportArmy">
-                  <node type="Menuitem" action="miExportAsBasicHtml" />
+                <node type="Menu" action="miExportArmyAs">
+                  <node type="Menuitem" action="miExportArmyAsBasicHTML" />
                 </node>
                 <node type="Menuitem" action="miCloseArmy" />
                 <node type="Separator" />
@@ -186,10 +193,11 @@
               <node type="Menu" action="menuEdit">
                 <node type="Menuitem" action="miUndo" />
                 <node type="Menuitem" action="miRedo" />
+                <node type="Separator" />
+                <node type="Menuitem" action="miPreferences" />
               </node>
               <node type="Menu" action="menuHelp">
                 <node type="Menuitem" action="miAbout" />
-                <node type="Menuitem" action="miDebugInformation" />
               </node>
             </node>
           </widget>
@@ -208,12 +216,12 @@
             <property name="ButtonStyle">Icons</property>
             <property name="IconSize">LargeToolbar</property>
             <node name="toolbar" type="Toolbar">
-              <node type="Toolitem" action="newArmyButton" />
-              <node type="Toolitem" action="openArmyButton" />
-              <node type="Toolitem" action="saveArmyButton" />
+              <node type="Toolitem" action="bttnNewArmy" />
+              <node type="Toolitem" action="bttnOpenArmy" />
+              <node type="Toolitem" action="bttnSaveArmy" />
               <node type="Separator" />
-              <node type="Toolitem" action="undoActionButton" />
-              <node type="Toolitem" action="redoActionButton" />
+              <node type="Toolitem" action="bttnUndo" />
+              <node type="Toolitem" action="bttnRedo" />
               <node type="Separator" />
             </node>
           </widget>
@@ -227,6 +235,7 @@
         <child>
           <widget class="Gtk.HPaned" id="hpaned2">
             <property name="MemberName" />
+            <property name="Visible">False</property>
             <property name="CanFocus">True</property>
             <property name="Position">178</property>
             <child>
@@ -246,6 +255,8 @@
                 <property name="MemberName" />
                 <property name="CanFocus">True</property>
                 <property name="CurrentPage">-1</property>
+                <property name="Scrollable">True</property>
+                <signal name="Removed" handler="NotebookPageRemoved" />
               </widget>
             </child>
           </widget>
@@ -262,7 +273,15 @@
               <placeholder />
             </child>
             <child>
-              <placeholder />
+              <widget class="Gtk.Label" id="lblTotalPoints">
+                <property name="MemberName" />
+              </widget>
+              <packing>
+                <property name="Position">2</property>
+                <property name="AutoSize">True</property>
+                <property name="Expand">False</property>
+                <property name="Fill">False</property>
+              </packing>
             </child>
           </widget>
           <packing>
@@ -275,7 +294,7 @@
       </widget>
     </child>
   </widget>
-  <widget class="Gtk.Dialog" id="IBBoard.WarFoundry.GTK.FrmNewArmy" design-size="370 348">
+  <widget class="Gtk.Dialog" id="IBBoard.WarFoundry.GUI.GTK.FrmNewArmy" design-size="370 348">
     <property name="MemberName" />
     <property name="Events">ButtonPressMask</property>
     <property name="Title" translatable="yes">Create new army</property>
@@ -375,28 +394,9 @@
               </packing>
             </child>
             <child>
-              <widget class="Gtk.Label" id="label1">
+              <widget class="IBBoard.GtkSharp.Translatable.TranslatableLabel" id="lblArmyName">
                 <property name="MemberName" />
-                <property name="LabelProp" translatable="yes">Race</property>
-              </widget>
-              <packing>
-                <property name="TopAttach">1</property>
-                <property name="BottomAttach">2</property>
-                <property name="AutoSize">True</property>
-                <property name="XOptions">Fill</property>
-                <property name="YOptions">Fill</property>
-                <property name="XExpand">False</property>
-                <property name="XFill">True</property>
-                <property name="XShrink">False</property>
-                <property name="YExpand">False</property>
-                <property name="YFill">True</property>
-                <property name="YShrink">False</property>
-              </packing>
-            </child>
-            <child>
-              <widget class="Gtk.Label" id="label2">
-                <property name="MemberName" />
-                <property name="LabelProp" translatable="yes">Army name</property>
+                <property name="LabelProp" translatable="yes">army name</property>
               </widget>
               <packing>
                 <property name="TopAttach">2</property>
@@ -413,9 +413,9 @@
               </packing>
             </child>
             <child>
-              <widget class="Gtk.Label" id="label3">
+              <widget class="IBBoard.GtkSharp.Translatable.TranslatableLabel" id="lblArmySize">
                 <property name="MemberName" />
-                <property name="LabelProp" translatable="yes">Points value</property>
+                <property name="LabelProp" translatable="yes">points value</property>
               </widget>
               <packing>
                 <property name="TopAttach">3</property>
@@ -432,7 +432,7 @@
               </packing>
             </child>
             <child>
-              <widget class="Gtk.Label" id="label4">
+              <widget class="IBBoard.GtkSharp.Translatable.TranslatableLabel" id="lblGameSystem">
                 <property name="MemberName" />
                 <property name="LabelProp" translatable="yes">game system</property>
               </widget>
@@ -449,6 +449,25 @@
               </packing>
             </child>
             <child>
+              <widget class="IBBoard.GtkSharp.Translatable.TranslatableLabel" id="lblRaceList">
+                <property name="MemberName" />
+                <property name="LabelProp" translatable="yes">race</property>
+              </widget>
+              <packing>
+                <property name="TopAttach">1</property>
+                <property name="BottomAttach">2</property>
+                <property name="AutoSize">True</property>
+                <property name="XOptions">Fill</property>
+                <property name="YOptions">Fill</property>
+                <property name="XExpand">False</property>
+                <property name="XFill">True</property>
+                <property name="XShrink">False</property>
+                <property name="YExpand">False</property>
+                <property name="YFill">True</property>
+                <property name="YShrink">False</property>
+              </packing>
+            </child>
+            <child>
               <widget class="Gtk.ComboBoxEntry" id="systemCombo">
                 <property name="MemberName" />
                 <property name="IsTextCombo">True</property>
@@ -513,7 +532,7 @@
         <property name="Size">2</property>
         <property name="LayoutStyle">End</property>
         <child>
-          <widget class="Gtk.Button" id="bttnCancel">
+          <widget class="IBBoard.GtkSharp.Translatable.TranslatableButton" id="bttnCancel">
             <property name="MemberName" />
             <property name="CanFocus">True</property>
             <property name="UseStock">True</property>
@@ -529,17 +548,17 @@
           </packing>
         </child>
         <child>
-          <widget class="Gtk.Button" id="bttnCreate">
+          <widget class="IBBoard.GtkSharp.Translatable.TranslatableButton" id="bttnCreate">
             <property name="MemberName" />
             <property name="Sensitive">False</property>
             <property name="CanDefault">True</property>
             <property name="CanFocus">True</property>
-            <property name="Type">TextAndIcon</property>
-            <property name="Icon">stock:gtk-ok Menu</property>
-            <property name="Label" translatable="yes">C_reate</property>
-            <property name="UseUnderline">True</property>
+            <property name="UseStock">True</property>
+            <property name="Type">StockItem</property>
+            <property name="StockId">gtk-ok</property>
             <property name="ResponseId">-5</property>
             <signal name="Clicked" handler="OnCreateClicked" />
+            <property name="label">gtk-ok</property>
           </widget>
           <packing>
             <property name="Position">1</property>
@@ -550,7 +569,7 @@
       </widget>
     </child>
   </widget>
-  <widget class="Gtk.Dialog" id="IBBoard.WarFoundry.GTK.FrmNewUnit" design-size="400 318">
+  <widget class="Gtk.Dialog" id="IBBoard.WarFoundry.GUI.GTK.FrmNewUnit" design-size="403 259">
     <property name="MemberName" />
     <property name="Title" translatable="yes">Add new unit</property>
     <property name="Icon">stock:gtk-new Menu</property>
@@ -573,9 +592,9 @@
                 <property name="MemberName" />
                 <property name="Spacing">6</property>
                 <child>
-                  <widget class="Gtk.Label" id="label1">
+                  <widget class="IBBoard.GtkSharp.Translatable.TranslatableLabel" id="lblUnitList">
                     <property name="MemberName" />
-                    <property name="LabelProp" translatable="yes">Unit Type:</property>
+                    <property name="LabelProp" translatable="yes">unit type</property>
                   </widget>
                   <packing>
                     <property name="Position">0</property>
@@ -613,10 +632,9 @@
               </packing>
             </child>
             <child>
-              <widget class="Gtk.Label" id="lblNewUnitWarning">
+              <widget class="IBBoard.GtkSharp.Translatable.TranslatableLabel" id="lblNewUnitWarning">
                 <property name="MemberName" />
-                <property name="Xalign">0</property>
-                <property name="Yalign">0</property>
+                <property name="Visible">False</property>
               </widget>
               <packing>
                 <property name="Position">1</property>
@@ -643,15 +661,14 @@
         <property name="Size">2</property>
         <property name="LayoutStyle">End</property>
         <child>
-          <widget class="Gtk.Button" id="buttonCancel">
+          <widget class="IBBoard.GtkSharp.Translatable.TranslatableButton" id="bttnCancel">
             <property name="MemberName" />
-            <property name="CanDefault">True</property>
             <property name="CanFocus">True</property>
             <property name="UseStock">True</property>
             <property name="Type">StockItem</property>
             <property name="StockId">gtk-cancel</property>
             <property name="ResponseId">-6</property>
-            <signal name="Activated" handler="OnButtonCancelActivated" />
+            <signal name="Clicked" handler="OnButtonCancelActivated" />
             <property name="label">gtk-cancel</property>
           </widget>
           <packing>
@@ -660,10 +677,8 @@
           </packing>
         </child>
         <child>
-          <widget class="Gtk.Button" id="buttonOk">
+          <widget class="IBBoard.GtkSharp.Translatable.TranslatableButton" id="bttnCreate">
             <property name="MemberName" />
-            <property name="Sensitive">False</property>
-            <property name="CanDefault">True</property>
             <property name="CanFocus">True</property>
             <property name="UseStock">True</property>
             <property name="Type">StockItem</property>
@@ -681,7 +696,7 @@
       </widget>
     </child>
   </widget>
-  <widget class="Gtk.Bin" id="IBBoard.WarFoundry.GTK.Widgets.UnitDisplayWidget" design-size="649 422">
+  <widget class="Gtk.Bin" id="IBBoard.WarFoundry.GUI.GTK.Widgets.UnitDisplayWidget" design-size="649 458">
     <property name="MemberName" />
     <child>
       <widget class="Gtk.VBox" id="vbox1">
@@ -733,15 +748,23 @@
           </packing>
         </child>
         <child>
-          <widget class="Gtk.ScrolledWindow" id="GtkScrolledWindow">
+          <widget class="Gtk.ScrolledWindow" id="statsScrollPanel">
             <property name="MemberName" />
+            <property name="CanFocus">True</property>
             <property name="ShadowType">In</property>
             <child>
-              <widget class="Gtk.NodeView" id="unitStats">
+              <widget class="Gtk.Viewport" id="GtkViewport">
                 <property name="MemberName" />
-                <property name="HeightRequest">75</property>
-                <property name="CanFocus">True</property>
-                <property name="ShowScrollbars">True</property>
+                <property name="ShadowType">None</property>
+                <child>
+                  <widget class="Gtk.VBox" id="statsRepeatBox">
+                    <property name="MemberName" />
+                    <property name="Spacing">6</property>
+                    <child>
+                      <placeholder />
+                    </child>
+                  </widget>
+                </child>
               </widget>
             </child>
           </widget>
@@ -762,25 +785,498 @@
           </packing>
         </child>
         <child>
+          <widget class="Gtk.HBox" id="hbox2">
+            <property name="MemberName" />
+            <property name="Spacing">6</property>
+            <child>
+              <widget class="Gtk.Table" id="table1">
+                <property name="MemberName" />
+                <property name="NRows">3</property>
+                <property name="NColumns">2</property>
+                <property name="RowSpacing">6</property>
+                <property name="ColumnSpacing">6</property>
+                <child>
+                  <widget class="Gtk.ScrolledWindow" id="GtkScrolledWindow2">
+                    <property name="MemberName" />
+                    <property name="ShadowType">In</property>
+                    <child>
+                      <widget class="Gtk.NodeView" id="equipmentList">
+                        <property name="MemberName" />
+                        <property name="CanFocus">True</property>
+                        <property name="ShowScrollbars">True</property>
+                        <property name="HeadersVisible">False</property>
+                      </widget>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="LeftAttach">1</property>
+                    <property name="RightAttach">2</property>
+                    <property name="AutoSize">True</property>
+                    <property name="YOptions">Fill</property>
+                    <property name="XExpand">True</property>
+                    <property name="XFill">True</property>
+                    <property name="XShrink">False</property>
+                    <property name="YExpand">False</property>
+                    <property name="YFill">True</property>
+                    <property name="YShrink">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="Gtk.ScrolledWindow" id="GtkScrolledWindow3">
+                    <property name="MemberName" />
+                    <property name="ShadowType">In</property>
+                    <child>
+                      <widget class="Gtk.TextView" id="notesView">
+                        <property name="MemberName" />
+                        <property name="CanFocus">True</property>
+                        <property name="ShowScrollbars">True</property>
+                        <property name="Editable">False</property>
+                        <property name="Text" translatable="yes" />
+                      </widget>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="TopAttach">2</property>
+                    <property name="BottomAttach">3</property>
+                    <property name="LeftAttach">1</property>
+                    <property name="RightAttach">2</property>
+                    <property name="AutoSize">True</property>
+                    <property name="YOptions">Fill</property>
+                    <property name="XExpand">True</property>
+                    <property name="XFill">True</property>
+                    <property name="XShrink">False</property>
+                    <property name="YExpand">False</property>
+                    <property name="YFill">True</property>
+                    <property name="YShrink">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="Gtk.ScrolledWindow" id="GtkScrolledWindow4">
+                    <property name="MemberName" />
+                    <property name="ShadowType">In</property>
+                    <child>
+                      <widget class="Gtk.NodeView" id="abilitiesList">
+                        <property name="MemberName" />
+                        <property name="CanFocus">True</property>
+                        <property name="ShowScrollbars">True</property>
+                        <property name="HeadersVisible">False</property>
+                      </widget>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="TopAttach">1</property>
+                    <property name="BottomAttach">2</property>
+                    <property name="LeftAttach">1</property>
+                    <property name="RightAttach">2</property>
+                    <property name="AutoSize">True</property>
+                    <property name="YOptions">Fill</property>
+                    <property name="XExpand">True</property>
+                    <property name="XFill">True</property>
+                    <property name="XShrink">False</property>
+                    <property name="YExpand">False</property>
+                    <property name="YFill">True</property>
+                    <property name="YShrink">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="IBBoard.GtkSharp.Translatable.TranslatableLabel" id="lblAbilities">
+                    <property name="MemberName" />
+                    <property name="LabelProp" translatable="yes">abilities:</property>
+                  </widget>
+                  <packing>
+                    <property name="TopAttach">1</property>
+                    <property name="BottomAttach">2</property>
+                    <property name="AutoSize">True</property>
+                    <property name="XOptions">Fill</property>
+                    <property name="YOptions">Fill</property>
+                    <property name="XExpand">False</property>
+                    <property name="XFill">True</property>
+                    <property name="XShrink">False</property>
+                    <property name="YExpand">False</property>
+                    <property name="YFill">True</property>
+                    <property name="YShrink">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="IBBoard.GtkSharp.Translatable.TranslatableLabel" id="lblEquip">
+                    <property name="MemberName" />
+                    <property name="LabelProp" translatable="yes">equipment:</property>
+                  </widget>
+                  <packing>
+                    <property name="AutoSize">True</property>
+                    <property name="XOptions">Fill</property>
+                    <property name="YOptions">Fill</property>
+                    <property name="XExpand">False</property>
+                    <property name="XFill">True</property>
+                    <property name="XShrink">False</property>
+                    <property name="YExpand">False</property>
+                    <property name="YFill">True</property>
+                    <property name="YShrink">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="IBBoard.GtkSharp.Translatable.TranslatableLabel" id="lblNotes">
+                    <property name="MemberName" />
+                    <property name="LabelProp" translatable="yes">notes:</property>
+                  </widget>
+                  <packing>
+                    <property name="TopAttach">2</property>
+                    <property name="BottomAttach">3</property>
+                    <property name="AutoSize">True</property>
+                    <property name="XOptions">Fill</property>
+                    <property name="YOptions">Fill</property>
+                    <property name="XExpand">False</property>
+                    <property name="XFill">True</property>
+                    <property name="XShrink">False</property>
+                    <property name="YExpand">False</property>
+                    <property name="YFill">True</property>
+                    <property name="YShrink">False</property>
+                  </packing>
+                </child>
+              </widget>
+              <packing>
+                <property name="Position">0</property>
+                <property name="AutoSize">True</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="Gtk.VBox" id="vbox3">
+                <property name="MemberName" />
+                <property name="Spacing">6</property>
+                <child>
+                  <widget class="IBBoard.GtkSharp.Translatable.TranslatableButton" id="bttnAddWeapon">
+                    <property name="MemberName" />
+                    <property name="CanFocus">True</property>
+                    <property name="Type">TextOnly</property>
+                    <property name="Label" translatable="yes">add</property>
+                    <property name="UseUnderline">True</property>
+                    <signal name="Clicked" handler="OnBttnAddEquipmentClicked" />
+                  </widget>
+                  <packing>
+                    <property name="Position">0</property>
+                    <property name="AutoSize">True</property>
+                    <property name="Expand">False</property>
+                    <property name="Fill">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="IBBoard.GtkSharp.Translatable.TranslatableButton" id="bttnEditWeapon">
+                    <property name="MemberName" />
+                    <property name="Sensitive">False</property>
+                    <property name="CanFocus">True</property>
+                    <property name="Type">TextOnly</property>
+                    <property name="Label" translatable="yes">edit</property>
+                    <property name="UseUnderline">True</property>
+                    <signal name="Clicked" handler="HandleEditButtonClicked" />
+                  </widget>
+                  <packing>
+                    <property name="Position">1</property>
+                    <property name="AutoSize">True</property>
+                    <property name="Expand">False</property>
+                    <property name="Fill">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="IBBoard.GtkSharp.Translatable.TranslatableButton" id="bttnReplaceWeapon">
+                    <property name="MemberName" />
+                    <property name="Sensitive">False</property>
+                    <property name="CanFocus">True</property>
+                    <property name="Type">TextOnly</property>
+                    <property name="Label" translatable="yes">replace</property>
+                    <property name="UseUnderline">True</property>
+                    <signal name="Clicked" handler="HandleReplaceButtonClicked" />
+                  </widget>
+                  <packing>
+                    <property name="Position">2</property>
+                    <property name="AutoSize">True</property>
+                    <property name="Expand">False</property>
+                    <property name="Fill">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="IBBoard.GtkSharp.Translatable.TranslatableButton" id="bttnRemoveWeapon">
+                    <property name="MemberName" />
+                    <property name="Sensitive">False</property>
+                    <property name="CanFocus">True</property>
+                    <property name="Type">TextOnly</property>
+                    <property name="Label" translatable="yes">remove</property>
+                    <property name="UseUnderline">True</property>
+                    <signal name="Clicked" handler="HandleRemoveButtonActivated" />
+                  </widget>
+                  <packing>
+                    <property name="Position">3</property>
+                    <property name="AutoSize">True</property>
+                    <property name="Expand">False</property>
+                    <property name="Fill">False</property>
+                  </packing>
+                </child>
+              </widget>
+              <packing>
+                <property name="Position">1</property>
+                <property name="AutoSize">True</property>
+                <property name="Expand">False</property>
+                <property name="Fill">False</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="Position">3</property>
+            <property name="AutoSize">True</property>
+            <property name="Expand">False</property>
+            <property name="Fill">False</property>
+          </packing>
+        </child>
+        <child>
+          <placeholder />
+        </child>
+        <child>
+          <placeholder />
+        </child>
+      </widget>
+    </child>
+  </widget>
+  <widget class="Gtk.Dialog" id="IBBoard.WarFoundry.GUI.GTK.FrmAddEquipment" design-size="400 300">
+    <property name="MemberName" />
+    <property name="Title" translatable="yes">Add equipment</property>
+    <property name="WindowPosition">CenterOnParent</property>
+    <property name="Modal">True</property>
+    <property name="SkipPagerHint">True</property>
+    <property name="SkipTaskbarHint">True</property>
+    <property name="Buttons">2</property>
+    <property name="HelpButton">False</property>
+    <child internal-child="VBox">
+      <widget class="Gtk.VBox" id="dialog1_VBox">
+        <property name="MemberName" />
+        <property name="BorderWidth">2</property>
+        <child>
           <widget class="Gtk.Table" id="table1">
             <property name="MemberName" />
             <property name="NRows">2</property>
-            <property name="NColumns">3</property>
+            <property name="NColumns">2</property>
             <property name="RowSpacing">6</property>
             <property name="ColumnSpacing">6</property>
             <child>
-              <widget class="Gtk.ScrolledWindow" id="GtkScrolledWindow1">
+              <widget class="Gtk.ScrolledWindow" id="GtkScrolledWindow">
                 <property name="MemberName" />
                 <property name="ShadowType">In</property>
                 <child>
-                  <widget class="Gtk.NodeView" id="optionalEquipment">
+                  <widget class="Gtk.TreeView" id="lstEquipment">
                     <property name="MemberName" />
                     <property name="CanFocus">True</property>
                     <property name="ShowScrollbars">True</property>
+                    <property name="HeadersVisible">False</property>
                   </widget>
                 </child>
               </widget>
               <packing>
+                <property name="LeftAttach">1</property>
+                <property name="RightAttach">2</property>
+                <property name="AutoSize">True</property>
+                <property name="YOptions">Fill</property>
+                <property name="XExpand">True</property>
+                <property name="XFill">True</property>
+                <property name="XShrink">False</property>
+                <property name="YExpand">False</property>
+                <property name="YFill">True</property>
+                <property name="YShrink">False</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="Gtk.HBox" id="hbox2">
+                <property name="MemberName" />
+                <property name="Spacing">6</property>
+                <child>
+                  <widget class="Gtk.Table" id="table2">
+                    <property name="MemberName" />
+                    <property name="NRows">3</property>
+                    <property name="NColumns">3</property>
+                    <property name="RowSpacing">6</property>
+                    <property name="ColumnSpacing">6</property>
+                    <child>
+                      <placeholder />
+                    </child>
+                    <child>
+                      <placeholder />
+                    </child>
+                    <child>
+                      <widget class="IBBoard.GtkSharp.Translatable.TranslatableLabel" id="lblEquipAll">
+                        <property name="MemberName" />
+                        <property name="LabelProp" translatable="yes">equip all</property>
+                      </widget>
+                      <packing>
+                        <property name="TopAttach">2</property>
+                        <property name="BottomAttach">3</property>
+                        <property name="LeftAttach">1</property>
+                        <property name="RightAttach">2</property>
+                        <property name="AutoSize">False</property>
+                        <property name="YOptions">Fill</property>
+                        <property name="XExpand">True</property>
+                        <property name="XFill">True</property>
+                        <property name="XShrink">False</property>
+                        <property name="YExpand">False</property>
+                        <property name="YFill">True</property>
+                        <property name="YShrink">False</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="IBBoard.GtkSharp.Translatable.TranslatableLabel" id="lblPercent">
+                        <property name="MemberName" />
+                        <property name="LabelProp" translatable="yes">%</property>
+                      </widget>
+                      <packing>
+                        <property name="TopAttach">1</property>
+                        <property name="BottomAttach">2</property>
+                        <property name="LeftAttach">2</property>
+                        <property name="RightAttach">3</property>
+                        <property name="AutoSize">True</property>
+                        <property name="XOptions">Fill</property>
+                        <property name="YOptions">Fill</property>
+                        <property name="XExpand">False</property>
+                        <property name="XFill">True</property>
+                        <property name="XShrink">False</property>
+                        <property name="YExpand">False</property>
+                        <property name="YFill">True</property>
+                        <property name="YShrink">False</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="Gtk.SpinButton" id="numericAmount">
+                        <property name="MemberName" />
+                        <property name="CanFocus">True</property>
+                        <property name="Upper">100</property>
+                        <property name="PageIncrement">10</property>
+                        <property name="StepIncrement">1</property>
+                        <property name="ClimbRate">1</property>
+                        <property name="Numeric">True</property>
+                        <signal name="ValueChanged" handler="SpinButtonValueChanged" />
+                      </widget>
+                      <packing>
+                        <property name="LeftAttach">1</property>
+                        <property name="RightAttach">2</property>
+                        <property name="AutoSize">False</property>
+                        <property name="XOptions">0</property>
+                        <property name="YOptions">Fill</property>
+                        <property name="XExpand">False</property>
+                        <property name="XFill">False</property>
+                        <property name="XShrink">False</property>
+                        <property name="YExpand">False</property>
+                        <property name="YFill">True</property>
+                        <property name="YShrink">False</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="Gtk.SpinButton" id="percentageAmount">
+                        <property name="MemberName" />
+                        <property name="CanFocus">True</property>
+                        <property name="Upper">100</property>
+                        <property name="PageIncrement">10</property>
+                        <property name="StepIncrement">1</property>
+                        <property name="ClimbRate">1</property>
+                        <property name="Digits">1</property>
+                        <property name="Numeric">True</property>
+                        <signal name="ValueChanged" handler="SpinButtonValueChanged" />
+                      </widget>
+                      <packing>
+                        <property name="TopAttach">1</property>
+                        <property name="BottomAttach">2</property>
+                        <property name="LeftAttach">1</property>
+                        <property name="RightAttach">2</property>
+                        <property name="AutoSize">False</property>
+                        <property name="XOptions">0</property>
+                        <property name="YOptions">Fill</property>
+                        <property name="XExpand">False</property>
+                        <property name="XFill">False</property>
+                        <property name="XShrink">False</property>
+                        <property name="YExpand">False</property>
+                        <property name="YFill">True</property>
+                        <property name="YShrink">False</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="Gtk.RadioButton" id="rbEquipAll">
+                        <property name="MemberName" />
+                        <property name="CanFocus">True</property>
+                        <property name="Label" translatable="yes" />
+                        <property name="Active">True</property>
+                        <property name="DrawIndicator">True</property>
+                        <property name="HasLabel">True</property>
+                        <property name="UseUnderline">True</property>
+                        <property name="Group">group1</property>
+                      </widget>
+                      <packing>
+                        <property name="TopAttach">2</property>
+                        <property name="BottomAttach">3</property>
+                        <property name="AutoSize">True</property>
+                        <property name="XOptions">Fill</property>
+                        <property name="YOptions">Fill</property>
+                        <property name="XExpand">False</property>
+                        <property name="XFill">True</property>
+                        <property name="XShrink">False</property>
+                        <property name="YExpand">False</property>
+                        <property name="YFill">True</property>
+                        <property name="YShrink">False</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="Gtk.RadioButton" id="rbEquipNumeric">
+                        <property name="MemberName" />
+                        <property name="CanFocus">True</property>
+                        <property name="Label" translatable="yes" />
+                        <property name="DrawIndicator">True</property>
+                        <property name="HasLabel">True</property>
+                        <property name="UseUnderline">True</property>
+                        <property name="Group">group1</property>
+                        <signal name="Clicked" handler="RadioButtonClicked" />
+                      </widget>
+                      <packing>
+                        <property name="AutoSize">False</property>
+                        <property name="XOptions">Fill</property>
+                        <property name="YOptions">Fill</property>
+                        <property name="XExpand">False</property>
+                        <property name="XFill">True</property>
+                        <property name="XShrink">False</property>
+                        <property name="YExpand">False</property>
+                        <property name="YFill">True</property>
+                        <property name="YShrink">False</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="Gtk.RadioButton" id="rbEquipPercent">
+                        <property name="MemberName" />
+                        <property name="CanFocus">True</property>
+                        <property name="Label" translatable="yes" />
+                        <property name="DrawIndicator">True</property>
+                        <property name="HasLabel">True</property>
+                        <property name="UseUnderline">True</property>
+                        <property name="Group">group1</property>
+                      </widget>
+                      <packing>
+                        <property name="TopAttach">1</property>
+                        <property name="BottomAttach">2</property>
+                        <property name="AutoSize">True</property>
+                        <property name="XOptions">Fill</property>
+                        <property name="YOptions">Fill</property>
+                        <property name="XExpand">False</property>
+                        <property name="XFill">True</property>
+                        <property name="XShrink">False</property>
+                        <property name="YExpand">False</property>
+                        <property name="YFill">True</property>
+                        <property name="YShrink">False</property>
+                      </packing>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="Position">0</property>
+                    <property name="AutoSize">True</property>
+                    <property name="Expand">False</property>
+                    <property name="Fill">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <placeholder />
+                </child>
+              </widget>
+              <packing>
                 <property name="TopAttach">1</property>
                 <property name="BottomAttach">2</property>
                 <property name="LeftAttach">1</property>
@@ -796,14 +1292,426 @@
               </packing>
             </child>
             <child>
-              <widget class="Gtk.ScrolledWindow" id="GtkScrolledWindow2">
+              <widget class="IBBoard.GtkSharp.Translatable.TranslatableLabel" id="lblAmount">
+                <property name="MemberName" />
+                <property name="LabelProp" translatable="yes">amount:</property>
+              </widget>
+              <packing>
+                <property name="TopAttach">1</property>
+                <property name="BottomAttach">2</property>
+                <property name="AutoSize">True</property>
+                <property name="XOptions">Fill</property>
+                <property name="YOptions">Fill</property>
+                <property name="XExpand">False</property>
+                <property name="XFill">True</property>
+                <property name="XShrink">False</property>
+                <property name="YExpand">False</property>
+                <property name="YFill">True</property>
+                <property name="YShrink">False</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="IBBoard.GtkSharp.Translatable.TranslatableLabel" id="lblItem">
+                <property name="MemberName" />
+                <property name="LabelProp" translatable="yes">equipment</property>
+              </widget>
+              <packing>
+                <property name="AutoSize">True</property>
+                <property name="XOptions">Fill</property>
+                <property name="YOptions">Fill</property>
+                <property name="XExpand">False</property>
+                <property name="XFill">True</property>
+                <property name="XShrink">False</property>
+                <property name="YExpand">False</property>
+                <property name="YFill">True</property>
+                <property name="YShrink">False</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="Position">0</property>
+            <property name="AutoSize">True</property>
+            <property name="Expand">False</property>
+            <property name="Fill">False</property>
+          </packing>
+        </child>
+      </widget>
+    </child>
+    <child internal-child="ActionArea">
+      <widget class="Gtk.HButtonBox" id="dialog1_ActionArea">
+        <property name="MemberName" />
+        <property name="Spacing">10</property>
+        <property name="BorderWidth">5</property>
+        <property name="Size">2</property>
+        <property name="LayoutStyle">End</property>
+        <child>
+          <widget class="IBBoard.GtkSharp.Translatable.TranslatableButton" id="bttnCancel">
+            <property name="MemberName" />
+            <property name="CanDefault">True</property>
+            <property name="CanFocus">True</property>
+            <property name="UseStock">True</property>
+            <property name="Type">StockItem</property>
+            <property name="StockId">gtk-cancel</property>
+            <property name="ResponseId">-6</property>
+            <signal name="Clicked" handler="CancelButtonClicked" />
+            <property name="label">gtk-cancel</property>
+          </widget>
+          <packing>
+            <property name="Expand">False</property>
+            <property name="Fill">False</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="IBBoard.GtkSharp.Translatable.TranslatableButton" id="bttnOkay">
+            <property name="MemberName" />
+            <property name="CanDefault">True</property>
+            <property name="CanFocus">True</property>
+            <property name="UseStock">True</property>
+            <property name="Type">StockItem</property>
+            <property name="StockId">gtk-ok</property>
+            <property name="ResponseId">-5</property>
+            <signal name="Clicked" handler="OkayButtonClicked" />
+            <property name="label">gtk-ok</property>
+          </widget>
+          <packing>
+            <property name="Position">1</property>
+            <property name="Expand">False</property>
+            <property name="Fill">False</property>
+          </packing>
+        </child>
+      </widget>
+    </child>
+  </widget>
+  <widget class="Gtk.Dialog" id="IBBoard.WarFoundry.GUI.GTK.FrmEditEquipment" design-size="280 175">
+    <property name="MemberName" />
+    <property name="Title" translatable="yes">Edit equipment</property>
+    <property name="WindowPosition">CenterOnParent</property>
+    <property name="Modal">True</property>
+    <property name="SkipPagerHint">True</property>
+    <property name="SkipTaskbarHint">True</property>
+    <property name="Buttons">2</property>
+    <property name="HelpButton">False</property>
+    <child internal-child="VBox">
+      <widget class="Gtk.VBox" id="dialog1_VBox">
+        <property name="MemberName" />
+        <property name="BorderWidth">2</property>
+        <child>
+          <widget class="Gtk.Table" id="table1">
+            <property name="MemberName" />
+            <property name="NColumns">2</property>
+            <property name="RowSpacing">6</property>
+            <property name="ColumnSpacing">6</property>
+            <child>
+              <widget class="Gtk.HBox" id="hbox2">
+                <property name="MemberName" />
+                <property name="Spacing">6</property>
+                <child>
+                  <widget class="Gtk.Table" id="table2">
+                    <property name="MemberName" />
+                    <property name="NRows">3</property>
+                    <property name="NColumns">3</property>
+                    <property name="RowSpacing">6</property>
+                    <property name="ColumnSpacing">6</property>
+                    <child>
+                      <placeholder />
+                    </child>
+                    <child>
+                      <placeholder />
+                    </child>
+                    <child>
+                      <widget class="IBBoard.GtkSharp.Translatable.TranslatableLabel" id="lblEquipAll">
+                        <property name="MemberName" />
+                        <property name="LabelProp" translatable="yes">equip all</property>
+                      </widget>
+                      <packing>
+                        <property name="TopAttach">2</property>
+                        <property name="BottomAttach">3</property>
+                        <property name="LeftAttach">1</property>
+                        <property name="RightAttach">2</property>
+                        <property name="AutoSize">False</property>
+                        <property name="YOptions">Fill</property>
+                        <property name="XExpand">True</property>
+                        <property name="XFill">True</property>
+                        <property name="XShrink">False</property>
+                        <property name="YExpand">False</property>
+                        <property name="YFill">True</property>
+                        <property name="YShrink">False</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="IBBoard.GtkSharp.Translatable.TranslatableLabel" id="lblPercent">
+                        <property name="MemberName" />
+                        <property name="LabelProp" translatable="yes">%</property>
+                      </widget>
+                      <packing>
+                        <property name="TopAttach">1</property>
+                        <property name="BottomAttach">2</property>
+                        <property name="LeftAttach">2</property>
+                        <property name="RightAttach">3</property>
+                        <property name="AutoSize">True</property>
+                        <property name="XOptions">Fill</property>
+                        <property name="YOptions">Fill</property>
+                        <property name="XExpand">False</property>
+                        <property name="XFill">True</property>
+                        <property name="XShrink">False</property>
+                        <property name="YExpand">False</property>
+                        <property name="YFill">True</property>
+                        <property name="YShrink">False</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="Gtk.SpinButton" id="numericAmount">
+                        <property name="MemberName" />
+                        <property name="CanFocus">True</property>
+                        <property name="Upper">100</property>
+                        <property name="PageIncrement">10</property>
+                        <property name="StepIncrement">1</property>
+                        <property name="ClimbRate">1</property>
+                        <property name="Numeric">True</property>
+                        <signal name="ValueChanged" handler="SpinButtonValueChanged" />
+                      </widget>
+                      <packing>
+                        <property name="LeftAttach">1</property>
+                        <property name="RightAttach">2</property>
+                        <property name="AutoSize">False</property>
+                        <property name="XOptions">0</property>
+                        <property name="YOptions">Fill</property>
+                        <property name="XExpand">False</property>
+                        <property name="XFill">False</property>
+                        <property name="XShrink">False</property>
+                        <property name="YExpand">False</property>
+                        <property name="YFill">True</property>
+                        <property name="YShrink">False</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="Gtk.SpinButton" id="percentageAmount">
+                        <property name="MemberName" />
+                        <property name="CanFocus">True</property>
+                        <property name="Upper">100</property>
+                        <property name="PageIncrement">10</property>
+                        <property name="StepIncrement">1</property>
+                        <property name="ClimbRate">1</property>
+                        <property name="Digits">1</property>
+                        <property name="Numeric">True</property>
+                        <signal name="ValueChanged" handler="SpinButtonValueChanged" />
+                      </widget>
+                      <packing>
+                        <property name="TopAttach">1</property>
+                        <property name="BottomAttach">2</property>
+                        <property name="LeftAttach">1</property>
+                        <property name="RightAttach">2</property>
+                        <property name="AutoSize">False</property>
+                        <property name="XOptions">0</property>
+                        <property name="YOptions">Fill</property>
+                        <property name="XExpand">False</property>
+                        <property name="XFill">False</property>
+                        <property name="XShrink">False</property>
+                        <property name="YExpand">False</property>
+                        <property name="YFill">True</property>
+                        <property name="YShrink">False</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="Gtk.RadioButton" id="rbEquipAll">
+                        <property name="MemberName" />
+                        <property name="CanFocus">True</property>
+                        <property name="Label" translatable="yes" />
+                        <property name="DrawIndicator">True</property>
+                        <property name="HasLabel">True</property>
+                        <property name="UseUnderline">True</property>
+                        <property name="Group">group1</property>
+                        <signal name="Clicked" handler="RadioButtonClicked" />
+                      </widget>
+                      <packing>
+                        <property name="TopAttach">2</property>
+                        <property name="BottomAttach">3</property>
+                        <property name="AutoSize">True</property>
+                        <property name="XOptions">Fill</property>
+                        <property name="YOptions">Fill</property>
+                        <property name="XExpand">False</property>
+                        <property name="XFill">True</property>
+                        <property name="XShrink">False</property>
+                        <property name="YExpand">False</property>
+                        <property name="YFill">True</property>
+                        <property name="YShrink">False</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="Gtk.RadioButton" id="rbEquipNumeric">
+                        <property name="MemberName" />
+                        <property name="CanFocus">True</property>
+                        <property name="Label" translatable="yes" />
+                        <property name="DrawIndicator">True</property>
+                        <property name="HasLabel">True</property>
+                        <property name="UseUnderline">True</property>
+                        <property name="Group">group1</property>
+                        <signal name="Clicked" handler="RadioButtonClicked" />
+                      </widget>
+                      <packing>
+                        <property name="AutoSize">False</property>
+                        <property name="XOptions">Fill</property>
+                        <property name="YOptions">Fill</property>
+                        <property name="XExpand">False</property>
+                        <property name="XFill">True</property>
+                        <property name="XShrink">False</property>
+                        <property name="YExpand">False</property>
+                        <property name="YFill">True</property>
+                        <property name="YShrink">False</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="Gtk.RadioButton" id="rbEquipPercent">
+                        <property name="MemberName" />
+                        <property name="CanFocus">True</property>
+                        <property name="Label" translatable="yes" />
+                        <property name="DrawIndicator">True</property>
+                        <property name="HasLabel">True</property>
+                        <property name="UseUnderline">True</property>
+                        <property name="Group">group1</property>
+                        <signal name="Clicked" handler="RadioButtonClicked" />
+                      </widget>
+                      <packing>
+                        <property name="TopAttach">1</property>
+                        <property name="BottomAttach">2</property>
+                        <property name="AutoSize">True</property>
+                        <property name="XOptions">Fill</property>
+                        <property name="YOptions">Fill</property>
+                        <property name="XExpand">False</property>
+                        <property name="XFill">True</property>
+                        <property name="XShrink">False</property>
+                        <property name="YExpand">False</property>
+                        <property name="YFill">True</property>
+                        <property name="YShrink">False</property>
+                      </packing>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="Position">0</property>
+                    <property name="AutoSize">True</property>
+                    <property name="Expand">False</property>
+                    <property name="Fill">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <placeholder />
+                </child>
+              </widget>
+              <packing>
+                <property name="LeftAttach">1</property>
+                <property name="RightAttach">2</property>
+                <property name="AutoSize">True</property>
+                <property name="YOptions">Fill</property>
+                <property name="XExpand">True</property>
+                <property name="XFill">True</property>
+                <property name="XShrink">False</property>
+                <property name="YExpand">False</property>
+                <property name="YFill">True</property>
+                <property name="YShrink">False</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="IBBoard.GtkSharp.Translatable.TranslatableLabel" id="lblAmount">
+                <property name="MemberName" />
+                <property name="LabelProp" translatable="yes">amount:</property>
+                <property name="Justify">Right</property>
+              </widget>
+              <packing>
+                <property name="AutoSize">False</property>
+                <property name="YOptions">Fill</property>
+                <property name="XExpand">True</property>
+                <property name="XFill">True</property>
+                <property name="XShrink">False</property>
+                <property name="YExpand">False</property>
+                <property name="YFill">True</property>
+                <property name="YShrink">False</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="Position">0</property>
+            <property name="AutoSize">True</property>
+            <property name="Expand">False</property>
+            <property name="Fill">False</property>
+          </packing>
+        </child>
+      </widget>
+    </child>
+    <child internal-child="ActionArea">
+      <widget class="Gtk.HButtonBox" id="dialog1_ActionArea">
+        <property name="MemberName" />
+        <property name="Spacing">10</property>
+        <property name="BorderWidth">5</property>
+        <property name="Size">2</property>
+        <property name="LayoutStyle">End</property>
+        <child>
+          <widget class="IBBoard.GtkSharp.Translatable.TranslatableButton" id="bttnCancel">
+            <property name="MemberName" />
+            <property name="CanDefault">True</property>
+            <property name="CanFocus">True</property>
+            <property name="UseStock">True</property>
+            <property name="Type">StockItem</property>
+            <property name="StockId">gtk-cancel</property>
+            <property name="ResponseId">-6</property>
+            <signal name="Clicked" handler="CancelButtonClicked" />
+            <property name="label">gtk-cancel</property>
+          </widget>
+          <packing>
+            <property name="Expand">False</property>
+            <property name="Fill">False</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="IBBoard.GtkSharp.Translatable.TranslatableButton" id="bttnOkay">
+            <property name="MemberName" />
+            <property name="CanDefault">True</property>
+            <property name="CanFocus">True</property>
+            <property name="UseStock">True</property>
+            <property name="Type">StockItem</property>
+            <property name="StockId">gtk-ok</property>
+            <property name="ResponseId">-5</property>
+            <signal name="Clicked" handler="OkayButtonClicked" />
+            <property name="label">gtk-ok</property>
+          </widget>
+          <packing>
+            <property name="Position">1</property>
+            <property name="Expand">False</property>
+            <property name="Fill">False</property>
+          </packing>
+        </child>
+      </widget>
+    </child>
+  </widget>
+  <widget class="Gtk.Dialog" id="IBBoard.WarFoundry.GUI.GTK.FrmReplaceEquipment" design-size="400 300">
+    <property name="MemberName" />
+    <property name="Title" translatable="yes">Add equipment</property>
+    <property name="WindowPosition">CenterOnParent</property>
+    <property name="Modal">True</property>
+    <property name="SkipPagerHint">True</property>
+    <property name="SkipTaskbarHint">True</property>
+    <property name="Buttons">2</property>
+    <property name="HelpButton">False</property>
+    <child internal-child="VBox">
+      <widget class="Gtk.VBox" id="dialog1_VBox">
+        <property name="MemberName" />
+        <property name="BorderWidth">2</property>
+        <child>
+          <widget class="Gtk.Table" id="table1">
+            <property name="MemberName" />
+            <property name="NRows">2</property>
+            <property name="NColumns">2</property>
+            <property name="RowSpacing">6</property>
+            <property name="ColumnSpacing">6</property>
+            <child>
+              <widget class="Gtk.ScrolledWindow" id="GtkScrolledWindow">
                 <property name="MemberName" />
                 <property name="ShadowType">In</property>
                 <child>
-                  <widget class="Gtk.NodeView" id="requiredEquipment">
+                  <widget class="Gtk.TreeView" id="lstEquipment">
                     <property name="MemberName" />
                     <property name="CanFocus">True</property>
                     <property name="ShowScrollbars">True</property>
+                    <property name="HeadersVisible">False</property>
                   </widget>
                 </child>
               </widget>
@@ -821,9 +1729,218 @@
               </packing>
             </child>
             <child>
-              <widget class="Gtk.Label" id="optionalEquipmentLabel">
+              <widget class="Gtk.HBox" id="hbox2">
                 <property name="MemberName" />
-                <property name="LabelProp" translatable="yes">Optional Equipment:</property>
+                <property name="Spacing">6</property>
+                <child>
+                  <widget class="Gtk.Table" id="table2">
+                    <property name="MemberName" />
+                    <property name="NRows">3</property>
+                    <property name="NColumns">3</property>
+                    <property name="RowSpacing">6</property>
+                    <property name="ColumnSpacing">6</property>
+                    <child>
+                      <placeholder />
+                    </child>
+                    <child>
+                      <placeholder />
+                    </child>
+                    <child>
+                      <widget class="IBBoard.GtkSharp.Translatable.TranslatableLabel" id="lblEquipAll">
+                        <property name="MemberName" />
+                        <property name="LabelProp" translatable="yes">equip all</property>
+                      </widget>
+                      <packing>
+                        <property name="TopAttach">2</property>
+                        <property name="BottomAttach">3</property>
+                        <property name="LeftAttach">1</property>
+                        <property name="RightAttach">2</property>
+                        <property name="AutoSize">False</property>
+                        <property name="YOptions">Fill</property>
+                        <property name="XExpand">True</property>
+                        <property name="XFill">True</property>
+                        <property name="XShrink">False</property>
+                        <property name="YExpand">False</property>
+                        <property name="YFill">True</property>
+                        <property name="YShrink">False</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="IBBoard.GtkSharp.Translatable.TranslatableLabel" id="lblPercent">
+                        <property name="MemberName" />
+                        <property name="LabelProp" translatable="yes">%</property>
+                      </widget>
+                      <packing>
+                        <property name="TopAttach">1</property>
+                        <property name="BottomAttach">2</property>
+                        <property name="LeftAttach">2</property>
+                        <property name="RightAttach">3</property>
+                        <property name="AutoSize">True</property>
+                        <property name="XOptions">Fill</property>
+                        <property name="YOptions">Fill</property>
+                        <property name="XExpand">False</property>
+                        <property name="XFill">True</property>
+                        <property name="XShrink">False</property>
+                        <property name="YExpand">False</property>
+                        <property name="YFill">True</property>
+                        <property name="YShrink">False</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="Gtk.SpinButton" id="numericAmount">
+                        <property name="MemberName" />
+                        <property name="CanFocus">True</property>
+                        <property name="Upper">100</property>
+                        <property name="PageIncrement">10</property>
+                        <property name="StepIncrement">1</property>
+                        <property name="ClimbRate">1</property>
+                        <property name="Numeric">True</property>
+                        <signal name="ValueChanged" handler="SpinButtonValueChanged" />
+                      </widget>
+                      <packing>
+                        <property name="LeftAttach">1</property>
+                        <property name="RightAttach">2</property>
+                        <property name="AutoSize">False</property>
+                        <property name="XOptions">0</property>
+                        <property name="YOptions">Fill</property>
+                        <property name="XExpand">False</property>
+                        <property name="XFill">False</property>
+                        <property name="XShrink">False</property>
+                        <property name="YExpand">False</property>
+                        <property name="YFill">True</property>
+                        <property name="YShrink">False</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="Gtk.SpinButton" id="percentageAmount">
+                        <property name="MemberName" />
+                        <property name="CanFocus">True</property>
+                        <property name="Upper">100</property>
+                        <property name="PageIncrement">10</property>
+                        <property name="StepIncrement">1</property>
+                        <property name="ClimbRate">1</property>
+                        <property name="Digits">1</property>
+                        <property name="Numeric">True</property>
+                        <signal name="ValueChanged" handler="SpinButtonValueChanged" />
+                      </widget>
+                      <packing>
+                        <property name="TopAttach">1</property>
+                        <property name="BottomAttach">2</property>
+                        <property name="LeftAttach">1</property>
+                        <property name="RightAttach">2</property>
+                        <property name="AutoSize">False</property>
+                        <property name="XOptions">0</property>
+                        <property name="YOptions">Fill</property>
+                        <property name="XExpand">False</property>
+                        <property name="XFill">False</property>
+                        <property name="XShrink">False</property>
+                        <property name="YExpand">False</property>
+                        <property name="YFill">True</property>
+                        <property name="YShrink">False</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="Gtk.RadioButton" id="rbEquipAll">
+                        <property name="MemberName" />
+                        <property name="CanFocus">True</property>
+                        <property name="Label" translatable="yes" />
+                        <property name="DrawIndicator">True</property>
+                        <property name="HasLabel">True</property>
+                        <property name="UseUnderline">True</property>
+                        <property name="Group">group1</property>
+                      </widget>
+                      <packing>
+                        <property name="TopAttach">2</property>
+                        <property name="BottomAttach">3</property>
+                        <property name="AutoSize">True</property>
+                        <property name="XOptions">Fill</property>
+                        <property name="YOptions">Fill</property>
+                        <property name="XExpand">False</property>
+                        <property name="XFill">True</property>
+                        <property name="XShrink">False</property>
+                        <property name="YExpand">False</property>
+                        <property name="YFill">True</property>
+                        <property name="YShrink">False</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="Gtk.RadioButton" id="rbEquipNumeric">
+                        <property name="MemberName" />
+                        <property name="CanFocus">True</property>
+                        <property name="Label" translatable="yes" />
+                        <property name="DrawIndicator">True</property>
+                        <property name="HasLabel">True</property>
+                        <property name="UseUnderline">True</property>
+                        <property name="Group">group1</property>
+                        <signal name="Clicked" handler="RadioButtonClicked" />
+                      </widget>
+                      <packing>
+                        <property name="AutoSize">False</property>
+                        <property name="XOptions">Fill</property>
+                        <property name="YOptions">Fill</property>
+                        <property name="XExpand">False</property>
+                        <property name="XFill">True</property>
+                        <property name="XShrink">False</property>
+                        <property name="YExpand">False</property>
+                        <property name="YFill">True</property>
+                        <property name="YShrink">False</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="Gtk.RadioButton" id="rbEquipPercent">
+                        <property name="MemberName" />
+                        <property name="CanFocus">True</property>
+                        <property name="Label" translatable="yes" />
+                        <property name="DrawIndicator">True</property>
+                        <property name="HasLabel">True</property>
+                        <property name="UseUnderline">True</property>
+                        <property name="Group">group1</property>
+                      </widget>
+                      <packing>
+                        <property name="TopAttach">1</property>
+                        <property name="BottomAttach">2</property>
+                        <property name="AutoSize">True</property>
+                        <property name="XOptions">Fill</property>
+                        <property name="YOptions">Fill</property>
+                        <property name="XExpand">False</property>
+                        <property name="XFill">True</property>
+                        <property name="XShrink">False</property>
+                        <property name="YExpand">False</property>
+                        <property name="YFill">True</property>
+                        <property name="YShrink">False</property>
+                      </packing>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="Position">0</property>
+                    <property name="AutoSize">True</property>
+                    <property name="Expand">False</property>
+                    <property name="Fill">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <placeholder />
+                </child>
+              </widget>
+              <packing>
+                <property name="TopAttach">1</property>
+                <property name="BottomAttach">2</property>
+                <property name="LeftAttach">1</property>
+                <property name="RightAttach">2</property>
+                <property name="AutoSize">True</property>
+                <property name="YOptions">Fill</property>
+                <property name="XExpand">True</property>
+                <property name="XFill">True</property>
+                <property name="XShrink">False</property>
+                <property name="YExpand">False</property>
+                <property name="YFill">True</property>
+                <property name="YShrink">False</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="IBBoard.GtkSharp.Translatable.TranslatableLabel" id="lblAmount">
+                <property name="MemberName" />
+                <property name="LabelProp" translatable="yes">amount:</property>
               </widget>
               <packing>
                 <property name="TopAttach">1</property>
@@ -840,9 +1957,309 @@
               </packing>
             </child>
             <child>
-              <widget class="Gtk.Label" id="requiredEquipmentLabel">
+              <widget class="IBBoard.GtkSharp.Translatable.TranslatableLabel" id="lblItem">
                 <property name="MemberName" />
-                <property name="LabelProp" translatable="yes">Required Equipment:</property>
+                <property name="LabelProp" translatable="yes">equipment</property>
+              </widget>
+              <packing>
+                <property name="AutoSize">True</property>
+                <property name="XOptions">Fill</property>
+                <property name="YOptions">Fill</property>
+                <property name="XExpand">False</property>
+                <property name="XFill">True</property>
+                <property name="XShrink">False</property>
+                <property name="YExpand">False</property>
+                <property name="YFill">True</property>
+                <property name="YShrink">False</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="Position">0</property>
+            <property name="AutoSize">True</property>
+            <property name="Expand">False</property>
+            <property name="Fill">False</property>
+          </packing>
+        </child>
+      </widget>
+    </child>
+    <child internal-child="ActionArea">
+      <widget class="Gtk.HButtonBox" id="dialog1_ActionArea">
+        <property name="MemberName" />
+        <property name="Spacing">10</property>
+        <property name="BorderWidth">5</property>
+        <property name="Size">2</property>
+        <property name="LayoutStyle">End</property>
+        <child>
+          <widget class="IBBoard.GtkSharp.Translatable.TranslatableButton" id="bttnCancel">
+            <property name="MemberName" />
+            <property name="CanDefault">True</property>
+            <property name="CanFocus">True</property>
+            <property name="UseStock">True</property>
+            <property name="Type">StockItem</property>
+            <property name="StockId">gtk-cancel</property>
+            <property name="ResponseId">-6</property>
+            <signal name="Clicked" handler="CancelButtonClicked" />
+            <property name="label">gtk-cancel</property>
+          </widget>
+          <packing>
+            <property name="Expand">False</property>
+            <property name="Fill">False</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="IBBoard.GtkSharp.Translatable.TranslatableButton" id="bttnOkay">
+            <property name="MemberName" />
+            <property name="CanDefault">True</property>
+            <property name="CanFocus">True</property>
+            <property name="UseStock">True</property>
+            <property name="Type">StockItem</property>
+            <property name="StockId">gtk-ok</property>
+            <property name="ResponseId">-5</property>
+            <signal name="Clicked" handler="OkayButtonClicked" />
+            <property name="label">gtk-ok</property>
+          </widget>
+          <packing>
+            <property name="Position">1</property>
+            <property name="Expand">False</property>
+            <property name="Fill">False</property>
+          </packing>
+        </child>
+      </widget>
+    </child>
+  </widget>
+  <widget class="Gtk.Dialog" id="IBBoard.WarFoundry.GUI.GTK.FrmAbout" design-size="330 300">
+    <property name="MemberName" />
+    <property name="Title" translatable="yes">About WF</property>
+    <property name="Icon">resource:App.ico</property>
+    <property name="TypeHint">Dialog</property>
+    <property name="WindowPosition">CenterOnParent</property>
+    <property name="Resizable">False</property>
+    <property name="AllowGrow">False</property>
+    <property name="SkipPagerHint">True</property>
+    <property name="SkipTaskbarHint">True</property>
+    <property name="Buttons">2</property>
+    <property name="HelpButton">False</property>
+    <child internal-child="VBox">
+      <widget class="Gtk.VBox" id="dialog1_VBox">
+        <property name="MemberName" />
+        <property name="BorderWidth">2</property>
+        <child>
+          <widget class="Gtk.Image" id="logoImage">
+            <property name="MemberName" />
+            <property name="Pixbuf">resource:IBBoard.WarFoundry.GUI.GTK.App-lrg.png</property>
+          </widget>
+          <packing>
+            <property name="Position">0</property>
+            <property name="AutoSize">True</property>
+            <property name="Expand">False</property>
+            <property name="Fill">False</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="Gtk.Label" id="label1">
+            <property name="MemberName" />
+            <property name="LabelProp" translatable="yes">&lt;span font_size="x-large" weight="bold"&gt;WarFoundry v0.1 RC 1&lt;/span&gt;</property>
+            <property name="UseMarkup">True</property>
+          </widget>
+          <packing>
+            <property name="Position">1</property>
+            <property name="AutoSize">True</property>
+            <property name="Expand">False</property>
+            <property name="Fill">False</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="IBBoard.GtkSharp.Translatable.TranslatableLabel" id="lblWarFoundryDesc">
+            <property name="MemberName" />
+            <property name="LabelProp" translatable="yes">WarFoundry is an open-source army creation tool that lets you create rosters for multiple game systems.</property>
+            <property name="Wrap">True</property>
+            <property name="Justify">Center</property>
+          </widget>
+          <packing>
+            <property name="Position">2</property>
+            <property name="AutoSize">True</property>
+            <property name="Expand">False</property>
+            <property name="Fill">False</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="IBBoard.GtkSharp.Translatable.TranslatableLabel" id="lblWarFoundryCopyright">
+            <property name="MemberName" />
+            <property name="LabelProp" translatable="yes">© 2007-2010, IBBoard and others</property>
+          </widget>
+          <packing>
+            <property name="Position">3</property>
+            <property name="AutoSize">True</property>
+            <property name="Expand">False</property>
+            <property name="Fill">False</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="Gtk.Label" id="lblWarFoundryLink">
+            <property name="MemberName" />
+            <property name="LabelProp" translatable="yes">&lt;a href="http://warfoundry.co.uk"&gt;http://warfoundry.co.uk&lt;/a&gt;</property>
+            <property name="UseMarkup">True</property>
+          </widget>
+          <packing>
+            <property name="Position">4</property>
+            <property name="AutoSize">True</property>
+            <property name="Expand">False</property>
+            <property name="Fill">False</property>
+          </packing>
+        </child>
+      </widget>
+    </child>
+    <child internal-child="ActionArea">
+      <widget class="Gtk.HButtonBox" id="dialog1_ActionArea">
+        <property name="MemberName" />
+        <property name="Spacing">10</property>
+        <property name="BorderWidth">5</property>
+        <property name="Size">2</property>
+        <property name="LayoutStyle">End</property>
+        <child>
+          <widget class="IBBoard.GtkSharp.Translatable.TranslatableButton" id="bttnCredits">
+            <property name="MemberName" />
+            <property name="CanFocus">True</property>
+            <property name="UseStock">True</property>
+            <property name="Type">StockItem</property>
+            <property name="StockId">gtk-about</property>
+            <property name="ResponseId">-1</property>
+            <signal name="Clicked" handler="BttnCreditsClicked" />
+            <property name="label">gtk-about</property>
+          </widget>
+          <packing>
+            <property name="Expand">False</property>
+            <property name="Fill">False</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="IBBoard.GtkSharp.Translatable.TranslatableButton" id="bttnClose">
+            <property name="MemberName" />
+            <property name="CanDefault">True</property>
+            <property name="HasDefault">True</property>
+            <property name="CanFocus">True</property>
+            <property name="UseStock">True</property>
+            <property name="Type">StockItem</property>
+            <property name="StockId">gtk-close</property>
+            <property name="ResponseId">-7</property>
+            <property name="label">gtk-close</property>
+          </widget>
+          <packing>
+            <property name="Position">1</property>
+            <property name="Expand">False</property>
+            <property name="Fill">False</property>
+          </packing>
+        </child>
+      </widget>
+    </child>
+  </widget>
+  <widget class="Gtk.Dialog" id="IBBoard.WarFoundry.GUI.GTK.FrmAboutCredits" design-size="376 250">
+    <property name="MemberName" />
+    <property name="Icon">resource:App.ico</property>
+    <property name="TypeHint">Dialog</property>
+    <property name="WindowPosition">CenterOnParent</property>
+    <property name="SkipPagerHint">True</property>
+    <property name="SkipTaskbarHint">True</property>
+    <property name="Buttons">1</property>
+    <property name="HelpButton">False</property>
+    <child internal-child="VBox">
+      <widget class="Gtk.VBox" id="dialog1_VBox">
+        <property name="MemberName" />
+        <property name="BorderWidth">2</property>
+        <child>
+          <widget class="Gtk.Table" id="table1">
+            <property name="MemberName" />
+            <property name="NRows">3</property>
+            <property name="NColumns">2</property>
+            <property name="RowSpacing">6</property>
+            <property name="ColumnSpacing">6</property>
+            <child>
+              <widget class="Gtk.Label" id="label1">
+                <property name="MemberName" />
+                <property name="Xpad">3</property>
+                <property name="Ypad">3</property>
+                <property name="Xalign">0</property>
+                <property name="Yalign">0</property>
+                <property name="LabelProp">IBBoard (Main developer and project lead)</property>
+              </widget>
+              <packing>
+                <property name="LeftAttach">1</property>
+                <property name="RightAttach">2</property>
+                <property name="AutoSize">True</property>
+                <property name="XOptions">Fill</property>
+                <property name="YOptions">Fill</property>
+                <property name="XExpand">False</property>
+                <property name="XFill">True</property>
+                <property name="XShrink">False</property>
+                <property name="YExpand">False</property>
+                <property name="YFill">True</property>
+                <property name="YShrink">False</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="Gtk.Label" id="label2">
+                <property name="MemberName" />
+                <property name="Xpad">3</property>
+                <property name="Ypad">3</property>
+                <property name="Xalign">0</property>
+                <property name="Yalign">0</property>
+                <property name="LabelProp" translatable="yes">HeWhoWatches</property>
+              </widget>
+              <packing>
+                <property name="TopAttach">1</property>
+                <property name="BottomAttach">2</property>
+                <property name="LeftAttach">1</property>
+                <property name="RightAttach">2</property>
+                <property name="AutoSize">False</property>
+                <property name="YOptions">Fill</property>
+                <property name="XExpand">True</property>
+                <property name="XFill">True</property>
+                <property name="XShrink">False</property>
+                <property name="YExpand">False</property>
+                <property name="YFill">True</property>
+                <property name="YShrink">False</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="Gtk.Label" id="label3">
+                <property name="MemberName" />
+                <property name="Xpad">3</property>
+                <property name="Ypad">3</property>
+                <property name="Xalign">0</property>
+                <property name="Yalign">0</property>
+                <property name="LabelProp" translatable="yes">Snowblizz,
+Frostlee,
+Lord_Archaon,
+Furrie,
+clutch110,
+Mollo,
+HeWhoWatches</property>
+              </widget>
+              <packing>
+                <property name="TopAttach">2</property>
+                <property name="BottomAttach">3</property>
+                <property name="LeftAttach">1</property>
+                <property name="RightAttach">2</property>
+                <property name="AutoSize">True</property>
+                <property name="XOptions">Fill</property>
+                <property name="YOptions">Fill</property>
+                <property name="XExpand">False</property>
+                <property name="XFill">True</property>
+                <property name="XShrink">False</property>
+                <property name="YExpand">False</property>
+                <property name="YFill">True</property>
+                <property name="YShrink">False</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="IBBoard.GtkSharp.Translatable.TranslatableLabel" id="lblDevelopers">
+                <property name="MemberName" />
+                <property name="Xpad">3</property>
+                <property name="Ypad">3</property>
+                <property name="Xalign">0</property>
+                <property name="Yalign">0</property>
+                <property name="LabelProp" translatable="yes">developers:</property>
               </widget>
               <packing>
                 <property name="AutoSize">True</property>
@@ -857,46 +2274,17 @@
               </packing>
             </child>
             <child>
-              <widget class="Gtk.VBox" id="vbox2">
+              <widget class="IBBoard.GtkSharp.Translatable.TranslatableLabel" id="lblTestersCommon">
                 <property name="MemberName" />
-                <property name="Spacing">6</property>
-                <child>
-                  <widget class="Gtk.Button" id="bttnReplaceRequired">
-                    <property name="MemberName" />
-                    <property name="CanFocus">True</property>
-                    <property name="Type">TextOnly</property>
-                    <property name="Label" translatable="yes">Replace</property>
-                    <property name="UseUnderline">True</property>
-                  </widget>
-                  <packing>
-                    <property name="Position">0</property>
-                    <property name="AutoSize">True</property>
-                    <property name="Expand">False</property>
-                    <property name="Fill">False</property>
-                  </packing>
-                </child>
-                <child>
-                  <widget class="Gtk.Button" id="bttnEditRequired">
-                    <property name="MemberName" />
-                    <property name="CanFocus">True</property>
-                    <property name="Type">TextOnly</property>
-                    <property name="Label" translatable="yes">Edit</property>
-                    <property name="UseUnderline">True</property>
-                  </widget>
-                  <packing>
-                    <property name="Position">1</property>
-                    <property name="AutoSize">True</property>
-                    <property name="Expand">False</property>
-                    <property name="Fill">False</property>
-                  </packing>
-                </child>
-                <child>
-                  <placeholder />
-                </child>
+                <property name="Xpad">3</property>
+                <property name="Ypad">3</property>
+                <property name="Xalign">0</property>
+                <property name="Yalign">0</property>
+                <property name="LabelProp" translatable="yes">testers (common):</property>
               </widget>
               <packing>
-                <property name="LeftAttach">2</property>
-                <property name="RightAttach">3</property>
+                <property name="TopAttach">2</property>
+                <property name="BottomAttach">3</property>
                 <property name="AutoSize">True</property>
                 <property name="XOptions">Fill</property>
                 <property name="YOptions">Fill</property>
@@ -909,60 +2297,17 @@
               </packing>
             </child>
             <child>
-              <widget class="Gtk.VBox" id="vbox3">
+              <widget class="IBBoard.GtkSharp.Translatable.TranslatableLabel" id="lblTestersGtk">
                 <property name="MemberName" />
-                <property name="Spacing">6</property>
-                <child>
-                  <widget class="Gtk.Button" id="bttnAddOptional">
-                    <property name="MemberName" />
-                    <property name="CanFocus">True</property>
-                    <property name="Type">TextOnly</property>
-                    <property name="Label" translatable="yes">Add</property>
-                    <property name="UseUnderline">True</property>
-                  </widget>
-                  <packing>
-                    <property name="Position">0</property>
-                    <property name="AutoSize">True</property>
-                    <property name="Expand">False</property>
-                    <property name="Fill">False</property>
-                  </packing>
-                </child>
-                <child>
-                  <widget class="Gtk.Button" id="bttnEditOptional">
-                    <property name="MemberName" />
-                    <property name="CanFocus">True</property>
-                    <property name="Type">TextOnly</property>
-                    <property name="Label" translatable="yes">Edit</property>
-                    <property name="UseUnderline">True</property>
-                  </widget>
-                  <packing>
-                    <property name="Position">1</property>
-                    <property name="AutoSize">True</property>
-                    <property name="Expand">False</property>
-                    <property name="Fill">False</property>
-                  </packing>
-                </child>
-                <child>
-                  <widget class="Gtk.Button" id="bttnRemove">
-                    <property name="MemberName" />
-                    <property name="CanFocus">True</property>
-                    <property name="Type">TextOnly</property>
-                    <property name="Label" translatable="yes">Remove</property>
-                    <property name="UseUnderline">True</property>
-                  </widget>
-                  <packing>
-                    <property name="Position">2</property>
-                    <property name="AutoSize">True</property>
-                    <property name="Expand">False</property>
-                    <property name="Fill">False</property>
-                  </packing>
-                </child>
+                <property name="Xpad">3</property>
+                <property name="Ypad">3</property>
+                <property name="Xalign">0</property>
+                <property name="Yalign">0</property>
+                <property name="LabelProp" translatable="yes">testers (GTK UI):</property>
               </widget>
               <packing>
                 <property name="TopAttach">1</property>
                 <property name="BottomAttach">2</property>
-                <property name="LeftAttach">2</property>
-                <property name="RightAttach">3</property>
                 <property name="AutoSize">True</property>
                 <property name="XOptions">Fill</property>
                 <property name="YOptions">Fill</property>
@@ -976,29 +2321,206 @@
             </child>
           </widget>
           <packing>
-            <property name="Position">3</property>
+            <property name="Position">0</property>
             <property name="AutoSize">True</property>
             <property name="Expand">False</property>
             <property name="Fill">False</property>
           </packing>
         </child>
+      </widget>
+    </child>
+    <child internal-child="ActionArea">
+      <widget class="Gtk.HButtonBox" id="dialog1_ActionArea">
+        <property name="MemberName" />
+        <property name="Spacing">10</property>
+        <property name="BorderWidth">5</property>
+        <property name="Size">1</property>
+        <property name="LayoutStyle">End</property>
+        <child>
+          <widget class="IBBoard.GtkSharp.Translatable.TranslatableButton" id="bttnClose">
+            <property name="MemberName" />
+            <property name="CanDefault">True</property>
+            <property name="CanFocus">True</property>
+            <property name="UseStock">True</property>
+            <property name="Type">StockItem</property>
+            <property name="StockId">gtk-close</property>
+            <property name="ResponseId">-7</property>
+            <property name="label">gtk-close</property>
+          </widget>
+          <packing>
+            <property name="Expand">False</property>
+            <property name="Fill">False</property>
+          </packing>
+        </child>
+      </widget>
+    </child>
+  </widget>
+  <widget class="Gtk.Dialog" id="IBBoard.WarFoundry.GUI.GTK.FrmPreferences" design-size="400 300">
+    <property name="MemberName" />
+    <property name="TypeHint">Dialog</property>
+    <property name="WindowPosition">CenterOnParent</property>
+    <property name="SkipPagerHint">True</property>
+    <property name="SkipTaskbarHint">True</property>
+    <property name="Buttons">2</property>
+    <property name="HelpButton">False</property>
+    <child internal-child="VBox">
+      <widget class="Gtk.VBox" id="dialog1_VBox">
+        <property name="MemberName" />
+        <property name="BorderWidth">2</property>
+        <child>
+          <widget class="Gtk.HPaned" id="hpaned1">
+            <property name="MemberName" />
+            <property name="CanFocus">True</property>
+            <property name="Position">164</property>
+            <child>
+              <widget class="Gtk.ScrolledWindow" id="GtkScrolledWindow">
+                <property name="MemberName" />
+                <property name="ShadowType">In</property>
+                <child>
+                  <widget class="Gtk.TreeView" id="preferencesTree">
+                    <property name="MemberName" />
+                    <property name="CanFocus">True</property>
+                    <property name="ShowScrollbars">True</property>
+                    <property name="HeadersVisible">False</property>
+                  </widget>
+                </child>
+              </widget>
+              <packing>
+                <property name="Resize">False</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="Gtk.Frame" id="prefsFrame">
+                <property name="MemberName" />
+                <property name="ShadowType">In</property>
+                <property name="BorderWidth">2</property>
+                <child>
+                  <widget class="Gtk.Alignment" id="GtkAlignment2">
+                    <property name="MemberName" />
+                    <property name="Xalign">0</property>
+                    <property name="Yalign">0</property>
+                    <property name="LeftPadding">12</property>
+                    <child>
+                      <widget class="Gtk.Table" id="table1">
+                        <property name="MemberName" />
+                        <property name="NRows">3</property>
+                        <property name="NColumns">2</property>
+                        <property name="RowSpacing">6</property>
+                        <property name="ColumnSpacing">6</property>
+                        <child>
+                          <placeholder />
+                        </child>
+                        <child>
+                          <placeholder />
+                        </child>
+                        <child>
+                          <placeholder />
+                        </child>
+                        <child>
+                          <placeholder />
+                        </child>
+                        <child>
+                          <widget class="Gtk.ComboBox" id="languageList">
+                            <property name="MemberName" />
+                            <property name="IsTextCombo">True</property>
+                            <property name="Items" translatable="yes" />
+                            <signal name="Changed" handler="languageListChanged" />
+                          </widget>
+                          <packing>
+                            <property name="LeftAttach">1</property>
+                            <property name="RightAttach">2</property>
+                            <property name="AutoSize">True</property>
+                            <property name="XOptions">Fill</property>
+                            <property name="YOptions">Fill</property>
+                            <property name="XExpand">False</property>
+                            <property name="XFill">True</property>
+                            <property name="XShrink">False</property>
+                            <property name="YExpand">False</property>
+                            <property name="YFill">True</property>
+                            <property name="YShrink">False</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <widget class="IBBoard.GtkSharp.Translatable.TranslatableLabel" id="lblLanguage">
+                            <property name="MemberName" />
+                            <property name="LabelProp" translatable="yes">language:</property>
+                          </widget>
+                          <packing>
+                            <property name="AutoSize">True</property>
+                            <property name="XOptions">Fill</property>
+                            <property name="YOptions">Fill</property>
+                            <property name="XExpand">False</property>
+                            <property name="XFill">True</property>
+                            <property name="XShrink">False</property>
+                            <property name="YExpand">False</property>
+                            <property name="YFill">True</property>
+                            <property name="YShrink">False</property>
+                          </packing>
+                        </child>
+                      </widget>
+                    </child>
+                  </widget>
+                </child>
+                <child>
+                  <widget class="Gtk.Label" id="frameLabel">
+                    <property name="MemberName" />
+                    <property name="LabelProp" translatable="yes">&lt;b&gt;language&lt;/b&gt;</property>
+                    <property name="UseMarkup">True</property>
+                  </widget>
+                  <packing>
+                    <property name="type">label_item</property>
+                  </packing>
+                </child>
+              </widget>
+            </child>
+          </widget>
+          <packing>
+            <property name="Position">0</property>
+            <property name="AutoSize">True</property>
+          </packing>
+        </child>
+      </widget>
+    </child>
+    <child internal-child="ActionArea">
+      <widget class="Gtk.HButtonBox" id="dialog1_ActionArea">
+        <property name="MemberName" />
+        <property name="Spacing">10</property>
+        <property name="BorderWidth">5</property>
+        <property name="Size">2</property>
+        <property name="LayoutStyle">End</property>
+        <child>
+          <widget class="IBBoard.GtkSharp.Translatable.TranslatableButton" id="bttnCancel">
+            <property name="MemberName" />
+            <property name="CanDefault">True</property>
+            <property name="CanFocus">True</property>
+            <property name="UseStock">True</property>
+            <property name="Type">StockItem</property>
+            <property name="StockId">gtk-cancel</property>
+            <property name="ResponseId">-6</property>
+            <signal name="Clicked" handler="bttnCancelClicked" />
+            <property name="label">gtk-cancel</property>
+          </widget>
+          <packing>
+            <property name="Expand">False</property>
+            <property name="Fill">False</property>
+          </packing>
+        </child>
         <child>
-          <widget class="Gtk.HBox" id="hbox2">
+          <widget class="IBBoard.GtkSharp.Translatable.TranslatableButton" id="bttnOkay">
             <property name="MemberName" />
-            <property name="Spacing">6</property>
-            <child>
-              <placeholder />
-            </child>
-            <child>
-              <placeholder />
-            </child>
-            <child>
-              <placeholder />
-            </child>
+            <property name="CanDefault">True</property>
+            <property name="CanFocus">True</property>
+            <property name="UseStock">True</property>
+            <property name="Type">StockItem</property>
+            <property name="StockId">gtk-ok</property>
+            <property name="ResponseId">-5</property>
+            <signal name="Clicked" handler="bttnOkayClicked" />
+            <property name="label">gtk-ok</property>
           </widget>
           <packing>
-            <property name="Position">4</property>
-            <property name="AutoSize">True</property>
+            <property name="Position">1</property>
+            <property name="Expand">False</property>
+            <property name="Fill">False</property>
           </packing>
         </child>
       </widget>
--- a/gtk-gui/objects.xml	Sun Jan 31 20:46:06 2010 +0000
+++ b/gtk-gui/objects.xml	Mon Jan 17 19:43:47 2011 +0000
@@ -1,5 +1,5 @@
 <objects attr-sync="on">
-  <object type="IBBoard.WarFoundry.GTK.Widgets.UnitDisplayWidget" palette-category="WarFoundry GTK# GUI" allow-children="false" base-type="Gtk.Bin">
+  <object type="IBBoard.WarFoundry.GUI.GTK.Widgets.UnitDisplayWidget" palette-category="WarFoundry GTK# GUI" allow-children="false" base-type="Gtk.Bin">
     <itemgroups />
     <signals />
   </object>
--- a/translations/en.translation	Sun Jan 31 20:46:06 2010 +0000
+++ b/translations/en.translation	Mon Jan 17 19:43:47 2011 +0000
@@ -1,40 +1,142 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<translations xmlns="http://ibboard.co.uk/translation"
-xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-lang="en">
-<translation id="menuFile">File</translation>
-<translation id="menuEdit">Edit</translation>
-<translation id="menuHelp">Help</translation>
-<translation id="miNewArmy">Create army</translation>
-<translation id="miOpenArmy">Open army</translation>
-<translation id="miExit">Exit</translation>
-<translation id="miAbout">About</translation>
-<translation id="miSaveArmy">Save army</translation>
-<translation id="miSaveArmyAs">Save army as...</translation>
-<translation id="miCloseArmy">Close army</translation>
-<translation id="miChangeSystem">Change game system</translation>
-<translation id="miUndo">Undo</translation>
-<translation id="miRedo">Redo</translation>
+<?xml version="1.0" encoding="utf-8"?>
+<translations xmlns="http://ibboard.co.uk/translation" lang="en">
+<!-- Common -->
+<translation id="bttnCancel">Cancel</translation>
+<translation id="bttnOkay">OK</translation>
+<translation id="bttnClose">Close</translation>
+<translation id="bttnCreate">Create</translation>
+<!-- Main Window -->
+<translation id="statusPanelPoints">{0} pts / {1} pts</translation>
+<!-- Main Window / Menus -->
+<translation id="menuFile">_File</translation>
+<translation id="menuEdit">_Edit</translation>
+<translation id="menuHelp">_Help</translation>
+<!-- Main Window / Menus / File Menu -->
+<translation id="miNewArmy">Create _new army</translation>
+<translation id="miOpenArmy">_Open army</translation>
+<translation id="miSaveArmy">_Save army</translation>
+<translation id="miSaveArmyAs">Save _army as...</translation>
+<translation id="miExportArmyAs">_Export army as...</translation>
+<translation id="miExportArmyAsBasicHTML">Basic HTML</translation>
+<translation id="miCloseArmy">_Close army</translation>
+<translation id="miReloadFiles">_Reload files</translation>
+<translation id="miExit">_Quit</translation>
+<!-- Main Window / Menus / Edit Menu -->
+<translation id="miUndo">_Undo</translation>
+<translation id="miRedo">_Redo</translation>
+<translation id="miPreferences">_Preferences</translation>
+<!-- Main Window / Menus / Help Menu -->
+<translation id="miAbout">_About</translation>
+<!-- Main Window / Toolbar buttons -->
+<translation id="bttnNewArmy">Create new army</translation>
+<translation id="bttnOpenArmy">Open army</translation>
+<translation id="bttnSaveArmy">Save army</translation>
+<translation id="bttnUndo">Undo</translation>
+<translation id="bttnRedo">Redo</translation>
+<translation id="bttnCreateFromCat">Add unit from {0}</translation>
+<!-- Main Window / Army Tree -->
+<translation id="armyCategoryColumnTitle">Army Categories</translation>
+<translation id="menuRemoveUnit">Remove Unit</translation>
+<!-- Main Window / Dialogs -->
 <translation id="armyFileFilter">WarFoundry Army Files (*.army)</translation>
-<translation id="bttnSelectRace">Create army</translation>
-<translation id="bttnCancel">Cancel</translation>
-<translation id="bttnSelectUnit">Create unit</translation>
-<translation id="lblUnitList">Unit types:</translation>
+<!-- Main Window / Dialogs / Open -->
+<translation id="openArmyDialog">Open army</translation>
+<translation id="bttnOpen">Open</translation>
+<translation id="OpenFailed">WarFoundry could not open the specified file. Please check the log for more information.</translation>
+<translation id="OpenFailedTitle">File load failed</translation>
+<!-- Main Window / Dialogs / Save -->
+<translation id="saveArmyDialog">Save army</translation>
+<translation id="bttnSave">Save</translation>
+<translation id="SaveFailed">WarFoundry was unable to save the file. Please check the log for more details</translation>
+<translation id="SaveFailedTitle">File save failed</translation>
+<!-- Main Window / Dialogs / Save changes -->
+<translation id="SaveChangesQuestion">The army "{0}" has been modified.
+Save changes before closing army?</translation>
+<translation id="SaveChangesTitle">Unsaved changes</translation>
+<translation id="bttnDiscard">Close without saving</translation>
+<!-- UnitDisplayForm -->
+<translation id="bttnAddWeapon">Add</translation>
+<translation id="bttnEditWeapon">Edit</translation>
+<translation id="bttnRemoveWeapon">Remove</translation>
+<translation id="bttnReplaceWeapon">Replace</translation>
+<translation id="lblEquip">Equipment:</translation>
+<translation id="lblAbilities">Abilities:</translation>
+<translation id="lblNotes">Notes:</translation>
+<!-- New Army form -->
+<translation id="IBBoard.WarFoundry.GUI.GTK.FrmNewArmy">Create Army</translation>
+<translation id="lblGameSystem">Game systems:</translation>
 <translation id="lblRaceList">Races:</translation>
 <translation id="lblArmyName">Army name:</translation>
-<translation id="bttnSelectSystem">Select system</translation>
-<translation id="lblSystemList">Game systems:</translation>
-<translation id="FrmSelectSystem">Game system selection</translation>
-<translation id="ArmyTree">Army tree</translation>
-<translation id="FrmNewArmy">Create new army</translation>
-<translation id="saveArmyDialog">Save army</translation>
 <translation id="lblArmySize">Army size:</translation>
+<translation id="frmNewArmyRaceColumn">Race</translation>
+<!-- New Unit form -->
+<translation id="IBBoard.WarFoundry.GUI.GTK.FrmNewUnit">Add New {0} Choice</translation>
+<translation id="frmNewUnitNewUnitColumn">Unit Type</translation>
+<translation id="lblUnitList">Unit Type:</translation>
+<!-- Equipment Dialogs (Common) -->
+<translation id="equipPercentageTooLarge">The current percentage ({0}%) was larger than the maximum for the equipment item ({1}%). The maximum value will be used instead.</translation>
+<translation id="equipPercentageTooLargeTitle">Equipment percentage too large</translation>
+<translation id="equipPercentageTooSmall">The current percentage ({0}%) was smaller than the minimum for the equipment item ({1}%). The minimum value will be used instead.</translation>
+<translation id="equipPercentageTooSmallTitle">Equipment percentage too small</translation>
+<translation id="equipNumberTooLarge">The current amount ({0}) was larger than the maximum for the equipment item ({1}). The maximum value will be used instead.</translation>
+<translation id="equipNumberTooLargeTitle">Equipment amount too large</translation>
+<translation id="equipNumberTooSmall">The current amount ({0}) was smaller than the minimum for the equipment item ({1}). The minimum value will be used instead.</translation>
+<translation id="equipNumberTooSmallTitle">Equipment amount too small</translation>
+<translation id="lblEquipAll">Equip All</translation>
+<translation id="lblPercent">%</translation>
+<translation id="lblAmount">Amount:</translation>
+<translation id="lblItem">Equipment:</translation>
+<!-- Equipment Dialogs / Add -->
+<translation id="IBBoard.WarFoundry.GUI.GTK.FrmAddEquipment">Add Equipment</translation>
+<translation id="frmAddEquipmentColumnTitle">Equipment</translation>
+<!-- Equipment Dialogs / Edit -->
+<translation id="IBBoard.WarFoundry.GUI.GTK.FrmEditEquipment">Edit Equipment</translation>
+<translation id="frmEditEquipmentColumnTitle">Equipment</translation>
+<!-- Equipment Dialogs / Replace -->
+<translation id="IBBoard.WarFoundry.GUI.GTK.FrmReplaceEquipment">Replace Equipment</translation>
+<!-- Preferences -->
+<translation id="IBBoard.WarFoundry.GUI.GTK.FrmPreferences">Preferences</translation>
+<translation id="languagePrefSection">Language</translation>
+<translation id="lblLanguage">Language:</translation>
+<translation id="languagesGroup">Language</translation>
+<!-- About dialog -->
+<translation id="IBBoard.WarFoundry.GUI.GTK.FrmAbout">About WarFoundry</translation>
+<translation id="lblWarFoundryCopyright">© 2007-2010, IBBoard and others</translation>
+<translation id="lblWarFoundryDesc">WarFoundry is an open-source army creation tool that lets you create rosters for multiple game systems.</translation>
+<translation id="bttnCredits">Credits</translation>
+<!-- About dialog / credits -->
+<translation id="IBBoard.WarFoundry.GUI.GTK.FrmAboutCredits">Credits</translation>
+<translation id="lblDevelopers">Developers:</translation>	
+<translation id="lblTestersCommon">Testers (General WarFoundry):</translation>
+<translation id="lblTestersGtk">Testers (GTK UI):</translation>
+<!-- Export / HTML -->
+<translation id="exportBasicHtmlDialogTitle">Export army</translation>
+<translation id="exportBasicHtmlCancel">Cancel</translation>
+<translation id="exportBasicHtmlExport">Export</translation>
+<translation id="exportBasicHtmlHtmlFilter">HTML pages (*.html)</translation>
+<translation id="armyHtmlOutputBodyHeader">{0} - {1}pts</translation>
+<translation id="armyHtmlOutputTableHeaderUnitName">Name</translation>
+<translation id="armyHtmlOutputTableHeaderUnitNotes">Notes</translation>
+<translation id="armyHtmlOutputTableHeaderUnitPoints">Points</translation>
+<translation id="armyHtmlExportEquipAmountAll">all ({1})</translation>
+<translation id="armyHtmlExportEquipAmountPercentage">{0}% ({1})</translation>
+<translation id="armyHtmlExportEquipAmountNumber">{0}</translation>
+<translation id="armyHtmlExportEquipAmountRatio">{0} for {1}</translation>
+<!-- API -->
 <translation id="defaultUnitName">Unit of {0} {1}</translation>
-<translation id="bttnNewArmy">Create army</translation>
-<translation id="bttnOpenArmy">Open army</translation>
-<translation id="bttnSaveArmy">Save army</translation>
-<translation id="statusPanelPoints">{0} pts / {1} pts</translation>
-<translation id="miReloadFiles">Reload files</translation>
-<translation id="miDebugWindow">Debug information</translation>
-<translation id="FrmNewUnit">Add New {0} Choice</translation>
+<translation id="setEquipmentAmountCommandDescription">Set {0} amount for {1} to {2}</translation>
+<translation id="setEquipmentAmountCommandUndoDescription">Set {0} amount for {1} to {2}</translation>
+<translation id="replaceUnitEquipmentCommandDescription">Replace {0} with {1} for {2}</translation>
+<translation id="replaceUnitEquipmentCommandUndoDescription">Replace {0} with {1} for {2}</translation>
+<translation id="createAndAddUnitCommandDescription">Add unit of {0}</translation>
+<translation id="createAndAddUnitCommandUndoDescription">Remove unit of {0}</translation>
+<translation id="removeUnitCommandDescription">Remove {0}</translation>
+<translation id="removeUnitCommandUndoDescription">Re-add {0}</translation>
+<translation id="setUnitNameCommandDescription">Rename "{0}" to "{1}"</translation>
+<translation id="setUnitNameCommandUndoDescription">Rename "{0}" to "{1}"</translation>
+<translation id="setUnitSizeCommandDescription">Set size of {0} to {1}</translation>
+<translation id="setUnitSizeCommandUndoDescription">Set size of {0} to {1}</translation>
+<translation id="equipmentAmountAll">all ({1})</translation>
+<translation id="equipmentAmountPercentage">{0}% ({1})</translation>
+<translation id="equipmentAmountNumber">{0}</translation>
 </translations>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/translations/fr.translation	Mon Jan 17 19:43:47 2011 +0000
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<translations xmlns="http://ibboard.co.uk/translation" lang="fr">
+	<!-- This sample translation is based on the original French translation for the WinForms interface, plus additional translations made using Google Translate by IBBoard -->
+	<translation id="menuFile">_Fichier</translation>
+	<translation id="menuEdit">_Édition</translation>
+	<translation id="menuHelp">_Aide</translation>
+	<translation id="miNewArmy">_Créer une armée</translation>
+	<translation id="miOpenArmy">_Ouvrir une armée</translation>
+	<translation id="miSaveArmy">_Enregistrer une armée</translation>
+	<translation id="miSaveArmyAs">Enregistrer une armée sous…</translation>
+	<translation id="miExportArmyAs">_Exporter une armée</translation>
+	<translation id="miExportArmyAsBasicHTML">HTML Basic</translation>
+	<translation id="miCloseArmy">_Fermer une armée</translation>
+	<translation id="miReloadFiles">_Recharger les fichiers</translation>
+	<translation id="miExit">_Sortir</translation>
+	<translation id="miUndo">_Annuler</translation>
+	<translation id="miRedo">_Rétablir</translation>
+	<translation id="miAbout">_À propos</translation>
+	<translation id="bttnOkay">OK</translation>
+	<translation id="bttnCancel">Annuler</translation>
+	<translation id="bttnNewArmy">Créer une armée</translation>
+	<translation id="bttnOpenArmy">Ouvrir une armée</translation>
+	<translation id="bttnSaveArmy">Sauvegarder une armée</translation>
+	<translation id="bttnUndo">Annuler</translation>
+	<translation id="bttnRedo">Rétablir</translation>
+	<translation id="ArmyTree">Arborescence de l'armée</translation>
+	<translation id="miDeleteUnit">_Supprimer une unité</translation>
+	<translation id="miEditUnit">_Éditer une unité</translation>
+	<translation id="openArmyDialog">Ouvrir une armée</translation>
+	<translation id="saveArmyDialog">Sauvegarder une armée</translation>
+	<translation id="armyFileFilter">WarFoundry Army Files (*.army)</translation>
+	<translation id="statusPanelPoints">{0} pts / {1} pts</translation>
+	<translation id="statusPanelPointsToolTip">Nombre de point d'armée actuel</translation>
+	<translation id="defaultUnitName">Unité de {0} {1}</translation>
+	<translation id="IBBoard.WarFoundry.GUI.GTK.FrmNewArmy">Créer une nouvelle armée</translation>
+	<translation id="lblGameSystem">Système de jeux :</translation>
+	<translation id="lblRaceList">Races :</translation>
+	<translation id="lblArmyName">Nom de l'armée :</translation>
+	<translation id="lblArmySize">Taille de l'armée :</translation>
+	<translation id="bttnSelectRace">Créer une armée</translation>
+	<translation id="IBBoard.WarFoundry.GUI.GTK.FrmNewUnit">Ajouter un nouveau choix {0}</translation>
+	<translation id="lblUnitList">Types d'unité :</translation>
+	<translation id="bttnSelectUnit">Créer une unité</translation>
+	<translation id="IBBoard.WarFoundry.GUI.GTK.FrmAddEquipment">Nouvelle équipement pour unité</translation>
+	<translation id="lblAmount">Quantité :</translation>
+	<translation id="lblItem">Équipement :</translation>
+	<translation id="lblEquipAll">Tout équiper</translation>
+	<translation id="equipPercentageTooLarge">Le pourcentage actuel ({0}%) est trop important par rapport au maximum d'équipement accordé ({1}%). La valeur maximum sera utilisée à la place.</translation>
+	<translation id="equipPercentageTooLargeTitle">Le pourcentage d'équipement est trop important</translation>
+	<translation id="equipPercentageTooSmall">Le pourcentage actuel ({0}%) est trop faible par rapport au minimum d'équipement demandé ({1}%). La valeur minimum sera utilisée à la place.</translation>
+	<translation id="equipPercentageTooSmallTitle">Pourcentage d'équipement trop petit</translation>
+	<translation id="equipNumberTooLarge">La valeur en point ({0}) est trop importante par rapport au maximum d'équipement accordé ({1}). La valeur maximum sera utilisée à la place.</translation>
+	<translation id="equipNumberTooLargeTitle">Pourcentage d'équipement trop petit</translation>
+	<translation id="equipNumberTooSmall">La valeur en point ({0}) est trop faible par rapport au minimum d'équipement demandé ({1}). La valeur minimum sera utilisée à la place.</translation>
+	<translation id="equipNumberTooSmallTitle">Nombre de point d'équipement trop faible</translation>
+	<translation id="IBBoard.WarFoundry.GUI.GTK.FrmEditEquipment">Édition équipement pour unité</translation>
+	<translation id="IBBoard.WarFoundry.GUI.GTK.FrmAbout">À propos de WarFoundry</translation>
+	<translation id="lblVersion">Version : {0}</translation>
+	<translation id="lblDevelopers">Développeurs :</translation>
+	<translation id="lblThanks">Remerciement :</translation>
+	<translation id="FrmUnit">{0}</translation>
+	<translation id="lblUnitSize">Taille d'unité :</translation>
+	<translation id="lblEquip">Équipement :</translation>
+	<translation id="bttnAddWeapon">Ajouter</translation>
+	<translation id="lblAbilities">Capacités :</translation>
+	<translation id="lblNotes">Notes :</translation>
+	<translation id="bttnRemoveWeapon">Supprimer</translation>
+	<translation id="bttnReplaceWeapon">Remplacer</translation>
+	<translation id="bttnEditWeapon">Éditer</translation>
+	<translation id="equipmentAmountWithCost">{0} ({1} à {2} pts chacun)</translation>
+	<translation id="equipmentAmountWithZeroCost">{0} ({1} gratuit)</translation>
+	<translation id="equipmentChoiceAmountAll">pour ({1})</translation>
+	<translation id="equipmentChoiceAmountPercentage">pour {0}% ({1})</translation>
+	<translation id="equipmentChoiceAmountNumber">{0}</translation>
+	<translation id="InvalidRaceFileBoxTitle">Fichier de race invalide</translation>
+	<translation id="InvalidArmyFileBoxTitle">Fichier d'armée invalide</translation>
+	<translation id="SaveChangesQuestion">L'armée "{0}" a été modifiée. Sauvegarder les changements avant de fermer ?</translation>
+	<translation id="SaveChangesTitle">Changements non-sauvegardés</translation>
+	<translation id="SaveFailed">WarFoundry ne peut pas sauvegarder le fichier. Veillez vérifier le log pour plus d'informations</translation>
+	<translation id="SaveFailedTitle">Échec de la sauvegarde du fichier</translation>
+	<translation id="armyHtmlOutputBodyHeader">{0} - {1} pts</translation>
+	<translation id="armyHtmlOutputTableHeaderUnitName">Nom</translation>
+	<translation id="armyHtmlOutputTableHeaderUnitNotes">Notes</translation>
+	<translation id="armyHtmlOutputTableHeaderUnitPoints">Points</translation>
+	<translation id="armyHtmlExportEquipAmountAll">tout ({1})</translation>
+	<translation id="armyHtmlExportEquipAmountPercentage">{0}% ({1})</translation>
+	<translation id="armyHtmlExportEquipAmountNumber">{0}</translation>
+	<translation id="armyHtmlExportEquipAmountRatio">{0} pour {1}</translation>
+	<translation id="equipmentAmountAll">tout ({1})</translation>
+	<translation id="equipmentAmountPercentage">{0}% ({1})</translation>
+	<translation id="equipmentAmountNumber">{0}</translation>
+	<translation id="setEquipmentAmountCommandDescription">Fixer {0} la quantité {1} par {2}</translation>
+	<translation id="setEquipmentAmountCommandUndoDescription">Fixer {0} la quantité {1} par {2}</translation>
+	<translation id="replaceUnitEquipmentCommandDescription">Remplacer {0} de {1} par {2}</translation>
+	<translation id="replaceUnitEquipmentCommandUndoDescription">Remplacer {0} de {1} par {2}</translation>
+	<translation id="createAndAddUnitCommandDescription">Ajouter une unité de {0}</translation>
+	<translation id="createAndAddUnitCommandUndoDescription">Supprimer une unité de {0}</translation>
+	<translation id="removeUnitCommandDescription">Supprimer {0}</translation>
+	<translation id="removeUnitCommandUndoDescription">Rajouter {0}</translation>
+	<translation id="setUnitNameCommandDescription">Renommer "{0}" par "{1}"</translation>
+	<translation id="setUnitNameCommandUndoDescription">Renommer "{0}" par "{1}"</translation>
+	<translation id="setUnitSizeCommandDescription">Changer la taille de {0} par {1}</translation>
+	<translation id="setUnitSizeCommandUndoDescription">Changer la taille {0} par {1}</translation>
+	<translation id="requirementAND">{0}; et {1}</translation>
+	<translation id="requirementOR">{0}; ou {1}</translation>
+	<translation id="requirementUnitExcludes">{0} peut être sélectionné si aucun des objets suivants ne sont selectionnés : {1}</translation>
+	<translation id="requirementUnitMaxNumber">{1} peut être sélectionné {0} fois</translation>
+	<translation id="requirementUnitMinNumber">{1} doit être sélectionné au moins {0} fois</translation>
+	<translation id="requirementUnitTypeAtLeastSingle">{1} {0}</translation>
+	<translation id="requirementUnitTypeAtLeastJoiner">{0}, {1}</translation>
+	<translation id="requirementUnitTypeAtLeast">{0} peut être sélectionné seulement si l'objet suivant est sélectionné : {1}</translation>
+<!-- TODO: Check and correct or translate the following additions -->
+<translation id="IBBoard.WarFoundry.GUI.GTK.FrmPreferences">Préférences</translation>
+<translation id="languagePrefSection">Langue</translation>
+<translation id="lblLanguage">Langue:</translation>
+<translation id="languagesGroup">Langue</translation>
+<translation id="miPreferences">_Préférences</translation>
+<translation id="bttnCredits">Crédits</translation>
+<translation id="lblWarFoundryCopyright">© 2007-2011, IBBoard et d'autres</translation>
+<translation id="lblWarFoundryDesc">WarFoundry est un outil open-source de création de l'armée qui vous permet de créer des listes pour les systèmes de jeu multiples.</translation>
+<translation id="IBBoard.WarFoundry.GUI.GTK.FrmAboutCredits">Crédits</translation>
+<translation id="lblTestersCommon">Testeurs (WarFoundry général):</translation>
+<translation id="lblTestersGtk">Testeurs (interface utilisateur):</translation>
+<translation id="bttnClose">Fermer</translation>
+<translation id="armyCategoryColumnTitle">Catégories de l'armée</translation>
+<translation id="IBBoard.WarFoundry.GUI.GTK.FrmReplaceEquipment">Remplacer l'équipement pour unité</translation>
+<translation id="bttnCreate">Créer</translation>
+<translation id="frmAddEquipmentColumnTitle">Équipement</translation>
+<translation id="lblPercent">%</translation>
+<translation id="bttnOpen">_Ouvrir</translation>
+<translation id="OpenFailed">WarFoundry ne peut pas ouvrir le fichier. Veillez vérifier le log pour plus d'informations</translation>
+<translation id="OpenFailedTitle">Échec de la ouvrir du fichier</translation>
+<translation id="bttnSave">Sauvegarder</translation>
+<translation id="exportBasicHtmlDialogTitle">Export army</translation>
+<translation id="exportBasicHtmlCancel">Cancel</translation>
+<translation id="exportBasicHtmlExport">Export</translation>
+<translation id="exportBasicHtmlHtmlFilter">HTML pages (*.html)</translation>
+</translations>