#if FRAMEWORK20
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.ComponentModel;
namespace DevComponents.Editors
{
public class VisualGroup : VisualItem
{
#region Private Variables
private VisualItem _MouseDownItem = null;
private VisualItem _MouseOverItem = null;
#endregion
#region Events
#endregion
#region Constructor
public VisualGroup()
: base()
{
_Items = new VisualItemCollection(this);
}
#endregion
#region Internal Implementation
internal virtual void ProcessItemsCollectionChanged(CollectionChangedInfo collectionChangedInfo)
{
OnItemsCollectionChanged(collectionChangedInfo);
}
protected virtual void OnItemsCollectionChanged(CollectionChangedInfo collectionChangedInfo)
{
if (collectionChangedInfo.ChangeType == eCollectionChangeType.Adding || collectionChangedInfo.ChangeType == eCollectionChangeType.Removing ||
collectionChangedInfo.ChangeType == eCollectionChangeType.Clearing)
{
if (collectionChangedInfo.Removed != null)
{
foreach (VisualItem item in collectionChangedInfo.Removed)
item.Parent = null;
}
if (collectionChangedInfo.ChangeType == eCollectionChangeType.Clearing)
{
foreach (VisualItem item in this.Items)
item.Parent = null;
}
if (collectionChangedInfo.Added != null)
{
foreach (VisualItem item in collectionChangedInfo.Added)
{
if (item.Parent != null && item.Parent != this)
{
item.Parent.Items.Remove(item);
}
item.Parent = this;
}
}
}
this.InvalidateArrange();
}
private VisualItemCollection _Items;
public virtual VisualItemCollection Items
{
get { return _Items; }
}
internal void OnChildItemVisibleChanged(VisualItem visualItem)
{
InvalidateArrange();
}
private VisualItem _FocusedItem;
public VisualItem FocusedItem
{
get { return _FocusedItem; }
internal set
{
if (_FocusedItem == value) return;
if (_FocusedItem != null)
_FocusedItem.ProcessLostFocus();
VisualItem oldFocus = _FocusedItem;
_FocusedItem = value;
if (_FocusedItem != null)
_FocusedItem.ProcessGotFocus();
OnFocusedItemChanged(oldFocus);
this.InvalidateArrange();
}
}
protected virtual void OnFocusedItemChanged(VisualItem previousFocus)
{
}
protected override void OnPaint(PaintInfo p)
{
if (!IsLayoutValid)
PerformLayout(p);
Point renderOffset = p.RenderOffset;
Point pr = p.RenderOffset;
pr.Offset(this.RenderBounds.Location);
p.RenderOffset = pr;
Graphics g = p.Graphics;
Region oldClip = null;
bool clipSet = false;
oldClip = g.Clip;
Rectangle renderBounds = this.RenderBounds;
renderBounds.Offset(renderOffset);
g.SetClip(renderBounds, CombineMode.Intersect);
clipSet = true;
bool parentEnabled = p.ParentEnabled;
p.ParentEnabled = p.ParentEnabled && this.Enabled;
bool renderSystemItemsOnly = p.RenderSystemItemsOnly;
foreach (VisualItem v in _Items)
{
if (renderSystemItemsOnly && v.ItemType != eSystemItemType.SystemButton) continue;
if (_VerticalItemAlignment == eVerticalAlignment.Middle)
{
if(_Orientation == DotNetBar.eOrientation.Horizontal)
v.RenderBounds = new Rectangle(p.RenderOffset.X + v.Location.X, p.RenderOffset.Y + v.Location.Y + (this.Size.Height - v.Size.Height) / 2, v.Size.Width, v.Size.Height);
else
v.RenderBounds = new Rectangle(p.RenderOffset.X + v.Location.X + (this.Size.Width - v.Size.Width) / 2, p.RenderOffset.Y + v.Location.Y, v.Size.Width, v.Size.Height);
}
else if (_VerticalItemAlignment == eVerticalAlignment.Bottom)
{
if(_Orientation == DotNetBar.eOrientation.Horizontal)
v.RenderBounds = new Rectangle(p.RenderOffset.X + v.Location.X, p.RenderOffset.Y + v.Location.Y + (this.Size.Height - v.Size.Height), v.Size.Width, v.Size.Height);
else
v.RenderBounds = new Rectangle(p.RenderOffset.X + v.Location.X + (this.Size.Width - v.Size.Width), p.RenderOffset.Y + v.Location.Y, v.Size.Width, v.Size.Height);
}
else
v.RenderBounds = new Rectangle(p.RenderOffset.X + v.Location.X, p.RenderOffset.Y + v.Location.Y, v.Size.Width, v.Size.Height);
if (v.RenderBounds.IntersectsWith(renderBounds))
{
p.RenderOffset = Point.Empty;
v.ProcessPaint(p);
p.RenderOffset = pr;
}
}
p.ParentEnabled = parentEnabled;
if (clipSet)
{
if (oldClip != null)
g.Clip = oldClip;
else
g.ResetClip();
}
if(oldClip!=null) oldClip.Dispose();
p.RenderOffset = renderOffset;
base.OnPaint(p);
}
protected override void OnIsRightToLeftChanged()
{
foreach (VisualItem vi in _Items)
vi.IsRightToLeft = this.IsRightToLeft;
base.OnIsRightToLeftChanged();
}
public override void PerformLayout(PaintInfo pi)
{
if (_Orientation == DotNetBar.eOrientation.Horizontal)
{
Point p = Point.Empty;
Size size = Size.Empty;
Size availableSize = pi.AvailableSize;
Size containerSize = availableSize;
bool usesFullWidth = false;
Size calcSize = Size.Empty;
foreach (VisualItem v in new VisualCollectionEnumerator(_Items, this.IsRightToLeft))
{
if (v.Visible)
{
v.Location = p;
pi.AvailableSize = new Size(availableSize.Width - p.X, availableSize.Height);
v.PerformLayout(pi);
if (v.Alignment == eItemAlignment.Right)
{
v.Location = new Point(containerSize.Width - v.Size.Width, p.Y);
containerSize.Width -= v.Size.Width + _HorizontalItemSpacing;
calcSize.Width += v.Size.Width + _HorizontalItemSpacing;
usesFullWidth = true;
}
else
{
p.X += v.Size.Width + _HorizontalItemSpacing;
size.Width += v.Size.Width + _HorizontalItemSpacing;
calcSize.Width += v.Size.Width + _HorizontalItemSpacing;
}
if (v.Size.Height > size.Height)
size.Height = v.Size.Height;
}
}
if (size.Width > 0)
size.Width -= +_HorizontalItemSpacing;
if (usesFullWidth && _HorizontalItemAlignment != eHorizontalAlignment.Left)
{
if (_HorizontalItemAlignment == eHorizontalAlignment.Right)
{
if (containerSize.Width < availableSize.Width) containerSize.Width--;
foreach (VisualItem v in new VisualCollectionEnumerator(_Items, !this.IsRightToLeft))
{
if (!v.Visible || v.Alignment == eItemAlignment.Right || v is LockUpdateCheckBox) continue;
v.Location = new Point(containerSize.Width - v.Size.Width, p.Y);
containerSize.Width -= v.Size.Width + _HorizontalItemSpacing;
}
}
else
{
int offset = (containerSize.Width - size.Width) / 2;
foreach (VisualItem v in new VisualCollectionEnumerator(_Items, this.IsRightToLeft))
{
if (!v.Visible || v.Alignment == eItemAlignment.Right || v is LockUpdateCheckBox) continue;
v.Location = new Point(v.Location.X + offset, v.Location.Y);
}
}
}
this.CalculatedSize = calcSize;
if (usesFullWidth)
size.Width = availableSize.Width;
pi.AvailableSize = availableSize;
this.Size = size;
this.RenderBounds = new Rectangle(pi.RenderOffset, size);
}
else
PerformVerticalLayout(pi);
base.PerformLayout(pi);
}
private void PerformVerticalLayout(PaintInfo pi)
{
Point p = Point.Empty;
Size size = Size.Empty;
Size availableSize = pi.AvailableSize;
Size containerSize = availableSize;
bool usesFullWidth = false;
Size calcSize = Size.Empty;
foreach (VisualItem v in new VisualCollectionEnumerator(_Items, this.IsRightToLeft))
{
if (v.Visible)
{
v.Location = p;
pi.AvailableSize = new Size(availableSize.Width, availableSize.Height - p.Y);
v.PerformLayout(pi);
if (v.Alignment == eItemAlignment.Right)
{
v.Location = new Point(p.X, containerSize.Height - v.Size.Height);
containerSize.Height -= v.Size.Height + _HorizontalItemSpacing;
calcSize.Height += v.Size.Height + _HorizontalItemSpacing;
usesFullWidth = true;
}
else
{
p.Y += v.Size.Height + _HorizontalItemSpacing;
size.Height += v.Size.Height + _HorizontalItemSpacing;
calcSize.Height += v.Size.Height + _HorizontalItemSpacing;
}
if (v.Size.Width > size.Width)
size.Width = v.Size.Width;
}
}
if (size.Height > 0)
size.Height -= +_HorizontalItemSpacing;
if (usesFullWidth && _HorizontalItemAlignment != eHorizontalAlignment.Left)
{
if (_HorizontalItemAlignment == eHorizontalAlignment.Right)
{
if (containerSize.Height < availableSize.Height) containerSize.Height--;
foreach (VisualItem v in new VisualCollectionEnumerator(_Items, !this.IsRightToLeft))
{
if (!v.Visible || v.Alignment == eItemAlignment.Right || v is LockUpdateCheckBox) continue;
v.Location = new Point(p.X, containerSize.Height - v.Size.Height);
containerSize.Height -= v.Size.Height + _HorizontalItemSpacing;
}
}
else
{
int offset = (containerSize.Height - size.Height) / 2;
foreach (VisualItem v in new VisualCollectionEnumerator(_Items, this.IsRightToLeft))
{
if (!v.Visible || v.Alignment == eItemAlignment.Right || v is LockUpdateCheckBox) continue;
v.Location = new Point(v.Location.X, v.Location.Y + offset);
}
}
}
this.CalculatedSize = calcSize;
if (usesFullWidth)
size.Height = availableSize.Height;
pi.AvailableSize = availableSize;
this.Size = size;
this.RenderBounds = new Rectangle(pi.RenderOffset, size);
}
private DevComponents.DotNetBar.eOrientation _Orientation=DevComponents.DotNetBar.eOrientation.Horizontal;
internal DevComponents.DotNetBar.eOrientation Orientation
{
get
{
return _Orientation;
}
set
{
_Orientation = value;
this.InvalidateArrange();
this.InvalidateRender();
}
}
protected override void OnMouseDown(System.Windows.Forms.MouseEventArgs e)
{
VisualItem item = GetItemAt(e.X, e.Y);
if (item != null)
{
_MouseDownItem = item;
_MouseOverItem = item;
item.ProcessMouseDown(e);
if (_MouseDownItem == item && CanFocus(item))
this.FocusedItem = item;
}
else if (item == null && this.IsFocused)
{
// Find first available input and focus it instead
foreach (VisualItem visual in _Items)
{
if (visual is VisualInputBase && CanFocus(visual))
{
this.FocusedItem = visual;
break;
}
}
}
base.OnMouseDown(e);
}
protected override void OnMouseWheel(System.Windows.Forms.MouseEventArgs e)
{
if (this.FocusedItem != null)
this.FocusedItem.ProcessMouseWheel(e);
base.OnMouseWheel(e);
}
protected virtual bool CanFocus(VisualItem v)
{
return v != null && v.Visible && (v.Focusable || v is VisualInputGroup) && v.Enabled;
}
protected override void OnClick(EventArgs e)
{
if (_MouseDownItem != null)
{
_MouseDownItem.ProcessClick();
}
base.OnClick(EventArgs.Empty);
}
protected override void OnMouseClick(System.Windows.Forms.MouseEventArgs e)
{
if (_MouseDownItem != null)
{
_MouseDownItem.ProcessMouseClick(e);
}
base.OnMouseClick(e);
}
protected override void OnMouseUp(System.Windows.Forms.MouseEventArgs e)
{
if (_MouseDownItem != null)
{
_MouseDownItem.ProcessMouseUp(e);
_MouseDownItem = null;
}
base.OnMouseUp(e);
}
protected override void OnMouseMove(System.Windows.Forms.MouseEventArgs e)
{
if (_MouseDownItem != null)
_MouseDownItem.ProcessMouseMove(e);
else
{
VisualItem item = GetItemAt(e.X, e.Y);
if (item != _MouseOverItem && _MouseOverItem != null)
{
_MouseOverItem.ProcessMouseLeave();
_MouseOverItem = null;
}
if (item != null && _MouseOverItem == null)
{
_MouseOverItem = item;
_MouseOverItem.ProcessMouseEnter();
}
if (_MouseOverItem != null)
_MouseOverItem.ProcessMouseMove(e);
}
base.OnMouseMove(e);
}
protected override void OnMouseHover(EventArgs e)
{
if (_MouseOverItem != null)
_MouseOverItem.ProcessMouseHover(e);
base.OnMouseHover(e);
}
protected override void OnMouseLeave()
{
if (_MouseDownItem != null)
_MouseDownItem.ProcessMouseLeave();
else
{
if (_MouseOverItem != null)
{
_MouseOverItem.ProcessMouseLeave();
_MouseOverItem = null;
}
}
base.OnMouseLeave();
}
protected override void OnKeyDown(System.Windows.Forms.KeyEventArgs e)
{
if (_FocusedItem != null)
_FocusedItem.ProcessKeyDown(e);
base.OnKeyDown(e);
}
protected override void OnKeyUp(System.Windows.Forms.KeyEventArgs e)
{
if (_FocusedItem != null)
_FocusedItem.ProcessKeyUp(e);
base.OnKeyUp(e);
}
protected override void OnKeyPress(System.Windows.Forms.KeyPressEventArgs e)
{
if (_FocusedItem != null)
_FocusedItem.ProcessKeyPress(e);
base.OnKeyPress(e);
}
protected override bool OnCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData)
{
if (_FocusedItem != null)
if (_FocusedItem.ProcessCmdKey(ref msg, keyData)) return true;
foreach (VisualItem item in this.Items)
{
if (item is VisualButtonBase)
{
if (item.ProcessCmdKey(ref msg, keyData)) return true;
}
}
return base.OnCmdKey(ref msg, keyData);
}
public VisualItem GetItemAt(int x, int y)
{
for (int i = _Items.Count - 1; i >= 0 ; i--)
{
VisualItem item = _Items[i];
if (!item.Visible) continue;
if (item.RenderBounds.Contains(x, y))
return item;
}
return null;
}
private VisualItem GetFirstVisibleItem()
{
foreach (VisualItem item in new VisualCollectionEnumerator(_Items, this.IsRightToLeft))
{
if (item.Visible) return item;
}
return null;
}
protected override void OnGotFocus()
{
OnGroupFocused();
base.OnGotFocus();
}
protected virtual void OnGroupFocused()
{
if (this.FocusedItem == null)
{
VisualItem item = GetFirstVisibleItem();
if (item != null) this.FocusedItem = item;
}
}
protected override void OnLostFocus()
{
this.FocusedItem = null;
base.OnLostFocus();
}
internal virtual void ProcessInputComplete()
{
OnInputComplete();
}
///
/// Occurs when child item input is complete. Method should be used to forward the input focus onto the different field if desired.
///
protected virtual void OnInputComplete()
{
}
///
/// Occurs when input stack on the child control has changed.
///
/// Control on which input has changed
internal void ProcessInputChanged(VisualInputBase input)
{
OnInputChanged(input);
}
///
/// Occurs when input stack on the child control has changed.
///
/// Control on which input has changed
protected virtual void OnInputChanged(VisualInputBase input)
{
}
private int _HorizontalItemSpacing = 0;
///
/// Gets or sets the horizontal spacing in pixels between the items.
///
[DefaultValue(0)]
public int HorizontalItemSpacing
{
get { return _HorizontalItemSpacing; }
set
{
if (_HorizontalItemSpacing != value)
{
_HorizontalItemSpacing = value;
this.InvalidateArrange();
}
}
}
private bool _IsRootVisual = false;
///
/// Gets or sets whether visual is root visual directly parented to the control.
///
[DefaultValue(false)]
public bool IsRootVisual
{
get { return _IsRootVisual; }
set { _IsRootVisual = value; }
}
private eVerticalAlignment _VerticalItemAlignment = eVerticalAlignment.Middle;
///
/// Gets or sets group vertical alignment. Default value is middle.
///
[DefaultValue(eVerticalAlignment.Middle)]
public eVerticalAlignment VerticalItemAlignment
{
get { return _VerticalItemAlignment; }
set
{
if (_VerticalItemAlignment != value)
{
_VerticalItemAlignment = value;
OnArrangeInvalid();
}
}
}
private eHorizontalAlignment _HorizontalItemAlignment = eHorizontalAlignment.Left;
///
/// Gets or sets input group horizontal alignment. Default value is left.
///
[DefaultValue(eHorizontalAlignment.Left)]
public eHorizontalAlignment HorizontalItemAlignment
{
get { return _HorizontalItemAlignment; }
set
{
if (_HorizontalItemAlignment != value)
{
_HorizontalItemAlignment = value;
OnArrangeInvalid();
}
}
}
#endregion
}
}
#endif