changeset 473:0d032c04210e

Re #359: Add "only contained" attribute to unit types * Make sure remove handles sub-units as well Note: warning the user that the unit has sub-units rather than just removing them is left to the UI
author IBBoard <dev@ibboard.co.uk>
date Mon, 16 Apr 2012 20:47:14 +0100
parents e6c93ceba119
children e47cb422aac1
files API/Commands/RemoveUnitCommand.cs
diffstat 1 files changed, 28 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/API/Commands/RemoveUnitCommand.cs	Mon Apr 16 20:14:23 2012 +0100
+++ b/API/Commands/RemoveUnitCommand.cs	Mon Apr 16 20:47:14 2012 +0100
@@ -6,6 +6,7 @@
 using IBBoard.Commands;
 using IBBoard.Lang;
 using IBBoard.WarFoundry.API.Objects;
+using System.Collections.Generic;
 
 namespace IBBoard.WarFoundry.API.Commands
 {
@@ -15,12 +16,15 @@
 	public class RemoveUnitCommand : Command
 	{
 		private Unit unit;
+		private Unit parentUnit;
 		private ArmyCategory cat;
+		private List<RemoveUnitCommand> subCommands;
 
 		public RemoveUnitCommand(Unit toRemove)
 		{
 			unit = toRemove;
 			cat = unit.Category;
+			parentUnit = unit.ParentUnit;
 		}
 
 		public override bool CanExecute()
@@ -44,20 +48,43 @@
 			}
 		}
 
+		private void Prepare()
+		{
+			subCommands = new List<RemoveUnitCommand>();
+			foreach (Unit containedUnit in unit.ContainedUnits)
+			{
+				RemoveUnitCommand removeUnitCommand = new RemoveUnitCommand(containedUnit);
+				removeUnitCommand.Prepare();
+				subCommands.Add(removeUnitCommand);
+			}
+		}
 		public override bool Execute()
 		{
-			this.Redo();
+			Prepare();
+			Redo();
 			return true;
 		}
 
 		public override void Redo()
 		{
+			unit.ParentUnit = null;
 			cat.RemoveUnit(unit);
+
+			foreach (RemoveUnitCommand subCommand in subCommands)
+			{
+				subCommand.Redo();
+			}
 		}
 
 		public override void Undo()
 		{
+			unit.ParentUnit = parentUnit;
 			cat.AddUnit(unit);
+
+			foreach (RemoveUnitCommand subCommand in subCommands)
+			{
+				subCommand.Undo();
+			}
 		}
 
 		public override string Name