# HG changeset patch # User IBBoard # Date 1279966787 0 # Node ID 97fd4b6f823b60ce9b75b517cb9a8a4bc43bc27a # Parent 2c17714ad71b5a60e0881b2b2202781ede162ee1 Fixes #294: Fix data grid header wrapping problems * Disable wrapping on each column as it is created * Just to make sure, disable header height resizing diff -r 2c17714ad71b -r 97fd4b6f823b FrmUnit.cs --- a/FrmUnit.cs Wed Jul 14 20:02:20 2010 +0000 +++ b/FrmUnit.cs Sat Jul 24 10:19:47 2010 +0000 @@ -1,677 +1,678 @@ -// This file (FrmUnit.cs) is a part of the IBBoard.WarFoundry.GUI.WinForms project and is copyright 2007, 2008, 2009 IBBoard. -// -// The file and the library/program it is in are licensed and distributed, without warranty, under the GNU Affero GPL license, either version 3 of the License or (at your option) any later version. Please see COPYING for more information and the full license. - -using System; -using System.Drawing; -using System.Data; -using System.Collections.Generic; -using System.ComponentModel; -using System.Windows.Forms; -using IBBoard.Commands; -using IBBoard.Lang; -using IBBoard.Windows.Forms; -using IBBoard.Windows.Forms.I18N; -using IBBoard.WarFoundry.API; -using IBBoard.WarFoundry.API.Commands; -using IBBoard.WarFoundry.API.Objects; -using IBBoard.WarFoundry.GUI.WinForms.UI; -using IBBoard.WarFoundry.GUI.WinForms.Util; -using log4net; - -namespace IBBoard.WarFoundry.GUI.WinForms -{ - /// - /// Summary description for FrmUnit. - /// - public class FrmUnit : IBBoard.Windows.Forms.IBBForm - { - private static readonly ILog log = LogManager.GetLogger(typeof(FrmUnit)); - private static readonly int BORDER_WIDTH = 1; - private static readonly int NAME_COL_WIDTH_MULTIPLIER = 3; - private Unit unit; - private Dictionary equipmentChoices = new Dictionary(); - private Dictionary DataGridViews = new Dictionary(); - private CommandStack commandStack; - private System.Windows.Forms.TextBox tbUnitName; - private System.Windows.Forms.NumericUpDown unitSize; - private IBBLabel lblUnitSize; - private IBBButton bttnAddWeapon; - private IBBButton bttnRemoveWeapon; - private IBBLabel lblEquip; - private System.Windows.Forms.ListBox equipmentList; - private IBBButton bttnReplaceWeapon; - private IBBButton bttnEditWeapon; - private Label lblPoints; - private IBBLabel lblNotes; - private TextBox notes; - private ListBox abilitiesList; - private IBBLabel lblAbilities; - private FlowLayoutPanel statsPanel; - /// - /// Required designer variable. - /// - private System.ComponentModel.Container components = null; - - public FrmUnit(Unit toDisplay, CommandStack cmdStack) - { - unit = toDisplay; - commandStack = cmdStack; - // - // Required for Windows Form Designer support - // - InitializeComponent(); - TranslateForm(); - Translation.TranslationChanged += new MethodInvoker(TranslateForm); - unit.NameChanged += new StringValChangedDelegate(unit_NameChanged); - unit.UnitSizeChanged += new IntValChangedDelegate(unit_UnitSizeChanged); - unit.UnitEquipmentAmountChanged += new DoubleValChangedDelegate(unit_UnitEquipmentAmountChanged); - unit.PointsValueChanged += new DoubleValChangedDelegate(unit_PointsValueChanged); - - unitSize.Value = unit.Size; - unitSize.Maximum = (unit.UnitType.MaxSize == WarFoundryCore.INFINITY ? int.MaxValue : unit.UnitType.MaxSize); - unitSize.Minimum = unit.UnitType.MinSize; - unitSize.Enabled = (unitSize.Maximum != unitSize.Minimum); - - notes.Text = unit.UnitType.Notes; - abilitiesList.DataSource = new List(unit.UnitType.GetRequiredAbilities()); - abilitiesList.DisplayMember = "Name"; - SetPointsValueText(); - SetStats(); - SetWeapons(); - } - - private void TranslateForm() - { - ControlTranslator.TranslateControl(this); - SetUnitName(); - RefreshUnitEquipment(); - } - - private void SetUnitName() - { - tbUnitName.Text = unit.Name; - Text = Translation.GetTranslation("FrmUnit", "{0} ({1})", unit.Name, unit.UnitType.Name); - } - - void unit_PointsValueChanged(WarFoundryObject obj, double oldValue, double newValue) - { - SetPointsValueText(); - } - - private void SetPointsValueText() - { - lblPoints.Text = "(" + unit.Points + " pts)"; - } - - private void SetStats() - { - 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 < statsCount; i++) - { - DataGridView statsGrid = GetDataGridView(statsIDs[i]); - DataTable dt = (DataTable)statsGrid.DataSource; - DataRow dr = dt.NewRow(); - dr.ItemArray = stats[i]; - log.DebugFormat("Add row to data table for {0}", statsIDs[i]); - dt.Rows.Add(dr); - statsGrid.ClearSelection(); - } - } - - private DataGridView GetDataGridView(string statsID) - { - DataGridView grid; - - if (DataGridViews.ContainsKey(statsID)) - { - grid = DictionaryUtils.GetValue(DataGridViews, statsID); - } - else - { - grid = CreateDataGridView(statsID); - DataGridViews[statsID] = grid; - } - - return grid; - } - - private DataGridView CreateDataGridView(string statsID) - { - log.DebugFormat("Create DataGridView for stats ID {0}", statsID); - SystemStats sysStats = unit.Race.GameSystem.GetSystemStatsForID(statsID); - StatSlot[] sysStatSlots = sysStats.StatSlots; - int statsCount = sysStatSlots.Length; - int statsWithNameCount = statsCount + 1; - StatSlot[] statsWithName = new StatSlot[statsWithNameCount]; - statsWithName[0] = new StatSlot("Name"); - sysStatSlots.CopyTo(statsWithName, 1); - DataTable dt = new DataTable(); - DataGridView statsGrid = CreateDataGridView(); - statsGrid.DataSource = dt; - int columnWidth = statsGrid.Width / (statsCount + NAME_COL_WIDTH_MULTIPLIER); - - for (int i = 0; i < statsWithNameCount; i++) - { - StatSlot stat = statsWithName[i]; - string slotName = stat.Name; - statsGrid.Columns.Add(CreateStatColumn(slotName, columnWidth)); - dt.Columns.Add(CreateDataColumn(slotName)); - } - - int otherStatsWidth = statsCount * columnWidth; - SetNameColumnWidth(statsGrid, otherStatsWidth); - - return statsGrid; - } - - private static DataGridViewColumn CreateStatColumn(string slotName, int columnWidth) - { - DataGridViewColumn col = new DataGridViewTextBoxColumn(); - col.Width = columnWidth; - col.Name = slotName; - col.HeaderText = slotName; - col.DataPropertyName = slotName; - col.SortMode = DataGridViewColumnSortMode.NotSortable; - col.CellTemplate = new StatsDataGridViewCell(); - return col; - } - - private static void SetNameColumnWidth(DataGridView statsGrid, int otherStatsWidth) - { - - DataGridViewColumn nameColumn = statsGrid.Columns[0]; - nameColumn.HeaderText = Translation.GetTranslation("StatLineName", "name"); - nameColumn.Width = statsGrid.Width - otherStatsWidth; - } - - private static DataColumn CreateDataColumn(string slotName) - { - log.DebugFormat("Create column {0}", slotName); - DataColumn tempCol = new DataColumn(slotName, typeof(Stat)); - return tempCol; - } - - public DataGridView CreateDataGridView() - { - log.Debug("Create DataGridView widget"); - DataGridView statsGrid = new DataGridView(); - statsGrid.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - statsGrid.CausesValidation = false; - statsGrid.ReadOnly = true; - statsGrid.RowHeadersVisible = false; - statsGrid.Size = new System.Drawing.Size(600, 88); - statsGrid.TabStop = false; - statsGrid.AllowUserToAddRows = false; - statsGrid.ScrollBars = ScrollBars.None; - statsGrid.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; - statsGrid.BorderStyle = BorderStyle.None; - statsGrid.BackgroundColor = SystemColors.Control; - statsGrid.RowsAdded += new DataGridViewRowsAddedEventHandler(statsGrid_RowsAdded); - statsPanel.Controls.Add(statsGrid); - statsGrid.Width = statsPanel.Width - (int)Math.Round(SystemInformation.VerticalScrollBarWidth * 1.4); - return statsGrid; - } - - private void statsGrid_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e) - { - if (sender is DataGridView) - { - SetGridHeight((DataGridView)sender); - } - } - - private static void SetGridHeight(DataGridView statsGrid) - { - DataGridViewRowCollection rows = statsGrid.Rows; - statsGrid.Height = statsGrid.Columns[0].HeaderCell.Size.Height + (rows.Count * rows[0].Height); - log.DebugFormat("Set height to {0} for grid of {1} rows", statsGrid.Height, rows.Count); - } - - private void SetWeapons() - { - foreach (UnitEquipmentItem item in unit.GetEquipment()) - { - equipmentList.Items.Add(GetEquipmentChoice(item)); - } - } - - private UnitEquipmentChoice GetEquipmentChoice(UnitEquipmentItem item) - { - UnitEquipmentChoice choice = null; - equipmentChoices.TryGetValue(item, out choice); - - if (choice == null) - { - choice = new UnitEquipmentChoice(Unit, item); - equipmentChoices[item] = choice; - } - - return choice; - } - - /// - /// Clean up any resources being used. - /// - protected override void Dispose(bool disposing) - { - //remove our leave events so that disposing doesn't trigger them - tbUnitName.Leave -= new System.EventHandler(this.tbUnitName_Leave); - unitSize.Leave -= new System.EventHandler(this.unitSize_Leave); - - if (disposing) - { - if (components != null) - { - components.Dispose(); - } - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.tbUnitName = new System.Windows.Forms.TextBox(); - this.unitSize = new System.Windows.Forms.NumericUpDown(); - this.lblUnitSize = new IBBoard.Windows.Forms.IBBLabel(); - this.lblEquip = new IBBoard.Windows.Forms.IBBLabel(); - this.bttnAddWeapon = new IBBoard.Windows.Forms.IBBButton(); - this.bttnRemoveWeapon = new IBBoard.Windows.Forms.IBBButton(); - this.equipmentList = new System.Windows.Forms.ListBox(); - this.bttnReplaceWeapon = new IBBoard.Windows.Forms.IBBButton(); - this.bttnEditWeapon = new IBBoard.Windows.Forms.IBBButton(); - this.lblPoints = new System.Windows.Forms.Label(); - this.lblNotes = new IBBoard.Windows.Forms.IBBLabel(); - this.notes = new System.Windows.Forms.TextBox(); - this.abilitiesList = new System.Windows.Forms.ListBox(); - this.lblAbilities = new IBBoard.Windows.Forms.IBBLabel(); - this.statsPanel = new System.Windows.Forms.FlowLayoutPanel(); - ((System.ComponentModel.ISupportInitialize)(this.unitSize)).BeginInit(); - this.SuspendLayout(); - // - // tbUnitName - // - this.tbUnitName.Location = new System.Drawing.Point(8, 8); - this.tbUnitName.Name = "tbUnitName"; - this.tbUnitName.Size = new System.Drawing.Size(344, 20); - this.tbUnitName.TabIndex = 1; - this.tbUnitName.KeyDown += new System.Windows.Forms.KeyEventHandler(this.tbUnitName_KeyDown); - this.tbUnitName.Leave += new System.EventHandler(this.tbUnitName_Leave); - // - // unitSize - // - this.unitSize.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.unitSize.Location = new System.Drawing.Point(528, 8); - this.unitSize.Name = "unitSize"; - this.unitSize.Size = new System.Drawing.Size(80, 20); - this.unitSize.TabIndex = 1; - this.unitSize.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; - this.unitSize.Value = new decimal(new int[] { - 1, - 0, - 0, - 0}); - this.unitSize.Leave += new System.EventHandler(this.unitSize_Leave); - this.unitSize.KeyDown += new System.Windows.Forms.KeyEventHandler(this.unitSize_KeyDown); - // - // lblUnitSize - // - this.lblUnitSize.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.lblUnitSize.Location = new System.Drawing.Point(426, 8); - this.lblUnitSize.Name = "lblUnitSize"; - this.lblUnitSize.Size = new System.Drawing.Size(98, 23); - this.lblUnitSize.TabIndex = 0; - this.lblUnitSize.Text = "unit size"; - this.lblUnitSize.TextAlign = System.Drawing.ContentAlignment.TopRight; - // - // lblEquip - // - this.lblEquip.Location = new System.Drawing.Point(15, 126); - this.lblEquip.Name = "lblEquip"; - this.lblEquip.Size = new System.Drawing.Size(81, 108); - this.lblEquip.TabIndex = 3; - this.lblEquip.Text = "equipment"; - this.lblEquip.TextAlign = System.Drawing.ContentAlignment.TopRight; - // - // bttnAddWeapon - // - this.bttnAddWeapon.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.bttnAddWeapon.FlatStyle = System.Windows.Forms.FlatStyle.System; - this.bttnAddWeapon.Location = new System.Drawing.Point(516, 126); - this.bttnAddWeapon.Name = "bttnAddWeapon"; - this.bttnAddWeapon.Size = new System.Drawing.Size(88, 22); - this.bttnAddWeapon.TabIndex = 4; - this.bttnAddWeapon.Text = "add"; - this.bttnAddWeapon.Click += new System.EventHandler(this.bttnAddWeapon_Click); - // - // bttnRemoveWeapon - // - this.bttnRemoveWeapon.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.bttnRemoveWeapon.Enabled = false; - this.bttnRemoveWeapon.FlatStyle = System.Windows.Forms.FlatStyle.System; - this.bttnRemoveWeapon.Location = new System.Drawing.Point(516, 210); - this.bttnRemoveWeapon.Name = "bttnRemoveWeapon"; - this.bttnRemoveWeapon.Size = new System.Drawing.Size(88, 22); - this.bttnRemoveWeapon.TabIndex = 5; - this.bttnRemoveWeapon.Text = "remove"; - this.bttnRemoveWeapon.Click += new System.EventHandler(this.bttnRemoveWeapon_Click); - // - // equipmentList - // - this.equipmentList.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.equipmentList.Location = new System.Drawing.Point(102, 126); - this.equipmentList.Name = "equipmentList"; - this.equipmentList.Size = new System.Drawing.Size(408, 108); - this.equipmentList.TabIndex = 6; - this.equipmentList.SelectedIndexChanged += new System.EventHandler(this.equipmentList_SelectedIndexChanged); - this.equipmentList.DoubleClick += new System.EventHandler(this.equipmentList_DoubleClick); - // - // bttnReplaceWeapon - // - this.bttnReplaceWeapon.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.bttnReplaceWeapon.Enabled = false; - this.bttnReplaceWeapon.FlatStyle = System.Windows.Forms.FlatStyle.System; - this.bttnReplaceWeapon.Location = new System.Drawing.Point(516, 182); - this.bttnReplaceWeapon.Name = "bttnReplaceWeapon"; - this.bttnReplaceWeapon.Size = new System.Drawing.Size(88, 22); - this.bttnReplaceWeapon.TabIndex = 10; - this.bttnReplaceWeapon.Text = "replace"; - this.bttnReplaceWeapon.Click += new System.EventHandler(this.bttnReplaceWeapon_Click); - // - // bttnEditWeapon - // - this.bttnEditWeapon.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.bttnEditWeapon.Enabled = false; - this.bttnEditWeapon.FlatStyle = System.Windows.Forms.FlatStyle.System; - this.bttnEditWeapon.Location = new System.Drawing.Point(516, 154); - this.bttnEditWeapon.Name = "bttnEditWeapon"; - this.bttnEditWeapon.Size = new System.Drawing.Size(88, 22); - this.bttnEditWeapon.TabIndex = 11; - this.bttnEditWeapon.Text = "edit"; - this.bttnEditWeapon.Click += new System.EventHandler(this.bttnEditWeapon_Click); - // - // lblPoints - // - this.lblPoints.Location = new System.Drawing.Point(358, 8); - this.lblPoints.Name = "lblPoints"; - this.lblPoints.Size = new System.Drawing.Size(77, 21); - this.lblPoints.TabIndex = 12; - this.lblPoints.Text = "(points)"; - // - // lblNotes - // - this.lblNotes.Location = new System.Drawing.Point(13, 317); - this.lblNotes.Name = "lblNotes"; - this.lblNotes.Size = new System.Drawing.Size(84, 62); - this.lblNotes.TabIndex = 13; - this.lblNotes.Text = "notes"; - this.lblNotes.TextAlign = System.Drawing.ContentAlignment.TopRight; - // - // notes - // - this.notes.Location = new System.Drawing.Point(102, 317); - this.notes.Multiline = true; - this.notes.Name = "notes"; - this.notes.ReadOnly = true; - this.notes.Size = new System.Drawing.Size(408, 62); - this.notes.TabIndex = 14; - // - // abilitiesList - // - this.abilitiesList.FormattingEnabled = true; - this.abilitiesList.Location = new System.Drawing.Point(102, 240); - this.abilitiesList.Name = "abilitiesList"; - this.abilitiesList.Size = new System.Drawing.Size(408, 69); - this.abilitiesList.TabIndex = 15; - // - // lblAbilities - // - this.lblAbilities.Location = new System.Drawing.Point(13, 240); - this.lblAbilities.Name = "lblAbilities"; - this.lblAbilities.Size = new System.Drawing.Size(84, 62); - this.lblAbilities.TabIndex = 16; - this.lblAbilities.Text = "abilities"; - this.lblAbilities.TextAlign = System.Drawing.ContentAlignment.TopRight; - // - // statsPanel - // - this.statsPanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.statsPanel.AutoScroll = true; - this.statsPanel.Location = new System.Drawing.Point(8, 35); - this.statsPanel.Name = "statsPanel"; - this.statsPanel.Size = new System.Drawing.Size(600, 85); - this.statsPanel.TabIndex = 17; - // - // FrmUnit - // - this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); - this.ClientSize = new System.Drawing.Size(616, 391); - this.Controls.Add(this.statsPanel); - this.Controls.Add(this.lblAbilities); - this.Controls.Add(this.abilitiesList); - this.Controls.Add(this.notes); - this.Controls.Add(this.lblNotes); - this.Controls.Add(this.lblPoints); - this.Controls.Add(this.bttnEditWeapon); - this.Controls.Add(this.bttnReplaceWeapon); - this.Controls.Add(this.equipmentList); - this.Controls.Add(this.bttnRemoveWeapon); - this.Controls.Add(this.bttnAddWeapon); - this.Controls.Add(this.lblEquip); - this.Controls.Add(this.lblUnitSize); - this.Controls.Add(this.unitSize); - this.Controls.Add(this.tbUnitName); - this.Name = "FrmUnit"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.Text = "FrmUnit"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmUnit_FormClosing); - ((System.ComponentModel.ISupportInitialize)(this.unitSize)).EndInit(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - #endregion - - public Unit Unit - { - get { return unit; } - } - - private void tbUnitName_Leave(object sender, System.EventArgs e) - { - UpdateUnitName(); - } - - private void tbUnitName_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) - { - if (e.KeyCode == Keys.Enter) - { - UpdateUnitName(); - } - } - - private void UpdateUnitName() - { - if (unit.Name != tbUnitName.Text) - { - commandStack.Execute(new SetNameCommand(unit, tbUnitName.Text)); - } - } - - private void unitSize_Leave(object sender, System.EventArgs e) - { - UpdateUnitSize(); - } - - private void unitSize_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) - { - if (e.KeyCode == Keys.Enter) - { - UpdateUnitSize(); - } - } - - private void UpdateUnitSize() - { - if (unit.Size != unitSize.Value) - { - commandStack.Execute(new SetUnitSizeCommand(unit, (int) unitSize.Value)); - } - } - - private void unit_NameChanged(WarFoundryObject obj, string oldValue, string newValue) - { - if (obj is Unit && obj.Equals(unit)) - { - SetUnitName(); - } - } - - private void unit_UnitSizeChanged(WarFoundryObject obj, int oldValue, int newValue) - { - if (obj is Unit && obj.Equals(unit)) - { - unitSize.Value = newValue; - } - } - - private void RefreshUnitEquipment() - { - foreach (UnitEquipmentChoice choice in equipmentChoices.Values) - { - SetEquipmentListValue(choice); - } - } - - private void equipmentList_SelectedIndexChanged(object sender, System.EventArgs e) - { - SetButtonsEnabledState(); - } - - private void SetButtonsEnabledState() - { - - UnitEquipmentItem equipItem = GetSelectedUnitEquipmentItem(); - bttnReplaceWeapon.Enabled = (equipItem != null && equipItem.HasAlternatives()); - bttnEditWeapon.Enabled = (equipItem != null); - bttnRemoveWeapon.Enabled = (equipItem != null && !equipItem.IsRequired); - } - - private void unit_UnitEquipmentAmountChanged(WarFoundryObject obj, double oldValue, double newValue) - { - if (obj is UnitEquipmentItem) - { - UnitEquipmentItem equip = (UnitEquipmentItem) obj; - UnitEquipmentChoice equipChoice = GetEquipmentChoice(equip); - - if (newValue == 0) - { - equipmentList.Items.Remove(equipChoice); - } - else - { - SetEquipmentListValue(equipChoice); - } - } - } - - private void SetEquipmentListValue(UnitEquipmentChoice equipChoice) - { - int idx = equipmentList.Items.IndexOf(equipChoice); - - if (idx > -1) - { - equipmentList.Items[idx] = equipChoice; - } - else - { - equipmentList.Items.Add(equipChoice); - } - } - - private void EditWeapon() - { - UnitEquipmentItem item = GetSelectedUnitEquipmentItem(); - - if (item != null) - { - FrmEditUnitEquipment editEquip = new FrmEditUnitEquipment(Unit, item, commandStack); - editEquip.ShowDialog(this); - } - } - - private UnitEquipmentItem GetSelectedUnitEquipmentItem() - { - UnitEquipmentChoice selectedItem = GetSelectedUnitEquipmentChoice(); - UnitEquipmentItem equipItem = null; - - if (selectedItem!=null) - { - equipItem = selectedItem.Item; - } - - return equipItem; - } - - private UnitEquipmentChoice GetSelectedUnitEquipmentChoice() - { - return (UnitEquipmentChoice) equipmentList.SelectedItem; - } - - private void bttnEditWeapon_Click(object sender, System.EventArgs e) - { - EditWeapon(); - } - - private void equipmentList_DoubleClick(object sender, System.EventArgs e) - { - EditWeapon(); - } - - private void AddWeapon() - { - FrmNewUnitEquipment newEquip = new FrmNewUnitEquipment(Unit, commandStack); - newEquip.ShowDialog(this); - } - - private void bttnAddWeapon_Click(object sender, System.EventArgs e) - { - AddWeapon(); - } - - private void RemoveWeapon() - { - commandStack.Execute(new SetUnitEquipmentNumericAmountCommand(unit, GetSelectedUnitEquipmentItem(), 0)); - } - - private void bttnRemoveWeapon_Click(object sender, System.EventArgs e) - { - RemoveWeapon(); - } - - private void bttnReplaceWeapon_Click(object sender, System.EventArgs e) - { - FrmReplaceUnitEquipment replace = new FrmReplaceUnitEquipment(unit, GetSelectedUnitEquipmentItem(), commandStack); - replace.ShowDialog(this); - } - - private void FrmUnit_FormClosing(object sender, FormClosingEventArgs e) - { - UpdateUnitName(); - UpdateUnitSize(); - } - } +// This file (FrmUnit.cs) is a part of the IBBoard.WarFoundry.GUI.WinForms project and is copyright 2007, 2008, 2009 IBBoard. +// +// The file and the library/program it is in are licensed and distributed, without warranty, under the GNU Affero GPL license, either version 3 of the License or (at your option) any later version. Please see COPYING for more information and the full license. + +using System; +using System.Drawing; +using System.Data; +using System.Collections.Generic; +using System.ComponentModel; +using System.Windows.Forms; +using IBBoard.Commands; +using IBBoard.Lang; +using IBBoard.Windows.Forms; +using IBBoard.Windows.Forms.I18N; +using IBBoard.WarFoundry.API; +using IBBoard.WarFoundry.API.Commands; +using IBBoard.WarFoundry.API.Objects; +using IBBoard.WarFoundry.GUI.WinForms.UI; +using IBBoard.WarFoundry.GUI.WinForms.Util; +using log4net; + +namespace IBBoard.WarFoundry.GUI.WinForms +{ + /// + /// Summary description for FrmUnit. + /// + public class FrmUnit : IBBoard.Windows.Forms.IBBForm + { + private static readonly ILog log = LogManager.GetLogger(typeof(FrmUnit)); + private static readonly int BORDER_WIDTH = 1; + private static readonly int NAME_COL_WIDTH_MULTIPLIER = 3; + private Unit unit; + private Dictionary equipmentChoices = new Dictionary(); + private Dictionary DataGridViews = new Dictionary(); + private CommandStack commandStack; + private System.Windows.Forms.TextBox tbUnitName; + private System.Windows.Forms.NumericUpDown unitSize; + private IBBLabel lblUnitSize; + private IBBButton bttnAddWeapon; + private IBBButton bttnRemoveWeapon; + private IBBLabel lblEquip; + private System.Windows.Forms.ListBox equipmentList; + private IBBButton bttnReplaceWeapon; + private IBBButton bttnEditWeapon; + private Label lblPoints; + private IBBLabel lblNotes; + private TextBox notes; + private ListBox abilitiesList; + private IBBLabel lblAbilities; + private FlowLayoutPanel statsPanel; + /// + /// Required designer variable. + /// + private System.ComponentModel.Container components = null; + + public FrmUnit(Unit toDisplay, CommandStack cmdStack) + { + unit = toDisplay; + commandStack = cmdStack; + // + // Required for Windows Form Designer support + // + InitializeComponent(); + TranslateForm(); + Translation.TranslationChanged += new MethodInvoker(TranslateForm); + unit.NameChanged += new StringValChangedDelegate(unit_NameChanged); + unit.UnitSizeChanged += new IntValChangedDelegate(unit_UnitSizeChanged); + unit.UnitEquipmentAmountChanged += new DoubleValChangedDelegate(unit_UnitEquipmentAmountChanged); + unit.PointsValueChanged += new DoubleValChangedDelegate(unit_PointsValueChanged); + + unitSize.Value = unit.Size; + unitSize.Maximum = (unit.UnitType.MaxSize == WarFoundryCore.INFINITY ? int.MaxValue : unit.UnitType.MaxSize); + unitSize.Minimum = unit.UnitType.MinSize; + unitSize.Enabled = (unitSize.Maximum != unitSize.Minimum); + + notes.Text = unit.UnitType.Notes; + abilitiesList.DataSource = new List(unit.UnitType.GetRequiredAbilities()); + abilitiesList.DisplayMember = "Name"; + SetPointsValueText(); + SetStats(); + SetWeapons(); + } + + private void TranslateForm() + { + ControlTranslator.TranslateControl(this); + SetUnitName(); + RefreshUnitEquipment(); + } + + private void SetUnitName() + { + tbUnitName.Text = unit.Name; + Text = Translation.GetTranslation("FrmUnit", "{0} ({1})", unit.Name, unit.UnitType.Name); + } + + void unit_PointsValueChanged(WarFoundryObject obj, double oldValue, double newValue) + { + SetPointsValueText(); + } + + private void SetPointsValueText() + { + lblPoints.Text = "(" + unit.Points + " pts)"; + } + + private void SetStats() + { + 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 < statsCount; i++) + { + DataGridView statsGrid = GetDataGridView(statsIDs[i]); + DataTable dt = (DataTable)statsGrid.DataSource; + DataRow dr = dt.NewRow(); + dr.ItemArray = stats[i]; + log.DebugFormat("Add row to data table for {0}", statsIDs[i]); + dt.Rows.Add(dr); + statsGrid.ClearSelection(); + } + } + + private DataGridView GetDataGridView(string statsID) + { + DataGridView grid; + + if (DataGridViews.ContainsKey(statsID)) + { + grid = DictionaryUtils.GetValue(DataGridViews, statsID); + } + else + { + grid = CreateDataGridView(statsID); + DataGridViews[statsID] = grid; + } + + return grid; + } + + private DataGridView CreateDataGridView(string statsID) + { + log.DebugFormat("Create DataGridView for stats ID {0}", statsID); + SystemStats sysStats = unit.Race.GameSystem.GetSystemStatsForID(statsID); + StatSlot[] sysStatSlots = sysStats.StatSlots; + int statsCount = sysStatSlots.Length; + int statsWithNameCount = statsCount + 1; + StatSlot[] statsWithName = new StatSlot[statsWithNameCount]; + statsWithName[0] = new StatSlot("Name"); + sysStatSlots.CopyTo(statsWithName, 1); + DataTable dt = new DataTable(); + DataGridView statsGrid = CreateDataGridView(); + statsGrid.DataSource = dt; + int columnWidth = statsGrid.Width / (statsCount + NAME_COL_WIDTH_MULTIPLIER); + + for (int i = 0; i < statsWithNameCount; i++) + { + StatSlot stat = statsWithName[i]; + string slotName = stat.Name; + statsGrid.Columns.Add(CreateStatColumn(slotName, columnWidth)); + dt.Columns.Add(CreateDataColumn(slotName)); + } + + int otherStatsWidth = statsCount * columnWidth; + SetNameColumnWidth(statsGrid, otherStatsWidth); + + return statsGrid; + } + + private static DataGridViewColumn CreateStatColumn(string slotName, int columnWidth) + { + DataGridViewColumn col = new DataGridViewTextBoxColumn(); + col.Width = columnWidth; + col.Name = slotName; + col.HeaderText = slotName; + col.DataPropertyName = slotName; + col.SortMode = DataGridViewColumnSortMode.NotSortable; + col.CellTemplate = new StatsDataGridViewCell(); + col.HeaderCell.Style.WrapMode = DataGridViewTriState.False; + return col; + } + + private static void SetNameColumnWidth(DataGridView statsGrid, int otherStatsWidth) + { + + DataGridViewColumn nameColumn = statsGrid.Columns[0]; + nameColumn.HeaderText = Translation.GetTranslation("StatLineName", "name"); + nameColumn.Width = statsGrid.Width - otherStatsWidth; + } + + private static DataColumn CreateDataColumn(string slotName) + { + log.DebugFormat("Create column {0}", slotName); + DataColumn tempCol = new DataColumn(slotName, typeof(Stat)); + return tempCol; + } + + public DataGridView CreateDataGridView() + { + log.Debug("Create DataGridView widget"); + DataGridView statsGrid = new DataGridView(); + statsGrid.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + statsGrid.CausesValidation = false; + statsGrid.ReadOnly = true; + statsGrid.RowHeadersVisible = false; + statsGrid.Size = new System.Drawing.Size(600, 88); + statsGrid.TabStop = false; + statsGrid.AllowUserToAddRows = false; + statsGrid.ScrollBars = ScrollBars.None; + statsGrid.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing; + statsGrid.BorderStyle = BorderStyle.None; + statsGrid.BackgroundColor = SystemColors.Control; + statsGrid.RowsAdded += new DataGridViewRowsAddedEventHandler(statsGrid_RowsAdded); + statsPanel.Controls.Add(statsGrid); + statsGrid.Width = statsPanel.Width - (int)Math.Round(SystemInformation.VerticalScrollBarWidth * 1.4); + return statsGrid; + } + + private void statsGrid_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e) + { + if (sender is DataGridView) + { + SetGridHeight((DataGridView)sender); + } + } + + private static void SetGridHeight(DataGridView statsGrid) + { + DataGridViewRowCollection rows = statsGrid.Rows; + statsGrid.Height = statsGrid.Columns[0].HeaderCell.Size.Height + (rows.Count * rows[0].Height); + log.DebugFormat("Set height to {0} for grid of {1} rows", statsGrid.Height, rows.Count); + } + + private void SetWeapons() + { + foreach (UnitEquipmentItem item in unit.GetEquipment()) + { + equipmentList.Items.Add(GetEquipmentChoice(item)); + } + } + + private UnitEquipmentChoice GetEquipmentChoice(UnitEquipmentItem item) + { + UnitEquipmentChoice choice = null; + equipmentChoices.TryGetValue(item, out choice); + + if (choice == null) + { + choice = new UnitEquipmentChoice(Unit, item); + equipmentChoices[item] = choice; + } + + return choice; + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose(bool disposing) + { + //remove our leave events so that disposing doesn't trigger them + tbUnitName.Leave -= new System.EventHandler(this.tbUnitName_Leave); + unitSize.Leave -= new System.EventHandler(this.unitSize_Leave); + + if (disposing) + { + if (components != null) + { + components.Dispose(); + } + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.tbUnitName = new System.Windows.Forms.TextBox(); + this.unitSize = new System.Windows.Forms.NumericUpDown(); + this.lblUnitSize = new IBBoard.Windows.Forms.IBBLabel(); + this.lblEquip = new IBBoard.Windows.Forms.IBBLabel(); + this.bttnAddWeapon = new IBBoard.Windows.Forms.IBBButton(); + this.bttnRemoveWeapon = new IBBoard.Windows.Forms.IBBButton(); + this.equipmentList = new System.Windows.Forms.ListBox(); + this.bttnReplaceWeapon = new IBBoard.Windows.Forms.IBBButton(); + this.bttnEditWeapon = new IBBoard.Windows.Forms.IBBButton(); + this.lblPoints = new System.Windows.Forms.Label(); + this.lblNotes = new IBBoard.Windows.Forms.IBBLabel(); + this.notes = new System.Windows.Forms.TextBox(); + this.abilitiesList = new System.Windows.Forms.ListBox(); + this.lblAbilities = new IBBoard.Windows.Forms.IBBLabel(); + this.statsPanel = new System.Windows.Forms.FlowLayoutPanel(); + ((System.ComponentModel.ISupportInitialize)(this.unitSize)).BeginInit(); + this.SuspendLayout(); + // + // tbUnitName + // + this.tbUnitName.Location = new System.Drawing.Point(8, 8); + this.tbUnitName.Name = "tbUnitName"; + this.tbUnitName.Size = new System.Drawing.Size(344, 20); + this.tbUnitName.TabIndex = 1; + this.tbUnitName.KeyDown += new System.Windows.Forms.KeyEventHandler(this.tbUnitName_KeyDown); + this.tbUnitName.Leave += new System.EventHandler(this.tbUnitName_Leave); + // + // unitSize + // + this.unitSize.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.unitSize.Location = new System.Drawing.Point(528, 8); + this.unitSize.Name = "unitSize"; + this.unitSize.Size = new System.Drawing.Size(80, 20); + this.unitSize.TabIndex = 1; + this.unitSize.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + this.unitSize.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.unitSize.Leave += new System.EventHandler(this.unitSize_Leave); + this.unitSize.KeyDown += new System.Windows.Forms.KeyEventHandler(this.unitSize_KeyDown); + // + // lblUnitSize + // + this.lblUnitSize.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.lblUnitSize.Location = new System.Drawing.Point(426, 8); + this.lblUnitSize.Name = "lblUnitSize"; + this.lblUnitSize.Size = new System.Drawing.Size(98, 23); + this.lblUnitSize.TabIndex = 0; + this.lblUnitSize.Text = "unit size"; + this.lblUnitSize.TextAlign = System.Drawing.ContentAlignment.TopRight; + // + // lblEquip + // + this.lblEquip.Location = new System.Drawing.Point(15, 126); + this.lblEquip.Name = "lblEquip"; + this.lblEquip.Size = new System.Drawing.Size(81, 108); + this.lblEquip.TabIndex = 3; + this.lblEquip.Text = "equipment"; + this.lblEquip.TextAlign = System.Drawing.ContentAlignment.TopRight; + // + // bttnAddWeapon + // + this.bttnAddWeapon.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.bttnAddWeapon.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.bttnAddWeapon.Location = new System.Drawing.Point(516, 126); + this.bttnAddWeapon.Name = "bttnAddWeapon"; + this.bttnAddWeapon.Size = new System.Drawing.Size(88, 22); + this.bttnAddWeapon.TabIndex = 4; + this.bttnAddWeapon.Text = "add"; + this.bttnAddWeapon.Click += new System.EventHandler(this.bttnAddWeapon_Click); + // + // bttnRemoveWeapon + // + this.bttnRemoveWeapon.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.bttnRemoveWeapon.Enabled = false; + this.bttnRemoveWeapon.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.bttnRemoveWeapon.Location = new System.Drawing.Point(516, 210); + this.bttnRemoveWeapon.Name = "bttnRemoveWeapon"; + this.bttnRemoveWeapon.Size = new System.Drawing.Size(88, 22); + this.bttnRemoveWeapon.TabIndex = 5; + this.bttnRemoveWeapon.Text = "remove"; + this.bttnRemoveWeapon.Click += new System.EventHandler(this.bttnRemoveWeapon_Click); + // + // equipmentList + // + this.equipmentList.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.equipmentList.Location = new System.Drawing.Point(102, 126); + this.equipmentList.Name = "equipmentList"; + this.equipmentList.Size = new System.Drawing.Size(408, 108); + this.equipmentList.TabIndex = 6; + this.equipmentList.SelectedIndexChanged += new System.EventHandler(this.equipmentList_SelectedIndexChanged); + this.equipmentList.DoubleClick += new System.EventHandler(this.equipmentList_DoubleClick); + // + // bttnReplaceWeapon + // + this.bttnReplaceWeapon.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.bttnReplaceWeapon.Enabled = false; + this.bttnReplaceWeapon.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.bttnReplaceWeapon.Location = new System.Drawing.Point(516, 182); + this.bttnReplaceWeapon.Name = "bttnReplaceWeapon"; + this.bttnReplaceWeapon.Size = new System.Drawing.Size(88, 22); + this.bttnReplaceWeapon.TabIndex = 10; + this.bttnReplaceWeapon.Text = "replace"; + this.bttnReplaceWeapon.Click += new System.EventHandler(this.bttnReplaceWeapon_Click); + // + // bttnEditWeapon + // + this.bttnEditWeapon.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.bttnEditWeapon.Enabled = false; + this.bttnEditWeapon.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.bttnEditWeapon.Location = new System.Drawing.Point(516, 154); + this.bttnEditWeapon.Name = "bttnEditWeapon"; + this.bttnEditWeapon.Size = new System.Drawing.Size(88, 22); + this.bttnEditWeapon.TabIndex = 11; + this.bttnEditWeapon.Text = "edit"; + this.bttnEditWeapon.Click += new System.EventHandler(this.bttnEditWeapon_Click); + // + // lblPoints + // + this.lblPoints.Location = new System.Drawing.Point(358, 8); + this.lblPoints.Name = "lblPoints"; + this.lblPoints.Size = new System.Drawing.Size(77, 21); + this.lblPoints.TabIndex = 12; + this.lblPoints.Text = "(points)"; + // + // lblNotes + // + this.lblNotes.Location = new System.Drawing.Point(13, 317); + this.lblNotes.Name = "lblNotes"; + this.lblNotes.Size = new System.Drawing.Size(84, 62); + this.lblNotes.TabIndex = 13; + this.lblNotes.Text = "notes"; + this.lblNotes.TextAlign = System.Drawing.ContentAlignment.TopRight; + // + // notes + // + this.notes.Location = new System.Drawing.Point(102, 317); + this.notes.Multiline = true; + this.notes.Name = "notes"; + this.notes.ReadOnly = true; + this.notes.Size = new System.Drawing.Size(408, 62); + this.notes.TabIndex = 14; + // + // abilitiesList + // + this.abilitiesList.FormattingEnabled = true; + this.abilitiesList.Location = new System.Drawing.Point(102, 240); + this.abilitiesList.Name = "abilitiesList"; + this.abilitiesList.Size = new System.Drawing.Size(408, 69); + this.abilitiesList.TabIndex = 15; + // + // lblAbilities + // + this.lblAbilities.Location = new System.Drawing.Point(13, 240); + this.lblAbilities.Name = "lblAbilities"; + this.lblAbilities.Size = new System.Drawing.Size(84, 62); + this.lblAbilities.TabIndex = 16; + this.lblAbilities.Text = "abilities"; + this.lblAbilities.TextAlign = System.Drawing.ContentAlignment.TopRight; + // + // statsPanel + // + this.statsPanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.statsPanel.AutoScroll = true; + this.statsPanel.Location = new System.Drawing.Point(8, 35); + this.statsPanel.Name = "statsPanel"; + this.statsPanel.Size = new System.Drawing.Size(600, 85); + this.statsPanel.TabIndex = 17; + // + // FrmUnit + // + this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); + this.ClientSize = new System.Drawing.Size(616, 391); + this.Controls.Add(this.statsPanel); + this.Controls.Add(this.lblAbilities); + this.Controls.Add(this.abilitiesList); + this.Controls.Add(this.notes); + this.Controls.Add(this.lblNotes); + this.Controls.Add(this.lblPoints); + this.Controls.Add(this.bttnEditWeapon); + this.Controls.Add(this.bttnReplaceWeapon); + this.Controls.Add(this.equipmentList); + this.Controls.Add(this.bttnRemoveWeapon); + this.Controls.Add(this.bttnAddWeapon); + this.Controls.Add(this.lblEquip); + this.Controls.Add(this.lblUnitSize); + this.Controls.Add(this.unitSize); + this.Controls.Add(this.tbUnitName); + this.Name = "FrmUnit"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.Text = "FrmUnit"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmUnit_FormClosing); + ((System.ComponentModel.ISupportInitialize)(this.unitSize)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + #endregion + + public Unit Unit + { + get { return unit; } + } + + private void tbUnitName_Leave(object sender, System.EventArgs e) + { + UpdateUnitName(); + } + + private void tbUnitName_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + UpdateUnitName(); + } + } + + private void UpdateUnitName() + { + if (unit.Name != tbUnitName.Text) + { + commandStack.Execute(new SetNameCommand(unit, tbUnitName.Text)); + } + } + + private void unitSize_Leave(object sender, System.EventArgs e) + { + UpdateUnitSize(); + } + + private void unitSize_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + UpdateUnitSize(); + } + } + + private void UpdateUnitSize() + { + if (unit.Size != unitSize.Value) + { + commandStack.Execute(new SetUnitSizeCommand(unit, (int) unitSize.Value)); + } + } + + private void unit_NameChanged(WarFoundryObject obj, string oldValue, string newValue) + { + if (obj is Unit && obj.Equals(unit)) + { + SetUnitName(); + } + } + + private void unit_UnitSizeChanged(WarFoundryObject obj, int oldValue, int newValue) + { + if (obj is Unit && obj.Equals(unit)) + { + unitSize.Value = newValue; + } + } + + private void RefreshUnitEquipment() + { + foreach (UnitEquipmentChoice choice in equipmentChoices.Values) + { + SetEquipmentListValue(choice); + } + } + + private void equipmentList_SelectedIndexChanged(object sender, System.EventArgs e) + { + SetButtonsEnabledState(); + } + + private void SetButtonsEnabledState() + { + + UnitEquipmentItem equipItem = GetSelectedUnitEquipmentItem(); + bttnReplaceWeapon.Enabled = (equipItem != null && equipItem.HasAlternatives()); + bttnEditWeapon.Enabled = (equipItem != null); + bttnRemoveWeapon.Enabled = (equipItem != null && !equipItem.IsRequired); + } + + private void unit_UnitEquipmentAmountChanged(WarFoundryObject obj, double oldValue, double newValue) + { + if (obj is UnitEquipmentItem) + { + UnitEquipmentItem equip = (UnitEquipmentItem) obj; + UnitEquipmentChoice equipChoice = GetEquipmentChoice(equip); + + if (newValue == 0) + { + equipmentList.Items.Remove(equipChoice); + } + else + { + SetEquipmentListValue(equipChoice); + } + } + } + + private void SetEquipmentListValue(UnitEquipmentChoice equipChoice) + { + int idx = equipmentList.Items.IndexOf(equipChoice); + + if (idx > -1) + { + equipmentList.Items[idx] = equipChoice; + } + else + { + equipmentList.Items.Add(equipChoice); + } + } + + private void EditWeapon() + { + UnitEquipmentItem item = GetSelectedUnitEquipmentItem(); + + if (item != null) + { + FrmEditUnitEquipment editEquip = new FrmEditUnitEquipment(Unit, item, commandStack); + editEquip.ShowDialog(this); + } + } + + private UnitEquipmentItem GetSelectedUnitEquipmentItem() + { + UnitEquipmentChoice selectedItem = GetSelectedUnitEquipmentChoice(); + UnitEquipmentItem equipItem = null; + + if (selectedItem!=null) + { + equipItem = selectedItem.Item; + } + + return equipItem; + } + + private UnitEquipmentChoice GetSelectedUnitEquipmentChoice() + { + return (UnitEquipmentChoice) equipmentList.SelectedItem; + } + + private void bttnEditWeapon_Click(object sender, System.EventArgs e) + { + EditWeapon(); + } + + private void equipmentList_DoubleClick(object sender, System.EventArgs e) + { + EditWeapon(); + } + + private void AddWeapon() + { + FrmNewUnitEquipment newEquip = new FrmNewUnitEquipment(Unit, commandStack); + newEquip.ShowDialog(this); + } + + private void bttnAddWeapon_Click(object sender, System.EventArgs e) + { + AddWeapon(); + } + + private void RemoveWeapon() + { + commandStack.Execute(new SetUnitEquipmentNumericAmountCommand(unit, GetSelectedUnitEquipmentItem(), 0)); + } + + private void bttnRemoveWeapon_Click(object sender, System.EventArgs e) + { + RemoveWeapon(); + } + + private void bttnReplaceWeapon_Click(object sender, System.EventArgs e) + { + FrmReplaceUnitEquipment replace = new FrmReplaceUnitEquipment(unit, GetSelectedUnitEquipmentItem(), commandStack); + replace.ShowDialog(this); + } + + private void FrmUnit_FormClosing(object sender, FormClosingEventArgs e) + { + UpdateUnitName(); + UpdateUnitSize(); + } + } } \ No newline at end of file