284 lines
11 KiB
C#
284 lines
11 KiB
C#
using System;
|
|
using System.Text;
|
|
using System.Windows.Forms;
|
|
using System.ComponentModel;
|
|
using System.Drawing;
|
|
using System.Runtime.InteropServices;
|
|
using System.Collections.Generic;
|
|
using System.Collections;
|
|
|
|
namespace DevComponents.DotNetBar
|
|
{
|
|
/// <summary>
|
|
/// Represents generic item panel container control.
|
|
/// </summary>
|
|
[ToolboxBitmap(typeof(ItemPanel), "Ribbon.ItemPanel.ico"), ToolboxItem(true), Designer("DevComponents.DotNetBar.Design.ItemPanelDesigner, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral, PublicKeyToken=90f470f34c89ccaf"), System.Runtime.InteropServices.ComVisible(false)]
|
|
public class ItemPanel : ItemPanelBase, IScrollableItemControl, IBindingSupport
|
|
{
|
|
#region Private Variables
|
|
#endregion
|
|
|
|
#region Constructor
|
|
public ItemPanel()
|
|
{
|
|
}
|
|
#endregion
|
|
|
|
#region Internal Implementation
|
|
/// <summary>
|
|
/// Returns first checked top-level button item.
|
|
/// </summary>
|
|
/// <returns>An ButtonItem object or null if no button could be found.</returns>
|
|
public ButtonItem GetChecked()
|
|
{
|
|
foreach (BaseItem item in this.Items)
|
|
{
|
|
if (item.Visible && item is ButtonItem && ((ButtonItem)item).Checked)
|
|
return item as ButtonItem;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets default layout orientation inside the control. You can have multiple layouts inside of the control by adding
|
|
/// one or more instances of the ItemContainer object and chaning it's LayoutOrientation property.
|
|
/// </summary>
|
|
[Browsable(true), DevCoBrowsable(true), Category("Layout"), DefaultValue(eOrientation.Horizontal), DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
|
|
public virtual eOrientation LayoutOrientation
|
|
{
|
|
get { return ItemContainer.LayoutOrientation; }
|
|
set
|
|
{
|
|
ItemContainer.LayoutOrientation = value;
|
|
if (this.DesignMode)
|
|
this.RecalcLayout();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets whether items contained by container are resized to fit the container bounds. When container is in horizontal
|
|
/// layout mode then all items will have the same height. When container is in vertical layout mode then all items
|
|
/// will have the same width. Default value is true.
|
|
/// </summary>
|
|
[Browsable(true), DevCoBrowsable(true), DefaultValue(true), Category("Layout")]
|
|
public virtual bool ResizeItemsToFit
|
|
{
|
|
get { return ItemContainer.ResizeItemsToFit; }
|
|
set
|
|
{
|
|
ItemContainer.ResizeItemsToFit = value;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets whether ButtonItem buttons when in vertical layout are fit into the available width so any text inside of them
|
|
/// is wrapped if needed. Default value is false.
|
|
/// </summary>
|
|
[DefaultValue(false), Category("Layout"), Description("Indicates whether ButtonItem buttons when in vertical layout are fit into the available width so any text inside of them is wrapped if needed.")]
|
|
public bool FitButtonsToContainerWidth
|
|
{
|
|
get { return ItemContainer.FitOversizeItemIntoAvailableWidth; }
|
|
set
|
|
{
|
|
ItemContainer.FitOversizeItemIntoAvailableWidth = value;
|
|
if (this.DesignMode)
|
|
RecalcLayout();
|
|
}
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// Gets or sets the item alignment when container is in horizontal layout. Default value is Left.
|
|
/// </summary>
|
|
[Browsable(true), DefaultValue(eHorizontalItemsAlignment.Left), Category("Layout"), Description("Indicates item alignment when container is in horizontal layout."), DevCoBrowsable(true)]
|
|
public eHorizontalItemsAlignment HorizontalItemAlignment
|
|
{
|
|
get { return ItemContainer.HorizontalItemAlignment; }
|
|
set
|
|
{
|
|
ItemContainer.HorizontalItemAlignment = value;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets whether items in horizontal layout are wrapped into the new line when they cannot fit allotted container size. Default value is false.
|
|
/// </summary>
|
|
[Browsable(true), DefaultValue(false), Category("Layout"), Description("Indicates whether items in horizontal layout are wrapped into the new line when they cannot fit allotted container size.")]
|
|
public virtual bool MultiLine
|
|
{
|
|
get { return ItemContainer.MultiLine; }
|
|
set
|
|
{
|
|
ItemContainer.MultiLine = value;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns collection of items on a bar.
|
|
/// </summary>
|
|
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content), Browsable(false)]
|
|
public SubItemsCollection Items
|
|
{
|
|
get
|
|
{
|
|
return m_ItemContainer.SubItems;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Indicates whether block elements inside of container when aligned center or right will reserve the space to the left. Default value is true.
|
|
/// </summary>
|
|
[DefaultValue(true), Category("Indicates whether block elements inside of container (affects span or div for example) when aligned center or right will reserve the space to the left.")]
|
|
public bool ReserveLeftSpace
|
|
{
|
|
get { return ItemContainer.ReserveLeftSpace; }
|
|
set { ItemContainer.ReserveLeftSpace = value; }
|
|
}
|
|
#endregion
|
|
|
|
#region Binding and Templating Support
|
|
/// <summary>
|
|
/// Gets or sets the index specifying the currently selected item.
|
|
/// </summary>
|
|
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), Description("Gets or sets the index specifying the currently selected item.")]
|
|
public override int SelectedIndex
|
|
{
|
|
get
|
|
{
|
|
return _SelectedIndex;
|
|
}
|
|
set
|
|
{
|
|
if (value != _SelectedIndex)
|
|
{
|
|
if (value == -1)
|
|
{
|
|
_SelectedIndex = -1;
|
|
SetItemSelection(this.SelectedItem, false);
|
|
}
|
|
else
|
|
{
|
|
BaseItem item = null;
|
|
if (_SelectedIndex >= this.Items.Count)
|
|
{
|
|
_SelectedIndex = -1;
|
|
return;
|
|
}
|
|
if (_SelectedIndex > -1)
|
|
item = this.Items[_SelectedIndex];
|
|
SetItemSelection(this.SelectedItem, false);
|
|
SetItemSelection(item, true);
|
|
_SelectedIndex = value;
|
|
}
|
|
OnSelectedIndexChanged(EventArgs.Empty);
|
|
}
|
|
}
|
|
}
|
|
|
|
protected override void OnButtonCheckedChanged(ButtonItem item, EventArgs e)
|
|
{
|
|
if (item.Checked)
|
|
{
|
|
_SelectedIndex = this.Items.IndexOf(item);
|
|
OnSelectedIndexChanged(e);
|
|
}
|
|
base.OnButtonCheckedChanged(item, e);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Adds new item to the ItemPanel based on specified ItemTemplate and sets its Text property.
|
|
/// </summary>
|
|
/// <param name="text">Text to assign to the item.</param>
|
|
/// <returns>reference to newly created item</returns>
|
|
public BaseItem AddItem(string text)
|
|
{
|
|
BaseItem template = GetItemTemplate();
|
|
if (template == null)
|
|
throw new NullReferenceException("ItemTemplate property not set.");
|
|
BaseItem item = template.Copy();
|
|
item.Text = text;
|
|
this.Items.Add(item);
|
|
|
|
return item;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the list of ButtonItem or CheckBoxItem controls that have their Checked property set to true.
|
|
/// </summary>
|
|
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
|
|
public System.Collections.Generic.List<BaseItem> SelectedItems
|
|
{
|
|
get
|
|
{
|
|
System.Collections.Generic.List<BaseItem> items = new System.Collections.Generic.List<BaseItem>();
|
|
SubItemsCollection itemsCollection = this.Items;
|
|
GetSelectedItems(items, itemsCollection);
|
|
return items;
|
|
}
|
|
}
|
|
|
|
private static void GetSelectedItems(System.Collections.Generic.List<BaseItem> items, SubItemsCollection itemsCollection)
|
|
{
|
|
foreach (BaseItem item in itemsCollection)
|
|
{
|
|
if (item is ItemContainer)
|
|
{
|
|
GetSelectedItems(items, item.SubItems);
|
|
continue;
|
|
}
|
|
ButtonItem button = item as ButtonItem;
|
|
if (button != null && button.Checked)
|
|
items.Add(button);
|
|
else
|
|
{
|
|
CheckBoxItem cb = item as CheckBoxItem;
|
|
if (cb != null && cb.Checked)
|
|
items.Add(cb);
|
|
else if (item is DevComponents.DotNetBar.Metro.MetroTileItem && ((DevComponents.DotNetBar.Metro.MetroTileItem)item).Checked)
|
|
items.Add(item);
|
|
|
|
}
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// Gets or sets ButtonItem or CheckBoxItem item that have their Checked property set to true.
|
|
/// </summary>
|
|
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
|
|
public BaseItem SelectedItem
|
|
{
|
|
get
|
|
{
|
|
int i = this.SelectedIndex;
|
|
if (i == -1) return null;
|
|
return this.Items[i];
|
|
}
|
|
set
|
|
{
|
|
SetItemSelection(this.SelectedItem, false);
|
|
SetItemSelection(value, true);
|
|
if (value != null)
|
|
_SelectedIndex = this.Items.IndexOf(value);
|
|
else
|
|
_SelectedIndex = -1;
|
|
}
|
|
}
|
|
private bool SetItemSelection(BaseItem item, bool isSelected)
|
|
{
|
|
if (item == null) return false;
|
|
bool isSet = true;
|
|
if (item is CheckBoxItem)
|
|
((CheckBoxItem)item).Checked = isSelected;
|
|
else if (item is ButtonItem)
|
|
((ButtonItem)item).Checked = isSelected;
|
|
else if (item is DevComponents.DotNetBar.Metro.MetroTileItem)
|
|
((DevComponents.DotNetBar.Metro.MetroTileItem)item).Checked = isSelected;
|
|
else
|
|
isSet = false;
|
|
|
|
return isSet;
|
|
}
|
|
#endregion
|
|
}
|
|
}
|