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