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
 | |
|     }
 | |
| }
 |