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