Mercurial > repos > IBBoard.WarFoundry.GUI.WinForms
view FrmUnit.cs @ 25:041f05e56496
Re #90: Stop new units showing up twice
* Pass ArmyCategory to CreateAndAddUnitCommand
author | IBBoard <dev@ibboard.co.uk> |
---|---|
date | Sat, 27 Jun 2009 19:40:29 +0000 |
parents | 7c366fe55635 |
children | 526fefefb16b |
line wrap: on
line source
// This file (FrmUnit.cs) is a part of the IBBoard.WarFoundry.GUI.WinForms project and is copyright 2009 IBBoard. // // The file and the library/program it is in are licensed under the GNU LGPL license, either version 3 of the License or (at your option) any later version. Please see COPYING.LGPL 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.Windows.Forms; using IBBoard.WarFoundry.API; using IBBoard.WarFoundry.API.Commands; using IBBoard.WarFoundry.API.Objects; using IBBoard.WarFoundry.GUI.WinForms.Util; namespace IBBoard.WarFoundry { ///TODO: Separate weapons out into optional and required, where required only has button for replacing /// <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 System.Windows.Forms.Label lblUnitSize; private System.Windows.Forms.Button bttnAddWeapon; private System.Windows.Forms.Button bttnRemoveWeapon; private System.Windows.Forms.Button bttnEditWeapon; private System.Windows.Forms.Label lblRequiredEquip; private System.Windows.Forms.ListBox reqdList; private System.Windows.Forms.ListBox optList; private System.Windows.Forms.Label lblOptionalEquip; private System.Windows.Forms.Button bttnReplaceWeapon; private System.Windows.Forms.Button bttnEditReqdWeapon; /// <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(); tbUnitName.Text = unit.Name; Text = unit.Name; unit.NameChanged+=new StringValChangedDelegate(unit_NameChanged); unit.UnitSizeChanged+= new IntValChangedDelegate(unit_UnitSizeChanged); unit.UnitEquipmentAmountChanged+=new DoubleValChangedDelegate(unit_UnitEquipmentAmountChanged); 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; } SetStats(); SetWeapons(); } private void SetStats() { DataTable dt = new DataTable(); Stat[] stats = unit.UnitStatsArrayWithName; DataColumn[] dc = new DataColumn[stats.Length+1]; dc[0] = new DataColumn("name"); DataGridTableStyle dgStyle = new DataGridTableStyle(); dgStyle.RowHeadersVisible = false; DataGridTextBoxColumn colStyle = new DataGridTextBoxColumn(); colStyle.Width = statsGrid.ClientSize.Width - (stats.Length * 40) - 4; colStyle.MappingName = "name"; colStyle.HeaderText = "name"; colStyle.ReadOnly = true; dgStyle.GridColumnStyles.Add(colStyle); DataColumn tempCol; int i = 1; foreach (Stat stat in stats) { tempCol = new DataColumn(stat.ParentSlotName); dc[i] = tempCol; colStyle = new DataGridTextBoxColumn(); colStyle.Alignment = HorizontalAlignment.Center; colStyle.Width = 40; colStyle.MappingName = stat.ParentSlotName; colStyle.HeaderText = stat.ParentSlotName; colStyle.ReadOnly = true; dgStyle.GridColumnStyles.Add(colStyle); i++; } dt.Columns.AddRange(dc); DataRow dr = dt.NewRow(); dr.ItemArray = unit.UnitStatsArrayWithName; dt.Rows.Add(dr); statsGrid.DataSource = dt; statsGrid.TableStyles.Add(dgStyle); } private void SetWeapons() { foreach(UnitEquipmentItem item in unit.GetEquipment()) { if (item.IsRequired) { reqdList.Items.Add(GetEquipmentChoice(item)); } else { optList.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 System.Windows.Forms.Label(); this.lblRequiredEquip = new System.Windows.Forms.Label(); this.bttnAddWeapon = new System.Windows.Forms.Button(); this.bttnRemoveWeapon = new System.Windows.Forms.Button(); this.reqdList = new System.Windows.Forms.ListBox(); this.bttnEditWeapon = new System.Windows.Forms.Button(); this.optList = new System.Windows.Forms.ListBox(); this.lblOptionalEquip = new System.Windows.Forms.Label(); this.bttnReplaceWeapon = new System.Windows.Forms.Button(); this.bttnEditReqdWeapon = new System.Windows.Forms.Button(); ((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.BackgroundColor = System.Drawing.SystemColors.Control; this.statsGrid.CaptionVisible = 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.Text = ""; this.tbUnitName.KeyDown += new System.Windows.Forms.KeyEventHandler(this.tbUnitName_KeyDown); this.tbUnitName.Leave += new System.EventHandler(this.tbUnitName_Leave); // // unitSize // 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 System.Decimal(new int[] { 1, 0, 0, 0}); this.unitSize.KeyDown += new System.Windows.Forms.KeyEventHandler(this.unitSize_KeyDown); this.unitSize.Leave += new System.EventHandler(this.unitSize_Leave); // // lblUnitSize // this.lblUnitSize.Location = new System.Drawing.Point(424, 8); this.lblUnitSize.Name = "lblUnitSize"; this.lblUnitSize.TabIndex = 0; this.lblUnitSize.Text = "unit size"; this.lblUnitSize.TextAlign = System.Drawing.ContentAlignment.TopRight; // // lblRequiredEquip // this.lblRequiredEquip.Location = new System.Drawing.Point(8, 128); this.lblRequiredEquip.Name = "lblRequiredEquip"; this.lblRequiredEquip.Size = new System.Drawing.Size(88, 32); this.lblRequiredEquip.TabIndex = 3; this.lblRequiredEquip.Text = "reqd equipment"; this.lblRequiredEquip.TextAlign = System.Drawing.ContentAlignment.TopRight; // // bttnAddWeapon // this.bttnAddWeapon.FlatStyle = System.Windows.Forms.FlatStyle.System; this.bttnAddWeapon.Location = new System.Drawing.Point(520, 200); 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.Enabled = false; this.bttnRemoveWeapon.FlatStyle = System.Windows.Forms.FlatStyle.System; this.bttnRemoveWeapon.Location = new System.Drawing.Point(520, 248); 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); // // reqdList // this.reqdList.Location = new System.Drawing.Point(104, 128); this.reqdList.Name = "reqdList"; this.reqdList.Size = new System.Drawing.Size(408, 69); this.reqdList.TabIndex = 6; this.reqdList.DoubleClick += new System.EventHandler(this.reqdList_DoubleClick); this.reqdList.SelectedIndexChanged += new System.EventHandler(this.reqdList_SelectedIndexChanged); // // bttnEditWeapon // this.bttnEditWeapon.Enabled = false; this.bttnEditWeapon.FlatStyle = System.Windows.Forms.FlatStyle.System; this.bttnEditWeapon.Location = new System.Drawing.Point(520, 224); this.bttnEditWeapon.Name = "bttnEditWeapon"; this.bttnEditWeapon.Size = new System.Drawing.Size(88, 22); this.bttnEditWeapon.TabIndex = 7; this.bttnEditWeapon.Text = "edit"; this.bttnEditWeapon.Click += new System.EventHandler(this.bttnEditWeapon_Click); // // optList // this.optList.Location = new System.Drawing.Point(104, 200); this.optList.Name = "optList"; this.optList.Size = new System.Drawing.Size(408, 69); this.optList.TabIndex = 9; this.optList.DoubleClick += new System.EventHandler(this.optList_DoubleClick); this.optList.SelectedIndexChanged += new System.EventHandler(this.optList_SelectedIndexChanged); // // lblOptionalEquip // this.lblOptionalEquip.Location = new System.Drawing.Point(8, 200); this.lblOptionalEquip.Name = "lblOptionalEquip"; this.lblOptionalEquip.Size = new System.Drawing.Size(88, 32); this.lblOptionalEquip.TabIndex = 8; this.lblOptionalEquip.Text = "opt equipment"; this.lblOptionalEquip.TextAlign = System.Drawing.ContentAlignment.TopRight; // // bttnReplaceWeapon // this.bttnReplaceWeapon.Enabled = false; this.bttnReplaceWeapon.FlatStyle = System.Windows.Forms.FlatStyle.System; this.bttnReplaceWeapon.Location = new System.Drawing.Point(520, 128); 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); // // bttnEditReqdWeapon // this.bttnEditReqdWeapon.Enabled = false; this.bttnEditReqdWeapon.FlatStyle = System.Windows.Forms.FlatStyle.System; this.bttnEditReqdWeapon.Location = new System.Drawing.Point(520, 152); this.bttnEditReqdWeapon.Name = "bttnEditReqdWeapon"; this.bttnEditReqdWeapon.Size = new System.Drawing.Size(88, 22); this.bttnEditReqdWeapon.TabIndex = 11; this.bttnEditReqdWeapon.Text = "edit"; this.bttnEditReqdWeapon.Click += new System.EventHandler(this.bttnEditReqdWeapon_Click); // // FrmUnit // this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(616, 314); this.Controls.Add(this.bttnEditReqdWeapon); this.Controls.Add(this.bttnReplaceWeapon); this.Controls.Add(this.optList); this.Controls.Add(this.lblOptionalEquip); this.Controls.Add(this.bttnEditWeapon); this.Controls.Add(this.reqdList); this.Controls.Add(this.bttnRemoveWeapon); this.Controls.Add(this.bttnAddWeapon); this.Controls.Add(this.lblRequiredEquip); this.Controls.Add(this.lblUnitSize); this.Controls.Add(this.unitSize); this.Controls.Add(this.tbUnitName); this.Controls.Add(this.statsGrid); this.Name = "FrmUnit"; this.ShowInTaskbar = false; this.Text = "FrmUnit"; ((System.ComponentModel.ISupportInitialize)(this.statsGrid)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.unitSize)).EndInit(); this.ResumeLayout(false); } #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 reqdList_SelectedIndexChanged(object sender, System.EventArgs e) { bttnReplaceWeapon.Enabled = (reqdList.SelectedIndex>-1 && ((UnitEquipmentChoice)reqdList.SelectedItem).Item.HasAlternatives()); bttnEditReqdWeapon.Enabled = (reqdList.SelectedIndex>-1); } private void optList_SelectedIndexChanged(object sender, System.EventArgs e) { bttnEditWeapon.Enabled = optList.SelectedIndex>-1; bttnRemoveWeapon.Enabled = bttnEditWeapon.Enabled; } private void unit_UnitEquipmentAmountChanged(WarFoundryObject obj, double oldValue, double newValue) { if (obj is UnitEquipmentItem) { UnitEquipmentItem equip = (UnitEquipmentItem)obj; ListBox weaponList = (equip.IsRequired ? reqdList : optList); if (newValue==0) { weaponList.Items.Remove(GetEquipmentChoice(equip)); } else { UnitEquipmentChoice equipObj = GetEquipmentChoice(equip); int idx = weaponList.Items.IndexOf(equipObj); if (idx>-1) { weaponList.Items[idx] = equipObj; } else { weaponList.Items.Add(equipObj); } } } } private void editWeapon(ListBox list) { FrmEditUnitEquipment editEquip = new FrmEditUnitEquipment(Unit, ((UnitEquipmentChoice)list.SelectedItem).Item, commandStack); editEquip.ShowDialog(this); } private void bttnEditWeapon_Click(object sender, System.EventArgs e) { editWeapon(optList); } private void optList_DoubleClick(object sender, System.EventArgs e) { editWeapon(optList); } private void reqdList_DoubleClick(object sender, System.EventArgs e) { editWeapon(reqdList); } 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 SetUnitEquipmentAmountCommand(unit, ((UnitEquipmentChoice)optList.SelectedItem).Item, 0)); } private void bttnRemoveWeapon_Click(object sender, System.EventArgs e) { removeWeapon(); } private void bttnEditReqdWeapon_Click(object sender, System.EventArgs e) { editWeapon(reqdList); } private void bttnReplaceWeapon_Click(object sender, System.EventArgs e) { FrmReplaceUnitEquipment replace = new FrmReplaceUnitEquipment(unit, ((UnitEquipmentChoice)reqdList.SelectedItem).Item, commandStack); replace.ShowDialog(this); } } }