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