view FrmMain.cs @ 208:256f2f2f6e8c

Basic XML UI output GUI work
author Dan.Kulinski@dank-laptop.Global.Local
date Sun, 14 Aug 2011 23:04:02 -0600
parents ac5f87626abd
children 83685ed69c69
line source
1 // This file (FrmMain.cs) is a part of the IBBoard.WarFoundry.GUI.WinForms project and is copyright 2007, 2008, 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.
5 using System;
6 using System.Collections.Generic;
7 using System.Drawing;
8 using System.Drawing.Drawing2D;
9 using System.ComponentModel;
10 using System.Windows.Forms;
11 using System.Data;
12 using System.IO;
13 using System.Threading;
14 using log4net;
15 using IBBoard;
16 using IBBoard.CustomMath;
17 using IBBoard.Commands;
18 using IBBoard.IO;
19 using IBBoard.Lang;
20 using IBBoard.Windows.Forms;
21 using IBBoard.Windows.Forms.I18N;
22 using IBBoard.Xml;
23 using IBBoard.WarFoundry.API;
24 using IBBoard.WarFoundry.API.Commands;
25 using IBBoard.WarFoundry.API.Exporters;
26 using IBBoard.WarFoundry.API.Objects;
27 using IBBoard.WarFoundry.API.Objects.Requirement;
28 using IBBoard.WarFoundry.API.Util;
29 using IBBoard.WarFoundry.API.Savers;
30 using IBBoard.WarFoundry.API.Savers.Xml;
31 using IBBoard.WarFoundry.API.Factories;
32 using IBBoard.WarFoundry.API.Factories.Xml;
34 namespace IBBoard.WarFoundry.GUI.WinForms
35 {
36 /// <summary>
37 /// Summary description for Form1.
38 /// </summary>
39 public class FrmMain : System.Windows.Forms.Form
40 {
41 private static readonly string AppTitle = "WarFoundry";
42 internal static readonly string VERSION = "0.1";
43 const string DefaultDataDir = "data";
44 /* public static string pointsAbbrevSingle;
45 public static string pointsAbbrevPlural;
46 public static string pointsAbbreviation;
47 public static string pointsNameSingle;
48 public static string pointsNamePlural;
49 public static string pointsName;*/
51 private Preferences preferences;
52 private readonly ILog log = LogManager.GetLogger(typeof(FrmMain));
54 private CommandStack commandStack;
56 public ObjectAddDelegate UnitAddedMethod;
57 public ObjectRemoveDelegate UnitRemovedMethod;
58 public DoubleValChangedDelegate PointsValueChangedMethod;
59 //public FailedUnitRequirementDelegate FailedUnitRequirementMethod;
61 private FrmArmyTree armyTree;
62 private string loadedFilePath;
63 private Dictionary<string, FrmUnit> unitWindows;
65 private System.ComponentModel.IContainer components;
66 private System.Windows.Forms.OpenFileDialog openArmyDialog;
67 private System.Windows.Forms.SaveFileDialog saveArmyDialog;
68 private System.Windows.Forms.MainMenu mainMenu;
69 private IBBoard.Windows.Forms.ColorableStatusBarPanel sbMainPanel;
70 private IBBoard.Windows.Forms.ColorableStatusBarPanel sbErrorPanel;
71 private IBBoard.Windows.Forms.ColorableStatusBarPanel sbPointsPanel;
72 private System.Windows.Forms.ContextMenu undoMenu;
73 private System.Windows.Forms.ContextMenu redoMenu;
74 private IBBoard.Windows.Forms.ColorableStatusBar statusBar;
75 private MenuStrip menuStrip;
76 private IBBToolStripMenuItem menuFile;
77 private IBBToolStripMenuItem miNewArmy;
78 private IBBToolStripMenuItem miOpenArmy;
79 private IBBToolStripMenuItem miSaveArmy;
80 private IBBToolStripMenuItem miSaveArmyAs;
81 private IBBToolStripMenuItem miExportArmyAs;
82 private IBBToolStripMenuItem miExportArmyAsBasicHTML;
83 private IBBToolStripMenuItem miCloseArmy;
84 private ToolStripSeparator toolStripSeparator1;
85 private IBBToolStripMenuItem miReloadFiles;
86 private ToolStripSeparator toolStripSeparator2;
87 private IBBToolStripMenuItem miExit;
88 private IBBToolStripMenuItem menuEdit;
89 private IBBToolStripMenuItem miUndo;
90 private IBBToolStripMenuItem miRedo;
91 private IBBToolStripMenuItem menuHelp;
92 private ToolStrip mainToolStrip;
93 private IBBToolStripButton bttnNewArmy;
94 private IBBToolStripButton bttnOpenArmy;
95 private IBBToolStripButton bttnSaveArmy;
96 private ToolStripSeparator toolStripSeparator3;
97 private IBBToolStripSplitButton bttnUndo;
98 private IBBToolStripSplitButton bttnRedo;
99 private ToolStrip catToolStrip;
100 private ToolStripPanel toolStripPanel;
101 private ToolStripSeparator toolStripSeparator4;
102 private IBBToolStripMenuItem miPreferences;
103 private ToolStripMenuItem miExportArmyAsBasicXml;
104 private IBBToolStripMenuItem miAbout;
107 /// <summary>
108 /// The main entry point for the application.
109 /// </summary>
110 [STAThread]
111 static void Main(string[] args)
112 {
113 try
114 {
115 LogManager.GetLogger(typeof(FrmMain)).Info("Starting WarFoundry WinForms");
116 Application.EnableVisualStyles();
117 Application.Run(new FrmMain(args));
118 LogManager.GetLogger(typeof(FrmMain)).Info("Closing WarFoundry WinForms");
119 }
120 catch (Exception ex)
121 {
122 LogManager.GetLogger(typeof(FrmMain)).Fatal(ex);
123 MessageBox.Show(null, "A major, unexpected and fatal error ocurred while starting the application: \r\n\r\n" + ex.Message + "\r\n\r\n" + ex.StackTrace, "Fatal error", MessageBoxButtons.OK, MessageBoxIcon.Error);
124 }
125 }
127 public FrmMain(string[] args)
128 {
129 this.Closing+=new CancelEventHandler(FrmMain_Closing);
130 CommandStack.CommandStackUpdated += new MethodInvoker(commandStack_CommandStackUpdated);
132 InitializeComponent();
133 toolStripPanel.Join(mainToolStrip, 0, 0);
134 toolStripPanel.Join(catToolStrip, mainToolStrip.Right, 0);
136 Preferences = new Preferences("WarFoundry");
137 try
138 {
139 Translation.InitialiseTranslations(Constants.ExecutablePath, Preferences["language"].ToString());
140 }
141 catch (TranslationLoadException ex)
142 {
143 log.Error("Translation loading failed for language " + Preferences["language"].ToString(), ex);
144 MessageBox.Show(this, "Translation loading failed for language " + Preferences["language"].ToString(), "Translation failure", MessageBoxButtons.OK, MessageBoxIcon.Error);
145 }
147 Translation.TranslationChanged += new MethodInvoker(TranslationChanged);
149 TranslateControls();
150 unitWindows = new Dictionary<string, FrmUnit>();
152 WarFoundryCore.GameSystemChanged+= new GameSystemChangedDelegate(FrmMain_GameSystemChanged);
153 WarFoundryCore.ArmyChanged += new ArmyChangedDelegate(FrmMain_ArmyChanged);
154 UnitAddedMethod = new ObjectAddDelegate(FrmMain_UnitAddedMethod);
155 UnitRemovedMethod = new ObjectRemoveDelegate(FrmMain_UnitRemovedMethod);
156 PointsValueChangedMethod = new DoubleValChangedDelegate(FrmMain_PointsValueChangedMethod);
157 //FailedUnitRequirementMethod = new FailedUnitRequirementDelegate(FrmMain_FailedUnitRequirement);
160 sbErrorPanel.Color = Color.Red;
161 SetPointsPanelToolTipText();
163 // hack to load default files
164 WarFoundryLoader.GetDefault().AddLoadDirectory(new DirectoryInfo(Constants.ExecutablePath + Constants.DirectoryString + DefaultDataDir));
165 WarFoundryLoader.GetDefault().RegisterFactory(WarFoundryXmlFactory.GetFactory());
166 WarFoundryLoader.GetDefault().FileLoadingFinished += FileLoadingFinished;
167 WarFoundrySaver.SetFileSaver(new WarFoundryXmlFileSaver());
168 }
170 private FrmArmyTree GetArmyTree()
171 {
172 if (armyTree == null || armyTree.IsDisposed)
173 {
174 CreateArmyTree();
175 }
177 return armyTree;
178 }
180 private void CreateArmyTree()
181 {
182 armyTree = new FrmArmyTree(CommandStack);
183 armyTree.MdiParent = this;
184 armyTree.StartPosition = FormStartPosition.Manual;
185 armyTree.Location = new Point(this.DisplayRectangle.Width - armyTree.Width - 10, 10);
186 }
188 private void TranslateControls()
189 {
190 ControlTranslator.TranslateControls(Controls);
191 ControlTranslator.TranslateComponents(components.Components);
192 ControlTranslator.TranslateComponent(openArmyDialog);
193 ControlTranslator.TranslateComponent(saveArmyDialog);
194 //translate pointspanel and tooltip
195 SetPointsPanelToolTipText();
196 SetPointsPanelText();
197 }
199 void TranslationChanged()
200 {
201 TranslateControls();
202 }
204 public static string DataPath
205 {
206 get { return Constants.ExecutablePath+Constants.DirectoryChar+"data"; }
207 }
209 public static String ArmiesPath
210 {
211 get { return Environment.GetFolderPath(Environment.SpecialFolder.Personal); }
212 }
214 public Preferences Preferences
215 {
216 get { return preferences; }
217 set { preferences = value; }
218 }
220 public CommandStack CommandStack
221 {
222 get
223 {
224 if (commandStack == null)
225 {
226 commandStack = new CommandStack();
227 }
229 return commandStack;
230 }
231 }
233 /// <summary>
234 /// Clean up any resources being used.
235 /// </summary>
236 protected override void Dispose( bool disposing )
237 {
238 if( disposing )
239 {
240 if (components != null)
241 {
242 components.Dispose();
243 }
244 }
245 base.Dispose( disposing );
246 }
248 #region Windows Form Designer generated code
249 /// <summary>
250 /// Required method for Designer support - do not modify
251 /// the contents of this method with the code editor.
252 /// </summary>
253 private void InitializeComponent()
254 {
255 this.components = new System.ComponentModel.Container();
256 System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmMain));
257 this.undoMenu = new System.Windows.Forms.ContextMenu();
258 this.redoMenu = new System.Windows.Forms.ContextMenu();
259 this.mainMenu = new System.Windows.Forms.MainMenu(this.components);
260 this.openArmyDialog = new System.Windows.Forms.OpenFileDialog();
261 this.saveArmyDialog = new System.Windows.Forms.SaveFileDialog();
262 this.menuStrip = new System.Windows.Forms.MenuStrip();
263 this.menuFile = new IBBoard.Windows.Forms.IBBToolStripMenuItem();
264 this.miNewArmy = new IBBoard.Windows.Forms.IBBToolStripMenuItem();
265 this.miOpenArmy = new IBBoard.Windows.Forms.IBBToolStripMenuItem();
266 this.miSaveArmy = new IBBoard.Windows.Forms.IBBToolStripMenuItem();
267 this.miSaveArmyAs = new IBBoard.Windows.Forms.IBBToolStripMenuItem();
268 this.miExportArmyAs = new IBBoard.Windows.Forms.IBBToolStripMenuItem();
269 this.miExportArmyAsBasicHTML = new IBBoard.Windows.Forms.IBBToolStripMenuItem();
270 this.miCloseArmy = new IBBoard.Windows.Forms.IBBToolStripMenuItem();
271 this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
272 this.miReloadFiles = new IBBoard.Windows.Forms.IBBToolStripMenuItem();
273 this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
274 this.miExit = new IBBoard.Windows.Forms.IBBToolStripMenuItem();
275 this.menuEdit = new IBBoard.Windows.Forms.IBBToolStripMenuItem();
276 this.miUndo = new IBBoard.Windows.Forms.IBBToolStripMenuItem();
277 this.miRedo = new IBBoard.Windows.Forms.IBBToolStripMenuItem();
278 this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator();
279 this.miPreferences = new IBBoard.Windows.Forms.IBBToolStripMenuItem();
280 this.menuHelp = new IBBoard.Windows.Forms.IBBToolStripMenuItem();
281 this.miAbout = new IBBoard.Windows.Forms.IBBToolStripMenuItem();
282 this.mainToolStrip = new System.Windows.Forms.ToolStrip();
283 this.bttnNewArmy = new IBBoard.Windows.Forms.IBBToolStripButton();
284 this.bttnOpenArmy = new IBBoard.Windows.Forms.IBBToolStripButton();
285 this.bttnSaveArmy = new IBBoard.Windows.Forms.IBBToolStripButton();
286 this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();
287 this.bttnUndo = new IBBoard.Windows.Forms.IBBToolStripSplitButton();
288 this.bttnRedo = new IBBoard.Windows.Forms.IBBToolStripSplitButton();
289 this.catToolStrip = new System.Windows.Forms.ToolStrip();
290 this.statusBar = new IBBoard.Windows.Forms.ColorableStatusBar();
291 this.sbMainPanel = new IBBoard.Windows.Forms.ColorableStatusBarPanel();
292 this.sbErrorPanel = new IBBoard.Windows.Forms.ColorableStatusBarPanel();
293 this.sbPointsPanel = new IBBoard.Windows.Forms.ColorableStatusBarPanel();
294 this.toolStripPanel = new System.Windows.Forms.ToolStripPanel();
295 this.miExportArmyAsBasicXml = new System.Windows.Forms.ToolStripMenuItem();
296 this.menuStrip.SuspendLayout();
297 this.mainToolStrip.SuspendLayout();
298 ((System.ComponentModel.ISupportInitialize)(this.sbMainPanel)).BeginInit();
299 ((System.ComponentModel.ISupportInitialize)(this.sbErrorPanel)).BeginInit();
300 ((System.ComponentModel.ISupportInitialize)(this.sbPointsPanel)).BeginInit();
301 this.SuspendLayout();
302 //
303 // saveArmyDialog
304 //
305 this.saveArmyDialog.Title = "Translatable:saveArmyDialog";
306 //
307 // menuStrip
308 //
309 this.menuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
310 this.menuFile,
311 this.menuEdit,
312 this.menuHelp});
313 this.menuStrip.Location = new System.Drawing.Point(0, 0);
314 this.menuStrip.Name = "menuStrip";
315 this.menuStrip.Size = new System.Drawing.Size(790, 24);
316 this.menuStrip.TabIndex = 6;
317 this.menuStrip.Text = "menuStrip1";
318 //
319 // menuFile
320 //
321 this.menuFile.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
322 this.miNewArmy,
323 this.miOpenArmy,
324 this.miSaveArmy,
325 this.miSaveArmyAs,
326 this.miExportArmyAs,
327 this.miCloseArmy,
328 this.toolStripSeparator1,
329 this.miReloadFiles,
330 this.toolStripSeparator2,
331 this.miExit});
332 this.menuFile.Name = "menuFile";
333 this.menuFile.Size = new System.Drawing.Size(35, 20);
334 this.menuFile.Text = "&file";
335 //
336 // miNewArmy
337 //
338 this.miNewArmy.Name = "miNewArmy";
339 this.miNewArmy.Size = new System.Drawing.Size(160, 22);
340 this.miNewArmy.Text = "&new army";
341 this.miNewArmy.Click += new System.EventHandler(this.miNewArmy_Click);
342 //
343 // miOpenArmy
344 //
345 this.miOpenArmy.Name = "miOpenArmy";
346 this.miOpenArmy.Size = new System.Drawing.Size(160, 22);
347 this.miOpenArmy.Text = "&open army";
348 this.miOpenArmy.Click += new System.EventHandler(this.miOpenArmy_Click);
349 //
350 // miSaveArmy
351 //
352 this.miSaveArmy.Enabled = false;
353 this.miSaveArmy.Name = "miSaveArmy";
354 this.miSaveArmy.Size = new System.Drawing.Size(160, 22);
355 this.miSaveArmy.Text = "&save army";
356 this.miSaveArmy.Click += new System.EventHandler(this.miSaveArmy_Click);
357 //
358 // miSaveArmyAs
359 //
360 this.miSaveArmyAs.Enabled = false;
361 this.miSaveArmyAs.Name = "miSaveArmyAs";
362 this.miSaveArmyAs.Size = new System.Drawing.Size(160, 22);
363 this.miSaveArmyAs.Text = "save army &as...";
364 this.miSaveArmyAs.Click += new System.EventHandler(this.miSaveArmyAs_Click);
365 //
366 // miExportArmyAs
367 //
368 this.miExportArmyAs.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
369 this.miExportArmyAsBasicHTML,
370 this.miExportArmyAsBasicXml});
371 this.miExportArmyAs.Enabled = false;
372 this.miExportArmyAs.Name = "miExportArmyAs";
373 this.miExportArmyAs.Size = new System.Drawing.Size(160, 22);
374 this.miExportArmyAs.Text = "export army as...";
375 //
376 // miExportArmyAsBasicHTML
377 //
378 this.miExportArmyAsBasicHTML.Name = "miExportArmyAsBasicHTML";
379 this.miExportArmyAsBasicHTML.Size = new System.Drawing.Size(152, 22);
380 this.miExportArmyAsBasicHTML.Text = "&basic html";
381 this.miExportArmyAsBasicHTML.Click += new System.EventHandler(this.miExportArmyAsBasicHTML_Click);
382 //
383 // miCloseArmy
384 //
385 this.miCloseArmy.Enabled = false;
386 this.miCloseArmy.Name = "miCloseArmy";
387 this.miCloseArmy.Size = new System.Drawing.Size(160, 22);
388 this.miCloseArmy.Text = "&close army";
389 this.miCloseArmy.Click += new System.EventHandler(this.miCloseArmy_Click);
390 //
391 // toolStripSeparator1
392 //
393 this.toolStripSeparator1.Name = "toolStripSeparator1";
394 this.toolStripSeparator1.Size = new System.Drawing.Size(157, 6);
395 //
396 // miReloadFiles
397 //
398 this.miReloadFiles.Name = "miReloadFiles";
399 this.miReloadFiles.Size = new System.Drawing.Size(160, 22);
400 this.miReloadFiles.Text = "&reload files";
401 this.miReloadFiles.Click += new System.EventHandler(this.miReloadFiles_Click);
402 //
403 // toolStripSeparator2
404 //
405 this.toolStripSeparator2.Name = "toolStripSeparator2";
406 this.toolStripSeparator2.Size = new System.Drawing.Size(157, 6);
407 //
408 // miExit
409 //
410 this.miExit.Name = "miExit";
411 this.miExit.Size = new System.Drawing.Size(160, 22);
412 this.miExit.Text = "e&xit";
413 this.miExit.Click += new System.EventHandler(this.miExit_Click);
414 //
415 // menuEdit
416 //
417 this.menuEdit.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
418 this.miUndo,
419 this.miRedo,
420 this.toolStripSeparator4,
421 this.miPreferences});
422 this.menuEdit.Name = "menuEdit";
423 this.menuEdit.Size = new System.Drawing.Size(39, 20);
424 this.menuEdit.Text = "&edit";
425 //
426 // miUndo
427 //
428 this.miUndo.Enabled = false;
429 this.miUndo.Name = "miUndo";
430 this.miUndo.Size = new System.Drawing.Size(135, 22);
431 this.miUndo.Text = "&undo";
432 this.miUndo.Click += new System.EventHandler(this.miUndo_Click);
433 //
434 // miRedo
435 //
436 this.miRedo.Enabled = false;
437 this.miRedo.Name = "miRedo";
438 this.miRedo.Size = new System.Drawing.Size(135, 22);
439 this.miRedo.Text = "&redo";
440 this.miRedo.Click += new System.EventHandler(this.miRedo_Click);
441 //
442 // toolStripSeparator4
443 //
444 this.toolStripSeparator4.Name = "toolStripSeparator4";
445 this.toolStripSeparator4.Size = new System.Drawing.Size(132, 6);
446 //
447 // miPreferences
448 //
449 this.miPreferences.Name = "miPreferences";
450 this.miPreferences.Size = new System.Drawing.Size(135, 22);
451 this.miPreferences.Text = "&preferences";
452 this.miPreferences.Click += new System.EventHandler(this.miPreferences_Click);
453 //
454 // menuHelp
455 //
456 this.menuHelp.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
457 this.miAbout});
458 this.menuHelp.Name = "menuHelp";
459 this.menuHelp.Size = new System.Drawing.Size(42, 20);
460 this.menuHelp.Text = "&help";
461 //
462 // miAbout
463 //
464 this.miAbout.Name = "miAbout";
465 this.miAbout.Size = new System.Drawing.Size(105, 22);
466 this.miAbout.Text = "&about";
467 this.miAbout.Click += new System.EventHandler(this.miAbout_Click);
468 //
469 // mainToolStrip
470 //
471 this.mainToolStrip.Dock = System.Windows.Forms.DockStyle.None;
472 this.mainToolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
473 this.bttnNewArmy,
474 this.bttnOpenArmy,
475 this.bttnSaveArmy,
476 this.toolStripSeparator3,
477 this.bttnUndo,
478 this.bttnRedo});
479 this.mainToolStrip.Location = new System.Drawing.Point(0, 24);
480 this.mainToolStrip.Name = "mainToolStrip";
481 this.mainToolStrip.Size = new System.Drawing.Size(151, 25);
482 this.mainToolStrip.TabIndex = 8;
483 //
484 // bttnNewArmy
485 //
486 this.bttnNewArmy.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
487 this.bttnNewArmy.Image = global::IBBoard.WarFoundry.GUI.WinForms.Properties.Resources.document_new;
488 this.bttnNewArmy.ImageTransparentColor = System.Drawing.Color.Magenta;
489 this.bttnNewArmy.Name = "bttnNewArmy";
490 this.bttnNewArmy.Size = new System.Drawing.Size(23, 22);
491 this.bttnNewArmy.Text = "new army";
492 this.bttnNewArmy.Click += new System.EventHandler(this.miNewArmy_Click);
493 //
494 // bttnOpenArmy
495 //
496 this.bttnOpenArmy.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
497 this.bttnOpenArmy.Image = global::IBBoard.WarFoundry.GUI.WinForms.Properties.Resources.document_open;
498 this.bttnOpenArmy.ImageTransparentColor = System.Drawing.Color.Magenta;
499 this.bttnOpenArmy.Name = "bttnOpenArmy";
500 this.bttnOpenArmy.Size = new System.Drawing.Size(23, 22);
501 this.bttnOpenArmy.Text = "open army";
502 this.bttnOpenArmy.Click += new System.EventHandler(this.miOpenArmy_Click);
503 //
504 // bttnSaveArmy
505 //
506 this.bttnSaveArmy.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
507 this.bttnSaveArmy.Enabled = false;
508 this.bttnSaveArmy.Image = global::IBBoard.WarFoundry.GUI.WinForms.Properties.Resources.document_save;
509 this.bttnSaveArmy.ImageTransparentColor = System.Drawing.Color.Magenta;
510 this.bttnSaveArmy.Name = "bttnSaveArmy";
511 this.bttnSaveArmy.Size = new System.Drawing.Size(23, 22);
512 this.bttnSaveArmy.Text = "save army";
513 this.bttnSaveArmy.Click += new System.EventHandler(this.miSaveArmy_Click);
514 //
515 // toolStripSeparator3
516 //
517 this.toolStripSeparator3.Name = "toolStripSeparator3";
518 this.toolStripSeparator3.Size = new System.Drawing.Size(6, 25);
519 //
520 // bttnUndo
521 //
522 this.bttnUndo.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
523 this.bttnUndo.Enabled = false;
524 this.bttnUndo.Image = global::IBBoard.WarFoundry.GUI.WinForms.Properties.Resources.edit_undo;
525 this.bttnUndo.ImageTransparentColor = System.Drawing.Color.Magenta;
526 this.bttnUndo.Name = "bttnUndo";
527 this.bttnUndo.Size = new System.Drawing.Size(32, 22);
528 this.bttnUndo.Text = "undo";
529 this.bttnUndo.ButtonClick += new System.EventHandler(this.miUndo_Click);
530 //
531 // bttnRedo
532 //
533 this.bttnRedo.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
534 this.bttnRedo.Enabled = false;
535 this.bttnRedo.Image = global::IBBoard.WarFoundry.GUI.WinForms.Properties.Resources.edit_redo;
536 this.bttnRedo.ImageTransparentColor = System.Drawing.Color.Magenta;
537 this.bttnRedo.Name = "bttnRedo";
538 this.bttnRedo.Size = new System.Drawing.Size(32, 22);
539 this.bttnRedo.Text = "redo";
540 this.bttnRedo.ButtonClick += new System.EventHandler(this.miRedo_Click);
541 //
542 // catToolStrip
543 //
544 this.catToolStrip.Dock = System.Windows.Forms.DockStyle.None;
545 this.catToolStrip.Location = new System.Drawing.Point(161, 24);
546 this.catToolStrip.Name = "catToolStrip";
547 this.catToolStrip.Size = new System.Drawing.Size(111, 25);
548 this.catToolStrip.TabIndex = 9;
549 this.catToolStrip.Visible = false;
550 //
551 // statusBar
552 //
553 this.statusBar.Location = new System.Drawing.Point(0, 586);
554 this.statusBar.Name = "statusBar";
555 this.statusBar.Panels.AddRange(new System.Windows.Forms.StatusBarPanel[] {
556 this.sbMainPanel,
557 this.sbErrorPanel,
558 this.sbPointsPanel});
559 this.statusBar.ShowPanels = true;
560 this.statusBar.Size = new System.Drawing.Size(790, 22);
561 this.statusBar.TabIndex = 1;
562 this.statusBar.DrawItem += new System.Windows.Forms.StatusBarDrawItemEventHandler(this.statusBar_DrawItem);
563 this.statusBar.PanelClick += new System.Windows.Forms.StatusBarPanelClickEventHandler(this.statusBar_PanelClick);
564 //
565 // sbMainPanel
566 //
567 this.sbMainPanel.AutoSize = System.Windows.Forms.StatusBarPanelAutoSize.Spring;
568 this.sbMainPanel.Color = System.Drawing.SystemColors.WindowText;
569 this.sbMainPanel.Name = "sbMainPanel";
570 this.sbMainPanel.Style = System.Windows.Forms.StatusBarPanelStyle.OwnerDraw;
571 this.sbMainPanel.Width = 473;
572 //
573 // sbErrorPanel
574 //
575 this.sbErrorPanel.Color = System.Drawing.SystemColors.WindowText;
576 this.sbErrorPanel.Name = "sbErrorPanel";
577 this.sbErrorPanel.Style = System.Windows.Forms.StatusBarPanelStyle.OwnerDraw;
578 this.sbErrorPanel.Width = 150;
579 //
580 // sbPointsPanel
581 //
582 this.sbPointsPanel.Color = System.Drawing.SystemColors.WindowText;
583 this.sbPointsPanel.Name = "sbPointsPanel";
584 this.sbPointsPanel.Style = System.Windows.Forms.StatusBarPanelStyle.OwnerDraw;
585 this.sbPointsPanel.ToolTipText = "current points total";
586 this.sbPointsPanel.Width = 150;
587 //
588 // toolStripPanel
589 //
590 this.toolStripPanel.Dock = System.Windows.Forms.DockStyle.Top;
591 this.toolStripPanel.Location = new System.Drawing.Point(0, 24);
592 this.toolStripPanel.Name = "toolStripPanel";
593 this.toolStripPanel.Orientation = System.Windows.Forms.Orientation.Horizontal;
594 this.toolStripPanel.RowMargin = new System.Windows.Forms.Padding(3, 0, 0, 0);
595 this.toolStripPanel.Size = new System.Drawing.Size(790, 0);
596 //
597 // miExportArmyAsBasicXml
598 //
599 this.miExportArmyAsBasicXml.Name = "miExportArmyAsBasicXml";
600 this.miExportArmyAsBasicXml.Size = new System.Drawing.Size(152, 22);
601 this.miExportArmyAsBasicXml.Text = "basic xm&l";
602 this.miExportArmyAsBasicXml.Click += new System.EventHandler(this.miExportArmyAsBasicXml_Click);
603 //
604 // FrmMain
605 //
606 this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
607 this.ClientSize = new System.Drawing.Size(790, 608);
608 this.Controls.Add(this.mainToolStrip);
609 this.Controls.Add(this.toolStripPanel);
610 this.Controls.Add(this.statusBar);
611 this.Controls.Add(this.catToolStrip);
612 this.Controls.Add(this.menuStrip);
613 this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
614 this.IsMdiContainer = true;
615 this.MainMenuStrip = this.menuStrip;
616 this.Menu = this.mainMenu;
617 this.Name = "FrmMain";
618 this.Text = "WarFoundry";
619 this.Load += new System.EventHandler(this.FrmMain_Load);
620 this.menuStrip.ResumeLayout(false);
621 this.menuStrip.PerformLayout();
622 this.mainToolStrip.ResumeLayout(false);
623 this.mainToolStrip.PerformLayout();
624 ((System.ComponentModel.ISupportInitialize)(this.sbMainPanel)).EndInit();
625 ((System.ComponentModel.ISupportInitialize)(this.sbErrorPanel)).EndInit();
626 ((System.ComponentModel.ISupportInitialize)(this.sbPointsPanel)).EndInit();
627 this.ResumeLayout(false);
628 this.PerformLayout();
630 }
631 #endregion
633 private void FileLoadingFinished(List<FileLoadFailure> failures)
634 {
635 foreach (FileLoadFailure failure in failures)
636 {
637 log.Warn("Failed to load " + failure.FailedFile.FullName + ": " + failure.Message);
638 }
639 }
641 private void miExit_Click(object sender, System.EventArgs e)
642 {
643 Application.Exit();
644 }
646 private void miNewArmy_Click(object sender, System.EventArgs e)
647 {
648 CreateNewArmy();
649 }
651 private void CreateNewArmy()
652 {
653 if (CloseCurrentArmy())
654 {
655 FrmNewArmy newArmy = new FrmNewArmy(CurrentGameSystem);
656 DialogResult dr = newArmy.ShowDialog();
658 if (dr == DialogResult.OK)
659 {
660 try
661 {
662 CurrentArmy = new Army(newArmy.SelectedRace, newArmy.ArmyName, newArmy.ArmySize);
663 }
664 catch (RequiredDataMissingException ex)
665 {
666 log.Error("Required data missing from race file", ex);
667 MessageBox.Show(this, ex.Message, Translation.GetTranslation("InvalidRaceFileBoxTitle", "invalid race file"), MessageBoxButtons.OK, MessageBoxIcon.Error);
668 }
669 catch (InvalidFileException ex)
670 {
671 log.Error("Race file was invalid", ex);
672 MessageBox.Show(this, ex.Message, Translation.GetTranslation("InvalidRaceFileBoxTitle", "invalid race file"), MessageBoxButtons.OK, MessageBoxIcon.Error);
673 }
674 }
675 }
676 }
678 private bool OpenArmy()
679 {
680 if (openArmyDialog.Filter=="")
681 {
682 string savePath = ArmiesPath;
684 if (!Directory.Exists(savePath))
685 {
686 Directory.CreateDirectory(savePath);
687 }
689 openArmyDialog.InitialDirectory = savePath;
690 openArmyDialog.Filter = Translation.GetTranslation("armyFileFilter")+"|*.army";
691 openArmyDialog.Title = Translation.GetTranslation("openArmyDialog");
693 }
695 DialogResult dr = openArmyDialog.ShowDialog(this);
697 if (dr == DialogResult.OK)
698 {
699 if (CloseCurrentArmy())
700 {
701 try
702 {
703 string newFilePath = openArmyDialog.FileName;
704 CurrentArmy = WarFoundryLoader.GetDefault().LoadArmy(new FileInfo(newFilePath));
705 loadedFilePath = newFilePath;
706 return true;
707 }
708 catch (RequiredDataMissingException ex)
709 {
710 log.Error(ex);
711 MessageBox.Show(this, ex.Message, Translation.GetTranslation("InvalidArmyFileBoxTitle", "invalid army file"), MessageBoxButtons.OK, MessageBoxIcon.Error);
712 return false;
713 }
714 catch (InvalidFileException ex)
715 {
716 log.Error(ex);
717 MessageBox.Show(this, ex.Message, Translation.GetTranslation("InvalidArmyFileBoxTitle", "invalid army file"), MessageBoxButtons.OK, MessageBoxIcon.Error);
718 return false;
719 }
720 }
721 else
722 {
723 return false;
724 }
725 }
726 else
727 {
728 return false;
729 }
730 }
732 private bool CloseCurrentArmy()
733 {
734 if (CurrentArmy!=null)
735 {
736 bool canClose = false;
738 if (CommandStack.IsDirty())
739 {
740 string saveChanges = Translation.GetTranslation("SaveChangesQuestion", "the army \"{0}\" has been modified\r\nsave changes before closing army?", CurrentArmy.Name);
741 string saveChangesTitle = Translation.GetTranslation("SaveChangesTitle", "unsaved changes");
742 DialogResult dr = MessageBox.Show(this, saveChanges, saveChangesTitle, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button3);
744 if (dr == DialogResult.Yes)
745 {
746 canClose = SaveCurrentArmy();
747 }
748 else if (dr == DialogResult.No)
749 {
750 canClose = true;
751 }
752 //else they said cancel and we default to "canClose = false" so do nothing
753 }
754 else
755 {
756 canClose = true;
757 }
759 if (canClose)
760 {
761 //do close
762 DisableCategoryButtons();
763 CurrentArmy = null;
764 return true;
765 }
766 else
767 {
768 return false;
769 }
770 }
771 else
772 {
773 DisableCategoryButtons();
774 //pretend we succeeded
775 return true;
776 }
777 }
779 private void UndoLastAction()
780 {
781 if (commandStack.CanUndo())
782 {
783 commandStack.Undo();
784 }
785 }
787 private void RedoAction()
788 {
789 if (commandStack.CanRedo())
790 {
791 commandStack.Redo();
792 }
793 }
795 private bool SaveCurrentArmy()
796 {
797 bool saved = false;
799 string filePath = loadedFilePath;
801 if (filePath == null)
802 {
803 filePath = PromptForArmyFilePath();
804 }
806 if (filePath != null)
807 {
808 saved = SaveCurrentArmyToFile(filePath);
809 }
811 return saved;
812 }
814 private bool SaveCurrentArmyAs()
815 {
816 bool saved = false;
817 string filePath = PromptForArmyFilePath();
819 if (filePath != null)
820 {
821 saved = SaveCurrentArmyToFile(filePath);
822 }
824 return saved;
825 }
827 private bool SaveCurrentArmyToFile(string filePath)
828 {
829 if (WarFoundrySaver.GetSaver().Save(filePath, CurrentArmy))
830 {
831 loadedFilePath = filePath;
832 miSaveArmy.Enabled = false;
833 bttnSaveArmy.Enabled = false;
834 CommandStack.setCleanMark();
835 return true;
836 }
837 else
838 {
839 MessageBox.Show(this, Translation.GetTranslation("SaveFailed", "file save failed - check log for details"), Translation.GetTranslation("SaveFailedTitle", "file save failed"), MessageBoxButtons.OK, MessageBoxIcon.Error);
840 return false;
841 }
842 }
844 private string PromptForArmyFilePath()
845 {
846 if (saveArmyDialog.Filter == "")
847 {
848 string savePath = ArmiesPath;
850 if (!Directory.Exists(savePath))
851 {
852 Directory.CreateDirectory(savePath);
853 }
855 saveArmyDialog.InitialDirectory = savePath;
856 saveArmyDialog.Filter = Translation.GetTranslation("armyFileFilter")+"|*.army";
857 saveArmyDialog.Title = Translation.GetTranslation("saveArmyDialog");
858 }
860 DialogResult dr = saveArmyDialog.ShowDialog(this);
862 if (dr == DialogResult.OK)
863 {
864 return saveArmyDialog.FileName;
865 }
866 else
867 {
868 return null;
869 }
870 }
872 public GameSystem CurrentGameSystem
873 {
874 get { return WarFoundryCore.CurrentGameSystem; }
875 set { WarFoundryCore.CurrentGameSystem = value; }
876 }
878 public Army CurrentArmy
879 {
880 get { return WarFoundryCore.CurrentArmy; }
881 set { SetArmy(value); }
882 }
884 private void FrmMain_GameSystemChanged(GameSystem oldSystem, GameSystem newSystem)
885 {
886 SetAppTitle();
888 if (newSystem == null)
889 {
890 Preferences["currSystem"] = "";
891 }
892 else
893 {
894 Preferences["currSystem"] = newSystem.ID;
895 }
897 Preferences.Save();
898 RemoveCategoryButtons();
899 }
901 private void FrmMain_ArmyChanged(Army oldArmy, Army newArmy)
902 {
903 CommandStack.Reset();
904 loadedFilePath = null;
905 miSaveArmy.Enabled = false;
906 bttnSaveArmy.Enabled = false;
907 //TODO: Subscribe to an "army changed" event here
908 SetPointsPanelText();
909 SetAppTitle();
910 }
912 private void SetArmy(Army newArmy)
913 {
914 IgnoreArmy(CurrentArmy);
915 CloseAllUnitWindows();
917 if (newArmy == null)
918 {
919 SetNullArmyState();
920 }
921 else
922 {
923 WarFoundryCore.CurrentGameSystem = newArmy.GameSystem;
924 ListenToArmy(newArmy);
925 SetNonNullArmyState(newArmy);
926 }
928 WarFoundryCore.CurrentArmy = newArmy;
929 }
931 private void IgnoreArmy(Army oldArmy)
932 {
933 if (oldArmy != null)
934 {
935 oldArmy.UnitAdded -= UnitAddedMethod;
936 oldArmy.UnitRemoved -= UnitRemovedMethod;
937 oldArmy.PointsValueChanged -= PointsValueChangedMethod;
938 }
939 }
941 private void CloseAllUnitWindows()
942 {
943 FrmUnit[] unitForms = DictionaryUtils.ToArray(unitWindows);
945 foreach (FrmUnit window in unitForms)
946 {
947 window.Close();
948 }
950 unitWindows.Clear();
951 }
953 private void ListenToArmy(Army newArmy)
954 {
955 if (newArmy != null)
956 {
957 newArmy.UnitAdded += UnitAddedMethod;
958 newArmy.UnitRemoved += UnitRemovedMethod;
959 newArmy.PointsValueChanged += PointsValueChangedMethod;
960 }
961 }
963 private void SetNullArmyState()
964 {
965 miSaveArmyAs.Enabled = false;
966 miCloseArmy.Enabled = false;
967 miExportArmyAs.Enabled = false;
968 DisableCategoryButtons();
969 GetArmyTree().Hide();
970 }
972 private void SetNonNullArmyState(Army newArmy)
973 {
974 SetCategoryButtons(newArmy.Race.Categories);
975 EnableCategoryButtons();
976 miSaveArmyAs.Enabled = true;
977 miCloseArmy.Enabled = true;
978 miExportArmyAs.Enabled = true;
979 GetArmyTree().Show();
980 }
982 private void SetCategoryButtons(Category[] cats)
983 {
984 if (CategoryButtonsHaveChanged(cats))
985 {
986 RemoveCategoryButtons();
987 AddCategoryButtons(cats);
988 }
989 }
991 private bool CategoryButtonsHaveChanged(Category[] cats)
992 {
993 int catCount = cats.Length;
994 ToolStripItemCollection items = catToolStrip.Items;
995 bool haveChanged = (!catToolStrip.Visible || catCount != items.Count);
997 if (!haveChanged)
998 {
999 for (int i = 0; i < catCount; i++)
1001 if (cats[i].Equals(items[i+1].Tag))
1003 haveChanged = true;
1004 break;
1009 return haveChanged;
1012 private void RemoveCategoryButtons()
1014 this.Invoke(new MethodInvoker(catToolStrip.Items.Clear));
1017 private void AddCategoryButtons(Category[] cats)
1019 int catCount = cats.Length;
1020 Category cat;
1021 IBBToolStripButton[] categoryButtons = new IBBToolStripButton[catCount];
1023 for (int i = 0; i < catCount; i++)
1025 cat = cats[i];
1026 IBBToolStripButton button = new IBBToolStripButton();
1027 button.Text = cat.Name;
1028 button.Tag = cat;
1029 button.Image = global::IBBoard.WarFoundry.GUI.WinForms.Properties.Resources.list_add;
1030 button.Enabled = false;
1031 button.Click += new EventHandler(CreateUnitForCategoryButtonClick);
1032 categoryButtons[i] = button;
1035 this.Invoke(new ArrayMethodInvoker<IBBToolStripButton>(AddCatToolStripButtons), new object[] { categoryButtons });
1038 private void AddCatToolStripButtons(IBBToolStripButton[] buttons)
1040 log.Debug("Toolstrip width: " + catToolStrip.Width);
1041 catToolStrip.Items.AddRange(buttons);
1042 catToolStrip.Refresh();
1043 int buttonWidths = 0;
1045 foreach (IBBToolStripButton button in buttons)
1047 buttonWidths += button.Width;
1049 catToolStrip.Width = buttonWidths;
1050 log.Debug("Button widths: " + buttonWidths);
1051 log.Debug("Toolstrip width: " + catToolStrip.Width);
1054 private void CreateUnitForCategoryButtonClick(object sender, EventArgs e)
1056 if (sender is IBBToolStripButton)
1058 IBBToolStripButton button = (IBBToolStripButton)sender;
1059 object tag = button.Tag;
1061 if (tag is Category)
1063 AddUnitFromCategory((Category)tag);
1068 private void EnableCategoryButtons()
1070 catToolStrip.Visible = true;
1071 SetCategoryButtonState(true);
1074 private void DisableCategoryButtons()
1076 catToolStrip.Visible = false;
1077 SetCategoryButtonState(false);
1080 private void SetCategoryButtonState(bool state)
1082 foreach (IBBToolStripButton button in catToolStrip.Items)
1084 button.Enabled = state;
1088 private void miSaveArmyAs_Click(object sender, System.EventArgs e)
1090 SaveCurrentArmyAs();
1093 private void commandStack_CommandStackUpdated()
1095 bttnUndo.Enabled = commandStack.CanUndo();
1096 miUndo.Enabled = bttnUndo.Enabled;
1097 bttnRedo.Enabled = commandStack.CanRedo();
1098 miRedo.Enabled = bttnRedo.Enabled;
1100 PopulateRedoMenu();
1101 PopulateUndoMenu();
1103 bttnSaveArmy.Enabled = commandStack.IsDirty() && CurrentArmy!=null;
1104 miSaveArmy.Enabled = commandStack.IsDirty() && CurrentArmy!=null;
1107 private void PopulateRedoMenu()
1109 int redoLength = commandStack.RedoLength;
1110 int maxRedo = Math.Min(10, redoLength);
1111 ToolStripItemCollection dropDownItems = bttnRedo.DropDownItems;
1112 dropDownItems.Clear();
1114 for (int i = 1; i <= maxRedo; i++)
1116 Command cmd = commandStack.PeekRedoCommand(i);
1118 if (cmd == null)
1120 break;
1123 dropDownItems.Add(cmd.Description, null, redoMenu_Click);
1126 if (redoLength > 0)
1128 bttnRedo.Text = commandStack.PeekRedoCommand(1).Description;
1130 else
1132 bttnRedo.Text = Translation.GetTranslation("bttnRedo");
1136 private void PopulateUndoMenu()
1138 int undoLength = commandStack.UndoLength;
1139 int maxUndo = Math.Min(10, undoLength);
1140 ToolStripItemCollection dropDownItems = bttnUndo.DropDownItems;
1141 dropDownItems.Clear();
1143 for (int i = 1; i <= maxUndo; i++)
1145 Command cmd = commandStack.PeekUndoCommand(i);
1147 if (cmd == null)
1149 break;
1152 dropDownItems.Add(cmd.UndoDescription, null, undoMenu_Click);
1155 if (undoLength > 0)
1157 bttnUndo.Text = commandStack.PeekUndoCommand(1).UndoDescription;
1159 else
1161 bttnUndo.Text = Translation.GetTranslation("bttnUndo");
1165 private void miSaveArmy_Click(object sender, System.EventArgs e)
1167 SaveCurrentArmy();
1170 private void SetAppTitle()
1172 string str = AppTitle;
1174 if (CurrentGameSystem!=null)
1176 str+= " - "+CurrentGameSystem.Name;
1179 if (CurrentArmy!=null)
1181 str+= " - "+CurrentArmy.Name;
1184 this.Text = str;
1187 private void AddUnitFromCategory(Category cat)
1189 FrmNewUnit newUnit = new FrmNewUnit(CurrentArmy.Race, cat, CurrentArmy);
1190 DialogResult dr = newUnit.ShowDialog(this);
1192 if (dr == DialogResult.OK)
1194 CreateAndAddUnitCommand cmd = new CreateAndAddUnitCommand(newUnit.SelectedUnit, CurrentArmy.GetCategory(cat));
1195 commandStack.Execute(cmd);
1196 OpenUnitDialog(cmd.Unit);
1200 internal void OpenUnitDialog(Unit unit)
1202 string unitID = unit.ID;
1204 if (unitWindows.ContainsKey(unitID))
1206 unitWindows[unitID].Focus();
1208 else
1210 FrmUnit unitForm = new FrmUnit(unit, commandStack);
1211 unitWindows.Add(unitID, unitForm);
1212 unitForm.MdiParent = this;
1213 unitForm.Closing += new CancelEventHandler(unitForm_Closing);
1214 unitForm.Show();
1218 private void unitForm_Closing(object sender, CancelEventArgs e)
1220 if (sender is FrmUnit)
1222 FrmUnit unitForm = (FrmUnit) sender;
1223 unitWindows.Remove(unitForm.Unit.ID);
1227 private void FrmMain_UnitAddedMethod(object unitObj)
1229 ValidateArmy();
1232 private void ValidateArmy()
1234 ICollection<string> failureMessages;
1235 if (Validates.AsOkay(RequirementHandler.ValidateArmy(CurrentArmy, out failureMessages)))
1237 sbErrorPanel.Text = "";
1238 sbErrorPanel.Tag = "";
1240 else
1242 sbErrorPanel.Text = failureMessages.Count + " validation errors";
1243 sbErrorPanel.Tag = String.Join("\n", new List<string>(failureMessages).ToArray());
1247 private void FrmMain_UnitRemovedMethod(object unitObj)
1249 ValidateArmy();
1251 if (unitObj is Unit)
1253 Unit unit = (Unit)unitObj;
1255 //check if window is open, and close it if it is
1256 foreach (Form frm in this.MdiChildren)
1258 if (frm is FrmUnit)
1260 if (((FrmUnit)frm).Unit == unit)
1262 frm.Close();
1263 break;
1270 private void miUndo_Click(object sender, System.EventArgs e)
1272 UndoLastAction();
1275 private void miRedo_Click(object sender, System.EventArgs e)
1277 RedoAction();
1280 private void miCloseArmy_Click(object sender, EventArgs e)
1282 CloseCurrentArmy();
1285 private void miOpenArmy_Click(object sender, EventArgs e)
1287 OpenArmy();
1290 private void FrmMain_PointsValueChangedMethod(WarFoundryObject obj, double oldVal, double newVal)
1292 if (obj is Army)
1294 SetPointsPanelText();
1298 private void SetPointsPanelText()
1300 if (CurrentArmy==null)
1302 sbPointsPanel.Text = "";
1303 sbPointsPanel.ResetColor();
1305 else
1307 string pointsPanelText = String.Format(Translation.GetTranslation("statusPanelPoints"), CurrentArmy.Points, CurrentGameSystem.GetPointsName(CurrentArmy.Points), CurrentArmy.MaxPoints, CurrentGameSystem.GetPointsName(CurrentArmy.MaxPoints));
1308 sbPointsPanel.Text = pointsPanelText;
1310 if (CurrentArmy.Points>CurrentArmy.MaxPoints)
1312 sbPointsPanel.Color = Color.Red;
1314 else
1316 sbPointsPanel.ResetColor();
1321 private void SetPointsPanelToolTipText()
1323 sbPointsPanel.ToolTipText = Translation.GetTranslation("statusPanelPointsToolTip", "total points value");
1326 private void redoMenu_Click(object sender, EventArgs e)
1328 if (sender is ToolStripDropDownItem)
1330 ToolStripDropDownItem item = (ToolStripDropDownItem)sender;
1331 //we know it's an redo menu item so find it's index and redo everything
1332 int max = bttnRedo.DropDownItems.IndexOf(item);
1334 if (max >= 0)
1336 for (int i = 0; i <= max; i++)
1338 commandStack.Redo();
1344 private void undoMenu_Click(object sender, EventArgs e)
1346 if (sender is ToolStripDropDownItem)
1348 ToolStripDropDownItem item = (ToolStripDropDownItem)sender;
1349 //we know it's an redo menu item so find it's index and redo everything
1350 int max = bttnUndo.DropDownItems.IndexOf(item);
1352 if (max >= 0)
1354 for (int i = 0; i <= max; i++)
1356 commandStack.Undo();
1362 private void statusBar_DrawItem(object sender, System.Windows.Forms.StatusBarDrawItemEventArgs sbdevent)
1364 statusBar.ColorableStatusBarDrawItem(sender, sbdevent);
1367 private void FrmMain_Closing(object sender, CancelEventArgs e)
1369 if (!CloseCurrentArmy())
1371 e.Cancel = true;
1375 private void miReloadFiles_Click(object sender, System.EventArgs e)
1377 WarFoundryLoader.GetDefault().LoadFiles();
1378 sbMainPanel.Text = Translation.GetTranslation("GameSystemFilesReloaded", "Game system and race files reloaded");
1381 private void statusBar_PanelClick(object sender, StatusBarPanelClickEventArgs e)
1383 if (e.StatusBarPanel == sbErrorPanel && sbErrorPanel.Text!="")
1385 MessageBox.Show(this, sbErrorPanel.TagString, Translation.GetTranslation("FailedRequirementMessage"), MessageBoxButtons.OK, MessageBoxIcon.Warning);
1389 private void miExportArmyAsBasicHTML_Click(object sender, EventArgs e)
1391 SaveFileDialog dialog = new SaveFileDialog();
1392 dialog.Filter = Translation.GetTranslation("armyExportBasicHtmlFilter", "HTML pages") + "|*.html";
1393 dialog.Title = Translation.GetTranslation("exportArmyDialog", "Export army");
1395 DialogResult dr = dialog.ShowDialog(this);
1397 if (dr == DialogResult.OK)
1399 Army army = CurrentArmy;
1400 string filePath = dialog.FileName;
1401 log.DebugFormat("Exporting {0} to {1} as basic HTML", army.Name, filePath);
1402 WarFoundryHtmlExporter.GetDefault().ExportArmy(army, filePath);
1406 private void FrmMain_Load(object sender, EventArgs e)
1408 string gameSystemID = Preferences.GetStringProperty("currSystem");
1410 if (gameSystemID != null && !"".Equals(gameSystemID))
1412 log.Debug("Attempting to load current game system from properties");
1413 GameSystem sys = WarFoundryLoader.GetDefault().GetGameSystem(gameSystemID);
1415 if (sys != null)
1417 WarFoundryCore.CurrentGameSystem = sys;
1418 log.InfoFormat("Loaded game system {0} from properties", gameSystemID);
1423 private void miAbout_Click(object sender, EventArgs e)
1425 FrmAbout about = new FrmAbout();
1426 about.ShowDialog(this);
1429 private void miPreferences_Click(object sender, EventArgs e)
1431 FrmPreferences prefsForm = new FrmPreferences(Preferences);
1432 prefsForm.Show(this);
1435 private void miExportArmyAsBasicXml_Click(object sender, EventArgs e)
1437 Form xmlOutput = new FrmXmlExport(CurrentArmy);
1438 xmlOutput.ShowDialog(this);
1439 //SaveFileDialog dialog = new SaveFileDialog();
1440 //dialog.Filter = Translation.GetTranslation("armyExportBasicXmlFilter", "XML pages") + "|*.xml";
1441 //dialog.Title = Translation.GetTranslation("exportArmyDialog", "Export army");
1443 //DialogResult dr = dialog.ShowDialog(this);
1445 //if (dr == DialogResult.OK)
1446 //{
1447 // Army army = CurrentArmy;
1448 // string filePath = dialog.FileName;
1449 // log.DebugFormat("Exporting {0} to {1} as basic XML", army.Name, filePath);
1450 // WarFoundryXmlWithXslExporter.GetDefault().ExportArmy(army, filePath);
1451 //}