Mercurial > repos > IBBoard.WarFoundry.GUI.WinForms
view FrmUnit.cs @ 88:340e711ca4c3
Re #205: Odd/prime numbers causes a crash
* Resolve crash in call stack by ignoring update events when updating a spinner box
author | IBBoard <dev@ibboard.co.uk> |
---|---|
date | Mon, 02 Nov 2009 20:02:12 +0000 |
parents | 0bb9f40d44eb |
children | e4a8653b9536 |
line wrap: on
line source
// 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; namespace IBBoard.WarFoundry.GUI.WinForms { /// <summary> /// Summary description for FrmUnit. /// </summary> public class FrmUnit : IBBoard.Windows.Forms.IBBForm { private Unit unit; private Dictionary<UnitEquipmentItem, UnitEquipmentChoice> equipmentChoices = new Dictionary<UnitEquipmentItem, UnitEquipmentChoice>(); private CommandStack commandStack; private System.Windows.Forms.DataGrid statsGrid; 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; /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.Container components = null; public FrmUnit(Unit toDisplay, CommandStack cmdStack) { unit = toDisplay; commandStack = cmdStack; // // Required for Windows Form Designer support // InitializeComponent(); ControlTranslator.TranslateControl(this); Text = Translation.GetTranslation("FrmUnit", "{0}", unit.Name); unit.NameChanged += new StringValChangedDelegate(unit_NameChanged); unit.UnitSizeChanged += new IntValChangedDelegate(unit_UnitSizeChanged); unit.UnitEquipmentAmountChanged += new DoubleValChangedDelegate(unit_UnitEquipmentAmountChanged); unit.PointsValueChanged += new DoubleValChangedDelegate(unit_PointsValueChanged); if (unit.UnitType.MaxSize == unit.UnitType.MinSize) { unitSize.Value = unit.UnitType.MaxSize; unitSize.Visible = false; lblUnitSize.Visible = false; } else { unitSize.Value = unit.Size; unitSize.Maximum = (unit.UnitType.MaxSize == WarFoundryCore.INFINITY ? int.MaxValue : unit.UnitType.MaxSize); unitSize.Minimum = unit.UnitType.MinSize; } SetPointsValueText(); SetStats(); SetWeapons(); } void unit_PointsValueChanged(WarFoundryObject obj, double oldValue, double newValue) { SetPointsValueText(); } private void SetPointsValueText() { lblPoints.Text = "(" + unit.Points + " pts)"; } private void SetStats() { DataTable dt = new DataTable(); Stat[] stats = unit.UnitStatsArrayWithName; int statsCount = stats.Length; DataColumn[] dc = new DataColumn[statsCount]; DataGridTableStyle dgStyle = new DataGridTableStyle(); dgStyle.RowHeadersVisible = false; Stat stat = stats[0]; DataColumn tempCol = new DataColumn(stat.ParentSlotName); tempCol.DataType = stat.GetType(); for (int i = 0; i < statsCount; i++) { stat = stats[i]; tempCol = new DataColumn(stat.ParentSlotName); tempCol.DataType = stat.GetType(); dc[i] = tempCol; DataGridColumnStyle colStyle = new StatColumnStyle(); colStyle.Width = 40; colStyle.MappingName = stat.ParentSlotName; colStyle.HeaderText = stat.ParentSlotName; colStyle.Alignment = HorizontalAlignment.Center; colStyle.ReadOnly = true; dgStyle.GridColumnStyles.Add(colStyle); } DataGridColumnStyle nameColStyle = dgStyle.GridColumnStyles[0]; nameColStyle.HeaderText = Translation.GetTranslation("UnitName", "Name"); nameColStyle.Alignment = HorizontalAlignment.Left; nameColStyle.Width = statsGrid.ClientSize.Width - ((stats.Length - 1) * 40) - 4; dt.Columns.AddRange(dc); DataRow dr = dt.NewRow(); dr.ItemArray = stats; dt.Rows.Add(dr); statsGrid.DataSource = dt; statsGrid.TableStyles.Add(dgStyle); } 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; } /// <summary> /// Clean up any resources being used. /// </summary> 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 /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.statsGrid = new System.Windows.Forms.DataGrid(); this.tbUnitName = new System.Windows.Forms.TextBox(); this.unitSize = new System.Windows.Forms.NumericUpDown(); this.lblUnitSize = new IBBLabel(); this.lblEquip = new IBBLabel(); this.bttnAddWeapon = new IBBButton(); this.bttnRemoveWeapon = new IBBButton(); this.equipmentList = new System.Windows.Forms.ListBox(); this.bttnReplaceWeapon = new IBBButton(); this.bttnEditWeapon = new IBBButton(); this.lblPoints = new System.Windows.Forms.Label(); ((System.ComponentModel.ISupportInitialize) (this.statsGrid)).BeginInit(); ((System.ComponentModel.ISupportInitialize) (this.unitSize)).BeginInit(); this.SuspendLayout(); // // statsGrid // this.statsGrid.AllowNavigation = false; this.statsGrid.AllowSorting = false; this.statsGrid.AlternatingBackColor = System.Drawing.SystemColors.Control; this.statsGrid.Anchor = ((System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.statsGrid.BackgroundColor = System.Drawing.SystemColors.Control; this.statsGrid.CaptionVisible = false; this.statsGrid.CausesValidation = false; this.statsGrid.DataMember = ""; this.statsGrid.GridLineColor = System.Drawing.SystemColors.ControlDarkDark; this.statsGrid.HeaderForeColor = System.Drawing.SystemColors.ControlText; this.statsGrid.Location = new System.Drawing.Point(8, 32); this.statsGrid.Name = "statsGrid"; this.statsGrid.PreferredColumnWidth = 40; this.statsGrid.ReadOnly = true; this.statsGrid.RowHeadersVisible = false; this.statsGrid.SelectionBackColor = System.Drawing.SystemColors.Control; this.statsGrid.SelectionForeColor = System.Drawing.SystemColors.WindowText; this.statsGrid.Size = new System.Drawing.Size(600, 88); this.statsGrid.TabIndex = 0; this.statsGrid.TabStop = false; // // 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.Leave += new System.EventHandler(this.tbUnitName_Leave); this.tbUnitName.KeyDown += new System.Windows.Forms.KeyEventHandler(this.tbUnitName_KeyDown); // // 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(452, 8); this.lblUnitSize.Name = "lblUnitSize"; this.lblUnitSize.Size = new System.Drawing.Size(72, 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(8, 123); this.lblEquip.Name = "lblEquip"; this.lblEquip.Size = new System.Drawing.Size(88, 32); 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.DoubleClick += new System.EventHandler(this.equipmentList_DoubleClick); this.equipmentList.SelectedIndexChanged += new System.EventHandler(this.equipmentList_SelectedIndexChanged); // // 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(88, 21); this.lblPoints.TabIndex = 12; this.lblPoints.Text = "(points)"; // // FrmUnit // this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(616, 314); 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.Controls.Add(this.statsGrid); 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.statsGrid)).EndInit(); ((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)) { Unit u = (Unit) obj; tbUnitName.Text = obj.Name; Text = obj.Name; } } private void unit_UnitSizeChanged(WarFoundryObject obj, int oldValue, int newValue) { if (obj is Unit && obj.Equals(unit)) { unitSize.Value = newValue; } } 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 { 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(); } } }