using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.Design; using System.Drawing; using System.Drawing.Design; using System.Drawing.Drawing2D; using System.Data; using System.Windows.Forms; using Demo.WindowsForms.Properties; namespace BSE.Windows.Forms { #region Class XPanderPanelList /// /// Manages a related set of xpanderpanels. /// /// /// The XPanderPanelList contains XPanderPanels, which are represented by XPanderPanel /// objects that you can add through the XPanderPanels property. /// The order of XPanderPanel objects reflects the order the xpanderpanels appear /// in the XPanderPanelList control. /// /// Copyright © 2006-2008 Uwe Eichkorn /// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY /// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE /// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR /// PURPOSE. IT CAN BE DISTRIBUTED FREE OF CHARGE AS LONG AS THIS HEADER /// REMAINS UNCHANGED. /// [Designer(typeof(XPanderPanelListDesigner)), DesignTimeVisibleAttribute(true)] [ToolboxBitmap(typeof(System.Windows.Forms.Panel))] public partial class XPanderPanelList : ScrollableControl { #region Events /// /// The PanelStyleChanged event occurs when PanelStyle flags have been changed. /// [Description("The PanelStyleChanged event occurs when PanelStyle flags have been changed.")] public event EventHandler PanelStyleChanged; /// /// The CaptionStyleChanged event occurs when CaptionStyle flags have been changed. /// [Description("The CaptionStyleChanged event occurs when CaptionStyle flags have been changed.")] public event EventHandler CaptionStyleChanged; /// /// The ColorSchemeChanged event occurs when ColorScheme flags have been changed. /// [Description("The ColorSchemeChanged event occurs when ColorScheme flags have been changed.")] public event EventHandler ColorSchemeChanged; /// /// Occurs when the value of the CaptionHeight property changes. /// [Description("Occurs when the value of the CaptionHeight property changes.")] public event EventHandler CaptionHeightChanged; #endregion #region FieldsPrivate private bool m_bShowBorder; private bool m_bShowGradientBackground; private bool m_bShowExpandIcon; private bool m_bShowCloseIcon; private int m_iCaptionHeight; private LinearGradientMode m_linearGradientMode; private System.Drawing.Color m_colorGradientBackground; private CaptionStyle m_captionStyle; private BSE.Windows.Forms.PanelStyle m_ePanelStyle; private BSE.Windows.Forms.ColorScheme m_eColorScheme; private XPanderPanelCollection m_xpanderPanels; private PanelColors m_panelColors; #endregion #region Properties /// /// Gets the collection of xpanderpanels in this xpanderpanellist. /// /// The following code example creates a XPanderPanel and adds it to the XPanderPanels collection, /// /// private void btnAddXPanderPanel_Click(object sender, EventArgs e) /// { /// if (xPanderPanelList3 != null) /// { /// // Create and initialize a XPanderPanel. /// BSE.Windows.Forms.XPanderPanel xpanderPanel = new BSE.Windows.Forms.XPanderPanel(); /// xpanderPanel.Text = "new XPanderPanel"; /// // and add it to the XPanderPanels collection /// xPanderPanelList3.XPanderPanels.Add(xpanderPanel); /// } /// } /// /// [RefreshProperties(RefreshProperties.Repaint), Category("Collections"), Browsable(true), Description("Collection containing all the XPanderPanels for the xpanderpanellist.")] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [Editor(typeof(XPanderPanelCollectionEditor), typeof(UITypeEditor))] public XPanderPanelCollection XPanderPanels { get { return this.m_xpanderPanels; } } /// /// Specifies the style of the panels in this xpanderpanellist. /// [Description("Specifies the style of the xpanderpanels in this xpanderpanellist."), DefaultValue(BSE.Windows.Forms.PanelStyle.Default), Category("Appearance")] public BSE.Windows.Forms.PanelStyle PanelStyle { get { return this.m_ePanelStyle; } set { if(value != this.m_ePanelStyle) { this.m_ePanelStyle = value; OnPanelStyleChanged(this, new PanelStyleChangeEventArgs(this.m_ePanelStyle)); } } } /// /// Gets or sets the Panelcolors table. /// public PanelColors PanelColors { get { return this.m_panelColors; } set { this.m_panelColors = value; } } /// /// Specifies the colorscheme of the xpanderpanels in the xpanderpanellist /// [Description("The colorscheme of the xpanderpanels in the xpanderpanellist")] [DefaultValue(BSE.Windows.Forms.ColorScheme.Professional)] [Category("Appearance")] public ColorScheme ColorScheme { get { return this.m_eColorScheme; } set { if(value != this.m_eColorScheme) { this.m_eColorScheme = value; OnColorSchemeChanged(this, new ColorSchemeChangeEventArgs(this.m_eColorScheme)); } } } /// /// Gets or sets the style of the captionbar. /// [Description("The style of the captionbar.")] [Category("Appearance")] public CaptionStyle CaptionStyle { get { return this.m_captionStyle; } set { this.m_captionStyle = value; OnCaptionStyleChanged(this, EventArgs.Empty); } } /// /// LinearGradientMode of the background in the xpanderpanellist /// [Description("LinearGradientMode of the background in the xpanderpanellist"), DefaultValue(LinearGradientMode.Vertical), Category("Appearance")] public LinearGradientMode LinearGradientMode { get { return this.m_linearGradientMode; } set { if(value != this.m_linearGradientMode) { this.m_linearGradientMode = value; this.Invalidate(false); } } } /// /// Gets or sets a value indicating whether a xpanderpanellist's gradient background is shown. /// [Description("Gets or sets a value indicating whether a xpanderpanellist's gradient background is shown."), DefaultValue(false), Category("Appearance")] public bool ShowGradientBackground { get { return this.m_bShowGradientBackground; } set { if(value != this.m_bShowGradientBackground) { this.m_bShowGradientBackground = value; this.Invalidate(false); } } } /// /// Gets or sets a value indicating whether a xpanderpanellist's border is shown /// [Description("Gets or sets a value indicating whether a xpanderpanellist's border is shown"), DefaultValue(true), Category("Appearance")] public bool ShowBorder { get { return this.m_bShowBorder; } set { if(value != this.m_bShowBorder) { this.m_bShowBorder = value; foreach(XPanderPanel xpanderPanel in this.XPanderPanels) { xpanderPanel.ShowBorder = this.m_bShowBorder; } this.Invalidate(false); } } } /// /// Gets or sets a value indicating whether the expand icon of the xpanderpanels in this xpanderpanellist are visible. /// [Description("Gets or sets a value indicating whether the expand icon of the xpanderpanels in this xpanderpanellist are visible."), DefaultValue(false), Category("Appearance")] public bool ShowExpandIcon { get { return this.m_bShowExpandIcon; } set { if(value != this.m_bShowExpandIcon) { this.m_bShowExpandIcon = value; foreach(XPanderPanel xpanderPanel in this.XPanderPanels) { xpanderPanel.ShowExpandIcon = this.m_bShowExpandIcon; } } } } /// /// Gets or sets a value indicating whether the close icon of the xpanderpanels in this xpanderpanellist are visible. /// [Description("Gets or sets a value indicating whether the close icon of the xpanderpanels in this xpanderpanellist are visible."), DefaultValue(false), Category("Appearance")] public bool ShowCloseIcon { get { return this.m_bShowCloseIcon; } set { if(value != this.m_bShowCloseIcon) { this.m_bShowCloseIcon = value; foreach(XPanderPanel xpanderPanel in this.XPanderPanels) { xpanderPanel.ShowCloseIcon = this.m_bShowCloseIcon; } } } } /// /// Gradientcolor background in this xpanderpanellist /// [Description("Gradientcolor background in this xpanderpanellist"), DefaultValue(false), Category("Appearance")] public System.Drawing.Color GradientBackground { get { return this.m_colorGradientBackground; } set { if(value != this.m_colorGradientBackground) { this.m_colorGradientBackground = value; this.Invalidate(false); } } } /// /// Gets or sets the height of the XpanderPanels in this XPanderPanelList. /// [Description("Gets or sets the height of the XpanderPanels in this XPanderPanelList. "), DefaultValue(25), Category("Appearance")] public int CaptionHeight { get { return m_iCaptionHeight; } set { if(value < Constants.CaptionMinHeight) { throw new InvalidOperationException( string.Format( System.Globalization.CultureInfo.CurrentUICulture, Resources.IDS_InvalidOperationExceptionInteger, value, "CaptionHeight", Constants.CaptionMinHeight)); } this.m_iCaptionHeight = value; OnCaptionHeightChanged(this, EventArgs.Empty); } } #endregion #region MethodsPublic /// /// Initializes a new instance of the XPanderPanelList class. /// public XPanderPanelList() { // Dieser Aufruf ist für den Windows Form-Designer erforderlich. SetStyle(ControlStyles.DoubleBuffer, true); SetStyle(ControlStyles.ResizeRedraw, false); SetStyle(ControlStyles.UserPaint, true); SetStyle(ControlStyles.AllPaintingInWmPaint, true); SetStyle(ControlStyles.SupportsTransparentBackColor, true); InitializeComponent(); this.m_xpanderPanels = new XPanderPanelCollection(this); this.ShowBorder = true; this.PanelStyle = PanelStyle.Default; this.LinearGradientMode = LinearGradientMode.Vertical; this.CaptionHeight = 25; } /// /// Expands the specified XPanderPanel /// /// The XPanderPanel to expand /// /// /// private void btnExpandXPander_Click(object sender, EventArgs e) /// { /// // xPanderPanel10 is not null /// if (xPanderPanel10 != null) /// { /// BSE.Windows.Forms.XPanderPanelList panelList = xPanderPanel10.Parent as BSE.Windows.Forms.XPanderPanelList; /// // and it's parent panelList is not null /// if (panelList != null) /// { /// // expands xPanderPanel10 in it's panelList. /// panelList.Expand(xPanderPanel10); /// } /// } /// } /// /// public void Expand(BasePanel panel) { if(panel == null) { throw new ArgumentNullException("panel", string.Format(System.Globalization.CultureInfo.InvariantCulture, Demo.WindowsForms.Properties.Resources.IDS_ArgumentException, "panel")); } XPanderPanel xpanderPanel = panel as XPanderPanel; if(xpanderPanel != null) { foreach(XPanderPanel tmpXPanderPanel in this.m_xpanderPanels) { if(tmpXPanderPanel.Equals(xpanderPanel) == false) { tmpXPanderPanel.Expand = false; } } PropertyDescriptor propertyDescriptor = TypeDescriptor.GetProperties(xpanderPanel)["Expand"]; if(propertyDescriptor != null) { propertyDescriptor.SetValue(xpanderPanel, true); } } } #endregion #region MethodsProtected /// /// Paints the background of the xpanderpanellist. /// /// A PaintEventArgs that contains information about the control to paint. protected override void OnPaintBackground(PaintEventArgs pevent) { base.OnPaintBackground(pevent); if(this.m_bShowGradientBackground == true) { Rectangle rectangle = new Rectangle(0, 0, this.ClientRectangle.Width, this.ClientRectangle.Height); using(LinearGradientBrush linearGradientBrush = new LinearGradientBrush( rectangle, this.BackColor, this.GradientBackground, this.LinearGradientMode)) { pevent.Graphics.FillRectangle(linearGradientBrush, rectangle); } } } /// /// Raises the ControlAdded event. /// /// A ControlEventArgs that contains the event data. protected override void OnControlAdded(System.Windows.Forms.ControlEventArgs e) { base.OnControlAdded(e); BSE.Windows.Forms.XPanderPanel xpanderPanel = e.Control as BSE.Windows.Forms.XPanderPanel; if(xpanderPanel != null) { if(xpanderPanel.Expand == true) { foreach(XPanderPanel tmpXPanderPanel in this.XPanderPanels) { if(tmpXPanderPanel != xpanderPanel) { tmpXPanderPanel.Expand = false; tmpXPanderPanel.Height = xpanderPanel.CaptionHeight; } } } xpanderPanel.Parent = this; xpanderPanel.Anchor = ((System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); xpanderPanel.Left = this.Padding.Left; xpanderPanel.Width = this.ClientRectangle.Width - this.Padding.Left - this.Padding.Right; xpanderPanel.PanelStyle = this.PanelStyle; xpanderPanel.ColorScheme = this.ColorScheme; if(this.PanelColors != null) { xpanderPanel.SetPanelProperties(this.PanelColors); } xpanderPanel.ShowBorder = this.ShowBorder; xpanderPanel.ShowCloseIcon = this.m_bShowCloseIcon; xpanderPanel.ShowExpandIcon = this.m_bShowExpandIcon; xpanderPanel.CaptionStyle = this.m_captionStyle; xpanderPanel.Top = this.GetTopPosition(); xpanderPanel.PanelStyleChanged += new EventHandler(XpanderPanelPanelStyleChanged); xpanderPanel.ExpandClick += new EventHandler(this.XPanderPanelExpandClick); xpanderPanel.CloseClick += new EventHandler(this.XPanderPanelCloseClick); } else { throw new InvalidOperationException("Can only add BSE.Windows.Forms.XPanderPanel"); } } /// /// Raises the ControlRemoved event. /// /// A ControlEventArgs that contains the event data. protected override void OnControlRemoved(System.Windows.Forms.ControlEventArgs e) { base.OnControlRemoved(e); BSE.Windows.Forms.XPanderPanel xpanderPanel = e.Control as BSE.Windows.Forms.XPanderPanel; if(xpanderPanel != null) { xpanderPanel.PanelStyleChanged -= new EventHandler(XpanderPanelPanelStyleChanged); xpanderPanel.ExpandClick -= new EventHandler(this.XPanderPanelExpandClick); xpanderPanel.CloseClick -= new EventHandler(this.XPanderPanelCloseClick); } } /// /// Raises the Resize event. /// /// An EventArgs that contains the event data. protected override void OnResize(System.EventArgs e) { base.OnResize(e); int iXPanderPanelCaptionHeight = 0; if(this.m_xpanderPanels != null) { foreach(XPanderPanel xpanderPanel in this.m_xpanderPanels) { xpanderPanel.Width = this.ClientRectangle.Width - this.Padding.Left - this.Padding.Right; if(xpanderPanel.Visible == false) { iXPanderPanelCaptionHeight -= xpanderPanel.CaptionHeight; } iXPanderPanelCaptionHeight += xpanderPanel.CaptionHeight; } foreach(XPanderPanel xpanderPanel in this.m_xpanderPanels) { if(xpanderPanel.Expand == true) { xpanderPanel.Height = this.Height - iXPanderPanelCaptionHeight - this.Padding.Top - this.Padding.Bottom + xpanderPanel.CaptionHeight; return; } } } } /// /// Raises the PanelStyle changed event /// /// The source of the event. /// A PanelStyleChangeEventArgs that contains the event data. protected virtual void OnPanelStyleChanged(object sender, PanelStyleChangeEventArgs e) { PanelStyle panelStyle = e.PanelStyle; this.Padding = new System.Windows.Forms.Padding(0); foreach(XPanderPanel xpanderPanel in this.XPanderPanels) { PropertyDescriptorCollection propertyDescriptorCollection = TypeDescriptor.GetProperties(xpanderPanel); if(propertyDescriptorCollection.Count > 0) { PropertyDescriptor propertyDescriptorPanelStyle = propertyDescriptorCollection["PanelStyle"]; if(propertyDescriptorPanelStyle != null) { propertyDescriptorPanelStyle.SetValue(xpanderPanel, panelStyle); } PropertyDescriptor propertyDescriptorLeft = propertyDescriptorCollection["Left"]; if(propertyDescriptorLeft != null) { propertyDescriptorLeft.SetValue(xpanderPanel, this.Padding.Left); } PropertyDescriptor propertyDescriptorWidth = propertyDescriptorCollection["Width"]; if(propertyDescriptorWidth != null) { propertyDescriptorWidth.SetValue( xpanderPanel, this.ClientRectangle.Width - this.Padding.Left - this.Padding.Right); } } } if(this.PanelStyleChanged != null) { this.PanelStyleChanged(sender, e); } } /// /// Raises the ColorScheme changed event /// /// The source of the event. /// A EventArgs that contains the event data. protected virtual void OnColorSchemeChanged(object sender, ColorSchemeChangeEventArgs e) { ColorScheme eColorScheme = e.ColorSchema; foreach(XPanderPanel xpanderPanel in this.XPanderPanels) { PropertyDescriptor propertyDescriptor = TypeDescriptor.GetProperties(xpanderPanel)["ColorScheme"]; if(propertyDescriptor != null) { propertyDescriptor.SetValue(xpanderPanel, eColorScheme); } } if(this.ColorSchemeChanged != null) { this.ColorSchemeChanged(sender, e); } } /// /// Raises the CaptionHeight changed event /// /// The source of the event. /// A EventArgs that contains the event data. protected virtual void OnCaptionHeightChanged(object sender, EventArgs e) { foreach(XPanderPanel xpanderPanel in this.XPanderPanels) { PropertyDescriptor propertyDescriptor = TypeDescriptor.GetProperties(xpanderPanel)["CaptionHeight"]; if(propertyDescriptor != null) { propertyDescriptor.SetValue(xpanderPanel, this.m_iCaptionHeight); } } if(this.CaptionHeightChanged != null) { this.CaptionHeightChanged(sender, e); } } /// /// Raises the CaptionStyleChanged changed event /// /// The source of the event. /// A EventArgs that contains the event data. protected virtual void OnCaptionStyleChanged(object sender, EventArgs e) { foreach(XPanderPanel xpanderPanel in this.XPanderPanels) { PropertyDescriptor propertyDescriptor = TypeDescriptor.GetProperties(xpanderPanel)["CaptionStyle"]; if(propertyDescriptor != null) { propertyDescriptor.SetValue(xpanderPanel, this.m_captionStyle); } } if(this.CaptionStyleChanged != null) { this.CaptionStyleChanged(sender, e); } } #endregion #region MethodsPrivate private void XPanderPanelExpandClick(object sender, EventArgs e) { BSE.Windows.Forms.XPanderPanel xpanderPanel = sender as BSE.Windows.Forms.XPanderPanel; if(xpanderPanel != null) { this.Expand(xpanderPanel); } } private void XPanderPanelCloseClick(object sender, EventArgs e) { BSE.Windows.Forms.XPanderPanel xpanderPanel = sender as BSE.Windows.Forms.XPanderPanel; if(xpanderPanel != null) { this.Controls.Remove(xpanderPanel); } } private void XpanderPanelPanelStyleChanged(object sender, PanelStyleChangeEventArgs e) { PanelStyle panelStyle = e.PanelStyle; if(panelStyle != this.m_ePanelStyle) { this.PanelStyle = panelStyle; } } private int GetTopPosition() { int iTopPosition = this.Padding.Top; int iNextTopPosition = 0; //The next top position is the highest top value + that controls height, with a //little vertical spacing thrown in for good measure IEnumerator enumerator = this.XPanderPanels.GetEnumerator(); while(enumerator.MoveNext()) { XPanderPanel xpanderPanel = (XPanderPanel) enumerator.Current; if(xpanderPanel.Visible == true) { if(iNextTopPosition == this.Padding.Top) { iTopPosition = this.Padding.Top; } else { iTopPosition = iNextTopPosition; } iNextTopPosition = iTopPosition + xpanderPanel.Height; } } return iTopPosition; } #endregion } #endregion #region Class XPanderPanelListDesigner /// /// Extends the design mode behavior of a XPanderPanelList control that supports nested controls. /// internal class XPanderPanelListDesigner : System.Windows.Forms.Design.ParentControlDesigner { #region FieldsPrivate private Pen m_borderPen = new Pen(Color.FromKnownColor(KnownColor.ControlDarkDark)); private XPanderPanelList m_xpanderPanelList; #endregion #region MethodsPublic /// /// nitializes a new instance of the XPanderPanelListDesigner class. /// public XPanderPanelListDesigner() { this.m_borderPen.DashStyle = DashStyle.Dash; } /// /// Initializes the designer with the specified component. /// /// The IComponent to associate with the designer. public override void Initialize(System.ComponentModel.IComponent component) { base.Initialize(component); this.m_xpanderPanelList = (XPanderPanelList) this.Control; //Disable the autoscroll feature for the control during design time. The control //itself sets this property to true when it initializes at run time. Trying to position //controls in this control with the autoscroll property set to True is problematic. this.m_xpanderPanelList.AutoScroll = false; } /// /// This member overrides ParentControlDesigner.ActionLists /// public override DesignerActionListCollection ActionLists { get { // Create action list collection DesignerActionListCollection actionLists = new DesignerActionListCollection(); // Add custom action list actionLists.Add(new XPanderPanelListDesignerActionList(this.Component)); // Return to the designer action service return actionLists; } } #endregion #region MethodsProtected /// /// Releases the unmanaged resources used by the XPanderPanelDesigner, /// and optionally releases the managed resources. /// /// true to release both managed and unmanaged resources; /// false to release only unmanaged resources. protected override void Dispose(bool disposing) { try { if(disposing) { if(this.m_borderPen != null) { this.m_borderPen.Dispose(); } } } finally { base.Dispose(disposing); } } /// /// Receives a call when the control that the designer is managing has painted its surface so the designer can /// paint any additional adornments on top of the xpanderpanel. /// /// A PaintEventArgs the designer can use to draw on the xpanderpanel. protected override void OnPaintAdornments(PaintEventArgs e) { base.OnPaintAdornments(e); e.Graphics.DrawRectangle(this.m_borderPen, 0, 0, this.m_xpanderPanelList.Width - 2, this.m_xpanderPanelList.Height - 2); } #endregion } #endregion #region Class XPanderPanelListDesignerActionList /// /// Provides the class for types that define a list of items used to create a smart tag panel for the XPanderPanelList. /// public class XPanderPanelListDesignerActionList : DesignerActionList { #region Properties /// /// Gets a collecion of XPanderPanel objects /// [Editor(typeof(XPanderPanelCollectionEditor), typeof(UITypeEditor))] public XPanderPanelCollection XPanderPanels { get { return this.XPanderPanelList.XPanderPanels; } } /// /// Gets or sets the style of the panel. /// public PanelStyle PanelStyle { get { return this.XPanderPanelList.PanelStyle; } set { SetProperty("PanelStyle", value); } } /// /// Gets or sets the color schema which is used for the panel. /// public ColorScheme ColorScheme { get { return this.XPanderPanelList.ColorScheme; } set { SetProperty("ColorScheme", value); } } /// /// Gets or sets the style of the caption (not for PanelStyle.Aqua). /// public CaptionStyle CaptionStyle { get { return this.XPanderPanelList.CaptionStyle; } set { SetProperty("CaptionStyle", value); } } /// /// Gets or sets a value indicating whether the control shows a border. /// public bool ShowBorder { get { return this.XPanderPanelList.ShowBorder; } set { SetProperty("ShowBorder", value); } } /// /// Gets or sets a value indicating whether the expand icon is visible /// public bool ShowExpandIcon { get { return this.XPanderPanelList.ShowExpandIcon; } set { SetProperty("ShowExpandIcon", value); } } /// /// Gets or sets a value indicating whether the close icon is visible /// public bool ShowCloseIcon { get { return this.XPanderPanelList.ShowCloseIcon; } set { SetProperty("ShowCloseIcon", value); } } #endregion #region MethodsPublic /// /// Initializes a new instance of the XPanderPanelListDesignerActionList class. /// /// A component related to the DesignerActionList. public XPanderPanelListDesignerActionList(System.ComponentModel.IComponent component) : base(component) { // Automatically display smart tag panel when // design-time component is dropped onto the // Windows Forms Designer base.AutoShow = true; } /// /// Returns the collection of DesignerActionItem objects contained in the list. /// /// A DesignerActionItem array that contains the items in this list. public override DesignerActionItemCollection GetSortedActionItems() { // Create list to store designer action items DesignerActionItemCollection actionItems = new DesignerActionItemCollection(); actionItems.Add( new DesignerActionMethodItem( this, "ToggleDockStyle", GetDockStyleText(), "Design", "Dock or undock this control in it's parent container.", true)); actionItems.Add( new DesignerActionPropertyItem( "ShowBorder", "Show Border", GetCategory(this.XPanderPanelList, "ShowBorder"))); actionItems.Add( new DesignerActionPropertyItem( "ShowExpandIcon", "Show ExpandIcon", GetCategory(this.XPanderPanelList, "ShowExpandIcon"))); actionItems.Add( new DesignerActionPropertyItem( "ShowCloseIcon", "Show CloseIcon", GetCategory(this.XPanderPanelList, "ShowCloseIcon"))); actionItems.Add( new DesignerActionPropertyItem( "PanelStyle", "Select PanelStyle", GetCategory(this.XPanderPanelList, "PanelStyle"))); actionItems.Add( new DesignerActionPropertyItem( "ColorScheme", "Select ColorScheme", GetCategory(this.XPanderPanelList, "ColorScheme"))); actionItems.Add( new DesignerActionPropertyItem( "CaptionStyle", "Select CaptionStyle", GetCategory(this.XPanderPanelList, "CaptionStyle"))); actionItems.Add( new DesignerActionPropertyItem( "XPanderPanels", "Edit XPanderPanels", GetCategory(this.XPanderPanelList, "XPanderPanels"))); return actionItems; } /// /// Dock/Undock designer action method implementation /// public void ToggleDockStyle() { // Toggle ClockControl's Dock property if(this.XPanderPanelList.Dock != DockStyle.Fill) { SetProperty("Dock", DockStyle.Fill); } else { SetProperty("Dock", DockStyle.None); } } #endregion #region MethodsPrivate /// /// Helper method that returns an appropriate display name for the Dock/Undock property, /// based on the ClockControl's current Dock property value /// /// the string to display private string GetDockStyleText() { if(this.XPanderPanelList.Dock == DockStyle.Fill) { return "Undock in parent container"; } else { return "Dock in parent container"; } } private XPanderPanelList XPanderPanelList { get { return (XPanderPanelList) this.Component; } } // Helper method to safely set a component’s property private void SetProperty(string propertyName, object value) { // Get property System.ComponentModel.PropertyDescriptor property = System.ComponentModel.TypeDescriptor.GetProperties(this.XPanderPanelList)[propertyName]; // Set property value property.SetValue(this.XPanderPanelList, value); } // Helper method to return the Category string from a // CategoryAttribute assigned to a property exposed by //the specified object private static string GetCategory(object source, string propertyName) { System.Reflection.PropertyInfo property = source.GetType().GetProperty(propertyName); CategoryAttribute attribute = (CategoryAttribute) property.GetCustomAttributes(typeof(CategoryAttribute), false)[0]; if(attribute == null) { return null; } else { return attribute.Category; } } #endregion } #endregion #region Class XPanderPanelCollection /// /// Contains a collection of XPanderPanel objects. /// [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1010:CollectionsShouldImplementGenericInterface")] public sealed class XPanderPanelCollection : IList, ICollection, IEnumerable { #region FieldsPrivate private XPanderPanelList m_xpanderPanelList; private Control.ControlCollection m_controlCollection; #endregion #region Constructor internal XPanderPanelCollection(XPanderPanelList xpanderPanelList) { this.m_xpanderPanelList = xpanderPanelList; this.m_controlCollection = this.m_xpanderPanelList.Controls; } #endregion #region Properties /// /// Gets or sets a XPanderPanel in the collection. /// /// The zero-based index of the XPanderPanel to get or set. /// The xPanderPanel at the specified index. public XPanderPanel this[int index] { get { return (XPanderPanel) this.m_controlCollection[index] as XPanderPanel; } } #endregion #region MethodsPublic /// /// Determines whether the XPanderPanelCollection contains a specific XPanderPanel /// /// The XPanderPanel to locate in the XPanderPanelCollection /// true if the XPanderPanelCollection contains the specified value; otherwise, false. public bool Contains(XPanderPanel xpanderPanel) { return this.m_controlCollection.Contains(xpanderPanel); } /// /// Adds a XPanderPanel to the collection. /// /// The XPanderPanel to add. public void Add(XPanderPanel xpanderPanel) { this.m_controlCollection.Add(xpanderPanel); this.m_xpanderPanelList.Invalidate(); } /// /// Removes the first occurrence of a specific XPanderPanel from the XPanderPanelCollection /// /// The XPanderPanel to remove from the XPanderPanelCollection public void Remove(XPanderPanel xpanderPanel) { this.m_controlCollection.Remove(xpanderPanel); } /// /// Removes all the XPanderPanels from the collection. /// public void Clear() { this.m_controlCollection.Clear(); } /// /// Gets the number of XPanderPanels in the collection. /// public int Count { get { return this.m_controlCollection.Count; } } /// /// Gets a value indicating whether the collection is read-only. /// public bool IsReadOnly { get { return this.m_controlCollection.IsReadOnly; } } /// /// Returns an enumeration of all the XPanderPanels in the collection. /// /// public IEnumerator GetEnumerator() { return this.m_controlCollection.GetEnumerator(); } /// /// Returns the index of the specified XPanderPanel in the collection. /// /// The xpanderPanel to find the index of. /// The index of the xpanderPanel, or -1 if the xpanderPanel is not in the ControlCollection instance. public int IndexOf(XPanderPanel xpanderPanel) { return this.m_controlCollection.IndexOf(xpanderPanel); } /// /// Removes the XPanderPanel at the specified index from the collection. /// /// The zero-based index of the xpanderPanel to remove from the ControlCollection instance. public void RemoveAt(int index) { this.m_controlCollection.RemoveAt(index); } /// /// Inserts an XPanderPanel to the collection at the specified index. /// /// The zero-based index at which value should be inserted. /// The XPanderPanel to insert into the Collection. public void Insert(int index, XPanderPanel xpanderPanel) { ((IList) this).Insert(index, (object) xpanderPanel); } /// /// Copies the elements of the collection to an Array, starting at a particular Array index. /// /// The one-dimensional Array that is the destination of the elements copied from ICollection. /// The Array must have zero-based indexing. /// /// The zero-based index in array at which copying begins. public void CopyTo(XPanderPanel[] xpanderPanels, int index) { this.m_controlCollection.CopyTo(xpanderPanels, index); } #endregion #region Interface ICollection /// /// Gets the number of elements contained in the ICollection. /// int ICollection.Count { get { return this.Count; } } /// /// Gets a value indicating whether access to the ICollection is synchronized /// bool ICollection.IsSynchronized { get { return ((ICollection) this.m_controlCollection).IsSynchronized; } } /// /// Gets an object that can be used to synchronize access to the ICollection. /// object ICollection.SyncRoot { get { return ((ICollection) this.m_controlCollection).SyncRoot; } } /// /// Copies the elements of the ICollection to an Array, starting at a particular Array index. /// /// The one-dimensional Array that is the destination of the elements copied from ICollection. The Array must have zero-based indexing. /// The zero-based index in array at which copying begins. void ICollection.CopyTo(Array array, int index) { ((ICollection) this.m_controlCollection).CopyTo(array, index); } #endregion #region Interface IList /// /// Gets or sets the element at the specified index. /// /// The zero-based index of the element to get or set. /// The element at the specified index. object IList.this[int index] { get { return this.m_controlCollection[index]; } set { } } /// /// Adds an item to the IList. /// /// The Object to add to the IList. /// The position into which the new element was inserted. int IList.Add(object value) { XPanderPanel xpanderPanel = value as XPanderPanel; if(xpanderPanel == null) { throw new ArgumentException(string.Format(System.Globalization.CultureInfo.CurrentUICulture, Resources.IDS_ArgumentException, typeof(XPanderPanel).Name)); } this.Add(xpanderPanel); return this.IndexOf(xpanderPanel); } /// /// Determines whether the IList contains a specific value. /// /// The Object to locate in the IList. /// true if the Object is found in the IList; otherwise, false. bool IList.Contains(object value) { return this.Contains(value as XPanderPanel); } /// /// Determines the index of a specific item in the IList. /// /// The Object to locate in the IList. /// The index of value if found in the list; otherwise, -1. int IList.IndexOf(object value) { return this.IndexOf(value as XPanderPanel); } /// /// Inserts an item to the IList at the specified index. /// /// The zero-based index of the item to insert. /// The Object to insert into the IList. void IList.Insert(int index, object value) { if((value is XPanderPanel) == false) { throw new ArgumentException( string.Format(System.Globalization.CultureInfo.CurrentUICulture, Resources.IDS_ArgumentException, typeof(XPanderPanel).Name)); } } /// /// Removes the first occurrence of a specific object from the IList. /// /// The Object to remove from the IList. void IList.Remove(object value) { this.Remove(value as XPanderPanel); } /// /// Removes the IList item at the specified index. /// /// The zero-based index of the item to remove. void IList.RemoveAt(int index) { this.RemoveAt(index); } /// /// Gets a value indicating whether the IList is read-only. /// bool IList.IsReadOnly { get { return this.IsReadOnly; } } /// /// Gets a value indicating whether the IList has a fixed size. /// bool IList.IsFixedSize { get { return ((IList) this.m_controlCollection).IsFixedSize; } } #endregion } #endregion #region Class XPanderPanelCollectionEditor /// /// Provides a user interface that can edit most types of collections at design time. /// internal class XPanderPanelCollectionEditor : CollectionEditor { #region FieldsPrivate private CollectionForm m_collectionForm; #endregion #region MethodsPublic /// /// Initializes a new instance of the XPanderPanelCollectionEditor class /// using the specified collection type. /// /// The type of the collection for this editor to edit. public XPanderPanelCollectionEditor(Type type) : base(type) { } #endregion #region MethodsProtected /// /// Creates a new form to display and edit the current collection. /// /// A CollectionEditor.CollectionForm to provide as the user interface for editing the collection. protected override CollectionForm CreateCollectionForm() { this.m_collectionForm = base.CreateCollectionForm(); return this.m_collectionForm; } /// /// Creates a new instance of the specified collection item type. /// /// The type of item to create. /// A new instance of the specified object. protected override Object CreateInstance(Type ItemType) { /* you can create the new instance yourself * ComplexItem ci=new ComplexItem(2,"ComplexItem",null); * we know for sure that the itemType it will always be ComplexItem *but this time let it to do the job... */ BSE.Windows.Forms.XPanderPanel xpanderPanel = (BSE.Windows.Forms.XPanderPanel) base.CreateInstance(ItemType); if(this.Context.Instance != null) { xpanderPanel.Expand = true; } return xpanderPanel; } #endregion } #endregion }