using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Windows.Forms; namespace HeuristicLab.ExperimentGeneration.DataAnalysis.Wizard { public enum WizardButtons { None, Back, Next, Commit } public partial class Wizard : Form { private IList wizardPages; public IList WizardPages { get { return wizardPages; } } private WizardPage activePage; public WizardPage ActivePage { get { return activePage; } } public Wizard() { InitializeComponent(); wizardPages = new List(); } public void SetActivePage(int pageIndex) { if (pageIndex < 0 || pageIndex >= wizardPages.Count) { throw new ArgumentOutOfRangeException("pageIndex"); } SetActivePage(wizardPages[pageIndex]); } public void SetActivePage(string pageName) { if (string.IsNullOrEmpty(pageName)) { throw new ArgumentException("Parameter must not be null or empty", "pageName"); } WizardPage newPage = WizardPages.Single(p => p.Name == pageName); if (newPage == null) { throw new ArgumentNullException(string.Format("Can't find page with name {0}", pageName)); } else { SetActivePage(newPage); } } public void SetActivePage(WizardPageEventArgs wpea) { if (!wpea.Cancel) { SetActivePage(wpea.NewPage); } } public void SetActivePage(WizardPage page) { WizardPage oldActivePage = activePage; if (!pagePanel.Controls.Contains(page)) { pagePanel.Controls.Add(page); } page.Visible = true; activePage = page; CancelEventArgs e = new CancelEventArgs(); activePage.OnSetActive(e); if (e.Cancel) { activePage.Visible = false; activePage = oldActivePage; } foreach (WizardPage wp in WizardPages) { if (wp != activePage) { wp.Visible = false; } } } public void SetWizardButton(WizardButtons button) { if (button == WizardButtons.Back) { btnBack.Enabled = true; } else if (button == WizardButtons.Next) { btnCommit.Visible = false; btnCommit.Enabled = false; btnNext.Visible = true; btnNext.Enabled = true; AcceptButton = btnNext; } else if (button == WizardButtons.Commit) { btnCommit.Visible = true; btnCommit.Enabled = true; btnNext.Visible = false; btnNext.Enabled = false; AcceptButton = btnCommit; } } public void SetButtonText(WizardButtons button, string buttonText) { if (button == WizardButtons.Commit) { btnCommit.Text = buttonText; } } protected virtual void OnQueryCancel(CancelEventArgs e) { activePage.OnQueryCancel(e); } private void SetWizardSizeToFitAllPages() { System.Drawing.Size maxPageSize = new System.Drawing.Size(controlPanel.Width, 0); foreach (WizardPage page in WizardPages) { if (page.Width > maxPageSize.Width) { maxPageSize.Width = page.Width; } if (page.Height > maxPageSize.Height) { maxPageSize.Height = page.Height; } } foreach (WizardPage page in WizardPages) { page.Size = maxPageSize; } System.Drawing.Size newSize = maxPageSize + (Size - pagePanel.Size); Size = newSize; } private WizardPageEventArgs BuildChangePageEventArgs(int delta) { int activePageIndex = WizardPages.IndexOf(ActivePage); int nextPageIndex = activePageIndex + delta; if (nextPageIndex < 0 || nextPageIndex >= WizardPages.Count) nextPageIndex = activePageIndex; WizardPage nextPage = WizardPages[nextPageIndex]; WizardPageEventArgs wpea = new WizardPageEventArgs(); wpea.NewPage = nextPage.Name; wpea.Cancel = false; return wpea; } private void btnNext_Click(object sender, EventArgs e) { WizardPageEventArgs wpea = BuildChangePageEventArgs(1); ActivePage.OnWizardNext(wpea); SetActivePage(wpea); } private void btnBack_Click(object sender, EventArgs e) { WizardPageEventArgs wpea = BuildChangePageEventArgs(-1); ActivePage.OnWizardBack(wpea); SetActivePage(wpea); } private void btnCommit_Click(object sender, EventArgs e) { CancelEventArgs cea = new CancelEventArgs(); ActivePage.OnWizardCommit(cea); if (!cea.Cancel) { DialogResult = DialogResult.OK; Close(); } } private void btnCancel_Click(object sender, EventArgs e) { DialogResult = DialogResult.Cancel; Close(); } private void Wizard_Load(object sender, EventArgs e) { if (WizardPages.Count > 0) { SetWizardSizeToFitAllPages(); SetActivePage(0); } else { SetWizardButton(WizardButtons.None); } } private void Wizard_Closing(object sender, CancelEventArgs e) { if (!btnCancel.Enabled) { e.Cancel = true; } else if (btnCommit.Enabled) { OnQueryCancel(e); } } } }