256 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			256 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.Text;
 | 
						|
using System.Drawing;
 | 
						|
 | 
						|
namespace DevComponents.DotNetBar
 | 
						|
{
 | 
						|
    /// <summary>
 | 
						|
    /// Represents internal CrumbBar view container.
 | 
						|
    /// </summary>
 | 
						|
    internal class CrumbBarViewContainer : ImageItem
 | 
						|
    {
 | 
						|
        #region Internal Implementation
 | 
						|
        /// <summary>
 | 
						|
        /// Initializes a new instance of the CrumbBarViewContainer class.
 | 
						|
        /// </summary>
 | 
						|
        public CrumbBarViewContainer()
 | 
						|
            : base()
 | 
						|
        {
 | 
						|
            LabelItem imageLabel = new LabelItem("sys_crumbbarimagelabel");
 | 
						|
            this.SubItems.Add(imageLabel);
 | 
						|
 | 
						|
            CrumbBarOverflowButton overflowButton = new CrumbBarOverflowButton("sys_crumbbaroverflowbutton");
 | 
						|
            this.SubItems.Add(overflowButton);
 | 
						|
            m_IsContainer = true;
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Recalculates the size of the item
 | 
						|
        /// </summary>
 | 
						|
        public override void RecalcSize()
 | 
						|
        {
 | 
						|
            if (_InternalRemove) return;
 | 
						|
 | 
						|
            Point pos = m_Rect.Location;
 | 
						|
            Size containerSize = m_Rect.Size;
 | 
						|
            _CalculatedHeight = 0;
 | 
						|
 | 
						|
            if (m_SubItems == null)
 | 
						|
                return;
 | 
						|
 | 
						|
            RestoreOverflowItems();
 | 
						|
            ButtonItem overflowButton = this.OverflowButton;
 | 
						|
            LabelItem imageLabel = this.ImageLabel;
 | 
						|
 | 
						|
            // Overflow button is hidden by default
 | 
						|
            overflowButton.Visible = false;
 | 
						|
 | 
						|
            Rectangle itemsRect = m_Rect;
 | 
						|
 | 
						|
            // Label may be hidden if there is no image assigned to current item
 | 
						|
            if (imageLabel.Visible)
 | 
						|
            {
 | 
						|
                imageLabel.RecalcSize();
 | 
						|
                if (imageLabel.HeightInternal > _CalculatedHeight) _CalculatedHeight = imageLabel.HeightInternal;
 | 
						|
                imageLabel.HeightInternal = containerSize.Height;
 | 
						|
                itemsRect.X += imageLabel.WidthInternal;
 | 
						|
                itemsRect.Width -= imageLabel.WidthInternal;
 | 
						|
                imageLabel.Displayed = true;
 | 
						|
            }
 | 
						|
            Point itemsPos = itemsRect.Location;
 | 
						|
 | 
						|
            bool overflowState = false;
 | 
						|
            BaseItem[] items = new BaseItem[m_SubItems.Count - 2];
 | 
						|
            if(m_SubItems.Count>2)
 | 
						|
                m_SubItems.CopyToFromIndex(items, 2);
 | 
						|
 | 
						|
            for (int i = items.Length - 1; i >= 0; i--)
 | 
						|
            {
 | 
						|
                BaseItem item = items[i];
 | 
						|
                if (!item.Visible)
 | 
						|
                {
 | 
						|
                    item.Displayed = false;
 | 
						|
                    continue;
 | 
						|
                }
 | 
						|
 | 
						|
                if (!overflowState)
 | 
						|
                {
 | 
						|
                    item.LeftInternal = itemsPos.X;
 | 
						|
                    item.TopInternal = itemsPos.Y;
 | 
						|
                    item.HeightInternal = itemsRect.Height;
 | 
						|
                    item.RecalcSize();
 | 
						|
                    if (item.HeightInternal > _CalculatedHeight) _CalculatedHeight = item.HeightInternal;
 | 
						|
                    item.HeightInternal = itemsRect.Height;
 | 
						|
                    if (itemsPos.X + item.WidthInternal > itemsRect.Right || itemsPos.X + item.WidthInternal + 16 > itemsRect.Right && i > 0)
 | 
						|
                    {
 | 
						|
                        // Overflow mode
 | 
						|
                        overflowState = true;
 | 
						|
                    }
 | 
						|
                    else
 | 
						|
                    {
 | 
						|
                        itemsPos.X += item.WidthInternal;
 | 
						|
                        item.Displayed = true;
 | 
						|
                    }
 | 
						|
                }
 | 
						|
 | 
						|
                if (overflowState)
 | 
						|
                {
 | 
						|
                    _InternalRemove = true;
 | 
						|
                    m_SubItems.Remove(item);
 | 
						|
                    overflowButton.SubItems.Insert(0, item);
 | 
						|
                    _InternalRemove = false;
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            // Now position the items left inside
 | 
						|
            if (overflowState)
 | 
						|
            {
 | 
						|
                overflowButton.Visible = true;
 | 
						|
                overflowButton.Displayed = true;
 | 
						|
                overflowButton.HeightInternal = itemsRect.Height;
 | 
						|
                overflowButton.RecalcSize();
 | 
						|
                overflowButton.LeftInternal = itemsRect.X;
 | 
						|
                overflowButton.TopInternal = itemsRect.Y;
 | 
						|
                overflowButton.HeightInternal = itemsRect.Height;
 | 
						|
                itemsRect.X += overflowButton.WidthInternal;
 | 
						|
                itemsRect.Width -= overflowButton.WidthInternal;
 | 
						|
            }
 | 
						|
 | 
						|
            itemsPos = itemsRect.Location;
 | 
						|
            for (int i = 2; i < m_SubItems.Count; i++)
 | 
						|
            {
 | 
						|
                BaseItem item = m_SubItems[i];
 | 
						|
                if (!item.Visible)
 | 
						|
                    continue;
 | 
						|
                if (item.WidthInternal + itemsPos.X > itemsRect.Right)
 | 
						|
                {
 | 
						|
                    item.Displayed = false;
 | 
						|
                    itemsPos.X = itemsRect.Right;
 | 
						|
                    continue;
 | 
						|
                }
 | 
						|
 | 
						|
                item.LeftInternal = itemsPos.X;
 | 
						|
                itemsPos.X += item.WidthInternal;
 | 
						|
            }
 | 
						|
 | 
						|
            base.RecalcSize();
 | 
						|
        }
 | 
						|
 | 
						|
        private int _CalculatedHeight = 0;
 | 
						|
        internal int CalculatedHeight
 | 
						|
        {
 | 
						|
            get { return _CalculatedHeight; }
 | 
						|
        }
 | 
						|
 | 
						|
        internal void RestoreOverflowItems()
 | 
						|
        {
 | 
						|
            ButtonItem overflowButton = this.OverflowButton;
 | 
						|
            if (overflowButton.SubItems.Count == 0) return;
 | 
						|
 | 
						|
            BaseItem[] overflowItems = new BaseItem[overflowButton.SubItems.Count];
 | 
						|
            overflowButton.SubItems.CopyTo(overflowItems, 0);
 | 
						|
            overflowButton.SubItems.Clear();
 | 
						|
 | 
						|
            for (int i = 0; i < overflowItems.Length; i++)
 | 
						|
            {
 | 
						|
                m_SubItems.Insert(i + 2, overflowItems[i]);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        internal LabelItem ImageLabel
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                return m_SubItems[0] as LabelItem;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        internal CrumbBarOverflowButton OverflowButton
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                return (CrumbBarOverflowButton)m_SubItems[1];
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private bool _InternalRemove = false;
 | 
						|
        internal void ClearViewItems()
 | 
						|
        {
 | 
						|
            _InternalRemove = true;
 | 
						|
            while (m_SubItems.Count > 2)
 | 
						|
                m_SubItems.RemoveAt(m_SubItems.Count - 1);
 | 
						|
            _InternalRemove = false;
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Paints this base container
 | 
						|
        /// </summary>
 | 
						|
        public override void Paint(ItemPaintArgs pa)
 | 
						|
        {
 | 
						|
            if (this.SuspendLayout)
 | 
						|
                return;
 | 
						|
            System.Drawing.Graphics g = pa.Graphics;
 | 
						|
            if (m_NeedRecalcSize)
 | 
						|
                RecalcSize();
 | 
						|
 | 
						|
            if (m_SubItems == null)
 | 
						|
                return;
 | 
						|
 | 
						|
            foreach (BaseItem item in m_SubItems)
 | 
						|
            {
 | 
						|
                if (item.Visible && item.Displayed)
 | 
						|
                {
 | 
						|
                    item.Paint(pa);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Returns copy of ExplorerBarContainerItem item
 | 
						|
        /// </summary>
 | 
						|
        public override BaseItem Copy()
 | 
						|
        {
 | 
						|
            CrumbBarViewContainer objCopy = new CrumbBarViewContainer();
 | 
						|
            this.CopyToItem(objCopy);
 | 
						|
            return objCopy;
 | 
						|
        }
 | 
						|
        protected override void CopyToItem(BaseItem copy)
 | 
						|
        {
 | 
						|
            CrumbBarViewContainer objCopy = copy as CrumbBarViewContainer;
 | 
						|
            base.CopyToItem(objCopy);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets a value indicating whether the item is expanded or not. For Popup items this would indicate whether the item is popped up or not.
 | 
						|
        /// </summary>
 | 
						|
        [System.ComponentModel.Browsable(false), System.ComponentModel.DefaultValue(false), System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)]
 | 
						|
        public override bool Expanded
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                return m_Expanded;
 | 
						|
            }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                base.Expanded = value;
 | 
						|
                if (!value)
 | 
						|
                    BaseItem.CollapseSubItems(this);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Occurs when sub item expanded state has changed.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="item">Sub item affected.</param>
 | 
						|
        protected internal override void OnSubItemExpandChange(BaseItem item)
 | 
						|
        {
 | 
						|
            base.OnSubItemExpandChange(item);
 | 
						|
            if (item.Expanded)
 | 
						|
                this.Expanded = true;
 | 
						|
            else
 | 
						|
                base.Expanded = false;
 | 
						|
        }
 | 
						|
        #endregion
 | 
						|
    }
 | 
						|
}
 |