190
|
1 // This file (FrmArmyTree.cs) is a part of the IBBoard.WarFoundry.GUI.WinForms project and is copyright 2009 IBBoard.
|
|
2 //
|
|
3 // 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.
|
|
4
|
|
5 using System;
|
|
6 using System.Drawing;
|
|
7 using System.Collections.Generic;
|
|
8 using System.ComponentModel;
|
|
9 using System.Windows.Forms;
|
|
10 using IBBoard.Commands;
|
|
11 using IBBoard.Lang;
|
|
12 using IBBoard.Windows.Forms.I18N;
|
|
13 using IBBoard.Windows.Forms;
|
|
14 using IBBoard.WarFoundry.API;
|
|
15 using IBBoard.WarFoundry.API.Commands;
|
|
16 using IBBoard.WarFoundry.API.Objects;
|
|
17
|
|
18 namespace IBBoard.WarFoundry.GUI.WinForms
|
|
19 {
|
|
20 /// <summary>
|
|
21 /// Summary description for FrmArmyTree.
|
|
22 /// </summary>
|
|
23 public class FrmArmyTree : IBBoard.Windows.Forms.IBBForm
|
|
24 {
|
|
25 private System.Windows.Forms.TreeView treeView;
|
|
26 private IContainer components;
|
|
27 private Dictionary<string, TreeNode> nodes;
|
|
28 private System.Windows.Forms.ContextMenu contextMenu;
|
|
29 private IBBMenuItem miDeleteUnit;
|
|
30 private IBBMenuItem miEditUnit;
|
|
31
|
|
32 private ObjectAddDelegate UnitAddedMethod;
|
|
33 private ObjectRemoveDelegate UnitRemovedMethod;
|
|
34 private StringValChangedDelegate UnitNameChangedMethod, ArmyNameChangedMethod, TreeNameChangedMethod;
|
|
35 private ToolBar toolBar;
|
|
36 private IBBToolBarButton bttnEdit;
|
|
37 private IBBToolBarButton bttnDelete;
|
|
38 private ImageList imageList;
|
|
39 private CommandStack commandStack;
|
|
40 public GameSystem CurrentGameSystem
|
|
41 {
|
|
42 get { return WarFoundryCore.CurrentGameSystem; }
|
|
43 set { WarFoundryCore.CurrentGameSystem = value; }
|
|
44 }
|
|
45
|
|
46 public FrmArmyTree(CommandStack cmdStack)
|
|
47 {
|
|
48 commandStack = cmdStack;
|
|
49 InitializeComponent();
|
|
50 UnitAddedMethod = new ObjectAddDelegate(UnitAdded);
|
|
51 UnitRemovedMethod = new ObjectRemoveDelegate(UnitRemoved);
|
|
52 UnitNameChangedMethod = new StringValChangedDelegate(UpdateUnitName);
|
|
53 ArmyNameChangedMethod = new StringValChangedDelegate(UpdateArmyName);
|
|
54 TreeNameChangedMethod = new StringValChangedDelegate(FrmArmyTree_TreeNameChanged);
|
|
55 nodes = new Dictionary<string, TreeNode>();
|
|
56 this.Name = "ArmyTree";
|
|
57 WarFoundryCore.ArmyChanged+= new ArmyChangedDelegate(FrmArmyTree_ArmyChanged);
|
|
58 TranslateForm();
|
|
59 Translation.TranslationChanged += new MethodInvoker(TranslateForm);
|
|
60 }
|
|
61
|
|
62 private void TranslateForm()
|
|
63 {
|
|
64 ControlTranslator.TranslateControl(this);
|
|
65
|
|
66 foreach (Component comp in components.Components)
|
|
67 {
|
|
68 ControlTranslator.TranslateComponent(comp);
|
|
69 }
|
|
70
|
|
71 foreach (IBBMenuItem mi in contextMenu.MenuItems)
|
|
72 {
|
|
73 ControlTranslator.TranslateComponent(mi);
|
|
74 }
|
|
75 foreach (TreeNode node in nodes.Values)
|
|
76 {
|
|
77 node.Text = CreateNodeName((ICostedWarFoundryObject)node.Tag);
|
|
78 }
|
|
79 }
|
|
80
|
|
81 /// <summary>
|
|
82 /// Clean up any resources being used.
|
|
83 /// </summary>
|
|
84 protected override void Dispose( bool disposing )
|
|
85 {
|
|
86 if( disposing )
|
|
87 {
|
|
88 if(components != null)
|
|
89 {
|
|
90 components.Dispose();
|
|
91 }
|
|
92 }
|
|
93 base.Dispose( disposing );
|
|
94 Translation.TranslationChanged -= new MethodInvoker(TranslateForm);
|
|
95 WarFoundryCore.ArmyChanged -= new ArmyChangedDelegate(FrmArmyTree_ArmyChanged);
|
|
96 }
|
|
97
|
|
98 #region Windows Form Designer generated code
|
|
99 /// <summary>
|
|
100 /// Required method for Designer support - do not modify
|
|
101 /// the contents of this method with the code editor.
|
|
102 /// </summary>
|
|
103 private void InitializeComponent()
|
|
104 {
|
|
105 this.components = new System.ComponentModel.Container();
|
|
106 System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmArmyTree));
|
|
107 this.contextMenu = new System.Windows.Forms.ContextMenu();
|
|
108 this.miEditUnit = new IBBoard.Windows.Forms.IBBMenuItem();
|
|
109 this.miDeleteUnit = new IBBoard.Windows.Forms.IBBMenuItem();
|
|
110 this.imageList = new System.Windows.Forms.ImageList(this.components);
|
|
111 this.toolBar = new System.Windows.Forms.ToolBar();
|
|
112 this.bttnEdit = new IBBoard.Windows.Forms.IBBToolBarButton();
|
|
113 this.bttnDelete = new IBBoard.Windows.Forms.IBBToolBarButton();
|
|
114 this.treeView = new System.Windows.Forms.TreeView();
|
|
115 this.SuspendLayout();
|
|
116 //
|
|
117 // contextMenu
|
|
118 //
|
|
119 this.contextMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
|
|
120 this.miEditUnit,
|
|
121 this.miDeleteUnit});
|
|
122 this.contextMenu.Popup += new System.EventHandler(this.contextMenu_Popup);
|
|
123 //
|
|
124 // miEditUnit
|
|
125 //
|
|
126 this.miEditUnit.Index = 0;
|
|
127 this.miEditUnit.Text = "&edit unit";
|
|
128 this.miEditUnit.Click += new System.EventHandler(this.miEdit_Click);
|
|
129 //
|
|
130 // miDeleteUnit
|
|
131 //
|
|
132 this.miDeleteUnit.Index = 1;
|
|
133 this.miDeleteUnit.Text = "&delete unit";
|
|
134 this.miDeleteUnit.Click += new System.EventHandler(this.miDelete_Click);
|
|
135 //
|
|
136 // imageList
|
|
137 //
|
|
138 this.imageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList.ImageStream")));
|
|
139 this.imageList.TransparentColor = System.Drawing.Color.Transparent;
|
|
140 this.imageList.Images.SetKeyName(0, "gtk-edit.png");
|
|
141 this.imageList.Images.SetKeyName(1, "edit-delete.png");
|
|
142 //
|
|
143 // toolBar
|
|
144 //
|
|
145 this.toolBar.Buttons.AddRange(new System.Windows.Forms.ToolBarButton[] {
|
|
146 this.bttnEdit,
|
|
147 this.bttnDelete});
|
|
148 this.toolBar.ButtonSize = new System.Drawing.Size(16, 16);
|
|
149 this.toolBar.DropDownArrows = true;
|
|
150 this.toolBar.ImageList = this.imageList;
|
|
151 this.toolBar.Location = new System.Drawing.Point(0, 0);
|
|
152 this.toolBar.Name = "toolBar";
|
|
153 this.toolBar.ShowToolTips = true;
|
|
154 this.toolBar.Size = new System.Drawing.Size(240, 28);
|
|
155 this.toolBar.TabIndex = 3;
|
|
156 this.toolBar.ButtonClick += new System.Windows.Forms.ToolBarButtonClickEventHandler(this.toolBar_ButtonClick);
|
|
157 //
|
|
158 // bttnEdit
|
|
159 //
|
|
160 this.bttnEdit.Enabled = false;
|
|
161 this.bttnEdit.ImageIndex = 0;
|
|
162 this.bttnEdit.Name = "bttnEdit";
|
|
163 //
|
|
164 // bttnDelete
|
|
165 //
|
|
166 this.bttnDelete.Enabled = false;
|
|
167 this.bttnDelete.ImageIndex = 1;
|
|
168 this.bttnDelete.Name = "bttnDelete";
|
|
169 //
|
|
170 // treeView
|
|
171 //
|
|
172 this.treeView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
|
173 | System.Windows.Forms.AnchorStyles.Left)
|
|
174 | System.Windows.Forms.AnchorStyles.Right)));
|
|
175 this.treeView.ContextMenu = this.contextMenu;
|
|
176 this.treeView.FullRowSelect = true;
|
|
177 this.treeView.ImageIndex = 0;
|
|
178 this.treeView.ImageList = this.imageList;
|
|
179 this.treeView.Location = new System.Drawing.Point(0, 28);
|
|
180 this.treeView.Name = "treeView";
|
|
181 this.treeView.SelectedImageIndex = 0;
|
|
182 this.treeView.Size = new System.Drawing.Size(240, 250);
|
|
183 this.treeView.TabIndex = 0;
|
|
184 this.treeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView_AfterSelect);
|
|
185 this.treeView.DoubleClick += new System.EventHandler(this.treeView_DoubleClick);
|
|
186 this.treeView.MouseDown += new System.Windows.Forms.MouseEventHandler(this.treeView_MouseDown);
|
|
187 //
|
|
188 // FrmArmyTree
|
|
189 //
|
|
190 this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
|
|
191 this.ClientSize = new System.Drawing.Size(240, 277);
|
|
192 this.ControlBox = false;
|
|
193 this.Controls.Add(this.toolBar);
|
|
194 this.Controls.Add(this.treeView);
|
|
195 this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow;
|
|
196 this.MaximizeBox = false;
|
|
197 this.MinimizeBox = false;
|
|
198 this.Name = "FrmArmyTree";
|
|
199 this.Text = "FrmArmyTree";
|
|
200 this.ResumeLayout(false);
|
|
201 this.PerformLayout();
|
|
202
|
|
203 }
|
|
204 #endregion
|
|
205
|
|
206 private void ClearArmy()
|
|
207 {
|
|
208 nodes.Clear();
|
|
209 treeView.Nodes.Clear();
|
|
210 }
|
|
211
|
|
212 private void SetArmy(Army army)
|
|
213 {
|
|
214 ClearArmy();
|
|
215
|
|
216 if (army != null)
|
|
217 {
|
|
218 ArmyCategory[] cats = army.Categories;
|
|
219 TreeNode[] catNodes = new TreeNode[cats.Length];
|
|
220 Unit[] units;
|
|
221
|
|
222 for (int i = 0; i < cats.Length; i++)
|
|
223 {
|
|
224 ArmyCategory cat = cats[i];
|
|
225 units = army.GetUnits(cat);
|
|
226 cat.NameChanged += TreeNameChangedMethod;
|
|
227 cat.PointsValueChanged += NodePointsValueChanged;
|
|
228 TreeNode[] unitNodes = new TreeNode[units.Length];
|
|
229 TreeNode temp;
|
|
230
|
|
231 for (int j = 0; j < units.Length; j++)
|
|
232 {
|
|
233 unitNodes[j] = CreateTreeNode(units[j]);
|
|
234 }
|
|
235
|
|
236 temp = new TreeNode(CreateNodeName(cat), unitNodes);
|
|
237 temp.Tag = cat;
|
|
238 catNodes[i] = temp;
|
|
239 nodes[cat.ID] = temp;
|
|
240 }
|
|
241
|
|
242 TreeNode root = new TreeNode(CreateNodeName(army), catNodes);
|
|
243 root.Tag = army;
|
|
244 army.PointsValueChanged += NodePointsValueChanged;
|
|
245 nodes[army.ID] = root;
|
|
246 treeView.Nodes.Add(root);
|
|
247 root.ExpandAll();
|
|
248 }
|
|
249 }
|
|
250
|
|
251 private string CreateNodeName(ICostedWarFoundryObject obj)
|
|
252 {
|
|
253 return Translation.GetTranslation("treeNodeText", "{0} ({1} pts)", obj.Name, obj.Points, CurrentGameSystem.UsePointsAbbrev(obj.Points));
|
|
254 }
|
|
255
|
|
256 private void NodePointsValueChanged(WarFoundryObject obj, double oldValue, double newValue)
|
|
257 {
|
|
258 if (obj is ICostedWarFoundryObject)
|
|
259 {
|
|
260 SetNodeName(obj);
|
|
261 }
|
|
262 }
|
|
263
|
|
264 private void SetNodeName(WarFoundryObject obj)
|
|
265 {
|
|
266 TreeNode node = nodes[obj.ID];
|
|
267
|
|
268 if (node != null)
|
|
269 {
|
|
270 node.Text = CreateNodeName((ICostedWarFoundryObject)obj);
|
|
271 }
|
|
272 }
|
|
273
|
|
274 private TreeNode CreateTreeNode(Unit unit)
|
|
275 {
|
|
276 TreeNode temp = new TreeNode(CreateNodeName(unit));
|
|
277 temp.Tag = unit;
|
|
278 unit.NameChanged+= UnitNameChangedMethod;
|
|
279 unit.PointsValueChanged += NodePointsValueChanged;
|
|
280 nodes[unit.ID] = temp;
|
|
281 return temp;
|
|
282 }
|
|
283
|
|
284 public void FrmArmyTree_ArmyChanged(Army oldArmy, Army newArmy)
|
|
285 {
|
|
286 if (oldArmy != null)
|
|
287 {
|
|
288 oldArmy.UnitAdded -= UnitAddedMethod;
|
|
289 oldArmy.UnitRemoved -= UnitRemovedMethod;
|
|
290 oldArmy.PointsValueChanged -= NodePointsValueChanged;
|
|
291 }
|
|
292
|
|
293 if (newArmy != null)
|
|
294 {
|
|
295 newArmy.UnitAdded += UnitAddedMethod;
|
|
296 newArmy.UnitRemoved += UnitRemovedMethod;
|
|
297 newArmy.PointsValueChanged += NodePointsValueChanged;
|
|
298 }
|
|
299
|
|
300 SetArmy(newArmy);
|
|
301 }
|
|
302
|
|
303 private void UnitAdded(WarFoundryObject obj)
|
|
304 {
|
|
305 if (obj is Unit)
|
|
306 {
|
|
307 Unit unit = (Unit)obj;
|
|
308 ArmyCategory cat = unit.Category;
|
|
309 TreeNode parent = nodes[cat.ID];
|
|
310 TreeNode unitNode = CreateTreeNode(unit);
|
|
311 parent.Nodes.Add(unitNode);
|
|
312 parent.Expand(); //make sure it's expanded
|
|
313 }
|
|
314 }
|
|
315
|
|
316 public new FrmMain MdiParent
|
|
317 {
|
|
318 get { return (FrmMain) base.MdiParent; }
|
|
319 set { base.MdiParent = value; }
|
|
320 }
|
|
321
|
|
322 private void UnitRemoved(WarFoundryObject obj)
|
|
323 {
|
|
324 if (obj is Unit)
|
|
325 {
|
|
326 Unit unit = (Unit)obj;
|
|
327 RemoveUnitFromTree(unit);
|
|
328 }
|
|
329 }
|
|
330
|
|
331 private void RemoveUnitFromTree(Unit unit)
|
|
332 {
|
|
333 TreeNode unitNode = nodes[unit.ID];
|
|
334 unit.NameChanged-= UnitNameChangedMethod;
|
|
335
|
|
336 if (unitNode!=null)
|
|
337 {
|
|
338 unitNode.Remove();
|
|
339 nodes.Remove(unit.ID);
|
|
340 }
|
|
341 }
|
|
342
|
|
343
|
|
344 private void contextMenu_Popup(object sender, System.EventArgs e)
|
|
345 {
|
|
346 TreeNode node = treeView.SelectedNode;
|
|
347
|
|
348 if (node!=null && node.Tag is Unit)
|
|
349 {
|
|
350 foreach(MenuItem item in contextMenu.MenuItems)
|
|
351 {
|
|
352 item.Visible = true;
|
|
353 }
|
|
354 }
|
|
355 else
|
|
356 {
|
|
357 foreach(MenuItem item in contextMenu.MenuItems)
|
|
358 {
|
|
359 item.Visible = false;
|
|
360 }
|
|
361 }
|
|
362 }
|
|
363
|
|
364 private void treeView_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
|
|
365 {
|
|
366 if (e.Button == MouseButtons.Right)
|
|
367 {
|
|
368 TreeNode tn = treeView.GetNodeAt(e.X, e.Y);
|
|
369
|
|
370 if (tn!=null)
|
|
371 {
|
|
372 treeView.SelectedNode = tn;
|
|
373 }
|
|
374 else
|
|
375 {
|
|
376 treeView.SelectedNode = null;
|
|
377 }
|
|
378 }
|
|
379 }
|
|
380
|
|
381 private void miDelete_Click(object sender, System.EventArgs e)
|
|
382 {
|
|
383 DeleteUnit();
|
|
384 }
|
|
385
|
|
386 private void DeleteUnit()
|
|
387 {
|
|
388
|
|
389 TreeNode selected = treeView.SelectedNode;
|
|
390
|
|
391 if (selected.Tag != null && selected.Tag is Unit)
|
|
392 {
|
|
393 Unit unit = (Unit) selected.Tag;
|
|
394 commandStack.Execute(new RemoveUnitCommand(unit));
|
|
395 }
|
|
396 }
|
|
397
|
|
398 private void miEdit_Click(object sender, System.EventArgs e)
|
|
399 {
|
|
400 EditUnit();
|
|
401 }
|
|
402
|
|
403 private void treeView_DoubleClick(object sender, System.EventArgs e)
|
|
404 {
|
|
405 EditUnit();
|
|
406 }
|
|
407
|
|
408 private void EditUnit()
|
|
409 {
|
|
410 TreeNode selected = treeView.SelectedNode;
|
|
411 object tagData = selected.Tag;
|
|
412
|
|
413 if (tagData is Unit)
|
|
414 {
|
|
415 Unit unit = (Unit) tagData;
|
|
416 MdiParent.OpenUnitDialog(unit);
|
|
417 }
|
|
418 }
|
|
419
|
|
420 private void UpdateUnitName(WarFoundryObject obj, string oldValue, string newValue)
|
|
421 {
|
|
422 if (obj is ICostedWarFoundryObject)
|
|
423 {
|
|
424 SetNodeName(obj);
|
|
425 }
|
|
426 }
|
|
427
|
|
428 private void UpdateArmyName(WarFoundryObject obj, string oldValue, string newValue)
|
|
429 {
|
|
430 if (obj is Army)
|
|
431 {
|
|
432 Army army = (Army)obj;
|
|
433 TreeNode node = treeView.Nodes[0];
|
|
434
|
|
435 if (node!=null)
|
|
436 {
|
|
437 node.Text = army.Name;
|
|
438 }
|
|
439 }
|
|
440 }
|
|
441
|
|
442 private void FrmArmyTree_TreeNameChanged(WarFoundryObject obj, string oldValue, string newValue)
|
|
443 {
|
|
444 TreeNode node = nodes[obj.ID];
|
|
445
|
|
446 if (node!=null)
|
|
447 {
|
|
448 node.Text = obj.Name;
|
|
449 }
|
|
450 }
|
|
451
|
|
452 private void toolBar_ButtonClick(object sender, ToolBarButtonClickEventArgs e)
|
|
453 {
|
|
454 if (e.Button == bttnDelete)
|
|
455 {
|
|
456 DeleteUnit();
|
|
457 }
|
|
458 else if (e.Button == bttnEdit)
|
|
459 {
|
|
460 EditUnit();
|
|
461 }
|
|
462 }
|
|
463
|
|
464 private void treeView_AfterSelect(object sender, TreeViewEventArgs e)
|
|
465 {
|
|
466 TreeNode node = treeView.SelectedNode;
|
|
467
|
|
468 bttnDelete.Enabled = (node != null && node.Tag is Unit);
|
|
469 bttnEdit.Enabled = bttnDelete.Enabled;
|
|
470 }
|
|
471 }
|
|
472 }
|