SourceCode/PROMS/DotNetBar Source Code/Metro/MetroToolbarContainer.cs

307 lines
11 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.ComponentModel;
using DevComponents.DotNetBar.Metro.Rendering;
using System.Windows.Forms;
namespace DevComponents.DotNetBar.Metro
{
/// <summary>
/// Defines the internal container item for the MetroToolbar control.
/// </summary>
[System.ComponentModel.ToolboxItem(false), System.ComponentModel.DesignTimeVisible(false)]
public class MetroToolbarContainer : ImageItem, IDesignTimeProvider
{
#region Internal Implementation
private SimpleItemContainer _MainItemsContainer = null;
private ButtonItem _ExpandButton = null;
private ItemContainer _ExtraItemsContainer = null;
private MetroToolbar _MetroToolbar = null;
/// <summary>
/// Creates new instance of the class and initializes it with the parent RibbonStrip control.
/// </summary>
/// <param name="parent">Reference to parent MetroToolbar control</param>
public MetroToolbarContainer(MetroToolbar parent)
{
_MetroToolbar = parent;
// We contain other controls
m_IsContainer = true;
this.AccessibleRole = System.Windows.Forms.AccessibleRole.Grouping;
_MainItemsContainer = new SimpleItemContainer();
//_MainItemsContainer.LayoutOrientation = eOrientation.Horizontal;
_MainItemsContainer.GlobalItem = false;
_MainItemsContainer.Displayed = true;
//_MainItemsContainer.ItemSpacing = 0;
_MainItemsContainer.SetSystemContainer(true);
_MainItemsContainer.ContainerControl = parent;
_MainItemsContainer.DesignTimeVisible = false;
_MainItemsContainer.Name = "_MainItemsContainer";
this.SubItems.Add(_MainItemsContainer);
_ExpandButton = new ButtonItem();
_ExpandButton.Click += new EventHandler(ExpandButtonClick);
_ExpandButton.ImagePaddingHorizontal = 12;
_ExpandButton.ImagePaddingVertical = 10;
_ExpandButton.Name = "sysMetroToolbarExpandButton";
_ExpandButton.SetSystemItem(true);
_ExpandButton.ContainerControl = parent;
_ExpandButton.DesignTimeVisible = false;
UpdateExpandButtonImage();
this.SubItems.Add(_ExpandButton);
_ExtraItemsContainer = new ItemContainer();
_ExtraItemsContainer.LayoutOrientation = eOrientation.Horizontal;
_ExtraItemsContainer.GlobalItem = false;
_ExtraItemsContainer.Displayed = true;
_ExtraItemsContainer.MultiLine = true;
_ExtraItemsContainer.SetSystemContainer(true);
_ExtraItemsContainer.ContainerControl = parent;
_ExtraItemsContainer.DesignTimeVisible = false;
_ExtraItemsContainer.Name = "_ExtraItemsContainer";
this.SubItems.Add(_ExtraItemsContainer);
}
protected override void Dispose(bool disposing)
{
if (_ExpandButton.Image != null)
{
Image image = _ExpandButton.Image;
_ExpandButton.Image = null;
image.Dispose();
}
base.Dispose(disposing);
}
private void UpdateExpandButtonImage()
{
if (_ExpandButton.Image != null)
{
Image image = _ExpandButton.Image;
_ExpandButton.Image = null;
image.Dispose();
}
Bitmap bitmap = new Bitmap(16, 16);
using (Graphics g = Graphics.FromImage(bitmap))
{
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
using (SolidBrush brush = new SolidBrush(MetroRender.GetColorTable().ForeColor))
{
g.FillEllipse(brush, new Rectangle(0, 2, 4, 4));
g.FillEllipse(brush, new Rectangle(6, 2, 4, 4));
g.FillEllipse(brush, new Rectangle(12, 2, 4, 4));
}
}
_ExpandButton.Image = bitmap;
}
void ExpandButtonClick(object sender, EventArgs e)
{
_MetroToolbar.Expanded = !_MetroToolbar.Expanded;
}
/// <summary>
/// Paints this base container
/// </summary>
public override void Paint(ItemPaintArgs pa)
{
if (this.SuspendLayout)
return;
_MainItemsContainer.Paint(pa);
_ExpandButton.Paint(pa);
_ExtraItemsContainer.Paint(pa);
}
public override void RecalcSize()
{
if (ExpandButtonVisible)
{
_ExpandButton.Displayed = true;
_ExpandButton.RecalcSize();
_ExpandButton.SetDisplayRectangle(new Rectangle(this.WidthInternal - _ExpandButton.WidthInternal, this.TopInternal, _ExpandButton.WidthInternal, _ExpandButton.HeightInternal));
}
else
{
_ExpandButton.Displayed = false;
_ExpandButton.HeightInternal = 0;
_ExpandButton.WidthInternal = 0;
}
_MainItemsContainer.LeftInternal = this.LeftInternal;
_MainItemsContainer.TopInternal = this.TopInternal;
if (_MainItemsContainer.VisibleSubItems == 0)
{
_MainItemsContainer.MinimumSize = new Size(this.WidthInternal - _ExpandButton.WidthInternal, 28);
}
else
{
_MainItemsContainer.MinimumSize = Size.Empty;
_MainItemsContainer.WidthInternal = this.WidthInternal - _ExpandButton.WidthInternal;
_MainItemsContainer.HeightInternal = 0;
}
_MainItemsContainer.RecalcSize();
const int MainExtraItemsSpacing = 1;
_ExtraItemsContainer.TopInternal = this.TopInternal + Math.Max(_MainItemsContainer.HeightInternal, _ExpandButton.HeightInternal) + MainExtraItemsSpacing;
if (_ExtraItemsContainer.VisibleSubItems == 0)
{
_ExtraItemsContainer.MinimumSize = new Size(this.WidthInternal, 28);
}
else
{
_ExtraItemsContainer.MinimumSize = Size.Empty;
_ExtraItemsContainer.WidthInternal = this.WidthInternal;
_ExtraItemsContainer.HeightInternal = 0;
}
_ExtraItemsContainer.RecalcSize();
this.HeightInternal = Math.Max(_ExpandButton.HeightInternal, _MainItemsContainer.HeightInternal) + _ExtraItemsContainer.HeightInternal + MainExtraItemsSpacing;
base.RecalcSize();
}
/// <summary>
/// Returns copy of GenericItemContainer item
/// </summary>
public override BaseItem Copy()
{
MetroToolbarContainer objCopy = new MetroToolbarContainer(_MetroToolbar);
this.CopyToItem(objCopy);
return objCopy;
}
protected override void CopyToItem(BaseItem copy)
{
RibbonStripContainerItem objCopy = copy as RibbonStripContainerItem;
base.CopyToItem(objCopy);
}
private bool _ExpandButtonVisible = true;
/// <summary>
/// Gets or sets whether Expand button is visible. Default value is true.
/// </summary>
[DefaultValue(true)]
public bool ExpandButtonVisible
{
get { return _ExpandButtonVisible; }
set
{
if (value != _ExpandButtonVisible)
{
bool oldValue = _ExpandButtonVisible;
_ExpandButtonVisible = value;
OnExpandButtonVisibleChanged(oldValue, value);
}
}
}
/// <summary>
/// Called when ExpandButtonVisible property has changed.
/// </summary>
/// <param name="oldValue">Old property value</param>
/// <param name="newValue">New property value</param>
protected virtual void OnExpandButtonVisibleChanged(bool oldValue, bool newValue)
{
//OnPropertyChanged(new PropertyChangedEventArgs("ExpandButtonVisible"));
this.NeedRecalcSize = true;
_MetroToolbar.RecalcLayout();
}
/// <summary>
/// Gets reference to container that host items.
/// </summary>
public SimpleItemContainer MainItemsContainer
{
get
{
return _MainItemsContainer;
}
}
/// <summary>
/// Gets reference to container that hosts extra items.
/// </summary>
public ItemContainer ExtraItemsContainer
{
get
{
return _ExtraItemsContainer;
}
}
public void UpdateSystemColors()
{
UpdateExpandButtonImage();
}
#endregion
#region IDesignTimeProvider Members
public InsertPosition GetInsertPosition(Point pScreen, BaseItem DragItem)
{
InsertPosition pos = null;
Point clientPoint = _MetroToolbar.PointToClient(pScreen);
if(_MainItemsContainer.DisplayRectangle.Contains(clientPoint) || !_MetroToolbar.Expanded)
pos = ((IDesignTimeProvider)_MainItemsContainer).GetInsertPosition(pScreen, DragItem);
if (pos == null && _MetroToolbar.Expanded)
{
pos = ((IDesignTimeProvider)_ExtraItemsContainer).GetInsertPosition(pScreen, DragItem);
}
return pos;
}
public void DrawReversibleMarker(int iPos, bool Before)
{
DesignTimeProviderContainer.DrawReversibleMarker(this, iPos, Before);
}
public void InsertItemAt(BaseItem objItem, int iPos, bool Before)
{
DesignTimeProviderContainer.InsertItemAt(this, objItem, iPos, Before);
}
/// <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 base.Expanded;
}
set
{
base.Expanded = value;
if (!value)
{
foreach (BaseItem item in this.SubItems)
item.Expanded = false;
}
}
}
/// <summary>
/// When parent items does recalc size for its sub-items it should query
/// image size and store biggest image size into this property.
/// </summary>
[System.ComponentModel.Browsable(false), System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden), System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
public override System.Drawing.Size SubItemsImageSize
{
get
{
return base.SubItemsImageSize;
}
set
{
//m_SubItemsImageSize = value;
}
}
#endregion
}
}