using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Text; using System.Windows.Forms; namespace OnTopReplica { /// /// Acts as a form that can contain a SidePanel instance. /// partial class SidePanelContainer : WindowsFormsAero.AeroForm { EventHandler RequestClosingHandler; MainForm _parent; public SidePanelContainer(MainForm mainForm) { InitializeComponent(); _parent = mainForm; RequestClosingHandler = new EventHandler(Panel_RequestClosing); } void Panel_RequestClosing(object sender, EventArgs e) { FreeSidePanel(); this.Close(); } protected override void OnClosing(CancelEventArgs e) { base.OnClosing(e); //Ensure side panel closing code is run FreeSidePanel(); } /// /// Sets a new side panel and refreshes the window. The panel is /// managed by the SidePanelContainer from now on. /// /// SidePanel to embed and to manage. public void SetSidePanel(SidePanel panel) { panel.OnFirstShown(_parent); this.SuspendLayout(); //Title this.Text = panel.Title; //Set panel CurrentSidePanel = panel; panel.RequestClosing += RequestClosingHandler; this.Controls.Add(panel); var minSize = panel.MinimumSize.Expand(this.Padding); this.ClientSize = minSize; this.EnsureMinimumClientSize(minSize); this.GlassMargins = panel.GlassMargins; this.ResumeLayout(); } /// /// Removes the current side panel and disposes it. /// public void FreeSidePanel() { if (CurrentSidePanel == null) return; this.SuspendLayout(); FreeSidePanelCore(); this.ResumeLayout(); } /// /// Removes the current side panel and disposes it (doesn't suspend layout). /// private void FreeSidePanelCore() { CurrentSidePanel.OnClosing(_parent); //Free hook CurrentSidePanel.RequestClosing -= RequestClosingHandler; //Remove this.Controls.Remove(CurrentSidePanel); //Free CurrentSidePanel.Dispose(); CurrentSidePanel = null; } public SidePanel CurrentSidePanel { get; private set; } } }