/// <summary>
        /// Move an Armor TreeNode after Drag and Drop.
        /// </summary>
        /// <param name="intNewIndex">Node's new index.</param>
        /// <param name="objDestination">Destination Node.</param>
        public void MoveArmorNode(int intNewIndex, TreeNode objDestination, TreeView treArmor)
        {
            // Locate the currently selected Armor.
            Armor objArmor = _objFunctions.FindArmor(treArmor.SelectedNode.Tag.ToString(), _objCharacter.Armor);

            _objCharacter.Armor.Remove(objArmor);
            if (intNewIndex > _objCharacter.Armor.Count)
            {
                _objCharacter.Armor.Add(objArmor);
            }
            else
            {
                _objCharacter.Armor.Insert(intNewIndex, objArmor);
            }

            TreeNode objNewParent = objDestination;

            while (objNewParent.Level > 0)
            {
                objNewParent = objNewParent.Parent;
            }

            TreeNode objOldParent = treArmor.SelectedNode;

            while (objOldParent.Level > 0)
            {
                objOldParent = objOldParent.Parent;
            }

            // Change the Location on the Armor item.
            if (objNewParent.Text == LanguageManager.Instance.GetString("Node_SelectedArmor"))
            {
                objArmor.Location = "";
            }
            else
            {
                objArmor.Location = objNewParent.Text;
            }

            TreeNode objClone = treArmor.SelectedNode;

            objOldParent.Nodes.Remove(treArmor.SelectedNode);
            objNewParent.Nodes.Insert(intNewIndex, objClone);
            objNewParent.Expand();
        }
示例#2
0
        private void tsUndoNuyenExpense_Click(object sender, EventArgs e)
        {
            ListViewItem objItem = new ListViewItem();

            try
            {
                objItem = lstNuyen.SelectedItems[0];
            }
            catch
            {
                return;
            }

            CommonFunctions objCommon = new CommonFunctions(_objCharacter);

            ExpenseLogEntry objEntry = new ExpenseLogEntry();
            objItem = lstNuyen.SelectedItems[0];

            // Find the selected Nuyen Expense.
            foreach (ExpenseLogEntry objCharacterEntry in _objCharacter.ExpenseEntries)
            {
                if (objCharacterEntry.InternalId == objItem.SubItems[3].Text)
                {
                    objEntry = objCharacterEntry;
                    break;
                }
            }

            if (objEntry.Undo == null)
            {
                MessageBox.Show(LanguageManager.Instance.GetString("Message_UndoNoHistory"), LanguageManager.Instance.GetString("MessageTitle_NoUndoHistory"), MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            else if (objEntry.Undo.KarmaType == KarmaExpenseType.ImproveInitiateGrade)
            {
                // Get the grade of the item we're undoing and make sure it's the highest grade
                int intMaxGrade = 0;
                foreach (InitiationGrade objGrade in _objCharacter.InitiationGrades)
                {
                    intMaxGrade = Math.Max(intMaxGrade, objGrade.Grade);
                }
                foreach (InitiationGrade objGrade in _objCharacter.InitiationGrades)
                {
                    if (objGrade.InternalId == objEntry.Undo.ObjectId)
                    {
                        if (objGrade.Grade < intMaxGrade)
                        {
                            MessageBox.Show(LanguageManager.Instance.GetString("Message_UndoNotHighestGrade"), LanguageManager.Instance.GetString("MessageTitle_NotHighestGrade"), MessageBoxButtons.OK, MessageBoxIcon.Information);
                            return;
                        }
                        break;
                    }
                }
                if (MessageBox.Show(LanguageManager.Instance.GetString("Message_UndoExpense"), LanguageManager.Instance.GetString("MessageTitle_UndoExpense"), MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
                    return;
            }
            else
            {
                if (MessageBox.Show(LanguageManager.Instance.GetString("Message_UndoExpense"), LanguageManager.Instance.GetString("MessageTitle_UndoExpense"), MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
                    return;
            }

            switch (objEntry.Undo.NuyenType)
            {
                case NuyenExpenseType.AddCyberware:
                    // Locate the Cyberware that was added.
                    int intOldPenalty = 0;
                    int intNewPenalty = 0;
                    foreach (Cyberware objCyberware in _objCharacter.Cyberware)
                    {
                        if (objCyberware.InternalId == objEntry.Undo.ObjectId)
                        {
                            foreach (Cyberware objChild in objCyberware.Children)
                            {
                                // Remove the Improvements created by child items.
                                _objImprovementManager.RemoveImprovements(Improvement.ImprovementSource.Cyberware, objChild.InternalId);
                                _objImprovementManager.RemoveImprovements(Improvement.ImprovementSource.Bioware, objChild.InternalId);
                            }
                            // Remove the Improvements created by the item.
                            _objImprovementManager.RemoveImprovements(Improvement.ImprovementSource.Cyberware, objCyberware.InternalId);
                            _objImprovementManager.RemoveImprovements(Improvement.ImprovementSource.Bioware, objCyberware.InternalId);

                            // Determine the character's Essence penalty before removing the Cyberware.
                            intOldPenalty = _objCharacter.EssencePenalty;
                            // Remove the Cyberware.
                            _objCharacter.Cyberware.Remove(objCyberware);
                            // Determine the character's Essence penalty after removing the Cyberware.
                            intNewPenalty = _objCharacter.EssencePenalty;

                            // Restore the character's MAG/RES if they have it.
                            //if (!_objCharacter.OverrideSpecialAttributeEssenceLoss && !_objCharacter.OverrideSpecialAttributeEssenceLoss)
                            //{
                            //    if (intOldPenalty != intNewPenalty)
                            //    {
                            //        if (_objCharacter.MAGEnabled)
                            //            _objCharacter.MAG.Value += (intOldPenalty - intNewPenalty);
                            //        if (_objCharacter.RESEnabled)
                            //            _objCharacter.RES.Value += (intOldPenalty - intNewPenalty);
                            //    }
                            //}

                            // Remove the item from the Tree.
                            foreach (TreeNode objNode in treCyberware.Nodes[0].Nodes)
                            {
                                if (objNode.Tag.ToString() == objEntry.Undo.ObjectId)
                                {
                                    objNode.Remove();
                                    break;
                                }
                            }
                            foreach (TreeNode objNode in treCyberware.Nodes[1].Nodes)
                            {
                                if (objNode.Tag.ToString() == objEntry.Undo.ObjectId)
                                {
                                    objNode.Remove();
                                    break;
                                }
                            }

                            // Remove any Weapon that the Cyberware created.
                            if (objCyberware.WeaponID != Guid.Empty.ToString())
                            {
                                foreach (Weapon objWeapon in _objCharacter.Weapons)
                                {
                                    if (objWeapon.InternalId == objCyberware.WeaponID)
                                    {
                                        _objCharacter.Weapons.Remove(objWeapon);
                                        break;
                                    }
                                }

                                // Remove the TreeNode for the Weapon.
                                foreach (TreeNode objWeaponNode in treWeapons.Nodes[0].Nodes)
                                {
                                    if (objWeaponNode.Tag.ToString() == objCyberware.WeaponID)
                                    {
                                        treWeapons.Nodes[0].Nodes.Remove(objWeaponNode);
                                        break;
                                    }
                                }
                            }
                            break;
                        }
                        else
                        {
                            foreach (Cyberware objChild in objCyberware.Children)
                            {
                                if (objChild.InternalId == objEntry.Undo.ObjectId)
                                {
                                    // Remove the Improvements created by the item.
                                    _objImprovementManager.RemoveImprovements(Improvement.ImprovementSource.Cyberware, objChild.InternalId);
                                    objCyberware.Children.Remove(objChild);

                                    // Remove the item from the Tree.
                                    foreach (TreeNode objNode in treCyberware.Nodes[0].Nodes)
                                    {
                                        foreach (TreeNode objChildNode in objNode.Nodes)
                                        {
                                            if (objChildNode.Tag.ToString() == objEntry.Undo.ObjectId)
                                            {
                                                objChildNode.Remove();
                                                break;
                                            }
                                        }
                                    }
                                    foreach (TreeNode objNode in treCyberware.Nodes[1].Nodes)
                                    {
                                        foreach (TreeNode objChildNode in objNode.Nodes)
                                        {
                                            if (objChildNode.Tag.ToString() == objEntry.Undo.ObjectId)
                                            {
                                                objNode.Remove();
                                                break;
                                            }
                                        }
                                    }
                                    break;
                                }

                                // Remove any Weapon that the Cyberware created.
                                if (objChild.WeaponID != Guid.Empty.ToString())
                                {
                                    foreach (Weapon objWeapon in _objCharacter.Weapons)
                                    {
                                        if (objWeapon.InternalId == objChild.WeaponID)
                                        {
                                            _objCharacter.Weapons.Remove(objWeapon);
                                            break;
                                        }
                                    }

                                    // Remove the TreeNode for the Weapon.
                                    foreach (TreeNode objWeaponNode in treWeapons.Nodes[0].Nodes)
                                    {
                                        if (objWeaponNode.Tag.ToString() == objChild.WeaponID)
                                        {
                                            treWeapons.Nodes[0].Nodes.Remove(objWeaponNode);
                                            break;
                                        }
                                    }
                                }
                            }
                        }
                    }
                    break;
                case NuyenExpenseType.AddGear:
                    // Locate the Gear that was added.
                    //If the gear was already deleted manually we will not be able to locate it here
                    Gear objGear = objCommon.FindGear(objEntry.Undo.ObjectId, _objCharacter.Gear);
                    if (objGear == null)
                        break;
                    objGear.Quantity -= objEntry.Undo.Qty;

                    if (objGear.Quantity <= 0)
                    {
                        if (objGear.Parent != null)
                            objGear.Parent.Children.Remove(objGear);
                        else
                            _objCharacter.Gear.Remove(objGear);

                        objCommon.DeleteGear(objGear, treWeapons, _objImprovementManager);
                        TreeNode objNode = objCommon.FindNode(objGear.InternalId, treGear);
                        objNode.Remove();
                    }
                    else
                    {
                        TreeNode objNode = objCommon.FindNode(objGear.InternalId, treGear);
                        objNode.Text = objGear.DisplayName;
                    }

                    _objController.PopulateFocusList(treFoci);
                    break;
                case NuyenExpenseType.AddVehicle:
                    // Locate the Vehicle that was added.
                    foreach (Vehicle objVehicle in _objCharacter.Vehicles)
                    {
                        if (objVehicle.InternalId == objEntry.Undo.ObjectId)
                        {
                            // Remove the Vehicle.
                            _objCharacter.Vehicles.Remove(objVehicle);
                            foreach (TreeNode objNode in treVehicles.Nodes[0].Nodes)
                            {
                                if (objNode.Tag.ToString() == objEntry.Undo.ObjectId)
                                {
                                    objNode.Remove();
                                    break;
                                }
                            }
                            break;
                        }
                    }
                    break;
                case NuyenExpenseType.AddVehicleMod:
                    // Locate the Vehicle Mod that was added.
                    foreach (Vehicle objVehicle in _objCharacter.Vehicles)
                    {
                        foreach (VehicleMod objMod in objVehicle.Mods)
                        {
                            if (objMod.InternalId == objEntry.Undo.ObjectId)
                            {
                                // Check for Improved Sensor bonus.
                                if (objMod.Bonus != null)
                                {
                                    if (objMod.Bonus["improvesensor"] != null)
                                    {
                                        ChangeVehicleSensor(objVehicle, false);
                                    }
                                }

                                // Remove the Vehicle Mod.
                                objVehicle.Mods.Remove(objMod);

                                // Remove the Vehicle Mod from the tree.
                                foreach (TreeNode objNode in treVehicles.Nodes[0].Nodes)
                                {
                                    foreach (TreeNode objChild in objNode.Nodes)
                                    {
                                        if (objChild.Tag.ToString() == objEntry.Undo.ObjectId)
                                        {
                                            objChild.Remove();
                                            break;
                                        }
                                    }
                                }
                                break;
                            }
                        }
                    }
                    break;
                case NuyenExpenseType.AddVehicleGear:
                    // Locate the Gear that was added.
                    foreach (Vehicle objVehicle in _objCharacter.Vehicles)
                    {
                        foreach (Gear objVehicleGear in objVehicle.Gear)
                        {
                            if (objVehicleGear.InternalId == objEntry.Undo.ObjectId)
                            {
                                // Deduct the Qty from the Gear.
                                objVehicleGear.Quantity -= objEntry.Undo.Qty;
                                foreach (TreeNode objVNode in treVehicles.Nodes[0].Nodes)
                                {
                                    foreach (TreeNode objNode in objVNode.Nodes)
                                    {
                                        if (objNode.Tag.ToString() == objEntry.Undo.ObjectId)
                                        {
                                            objNode.Text = objVehicleGear.DisplayName;
                                            // Remove the Node if its Qty has been reduced to 0.
                                            if (objVehicleGear.Quantity <= 0)
                                                objNode.Remove();
                                            break;
                                        }
                                    }
                                }

                                // Remove the Gear if its Qty has been reduced to 0.
                                if (objVehicleGear.Quantity <= 0)
                                {
                                    objVehicle.Gear.Remove(objVehicleGear);
                                }

                                break;
                            }
                            else
                            {
                                // Look in child items.
                                foreach (Gear objChild in objVehicleGear.Children)
                                {
                                    if (objChild.InternalId == objEntry.Undo.ObjectId)
                                    {
                                        // Deduct the Qty from the Gear.
                                        objChild.Quantity -= objEntry.Undo.Qty;
                                        foreach (TreeNode objVNode in treVehicles.Nodes[0].Nodes)
                                        {
                                            foreach (TreeNode objNode in objVNode.Nodes)
                                            {
                                                foreach (TreeNode objChildNode in objNode.Nodes)
                                                {
                                                    if (objChildNode.Tag.ToString() == objEntry.Undo.ObjectId)
                                                    {
                                                        objChildNode.Text = objChild.DisplayName;
                                                        // Remove the Node if its Qty has been reduced to 0.
                                                        if (objChild.Quantity <= 0)
                                                        {
                                                            objChildNode.Remove();
                                                        }
                                                        break;
                                                    }
                                                }
                                            }
                                        }

                                        // Remove the Gear if its Qty has been reduce to 0.
                                        if (objChild.Quantity <= 0)
                                        {
                                            objVehicleGear.Children.Remove(objChild);
                                        }

                                        break;
                                    }
                                    else
                                    {
                                        foreach (Gear objSubChild in objChild.Children)
                                        {
                                            if (objSubChild.InternalId == objEntry.Undo.ObjectId)
                                            {
                                                // Deduct the Qty from the Gear.
                                                objSubChild.Quantity -= objEntry.Undo.Qty;
                                                foreach (TreeNode objVNode in treVehicles.Nodes[0].Nodes)
                                                {
                                                    foreach (TreeNode objNode in objVNode.Nodes)
                                                    {
                                                        foreach (TreeNode objChildNode in objNode.Nodes)
                                                        {
                                                            foreach (TreeNode objSubChildNode in objChildNode.Nodes)
                                                            {
                                                                if (objSubChildNode.Tag.ToString() == objEntry.Undo.ObjectId)
                                                                {
                                                                    objSubChildNode.Text = objSubChild.DisplayName;
                                                                    // Remove the Node if its Qty has been reduced to 0.
                                                                    if (objSubChild.Quantity <= 0)
                                                                    {
                                                                        objSubChildNode.Remove();
                                                                    }
                                                                    break;
                                                                }
                                                            }
                                                        }
                                                    }
                                                }

                                                // Remove the Gear if its Qty has been reduce to 0.
                                                if (objSubChild.Quantity <= 0)
                                                {
                                                    objChild.Children.Remove(objSubChild);
                                                }

                                                break;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                    break;
                case NuyenExpenseType.AddVehicleWeapon:
                    // Locate the Weapon that was added.
                    foreach (Vehicle objVehicle in _objCharacter.Vehicles)
                    {
                        foreach (VehicleMod objMod in objVehicle.Mods)
                        {
                            foreach (Weapon objWeapon in objMod.Weapons)
                            {
                                if (objWeapon.InternalId == objEntry.Undo.ObjectId)
                                {
                                    // Remove the Weapon.
                                    objMod.Weapons.Remove(objWeapon);

                                    // Remove the Weapon from the Tree.
                                    foreach (TreeNode objVNode in treVehicles.Nodes[0].Nodes)
                                    {
                                        foreach (TreeNode objNode in objVNode.Nodes)
                                        {
                                            foreach (TreeNode objChild in objNode.Nodes)
                                            {
                                                if (objChild.Tag.ToString() == objEntry.Undo.ObjectId)
                                                {
                                                    objChild.Remove();
                                                    break;
                                                }
                                            }
                                        }
                                    }
                                    break;
                                }
                                else
                                {
                                    if (objWeapon.UnderbarrelWeapons.Count > 0)
                                    {
                                        foreach (Weapon objUnderbarrelWeapon in objWeapon.UnderbarrelWeapons)
                                        {
                                            if (objUnderbarrelWeapon.InternalId == objEntry.Undo.ObjectId)
                                            {
                                                // Remove the Underbarrel Weapon.
                                                objWeapon.UnderbarrelWeapons.Remove(objUnderbarrelWeapon);

                                                // Remove the Underbarrel Weapon from the Tree.
                                                foreach (TreeNode objVNode in treVehicles.Nodes[0].Nodes)
                                                {
                                                    foreach (TreeNode objNode in objVNode.Nodes)
                                                    {
                                                        foreach (TreeNode objChild in objNode.Nodes)
                                                        {
                                                            foreach (TreeNode objSubChild in objChild.Nodes)
                                                            {
                                                                if (objSubChild.Tag.ToString() == objEntry.Undo.ObjectId)
                                                                {
                                                                    objSubChild.Remove();
                                                                    break;
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                                break;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                    break;
                case NuyenExpenseType.AddVehicleWeaponAccessory:
                    // Locate the Weapon Accessory that was added.
                    foreach (Vehicle objVehicle in _objCharacter.Vehicles)
                    {
                        foreach (VehicleMod objMod in objVehicle.Mods)
                        {
                            foreach (Weapon objWeapon in objMod.Weapons)
                            {
                                foreach (WeaponAccessory objAccessory in objWeapon.WeaponAccessories)
                                {
                                    if (objAccessory.InternalId == objEntry.Undo.ObjectId)
                                    {
                                        // Remove the Weapon Accessory.
                                        objWeapon.WeaponAccessories.Remove(objAccessory);

                                        // Remove the Weapon Accessory from the Tree.
                                        foreach (TreeNode objVNode in treVehicles.Nodes[0].Nodes)
                                        {
                                            foreach (TreeNode objNode in objVNode.Nodes)
                                            {
                                                foreach (TreeNode objWNode in objNode.Nodes)
                                                {
                                                    foreach (TreeNode objChild in objWNode.Nodes)
                                                    {
                                                        if (objChild.Tag.ToString() == objEntry.Undo.ObjectId)
                                                        {
                                                            objChild.Remove();
                                                            break;
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                        break;
                                    }
                                }
                                if (objWeapon.UnderbarrelWeapons.Count > 0)
                                {
                                    foreach (Weapon objUnderbarrelWeapon in objWeapon.UnderbarrelWeapons)
                                    {
                                        foreach (WeaponAccessory objAccessory in objUnderbarrelWeapon.WeaponAccessories)
                                        {
                                            if (objAccessory.InternalId == objEntry.Undo.ObjectId)
                                            {
                                                // Remove the Weapon Accessory.
                                                objUnderbarrelWeapon.WeaponAccessories.Remove(objAccessory);

                                                // Remove the Weapon Accessory from the Tree.
                                                foreach (TreeNode objVNode in treVehicles.Nodes[0].Nodes)
                                                {
                                                    foreach (TreeNode objNode in objVNode.Nodes)
                                                    {
                                                        foreach (TreeNode objWNode in objNode.Nodes)
                                                        {
                                                            foreach (TreeNode objChild in objWNode.Nodes)
                                                            {
                                                                foreach (TreeNode objSubChild in objChild.Nodes)
                                                                {
                                                                    if (objSubChild.Tag.ToString() == objEntry.Undo.ObjectId)
                                                                    {
                                                                        objSubChild.Remove();
                                                                        break;
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                                break;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                    break;
                case NuyenExpenseType.AddVehicleWeaponMod:
                    // Locate the Weapon Mod that was added.
                    foreach (Vehicle objVehicle in _objCharacter.Vehicles)
                    {
                        foreach (VehicleMod objMod in objVehicle.Mods)
                        {
                            foreach (Weapon objWeapon in objMod.Weapons)
                            {
                                foreach (WeaponMod objWMod in objWeapon.WeaponMods)
                                {
                                    if (objMod.InternalId == objEntry.Undo.ObjectId)
                                    {
                                        // Remove the Weapon Mod.
                                        objWeapon.WeaponMods.Remove(objWMod);

                                        // Remove the Weapon Mod from the Tree.
                                        foreach (TreeNode objVNode in treVehicles.Nodes[0].Nodes)
                                        {
                                            foreach (TreeNode objNode in objVNode.Nodes)
                                            {
                                                foreach (TreeNode objWNode in objNode.Nodes)
                                                {
                                                    foreach (TreeNode objChild in objWNode.Nodes)
                                                    {
                                                        if (objChild.Tag.ToString() == objEntry.Undo.ObjectId)
                                                        {
                                                            objChild.Remove();
                                                            break;
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                        break;
                                    }
                                }
                                if (objWeapon.UnderbarrelWeapons.Count > 0)
                                {
                                    foreach (Weapon objUnderbarrelWeapon in objWeapon.UnderbarrelWeapons)
                                    {
                                        foreach (WeaponMod objWMod in objUnderbarrelWeapon.WeaponMods)
                                        {
                                            if (objWMod.InternalId == objEntry.Undo.ObjectId)
                                            {
                                                // Remove the Weapon Mod.
                                                objUnderbarrelWeapon.WeaponMods.Remove(objWMod);

                                                // Remove the Weapon Mod from the Tree.
                                                foreach (TreeNode objVNode in treVehicles.Nodes[0].Nodes)
                                                {
                                                    foreach (TreeNode objNode in objVNode.Nodes)
                                                    {
                                                        foreach (TreeNode objWNode in objNode.Nodes)
                                                        {
                                                            foreach (TreeNode objChild in objWNode.Nodes)
                                                            {
                                                                foreach (TreeNode objSubChild in objChild.Nodes)
                                                                {
                                                                    if (objSubChild.Tag.ToString() == objEntry.Undo.ObjectId)
                                                                    {
                                                                        objSubChild.Remove();
                                                                        break;
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                                break;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                    break;
                case NuyenExpenseType.AddArmor:
                    // Locate the Armor that was added.
                    Armor objArmor = objCommon.FindArmor(objEntry.Undo.ObjectId, _objCharacter.Armor);

                    if (objArmor != null)
                    {
                        // Remove the Improvements for any child items.
                        foreach (ArmorMod objMod in objArmor.ArmorMods)
                            _objImprovementManager.RemoveImprovements(Improvement.ImprovementSource.ArmorMod, objMod.InternalId);

                        // Remove the Improvements for the Armor.
                        _objImprovementManager.RemoveImprovements(Improvement.ImprovementSource.Armor, objArmor.InternalId);

                        // Remove the Armor from the character.
                        _objCharacter.Armor.Remove(objArmor);

                        // Remove the Armor from the Tree.
                        TreeNode objArmorNode = objCommon.FindNode(objEntry.Undo.ObjectId, treArmor);
                        objArmorNode.Remove();
                    }

                    break;
                case NuyenExpenseType.AddArmorMod:
                    // Locate the Armor Mod that was added.
                    foreach (Armor objFoundArmor in _objCharacter.Armor)
                    {
                        foreach (ArmorMod objMod in objFoundArmor.ArmorMods)
                        {
                            if (objMod.InternalId == objEntry.Undo.ObjectId)
                            {
                                // Remove the Improtements for the Armor Mod.
                                _objImprovementManager.RemoveImprovements(Improvement.ImprovementSource.ArmorMod, objMod.InternalId);

                                // Remove the Armor Mod from the Armor.
                                objFoundArmor.ArmorMods.Remove(objMod);

                                // Remove the Cyberweapon created by the Mod if applicable.
                                if (objMod.WeaponID != Guid.Empty.ToString())
                                {
                                    // Remove the Weapon from the TreeView.
                                    TreeNode objRemoveNode = new TreeNode();
                                    foreach (TreeNode objWeaponNode in treWeapons.Nodes[0].Nodes)
                                    {
                                        if (objWeaponNode.Tag.ToString() == objMod.WeaponID)
                                            objRemoveNode = objWeaponNode;
                                    }
                                    treWeapons.Nodes.Remove(objRemoveNode);

                                    // Remove the Weapon from the Character.
                                    Weapon objRemoveWeapon = new Weapon(_objCharacter);
                                    foreach (Weapon objWeapon in _objCharacter.Weapons)
                                    {
                                        if (objWeapon.InternalId == objMod.WeaponID)
                                            objRemoveWeapon = objWeapon;
                                    }
                                    _objCharacter.Weapons.Remove(objRemoveWeapon);
                                }

                                // Remove the Armor Mod from the Tree.
                                TreeNode objNode = objCommon.FindNode(objMod.InternalId, treArmor.Nodes[0]);
                                objNode.Remove();
                                break;
                            }
                        }
                    }
                    break;
                case NuyenExpenseType.AddWeapon:
                    // Locate the Weapon that was added.
                    foreach (Weapon objWeapon in _objCharacter.Weapons)
                    {
                        if (objWeapon.InternalId == objEntry.Undo.ObjectId)
                        {
                            // Remove the Weapn from the character.
                            _objCharacter.Weapons.Remove(objWeapon);

                            // Remove the Weapon from the Tree.
                            foreach (TreeNode objNode in treWeapons.Nodes[0].Nodes)
                            {
                                if (objNode.Tag.ToString() == objEntry.Undo.ObjectId)
                                {
                                    objNode.Remove();
                                    break;
                                }
                            }
                            break;
                        }
                    }
                    break;
                case NuyenExpenseType.AddWeaponAccessory:
                    // Locate the Weapon Accessory that was added.
                    foreach (Weapon objWeapon in _objCharacter.Weapons)
                    {
                        foreach (WeaponAccessory objAccessory in objWeapon.WeaponAccessories)
                        {
                            if (objAccessory.InternalId == objEntry.Undo.ObjectId)
                            {
                                // Remove the Weapon Accessory.
                                objWeapon.WeaponAccessories.Remove(objAccessory);

                                // Remove the Weapon Accessory from the tree.
                                foreach (TreeNode objNode in treWeapons.Nodes[0].Nodes)
                                {
                                    foreach (TreeNode objChild in objNode.Nodes)
                                    {
                                        if (objChild.Tag.ToString() == objEntry.Undo.ObjectId)
                                        {
                                            objChild.Remove();
                                            break;
                                        }
                                    }
                                }
                                break;
                            }
                        }
                    }
                    break;
                case NuyenExpenseType.AddWeaponMod:
                    // Locate the Weapon Mod that was added.
                    foreach (Weapon objWeapon in _objCharacter.Weapons)
                    {
                        foreach (WeaponMod objMod in objWeapon.WeaponMods)
                        {
                            if (objMod.InternalId == objEntry.Undo.ObjectId)
                            {
                                // Remove the Weapon Mod.
                                objWeapon.WeaponMods.Remove(objMod);

                                // Remove the Weapon Mod from the tree.
                                foreach (TreeNode objNode in treWeapons.Nodes[0].Nodes)
                                {
                                    foreach (TreeNode objChild in objNode.Nodes)
                                    {
                                        if (objChild.Tag.ToString() == objEntry.Undo.ObjectId)
                                        {
                                            objChild.Remove();
                                            break;
                                        }
                                    }
                                }
                                break;
                            }
                        }
                    }
                    break;
                case NuyenExpenseType.IncreaseLifestyle:
                    // Locate the Lifestyle that was increased.
                    foreach (Lifestyle objLifestyle in _objCharacter.Lifestyles)
                    {
                        if (objLifestyle.Name == objEntry.Undo.ObjectId)
                        {
                            objLifestyle.Months--;
                            RefreshSelectedLifestyle();
                            break;
                        }
                    }
                    break;
                case NuyenExpenseType.AddArmorGear:
                    // Locate the Armor Gear that was added.
                    foreach (Armor objFoundArmor in _objCharacter.Armor)
                    {
                        foreach (Gear objArmorGear in objFoundArmor.Gear)
                        {
                            if (objArmorGear.InternalId == objEntry.Undo.ObjectId)
                            {
                                // Deduct the Qty from the Gear.
                                objArmorGear.Quantity -= objEntry.Undo.Qty;
                                foreach (TreeNode objArmorNode in treArmor.Nodes[0].Nodes)
                                {
                                    foreach (TreeNode objNode in objArmorNode.Nodes)
                                    {
                                        if (objNode.Tag.ToString() == objEntry.Undo.ObjectId)
                                        {
                                            objNode.Text = objArmorGear.DisplayName;
                                            // Remove the Node if its Qty has been reduced to 0.
                                            if (objArmorGear.Quantity <= 0)
                                                objNode.Remove();
                                            break;
                                        }
                                    }
                                }

                                // Remove the Gear if its Qty has been reduced to 0.
                                if (objArmorGear.Quantity <= 0)
                                {
                                    // Remove any Improvements created by the Gear.
                                    _objImprovementManager.RemoveImprovements(Improvement.ImprovementSource.Gear, objArmorGear.InternalId);
                                    objFoundArmor.Gear.Remove(objArmorGear);

                                    // Remove any Weapons created by the Gear.
                                    foreach (Weapon objWeapon in _objCharacter.Weapons)
                                    {
                                        if (objWeapon.InternalId == objArmorGear.WeaponID)
                                        {
                                            _objCharacter.Weapons.Remove(objWeapon);
                                            foreach (TreeNode objWeaponNode in treWeapons.Nodes[0].Nodes)
                                            {
                                                if (objWeaponNode.Tag.ToString() == objArmorGear.WeaponID)
                                                {
                                                    objWeaponNode.Remove();
                                                    break;
                                                }
                                            }
                                            break;
                                        }
                                    }
                                }

                                break;
                            }
                            else
                            {
                                // Look in child items.
                                foreach (Gear objChild in objArmorGear.Children)
                                {
                                    if (objChild.InternalId == objEntry.Undo.ObjectId)
                                    {
                                        // Deduct the Qty from the Gear.
                                        objChild.Quantity -= objEntry.Undo.Qty;
                                        foreach (TreeNode objArmorNode in treArmor.Nodes[0].Nodes)
                                        {
                                            foreach (TreeNode objNode in objArmorNode.Nodes)
                                            {
                                                foreach (TreeNode objChildNode in objNode.Nodes)
                                                {
                                                    if (objChildNode.Tag.ToString() == objEntry.Undo.ObjectId)
                                                    {
                                                        objChildNode.Text = objChild.DisplayName;
                                                        // Remove the Node if its Qty has been reduced to 0.
                                                        if (objChild.Quantity <= 0)
                                                        {
                                                            objChildNode.Remove();

                                                            // Remove any Weapons created by the Gear.
                                                            foreach (Weapon objWeapon in _objCharacter.Weapons)
                                                            {
                                                                if (objWeapon.InternalId == objChild.WeaponID)
                                                                {
                                                                    _objCharacter.Weapons.Remove(objWeapon);
                                                                    foreach (TreeNode objWeaponNode in treWeapons.Nodes[0].Nodes)
                                                                    {
                                                                        if (objWeaponNode.Tag.ToString() == objChild.WeaponID)
                                                                        {
                                                                            objWeaponNode.Remove();
                                                                            break;
                                                                        }
                                                                    }
                                                                    break;
                                                                }
                                                            }
                                                        }
                                                        break;
                                                    }
                                                }
                                            }
                                        }

                                        // Remove the Gear if its Qty has been reduce to 0.
                                        if (objChild.Quantity <= 0)
                                        {
                                            // Remove any Improvements created by the Gear.
                                            _objImprovementManager.RemoveImprovements(Improvement.ImprovementSource.Gear, objChild.InternalId);
                                            objArmorGear.Children.Remove(objChild);
                                        }

                                        break;
                                    }
                                    else
                                    {
                                        foreach (Gear objSubChild in objChild.Children)
                                        {
                                            if (objSubChild.InternalId == objEntry.Undo.ObjectId)
                                            {
                                                // Deduct the Qty from the Gear.
                                                objSubChild.Quantity -= objEntry.Undo.Qty;
                                                foreach (TreeNode objArmorNode in treArmor.Nodes[0].Nodes)
                                                {
                                                    foreach (TreeNode objNode in objArmorNode.Nodes)
                                                    {
                                                        foreach (TreeNode objChildNode in objNode.Nodes)
                                                        {
                                                            foreach (TreeNode objSubChildNode in objChildNode.Nodes)
                                                            {
                                                                if (objSubChildNode.Tag.ToString() == objEntry.Undo.ObjectId)
                                                                {
                                                                    objSubChildNode.Text = objSubChild.DisplayName;
                                                                    // Remove the Node if its Qty has been reduced to 0.
                                                                    if (objSubChild.Quantity <= 0)
                                                                    {
                                                                        objSubChildNode.Remove();

                                                                        // Remove any Weapons created by the Gear.
                                                                        foreach (Weapon objWeapon in _objCharacter.Weapons)
                                                                        {
                                                                            if (objWeapon.InternalId == objSubChild.WeaponID)
                                                                            {
                                                                                _objCharacter.Weapons.Remove(objWeapon);
                                                                                foreach (TreeNode objWeaponNode in treWeapons.Nodes[0].Nodes)
                                                                                {
                                                                                    if (objWeaponNode.Tag.ToString() == objSubChild.WeaponID)
                                                                                    {
                                                                                        objWeaponNode.Remove();
                                                                                        break;
                                                                                    }
                                                                                }
                                                                                break;
                                                                            }
                                                                        }
                                                                    }
                                                                    break;
                                                                }
                                                            }
                                                        }
                                                    }
                                                }

                                                // Remove the Gear if its Qty has been reduce to 0.
                                                if (objSubChild.Quantity <= 0)
                                                {
                                                    // Remove any Improvements created by the Gear.
                                                    _objImprovementManager.RemoveImprovements(Improvement.ImprovementSource.Gear, objSubChild.InternalId);
                                                    objChild.Children.Remove(objSubChild);
                                                }

                                                break;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                    break;
                case NuyenExpenseType.AddVehicleModCyberware:
                    // Locate the Cyberware that was added.
                    foreach (Vehicle objVehicle in _objCharacter.Vehicles)
                    {
                        foreach (VehicleMod objMod in objVehicle.Mods)
                        {
                            foreach (Cyberware objCyberware in objMod.Cyberware)
                            {
                                if (objCyberware.InternalId == objEntry.Undo.ObjectId)
                                {
                                    // Remove the Cyberware.
                                    objMod.Cyberware.Remove(objCyberware);

                                    // Remove the Cyberware from the Tree.
                                    foreach (TreeNode objVNode in treVehicles.Nodes[0].Nodes)
                                    {
                                        foreach (TreeNode objNode in objVNode.Nodes)
                                        {
                                            foreach (TreeNode objChild in objNode.Nodes)
                                            {
                                                if (objChild.Tag.ToString() == objEntry.Undo.ObjectId)
                                                {
                                                    objChild.Remove();
                                                    break;
                                                }
                                            }
                                        }
                                    }
                                    break;
                                }
                            }
                        }
                    }
                    break;
                case NuyenExpenseType.AddCyberwareGear:
                    // Locate the Gear that was added.
                    Cyberware objFoundCyberware = new Cyberware(_objCharacter);
                    Gear objFoundGear = _objFunctions.FindCyberwareGear(objEntry.Undo.ObjectId, _objCharacter.Cyberware, out objFoundCyberware);
                    _objFunctions.DeleteGear(objFoundGear, treWeapons, _objImprovementManager);
                    if (objFoundGear.Parent == null)
                        objFoundCyberware.Gear.Remove(objFoundGear);
                    else
                        objFoundGear.Parent.Children.Remove(objFoundGear);
                    TreeNode objFoundNode = _objFunctions.FindNode(objFoundGear.InternalId, treCyberware);
                    objFoundNode.Remove();
                    break;
                case NuyenExpenseType.AddWeaponGear:
                    // Locate the Gear that was added.
                    WeaponAccessory objFoundAccessory = new WeaponAccessory(_objCharacter);
                    Gear objFoundAccGear = _objFunctions.FindWeaponGear(objEntry.Undo.ObjectId, _objCharacter.Weapons, out objFoundAccessory);
                    _objFunctions.DeleteGear(objFoundAccGear, treWeapons, _objImprovementManager);
                    if (objFoundAccGear.Parent == null)
                        objFoundAccessory.Gear.Remove(objFoundAccGear);
                    else
                        objFoundAccGear.Parent.Children.Remove(objFoundAccGear);
                    TreeNode objFoundAccNode = _objFunctions.FindNode(objFoundAccGear.InternalId, treWeapons);
                    objFoundAccNode.Remove();
                    break;
                case NuyenExpenseType.ManualAdd:
                case NuyenExpenseType.ManualSubtract:
                    break;
            }
            // Refund the Nuyen amount and remove the Expense Entry.
            _objCharacter.Nuyen -= objEntry.Amount;
            _objCharacter.ExpenseEntries.Remove(objEntry);

            UpdateCharacterInfo();

            _blnIsDirty = true;
            UpdateWindowTitle();
        }