root/IBBoard.WarFoundry.GUI.WinForms/trunk/FrmMain.cs @ 140

Revision 140, 35.7 KB (checked in by ibboard, 15 months ago)
  • Remove remaining references to IBBoard.Log4Net from WinForums UI

no-open-ticket

Line 
1// This file (FrmMain.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 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.
4
5using System;
6using System.Drawing;
7using System.Drawing.Drawing2D;
8using System.Collections;
9using System.ComponentModel;
10using System.Windows.Forms;
11using System.Data;
12using System.IO;
13using System.Threading;
14using log4net;
15using IBBoard;
16using IBBoard.CustomMath;
17using IBBoard.Commands;
18using IBBoard.IO;
19using IBBoard.Lang;
20using IBBoard.Windows.Forms;
21using IBBoard.Windows.Forms.I18N;
22using IBBoard.Xml;
23using IBBoard.WarFoundry.API;
24using IBBoard.WarFoundry.API.Commands;
25using IBBoard.WarFoundry.API.Objects;
26using IBBoard.WarFoundry.API.Savers;
27using IBBoard.WarFoundry.API.Factories;
28using IBBoard.WarFoundry.API.Factories.Xml;
29
30namespace IBBoard.WarFoundry
31{
32    /// <summary>
33    /// Summary description for Form1.
34    /// </summary>
35    public class FrmMain : System.Windows.Forms.Form
36    {
37        private static readonly string AppTitle = "WarFoundry";
38        const string DefaultDataDir = "data";
39
40        private Preferences preferences;
41        protected readonly ILog logger = LogManager.GetLogger(typeof(FrmMain));
42
43        private CommandStack commandStack;
44        private ToolBarButton[] categoryButtons;
45
46        public ObjectAddDelegate UnitAddedMethod;
47        public ObjectRemoveDelegate UnitRemovedMethod;
48        public DoubleValChangedDelegate PointsValueChangedMethod;
49        //public FailedUnitRequirementDelegate FailedUnitRequirementMethod;
50
51        private FrmArmyTree armyTree;
52        private FrmDebugOutput debugWindow;
53        private string loadedFilePath;
54
55        private System.ComponentModel.IContainer components;
56        private System.Windows.Forms.ToolBar toolBar;
57        private IBBoard.Windows.Forms.IBBToolBarButton bttnNewArmy;
58        private System.Windows.Forms.ImageList buttonIcons;
59        private IBBoard.Windows.Forms.IBBToolBarButton bttnSaveArmy;
60        private System.Windows.Forms.OpenFileDialog openArmyDialog;
61        private System.Windows.Forms.SaveFileDialog saveArmyDialog;
62        private IBBoard.Windows.Forms.IBBToolBarButton bttnOpenArmy;
63        private IBBoard.Windows.Forms.IBBToolBarButton bttnSep1;
64        private IBBoard.Windows.Forms.IBBToolBarButton bttnUndo;
65        private IBBoard.Windows.Forms.IBBToolBarButton bttnRedo;
66        private System.Windows.Forms.MainMenu mainMenu;
67        private IBBoard.Windows.Forms.IBBMenuItem menuFile;
68        private IBBoard.Windows.Forms.IBBMenuItem miNewArmy;
69        private IBBoard.Windows.Forms.IBBMenuItem miOpenArmy;
70        private IBBoard.Windows.Forms.IBBMenuItem miCloseArmy;
71        private IBBoard.Windows.Forms.IBBMenuItem miSaveArmy;
72        private IBBoard.Windows.Forms.IBBMenuItem miSaveArmyAs;
73        private System.Windows.Forms.MenuItem miSep2;
74        private IBBoard.Windows.Forms.IBBMenuItem miChangeSystem;
75        private System.Windows.Forms.MenuItem miSep1;
76        private IBBoard.Windows.Forms.IBBMenuItem miReloadFiles;
77        private System.Windows.Forms.MenuItem miSep3;
78        private IBBoard.Windows.Forms.IBBMenuItem miExit;
79        private IBBoard.Windows.Forms.IBBMenuItem menuEdit;
80        private IBBoard.Windows.Forms.IBBMenuItem miUndo;
81        private IBBoard.Windows.Forms.IBBMenuItem miRedo;
82        private IBBoard.Windows.Forms.IBBMenuItem menuHelp;
83        private IBBoard.Windows.Forms.IBBMenuItem miDebugWindow;
84        private IBBoard.Windows.Forms.IBBMenuItem miAbout;
85        private IBBoard.Windows.Forms.ColorableStatusBarPanel sbMainPanel;
86        private IBBoard.Windows.Forms.ColorableStatusBarPanel sbErrorPanel;
87        private IBBoard.Windows.Forms.ColorableStatusBarPanel sbPointsPanel;
88        private System.Windows.Forms.ContextMenu undoMenu;
89        private System.Windows.Forms.ContextMenu redoMenu;
90        private IBBoard.Windows.Forms.ColorableStatusBar statusBar;
91        private System.Windows.Forms.Timer statusBarTimer;
92        private System.Windows.Forms.Panel pnlRight;
93
94        public FrmMain(string[] args)
95        {
96            this.Closing+=new CancelEventHandler(FrmMain_Closing);
97            CommandStack.CommandStackUpdated += new MethodInvoker(commandStack_CommandStackUpdated);
98
99            InitializeComponent();
100
101            Preferences = new Preferences("WarFoundry");
102            try
103            {
104                Translation.InitialiseTranslations(Constants.ExecutablePath, Preferences["language"].ToString());
105            }
106            catch (TranslationLoadException ex)
107            {
108                logger.Error(ex);
109                MessageBox.Show(this, "Translation loading failed for language " + Preferences["language"].ToString(), "Translation failure", MessageBoxButtons.OK, MessageBoxIcon.Error);
110            }
111
112            //pnlRight.Left = ClientSize.Width - pnlRight.Width - 2;
113            //pnlRight.Top = toolBar.Height + 5;
114            //pnlRight.Height = ClientRectangle.Bottom - statusBar.Height - pnlRight.Top - 3;
115
116            foreach (Control ctrl in Controls)
117            {
118                ControlTranslator.TranslateControl(ctrl);
119            }
120
121            foreach(Component comp in components.Components)
122            {
123                ControlTranslator.TranslateComponent(comp);
124            }
125
126            foreach (IBBMenuItem mi in Menu.MenuItems)
127            {
128                ControlTranslator.TranslateComponent(mi);
129            }
130
131            ControlTranslator.TranslateComponent(openArmyDialog);
132            ControlTranslator.TranslateComponent(saveArmyDialog);
133
134            WarFoundryCore.GameSystemChanged+= new GameSystemChangedDelegate(FrmMain_GameSystemChanged);
135            WarFoundryCore.ArmyChanged += new ArmyChangedDelegate(FrmMain_ArmyChanged);
136            UnitAddedMethod = new ObjectAddDelegate(FrmMain_UnitAddedMethod);
137            UnitRemovedMethod = new ObjectRemoveDelegate(FrmMain_UnitRemovedMethod);
138            PointsValueChangedMethod = new DoubleValChangedDelegate(FrmMain_PointsValueChangedMethod);
139            //FailedUnitRequirementMethod = new FailedUnitRequirementDelegate(FrmMain_FailedUnitRequirement);
140
141            sbErrorPanel.Color = Color.Red;
142
143            armyTree = new FrmArmyTree(CommandStack);
144            armyTree.MdiParent = this;
145            armyTree.Show();
146            armyTree.StartPosition = FormStartPosition.Manual;
147            armyTree.Location = new Point(this.DisplayRectangle.Width - armyTree.Width - 10, 10);
148            ControlTranslator.TranslateControl(armyTree);
149
150            // hack to load default files
151            WarFoundryLoader.GetDefault().AddLoadDirectory(new DirectoryInfo(Constants.ExecutablePath + Constants.DirectoryString + DefaultDataDir));
152
153            IWarFoundryFactory factory = WarFoundryFactoryFactory.GetFactoryFactory().GetFactory(typeof(WarFoundryXmlFactory));
154
155            if (factory != null && factory is WarFoundryXmlFactory)
156            {
157                WarFoundryLoader.GetDefault().RegisterFactory((WarFoundryXmlFactory)factory);
158            }
159
160            /*
161            if (args.Length == 1)
162            {
163                logger.Debug("Attempting to load from file");               
164                FileInfo file = new FileInfo(args[0]);
165               
166                try
167                {
168                    if (file.Extension.Equals("."+Factory.GetArmyFileExtension()))
169                    {
170                        WarFoundryCore.CurrentArmy = Factory.CreateArmyFromFile(file);
171                        logger.InfoFormat("Loaded army from {0}", file.FullName);
172                    }
173                    else if (file.Extension.Equals("."+Factory.GetSystemFileExtension()))
174                    {
175                        WarFoundryCore.CurrentGameSystem = Factory.CreateGameSystemFromFile(file);
176                        logger.InfoFormat("Loaded game system from {0}", file.FullName);
177                    }
178                }
179                catch (InvalidFileException ex)
180                {
181                    MessageBox.Show(Translation.GetTranslation("InvalidFileLoadError", "The file loaded ({0}) was not a valid WarFoundry file", file.FullName), Translation.GetTranslation("InvalidFileLoadTitle", "Invalid data file", null), MessageBoxButtons.OK, MessageBoxIcon.Error);
182                    logger.Error(ex);
183                }
184            }
185            else
186            {
187                string gameSystemID = Preferences.GetStringProperty("currSystem");
188
189                if (gameSystemID!=null && !"".Equals(gameSystemID))
190                {
191                    logger.Debug("Attempting to load current game system from properties");
192                    GameSystem sys = Factory.GetGameSystem(gameSystemID);
193                   
194                    if (sys!=null)
195                    {
196                        WarFoundryCore.CurrentGameSystem = sys;
197                        logger.InfoFormat("Loaded game system {0} from properties", gameSystemID);
198                    }
199                }
200            }*/
201        }
202
203        public static string DataPath
204        {
205            get { return Constants.ExecutablePath+Constants.DirectoryChar+"data"; }
206        }
207
208        public static String ArmiesPath
209        {
210            get { return Constants.UserDataPath+Constants.DirectoryChar+"armies"; }
211        }
212
213        public Preferences Preferences
214        {
215            get { return preferences; }
216            set { preferences = value; }
217        }
218
219        public CommandStack CommandStack
220        {
221            get
222            {
223                if (commandStack == null)
224                {                   
225                    commandStack = new CommandStack();
226                }
227
228                return commandStack;
229            }
230        }
231
232        /// <summary>
233        /// Clean up any resources being used.
234        /// </summary>
235        protected override void Dispose( bool disposing )
236        {
237            if( disposing )
238            {
239                if (components != null)
240                {
241                    components.Dispose();
242                }
243            }
244            base.Dispose( disposing );
245        }
246
247        #region Windows Form Designer generated code
248        /// <summary>
249        /// Required method for Designer support - do not modify
250        /// the contents of this method with the code editor.
251        /// </summary>
252        private void InitializeComponent()
253        {
254            this.components = new System.ComponentModel.Container();
255            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmMain));
256            this.statusBar = new IBBoard.Windows.Forms.ColorableStatusBar();
257            this.sbMainPanel = new IBBoard.Windows.Forms.ColorableStatusBarPanel();
258            this.sbErrorPanel = new IBBoard.Windows.Forms.ColorableStatusBarPanel();
259            this.sbPointsPanel = new IBBoard.Windows.Forms.ColorableStatusBarPanel();
260            this.toolBar = new System.Windows.Forms.ToolBar();
261            this.bttnNewArmy = new IBBoard.Windows.Forms.IBBToolBarButton();
262            this.bttnOpenArmy = new IBBoard.Windows.Forms.IBBToolBarButton();
263            this.bttnSaveArmy = new IBBoard.Windows.Forms.IBBToolBarButton();
264            this.bttnSep1 = new IBBoard.Windows.Forms.IBBToolBarButton();
265            this.bttnUndo = new IBBoard.Windows.Forms.IBBToolBarButton();
266            this.undoMenu = new System.Windows.Forms.ContextMenu();
267            this.bttnRedo = new IBBoard.Windows.Forms.IBBToolBarButton();
268            this.redoMenu = new System.Windows.Forms.ContextMenu();
269            this.buttonIcons = new System.Windows.Forms.ImageList(this.components);
270            this.mainMenu = new System.Windows.Forms.MainMenu(this.components);
271            this.menuFile = new IBBoard.Windows.Forms.IBBMenuItem();
272            this.miNewArmy = new IBBoard.Windows.Forms.IBBMenuItem();
273            this.miOpenArmy = new IBBoard.Windows.Forms.IBBMenuItem();
274            this.miSaveArmy = new IBBoard.Windows.Forms.IBBMenuItem();
275            this.miSaveArmyAs = new IBBoard.Windows.Forms.IBBMenuItem();
276            this.miCloseArmy = new IBBoard.Windows.Forms.IBBMenuItem();
277            this.miSep1 = new System.Windows.Forms.MenuItem();
278            this.miChangeSystem = new IBBoard.Windows.Forms.IBBMenuItem();
279            this.miSep2 = new System.Windows.Forms.MenuItem();
280            this.miReloadFiles = new IBBoard.Windows.Forms.IBBMenuItem();
281            this.miSep3 = new System.Windows.Forms.MenuItem();
282            this.miExit = new IBBoard.Windows.Forms.IBBMenuItem();
283            this.menuEdit = new IBBoard.Windows.Forms.IBBMenuItem();
284            this.miUndo = new IBBoard.Windows.Forms.IBBMenuItem();
285            this.miRedo = new IBBoard.Windows.Forms.IBBMenuItem();
286            this.menuHelp = new IBBoard.Windows.Forms.IBBMenuItem();
287            this.miAbout = new IBBoard.Windows.Forms.IBBMenuItem();
288            this.miDebugWindow = new IBBoard.Windows.Forms.IBBMenuItem();
289            this.openArmyDialog = new System.Windows.Forms.OpenFileDialog();
290            this.saveArmyDialog = new System.Windows.Forms.SaveFileDialog();
291            this.pnlRight = new System.Windows.Forms.Panel();
292            this.statusBarTimer = new System.Windows.Forms.Timer(this.components);
293            ((System.ComponentModel.ISupportInitialize)(this.sbMainPanel)).BeginInit();
294            ((System.ComponentModel.ISupportInitialize)(this.sbErrorPanel)).BeginInit();
295            ((System.ComponentModel.ISupportInitialize)(this.sbPointsPanel)).BeginInit();
296            this.SuspendLayout();
297            //
298            // statusBar
299            //
300            this.statusBar.Location = new System.Drawing.Point(0, 548);
301            this.statusBar.Name = "statusBar";
302            this.statusBar.Panels.AddRange(new System.Windows.Forms.StatusBarPanel[] {
303            this.sbMainPanel,
304            this.sbErrorPanel,
305            this.sbPointsPanel});
306            this.statusBar.ShowPanels = true;
307            this.statusBar.Size = new System.Drawing.Size(792, 22);
308            this.statusBar.TabIndex = 1;
309            this.statusBar.PanelClick += new System.Windows.Forms.StatusBarPanelClickEventHandler(this.statusBar_PanelClick);
310            this.statusBar.DrawItem += new System.Windows.Forms.StatusBarDrawItemEventHandler(this.statusBar_DrawItem);
311            //
312            // sbMainPanel
313            //
314            this.sbMainPanel.AutoSize = System.Windows.Forms.StatusBarPanelAutoSize.Spring;
315            this.sbMainPanel.Color = System.Drawing.SystemColors.WindowText;
316            this.sbMainPanel.Name = "sbMainPanel";
317            this.sbMainPanel.Style = System.Windows.Forms.StatusBarPanelStyle.OwnerDraw;
318            this.sbMainPanel.Width = 475;
319            //
320            // sbErrorPanel
321            //
322            this.sbErrorPanel.Color = System.Drawing.SystemColors.WindowText;
323            this.sbErrorPanel.Name = "sbErrorPanel";
324            this.sbErrorPanel.Style = System.Windows.Forms.StatusBarPanelStyle.OwnerDraw;
325            this.sbErrorPanel.Width = 150;
326            //
327            // sbPointsPanel
328            //
329            this.sbPointsPanel.Color = System.Drawing.SystemColors.WindowText;
330            this.sbPointsPanel.Name = "sbPointsPanel";
331            this.sbPointsPanel.Style = System.Windows.Forms.StatusBarPanelStyle.OwnerDraw;
332            this.sbPointsPanel.ToolTipText = "Current Points Total";
333            this.sbPointsPanel.Width = 150;
334            //
335            // toolBar
336            //
337            this.toolBar.Appearance = System.Windows.Forms.ToolBarAppearance.Flat;
338            this.toolBar.Buttons.AddRange(new System.Windows.Forms.ToolBarButton[] {
339            this.bttnNewArmy,
340            this.bttnOpenArmy,
341            this.bttnSaveArmy,
342            this.bttnSep1,
343            this.bttnUndo,
344            this.bttnRedo});
345            this.toolBar.ButtonSize = new System.Drawing.Size(16, 16);
346            this.toolBar.DropDownArrows = true;
347            this.toolBar.ImageList = this.buttonIcons;
348            this.toolBar.Location = new System.Drawing.Point(0, 0);
349            this.toolBar.Name = "toolBar";
350            this.toolBar.ShowToolTips = true;
351            this.toolBar.Size = new System.Drawing.Size(792, 28);
352            this.toolBar.TabIndex = 2;
353            this.toolBar.ButtonClick += new System.Windows.Forms.ToolBarButtonClickEventHandler(this.toolBar_ButtonClick);
354            //
355            // bttnNewArmy
356            //
357            this.bttnNewArmy.Enabled = false;
358            this.bttnNewArmy.ImageIndex = 0;
359            this.bttnNewArmy.Name = "bttnNewArmy";
360            //
361            // bttnOpenArmy
362            //
363            this.bttnOpenArmy.ImageIndex = 2;
364            this.bttnOpenArmy.Name = "bttnOpenArmy";
365            //
366            // bttnSaveArmy
367            //
368            this.bttnSaveArmy.Enabled = false;
369            this.bttnSaveArmy.ImageIndex = 1;
370            this.bttnSaveArmy.Name = "bttnSaveArmy";
371            //
372            // bttnSep1
373            //
374            this.bttnSep1.Name = "";
375            this.bttnSep1.Style = System.Windows.Forms.ToolBarButtonStyle.Separator;
376            //
377            // bttnUndo
378            //
379            this.bttnUndo.DropDownMenu = this.undoMenu;
380            this.bttnUndo.Enabled = false;
381            this.bttnUndo.ImageIndex = 3;
382            this.bttnUndo.Name = "bttnUndo";
383            this.bttnUndo.Style = System.Windows.Forms.ToolBarButtonStyle.DropDownButton;
384            //
385            // bttnRedo
386            //
387            this.bttnRedo.DropDownMenu = this.redoMenu;
388            this.bttnRedo.Enabled = false;
389            this.bttnRedo.ImageIndex = 4;
390            this.bttnRedo.Name = "bttnRedo";
391            this.bttnRedo.Style = System.Windows.Forms.ToolBarButtonStyle.DropDownButton;
392            //
393            // buttonIcons
394            //
395            this.buttonIcons.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("buttonIcons.ImageStream")));
396            this.buttonIcons.TransparentColor = System.Drawing.Color.Transparent;
397            this.buttonIcons.Images.SetKeyName(0, "");
398            this.buttonIcons.Images.SetKeyName(1, "");
399            this.buttonIcons.Images.SetKeyName(2, "");
400            this.buttonIcons.Images.SetKeyName(3, "");
401            this.buttonIcons.Images.SetKeyName(4, "");
402            this.buttonIcons.Images.SetKeyName(5, "");
403            this.buttonIcons.Images.SetKeyName(6, "");
404            //
405            // mainMenu
406            //
407            this.mainMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
408            this.menuFile,
409            this.menuEdit,
410            this.menuHelp});
411            //
412            // menuFile
413            //
414            this.menuFile.Index = 0;
415            this.menuFile.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
416            this.miNewArmy,
417            this.miOpenArmy,
418            this.miSaveArmy,
419            this.miSaveArmyAs,
420            this.miCloseArmy,
421            this.miSep1,
422            this.miChangeSystem,
423            this.miSep2,
424            this.miReloadFiles,
425            this.miSep3,
426            this.miExit});
427            this.menuFile.Text = "&file";
428            //
429            // miNewArmy
430            //
431            this.miNewArmy.Enabled = false;
432            this.miNewArmy.Index = 0;
433            this.miNewArmy.Text = "&new army";
434            this.miNewArmy.Click += new System.EventHandler(this.miNewArmy_Click);
435            //
436            // miOpenArmy
437            //
438            this.miOpenArmy.Index = 1;
439            this.miOpenArmy.Text = "&open army";
440            this.miOpenArmy.Click += new System.EventHandler(this.miOpenArmy_Click);
441            //
442            // miSaveArmy
443            //
444            this.miSaveArmy.Enabled = false;
445            this.miSaveArmy.Index = 2;
446            this.miSaveArmy.Text = "&save army";
447            this.miSaveArmy.Click += new System.EventHandler(this.miSaveArmy_Click);
448            //
449            // miSaveArmyAs
450            //
451            this.miSaveArmyAs.Enabled = false;
452            this.miSaveArmyAs.Index = 3;
453            this.miSaveArmyAs.Text = "save army &as...";
454            this.miSaveArmyAs.Click += new System.EventHandler(this.miSaveArmyAs_Click);
455            //
456            // miCloseArmy
457            //
458            this.miCloseArmy.Enabled = false;
459            this.miCloseArmy.Index = 4;
460            this.miCloseArmy.Text = "&close army";
461            this.miCloseArmy.Click += new System.EventHandler(this.miCloseArmy_Click);
462            //
463            // miSep1
464            //
465            this.miSep1.Index = 5;
466            this.miSep1.Text = "-";
467            //
468            // miChangeSystem
469            //
470            this.miChangeSystem.Index = 6;
471            this.miChangeSystem.Text = "change &game system";
472            this.miChangeSystem.Click += new System.EventHandler(this.miChangeSystem_Click);
473            //
474            // miSep2
475            //
476            this.miSep2.Index = 7;
477            this.miSep2.Text = "-";
478            //
479            // miReloadFiles
480            //
481            this.miReloadFiles.Index = 8;
482            this.miReloadFiles.Text = "&reload files";
483            this.miReloadFiles.Click += new System.EventHandler(this.miReloadFiles_Click);
484            //
485            // miSep3
486            //
487            this.miSep3.Index = 9;
488            this.miSep3.Text = "-";
489            //
490            // miExit
491            //
492            this.miExit.Index = 10;
493            this.miExit.Text = "e&xit";
494            this.miExit.Click += new System.EventHandler(this.miExit_Click);
495            //
496            // menuEdit
497            //
498            this.menuEdit.Index = 1;
499            this.menuEdit.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
500            this.miUndo,
501            this.miRedo});
502            this.menuEdit.Text = "&edit";
503            //
504            // miUndo
505            //
506            this.miUndo.Enabled = false;
507            this.miUndo.Index = 0;
508            this.miUndo.Text = "&undo";
509            this.miUndo.Click += new System.EventHandler(this.miUndo_Click);
510            //
511            // miRedo
512            //
513            this.miRedo.Enabled = false;
514            this.miRedo.Index = 1;
515            this.miRedo.Text = "&redo";
516            this.miRedo.Click += new System.EventHandler(this.miRedo_Click);
517            //
518            // menuHelp
519            //
520            this.menuHelp.Index = 2;
521            this.menuHelp.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
522            this.miAbout,
523            this.miDebugWindow});
524            this.menuHelp.Text = "&help";
525            //
526            // miAbout
527            //
528            this.miAbout.Enabled = false;
529            this.miAbout.Index = 0;
530            this.miAbout.Text = "&about";
531            //
532            // miDebugWindow
533            //
534            this.miDebugWindow.Index = 1;
535            this.miDebugWindow.Text = "&debug";
536            this.miDebugWindow.Click += new System.EventHandler(this.miDebugWindow_Click);
537            //
538            // saveArmyDialog
539            //
540            this.saveArmyDialog.Title = "Translatable:saveArmyDialog";
541            //
542            // pnlRight
543            //
544            this.pnlRight.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
545                        | System.Windows.Forms.AnchorStyles.Right)));
546            this.pnlRight.BackColor = System.Drawing.SystemColors.AppWorkspace;
547            this.pnlRight.Location = new System.Drawing.Point(726, 30);
548            this.pnlRight.Name = "pnlRight";
549            this.pnlRight.Size = new System.Drawing.Size(64, 516);
550            this.pnlRight.TabIndex = 4;
551            this.pnlRight.Visible = false;
552            this.pnlRight.Paint += new System.Windows.Forms.PaintEventHandler(this.pnlRight_Paint);
553            //
554            // statusBarTimer
555            //
556            this.statusBarTimer.Interval = 5000;
557            this.statusBarTimer.Tick += new System.EventHandler(this.statusBarTimer_Tick);
558            //
559            // FrmMain
560            //
561            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
562            this.ClientSize = new System.Drawing.Size(792, 570);
563            this.Controls.Add(this.pnlRight);
564            this.Controls.Add(this.toolBar);
565            this.Controls.Add(this.statusBar);
566            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
567            this.IsMdiContainer = true;
568            this.Menu = this.mainMenu;
569            this.Name = "FrmMain";
570            this.Text = "WarFoundry";
571            ((System.ComponentModel.ISupportInitialize)(this.sbMainPanel)).EndInit();
572            ((System.ComponentModel.ISupportInitialize)(this.sbErrorPanel)).EndInit();
573            ((System.ComponentModel.ISupportInitialize)(this.sbPointsPanel)).EndInit();
574            this.ResumeLayout(false);
575            this.PerformLayout();
576
577        }
578        #endregion
579
580        /// <summary>
581        /// The main entry point for the application.
582        /// </summary>
583        [STAThread]
584        static void Main(string[] args)
585        {
586            try
587            {
588                Application.EnableVisualStyles();
589                Application.Run(new FrmMain(args));
590            }
591            catch(Exception ex)
592            {
593                   LogManager.GetLogger(typeof(FrmMain)).Fatal(ex);
594                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);
595            }
596        }
597
598        private void miExit_Click(object sender, System.EventArgs e)
599        {
600            Application.Exit();
601        }
602
603        private void miNewArmy_Click(object sender, System.EventArgs e)
604        {
605            createNewArmy();
606        }
607
608        private void createNewArmy()
609        {
610            if (closeCurrentArmy())
611            {
612                FrmNewArmy newArmy = new FrmNewArmy(CurrentGameSystem);
613                DialogResult dr = newArmy.ShowDialog();
614
615                if (dr == DialogResult.OK)
616                {
617                    CurrentArmy = new Army(newArmy.SelectedRace, newArmy.ArmyName, newArmy.ArmySize);
618                }
619            }
620        }
621
622        private bool openArmy()
623        {
624            if (closeCurrentArmy())
625            {
626                if (openArmyDialog.Filter=="")
627                {
628                    string savePath = ArmiesPath;
629               
630                    if (!Directory.Exists(savePath))
631                    {
632                        Directory.CreateDirectory(savePath);
633                    }
634
635                    openArmyDialog.InitialDirectory = savePath;
636                    openArmyDialog.Filter = Translation.GetTranslation("armyFileFilter")+"|*.army";
637                    openArmyDialog.Title = Translation.GetTranslation("openArmyDialog");
638
639                }
640
641                DialogResult dr = openArmyDialog.ShowDialog(this);
642
643                if (dr == DialogResult.OK)
644                {
645                    /*
646                    try
647                    {
648                        CurrentArmy = Factory.LoadArmy(openArmyDialog.FileName);
649                        return true;                   
650                    }
651                    catch (InvalidFileException ex)
652                    {
653                        logger.Error(ex);
654                        MessageBox.Show(this, ex.Message, Translation.GetTranslation("InvalidFileBoxTitle", "Invalid data file"), MessageBoxButtons.OK, MessageBoxIcon.Error);
655                        return false;
656                    }
657                     * */
658                    return false;
659                }
660                else
661                {
662                    return false;
663                }
664            }
665            else
666            {
667                return false;
668            }
669        }
670
671        private bool closeCurrentArmy()
672        {
673            if (CurrentArmy!=null)
674            {
675                bool canClose = false;
676
677                if (CommandStack.IsDirty())
678                {
679                    DialogResult dr = MessageBox.Show(this, "The army \""+CurrentArmy.Name+"\" has been modified.\r\nSave changes before closing army?", "Unsaved changes", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button3);
680
681                    if (dr == DialogResult.Yes)
682                    {
683                        canClose = SaveCurrentArmy();
684                    }
685                    else if (dr == DialogResult.No)
686                    {
687                        canClose = true;
688                    }
689                    //else they said cancel and we default to "canClose = false" so do nothing
690                }
691                else
692                {
693                    canClose = true;
694                }
695
696                if (canClose)
697                {
698                    //do close
699                    disableCategoryButtons();
700                    CurrentArmy = null;
701                    return true;
702                }
703                else
704                {
705                    return false;
706                }
707            }
708            else
709            {
710                disableCategoryButtons();
711                //pretend we succeeded
712                return true;
713            }
714        }
715
716        private void undoLastAction()
717        {
718            if (commandStack.CanUndo())
719            {
720                commandStack.Undo();
721            }
722        }
723
724        private void redoAction()
725        {
726            if (commandStack.CanRedo())
727            {
728                commandStack.Redo();
729            }
730        }
731
732        private bool SaveCurrentArmy()
733        {
734            bool saved = false;
735
736            if (loadedFilePath != null || PromptForFilePath())
737            {
738                saved = SaveCurrentArmyToFile();
739            }
740
741            return saved;
742        }
743
744        private bool SaveCurrentArmyAs()
745        {
746            bool saved = false;
747
748            if (PromptForFilePath())
749            {
750                saved = SaveCurrentArmyToFile();
751            }
752           
753            return saved;
754        }
755
756        private bool SaveCurrentArmyToFile()
757        {
758            if (WarFoundrySaver.GetSaver().Save(CurrentArmy, loadedFilePath))
759            {
760                miSaveArmy.Enabled = false;
761                bttnSaveArmy.Enabled = false;
762                CommandStack.setCleanMark();
763                return true;
764            }
765            else
766            {
767                loadedFilePath = null;
768                MessageBox.Show(this, Translation.GetTranslation("SaveFailed"), Translation.GetTranslation("SaveFailedTitle"), MessageBoxButtons.OK, MessageBoxIcon.Error);
769                return false;
770            }
771        }
772
773        private bool PromptForFilePath()
774        {
775            if (saveArmyDialog.Filter == "")
776            {
777                string savePath = ArmiesPath;
778               
779                if (!Directory.Exists(savePath))
780                {
781                    Directory.CreateDirectory(savePath);
782                }
783
784                saveArmyDialog.InitialDirectory = savePath;
785                saveArmyDialog.Filter = Translation.GetTranslation("armyFileFilter")+"|*.army";
786                saveArmyDialog.Title = Translation.GetTranslation("saveArmyDialog");
787            }
788
789            DialogResult dr = saveArmyDialog.ShowDialog(this);
790
791            if (dr == DialogResult.OK)
792            {
793                loadedFilePath = saveArmyDialog.FileName;
794                return true;
795            }
796            else
797            {
798                return false;
799            }
800        }
801
802        private void toolBar_ButtonClick(object sender, System.Windows.Forms.ToolBarButtonClickEventArgs e)
803        {
804            if (e.Button == bttnUndo)
805            {
806                undoLastAction();
807            }
808            else if (e.Button == bttnRedo)
809            {
810                redoAction();
811            }
812            else if (e.Button == bttnNewArmy)
813            {
814                createNewArmy();
815            }
816            else if (e.Button == bttnOpenArmy)
817            {
818                openArmy();
819            }
820            else if (e.Button == bttnSaveArmy)
821            {
822                SaveCurrentArmy();
823            }
824            else
825            {
826                //it must be one of our extra buttons for the categories
827                addUnitFromCategory((Category)e.Button.Tag);
828            }
829        }
830
831        private GameSystem CurrentGameSystem
832        {
833            get { return WarFoundryCore.CurrentGameSystem; }
834            set { WarFoundryCore.CurrentGameSystem = value; }
835        }
836
837        private static Army CurrentArmy
838        {
839            get { return WarFoundryCore.CurrentArmy; }
840            set { WarFoundryCore.CurrentArmy = value; }
841        }
842
843        private void SelectGameSystem()
844        {
845            FrmSelectSystem selectSystem = new FrmSelectSystem();
846            DialogResult dr = selectSystem.ShowDialog(this);
847
848            if (dr==DialogResult.OK)
849            {
850                closeCurrentArmy();
851                CurrentGameSystem = selectSystem.GameSystem;
852            }
853        }
854
855        private void miChangeSystem_Click(object sender, System.EventArgs e)
856        {
857            SelectGameSystem();
858        }
859
860        private void FrmMain_GameSystemChanged(GameSystem oldSystem, GameSystem newSystem)
861        {
862            miNewArmy.Enabled = newSystem != null;
863            bttnNewArmy.Enabled = newSystem != null;
864            setAppTitle();
865            removeCategoryButtons();
866            addCategoryButtons();
867        }
868
869        private void FrmMain_ArmyChanged(Army oldArmy, Army newArmy)
870        {       
871            setAppTitle();
872
873            if (oldArmy != null)
874            {
875                oldArmy.UnitAdded += UnitAddedMethod;
876                oldArmy.UnitRemoved += UnitRemovedMethod;
877                oldArmy.PointsValueChanged += PointsValueChangedMethod;
878            }
879
880            if (CurrentArmy==null)
881            {
882                miSaveArmyAs.Enabled = false;
883                miCloseArmy.Enabled = false;
884                disableCategoryButtons();
885            }
886            else
887            {
888                newArmy.UnitAdded += UnitAddedMethod;
889                newArmy.UnitRemoved += UnitRemovedMethod;
890                newArmy.PointsValueChanged += PointsValueChangedMethod;
891                //TODO: Clear all buttons
892                miSaveArmyAs.Enabled = true;
893                miCloseArmy.Enabled = true;
894                enableCategoryButtons();
895
896                if (newArmy.Race.HasCategoryOverrides())
897                {
898                    removeCategoryButtons();
899                    addCategoryButtons(newArmy.Race.Categories);
900                }
901            }
902
903            CommandStack.Reset();
904
905            miSaveArmy.Enabled = false;
906            bttnSaveArmy.Enabled = false;
907
908            setPointsPanelText();
909        }
910
911        private void addCategoryButtons()
912        {
913            if (CurrentGameSystem!=null)
914            {
915                addCategoryButtons(CurrentGameSystem.Categories);
916            }
917        }
918
919        private void addCategoryButtons(Category[] cats)
920        {
921            int catCount = cats.Length;
922            Category cat;
923            categoryButtons = new ToolBarButton[catCount+1];
924
925            ToolBarButton sep = new ToolBarButton();
926            sep.Style = ToolBarButtonStyle.Separator;
927            categoryButtons[0] = sep;
928
929            IBBToolBarButton button;
930
931            for (int i = 0; i<catCount; i++)
932            {
933                cat = cats[i];
934                button = new IBBToolBarButton();
935                ///button.Name = "bttnAddCategory" + cat.Name[0].ToString();
936                button.Text = cat.Name.ToString();//String.Format(Translation.GetTranslation("bttnAddCategory"), cat.Name);
937                button.Tag = cat;
938                button.ImageIndex = 6;
939                button.Enabled = false;
940                categoryButtons[i+1] = button;
941            }
942
943            this.Invoke(new ToolBarButtonRangeDelegate(toolBar.Buttons.AddRange), new object[]{categoryButtons});
944        }
945
946        private void removeCategoryButtons()
947        {
948            if (categoryButtons!=null)
949            {
950                for (int i = 0; i<categoryButtons.Length; i++)
951                {
952                    this.Invoke(new ToolBarButtonDelegate(toolBar.Buttons.Remove), new object[]{categoryButtons[i]});
953                }
954            }
955        }
956
957        private void enableCategoryButtons()
958        {
959            setCategoryButtonState(true);
960        }
961
962        private void disableCategoryButtons()
963        {
964            setCategoryButtonState(false);
965        }
966
967        private void setCategoryButtonState(bool state)
968        {
969            if (categoryButtons!=null)
970            {
971                for (int i = 0; i<categoryButtons.Length; i++)
972                {
973                    categoryButtons[i].Enabled = state;
974                }
975            }
976        }
977
978        private void miSaveArmyAs_Click(object sender, System.EventArgs e)
979        {
980            SaveCurrentArmyAs();
981        }
982
983        private void commandStack_CommandStackUpdated()
984        {
985            bttnUndo.Enabled = commandStack.CanUndo();
986            miUndo.Enabled = bttnUndo.Enabled;
987            bttnRedo.Enabled = commandStack.CanRedo();
988            miRedo.Enabled = bttnRedo.Enabled;
989            MenuItem[] menuItems = null;
990            int redoLength = commandStack.RedoLength;
991            int maxRedo = Math.Min(10, redoLength);
992           
993            if (redoLength > 0)
994            {
995                menuItems = new MenuItem[maxRedo];
996                Command com;
997                MenuItem mi;
998
999                for (int i = 0; i < maxRedo; i++)
1000                {
1001                    com = commandStack.PeekRedoCommand(i+1);
1002
1003                    if (com == null)
1004                    {
1005                        break;
1006                    }
1007
1008                    mi = new MenuItem(com.Description);
1009                    mi.Click+=new EventHandler(redoMenu_Click);
1010                    menuItems[i] = mi;
1011                }
1012            }
1013
1014            redoMenu.MenuItems.Clear();
1015
1016            if (menuItems!=null && menuItems[0]!=null)
1017            {
1018                bttnRedo.ToolTipText = menuItems[0].Text;
1019                redoMenu.MenuItems.AddRange(menuItems);
1020            }
1021
1022            int undoLength = commandStack.UndoLength;
1023            int maxUndo = Math.Min(10, undoLength);
1024            MenuItem[] menuItemsUndo = null;
1025           
1026            if (undoLength > 0)
1027            {
1028                menuItemsUndo = new MenuItem[maxUndo];
1029                Command com;
1030                MenuItem mi;
1031
1032                for (int i = 0; i < maxUndo; i++)
1033                {
1034                    com = commandStack.PeekUndoCommand(i+1);
1035
1036                    if (com == null)
1037                    {
1038                        break;
1039                    }
1040
1041                    mi = new MenuItem(com.UndoDescription);
1042                    mi.Click+=new EventHandler(undoMenu_Click);
1043                    menuItemsUndo[i] = mi;
1044                }
1045            }
1046
1047            undoMenu.MenuItems.Clear();
1048
1049            if (menuItemsUndo!=null && menuItemsUndo[0]!=null)
1050            {
1051                bttnUndo.ToolTipText = menuItemsUndo[0].Text;
1052                undoMenu.MenuItems.AddRange(menuItemsUndo);
1053            }
1054
1055            bool canSave = loadedFilePath != null;
1056            bttnSaveArmy.Enabled = commandStack.IsDirty() && CurrentArmy!=null && canSave;
1057            miSaveArmy.Enabled = commandStack.IsDirty() && CurrentArmy!=null && canSave;
1058        }
1059
1060        private void miSaveArmy_Click(object sender, System.EventArgs e)
1061        {
1062            SaveCurrentArmy();
1063        }
1064
1065        private void setAppTitle()
1066        {
1067            string str = AppTitle;
1068
1069            if (CurrentGameSystem!=null)
1070            {
1071                str+= " - "+CurrentGameSystem.Name;
1072            }
1073
1074            if (CurrentArmy!=null)
1075            {
1076                str+= " - "+CurrentArmy.Name;
1077            }
1078
1079            this.Text = str;
1080        }
1081
1082        private void addUnitFromCategory(Category cat)
1083        {
1084            FrmNewUnit newUnit = new FrmNewUnit(CurrentArmy.Race, cat, CurrentArmy);
1085            DialogResult dr = newUnit.ShowDialog(this);
1086
1087            if (dr == DialogResult.OK)
1088            {
1089                CreateAndAddUnitCommand cmd = new CreateAndAddUnitCommand(newUnit.SelectedUnit, CurrentArmy);
1090                commandStack.Execute(cmd);
1091            }
1092        }
1093
1094        private void FrmMain_UnitAddedMethod(object unitObj)
1095        {
1096            if (unitObj is Unit)
1097            {
1098                Unit unit = (Unit)unitObj;
1099                sbErrorPanel.Text = "";
1100            }
1101        }
1102
1103        private void FrmMain_UnitRemovedMethod(object unitObj)
1104        {
1105            if (unitObj is Unit)
1106            {
1107                Unit unit = (Unit)unitObj;
1108                sbErrorPanel.Text = "";
1109
1110                //check if window is open, and close it if it is
1111                foreach (Form frm in this.MdiChildren)
1112                {
1113                    if (frm is FrmUnit)
1114                    {
1115                        if (((FrmUnit)frm).Unit == unit)
1116                        {
1117                            frm.Close();
1118                            break;
1119                        }
1120                    }
1121                }
1122            }
1123        }
1124
1125        /*private void FrmMain_FailedUnitRequirement(FailedUnitRequirement failedRequirement)
1126        {
1127            sbErrorPanel.Text = Translation.GetTranslation("UnitRequirementFailed", "Unit Requirement Failed");
1128            sbErrorPanel.Tag = failedRequirement.Description;
1129        }*/
1130
1131        /*public void MdiChildMoved()
1132        {
1133            Point mouseAt = PointToClient(ActiveMdiChild.Location);
1134
1135            if (Comparisons.ValueWithinAmount(pnlRight.Right, ActiveMdiChild.Right, 10))
1136            {
1137                pnlRight.Visible = true;
1138                //pnlRight.Container.Add(ActiveMdiChild);
1139            }
1140            else
1141            {
1142                pnlRight.Visible = false;
1143            }
1144        }*/
1145
1146        public void pnlRight_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
1147        {
1148            HatchBrush dockCueBrush = new HatchBrush(HatchStyle.LightDownwardDiagonal, Color.White, Color.Gray);
1149            Pen dockCuePen = new Pen(dockCueBrush, 10);
1150            e.Graphics.DrawRectangle(dockCuePen, new Rectangle(pnlRight.Left, pnlRight.Top, pnlRight.Width, pnlRight.Height));
1151        }
1152
1153        private void miUndo_Click(object sender, System.EventArgs e)
1154        {
1155            undoLastAction();
1156        }
1157
1158        private void miRedo_Click(object sender, System.EventArgs e)
1159        {
1160            redoAction();
1161        }
1162
1163        private void miCloseArmy_Click(object sender, EventArgs e)
1164        {
1165            closeCurrentArmy();
1166        }
1167
1168        private void miOpenArmy_Click(object sender, EventArgs e)
1169        {
1170            openArmy();
1171        }
1172
1173        private void FrmMain_PointsValueChangedMethod(WarFoundryObject obj, double oldVal, double newVal)
1174        {
1175            if (obj is Army)
1176            {
1177                setPointsPanelText();
1178            }
1179        }
1180
1181        private void setPointsPanelText()
1182        {   
1183            if (CurrentArmy==null)
1184            {
1185                sbPointsPanel.Text = "";
1186                sbPointsPanel.ResetColor();
1187            }
1188            else
1189            {
1190                sbPointsPanel.Text = String.Format(Translation.GetTranslation("statusPanelPoints"), CurrentArmy.PointsTotal, CurrentArmy.MaxPoints);
1191
1192                if (CurrentArmy.PointsTotal>CurrentArmy.MaxPoints)
1193                {
1194                    sbPointsPanel.Color = Color.Red;
1195                }
1196                else
1197                {
1198                    sbPointsPanel.ResetColor();
1199                }
1200            }
1201        }
1202
1203        private void redoMenu_Click(object sender, EventArgs e)
1204        {
1205            if (sender is MenuItem)
1206            {
1207                MenuItem mi = (MenuItem)sender;
1208
1209                if (mi.Parent == redoMenu)
1210                {
1211                    //we know it's an redo menu item so find it's index and redo everything                 
1212                    int max = mi.Index;
1213
1214                    for (int i = 0; i <= max; i++)
1215                    {
1216                        commandStack.Redo();
1217                    }
1218                }
1219            }
1220        }
1221
1222        private void undoMenu_Click(object sender, EventArgs e)
1223        {
1224            if (sender is MenuItem)
1225            {
1226                MenuItem mi = (MenuItem)sender;
1227
1228                if (mi.Parent == undoMenu)
1229                {
1230                    //we know it's an undo menu item so find it's index and undo everything
1231                    int max = mi.Index;
1232                    for (int i = 0; i <= max; i++)
1233                    {
1234                        commandStack.Undo();
1235                    }
1236                }
1237            }
1238        }
1239
1240        private void statusBar_DrawItem(object sender, System.Windows.Forms.StatusBarDrawItemEventArgs sbdevent)
1241        {
1242            statusBar.ColorableStatusBarDrawItem(sender, sbdevent);
1243        }
1244
1245        private void miDebugWindow_Click(object sender, EventArgs e)
1246        {
1247            if (debugWindow == null || debugWindow.IsDisposed)
1248            {
1249                debugWindow = new FrmDebugOutput();
1250            }
1251
1252            debugWindow.Show();
1253            debugWindow.Focus();
1254        }
1255
1256        private void FrmMain_Closing(object sender, CancelEventArgs e)
1257        {
1258            if (!closeCurrentArmy())
1259            {
1260                e.Cancel = true;
1261            }
1262        }
1263
1264        private void miReloadFiles_Click(object sender, System.EventArgs e)
1265        {
1266            WarFoundryLoader.GetDefault().LoadFiles();
1267            sbMainPanel.Text = Translation.GetTranslation("GameSystemFilesReloaded", "Game system and race files reloaded");
1268            statusBarTimer.Enabled = true;
1269        }
1270
1271        private void statusBarTimer_Tick(object sender, System.EventArgs e)
1272        {
1273            sbMainPanel.Text = "";
1274            statusBarTimer.Enabled = false;
1275        }
1276
1277        private void statusBar_PanelClick(object sender, StatusBarPanelClickEventArgs e)
1278        {
1279            if (e.StatusBarPanel == sbErrorPanel && sbErrorPanel.Text!="")
1280            {
1281                MessageBox.Show(this, sbErrorPanel.TagString, Translation.GetTranslation("FailedRequirementMessage"), MessageBoxButtons.OK, MessageBoxIcon.Warning);
1282            }
1283        }
1284    }
1285}
Note: See TracBrowser for help on using the browser.