625 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			625 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.Collections.Generic;
 | 
						|
using System.Text;
 | 
						|
using System.Drawing;
 | 
						|
using System.ComponentModel;
 | 
						|
using System.Drawing.Drawing2D;
 | 
						|
 | 
						|
namespace DevComponents.DotNetBar
 | 
						|
{
 | 
						|
    /// <summary>
 | 
						|
    /// Defines an container where you can arrange child elements added to SubItems collection either horizontally or vertically, relative to each other using SetDock and GetDock methods.
 | 
						|
    /// </summary>
 | 
						|
    [ToolboxItem(false), DesignTimeVisible(false), ProvideProperty("Dock", typeof(BaseItem))]
 | 
						|
    [Designer("DevComponents.DotNetBar.Design.ItemContainerDesigner, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral,  PublicKeyToken=90f470f34c89ccaf")]
 | 
						|
    public class ItemDockContainer : ImageItem, System.ComponentModel.IExtenderProvider, IDesignTimeProvider
 | 
						|
    {
 | 
						|
        #region Private Variables
 | 
						|
        private ElementStyle _BackgroundStyle = new ElementStyle();
 | 
						|
        private Rectangle _DesignerSelectionRectangle = Rectangle.Empty;
 | 
						|
        private Size _EmptyDesignTimeSize = new Size(24, 24);
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Constructor
 | 
						|
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Initializes a new instance of the ItemDockContainer class.
 | 
						|
        /// </summary>
 | 
						|
        public ItemDockContainer()
 | 
						|
        {
 | 
						|
            m_IsContainer = true;
 | 
						|
            _BackgroundStyle.StyleChanged += new EventHandler(BackgroundStyleChanged);
 | 
						|
        }
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Internal Implementation
 | 
						|
        /// <summary>
 | 
						|
        /// Returns copy of the item.
 | 
						|
        /// </summary>
 | 
						|
        public override BaseItem Copy()
 | 
						|
        {
 | 
						|
            ItemDockContainer objCopy = new ItemDockContainer();
 | 
						|
            this.CopyToItem(objCopy);
 | 
						|
            return objCopy;
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Copies the ButtonItem specific properties to new instance of the item.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="copy">New ButtonItem instance.</param>
 | 
						|
        internal void InternalCopyToItem(ButtonItem copy)
 | 
						|
        {
 | 
						|
            CopyToItem((BaseItem)copy);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Copies the ButtonItem specific properties to new instance of the item.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="copy">New ButtonItem instance.</param>
 | 
						|
        protected override void CopyToItem(BaseItem copy)
 | 
						|
        {
 | 
						|
            base.CopyToItem(copy);
 | 
						|
            ItemDockContainer idc = (ItemDockContainer)copy;
 | 
						|
            idc.LastChildFill = _LastChildFill;
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Recalculates the size of the container. Assumes that DisplayRectangle.Location is set to the upper left location of this container.
 | 
						|
        /// </summary>
 | 
						|
        public override void RecalcSize()
 | 
						|
        {
 | 
						|
            if (this.SuspendLayout)
 | 
						|
                return;
 | 
						|
 | 
						|
            if (this.SubItems.Count == 0 || this.VisibleSubItems == 0)
 | 
						|
            {
 | 
						|
                if (this.DesignMode && !this.SystemContainer)
 | 
						|
                {
 | 
						|
                    m_Rect.Size = GetEmptyDesignTimeSize();
 | 
						|
                }
 | 
						|
                else
 | 
						|
                {
 | 
						|
                    m_Rect = Rectangle.Empty;
 | 
						|
                }
 | 
						|
                base.RecalcSize();
 | 
						|
                return;
 | 
						|
            }
 | 
						|
 | 
						|
            m_Rect = LayoutItems(m_Rect);
 | 
						|
 | 
						|
            base.RecalcSize();
 | 
						|
        }
 | 
						|
        private BaseItem LastVisibleItem
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                int count = this.SubItems.Count - 1;
 | 
						|
                for (int i = count; i >= 0; i--)
 | 
						|
                {
 | 
						|
                    BaseItem item = SubItems[i];
 | 
						|
                    if (item.Visible)
 | 
						|
                    {
 | 
						|
                        return item;
 | 
						|
                    }
 | 
						|
                }
 | 
						|
                return null;
 | 
						|
            }
 | 
						|
        }
 | 
						|
        private System.Drawing.Rectangle LayoutItems(Rectangle bounds)
 | 
						|
        {
 | 
						|
            Rectangle itemsBounds = new Rectangle();
 | 
						|
            BaseItem lastVisibleItem = LastVisibleItem;
 | 
						|
            foreach (BaseItem item in m_SubItems)
 | 
						|
            {
 | 
						|
                if (!item.Visible)
 | 
						|
                {
 | 
						|
                    item.Displayed = false;
 | 
						|
                    continue;
 | 
						|
                }
 | 
						|
                item.Displayed = true;
 | 
						|
                item.RecalcSize();
 | 
						|
                eItemDock dock = GetDock(item);
 | 
						|
                if (_LastChildFill && item == lastVisibleItem)
 | 
						|
                {
 | 
						|
                    itemsBounds.Width += item.WidthInternal;
 | 
						|
                    if (item.HeightInternal > itemsBounds.Height)
 | 
						|
                        itemsBounds.Height = item.HeightInternal;
 | 
						|
                }
 | 
						|
                else if (dock == eItemDock.Left || dock == eItemDock.Right)
 | 
						|
                {
 | 
						|
                    itemsBounds.Width += item.WidthInternal;
 | 
						|
                    if (item.HeightInternal > itemsBounds.Height)
 | 
						|
                        itemsBounds.Height = item.HeightInternal;
 | 
						|
                }
 | 
						|
                else if (dock == eItemDock.Top || dock == eItemDock.Bottom)
 | 
						|
                {
 | 
						|
                    itemsBounds.Height += item.HeightInternal;
 | 
						|
                    if (item.WidthInternal > itemsBounds.Width)
 | 
						|
                        itemsBounds.Width = item.WidthInternal;
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            if (bounds.Width < itemsBounds.Width)
 | 
						|
                bounds.Width = itemsBounds.Width;
 | 
						|
            if (bounds.Height < itemsBounds.Height)
 | 
						|
                bounds.Height = itemsBounds.Height;
 | 
						|
 | 
						|
            if (!this.Stretch)
 | 
						|
            {
 | 
						|
                if (itemsBounds.Height < bounds.Height)
 | 
						|
                    bounds.Height = itemsBounds.Height;
 | 
						|
            }
 | 
						|
 | 
						|
            ArrangeItems(bounds);
 | 
						|
            return bounds;
 | 
						|
        }
 | 
						|
 | 
						|
        private void ArrangeItems(Rectangle bounds)
 | 
						|
        {
 | 
						|
            BaseItem lastVisibleItem = LastVisibleItem;
 | 
						|
            Rectangle arrangeBounds = bounds;
 | 
						|
 | 
						|
            foreach (BaseItem item in m_SubItems)
 | 
						|
            {
 | 
						|
                if (!item.Visible)
 | 
						|
                    continue;
 | 
						|
 | 
						|
                eItemDock dock = GetDock(item);
 | 
						|
                if (_LastChildFill && item == lastVisibleItem)
 | 
						|
                {
 | 
						|
                    item.LeftInternal = arrangeBounds.Left;
 | 
						|
                    item.TopInternal = arrangeBounds.Top;
 | 
						|
                    item.WidthInternal = arrangeBounds.Width;
 | 
						|
                    item.HeightInternal = arrangeBounds.Height;
 | 
						|
                }
 | 
						|
                else if (dock == eItemDock.Left)
 | 
						|
                {
 | 
						|
                    item.LeftInternal = arrangeBounds.Left;
 | 
						|
                    item.TopInternal = arrangeBounds.Top;
 | 
						|
                    item.HeightInternal = arrangeBounds.Height;
 | 
						|
                    if (item.WidthInternal <= arrangeBounds.Width)
 | 
						|
                    {
 | 
						|
                        arrangeBounds.Width -= item.WidthInternal;
 | 
						|
                        arrangeBounds.X += item.WidthInternal;
 | 
						|
                    }
 | 
						|
                    else if (arrangeBounds.Width > 0)
 | 
						|
                    {
 | 
						|
                        arrangeBounds.X += arrangeBounds.Width;
 | 
						|
                        arrangeBounds.Width = 0;
 | 
						|
                    }
 | 
						|
                }
 | 
						|
                else if (dock == eItemDock.Right)
 | 
						|
                {
 | 
						|
                    item.HeightInternal = arrangeBounds.Height;
 | 
						|
                    if (item.WidthInternal <= arrangeBounds.Width)
 | 
						|
                    {
 | 
						|
                        item.LeftInternal = arrangeBounds.Right - item.WidthInternal;
 | 
						|
                        item.TopInternal = arrangeBounds.Top;
 | 
						|
                        arrangeBounds.Width -= item.WidthInternal;
 | 
						|
                    }
 | 
						|
                    else
 | 
						|
                    {
 | 
						|
                        item.LeftInternal = arrangeBounds.Left;
 | 
						|
                        item.TopInternal = arrangeBounds.Top;
 | 
						|
                        if (arrangeBounds.Width > 0)
 | 
						|
                        {
 | 
						|
                            arrangeBounds.X += arrangeBounds.Width;
 | 
						|
                            arrangeBounds.Width = 0;
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                }
 | 
						|
                else if (dock == eItemDock.Top)
 | 
						|
                {
 | 
						|
                    item.LeftInternal = arrangeBounds.Left;
 | 
						|
                    item.TopInternal = arrangeBounds.Top;
 | 
						|
                    item.WidthInternal = arrangeBounds.Width;
 | 
						|
                    if (item.HeightInternal <= arrangeBounds.Height)
 | 
						|
                    {
 | 
						|
                        arrangeBounds.Height -= item.HeightInternal;
 | 
						|
                        arrangeBounds.Y += item.HeightInternal;
 | 
						|
                    }
 | 
						|
                    else if (arrangeBounds.Height > 0)
 | 
						|
                    {
 | 
						|
                        arrangeBounds.Y += arrangeBounds.Height;
 | 
						|
                        arrangeBounds.Height = 0;
 | 
						|
                    }
 | 
						|
                }
 | 
						|
                else if (dock == eItemDock.Bottom)
 | 
						|
                {
 | 
						|
                    item.WidthInternal = arrangeBounds.Width;
 | 
						|
                    if (item.HeightInternal <= arrangeBounds.Height)
 | 
						|
                    {
 | 
						|
                        item.LeftInternal = arrangeBounds.Left;
 | 
						|
                        item.TopInternal = arrangeBounds.Bottom - item.HeightInternal;
 | 
						|
                        arrangeBounds.Height -= item.HeightInternal;
 | 
						|
                    }
 | 
						|
                    else
 | 
						|
                    {
 | 
						|
                        item.LeftInternal = arrangeBounds.Left;
 | 
						|
                        item.TopInternal = arrangeBounds.Top;
 | 
						|
                        if (arrangeBounds.Height > 0)
 | 
						|
                        {
 | 
						|
                            arrangeBounds.Y += arrangeBounds.Height;
 | 
						|
                            arrangeBounds.Height = 0;
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        protected override void OnExternalSizeChange()
 | 
						|
        {
 | 
						|
            if (!this.SuspendLayout)
 | 
						|
                ArrangeItems(m_Rect);
 | 
						|
            base.OnExternalSizeChange();
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Called after TopInternal property has changed
 | 
						|
        /// </summary>
 | 
						|
        protected override void OnTopLocationChanged(int oldValue)
 | 
						|
        {
 | 
						|
            base.OnTopLocationChanged(oldValue);
 | 
						|
            Point offset = new Point(0, this.TopInternal - oldValue);
 | 
						|
            OffsetSubItems(offset);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Called after LeftInternal property has changed
 | 
						|
        /// </summary>
 | 
						|
        protected override void OnLeftLocationChanged(int oldValue)
 | 
						|
        {
 | 
						|
            base.OnLeftLocationChanged(oldValue);
 | 
						|
            Point offset = new Point(this.LeftInternal - oldValue, 0);
 | 
						|
            OffsetSubItems(offset);
 | 
						|
        }
 | 
						|
 | 
						|
        private bool _Offsetting = false;
 | 
						|
        internal void OffsetSubItems(Point offset)
 | 
						|
        {
 | 
						|
            if (_Offsetting || offset.IsEmpty)
 | 
						|
                return;
 | 
						|
 | 
						|
            try
 | 
						|
            {
 | 
						|
                _Offsetting = true;
 | 
						|
                BaseItem[] items = new BaseItem[this.SubItems.Count];
 | 
						|
                this.SubItems.CopyTo(items, 0);
 | 
						|
                foreach (BaseItem b in items)
 | 
						|
                {
 | 
						|
                    Rectangle r = b.Bounds;
 | 
						|
                    r.Offset(offset);
 | 
						|
                    b.Bounds = r;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            finally
 | 
						|
            {
 | 
						|
                _Offsetting = false;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Must be overridden by class that is inheriting to provide the painting for the item.
 | 
						|
        /// </summary>
 | 
						|
        public override void Paint(ItemPaintArgs p)
 | 
						|
        {
 | 
						|
            Graphics g = p.Graphics;
 | 
						|
            Region oldClip = null;
 | 
						|
            bool clipSet = false;
 | 
						|
 | 
						|
            PaintBackground(p);
 | 
						|
 | 
						|
            Rectangle clip = GetClipRectangle();
 | 
						|
            oldClip = g.Clip;
 | 
						|
            g.SetClip(clip, CombineMode.Intersect);
 | 
						|
            clipSet = true;
 | 
						|
 | 
						|
            ItemDisplay display = GetItemDisplay();
 | 
						|
            display.Paint(this, p);
 | 
						|
 | 
						|
            if (clipSet)
 | 
						|
            {
 | 
						|
                if (oldClip != null)
 | 
						|
                    g.Clip = oldClip;
 | 
						|
                else
 | 
						|
                    g.ResetClip();
 | 
						|
            }
 | 
						|
 | 
						|
            if (this.DesignMode && !this.SystemContainer && p.DesignerSelection)
 | 
						|
            {
 | 
						|
                Rectangle r = this.DisplayRectangle;
 | 
						|
 | 
						|
                Pen pen = null;
 | 
						|
                if (this.Focused)
 | 
						|
                    pen = new Pen(Color.FromArgb(190, Color.Navy), 1);
 | 
						|
                else
 | 
						|
                    pen = new Pen(Color.FromArgb(80, Color.Black), 1);
 | 
						|
 | 
						|
                pen.DashStyle = DashStyle.Dot;
 | 
						|
                DisplayHelp.DrawRoundedRectangle(g, pen, r, 3);
 | 
						|
                pen.Dispose();
 | 
						|
                pen = null;
 | 
						|
 | 
						|
                Image image = BarFunctions.LoadBitmap("SystemImages.AddMoreItemsContainer.png");
 | 
						|
 | 
						|
                if (this.Parent is ItemContainer && !((ItemContainer)this.Parent).SystemContainer)
 | 
						|
                {
 | 
						|
                    ItemContainer pc = this.Parent as ItemContainer;
 | 
						|
                    while (pc != null && !pc.SystemContainer)
 | 
						|
                    {
 | 
						|
                        if (new Rectangle(pc.DisplayRectangle.Location, image.Size).Contains(this.DisplayRectangle.Location))
 | 
						|
                        {
 | 
						|
                            if (r.X + image.Width + 1 > this.DisplayRectangle.Right)
 | 
						|
                            {
 | 
						|
                                r.X = this.DisplayRectangle.X;
 | 
						|
                                if (r.Y + image.Height < this.DisplayRectangle.Bottom)
 | 
						|
                                    r.Y += image.Height + 1;
 | 
						|
                                else
 | 
						|
                                    break;
 | 
						|
                            }
 | 
						|
                            r.X += (image.Width + 1);
 | 
						|
                        }
 | 
						|
                        pc = pc.Parent as ItemContainer;
 | 
						|
                    }
 | 
						|
                }
 | 
						|
 | 
						|
                _DesignerSelectionRectangle = new Rectangle(r.X + 1, r.Y + 1, image.Width, image.Height);
 | 
						|
                g.DrawImageUnscaled(image, _DesignerSelectionRectangle.Location);
 | 
						|
            }
 | 
						|
 | 
						|
            this.DrawInsertMarker(p.Graphics);
 | 
						|
        }
 | 
						|
        private ItemDisplay _ItemDisplay = null;
 | 
						|
        internal ItemDisplay GetItemDisplay()
 | 
						|
        {
 | 
						|
            if (_ItemDisplay == null)
 | 
						|
                _ItemDisplay = new ItemDisplay();
 | 
						|
            return _ItemDisplay;
 | 
						|
        }
 | 
						|
        protected virtual void PaintBackground(ItemPaintArgs p)
 | 
						|
        {
 | 
						|
            _BackgroundStyle.SetColorScheme(p.Colors);
 | 
						|
            Graphics g = p.Graphics;
 | 
						|
            ElementStyleDisplay.Paint(new ElementStyleDisplayInfo(_BackgroundStyle, g, this.DisplayRectangle));
 | 
						|
        }
 | 
						|
 | 
						|
        private void BackgroundStyleChanged(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            this.OnAppearanceChanged();
 | 
						|
        }
 | 
						|
 | 
						|
        protected virtual Rectangle GetClipRectangle()
 | 
						|
        {
 | 
						|
            Rectangle clip = this.DisplayRectangle;
 | 
						|
            bool disposeStyle = false;
 | 
						|
            ElementStyle style = ElementStyleDisplay.GetElementStyle(_BackgroundStyle, out disposeStyle);
 | 
						|
            clip.X += ElementStyleLayout.LeftWhiteSpace(style);
 | 
						|
            clip.Width -= ElementStyleLayout.HorizontalStyleWhiteSpace(style);
 | 
						|
            clip.Y += ElementStyleLayout.TopWhiteSpace(style);
 | 
						|
            clip.Height -= ElementStyleLayout.VerticalStyleWhiteSpace(style);
 | 
						|
            if (disposeStyle)
 | 
						|
                style.Dispose();
 | 
						|
            return clip;
 | 
						|
        }
 | 
						|
 | 
						|
        private Dictionary<BaseItem, eItemDock> _ItemDock = new Dictionary<BaseItem, eItemDock>();
 | 
						|
        /// <summary>
 | 
						|
        /// Retrieves the docking for specified item.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(eItemDock.Left)]
 | 
						|
        public eItemDock GetDock(BaseItem item)
 | 
						|
        {
 | 
						|
            if (item == null) throw new ArgumentNullException("item cannot be null");
 | 
						|
            eItemDock dock = eItemDock.Left;
 | 
						|
            if (_ItemDock.TryGetValue(item, out dock))
 | 
						|
                return dock;
 | 
						|
            return eItemDock.Left;
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Sets the docking within container for specified item.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="item">Item to set docking for.</param>
 | 
						|
        /// <param name="dock">Docking value.</param>
 | 
						|
        [Localizable(true)]
 | 
						|
        public void SetDock(BaseItem item, eItemDock dock)
 | 
						|
        {
 | 
						|
            if (item == null) throw new ArgumentNullException("item cannot be null");
 | 
						|
            if (dock == eItemDock.Left)
 | 
						|
            {
 | 
						|
                if (_ItemDock.ContainsKey(item))
 | 
						|
                    _ItemDock.Remove(item);
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                if (_ItemDock.ContainsKey(item))
 | 
						|
                    _ItemDock[item] = dock;
 | 
						|
                else
 | 
						|
                    _ItemDock.Add(item, dock);
 | 
						|
            }
 | 
						|
            if (this.DesignMode)
 | 
						|
            {
 | 
						|
                this.NeedRecalcSize = true;
 | 
						|
                this.Refresh();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Returns empty container default design-time size.
 | 
						|
        /// </summary>
 | 
						|
        /// <returns>Size of an empty container.</returns>
 | 
						|
        protected virtual Size GetEmptyDesignTimeSize()
 | 
						|
        {
 | 
						|
            Size s = _EmptyDesignTimeSize;
 | 
						|
            return s;
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
        private bool _LastChildFill = true;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets a value that indicates whether the last child element within a ItemDockContainer stretches to fill the remaining available space.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(true), Category("Appearance"), Description("Indicates whether the last child element within a ItemDockContainer stretches to fill the remaining available space.")]
 | 
						|
        public bool LastChildFill
 | 
						|
        {
 | 
						|
            get { return _LastChildFill; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                _LastChildFill = value;
 | 
						|
                NeedRecalcSize = true;
 | 
						|
                OnAppearanceChanged();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private bool _SystemContainer = false;
 | 
						|
        [Browsable(false)]
 | 
						|
        public bool SystemContainer
 | 
						|
        {
 | 
						|
            get { return _SystemContainer; }
 | 
						|
            internal set
 | 
						|
            {
 | 
						|
                _SystemContainer = value;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// IBlock member implementation
 | 
						|
        /// </summary>
 | 
						|
        [Browsable(false), DevCoBrowsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), EditorBrowsable(EditorBrowsableState.Never)]
 | 
						|
        public override System.Drawing.Rectangle Bounds
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                return base.Bounds;
 | 
						|
            }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                Point offset = new Point(value.X - m_Rect.X, value.Y - m_Rect.Y);
 | 
						|
                base.Bounds = value;
 | 
						|
 | 
						|
                if (!offset.IsEmpty)
 | 
						|
                {
 | 
						|
                    OffsetSubItems(offset);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Occurs when the mouse pointer is over the item and a mouse button is pressed. This is used by internal implementation only.
 | 
						|
        /// </summary>
 | 
						|
        [System.ComponentModel.Browsable(false), System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
 | 
						|
        public override void InternalMouseDown(System.Windows.Forms.MouseEventArgs objArg)
 | 
						|
        {
 | 
						|
            if (this.DesignMode && !this.SystemContainer)
 | 
						|
            {
 | 
						|
                BaseItem item = ItemAtLocation(objArg.X, objArg.Y);
 | 
						|
                if (item == this && !(item.DesignMode && !item.DesignTimeVisible))
 | 
						|
                {
 | 
						|
                    IOwner owner = this.GetOwner() as IOwner;
 | 
						|
                    if (owner != null)
 | 
						|
                    {
 | 
						|
                        owner.SetFocusItem(this);
 | 
						|
                        return;
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
            else if (!this.DisplayRectangle.Contains(objArg.X, objArg.Y))
 | 
						|
            {
 | 
						|
                if (this.DesignMode)
 | 
						|
                {
 | 
						|
                    IOwner owner = this.GetOwner() as IOwner;
 | 
						|
                    if (owner != null)
 | 
						|
                        owner.SetFocusItem(null);
 | 
						|
                    LeaveHotSubItem(null);
 | 
						|
                }
 | 
						|
                return;
 | 
						|
            }
 | 
						|
            base.InternalMouseDown(objArg);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Return Sub Item at specified location
 | 
						|
        /// </summary>
 | 
						|
        public override BaseItem ItemAtLocation(int x, int y)
 | 
						|
        {
 | 
						|
            if (this.DesignMode && !this.SystemContainer && !_DesignerSelectionRectangle.IsEmpty)
 | 
						|
            {
 | 
						|
                if (_DesignerSelectionRectangle.Contains(x, y))
 | 
						|
                    return this;
 | 
						|
            }
 | 
						|
 | 
						|
            if (!this.Visible || !this.DisplayRectangle.Contains(x, y))
 | 
						|
                return null;
 | 
						|
 | 
						|
            if (m_SubItems != null)
 | 
						|
            {
 | 
						|
                foreach (BaseItem objSub in m_SubItems)
 | 
						|
                {
 | 
						|
                    if (objSub.IsContainer)
 | 
						|
                    {
 | 
						|
                        BaseItem item = objSub.ItemAtLocation(x, y);
 | 
						|
                        if (item != null)
 | 
						|
                            return item;
 | 
						|
                    }
 | 
						|
                    else
 | 
						|
                    {
 | 
						|
                        if ((objSub.Visible || this.IsOnCustomizeMenu) && objSub.Displayed && objSub.DisplayRectangle.Contains(x, y))
 | 
						|
                        {
 | 
						|
                            if (this.DesignMode && !this.DisplayRectangle.IntersectsWith(objSub.DisplayRectangle))
 | 
						|
                                continue;
 | 
						|
                            return objSub;
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            if (this.DisplayRectangle.Contains(x, y) && /*this.DesignMode &&*/ !this.SystemContainer)
 | 
						|
                return this;
 | 
						|
            return null;
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region IExtenderProvider Members
 | 
						|
 | 
						|
        bool IExtenderProvider.CanExtend(object extendee)
 | 
						|
        {
 | 
						|
            BaseItem item = extendee as BaseItem;
 | 
						|
            if(item!=null && this.SubItems.Contains(item))
 | 
						|
                return true;
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region IDesignTimeProvider Implementation
 | 
						|
        protected virtual InsertPosition GetContainerInsertPosition(Point pScreen, BaseItem dragItem)
 | 
						|
        {
 | 
						|
            return DesignTimeProviderContainer.GetInsertPosition(this, pScreen, dragItem);
 | 
						|
        }
 | 
						|
        InsertPosition IDesignTimeProvider.GetInsertPosition(Point pScreen, BaseItem dragItem)
 | 
						|
        {
 | 
						|
            return GetContainerInsertPosition(pScreen, dragItem);
 | 
						|
        }
 | 
						|
        void IDesignTimeProvider.DrawReversibleMarker(int iPos, bool Before)
 | 
						|
        {
 | 
						|
            DesignTimeProviderContainer.DrawReversibleMarker(this, iPos, Before);
 | 
						|
        }
 | 
						|
        void IDesignTimeProvider.InsertItemAt(BaseItem objItem, int iPos, bool Before)
 | 
						|
        {
 | 
						|
            DesignTimeProviderContainer.InsertItemAt(this, objItem, iPos, Before);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
    }
 | 
						|
 | 
						|
    public enum eItemDock
 | 
						|
    {
 | 
						|
        Left,
 | 
						|
        Right,
 | 
						|
        Top,
 | 
						|
        Bottom
 | 
						|
    }
 | 
						|
}
 |