236 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			236 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Text;
 | |
| using System.Windows.Forms;
 | |
| using System.Drawing;
 | |
| 
 | |
| namespace DevComponents.DotNetBar
 | |
| {
 | |
|     /// <summary>
 | |
|     /// Represents a view of CrumbBarItem displayed inside of CrumbBar control.
 | |
|     /// </summary>
 | |
|     public class CrumbBarItemView : ButtonItem
 | |
|     {
 | |
|         #region Internal Implementation
 | |
|         /// <summary>
 | |
|         /// Initializes a new instance of the CrumbBarItemView class.
 | |
|         /// </summary>
 | |
|         public CrumbBarItemView():base()
 | |
|         {
 | |
|             this.SubItemsExpandWidth = 15;
 | |
|             this.HorizontalPadding = 2;
 | |
|         }
 | |
| 
 | |
|         private CrumbBarItem _AttachedItem;
 | |
|         /// <summary>
 | |
|         /// Gets the item attached to the view.
 | |
|         /// </summary>
 | |
|         public CrumbBarItem AttachedItem
 | |
|         {
 | |
|             get { return _AttachedItem; }
 | |
|             internal set
 | |
|             {
 | |
|                 if (_AttachedItem != null)
 | |
|                 {
 | |
|                     _AttachedItem.TextChanged -= new EventHandler(AttachedItemTextChanged);
 | |
|                     _AttachedItem.SubItemsChanged -= new System.ComponentModel.CollectionChangeEventHandler(AttachedItemSubItemsChanged);
 | |
|                     _AttachedItem.PopupClose -= new EventHandler(AttachedItemPopupClose);
 | |
|                 }
 | |
|                 _AttachedItem = value;
 | |
| 
 | |
|                 if (_AttachedItem != null)
 | |
|                 {
 | |
|                     this.Text = _AttachedItem.Text;
 | |
|                     this.Cursor = _AttachedItem.Cursor;
 | |
|                     this.ForeColor = _AttachedItem.ForeColor;
 | |
|                     this.HotForeColor = _AttachedItem.HotForeColor;
 | |
|                     this.Tooltip = _AttachedItem.Tooltip;
 | |
| 
 | |
|                     _AttachedItem.TextChanged += new EventHandler(AttachedItemTextChanged);
 | |
|                     _AttachedItem.SubItemsChanged += new System.ComponentModel.CollectionChangeEventHandler(AttachedItemSubItemsChanged);
 | |
|                     _AttachedItem.PopupClose += new EventHandler(AttachedItemPopupClose);
 | |
|                     if (AnyVisibleItems)
 | |
|                         this.PopupType = ePopupType.Container;
 | |
|                     else
 | |
|                         this.PopupType = ePopupType.Menu;
 | |
|                 }
 | |
|                 else
 | |
|                     this.PopupType = ePopupType.Menu;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private DateTime _PopupCloseTime = DateTime.MinValue;
 | |
|         private void AttachedItemPopupClose(object sender, EventArgs e)
 | |
|         {
 | |
|             _Expanded = false;
 | |
|             CrumbBarViewContainer c = this.Parent as CrumbBarViewContainer;
 | |
|             if (c != null)
 | |
|                 c.OnSubItemExpandChange(this);
 | |
| 
 | |
|             _PopupCloseTime = DateTime.Now;
 | |
|             this.Refresh();
 | |
|         }
 | |
| 
 | |
|         public override void InternalMouseDown(MouseEventArgs objArg)
 | |
|         {
 | |
|             if (_PopupCloseTime != DateTime.MinValue && DateTime.Now.Subtract(_PopupCloseTime).TotalMilliseconds < 200)
 | |
|             {
 | |
|                 _PopupCloseTime = DateTime.MinValue;
 | |
|                 return;
 | |
|             }
 | |
|             base.InternalMouseDown(objArg);
 | |
|         }
 | |
| 
 | |
|         public override void InternalMouseEnter()
 | |
|         {
 | |
|             CrumbBarViewContainer parent = this.Parent as CrumbBarViewContainer;
 | |
|             if (parent != null && parent.Expanded && AnyVisibleItems)
 | |
|             {
 | |
|                 parent.Expanded = false;
 | |
|                 this.Expanded = true;
 | |
|             }
 | |
|             base.InternalMouseEnter();
 | |
|         }
 | |
| 
 | |
|         private bool AnyVisibleItems
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 if (_AttachedItem != null)
 | |
|                 {
 | |
|                     foreach (BaseItem item in _AttachedItem.SubItems)
 | |
|                     {
 | |
|                         if (item.Visible) return true;
 | |
|                     }
 | |
|                 }
 | |
|                 return false;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private void AttachedItemSubItemsChanged(object sender, System.ComponentModel.CollectionChangeEventArgs e)
 | |
|         {
 | |
|             UpdatePopupType();
 | |
|         }
 | |
| 
 | |
|         private void UpdatePopupType()
 | |
|         {
 | |
|             if (AnyVisibleItems && !(this.Parent is CrumbBarOverflowButton))
 | |
|                 this.PopupType = ePopupType.Container;
 | |
|             else
 | |
|                 this.PopupType = ePopupType.Menu;
 | |
|         }
 | |
| 
 | |
|         protected override void OnParentChanged()
 | |
|         {
 | |
|             UpdatePopupType();
 | |
|             base.OnParentChanged();
 | |
|         }
 | |
| 
 | |
|         void AttachedItemTextChanged(object sender, EventArgs e)
 | |
|         {
 | |
|             this.Text = _AttachedItem.Text;
 | |
|         }
 | |
| 
 | |
|         protected override void Dispose(bool disposing)
 | |
|         {
 | |
|             this.AttachedItem = null;
 | |
|             base.Dispose(disposing);
 | |
|         }
 | |
| 
 | |
|         internal static object CreateViewForItem(CrumbBarItem item)
 | |
|         {
 | |
|             CrumbBarItemView view = new CrumbBarItemView();
 | |
|             view.AttachedItem = item;
 | |
|             return view;
 | |
|         }
 | |
| 
 | |
|         private bool _Expanded = false;
 | |
|         /// <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 _Expanded;
 | |
|             }
 | |
|             set
 | |
|             {
 | |
|                 if (_Expanded != value)
 | |
|                 {
 | |
|                     _Expanded = value;
 | |
|                     InternalExpandedChanged();
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private void InternalExpandedChanged()
 | |
|         {
 | |
|             if (!_Expanded)
 | |
|             {
 | |
|                 _AttachedItem.Expanded = false;
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 Control parent=this.ContainerControl as Control;
 | |
|                 if(parent==null) return;
 | |
|                 Point p = new Point(this.SubItemsRect.X - 10, this.SubItemsRect.Bottom - 1);
 | |
|                 p.Offset(this.DisplayRectangle.Location.X, this.DisplayRectangle.Location.Y);
 | |
|                 p = parent.PointToScreen(p);
 | |
|                 _AttachedItem.PopupMenu(p);
 | |
|             }
 | |
| 
 | |
|             CrumbBarViewContainer c = this.Parent as CrumbBarViewContainer;
 | |
|             if (c != null)
 | |
|                 c.OnSubItemExpandChange(this);
 | |
|         }
 | |
| 
 | |
|         protected override void OnClick()
 | |
|         {
 | |
|             CrumbBar bar = this.ContainerControl as CrumbBar;
 | |
|             if (bar == null) bar = this.GetOwner() as CrumbBar;
 | |
| 
 | |
|             base.OnClick();
 | |
| 
 | |
|             if (bar != null)
 | |
|             {
 | |
|                 bar.SelectedItem = _AttachedItem;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         protected override void RenderButton(ItemPaintArgs p)
 | |
|         {
 | |
|             if (!p.IsOnMenu)
 | |
|             {
 | |
|                 Rendering.BaseRenderer renderer = p.Renderer;
 | |
|                 if (renderer != null)
 | |
|                 {
 | |
|                     p.ButtonItemRendererEventArgs.Graphics = p.Graphics;
 | |
|                     p.ButtonItemRendererEventArgs.ButtonItem = this;
 | |
|                     p.ButtonItemRendererEventArgs.ItemPaintArgs = p;
 | |
|                     renderer.DrawCrumbBarItemView(p.ButtonItemRendererEventArgs);
 | |
|                     return;
 | |
|                 }
 | |
|             }
 | |
|             base.RenderButton(p);
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Returns copy of ExplorerBarContainerItem item
 | |
|         /// </summary>
 | |
|         public override BaseItem Copy()
 | |
|         {
 | |
|             CrumbBarItemView objCopy = new CrumbBarItemView();
 | |
|             this.CopyToItem(objCopy);
 | |
|             return objCopy;
 | |
|         }
 | |
|         protected override void CopyToItem(BaseItem copy)
 | |
|         {
 | |
|             CrumbBarItemView objCopy = copy as CrumbBarItemView;
 | |
|             base.CopyToItem(objCopy);
 | |
|         }
 | |
|         #endregion
 | |
| 
 | |
|     }
 | |
| }
 |