File: winforms\Managed\System\WinForms\ToolStripContainer.cs
Project: ndp\fx\src\System.Windows.Forms.csproj (System.Windows.Forms)
//------------------------------------------------------------------------------
// <copyright file="ToolStripPanel.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>
//------------------------------------------------------------------------------
 
/// this is the UBER container for ToolStripPanels.
namespace System.Windows.Forms {
 
    using Microsoft.Win32;
    using System;
    using System.ComponentModel;
    using System.Diagnostics;
    using System.Drawing;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    using System.Collections;
    using System.Globalization;
    using System.Windows.Forms.Layout;
    
    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.AutoDispatch)]
    [Designer("System.Windows.Forms.Design.ToolStripContainerDesigner, " + AssemblyRef.SystemDesign)]
    [SRDescription(SR.ToolStripContainerDesc)]
    public class ToolStripContainer : ContainerControl {
 
        private ToolStripPanel topPanel;
        private ToolStripPanel bottomPanel;
        private ToolStripPanel leftPanel;
        private ToolStripPanel rightPanel;
        private ToolStripContentPanel contentPanel;
 
        
        public ToolStripContainer() {
 
            SetStyle(ControlStyles.ResizeRedraw | ControlStyles.SupportsTransparentBackColor, true);
 
            SuspendLayout();
            try {
                // undone - smart demand creation
                topPanel = new ToolStripPanel(this);
                bottomPanel = new ToolStripPanel(this);
                leftPanel = new ToolStripPanel(this);
                rightPanel = new ToolStripPanel(this);
                contentPanel = new ToolStripContentPanel();
                contentPanel.Dock = DockStyle.Fill;
                topPanel.Dock = DockStyle.Top;
                bottomPanel.Dock = DockStyle.Bottom;
                rightPanel.Dock = DockStyle.Right;
                leftPanel.Dock = DockStyle.Left;
 
                ToolStripContainerTypedControlCollection controlCollection = this.Controls as ToolStripContainerTypedControlCollection;
                if (controlCollection != null) {
                    controlCollection.AddInternal(contentPanel);
                    controlCollection.AddInternal(leftPanel);
                    controlCollection.AddInternal(rightPanel);
                    controlCollection.AddInternal(topPanel);
                    controlCollection.AddInternal(bottomPanel);
                }
                // else consider throw new exception
 
            }
            finally {
                ResumeLayout(true);
            }
        }
 
 
        [
        Browsable(false),
        EditorBrowsable(EditorBrowsableState.Never),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
        ]
        public override bool AutoScroll {
            get { return base.AutoScroll; }
            set { base.AutoScroll = value; }
        }
 
        [
        Browsable(false),
        EditorBrowsable(EditorBrowsableState.Never),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
        ]
        public new Size AutoScrollMargin {
            get { return base.AutoScrollMargin; }
            set { base.AutoScrollMargin = value; }
        }
 
        [
        Browsable(false),
        EditorBrowsable(EditorBrowsableState.Never),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
        ]
        public new Size AutoScrollMinSize {
            get { return base.AutoScrollMinSize; }
            set { base.AutoScrollMinSize = value; }
        }
        [
        Browsable(false),
        EditorBrowsable(EditorBrowsableState.Never),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
        ]
        public new Color BackColor {
            get { return base.BackColor; }
            set { base.BackColor = value; }
        }
 
        [
        Browsable(false),
        EditorBrowsable(EditorBrowsableState.Never),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
        ]
        public new event EventHandler BackColorChanged {
            add {
                base.BackColorChanged += value;
            }
            remove {
                base.BackColorChanged -= value;
            }
        }
 
        [
        Browsable(false),
        EditorBrowsable(EditorBrowsableState.Never),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
        ]
        public new Image BackgroundImage {
            get { return base.BackgroundImage; }
            set { base.BackgroundImage = value; }
        }
 
 
        [
        Browsable(false),
        EditorBrowsable(EditorBrowsableState.Never),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
        ]
        public new event EventHandler BackgroundImageChanged {
            add {
                base.BackgroundImageChanged += value;
            }
            remove {
                base.BackgroundImageChanged -= value;
            }
        }
 
        [
        Browsable(false),
        EditorBrowsable(EditorBrowsableState.Never),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
        ]
        public override ImageLayout BackgroundImageLayout {
            get { return base.BackgroundImageLayout; }
            set { base.BackgroundImageLayout = value; }
        }
 
        [
        Browsable(false),
        EditorBrowsable(EditorBrowsableState.Never),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
        ]
        public new event EventHandler BackgroundImageLayoutChanged {
            add {
                base.BackgroundImageLayoutChanged += value;
            }
            remove {
                base.BackgroundImageLayoutChanged += value;
            }
        }
 
        [
        SRCategory(SR.CatAppearance),
        SRDescription(SR.ToolStripContainerBottomToolStripPanelDescr),
        Localizable(false),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Content)
        ]
        public ToolStripPanel BottomToolStripPanel {
            get {
                return bottomPanel;
            }
        }
 
        [
        SRCategory(SR.CatAppearance),
        SRDescription(SR.ToolStripContainerBottomToolStripPanelVisibleDescr),
        DefaultValue(true)
        ]
        public bool BottomToolStripPanelVisible {
            get {
                return BottomToolStripPanel.Visible;
            }
            set {
                BottomToolStripPanel.Visible = value;
            }
        }
 
        [
        SRCategory(SR.CatAppearance),
        SRDescription(SR.ToolStripContainerContentPanelDescr),
        Localizable(false),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Content)
        ]
        public ToolStripContentPanel ContentPanel {
            get {
                return contentPanel;
            }
        }
 
        [
        Browsable(false),
        EditorBrowsable(EditorBrowsableState.Never),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
        ]
        public new bool CausesValidation {
            get { return base.CausesValidation; }
            set { base.CausesValidation = value; }
        }
 
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        public new event EventHandler CausesValidationChanged {
            add {
                base.CausesValidationChanged += value;
            }
            remove {
                base.CausesValidationChanged -= value;
            }
        }
 
        [
        Browsable(false),
        EditorBrowsable(EditorBrowsableState.Never),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
        ]
        public new ContextMenuStrip ContextMenuStrip {
            get { return base.ContextMenuStrip; }
            set { base.ContextMenuStrip = value; }
        }
 
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        public new event EventHandler ContextMenuStripChanged {
            add {
                base.ContextMenuStripChanged += value;
            }
            remove {
                base.ContextMenuStripChanged -= value;
            }
        }
 
        [
        Browsable(false),
        EditorBrowsable(EditorBrowsableState.Never),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
        ]
        public override Cursor Cursor {
            get { return base.Cursor; }
            set { base.Cursor = value; }
        }
 
        [
        Browsable(false),
        EditorBrowsable(EditorBrowsableState.Never),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
        ]
        public new event EventHandler CursorChanged {
            add {
                base.CursorChanged += value;
            }
            remove {
                base.CursorChanged -= value;
            }
        }
 
 
        protected override Size DefaultSize {
            get {
                return new Size(150, 175);
            }
        }
 
        [
        Browsable(false),
        EditorBrowsable(EditorBrowsableState.Never),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
        ]
        public new Color ForeColor {
            get { return base.ForeColor; }
            set { base.ForeColor = value; }
        }
 
        [
        Browsable(false),
        EditorBrowsable(EditorBrowsableState.Never),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
        ]
        public new event EventHandler ForeColorChanged {
            add {
                base.ForeColorChanged += value;
            }
            remove {
                base.ForeColorChanged -= value;
            }
        }
 
        [
        SRCategory(SR.CatAppearance),
        SRDescription(SR.ToolStripContainerLeftToolStripPanelDescr),
        Localizable(false),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Content)
        ]
        public ToolStripPanel LeftToolStripPanel {
            get {
                return leftPanel;
            }
        }
 
 
        [
        SRCategory(SR.CatAppearance),
        SRDescription(SR.ToolStripContainerLeftToolStripPanelVisibleDescr),
        DefaultValue(true)
        ]
        public bool LeftToolStripPanelVisible {
            get {
                return LeftToolStripPanel.Visible;
            }
            set {
                LeftToolStripPanel.Visible = value;
            }
        }
 
       
        [
        SRCategory(SR.CatAppearance),
        SRDescription(SR.ToolStripContainerRightToolStripPanelDescr),
        Localizable(false),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Content)
        ]
        public ToolStripPanel RightToolStripPanel {
            get {
                return rightPanel;
            }
        }
 
        [
        SRCategory(SR.CatAppearance),
        SRDescription(SR.ToolStripContainerRightToolStripPanelVisibleDescr),
        DefaultValue(true)
        ]
        public bool RightToolStripPanelVisible {
            get {
                return RightToolStripPanel.Visible;
            }
            set {
                RightToolStripPanel.Visible = value;
            }
        }
 
        [
        SRCategory(SR.CatAppearance),
        SRDescription(SR.ToolStripContainerTopToolStripPanelDescr),
        Localizable(false),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Content)
        ]
        public ToolStripPanel TopToolStripPanel {
            get {
                return topPanel;
            }
        }
 
        [
        SRCategory(SR.CatAppearance),
        SRDescription(SR.ToolStripContainerTopToolStripPanelVisibleDescr),
        DefaultValue(true)
        ]
        public bool TopToolStripPanelVisible {
            get {
                return TopToolStripPanel.Visible;
            }
            set {
                TopToolStripPanel.Visible = value;
            }
        }
 
        /// <include file='doc\SplitContainer.uex' path='docs/doc[@for="SplitContainer.Controls"]/*' />
        /// <devdoc>
        ///     Controls Collection...
        ///     This is overriden so that the Controls.Add ( ) is not Code Gened...
        /// </devdoc>
        [EditorBrowsable(EditorBrowsableState.Never)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public new Control.ControlCollection Controls {
            get {
                return base.Controls;
            }
        }
 
        [EditorBrowsable(EditorBrowsableState.Advanced)]
        protected override Control.ControlCollection CreateControlsInstance() {
            return new ToolStripContainerTypedControlCollection(this, /*isReadOnly*/true);
        }
 
        protected override void OnRightToLeftChanged(EventArgs e) {
            base.OnRightToLeftChanged(e);
            RightToLeft rightToLeft = this.RightToLeft;
 
            // no need to suspend layout - we're already in a layout transaction.
            if (rightToLeft == RightToLeft.Yes) {
                RightToolStripPanel.Dock = DockStyle.Left;
                LeftToolStripPanel.Dock = DockStyle.Right;
            }
            else {
                RightToolStripPanel.Dock = DockStyle.Right;
                LeftToolStripPanel.Dock = DockStyle.Left;
            }
        }
 
        protected override void OnSizeChanged(EventArgs e) {
            foreach (Control c in this.Controls) {
                c.SuspendLayout();
            }
            base.OnSizeChanged(e);
            foreach (Control c in this.Controls) {
                c.ResumeLayout();
            }
 
        }
 
        internal override void RecreateHandleCore() {
            //If ToolStripContainer's Handle is getting created demand create the childControl handle's
            // Refer vsw : 517556 for more details.
            if (IsHandleCreated) {
                foreach(Control c in Controls) {
                    c.CreateControl(true);                
                }
            }
            base.RecreateHandleCore();
            
        }
 
        internal override bool AllowsKeyboardToolTip() {
            return false;
        }
 
 
        internal class ToolStripContainerTypedControlCollection : WindowsFormsUtils.ReadOnlyControlCollection {
            ToolStripContainer owner;
            Type contentPanelType = typeof(ToolStripContentPanel);
            Type panelType = typeof(ToolStripPanel);
 
            public ToolStripContainerTypedControlCollection(Control c, bool isReadOnly)
                : base(c, isReadOnly) {
                this.owner = c as ToolStripContainer;
            }
 
            public override void Add(Control value) {
                if (value == null) {
                    throw new ArgumentNullException("value");
                }
                if (IsReadOnly) {
                    throw new NotSupportedException(SR.GetString(SR.ToolStripContainerUseContentPanel));
                }
 
                Type controlType = value.GetType();
                if (!contentPanelType.IsAssignableFrom(controlType) && !panelType.IsAssignableFrom(controlType)) {
                    throw new ArgumentException(String.Format(CultureInfo.CurrentCulture, SR.GetString(SR.TypedControlCollectionShouldBeOfTypes, contentPanelType.Name, panelType.Name)), value.GetType().Name);
                }
                base.Add(value);
            }
            public override void Remove(Control value) {
                if (value is ToolStripPanel || value is ToolStripContentPanel) {
                    if (!owner.DesignMode) {
                        if (IsReadOnly) throw new NotSupportedException(SR.GetString(SR.ReadonlyControlsCollection));
                    }
                }
                base.Remove(value);
            }
 
            internal override void SetChildIndexInternal(Control child, int newIndex) {
                if (child is ToolStripPanel || child is ToolStripContentPanel) {
                    if (!owner.DesignMode) {
                        if (IsReadOnly) {
                            throw new NotSupportedException(SR.GetString(SR.ReadonlyControlsCollection));
                        }
                    }
                    else {
                        // just no-op it at DT.
                        return;
                    }
                }
                base.SetChildIndexInternal(child, newIndex);
            }
 
        }
 
    }
 
 
}