222 lines
7.3 KiB
C#
222 lines
7.3 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
using System.ComponentModel;
|
|
using System.Drawing;
|
|
|
|
namespace DevComponents.DotNetBar
|
|
{
|
|
/// <summary>
|
|
/// Container for the StepItem objects.
|
|
/// </summary>
|
|
public class StepItemContainer : ImageItem, IDesignTimeProvider
|
|
{
|
|
#region Implementation
|
|
/// <summary>
|
|
/// Initializes a new instance of the StepContainer class.
|
|
/// </summary>
|
|
public StepItemContainer()
|
|
{
|
|
m_IsContainer = true;
|
|
this.AutoCollapseOnClick = true;
|
|
this.AccessibleRole = System.Windows.Forms.AccessibleRole.Grouping;
|
|
}
|
|
/// <summary>
|
|
/// Returns copy of the item.
|
|
/// </summary>
|
|
public override BaseItem Copy()
|
|
{
|
|
StepItemContainer objCopy = new StepItemContainer();
|
|
objCopy.Name = this.Name;
|
|
this.CopyToItem(objCopy);
|
|
return objCopy;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Copies the StepContainer specific properties to new instance of the item.
|
|
/// </summary>
|
|
/// <param name="copy">New StepContainer instance.</param>
|
|
internal void InternalCopyToItem(StepItemContainer copy)
|
|
{
|
|
CopyToItem(copy);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Copies the StepContainer specific properties to new instance of the item.
|
|
/// </summary>
|
|
/// <param name="copy">New StepContainer instance.</param>
|
|
protected override void CopyToItem(BaseItem copy)
|
|
{
|
|
StepItemContainer c = copy as StepItemContainer;
|
|
base.CopyToItem(c);
|
|
|
|
|
|
}
|
|
|
|
protected override void Dispose(bool disposing)
|
|
{
|
|
base.Dispose(disposing);
|
|
}
|
|
|
|
public override void RecalcSize()
|
|
{
|
|
bool first = true;
|
|
Point loc = this.Bounds.Location;
|
|
Size totalSize = Size.Empty;
|
|
bool uniformHeight = true;
|
|
SubItemsCollection subItems = this.SubItems;
|
|
bool last = true;
|
|
int startIndex = subItems.Count - 1;
|
|
for (int i = startIndex; i >= 0; i--)
|
|
{
|
|
StepItem item = subItems[i] as StepItem;
|
|
if (item != null && item.Visible)
|
|
{
|
|
item.IsLast = last;
|
|
last = false;
|
|
}
|
|
}
|
|
foreach (BaseItem item in subItems)
|
|
{
|
|
item.DesignMarkerOrientation = eDesignMarkerOrientation.Horizontal;
|
|
StepItem si = item as StepItem;
|
|
if (!item.Visible)
|
|
{
|
|
item.Displayed = false;
|
|
if (si != null)
|
|
{
|
|
si.IsLast = false;
|
|
}
|
|
continue;
|
|
}
|
|
item.Displayed = true;
|
|
if (si != null)
|
|
{
|
|
si.IsFirst = first;
|
|
first = false;
|
|
si.RecalcSize();
|
|
si.SetDisplayRectangle(new Rectangle(loc, si.Size));
|
|
int stepWidth = (si.Size.Width - _PointerSize - 1); // 1 is so right hand line overlaps
|
|
loc.X += stepWidth;
|
|
totalSize.Width += stepWidth;
|
|
}
|
|
else
|
|
{
|
|
first = true;
|
|
item.RecalcSize();
|
|
item.SetDisplayRectangle(new Rectangle(loc, item.Size));
|
|
loc.X += item.WidthInternal;
|
|
totalSize.Width += item.WidthInternal;
|
|
}
|
|
if (uniformHeight && totalSize.Height > 0 && totalSize.Height != item.HeightInternal)
|
|
uniformHeight = false;
|
|
totalSize.Height = Math.Max(totalSize.Height, item.HeightInternal);
|
|
}
|
|
totalSize.Width += _PointerSize;
|
|
|
|
// Vertically center items if they are all not of same height
|
|
if (!uniformHeight)
|
|
{
|
|
foreach (BaseItem item in subItems)
|
|
{
|
|
if (!item.Visible)
|
|
continue;
|
|
if (item.HeightInternal < totalSize.Height)
|
|
item.TopInternal = (totalSize.Height - item.HeightInternal) / 2;
|
|
}
|
|
}
|
|
m_Rect.Size = totalSize;
|
|
_CalculatedHeight = totalSize.Height;
|
|
_CalculatedWidth = totalSize.Width;
|
|
base.RecalcSize();
|
|
}
|
|
|
|
public override void Paint(ItemPaintArgs p)
|
|
{
|
|
ItemDisplay display = GetItemDisplay();
|
|
display.Paint(this, p);
|
|
}
|
|
|
|
private ItemDisplay m_ItemDisplay = null;
|
|
internal ItemDisplay GetItemDisplay()
|
|
{
|
|
if (m_ItemDisplay == null)
|
|
{
|
|
m_ItemDisplay = new ItemDisplay();
|
|
}
|
|
return m_ItemDisplay;
|
|
}
|
|
|
|
private int _PointerSize = 10;
|
|
/// <summary>
|
|
/// Gets or sets the arrow pointer width for the StepItem objects hosted within this container.
|
|
/// </summary>
|
|
[DefaultValue(10), Category("Appearance"), Description("Gets or sets the arrow pointer width for the StepItem objects hosted within this container.")]
|
|
public int PointerSize
|
|
{
|
|
get { return _PointerSize; }
|
|
set
|
|
{
|
|
if (value != _PointerSize)
|
|
{
|
|
int oldValue = _PointerSize;
|
|
_PointerSize = value;
|
|
OnPointerSizeChanged(oldValue, value);
|
|
}
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// Called when PointerSize property has changed.
|
|
/// </summary>
|
|
/// <param name="oldValue">Old property value</param>
|
|
/// <param name="newValue">New property value</param>
|
|
protected virtual void OnPointerSizeChanged(int oldValue, int newValue)
|
|
{
|
|
//OnPropertyChanged(new PropertyChangedEventArgs("PointerSize"));
|
|
|
|
}
|
|
|
|
private int _CalculatedWidth;
|
|
internal int CalculatedWidth
|
|
{
|
|
get { return _CalculatedWidth; }
|
|
set
|
|
{
|
|
_CalculatedWidth = value;
|
|
}
|
|
}
|
|
|
|
private int _CalculatedHeight;
|
|
internal int CalculatedHeight
|
|
{
|
|
get { return _CalculatedHeight; }
|
|
set
|
|
{
|
|
_CalculatedHeight = value;
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region IDesignTimeProvider Implementation
|
|
protected virtual InsertPosition GetContainerInsertPosition(Point pScreen, BaseItem dragItem)
|
|
{
|
|
return DesignTimeProviderContainer.GetInsertPosition(this, pScreen, dragItem);
|
|
}
|
|
InsertPosition IDesignTimeProvider.GetInsertPosition(Point pScreen, BaseItem dragItem)
|
|
{
|
|
return GetContainerInsertPosition(pScreen, dragItem);
|
|
}
|
|
void IDesignTimeProvider.DrawReversibleMarker(int iPos, bool Before)
|
|
{
|
|
DesignTimeProviderContainer.DrawReversibleMarker(this, iPos, Before);
|
|
}
|
|
void IDesignTimeProvider.InsertItemAt(BaseItem objItem, int iPos, bool Before)
|
|
{
|
|
DesignTimeProviderContainer.InsertItemAt(this, objItem, iPos, Before);
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
}
|