dev@142: // This file (FrmMain.cs) is a part of the IBBoard.WarFoundry.GUI.WinForms project and is copyright 2007, 2008, 2009 IBBoard.
dev@142: //
dev@142: // 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.
dev@142:
dev@142: using System;
dev@142: using System.Collections.Generic;
dev@142: using System.Drawing;
dev@142: using System.Drawing.Drawing2D;
dev@142: using System.ComponentModel;
dev@142: using System.Windows.Forms;
dev@142: using System.Data;
dev@142: using System.IO;
dev@142: using System.Threading;
dev@142: using log4net;
dev@142: using IBBoard;
dev@142: using IBBoard.CustomMath;
dev@142: using IBBoard.Commands;
dev@142: using IBBoard.IO;
dev@142: using IBBoard.Lang;
dev@142: using IBBoard.Windows.Forms;
dev@142: using IBBoard.Windows.Forms.I18N;
dev@142: using IBBoard.Xml;
dev@142: using IBBoard.WarFoundry.API;
dev@142: using IBBoard.WarFoundry.API.Commands;
dev@142: using IBBoard.WarFoundry.API.Exporters;
dev@142: using IBBoard.WarFoundry.API.Objects;
dev@196: using IBBoard.WarFoundry.API.Objects.Requirement;
snowblizz@190: using IBBoard.WarFoundry.API.Util;
dev@142: using IBBoard.WarFoundry.API.Savers;
dev@193: using IBBoard.WarFoundry.API.Savers.Xml;
dev@142: using IBBoard.WarFoundry.API.Factories;
dev@142: using IBBoard.WarFoundry.API.Factories.Xml;
dev@142:
dev@142: namespace IBBoard.WarFoundry.GUI.WinForms
dev@142: {
dev@142: ///
dev@142: /// Summary description for Form1.
dev@142: ///
dev@142: public class FrmMain : System.Windows.Forms.Form
dev@142: {
dev@142: private static readonly string AppTitle = "WarFoundry";
dev@183: internal static readonly string VERSION = "0.1";
dev@142: const string DefaultDataDir = "data";
snowblizz@190: /* public static string pointsAbbrevSingle;
snowblizz@190: public static string pointsAbbrevPlural;
snowblizz@190: public static string pointsAbbreviation;
snowblizz@190: public static string pointsNameSingle;
snowblizz@190: public static string pointsNamePlural;
snowblizz@190: public static string pointsName;*/
dev@142:
dev@142: private Preferences preferences;
dev@142: private readonly ILog log = LogManager.GetLogger(typeof(FrmMain));
dev@142:
dev@142: private CommandStack commandStack;
dev@142:
dev@142: public ObjectAddDelegate UnitAddedMethod;
dev@142: public ObjectRemoveDelegate UnitRemovedMethod;
dev@142: public DoubleValChangedDelegate PointsValueChangedMethod;
dev@142: //public FailedUnitRequirementDelegate FailedUnitRequirementMethod;
dev@142:
dev@142: private FrmArmyTree armyTree;
dev@142: private string loadedFilePath;
dev@142: private Dictionary unitWindows;
dev@142:
dev@142: private System.ComponentModel.IContainer components;
dev@142: private System.Windows.Forms.OpenFileDialog openArmyDialog;
dev@142: private System.Windows.Forms.SaveFileDialog saveArmyDialog;
dev@142: private System.Windows.Forms.MainMenu mainMenu;
dev@142: private IBBoard.Windows.Forms.ColorableStatusBarPanel sbMainPanel;
dev@142: private IBBoard.Windows.Forms.ColorableStatusBarPanel sbErrorPanel;
dev@142: private IBBoard.Windows.Forms.ColorableStatusBarPanel sbPointsPanel;
dev@142: private System.Windows.Forms.ContextMenu undoMenu;
dev@142: private System.Windows.Forms.ContextMenu redoMenu;
dev@196: private IBBoard.Windows.Forms.ColorableStatusBar statusBar;
dev@142: private MenuStrip menuStrip;
dev@142: private IBBToolStripMenuItem menuFile;
dev@142: private IBBToolStripMenuItem miNewArmy;
dev@142: private IBBToolStripMenuItem miOpenArmy;
dev@142: private IBBToolStripMenuItem miSaveArmy;
dev@142: private IBBToolStripMenuItem miSaveArmyAs;
dev@142: private IBBToolStripMenuItem miExportArmyAs;
dev@142: private IBBToolStripMenuItem miExportArmyAsBasicHTML;
dev@142: private IBBToolStripMenuItem miCloseArmy;
dev@142: private ToolStripSeparator toolStripSeparator1;
dev@142: private IBBToolStripMenuItem miReloadFiles;
dev@142: private ToolStripSeparator toolStripSeparator2;
dev@142: private IBBToolStripMenuItem miExit;
dev@142: private IBBToolStripMenuItem menuEdit;
dev@142: private IBBToolStripMenuItem miUndo;
dev@142: private IBBToolStripMenuItem miRedo;
dev@142: private IBBToolStripMenuItem menuHelp;
dev@142: private ToolStrip mainToolStrip;
dev@142: private IBBToolStripButton bttnNewArmy;
dev@142: private IBBToolStripButton bttnOpenArmy;
dev@142: private IBBToolStripButton bttnSaveArmy;
dev@142: private ToolStripSeparator toolStripSeparator3;
dev@142: private IBBToolStripSplitButton bttnUndo;
dev@142: private IBBToolStripSplitButton bttnRedo;
dev@142: private ToolStrip catToolStrip;
dev@140: private ToolStripPanel toolStripPanel;
dev@140: private ToolStripSeparator toolStripSeparator4;
dev@142: private IBBToolStripMenuItem miPreferences;
Dan@207: private ToolStripMenuItem miExportArmyAsBasicXml;
dev@142: private IBBToolStripMenuItem miAbout;
dev@142:
snowblizz@190:
dev@142: ///
dev@142: /// The main entry point for the application.
dev@142: ///
dev@142: [STAThread]
dev@142: static void Main(string[] args)
dev@142: {
dev@142: try
dev@142: {
dev@142: LogManager.GetLogger(typeof(FrmMain)).Info("Starting WarFoundry WinForms");
dev@142: Application.EnableVisualStyles();
dev@142: Application.Run(new FrmMain(args));
dev@142: LogManager.GetLogger(typeof(FrmMain)).Info("Closing WarFoundry WinForms");
dev@142: }
dev@142: catch (Exception ex)
dev@142: {
dev@142: LogManager.GetLogger(typeof(FrmMain)).Fatal(ex);
dev@142: 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);
dev@142: }
dev@142: }
dev@142:
dev@142: public FrmMain(string[] args)
dev@142: {
dev@142: this.Closing+=new CancelEventHandler(FrmMain_Closing);
dev@142: CommandStack.CommandStackUpdated += new MethodInvoker(commandStack_CommandStackUpdated);
dev@142:
dev@142: InitializeComponent();
dev@142: toolStripPanel.Join(mainToolStrip, 0, 0);
dev@142: toolStripPanel.Join(catToolStrip, mainToolStrip.Right, 0);
dev@142:
dev@142: Preferences = new Preferences("WarFoundry");
dev@142: try
dev@142: {
dev@142: Translation.InitialiseTranslations(Constants.ExecutablePath, Preferences["language"].ToString());
dev@142: }
dev@142: catch (TranslationLoadException ex)
dev@142: {
dev@142: log.Error("Translation loading failed for language " + Preferences["language"].ToString(), ex);
dev@142: MessageBox.Show(this, "Translation loading failed for language " + Preferences["language"].ToString(), "Translation failure", MessageBoxButtons.OK, MessageBoxIcon.Error);
dev@140: }
dev@140:
dev@140: Translation.TranslationChanged += new MethodInvoker(TranslationChanged);
dev@140:
dev@142: TranslateControls();
dev@142: unitWindows = new Dictionary();
dev@142:
dev@142: WarFoundryCore.GameSystemChanged+= new GameSystemChangedDelegate(FrmMain_GameSystemChanged);
dev@142: WarFoundryCore.ArmyChanged += new ArmyChangedDelegate(FrmMain_ArmyChanged);
dev@142: UnitAddedMethod = new ObjectAddDelegate(FrmMain_UnitAddedMethod);
dev@142: UnitRemovedMethod = new ObjectRemoveDelegate(FrmMain_UnitRemovedMethod);
dev@142: PointsValueChangedMethod = new DoubleValChangedDelegate(FrmMain_PointsValueChangedMethod);
dev@142: //FailedUnitRequirementMethod = new FailedUnitRequirementDelegate(FrmMain_FailedUnitRequirement);
dev@142:
snowblizz@190:
dev@142: sbErrorPanel.Color = Color.Red;
snowblizz@190: SetPointsPanelToolTipText();
dev@142:
dev@144: // hack to load default files
dev@144: WarFoundryLoader.GetDefault().AddLoadDirectory(new DirectoryInfo(Constants.ExecutablePath + Constants.DirectoryString + DefaultDataDir));
dev@144: WarFoundryLoader.GetDefault().RegisterFactory(WarFoundryXmlFactory.GetFactory());
dev@142: WarFoundryLoader.GetDefault().FileLoadingFinished += FileLoadingFinished;
dev@193: WarFoundrySaver.SetFileSaver(new WarFoundryXmlFileSaver());
dev@140: }
dev@140:
dev@159: private FrmArmyTree GetArmyTree()
dev@159: {
dev@159: if (armyTree == null || armyTree.IsDisposed)
dev@159: {
dev@159: CreateArmyTree();
dev@159: }
dev@159:
dev@159: return armyTree;
dev@159: }
dev@159:
dev@159: private void CreateArmyTree()
dev@159: {
dev@159: armyTree = new FrmArmyTree(CommandStack);
dev@159: armyTree.MdiParent = this;
dev@159: armyTree.StartPosition = FormStartPosition.Manual;
dev@159: armyTree.Location = new Point(this.DisplayRectangle.Width - armyTree.Width - 10, 10);
dev@159: }
dev@159:
dev@140: private void TranslateControls()
dev@140: {
dev@140: ControlTranslator.TranslateControls(Controls);
dev@140: ControlTranslator.TranslateComponents(components.Components);
dev@140: ControlTranslator.TranslateComponent(openArmyDialog);
dev@140: ControlTranslator.TranslateComponent(saveArmyDialog);
snowblizz@190: //translate pointspanel and tooltip
snowblizz@190: SetPointsPanelToolTipText();
snowblizz@190: SetPointsPanelText();
snowblizz@190: }
dev@140:
dev@140: void TranslationChanged()
dev@140: {
dev@140: TranslateControls();
dev@142: }
dev@142:
dev@142: public static string DataPath
dev@142: {
dev@142: get { return Constants.ExecutablePath+Constants.DirectoryChar+"data"; }
dev@142: }
dev@142:
dev@142: public static String ArmiesPath
dev@142: {
dev@142: get { return Environment.GetFolderPath(Environment.SpecialFolder.Personal); }
dev@142: }
dev@142:
dev@142: public Preferences Preferences
dev@142: {
dev@142: get { return preferences; }
dev@142: set { preferences = value; }
dev@142: }
dev@142:
dev@142: public CommandStack CommandStack
dev@142: {
dev@142: get
dev@142: {
dev@142: if (commandStack == null)
dev@142: {
dev@142: commandStack = new CommandStack();
dev@142: }
dev@142:
dev@142: return commandStack;
dev@142: }
dev@142: }
dev@142:
dev@142: ///
dev@142: /// Clean up any resources being used.
dev@142: ///
dev@142: protected override void Dispose( bool disposing )
dev@142: {
dev@142: if( disposing )
dev@142: {
dev@142: if (components != null)
dev@142: {
dev@142: components.Dispose();
dev@142: }
dev@142: }
dev@142: base.Dispose( disposing );
dev@142: }
dev@142:
dev@142: #region Windows Form Designer generated code
dev@142: ///
dev@142: /// Required method for Designer support - do not modify
dev@142: /// the contents of this method with the code editor.
dev@142: ///
dev@142: private void InitializeComponent()
dev@140: {
dev@196: this.components = new System.ComponentModel.Container();
dev@196: System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmMain));
dev@196: this.undoMenu = new System.Windows.Forms.ContextMenu();
dev@196: this.redoMenu = new System.Windows.Forms.ContextMenu();
dev@196: this.mainMenu = new System.Windows.Forms.MainMenu(this.components);
dev@196: this.openArmyDialog = new System.Windows.Forms.OpenFileDialog();
dev@196: this.saveArmyDialog = new System.Windows.Forms.SaveFileDialog();
dev@196: this.menuStrip = new System.Windows.Forms.MenuStrip();
dev@196: this.menuFile = new IBBoard.Windows.Forms.IBBToolStripMenuItem();
dev@196: this.miNewArmy = new IBBoard.Windows.Forms.IBBToolStripMenuItem();
dev@196: this.miOpenArmy = new IBBoard.Windows.Forms.IBBToolStripMenuItem();
dev@196: this.miSaveArmy = new IBBoard.Windows.Forms.IBBToolStripMenuItem();
dev@196: this.miSaveArmyAs = new IBBoard.Windows.Forms.IBBToolStripMenuItem();
dev@196: this.miExportArmyAs = new IBBoard.Windows.Forms.IBBToolStripMenuItem();
dev@196: this.miExportArmyAsBasicHTML = new IBBoard.Windows.Forms.IBBToolStripMenuItem();
dev@196: this.miCloseArmy = new IBBoard.Windows.Forms.IBBToolStripMenuItem();
dev@196: this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
dev@196: this.miReloadFiles = new IBBoard.Windows.Forms.IBBToolStripMenuItem();
dev@196: this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
dev@196: this.miExit = new IBBoard.Windows.Forms.IBBToolStripMenuItem();
dev@196: this.menuEdit = new IBBoard.Windows.Forms.IBBToolStripMenuItem();
dev@196: this.miUndo = new IBBoard.Windows.Forms.IBBToolStripMenuItem();
dev@196: this.miRedo = new IBBoard.Windows.Forms.IBBToolStripMenuItem();
dev@196: this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator();
dev@196: this.miPreferences = new IBBoard.Windows.Forms.IBBToolStripMenuItem();
dev@196: this.menuHelp = new IBBoard.Windows.Forms.IBBToolStripMenuItem();
dev@196: this.miAbout = new IBBoard.Windows.Forms.IBBToolStripMenuItem();
dev@196: this.mainToolStrip = new System.Windows.Forms.ToolStrip();
dev@196: this.bttnNewArmy = new IBBoard.Windows.Forms.IBBToolStripButton();
dev@196: this.bttnOpenArmy = new IBBoard.Windows.Forms.IBBToolStripButton();
dev@196: this.bttnSaveArmy = new IBBoard.Windows.Forms.IBBToolStripButton();
dev@196: this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();
dev@196: this.bttnUndo = new IBBoard.Windows.Forms.IBBToolStripSplitButton();
dev@196: this.bttnRedo = new IBBoard.Windows.Forms.IBBToolStripSplitButton();
dev@196: this.catToolStrip = new System.Windows.Forms.ToolStrip();
dev@196: this.statusBar = new IBBoard.Windows.Forms.ColorableStatusBar();
dev@196: this.sbMainPanel = new IBBoard.Windows.Forms.ColorableStatusBarPanel();
dev@196: this.sbErrorPanel = new IBBoard.Windows.Forms.ColorableStatusBarPanel();
dev@196: this.sbPointsPanel = new IBBoard.Windows.Forms.ColorableStatusBarPanel();
dev@196: this.toolStripPanel = new System.Windows.Forms.ToolStripPanel();
Dan@207: this.miExportArmyAsBasicXml = new System.Windows.Forms.ToolStripMenuItem();
dev@196: this.menuStrip.SuspendLayout();
dev@196: this.mainToolStrip.SuspendLayout();
dev@196: ((System.ComponentModel.ISupportInitialize)(this.sbMainPanel)).BeginInit();
dev@196: ((System.ComponentModel.ISupportInitialize)(this.sbErrorPanel)).BeginInit();
dev@196: ((System.ComponentModel.ISupportInitialize)(this.sbPointsPanel)).BeginInit();
dev@196: this.SuspendLayout();
dev@196: //
dev@196: // saveArmyDialog
dev@196: //
dev@196: this.saveArmyDialog.Title = "Translatable:saveArmyDialog";
dev@196: //
dev@196: // menuStrip
dev@196: //
dev@196: this.menuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
dev@140: this.menuFile,
dev@140: this.menuEdit,
dev@140: this.menuHelp});
dev@196: this.menuStrip.Location = new System.Drawing.Point(0, 0);
dev@196: this.menuStrip.Name = "menuStrip";
dev@196: this.menuStrip.Size = new System.Drawing.Size(790, 24);
dev@196: this.menuStrip.TabIndex = 6;
dev@196: this.menuStrip.Text = "menuStrip1";
dev@196: //
dev@196: // menuFile
dev@196: //
dev@196: this.menuFile.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
dev@140: this.miNewArmy,
dev@140: this.miOpenArmy,
dev@140: this.miSaveArmy,
dev@140: this.miSaveArmyAs,
dev@140: this.miExportArmyAs,
dev@140: this.miCloseArmy,
dev@140: this.toolStripSeparator1,
dev@140: this.miReloadFiles,
dev@140: this.toolStripSeparator2,
dev@140: this.miExit});
dev@196: this.menuFile.Name = "menuFile";
Dan@207: this.menuFile.Size = new System.Drawing.Size(35, 20);
dev@196: this.menuFile.Text = "&file";
dev@196: //
dev@196: // miNewArmy
dev@196: //
dev@196: this.miNewArmy.Name = "miNewArmy";
Dan@207: this.miNewArmy.Size = new System.Drawing.Size(160, 22);
dev@196: this.miNewArmy.Text = "&new army";
dev@196: this.miNewArmy.Click += new System.EventHandler(this.miNewArmy_Click);
dev@196: //
dev@196: // miOpenArmy
dev@196: //
dev@196: this.miOpenArmy.Name = "miOpenArmy";
Dan@207: this.miOpenArmy.Size = new System.Drawing.Size(160, 22);
dev@196: this.miOpenArmy.Text = "&open army";
dev@196: this.miOpenArmy.Click += new System.EventHandler(this.miOpenArmy_Click);
dev@196: //
dev@196: // miSaveArmy
dev@196: //
dev@196: this.miSaveArmy.Enabled = false;
dev@196: this.miSaveArmy.Name = "miSaveArmy";
Dan@207: this.miSaveArmy.Size = new System.Drawing.Size(160, 22);
dev@196: this.miSaveArmy.Text = "&save army";
dev@196: this.miSaveArmy.Click += new System.EventHandler(this.miSaveArmy_Click);
dev@196: //
dev@196: // miSaveArmyAs
dev@196: //
dev@196: this.miSaveArmyAs.Enabled = false;
dev@196: this.miSaveArmyAs.Name = "miSaveArmyAs";
Dan@207: this.miSaveArmyAs.Size = new System.Drawing.Size(160, 22);
dev@196: this.miSaveArmyAs.Text = "save army &as...";
dev@196: this.miSaveArmyAs.Click += new System.EventHandler(this.miSaveArmyAs_Click);
dev@196: //
dev@196: // miExportArmyAs
dev@196: //
dev@196: this.miExportArmyAs.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
Dan@207: this.miExportArmyAsBasicHTML,
Dan@207: this.miExportArmyAsBasicXml});
dev@196: this.miExportArmyAs.Enabled = false;
dev@196: this.miExportArmyAs.Name = "miExportArmyAs";
Dan@207: this.miExportArmyAs.Size = new System.Drawing.Size(160, 22);
dev@196: this.miExportArmyAs.Text = "export army as...";
dev@196: //
dev@196: // miExportArmyAsBasicHTML
dev@196: //
dev@196: this.miExportArmyAsBasicHTML.Name = "miExportArmyAsBasicHTML";
Dan@207: this.miExportArmyAsBasicHTML.Size = new System.Drawing.Size(152, 22);
dev@196: this.miExportArmyAsBasicHTML.Text = "&basic html";
dev@196: this.miExportArmyAsBasicHTML.Click += new System.EventHandler(this.miExportArmyAsBasicHTML_Click);
dev@196: //
dev@196: // miCloseArmy
dev@196: //
dev@196: this.miCloseArmy.Enabled = false;
dev@196: this.miCloseArmy.Name = "miCloseArmy";
Dan@207: this.miCloseArmy.Size = new System.Drawing.Size(160, 22);
dev@196: this.miCloseArmy.Text = "&close army";
dev@196: this.miCloseArmy.Click += new System.EventHandler(this.miCloseArmy_Click);
dev@196: //
dev@196: // toolStripSeparator1
dev@196: //
dev@196: this.toolStripSeparator1.Name = "toolStripSeparator1";
Dan@207: this.toolStripSeparator1.Size = new System.Drawing.Size(157, 6);
dev@196: //
dev@196: // miReloadFiles
dev@196: //
dev@196: this.miReloadFiles.Name = "miReloadFiles";
Dan@207: this.miReloadFiles.Size = new System.Drawing.Size(160, 22);
dev@196: this.miReloadFiles.Text = "&reload files";
dev@196: this.miReloadFiles.Click += new System.EventHandler(this.miReloadFiles_Click);
dev@196: //
dev@196: // toolStripSeparator2
dev@196: //
dev@196: this.toolStripSeparator2.Name = "toolStripSeparator2";
Dan@207: this.toolStripSeparator2.Size = new System.Drawing.Size(157, 6);
dev@196: //
dev@196: // miExit
dev@196: //
dev@196: this.miExit.Name = "miExit";
Dan@207: this.miExit.Size = new System.Drawing.Size(160, 22);
dev@196: this.miExit.Text = "e&xit";
dev@196: this.miExit.Click += new System.EventHandler(this.miExit_Click);
dev@196: //
dev@196: // menuEdit
dev@196: //
dev@196: this.menuEdit.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
dev@140: this.miUndo,
dev@140: this.miRedo,
dev@140: this.toolStripSeparator4,
dev@140: this.miPreferences});
dev@196: this.menuEdit.Name = "menuEdit";
Dan@207: this.menuEdit.Size = new System.Drawing.Size(39, 20);
dev@196: this.menuEdit.Text = "&edit";
dev@196: //
dev@196: // miUndo
dev@196: //
dev@196: this.miUndo.Enabled = false;
dev@196: this.miUndo.Name = "miUndo";
Dan@207: this.miUndo.Size = new System.Drawing.Size(135, 22);
dev@196: this.miUndo.Text = "&undo";
dev@196: this.miUndo.Click += new System.EventHandler(this.miUndo_Click);
dev@196: //
dev@196: // miRedo
dev@196: //
dev@196: this.miRedo.Enabled = false;
dev@196: this.miRedo.Name = "miRedo";
Dan@207: this.miRedo.Size = new System.Drawing.Size(135, 22);
dev@196: this.miRedo.Text = "&redo";
dev@196: this.miRedo.Click += new System.EventHandler(this.miRedo_Click);
dev@196: //
dev@196: // toolStripSeparator4
dev@196: //
dev@196: this.toolStripSeparator4.Name = "toolStripSeparator4";
Dan@207: this.toolStripSeparator4.Size = new System.Drawing.Size(132, 6);
dev@196: //
dev@196: // miPreferences
dev@196: //
dev@196: this.miPreferences.Name = "miPreferences";
Dan@207: this.miPreferences.Size = new System.Drawing.Size(135, 22);
dev@196: this.miPreferences.Text = "&preferences";
dev@196: this.miPreferences.Click += new System.EventHandler(this.miPreferences_Click);
dev@196: //
dev@196: // menuHelp
dev@196: //
dev@196: this.menuHelp.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
dev@140: this.miAbout});
dev@196: this.menuHelp.Name = "menuHelp";
Dan@207: this.menuHelp.Size = new System.Drawing.Size(42, 20);
dev@196: this.menuHelp.Text = "&help";
dev@196: //
dev@196: // miAbout
dev@196: //
dev@196: this.miAbout.Name = "miAbout";
Dan@207: this.miAbout.Size = new System.Drawing.Size(105, 22);
dev@196: this.miAbout.Text = "&about";
dev@196: this.miAbout.Click += new System.EventHandler(this.miAbout_Click);
dev@196: //
dev@196: // mainToolStrip
dev@196: //
dev@196: this.mainToolStrip.Dock = System.Windows.Forms.DockStyle.None;
dev@196: this.mainToolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
dev@140: this.bttnNewArmy,
dev@140: this.bttnOpenArmy,
dev@140: this.bttnSaveArmy,
dev@140: this.toolStripSeparator3,
dev@140: this.bttnUndo,
dev@140: this.bttnRedo});
dev@196: this.mainToolStrip.Location = new System.Drawing.Point(0, 24);
dev@196: this.mainToolStrip.Name = "mainToolStrip";
Dan@207: this.mainToolStrip.Size = new System.Drawing.Size(151, 25);
dev@196: this.mainToolStrip.TabIndex = 8;
dev@196: //
dev@196: // bttnNewArmy
dev@196: //
dev@196: this.bttnNewArmy.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
dev@196: this.bttnNewArmy.Image = global::IBBoard.WarFoundry.GUI.WinForms.Properties.Resources.document_new;
dev@196: this.bttnNewArmy.ImageTransparentColor = System.Drawing.Color.Magenta;
dev@196: this.bttnNewArmy.Name = "bttnNewArmy";
dev@196: this.bttnNewArmy.Size = new System.Drawing.Size(23, 22);
dev@196: this.bttnNewArmy.Text = "new army";
dev@196: this.bttnNewArmy.Click += new System.EventHandler(this.miNewArmy_Click);
dev@196: //
dev@196: // bttnOpenArmy
dev@196: //
dev@196: this.bttnOpenArmy.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
dev@196: this.bttnOpenArmy.Image = global::IBBoard.WarFoundry.GUI.WinForms.Properties.Resources.document_open;
dev@196: this.bttnOpenArmy.ImageTransparentColor = System.Drawing.Color.Magenta;
dev@196: this.bttnOpenArmy.Name = "bttnOpenArmy";
dev@196: this.bttnOpenArmy.Size = new System.Drawing.Size(23, 22);
dev@196: this.bttnOpenArmy.Text = "open army";
dev@196: this.bttnOpenArmy.Click += new System.EventHandler(this.miOpenArmy_Click);
dev@196: //
dev@196: // bttnSaveArmy
dev@196: //
dev@196: this.bttnSaveArmy.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
dev@196: this.bttnSaveArmy.Enabled = false;
dev@196: this.bttnSaveArmy.Image = global::IBBoard.WarFoundry.GUI.WinForms.Properties.Resources.document_save;
dev@196: this.bttnSaveArmy.ImageTransparentColor = System.Drawing.Color.Magenta;
dev@196: this.bttnSaveArmy.Name = "bttnSaveArmy";
dev@196: this.bttnSaveArmy.Size = new System.Drawing.Size(23, 22);
dev@196: this.bttnSaveArmy.Text = "save army";
dev@196: this.bttnSaveArmy.Click += new System.EventHandler(this.miSaveArmy_Click);
dev@196: //
dev@196: // toolStripSeparator3
dev@196: //
dev@196: this.toolStripSeparator3.Name = "toolStripSeparator3";
dev@196: this.toolStripSeparator3.Size = new System.Drawing.Size(6, 25);
dev@196: //
dev@196: // bttnUndo
dev@196: //
dev@196: this.bttnUndo.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
dev@196: this.bttnUndo.Enabled = false;
dev@196: this.bttnUndo.Image = global::IBBoard.WarFoundry.GUI.WinForms.Properties.Resources.edit_undo;
dev@196: this.bttnUndo.ImageTransparentColor = System.Drawing.Color.Magenta;
dev@196: this.bttnUndo.Name = "bttnUndo";
dev@196: this.bttnUndo.Size = new System.Drawing.Size(32, 22);
dev@196: this.bttnUndo.Text = "undo";
dev@196: this.bttnUndo.ButtonClick += new System.EventHandler(this.miUndo_Click);
dev@196: //
dev@196: // bttnRedo
dev@196: //
dev@196: this.bttnRedo.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
dev@196: this.bttnRedo.Enabled = false;
dev@196: this.bttnRedo.Image = global::IBBoard.WarFoundry.GUI.WinForms.Properties.Resources.edit_redo;
dev@196: this.bttnRedo.ImageTransparentColor = System.Drawing.Color.Magenta;
dev@196: this.bttnRedo.Name = "bttnRedo";
dev@196: this.bttnRedo.Size = new System.Drawing.Size(32, 22);
dev@196: this.bttnRedo.Text = "redo";
dev@196: this.bttnRedo.ButtonClick += new System.EventHandler(this.miRedo_Click);
dev@196: //
dev@196: // catToolStrip
dev@196: //
dev@196: this.catToolStrip.Dock = System.Windows.Forms.DockStyle.None;
dev@196: this.catToolStrip.Location = new System.Drawing.Point(161, 24);
dev@196: this.catToolStrip.Name = "catToolStrip";
dev@196: this.catToolStrip.Size = new System.Drawing.Size(111, 25);
dev@196: this.catToolStrip.TabIndex = 9;
dev@196: this.catToolStrip.Visible = false;
dev@196: //
dev@196: // statusBar
dev@196: //
dev@196: this.statusBar.Location = new System.Drawing.Point(0, 586);
dev@196: this.statusBar.Name = "statusBar";
dev@196: this.statusBar.Panels.AddRange(new System.Windows.Forms.StatusBarPanel[] {
dev@140: this.sbMainPanel,
dev@140: this.sbErrorPanel,
dev@140: this.sbPointsPanel});
dev@196: this.statusBar.ShowPanels = true;
dev@196: this.statusBar.Size = new System.Drawing.Size(790, 22);
dev@196: this.statusBar.TabIndex = 1;
Dan@207: this.statusBar.DrawItem += new System.Windows.Forms.StatusBarDrawItemEventHandler(this.statusBar_DrawItem);
dev@196: this.statusBar.PanelClick += new System.Windows.Forms.StatusBarPanelClickEventHandler(this.statusBar_PanelClick);
dev@196: //
dev@196: // sbMainPanel
dev@196: //
dev@196: this.sbMainPanel.AutoSize = System.Windows.Forms.StatusBarPanelAutoSize.Spring;
dev@196: this.sbMainPanel.Color = System.Drawing.SystemColors.WindowText;
dev@196: this.sbMainPanel.Name = "sbMainPanel";
dev@196: this.sbMainPanel.Style = System.Windows.Forms.StatusBarPanelStyle.OwnerDraw;
dev@196: this.sbMainPanel.Width = 473;
dev@196: //
dev@196: // sbErrorPanel
dev@196: //
dev@196: this.sbErrorPanel.Color = System.Drawing.SystemColors.WindowText;
dev@196: this.sbErrorPanel.Name = "sbErrorPanel";
dev@196: this.sbErrorPanel.Style = System.Windows.Forms.StatusBarPanelStyle.OwnerDraw;
dev@196: this.sbErrorPanel.Width = 150;
dev@196: //
dev@196: // sbPointsPanel
dev@196: //
dev@196: this.sbPointsPanel.Color = System.Drawing.SystemColors.WindowText;
dev@196: this.sbPointsPanel.Name = "sbPointsPanel";
dev@196: this.sbPointsPanel.Style = System.Windows.Forms.StatusBarPanelStyle.OwnerDraw;
dev@196: this.sbPointsPanel.ToolTipText = "current points total";
dev@196: this.sbPointsPanel.Width = 150;
dev@196: //
dev@196: // toolStripPanel
dev@196: //
dev@196: this.toolStripPanel.Dock = System.Windows.Forms.DockStyle.Top;
dev@196: this.toolStripPanel.Location = new System.Drawing.Point(0, 24);
dev@196: this.toolStripPanel.Name = "toolStripPanel";
dev@196: this.toolStripPanel.Orientation = System.Windows.Forms.Orientation.Horizontal;
dev@196: this.toolStripPanel.RowMargin = new System.Windows.Forms.Padding(3, 0, 0, 0);
dev@196: this.toolStripPanel.Size = new System.Drawing.Size(790, 0);
dev@196: //
Dan@207: // miExportArmyAsBasicXml
Dan@207: //
Dan@207: this.miExportArmyAsBasicXml.Name = "miExportArmyAsBasicXml";
Dan@207: this.miExportArmyAsBasicXml.Size = new System.Drawing.Size(152, 22);
Dan@207: this.miExportArmyAsBasicXml.Text = "basic xm&l";
Dan@207: this.miExportArmyAsBasicXml.Click += new System.EventHandler(this.miExportArmyAsBasicXml_Click);
Dan@207: //
dev@196: // FrmMain
dev@196: //
dev@196: this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
dev@196: this.ClientSize = new System.Drawing.Size(790, 608);
dev@196: this.Controls.Add(this.mainToolStrip);
dev@196: this.Controls.Add(this.toolStripPanel);
dev@196: this.Controls.Add(this.statusBar);
dev@196: this.Controls.Add(this.catToolStrip);
dev@196: this.Controls.Add(this.menuStrip);
dev@196: this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
dev@196: this.IsMdiContainer = true;
dev@196: this.MainMenuStrip = this.menuStrip;
dev@196: this.Menu = this.mainMenu;
dev@196: this.Name = "FrmMain";
dev@196: this.Text = "WarFoundry";
dev@196: this.Load += new System.EventHandler(this.FrmMain_Load);
dev@196: this.menuStrip.ResumeLayout(false);
dev@196: this.menuStrip.PerformLayout();
dev@196: this.mainToolStrip.ResumeLayout(false);
dev@196: this.mainToolStrip.PerformLayout();
dev@196: ((System.ComponentModel.ISupportInitialize)(this.sbMainPanel)).EndInit();
dev@196: ((System.ComponentModel.ISupportInitialize)(this.sbErrorPanel)).EndInit();
dev@196: ((System.ComponentModel.ISupportInitialize)(this.sbPointsPanel)).EndInit();
dev@196: this.ResumeLayout(false);
dev@196: this.PerformLayout();
dev@140:
dev@142: }
dev@142: #endregion
dev@142:
dev@142: private void FileLoadingFinished(List failures)
dev@142: {
dev@142: foreach (FileLoadFailure failure in failures)
dev@142: {
dev@142: log.Warn("Failed to load " + failure.FailedFile.FullName + ": " + failure.Message);
dev@142: }
dev@142: }
dev@142:
dev@142: private void miExit_Click(object sender, System.EventArgs e)
dev@142: {
dev@142: Application.Exit();
dev@142: }
dev@142:
dev@142: private void miNewArmy_Click(object sender, System.EventArgs e)
dev@142: {
dev@142: CreateNewArmy();
dev@142: }
dev@142:
dev@142: private void CreateNewArmy()
dev@142: {
dev@142: if (CloseCurrentArmy())
dev@142: {
dev@142: FrmNewArmy newArmy = new FrmNewArmy(CurrentGameSystem);
dev@142: DialogResult dr = newArmy.ShowDialog();
dev@142:
dev@142: if (dr == DialogResult.OK)
dev@142: {
dev@142: try
dev@142: {
dev@142: CurrentArmy = new Army(newArmy.SelectedRace, newArmy.ArmyName, newArmy.ArmySize);
dev@142: }
dev@142: catch (RequiredDataMissingException ex)
dev@142: {
dev@142: log.Error("Required data missing from race file", ex);
dev@142: MessageBox.Show(this, ex.Message, Translation.GetTranslation("InvalidRaceFileBoxTitle", "invalid race file"), MessageBoxButtons.OK, MessageBoxIcon.Error);
dev@142: }
dev@142: catch (InvalidFileException ex)
dev@142: {
dev@142: log.Error("Race file was invalid", ex);
dev@142: MessageBox.Show(this, ex.Message, Translation.GetTranslation("InvalidRaceFileBoxTitle", "invalid race file"), MessageBoxButtons.OK, MessageBoxIcon.Error);
dev@142: }
dev@142: }
dev@142: }
dev@142: }
dev@142:
dev@142: private bool OpenArmy()
dev@142: {
dev@142: if (openArmyDialog.Filter=="")
dev@142: {
dev@142: string savePath = ArmiesPath;
dev@142:
dev@142: if (!Directory.Exists(savePath))
dev@142: {
dev@142: Directory.CreateDirectory(savePath);
dev@142: }
dev@142:
dev@142: openArmyDialog.InitialDirectory = savePath;
dev@142: openArmyDialog.Filter = Translation.GetTranslation("armyFileFilter")+"|*.army";
dev@142: openArmyDialog.Title = Translation.GetTranslation("openArmyDialog");
dev@142:
dev@142: }
dev@142:
dev@142: DialogResult dr = openArmyDialog.ShowDialog(this);
dev@142:
dev@142: if (dr == DialogResult.OK)
dev@142: {
dev@142: if (CloseCurrentArmy())
dev@142: {
dev@142: try
dev@142: {
dev@142: string newFilePath = openArmyDialog.FileName;
dev@142: CurrentArmy = WarFoundryLoader.GetDefault().LoadArmy(new FileInfo(newFilePath));
dev@142: loadedFilePath = newFilePath;
dev@142: return true;
dev@142: }
dev@142: catch (RequiredDataMissingException ex)
dev@142: {
dev@142: log.Error(ex);
dev@142: MessageBox.Show(this, ex.Message, Translation.GetTranslation("InvalidArmyFileBoxTitle", "invalid army file"), MessageBoxButtons.OK, MessageBoxIcon.Error);
dev@142: return false;
dev@142: }
dev@142: catch (InvalidFileException ex)
dev@142: {
dev@142: log.Error(ex);
dev@142: MessageBox.Show(this, ex.Message, Translation.GetTranslation("InvalidArmyFileBoxTitle", "invalid army file"), MessageBoxButtons.OK, MessageBoxIcon.Error);
dev@142: return false;
dev@142: }
dev@142: }
dev@142: else
dev@142: {
dev@142: return false;
dev@142: }
dev@142: }
dev@142: else
dev@142: {
dev@142: return false;
dev@142: }
dev@142: }
dev@142:
dev@142: private bool CloseCurrentArmy()
dev@142: {
dev@142: if (CurrentArmy!=null)
dev@142: {
dev@142: bool canClose = false;
dev@142:
dev@142: if (CommandStack.IsDirty())
dev@142: {
dev@142: string saveChanges = Translation.GetTranslation("SaveChangesQuestion", "the army \"{0}\" has been modified\r\nsave changes before closing army?", CurrentArmy.Name);
dev@142: string saveChangesTitle = Translation.GetTranslation("SaveChangesTitle", "unsaved changes");
dev@142: DialogResult dr = MessageBox.Show(this, saveChanges, saveChangesTitle, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button3);
dev@142:
dev@142: if (dr == DialogResult.Yes)
dev@142: {
dev@142: canClose = SaveCurrentArmy();
dev@142: }
dev@142: else if (dr == DialogResult.No)
dev@142: {
dev@142: canClose = true;
dev@142: }
dev@142: //else they said cancel and we default to "canClose = false" so do nothing
dev@142: }
dev@142: else
dev@142: {
dev@142: canClose = true;
dev@142: }
dev@142:
dev@142: if (canClose)
dev@142: {
dev@142: //do close
dev@142: DisableCategoryButtons();
dev@142: CurrentArmy = null;
dev@142: return true;
dev@142: }
dev@142: else
dev@142: {
dev@142: return false;
dev@142: }
dev@142: }
dev@142: else
dev@142: {
dev@142: DisableCategoryButtons();
dev@142: //pretend we succeeded
dev@142: return true;
dev@142: }
dev@142: }
dev@142:
dev@142: private void UndoLastAction()
dev@142: {
dev@142: if (commandStack.CanUndo())
dev@142: {
dev@142: commandStack.Undo();
dev@142: }
dev@142: }
dev@142:
dev@142: private void RedoAction()
dev@142: {
dev@142: if (commandStack.CanRedo())
dev@142: {
dev@142: commandStack.Redo();
dev@142: }
dev@142: }
dev@142:
dev@142: private bool SaveCurrentArmy()
dev@142: {
dev@142: bool saved = false;
dev@142:
dev@142: string filePath = loadedFilePath;
dev@142:
dev@142: if (filePath == null)
dev@142: {
dev@142: filePath = PromptForArmyFilePath();
dev@142: }
dev@142:
dev@142: if (filePath != null)
dev@142: {
dev@142: saved = SaveCurrentArmyToFile(filePath);
dev@142: }
dev@142:
dev@142: return saved;
dev@142: }
dev@142:
dev@142: private bool SaveCurrentArmyAs()
dev@142: {
dev@142: bool saved = false;
dev@142: string filePath = PromptForArmyFilePath();
dev@142:
dev@142: if (filePath != null)
dev@142: {
dev@142: saved = SaveCurrentArmyToFile(filePath);
dev@142: }
dev@142:
dev@142: return saved;
dev@142: }
dev@142:
dev@142: private bool SaveCurrentArmyToFile(string filePath)
dev@142: {
dev@193: if (WarFoundrySaver.GetSaver().Save(filePath, CurrentArmy))
dev@142: {
dev@142: loadedFilePath = filePath;
dev@142: miSaveArmy.Enabled = false;
dev@142: bttnSaveArmy.Enabled = false;
dev@142: CommandStack.setCleanMark();
dev@142: return true;
dev@142: }
dev@142: else
dev@142: {
dev@142: MessageBox.Show(this, Translation.GetTranslation("SaveFailed", "file save failed - check log for details"), Translation.GetTranslation("SaveFailedTitle", "file save failed"), MessageBoxButtons.OK, MessageBoxIcon.Error);
dev@142: return false;
dev@142: }
dev@142: }
dev@142:
dev@142: private string PromptForArmyFilePath()
dev@142: {
dev@142: if (saveArmyDialog.Filter == "")
dev@142: {
dev@142: string savePath = ArmiesPath;
dev@142:
dev@142: if (!Directory.Exists(savePath))
dev@142: {
dev@142: Directory.CreateDirectory(savePath);
dev@142: }
dev@142:
dev@142: saveArmyDialog.InitialDirectory = savePath;
dev@142: saveArmyDialog.Filter = Translation.GetTranslation("armyFileFilter")+"|*.army";
dev@142: saveArmyDialog.Title = Translation.GetTranslation("saveArmyDialog");
dev@142: }
dev@142:
dev@142: DialogResult dr = saveArmyDialog.ShowDialog(this);
dev@142:
dev@142: if (dr == DialogResult.OK)
dev@142: {
dev@142: return saveArmyDialog.FileName;
dev@142: }
dev@142: else
dev@142: {
dev@142: return null;
dev@142: }
dev@142: }
dev@142:
dev@142: public GameSystem CurrentGameSystem
dev@142: {
dev@142: get { return WarFoundryCore.CurrentGameSystem; }
dev@142: set { WarFoundryCore.CurrentGameSystem = value; }
dev@142: }
dev@142:
dev@142: public Army CurrentArmy
dev@142: {
dev@142: get { return WarFoundryCore.CurrentArmy; }
dev@142: set { SetArmy(value); }
dev@142: }
dev@142:
dev@142: private void FrmMain_GameSystemChanged(GameSystem oldSystem, GameSystem newSystem)
dev@142: {
dev@142: SetAppTitle();
dev@195:
dev@195: if (newSystem == null)
dev@195: {
dev@195: Preferences["currSystem"] = "";
dev@195: }
dev@195: else
dev@195: {
dev@195: Preferences["currSystem"] = newSystem.ID;
dev@195: }
dev@195:
dev@195: Preferences.Save();
dev@142: RemoveCategoryButtons();
dev@142: }
dev@142:
dev@142: private void FrmMain_ArmyChanged(Army oldArmy, Army newArmy)
dev@142: {
dev@142: CommandStack.Reset();
dev@142: loadedFilePath = null;
dev@142: miSaveArmy.Enabled = false;
dev@142: bttnSaveArmy.Enabled = false;
dev@196: //TODO: Subscribe to an "army changed" event here
dev@142: SetPointsPanelText();
dev@142: SetAppTitle();
dev@142: }
dev@142:
dev@142: private void SetArmy(Army newArmy)
dev@142: {
dev@142: IgnoreArmy(CurrentArmy);
dev@142: CloseAllUnitWindows();
dev@142:
dev@142: if (newArmy == null)
dev@142: {
dev@142: SetNullArmyState();
dev@142: }
dev@142: else
dev@142: {
dev@142: WarFoundryCore.CurrentGameSystem = newArmy.GameSystem;
dev@142: ListenToArmy(newArmy);
dev@142: SetNonNullArmyState(newArmy);
dev@142: }
dev@142:
dev@142: WarFoundryCore.CurrentArmy = newArmy;
dev@142: }
dev@142:
dev@142: private void IgnoreArmy(Army oldArmy)
dev@142: {
dev@142: if (oldArmy != null)
dev@142: {
dev@142: oldArmy.UnitAdded -= UnitAddedMethod;
dev@142: oldArmy.UnitRemoved -= UnitRemovedMethod;
dev@142: oldArmy.PointsValueChanged -= PointsValueChangedMethod;
dev@142: }
dev@142: }
dev@142:
dev@142: private void CloseAllUnitWindows()
dev@142: {
dev@142: FrmUnit[] unitForms = DictionaryUtils.ToArray(unitWindows);
dev@142:
dev@142: foreach (FrmUnit window in unitForms)
dev@142: {
dev@142: window.Close();
dev@142: }
dev@142:
dev@142: unitWindows.Clear();
dev@142: }
dev@142:
dev@142: private void ListenToArmy(Army newArmy)
dev@142: {
dev@142: if (newArmy != null)
dev@142: {
dev@142: newArmy.UnitAdded += UnitAddedMethod;
dev@142: newArmy.UnitRemoved += UnitRemovedMethod;
dev@142: newArmy.PointsValueChanged += PointsValueChangedMethod;
dev@142: }
dev@142: }
dev@142:
dev@142: private void SetNullArmyState()
dev@142: {
dev@142: miSaveArmyAs.Enabled = false;
dev@142: miCloseArmy.Enabled = false;
dev@142: miExportArmyAs.Enabled = false;
dev@142: DisableCategoryButtons();
dev@159: GetArmyTree().Hide();
dev@142: }
dev@142:
dev@142: private void SetNonNullArmyState(Army newArmy)
dev@142: {
dev@142: SetCategoryButtons(newArmy.Race.Categories);
dev@142: EnableCategoryButtons();
dev@142: miSaveArmyAs.Enabled = true;
dev@142: miCloseArmy.Enabled = true;
dev@142: miExportArmyAs.Enabled = true;
dev@159: GetArmyTree().Show();
dev@142: }
dev@142:
dev@142: private void SetCategoryButtons(Category[] cats)
dev@142: {
dev@142: if (CategoryButtonsHaveChanged(cats))
dev@142: {
dev@142: RemoveCategoryButtons();
dev@142: AddCategoryButtons(cats);
dev@142: }
dev@142: }
dev@142:
dev@142: private bool CategoryButtonsHaveChanged(Category[] cats)
dev@142: {
dev@142: int catCount = cats.Length;
dev@142: ToolStripItemCollection items = catToolStrip.Items;
dev@142: bool haveChanged = (!catToolStrip.Visible || catCount != items.Count);
dev@142:
dev@142: if (!haveChanged)
dev@142: {
dev@142: for (int i = 0; i < catCount; i++)
dev@142: {
dev@142: if (cats[i].Equals(items[i+1].Tag))
dev@142: {
dev@142: haveChanged = true;
dev@142: break;
dev@142: }
dev@142: }
dev@142: }
dev@142:
dev@142: return haveChanged;
dev@142: }
dev@142:
dev@142: private void RemoveCategoryButtons()
dev@142: {
dev@142: this.Invoke(new MethodInvoker(catToolStrip.Items.Clear));
dev@142: }
dev@142:
dev@142: private void AddCategoryButtons(Category[] cats)
dev@142: {
dev@142: int catCount = cats.Length;
dev@142: Category cat;
dev@142: IBBToolStripButton[] categoryButtons = new IBBToolStripButton[catCount];
dev@142:
dev@142: for (int i = 0; i < catCount; i++)
dev@142: {
dev@142: cat = cats[i];
dev@142: IBBToolStripButton button = new IBBToolStripButton();
dev@142: button.Text = cat.Name;
dev@142: button.Tag = cat;
dev@142: button.Image = global::IBBoard.WarFoundry.GUI.WinForms.Properties.Resources.list_add;
dev@142: button.Enabled = false;
dev@142: button.Click += new EventHandler(CreateUnitForCategoryButtonClick);
dev@142: categoryButtons[i] = button;
dev@142: }
dev@142:
dev@146: this.Invoke(new ArrayMethodInvoker(AddCatToolStripButtons), new object[] { categoryButtons });
dev@146: }
dev@146:
dev@146: private void AddCatToolStripButtons(IBBToolStripButton[] buttons)
dev@146: {
dev@142: log.Debug("Toolstrip width: " + catToolStrip.Width);
dev@146: catToolStrip.Items.AddRange(buttons);
dev@146: catToolStrip.Refresh();
dev@146: int buttonWidths = 0;
dev@146:
dev@146: foreach (IBBToolStripButton button in buttons)
dev@146: {
dev@146: buttonWidths += button.Width;
dev@146: }
dev@146: catToolStrip.Width = buttonWidths;
dev@142: log.Debug("Button widths: " + buttonWidths);
dev@146: log.Debug("Toolstrip width: " + catToolStrip.Width);
dev@142: }
dev@142:
dev@142: private void CreateUnitForCategoryButtonClick(object sender, EventArgs e)
dev@142: {
dev@142: if (sender is IBBToolStripButton)
dev@142: {
dev@142: IBBToolStripButton button = (IBBToolStripButton)sender;
dev@142: object tag = button.Tag;
dev@142:
dev@142: if (tag is Category)
dev@142: {
dev@142: AddUnitFromCategory((Category)tag);
dev@142: }
dev@142: }
dev@142: }
dev@142:
dev@142: private void EnableCategoryButtons()
dev@142: {
dev@142: catToolStrip.Visible = true;
dev@142: SetCategoryButtonState(true);
dev@142: }
dev@142:
dev@142: private void DisableCategoryButtons()
dev@142: {
dev@142: catToolStrip.Visible = false;
dev@142: SetCategoryButtonState(false);
dev@142: }
dev@142:
dev@142: private void SetCategoryButtonState(bool state)
dev@142: {
dev@142: foreach (IBBToolStripButton button in catToolStrip.Items)
dev@142: {
dev@142: button.Enabled = state;
dev@142: }
dev@142: }
dev@142:
dev@142: private void miSaveArmyAs_Click(object sender, System.EventArgs e)
dev@142: {
dev@142: SaveCurrentArmyAs();
dev@142: }
dev@142:
dev@142: private void commandStack_CommandStackUpdated()
dev@142: {
dev@142: bttnUndo.Enabled = commandStack.CanUndo();
dev@142: miUndo.Enabled = bttnUndo.Enabled;
dev@142: bttnRedo.Enabled = commandStack.CanRedo();
dev@142: miRedo.Enabled = bttnRedo.Enabled;
dev@142:
dev@142: PopulateRedoMenu();
dev@142: PopulateUndoMenu();
dev@142:
dev@142: bttnSaveArmy.Enabled = commandStack.IsDirty() && CurrentArmy!=null;
dev@142: miSaveArmy.Enabled = commandStack.IsDirty() && CurrentArmy!=null;
dev@142: }
dev@142:
dev@142: private void PopulateRedoMenu()
dev@142: {
dev@142: int redoLength = commandStack.RedoLength;
dev@142: int maxRedo = Math.Min(10, redoLength);
dev@142: ToolStripItemCollection dropDownItems = bttnRedo.DropDownItems;
dev@142: dropDownItems.Clear();
dev@142:
dev@142: for (int i = 1; i <= maxRedo; i++)
dev@142: {
dev@142: Command cmd = commandStack.PeekRedoCommand(i);
dev@142:
dev@142: if (cmd == null)
dev@142: {
dev@142: break;
dev@142: }
dev@142:
dev@142: dropDownItems.Add(cmd.Description, null, redoMenu_Click);
dev@142: }
dev@142:
dev@142: if (redoLength > 0)
dev@142: {
dev@142: bttnRedo.Text = commandStack.PeekRedoCommand(1).Description;
dev@142: }
dev@142: else
dev@142: {
dev@142: bttnRedo.Text = Translation.GetTranslation("bttnRedo");
dev@142: }
dev@142: }
dev@142:
dev@142: private void PopulateUndoMenu()
dev@142: {
dev@142: int undoLength = commandStack.UndoLength;
dev@142: int maxUndo = Math.Min(10, undoLength);
dev@142: ToolStripItemCollection dropDownItems = bttnUndo.DropDownItems;
dev@142: dropDownItems.Clear();
dev@142:
dev@142: for (int i = 1; i <= maxUndo; i++)
dev@142: {
dev@142: Command cmd = commandStack.PeekUndoCommand(i);
dev@142:
dev@142: if (cmd == null)
dev@142: {
dev@142: break;
dev@142: }
dev@142:
dev@142: dropDownItems.Add(cmd.UndoDescription, null, undoMenu_Click);
dev@142: }
dev@142:
dev@142: if (undoLength > 0)
dev@142: {
dev@142: bttnUndo.Text = commandStack.PeekUndoCommand(1).UndoDescription;
dev@142: }
dev@142: else
dev@142: {
dev@142: bttnUndo.Text = Translation.GetTranslation("bttnUndo");
dev@142: }
dev@142: }
dev@142:
dev@142: private void miSaveArmy_Click(object sender, System.EventArgs e)
dev@142: {
dev@142: SaveCurrentArmy();
dev@142: }
dev@142:
dev@142: private void SetAppTitle()
dev@142: {
dev@142: string str = AppTitle;
dev@142:
dev@142: if (CurrentGameSystem!=null)
dev@142: {
dev@142: str+= " - "+CurrentGameSystem.Name;
dev@142: }
dev@142:
dev@142: if (CurrentArmy!=null)
dev@142: {
dev@142: str+= " - "+CurrentArmy.Name;
dev@142: }
dev@142:
dev@142: this.Text = str;
dev@142: }
dev@142:
dev@142: private void AddUnitFromCategory(Category cat)
dev@142: {
dev@142: FrmNewUnit newUnit = new FrmNewUnit(CurrentArmy.Race, cat, CurrentArmy);
dev@142: DialogResult dr = newUnit.ShowDialog(this);
dev@142:
dev@142: if (dr == DialogResult.OK)
dev@142: {
dev@142: CreateAndAddUnitCommand cmd = new CreateAndAddUnitCommand(newUnit.SelectedUnit, CurrentArmy.GetCategory(cat));
dev@142: commandStack.Execute(cmd);
dev@142: OpenUnitDialog(cmd.Unit);
dev@142: }
dev@142: }
dev@142:
dev@142: internal void OpenUnitDialog(Unit unit)
dev@142: {
dev@142: string unitID = unit.ID;
dev@142:
dev@142: if (unitWindows.ContainsKey(unitID))
dev@142: {
dev@142: unitWindows[unitID].Focus();
dev@142: }
dev@142: else
dev@142: {
dev@142: FrmUnit unitForm = new FrmUnit(unit, commandStack);
dev@142: unitWindows.Add(unitID, unitForm);
dev@142: unitForm.MdiParent = this;
dev@142: unitForm.Closing += new CancelEventHandler(unitForm_Closing);
dev@142: unitForm.Show();
dev@142: }
dev@142: }
dev@142:
dev@142: private void unitForm_Closing(object sender, CancelEventArgs e)
dev@142: {
dev@142: if (sender is FrmUnit)
dev@142: {
dev@142: FrmUnit unitForm = (FrmUnit) sender;
dev@142: unitWindows.Remove(unitForm.Unit.ID);
dev@142: }
dev@142: }
dev@142:
dev@142: private void FrmMain_UnitAddedMethod(object unitObj)
dev@142: {
dev@196: ValidateArmy();
dev@196: }
dev@196:
dev@196: private void ValidateArmy()
dev@196: {
dev@197: ICollection failureMessages;
dev@197: if (Validates.AsOkay(RequirementHandler.ValidateArmy(CurrentArmy, out failureMessages)))
dev@196: {
dev@196: sbErrorPanel.Text = "";
dev@196: sbErrorPanel.Tag = "";
dev@196: }
dev@196: else
dev@196: {
dev@197: sbErrorPanel.Text = failureMessages.Count + " validation errors";
dev@197: sbErrorPanel.Tag = String.Join("\n", new List(failureMessages).ToArray());
dev@196: }
dev@196: }
dev@196:
dev@196: private void FrmMain_UnitRemovedMethod(object unitObj)
dev@196: {
dev@196: ValidateArmy();
dev@196:
dev@142: if (unitObj is Unit)
dev@142: {
dev@142: Unit unit = (Unit)unitObj;
dev@142:
dev@142: //check if window is open, and close it if it is
dev@142: foreach (Form frm in this.MdiChildren)
dev@142: {
dev@142: if (frm is FrmUnit)
dev@142: {
dev@142: if (((FrmUnit)frm).Unit == unit)
dev@142: {
dev@142: frm.Close();
dev@142: break;
dev@142: }
dev@142: }
dev@142: }
dev@142: }
dev@142: }
dev@142:
dev@142: private void miUndo_Click(object sender, System.EventArgs e)
dev@142: {
dev@142: UndoLastAction();
dev@142: }
dev@142:
dev@142: private void miRedo_Click(object sender, System.EventArgs e)
dev@142: {
dev@142: RedoAction();
dev@142: }
dev@142:
dev@142: private void miCloseArmy_Click(object sender, EventArgs e)
dev@142: {
dev@142: CloseCurrentArmy();
dev@142: }
dev@142:
dev@142: private void miOpenArmy_Click(object sender, EventArgs e)
dev@142: {
dev@142: OpenArmy();
dev@142: }
dev@142:
dev@142: private void FrmMain_PointsValueChangedMethod(WarFoundryObject obj, double oldVal, double newVal)
dev@142: {
dev@142: if (obj is Army)
dev@142: {
dev@142: SetPointsPanelText();
dev@142: }
dev@142: }
dev@142:
snowblizz@190: private void SetPointsPanelText()
dev@142: {
dev@142: if (CurrentArmy==null)
dev@142: {
dev@142: sbPointsPanel.Text = "";
dev@142: sbPointsPanel.ResetColor();
dev@142: }
dev@142: else
dev@142: {
dev@193: string pointsPanelText = String.Format(Translation.GetTranslation("statusPanelPoints"), CurrentArmy.Points, CurrentGameSystem.GetPointsName(CurrentArmy.Points), CurrentArmy.MaxPoints, CurrentGameSystem.GetPointsName(CurrentArmy.MaxPoints));
snowblizz@190: sbPointsPanel.Text = pointsPanelText;
dev@142:
dev@142: if (CurrentArmy.Points>CurrentArmy.MaxPoints)
dev@142: {
dev@142: sbPointsPanel.Color = Color.Red;
dev@142: }
dev@142: else
dev@142: {
dev@142: sbPointsPanel.ResetColor();
dev@142: }
dev@142: }
dev@142: }
dev@142:
snowblizz@190: private void SetPointsPanelToolTipText()
snowblizz@190: {
snowblizz@190: sbPointsPanel.ToolTipText = Translation.GetTranslation("statusPanelPointsToolTip", "total points value");
snowblizz@190: }
snowblizz@190:
dev@142: private void redoMenu_Click(object sender, EventArgs e)
dev@142: {
dev@142: if (sender is ToolStripDropDownItem)
dev@142: {
dev@142: ToolStripDropDownItem item = (ToolStripDropDownItem)sender;
dev@142: //we know it's an redo menu item so find it's index and redo everything
dev@142: int max = bttnRedo.DropDownItems.IndexOf(item);
dev@142:
dev@142: if (max >= 0)
dev@142: {
dev@142: for (int i = 0; i <= max; i++)
dev@142: {
dev@142: commandStack.Redo();
dev@142: }
dev@142: }
dev@142: }
dev@142: }
dev@142:
dev@142: private void undoMenu_Click(object sender, EventArgs e)
dev@142: {
dev@142: if (sender is ToolStripDropDownItem)
dev@142: {
dev@142: ToolStripDropDownItem item = (ToolStripDropDownItem)sender;
dev@142: //we know it's an redo menu item so find it's index and redo everything
dev@142: int max = bttnUndo.DropDownItems.IndexOf(item);
dev@142:
dev@142: if (max >= 0)
dev@142: {
dev@142: for (int i = 0; i <= max; i++)
dev@142: {
dev@142: commandStack.Undo();
dev@142: }
dev@142: }
dev@142: }
dev@142: }
dev@142:
dev@142: private void statusBar_DrawItem(object sender, System.Windows.Forms.StatusBarDrawItemEventArgs sbdevent)
dev@142: {
dev@142: statusBar.ColorableStatusBarDrawItem(sender, sbdevent);
dev@142: }
dev@142:
dev@142: private void FrmMain_Closing(object sender, CancelEventArgs e)
dev@142: {
dev@142: if (!CloseCurrentArmy())
dev@142: {
dev@142: e.Cancel = true;
dev@142: }
dev@142: }
dev@142:
dev@142: private void miReloadFiles_Click(object sender, System.EventArgs e)
dev@142: {
dev@142: WarFoundryLoader.GetDefault().LoadFiles();
dev@142: sbMainPanel.Text = Translation.GetTranslation("GameSystemFilesReloaded", "Game system and race files reloaded");
dev@142: }
dev@142:
dev@142: private void statusBar_PanelClick(object sender, StatusBarPanelClickEventArgs e)
dev@142: {
dev@142: if (e.StatusBarPanel == sbErrorPanel && sbErrorPanel.Text!="")
dev@142: {
dev@142: MessageBox.Show(this, sbErrorPanel.TagString, Translation.GetTranslation("FailedRequirementMessage"), MessageBoxButtons.OK, MessageBoxIcon.Warning);
dev@142: }
dev@142: }
dev@142:
dev@142: private void miExportArmyAsBasicHTML_Click(object sender, EventArgs e)
dev@142: {
dev@142: SaveFileDialog dialog = new SaveFileDialog();
dev@142: dialog.Filter = Translation.GetTranslation("armyExportBasicHtmlFilter", "HTML pages") + "|*.html";
dev@142: dialog.Title = Translation.GetTranslation("exportArmyDialog", "Export army");
dev@142:
dev@142: DialogResult dr = dialog.ShowDialog(this);
dev@142:
dev@142: if (dr == DialogResult.OK)
dev@142: {
dev@142: Army army = CurrentArmy;
dev@142: string filePath = dialog.FileName;
dev@142: log.DebugFormat("Exporting {0} to {1} as basic HTML", army.Name, filePath);
dev@142: WarFoundryHtmlExporter.GetDefault().ExportArmy(army, filePath);
dev@142: }
dev@142: }
dev@142:
dev@142: private void FrmMain_Load(object sender, EventArgs e)
dev@142: {
dev@142: string gameSystemID = Preferences.GetStringProperty("currSystem");
dev@142:
dev@142: if (gameSystemID != null && !"".Equals(gameSystemID))
dev@142: {
dev@142: log.Debug("Attempting to load current game system from properties");
dev@142: GameSystem sys = WarFoundryLoader.GetDefault().GetGameSystem(gameSystemID);
dev@142:
dev@142: if (sys != null)
dev@142: {
dev@142: WarFoundryCore.CurrentGameSystem = sys;
dev@142: log.InfoFormat("Loaded game system {0} from properties", gameSystemID);
dev@142: }
dev@142: }
dev@142: }
dev@142:
dev@142: private void miAbout_Click(object sender, EventArgs e)
dev@142: {
dev@142: FrmAbout about = new FrmAbout();
dev@142: about.ShowDialog(this);
dev@140: }
dev@140:
dev@140: private void miPreferences_Click(object sender, EventArgs e)
dev@140: {
dev@140: FrmPreferences prefsForm = new FrmPreferences(Preferences);
dev@140: prefsForm.Show(this);
dev@142: }
Dan@207:
Dan@207: private void miExportArmyAsBasicXml_Click(object sender, EventArgs e)
Dan@207: {
Dan@207: SaveFileDialog dialog = new SaveFileDialog();
Dan@207: dialog.Filter = Translation.GetTranslation("armyExportBasicXmlFilter", "XML pages") + "|*.xml";
Dan@207: dialog.Title = Translation.GetTranslation("exportArmyDialog", "Export army");
Dan@207:
Dan@207: DialogResult dr = dialog.ShowDialog(this);
Dan@207:
Dan@207: if (dr == DialogResult.OK)
Dan@207: {
Dan@207: Army army = CurrentArmy;
Dan@207: string filePath = dialog.FileName;
Dan@207: log.DebugFormat("Exporting {0} to {1} as basic XML", army.Name, filePath);
Dan@207: WarFoundryXmlWithXslExporter.GetDefault().ExportArmy(army, filePath);
Dan@207: }
Dan@207: }
dev@142: }
dev@142: }