222 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			222 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.Collections.Generic;
 | 
						|
using System.Text;
 | 
						|
using System.ComponentModel;
 | 
						|
using System.Drawing;
 | 
						|
 | 
						|
namespace DevComponents.DotNetBar
 | 
						|
{
 | 
						|
    /// <summary>
 | 
						|
    /// Container for the StepItem objects.
 | 
						|
    /// </summary>
 | 
						|
    public class StepItemContainer : ImageItem, IDesignTimeProvider
 | 
						|
    {
 | 
						|
        #region Implementation
 | 
						|
        /// <summary>
 | 
						|
        /// Initializes a new instance of the StepContainer class.
 | 
						|
        /// </summary>
 | 
						|
        public StepItemContainer()
 | 
						|
        {
 | 
						|
            m_IsContainer = true;
 | 
						|
            this.AutoCollapseOnClick = true;
 | 
						|
            this.AccessibleRole = System.Windows.Forms.AccessibleRole.Grouping;
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Returns copy of the item.
 | 
						|
        /// </summary>
 | 
						|
        public override BaseItem Copy()
 | 
						|
        {
 | 
						|
            StepItemContainer objCopy = new StepItemContainer();
 | 
						|
            objCopy.Name = this.Name;
 | 
						|
            this.CopyToItem(objCopy);
 | 
						|
            return objCopy;
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Copies the StepContainer specific properties to new instance of the item.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="copy">New StepContainer instance.</param>
 | 
						|
        internal void InternalCopyToItem(StepItemContainer copy)
 | 
						|
        {
 | 
						|
            CopyToItem(copy);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Copies the StepContainer specific properties to new instance of the item.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="copy">New StepContainer instance.</param>
 | 
						|
        protected override void CopyToItem(BaseItem copy)
 | 
						|
        {
 | 
						|
            StepItemContainer c = copy as StepItemContainer;
 | 
						|
            base.CopyToItem(c);
 | 
						|
 | 
						|
 | 
						|
        }
 | 
						|
 | 
						|
        protected override void Dispose(bool disposing)
 | 
						|
        {
 | 
						|
            base.Dispose(disposing);
 | 
						|
        }
 | 
						|
 | 
						|
        public override void RecalcSize()
 | 
						|
        {
 | 
						|
            bool first = true;
 | 
						|
            Point loc = this.Bounds.Location;
 | 
						|
            Size totalSize = Size.Empty;
 | 
						|
            bool uniformHeight = true;
 | 
						|
            SubItemsCollection subItems = this.SubItems;
 | 
						|
            bool last = true;
 | 
						|
            int startIndex = subItems.Count - 1;
 | 
						|
            for (int i = startIndex; i >= 0; i--)
 | 
						|
            {
 | 
						|
                StepItem item = subItems[i] as StepItem;
 | 
						|
                if (item != null && item.Visible)
 | 
						|
                {
 | 
						|
                    item.IsLast = last;
 | 
						|
                    last = false;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            foreach (BaseItem item in subItems)
 | 
						|
            {
 | 
						|
                item.DesignMarkerOrientation = eDesignMarkerOrientation.Horizontal;
 | 
						|
                StepItem si = item as StepItem;
 | 
						|
                if (!item.Visible)
 | 
						|
                {
 | 
						|
                    item.Displayed = false;
 | 
						|
                    if (si != null)
 | 
						|
                    {
 | 
						|
                        si.IsLast = false;
 | 
						|
                    }
 | 
						|
                    continue;
 | 
						|
                }
 | 
						|
                item.Displayed = true;
 | 
						|
                if (si != null)
 | 
						|
                {
 | 
						|
                    si.IsFirst = first;
 | 
						|
                    first = false;
 | 
						|
                    si.RecalcSize();
 | 
						|
                    si.SetDisplayRectangle(new Rectangle(loc, si.Size));
 | 
						|
                    int stepWidth = (si.Size.Width - _PointerSize - 1); // 1 is so right hand line overlaps
 | 
						|
                    loc.X += stepWidth;
 | 
						|
                    totalSize.Width += stepWidth;
 | 
						|
                }
 | 
						|
                else
 | 
						|
                {
 | 
						|
                    first = true;
 | 
						|
                    item.RecalcSize();
 | 
						|
                    item.SetDisplayRectangle(new Rectangle(loc, item.Size));
 | 
						|
                    loc.X += item.WidthInternal;
 | 
						|
                    totalSize.Width += item.WidthInternal;
 | 
						|
                }
 | 
						|
                if (uniformHeight && totalSize.Height > 0 && totalSize.Height != item.HeightInternal)
 | 
						|
                    uniformHeight = false;
 | 
						|
                totalSize.Height = Math.Max(totalSize.Height, item.HeightInternal);
 | 
						|
            }
 | 
						|
            totalSize.Width += _PointerSize;
 | 
						|
 | 
						|
            // Vertically center items if they are all not of same height
 | 
						|
            if (!uniformHeight)
 | 
						|
            {
 | 
						|
                foreach (BaseItem item in subItems)
 | 
						|
                {
 | 
						|
                    if (!item.Visible)
 | 
						|
                        continue;
 | 
						|
                    if (item.HeightInternal < totalSize.Height)
 | 
						|
                        item.TopInternal = (totalSize.Height - item.HeightInternal) / 2;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            m_Rect.Size = totalSize;
 | 
						|
            _CalculatedHeight = totalSize.Height;
 | 
						|
            _CalculatedWidth = totalSize.Width;
 | 
						|
            base.RecalcSize();
 | 
						|
        }
 | 
						|
 | 
						|
        public override void Paint(ItemPaintArgs p)
 | 
						|
        {
 | 
						|
            ItemDisplay display = GetItemDisplay();
 | 
						|
            display.Paint(this, p);
 | 
						|
        }
 | 
						|
 | 
						|
        private ItemDisplay m_ItemDisplay = null;
 | 
						|
        internal ItemDisplay GetItemDisplay()
 | 
						|
        {
 | 
						|
            if (m_ItemDisplay == null)
 | 
						|
            {
 | 
						|
                m_ItemDisplay = new ItemDisplay();
 | 
						|
            }
 | 
						|
            return m_ItemDisplay;
 | 
						|
        }
 | 
						|
 | 
						|
        private int _PointerSize = 10;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the arrow pointer width for the StepItem objects hosted within this container.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(10), Category("Appearance"), Description("Gets or sets the arrow pointer width for the StepItem objects hosted within this container.")]
 | 
						|
        public int PointerSize
 | 
						|
        {
 | 
						|
            get { return _PointerSize; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (value != _PointerSize)
 | 
						|
                {
 | 
						|
                    int oldValue = _PointerSize;
 | 
						|
                    _PointerSize = value;
 | 
						|
                    OnPointerSizeChanged(oldValue, value);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Called when PointerSize property has changed.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="oldValue">Old property value</param>
 | 
						|
        /// <param name="newValue">New property value</param>
 | 
						|
        protected virtual void OnPointerSizeChanged(int oldValue, int newValue)
 | 
						|
        {
 | 
						|
            //OnPropertyChanged(new PropertyChangedEventArgs("PointerSize"));
 | 
						|
 | 
						|
        }
 | 
						|
 | 
						|
        private int _CalculatedWidth;
 | 
						|
        internal int CalculatedWidth
 | 
						|
        {
 | 
						|
            get { return _CalculatedWidth; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                _CalculatedWidth = value;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private int _CalculatedHeight;
 | 
						|
        internal int CalculatedHeight
 | 
						|
        {
 | 
						|
            get { return _CalculatedHeight; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                _CalculatedHeight = value;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #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
 | 
						|
    }
 | 
						|
}
 |