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: }