基本信息
源码名称:C# 类似vs(Visual Studio) 属性设置效果 winform示例源码下载
源码大小:0.08M
文件格式:.rar
开发语言:C#
更新时间:2013-10-02
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
/* * Copyright ?2005, Patrik Bohman * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. */ using System; using System.Collections; using System.ComponentModel; using System.ComponentModel.Design; using System.ComponentModel.Design.Serialization; using System.Drawing; using System.Drawing.Design; using System.Drawing.Drawing2D; using System.Data; using System.Windows.Forms; using System.Windows.Forms.Design; using System.Runtime.Serialization; using System.Security.Permissions; using System.Diagnostics; using System.Runtime.InteropServices; namespace Pabo.MozBar { #region Enumerations public enum MozPaneStyle {Vertical = 0, Horizontal = 1 } public enum MozSelectButton {Any = 0, Left = 1, Middle = 2, Right = 3 } public enum MozItemColor { Background = 0, Border = 1, Text = 2, FocusBackground = 3, FocusBorder = 4, SelectedBackground = 5, SelectedBorder = 6, Divider = 7, SelectedText = 8, FocusText = 9 } #endregion #region Delegates public delegate void ItemColorChangedEventHandler(object sender, ItemColorChangedEventArgs e); public delegate void ItemBorderStyleChangedEventHandler(object sender, ItemBorderStyleChangedEventArgs e); #endregion /// <summary> /// Summary description for MozPane. /// </summary> [DesignerAttribute(typeof(MozPaneDesigner))] [ToolboxItem(true)] [DefaultEvent("ItemClick")] [ToolboxBitmap(typeof(MozPane),"Pabo.MozBar.MozPane.bmp")] public class MozPane : ScrollableControlWithScrollEvents , ISupportInitialize { #region Win32 API functions [DllImport("user32.dll")] private static extern int ShowScrollBar(IntPtr hWnd, int wBar, int bShow); [DllImport("user32", CharSet=CharSet.Auto)] private static extern int GetWindowLong(IntPtr hwnd, int nIndex); #endregion #region Win32 API constants private const int WM_THEMECHANGED = 0x031A; private const int WM_KEYDOWN = 0x100; private const int SB_HORZ = 0; private const int SB_VERT = 1; private const int SB_CTL = 2; private const int SB_BOTH = 3; private const int WM_NCCALCSIZE = 0x83; private const int WS_HSCROLL = 0x100000; private const int WS_VSCROLL = 0x200000; private const int GWL_STYLE = (-16); #endregion #region EventHandlers [Browsable(true)] [Category("Property Changed")] [Description("Indicates that an item color has changed.")] public event ItemColorChangedEventHandler ItemColorChanged; [Browsable(true)] [Category("Property Changed")] [Description("Indicates that an item borderstyle has changed.")] public event ItemBorderStyleChangedEventHandler ItemBorderStyleChanged; [Browsable(true)] [Category("Property Changed")] [Description("Indicates that the border color was changed.")] public event EventHandler BorderColorChanged; [Browsable(true)] [Category("Property Changed")] [Description("Indicates that the Theme setting was changed.")] public event EventHandler UseThemeChanged; [Browsable(true)] [Category("Property Changed")] [Description("Indicates that the select button was changed.")] public event EventHandler SelectButtonChanged; [Browsable(true)] [Category("Property Changed")] [Description("Indicates that the imagelist has has been changed.")] public event EventHandler ImageListChanged; [Browsable(true)] [Category("Property Changed")] [Description("Indicates that the style has been changed.")] public event EventHandler PaneStyleChanged; [Browsable(true)] [Category("Property Changed")] [Description("Indicates that the toggle property has been changed.")] public event EventHandler ToggleChanged; [Browsable(true)] [Category("Property Changed")] [Description("Indicates the max allowed number of selected items has changed.")] public event EventHandler MaxSelectedItemsChanged; [Browsable(true)] [Category("Property Changed")] [Description("Indicates that the padding has has been changed.")] public event EventHandler PaddingChanged; [Category("Panel")] [Description("Indicates that an item was added to the panel.")] [Browsable(true)] public event MozItemEventHandler ItemAdded; [Category("Panel")] [Description("Indicates that an item was removed from the panel.")] [Browsable(true)] public event MozItemEventHandler ItemRemoved; [Category("Action")] [Description("Indicates that an item was selected.")] [Browsable(true)] public event MozItemEventHandler ItemSelected; [Category("Action")] [Description("Indicates that an item was unselected.")] [Browsable(true)] public event MozItemEventHandler ItemDeselected; [Category("Action")] [Description("Indicates that an item lost focus.")] [Browsable(true)] public event MozItemEventHandler ItemLostFocus; [Category("Action")] [Description("Indicates that an item recieved focus.")] [Browsable(true)] public event MozItemEventHandler ItemGotFocus; [Category("Action")] [Description("Indicates that an item has been double clicked.")] [Browsable(true)] public event MozItemClickEventHandler ItemDoubleClick; [Category("Action")] [Description("Indicates that an item has been clicked.")] [Browsable(true)] public event MozItemClickEventHandler ItemClick; #endregion #region private class members private System.ComponentModel.Container components = null; private bool layout; private int beginUpdateCount; internal bool deserializing; internal bool initialising; private int m_tabIndex = -1; private MozItem m_mouseOverItem = null; private Color m_borderColor; private PaddingCollection m_padding; private ColorCollection m_colorCollection; private BorderStyleCollection m_borderStyleCollection; private MozSelectButton m_selectButton; private ThemeManager m_themeManager; private MozPaneStyle m_style; private IntPtr m_theme; private bool m_useTheme; private bool m_toggle; private int m_maxSelectedItems; private int m_selectedItems; private ButtonBorderStyle m_borderStyle; private ImageList m_imageList = null; private MozPane.MozItemCollection m_mozItemCollection; #endregion #region Constructor public MozPane() { // This call is required by the Windows.Forms Form Designer. InitializeComponent(); // TODO: remove the following lines after you know the resource names // This call is required by the Windows.Forms Form Designer. components = new System.ComponentModel.Container(); this.SetStyle(ControlStyles.DoubleBuffer, true); this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); this.SetStyle(ControlStyles.UserPaint, true); this.SetStyle(ControlStyles.ResizeRedraw, true); this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); this.SetStyle(ControlStyles.ContainerControl,true); this.m_mozItemCollection = new MozItemCollection(this); // Enable Autoscroll this.AutoScroll = true; m_padding = new PaddingCollection(this); m_colorCollection = new ColorCollection(this); m_borderStyleCollection = new BorderStyleCollection(this); m_themeManager = new ThemeManager(); m_selectButton = MozSelectButton.Left; m_style = MozPaneStyle.Vertical; m_toggle = false; m_maxSelectedItems = 1; m_selectedItems = 0; m_useTheme = false; m_theme = IntPtr.Zero; // Listen for changes to the parent this.ParentChanged = new EventHandler(this.OnParentChanged); this.beginUpdateCount = 0; this.deserializing = false; this.initialising = false; m_borderColor = Color.FromArgb(127,157,185); this.BackColor = Color.White; m_borderStyle = ButtonBorderStyle.Solid; } #endregion #region Dispose /// <summary> /// Clean up any resources being used. /// </summary> protected override void Dispose( bool disposing ) { if( disposing ) { if( components != null ) components.Dispose(); m_colorCollection.Dispose(); m_borderStyleCollection.Dispose(); } base.Dispose( disposing ); } #endregion #region properties [DefaultValue(typeof(Color),"White")] public override Color BackColor { get { return base.BackColor; } set { base.BackColor = value; } } [Category("Behavior")] [Description("Mouse button used to select items.")] [DefaultValue(typeof(MozSelectButton),"Left")] public MozSelectButton SelectButton { get { return m_selectButton; } set { if (m_selectButton!=value) { m_selectButton = value; if (this.SelectButtonChanged !=null) this.SelectButtonChanged(this,new EventArgs()); } } } [Category("Behavior")] [Description("Indicates wether the control should use the current theme.")] [DefaultValue(false)] public bool Theme { get { return m_useTheme; } set { if (m_useTheme!=value) { m_useTheme = value; if (this.UseThemeChanged !=null) this.UseThemeChanged(this,new EventArgs()); if (m_useTheme) GetThemeColors(); } } } [Browsable(true)] [Category("Behavior")] [RefreshProperties(RefreshProperties.All)] [Description("Indicates the possibility to toggle items i.e. unselect selected items.")] [DefaultValue(false)] public bool Toggle { get { return m_toggle; } set { // Check if new value differs from old one if (value!=m_toggle) { m_toggle = value; if (value == false) MaxSelectedItems = 1; if (this.ToggleChanged!=null) this.ToggleChanged(this,new EventArgs()); } } } [Browsable(true)] [Category("Behavior")] [Description("Max number of selected items.")] [DefaultValue(1)] public int MaxSelectedItems { get { return m_maxSelectedItems; } set { if (value!=m_maxSelectedItems) { if (value<1) value = 1; if (value>Items.Count) value = Items.Count; m_maxSelectedItems = value; if (this.MaxSelectedItemsChanged!=null) this.MaxSelectedItemsChanged(this,new EventArgs()); } } } // Returns number of selected item in the panel [Browsable(false)] public int SelectedItems { get { return m_selectedItems; } } [Browsable(true)] [Category("Appearance")] [Description("Colors for various states.")] [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public ColorCollection ItemColors { get { return m_colorCollection; } set { if (value != null) m_colorCollection = value; } } [Browsable(true)] [Category("Appearance")] [Description("Various border styles.")] [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public BorderStyleCollection ItemBorderStyles { get { return m_borderStyleCollection; } set { if ((value != null) && (value !=m_borderStyleCollection)) m_borderStyleCollection = value; } } [Browsable(true)] [Category("Appearance")] [Description("Padding (Horizontal, Vertical)")] [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public PaddingCollection Padding { get { return m_padding; } set { if (value!=m_padding) { if (value != null) m_padding = value; DoLayout(); Invalidate(); if (this.PaddingChanged!=null) this.PaddingChanged(this,new EventArgs()); } } } [Browsable(true)] [Category("Appearance")] [DefaultValue(typeof(MozPaneStyle),"Vertical")] [Description("Pane style.")] public MozPaneStyle Style { get { return m_style; } set { if (m_style !=value) { m_style = value; // for each control in our list... for (int i=0; i<this.Items.Count; i ) { // force layout change this.Items[i].DoLayout(); this.Invalidate(); } DoLayout(); Invalidate(); if (this.PaneStyleChanged!=null) this.PaneStyleChanged(this,new EventArgs()); } } } [Browsable(true)] [Category("Behavior")] [Description("The imagelist that contains images used by the MozBar.")] public ImageList ImageList { get { return m_imageList; } set { if (m_imageList != value) { m_imageList = value; // for each control in our list... for (int i=0; i<this.Items.Count; i ) { // reset all images this.Items[i].Images.NormalImage = null; this.Items[i].Images.FocusImage = null; this.Items[i].Images.SelectedImage = null; //redo layout (size might have changed..) this.Items[i].DoLayout(); this.Invalidate(); } if (this.ImageListChanged!=null) ImageListChanged(this,new EventArgs()); this.DoLayout(); Invalidate(); } } } [Browsable(true)] [Category("Appearance")] [DefaultValue(typeof(ButtonBorderStyle),"Solid")] [Description("Border color for panel.")] public ButtonBorderStyle BorderStyle { get { return m_borderStyle; } set { if (m_borderStyle!=value) { m_borderStyle = value; Invalidate(); } } } [Browsable(true)] [Category("Appearance")] [DefaultValue(typeof(Color),"127,157,185")] [Description("Border color for panel.")] public Color BorderColor { get { return m_borderColor; } set { if (value!=m_borderColor) { m_borderColor = value; if (this.BorderColorChanged!=null) BorderColorChanged(this,new EventArgs()); Invalidate(); } } } [Category("Behavior")] [DefaultValue(null)] [Description("The Items contained in the Panel."),] [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] [Editor(typeof(MozPane.MozItemCollectionEditor), typeof(UITypeEditor))] public MozPane.MozItemCollection Items { get { return this.m_mozItemCollection; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public new Control.ControlCollection Controls { get { return base.Controls; } } // obsolete properties [Browsable(false)] [EditorBrowsable(EditorBrowsableState.Never)] [ObsoleteAttribute("This property is not supported",true)] public override Image BackgroundImage { get { return base.BackgroundImage; } set { base.BackgroundImage = value; } } [Browsable(false)] [EditorBrowsable(EditorBrowsableState.Never)] [ObsoleteAttribute("This property is not supported",true)] public override RightToLeft RightToLeft { get { return base.RightToLeft; } set { base.RightToLeft = value; } } [Browsable(false)] [EditorBrowsable(EditorBrowsableState.Never)] [ObsoleteAttribute("This property is not supported",true)] public override string Text { get { return base.Text; } set { base.Text = value; } } [Browsable(false)] [EditorBrowsable(EditorBrowsableState.Never)] [ObsoleteAttribute("This property is not supported",true)] public override Color ForeColor { get { return base.ForeColor; } set { base.ForeColor = value; } } [Browsable(false)] [EditorBrowsable(EditorBrowsableState.Never)] [ObsoleteAttribute("This property is not supported",true)] public override bool AutoScroll { get { return base.AutoScroll; } set { base.AutoScroll = true; } } #endregion #region Events protected override void OnGotFocus(EventArgs e) { base.OnGotFocus (e); if (m_tabIndex==-1) m_tabIndex = 0; RemoveFocus(); if (Items.Count>=1) if (Items[m_tabIndex].state!=MozItemState.Selected) { Items[m_tabIndex].state = MozItemState.Focus; ScrollControlIntoView(Items[m_tabIndex]); } } protected override void OnLostFocus(EventArgs e) { base.OnLostFocus (e); RemoveFocus(); m_tabIndex = -1; } //protected override onp protected override void OnKeyDown(KeyEventArgs e) { base.OnKeyDown (e); switch (e.KeyCode) { case Keys.Enter: // Enter case Keys.Space: { if (m_tabIndex!=-1) SelectItem(m_tabIndex); break; } case Keys.Down: case Keys.Right: case Keys.Tab: { // Move tabindex one step forward. m_tabIndex ; if ((m_tabIndex < Items.Count) && (m_tabIndex >0)) { RemoveFocus(); if (Items[m_tabIndex].state!=MozItemState.Selected) Items[m_tabIndex].state = MozItemState.Focus; ScrollControlIntoView(Items[m_tabIndex]); } else this.SelectNextControl(this,true,true,true,true); break; } case Keys.Up: case Keys.Left: { // Move tabindex one step backward m_tabIndex--; if ((m_tabIndex >= 0) && (m_tabIndex <Items.Count)) { RemoveFocus(); if (Items[m_tabIndex].state!=MozItemState.Selected) Items[m_tabIndex].state = MozItemState.Focus; ScrollControlIntoView(Items[m_tabIndex]); } else this.SelectNextControl(this,false,true,true,true); break; } } } public override bool PreProcessMessage(ref Message msg) { // Check if message is KEY_DOWN if (msg.Msg == WM_KEYDOWN) { Keys keyData = ((Keys) (int) msg.WParam) |ModifierKeys; Keys keyCode = ((Keys) (int) msg.WParam); // Make sure we handle certain keys switch(keyCode) { // Keys used to move forward i list case Keys.Down: case Keys.Right: case Keys.Tab: { // If not at the end handle message if (m_tabIndex < Items.Count-1) return false; //Cant go any further backwards , do not handle message; m_tabIndex = -1; break; } // Keys used to move backwards in list case Keys.Up: case Keys.Left: { // If not at the end handle message if (m_tabIndex >0) return false; //Cant go any further foreward , do not handle message; m_tabIndex = -1; break; } default: break; } } return base.PreProcessMessage (ref msg); } protected override void OnSystemColorsChanged(EventArgs e) { base.OnSystemColorsChanged (e); if (Theme) GetThemeColors(); } protected override void WndProc(ref Message m) { base.WndProc (ref m); switch (m.Msg) { case WM_THEMECHANGED: { // Theme has changed , get new colors if Theme = true if (Theme) GetThemeColors(); break; } case WM_NCCALCSIZE: { if (this.Style == MozPaneStyle.Vertical) { // hide horizontal scrollbar ShowScrollBar(m.HWnd, SB_HORZ, 0); } else { // hide vertical scrollbar ShowScrollBar(m.HWnd, SB_VERT, 0); } break; } } } protected override void OnSizeChanged(EventArgs e) { base.OnSizeChanged (e); this.AutoScroll = false; this.AutoScroll = true; } protected override void OnPaint(PaintEventArgs e) { ButtonBorderStyle leftStyle = m_borderStyle; ButtonBorderStyle topStyle = m_borderStyle; ButtonBorderStyle rightStyle = m_borderStyle; ButtonBorderStyle bottomStyle = m_borderStyle; base.OnPaint(e); Rectangle borderRect = new Rectangle(); borderRect = this.DisplayRectangle; Brush bgBrush = new SolidBrush(this.BackColor); // Draw background and border e.Graphics.FillRectangle(bgBrush,this.DisplayRectangle); if (this.Style == MozPaneStyle.Vertical) { if (IsVerticalScrollBarVisible()) { topStyle = ButtonBorderStyle.None; bottomStyle = ButtonBorderStyle.None; } } else { if (IsHorizontalScrollBarVisible()) { leftStyle = ButtonBorderStyle.None; rightStyle = ButtonBorderStyle.None; } } ControlPaint.DrawBorder(e.Graphics,borderRect , m_borderColor,1,leftStyle, // left m_borderColor,1,topStyle, // top m_borderColor,1,rightStyle, // right m_borderColor,1,bottomStyle); //bottom // clean up bgBrush.Dispose(); } private void OnParentChanged(object sender, EventArgs e) { if (this.Parent != null) { this.Parent.VisibleChanged = new EventHandler(this.OnParentVisibleChanged); } } private void OnParentVisibleChanged(object sender, EventArgs e) { if (sender != this.Parent) { ((Control) sender).VisibleChanged -= new EventHandler(this.OnParentVisibleChanged); return; } if (this.Parent.Visible) { this.DoLayout(); } } protected override void OnResize(EventArgs e) { // size has changed , force layout change this.DoLayout(); Invalidate(true); } private void MozItem_GotFocus(object sender, MozItemEventArgs e) { //Check if item is selected if (e.MozItem.state != MozItemState.Selected) { // if not set its state to focus e.MozItem.state = MozItemState.Focus; m_mouseOverItem = e.MozItem; if (ItemGotFocus != null) ItemGotFocus(this,e); } } private void MozItem_LostFocus(object sender, MozItemEventArgs e) { // check if item is selected if (e.MozItem.state != MozItemState.Selected) { // if not set its state to normal e.MozItem.state = MozItemState.Normal; m_mouseOverItem = null; if (ItemLostFocus != null) ItemLostFocus(this,e); } } private void MozItem_Click(object sender, MozItemClickEventArgs e) { // Fire click event and then ... if (ItemClick != null) ItemClick(this,e); // Try to select item if the proper button was used. if ((e.Button.ToString() == SelectButton.ToString()) || (SelectButton == MozSelectButton.Any)) { m_tabIndex = Items.IndexOf(e.MozItem); this.Focus(); SelectItem(Items.IndexOf(e.MozItem)); } } private void MozItem_DoubleClick(object sender, MozItemClickEventArgs e) { if (ItemDoubleClick != null) ItemDoubleClick(this,e); } protected override void OnControlAdded(ControlEventArgs e) { // check if control is a MozItem if ((e.Control as MozItem) == null) { // If not remove and... this.Controls.Remove(e.Control); // throw exception throw new InvalidCastException("Only MozItem's can be added to the MozPane"); } base.OnControlAdded(e); // Check if item exists in collection if (!this.Items.Contains((MozItem) e.Control)) { // if not add it this.Items.Add((MozItem) e.Control); } // Refresh Invalidate(); } protected override void OnControlRemoved(ControlEventArgs e) { base.OnControlRemoved (e); // Check if item is in collection if (this.Items.Contains(e.Control)) { // If it is , remove it this.Items.Remove((MozItem) e.Control); } // Refresh Invalidate(); } protected virtual void OnMozItemAdded(MozItemEventArgs e) { if (!this.Controls.Contains(e.MozItem)) { this.Controls.Add(e.MozItem); } // tell the MozItem who's its daddy... e.MozItem.MozPane = this; // listen for events e.MozItem.ItemGotFocus =new MozItemEventHandler(MozItem_GotFocus); e.MozItem.ItemLostFocus =new MozItemEventHandler(MozItem_LostFocus); e.MozItem.ItemClick =new MozItemClickEventHandler(MozItem_Click); e.MozItem.ItemDoubleClick = new MozItemClickEventHandler(MozItem_DoubleClick); // update the layout of the controls this.DoLayout(); if (ItemAdded != null) { ItemAdded(this, e); } } protected virtual void OnMozItemRemoved(MozItemEventArgs e) { if (this.Controls.Contains(e.MozItem)) { this.Controls.Remove(e.MozItem); } // remove event listeners e.MozItem.ItemGotFocus -=new MozItemEventHandler(MozItem_GotFocus); e.MozItem.ItemLostFocus -= new MozItemEventHandler(MozItem_LostFocus); e.MozItem.ItemClick -=new MozItemClickEventHandler(MozItem_Click); e.MozItem.ItemDoubleClick -= new MozItemClickEventHandler(MozItem_DoubleClick); // update the layout of the controls this.DoLayout(); if (ItemRemoved != null) { ItemRemoved(this, e); } } #endregion #region Methods #region ISupportInitialize Members /// <summary> /// Signals the MozPane that initialization is starting /// </summary> public void BeginInit() { this.initialising = true; } /// <summary> /// Signals the MozPane that initialization is complete /// </summary> public void EndInit() { this.initialising = false; //this.DoLayout(); } #endregion #region Layout public void DoLayout() { this.DoLayout(false); } public void DoLayout(bool performRealLayout) { if (this.layout || this.beginUpdateCount > 0 || this.deserializing) { return; } this.layout = true; this.SuspendLayout(); MozItem e; Point p; switch (m_style) { case MozPaneStyle.Vertical: // Vertical { // work out how wide to make the controls, and where // the top of the first control should be int y = this.DisplayRectangle.Y m_padding.Vertical; int width = this.ClientRectangle.Width - (2*m_padding.Horizontal); // for each control in our list... for (int i=0; i<this.Items.Count; i ) { e = this.Items[i]; // go to the next mozitem if this one is invisible and // it's parent is visible if (!e.Visible && e.Parent != null && e.Parent.Visible) { continue; } p = new Point(m_padding.Horizontal, y); // set the width and location of the control e.Location = p; e.Width = this.Width; // update the next starting point y = e.Height m_padding.Vertical; } break; } case MozPaneStyle.Horizontal: // Horizontal { int x = this.DisplayRectangle.X m_padding.Horizontal; int height = this.ClientRectangle.Height - (2*m_padding.Vertical); for (int i=0; i<this.Items.Count; i ) { e = this.Items[i]; if (!e.Visible && e.Parent != null && e.Parent.Visible) { continue; } p = new Point(x,m_padding.Vertical); e.Location = p; e.Height = height; x = e.Width m_padding.Horizontal; } break; } } // restart the layout engine this.ResumeLayout(performRealLayout); this.layout = false; } internal bool IsVerticalScrollBarVisible() { return (GetWindowLong(this.Handle, GWL_STYLE) & WS_VSCROLL) != 0; } internal bool IsHorizontalScrollBarVisible() { return (GetWindowLong(this.Handle, GWL_STYLE) & WS_HSCROLL) != 0; } internal void UpdateMozItems() { if (this.Items.Count == this.Controls.Count) { this.MatchControlCollToMozItemsColl(); return; } if (this.Items.Count > this.Controls.Count) { for (int i=0; i<this.Items.Count; i ) { if (!this.Controls.Contains(this.Items[i])) { this.OnMozItemAdded(new MozItemEventArgs(this.Items[i])); } } } else { int i = 0; MozItem mozItem; while (i < this.Controls.Count) { mozItem = (MozItem) this.Controls[i]; if (!this.Items.Contains(mozItem)) { this.OnMozItemRemoved(new MozItemEventArgs(mozItem)); } else { i ; } } } } internal void MatchControlCollToMozItemsColl() { this.SuspendLayout(); for (int i=0; i<this.Items.Count; i ) { this.Controls.SetChildIndex(this.Items[i], i); } this.ResumeLayout(false); this.DoLayout(true); this.Invalidate(true); } #endregion private void RemoveFocus() { for (int i = 0;i<Items.Count;i ) { if ((Items[i].state == MozItemState.Focus) && (Items[i] != m_mouseOverItem)) { Items[i].state = MozItemState.Normal; } } } private void GetThemeColors() { int EPB_HEADERBACKGROUND = 1; int EPB_NORMALGROUPBACKGROUND = 5; int TMT_GRADIENTCOLOR1 = 3810; int TMT_GRADIENTCOLOR2 = 3811; Color selectColor = new Color(); Color focusColor = new Color(); Color borderColor = new Color(); bool useSystemColors = false; // Check if themes are available if (m_themeManager._IsAppThemed()) { if (m_theme!=IntPtr.Zero) m_themeManager._CloseThemeData(m_theme); // Open themes for "ExplorerBar" m_theme = m_themeManager._OpenThemeData(this.Handle,"EXPLORERBAR"); if (m_theme!=IntPtr.Zero) { // Get Theme colors.. selectColor = m_themeManager._GetThemeColor(m_theme,EPB_HEADERBACKGROUND,1,TMT_GRADIENTCOLOR2); focusColor = m_themeManager._GetThemeColor(m_theme,EPB_NORMALGROUPBACKGROUND,1,TMT_GRADIENTCOLOR1); borderColor = ControlPaint.Light(selectColor); selectColor = ControlPaint.LightLight(selectColor); focusColor = ControlPaint.LightLight(selectColor); } else { useSystemColors = true; } } else { useSystemColors = true; } if (useSystemColors) { // Get System colors selectColor = SystemColors.ActiveCaption; focusColor = ControlPaint.Light(selectColor); borderColor = SystemColors.ActiveBorder; } // apply colors.. ItemColors.SelectedBorder = ControlPaint.Light(ControlPaint.Dark(selectColor)); this.BorderColor = borderColor; ItemColors.Divider = borderColor; ItemColors.SelectedBackground = selectColor; ItemColors.FocusBackground = focusColor; ItemColors.FocusBorder = selectColor; Invalidate(); } public void SelectItem(int index) { // Check if index is valid if (index >=0 && index <=Items.Count-1) { // Check if item is selected if (Items[index].state != MozItemState.Selected) { // Is it a divider ? if (Items[index].ItemStyle!=MozItemStyle.Divider) { // Check if toggle is enabled if (!Toggle) { // for each control in our list... for (int i=0; i<this.Items.Count; i ) { // set all items to not selected if ((Items[i]!=m_mouseOverItem) || (Items[i].state == MozItemState.Selected)) Items[i].state = MozItemState.Normal; } // No item is selected m_selectedItems=0; } // Check that the allowed number of selected items isnt exceeded if (m_maxSelectedItems >= m_selectedItems 1) { // set our item to selected Items[index].state = MozItemState.Selected; m_selectedItems ; // Scroll selected item into view ScrollControlIntoView(Items[index]); if (ItemSelected != null) ItemSelected(this,new MozItemEventArgs(Items[index])); } } } else { if (Toggle) { //unselect selected item by setting its state to Focus Items[index].state = MozItemState.Focus; m_selectedItems--; if (ItemDeselected != null) ItemDeselected(this,new MozItemEventArgs(Items[index])); } } } } public void SelectItem(string tag) { // loop through item collection for (int i=0; i<this.Items.Count; i ) { // if matching tag is found try to select item if (this.Items[i].Tag.ToString() == tag) SelectItem(i); } } #endregion #region Component Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { components = new System.ComponentModel.Container(); } #endregion #region MozItemsCollection /// <summary> /// Represents a collection of MozItem objects /// </summary> public class MozItemCollection : CollectionBase { #region Class Data /// <summary> /// The MozPane that owns this MozItemsCollection /// </summary> private MozPane owner; #endregion #region Constructor public MozItemCollection(MozPane owner) : base() { if (owner == null) { throw new ArgumentNullException("owner"); } this.owner = owner; } public MozItemCollection(MozPane owner, MozItemCollection mozItems) : this(owner) { this.Add(mozItems); } #endregion #region Methods public void Add(MozItem value) { if (value == null) { throw new ArgumentNullException("value"); } this.List.Add(value); if (this.owner != null && !this.owner.deserializing) { this.owner.Controls.Add(value); this.owner.OnMozItemAdded(new MozItemEventArgs(value)); } } public void AddRange(MozItem[] mozItems) { if (mozItems == null) { throw new ArgumentNullException("mozItems"); } for (int i=0; i<mozItems.Length; i ) { this.Add(mozItems[i]); } } public void Add(MozItemCollection mozItems) { if (mozItems == null) { throw new ArgumentNullException("mozItems"); } for (int i=0; i<mozItems.Count; i ) { this.Add(mozItems[i]); } } public new void Clear() { while (this.Count > 0) { this.RemoveAt(0); } } public bool Contains(MozItem mozItem) { if (mozItem == null) { throw new ArgumentNullException("mozItem"); } return (this.IndexOf(mozItem) != -1); } public bool Contains(Control control) { if (!(control is MozItem)) { return false; } return this.Contains((MozItem) control); } public int IndexOf(MozItem mozItem) { if (mozItem == null) { throw new ArgumentNullException("mozItem"); } for (int i=0; i<this.Count; i ) { if (this[i] == mozItem) { return i; } } return -1; } public void Remove(MozItem value) { if (value == null) { throw new ArgumentNullException("value"); } this.List.Remove(value); if (this.owner != null && !this.owner.deserializing) { this.owner.Controls.Remove(value); this.owner.OnMozItemRemoved(new MozItemEventArgs(value)); } } public new void RemoveAt(int index) { this.Remove(this[index]); } public void Move(MozItem value, int index) { if (value == null) { throw new ArgumentNullException("value"); } if (index < 0) { index = 0; } else if (index > this.Count) { index = this.Count; } if (!this.Contains(value) || this.IndexOf(value) == index) { return; } this.List.Remove(value); if (index > this.Count) { this.List.Add(value); } else { this.List.Insert(index, value); } if (this.owner != null && !this.owner.deserializing) { this.owner.MatchControlCollToMozItemsColl(); } } public void MoveToTop(MozItem value) { this.Move(value, 0); } public void MoveToBottom(MozItem value) { this.Move(value, this.Count); } #endregion #region Properties public virtual MozItem this[int index] { get { return this.List[index] as MozItem; } } #endregion } #endregion #region MozItemCollectionEditor /// <summary> /// A custom CollectionEditor for editing MozItemCollections /// </summary> internal class MozItemCollectionEditor : CollectionEditor { public MozItemCollectionEditor(Type type) : base(type) { } public override object EditValue(ITypeDescriptorContext context, IServiceProvider isp, object value) { MozPane originalControl = (MozPane) context.Instance; object returnObject = base.EditValue(context, isp, value); originalControl.UpdateMozItems(); return returnObject; } protected override object CreateInstance(Type itemType) { object mozItem = base.CreateInstance(itemType); ((MozItem) mozItem).Name = "MozItem"; return mozItem; } } #endregion #region PaddingCollection [TypeConverter(typeof(PaddingCollectionTypeConverter))] public class PaddingCollection { private MozPane m_pane; private int m_horizontal; private int m_vertical; public PaddingCollection(MozPane pane) { // set the control to which the collection belong m_pane = pane; // Default values m_horizontal = 2; m_vertical = 2; } [RefreshProperties(System.ComponentModel.RefreshProperties.All)] [Description("Horizontal padding.")] [DefaultValue(2)] public int Horizontal { get { return m_horizontal; } set { if (m_horizontal!=value) { m_horizontal = value; if (m_pane!=null) { // padding has changed , force DoLayout m_pane.DoLayout(); m_pane.Invalidate(); if (m_pane.PaddingChanged!=null) m_pane.PaddingChanged(this,new EventArgs()); } } } } [RefreshProperties(System.ComponentModel.RefreshProperties.All)] [Description("Vertical padding.")] [DefaultValue(2)] public int Vertical { get { return m_vertical; } set { if (m_vertical!=value) { m_vertical = value; if (m_pane!=null) { m_pane.DoLayout(); m_pane.Invalidate(); if (m_pane.PaddingChanged!=null) m_pane.PaddingChanged(this,new EventArgs()); } } } } } #endregion #region PaddingCollectionTypeConverter public class PaddingCollectionTypeConverter : ExpandableObjectConverter { public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) { if(sourceType == typeof(string)) return true; return base.CanConvertFrom (context, sourceType); } public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) { if(destinationType == typeof(string)) return true; return base.CanConvertTo (context, destinationType); } public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) { if(value.GetType() == typeof(string)) { // Parse property string string[] ss = value.ToString().Split(new char[] {';'}, 2); if (ss.Length==2) { // Create new PaddingCollection PaddingCollection item = new PaddingCollection((MozPane)context.Instance); // Set properties item.Horizontal = int.Parse(ss[0]); item.Vertical = int.Parse(ss[1]); return item; } } return base.ConvertFrom (context, culture, value); } public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType) { if(destinationType == typeof(string) && (value is MozPane.PaddingCollection) ) { // cast value to paddingCollection PaddingCollection dest = (PaddingCollection)value; // create property string return dest.Horizontal.ToString() "; " dest.Vertical.ToString(); } return base.ConvertTo (context, culture, value, destinationType); } } #endregion #region ColorCollection [TypeConverter(typeof(ItemCollectionTypeConverter))] public class ColorCollection { private Color m_selected; private Color m_selectedBorder; private Color m_focus; private Color m_focusBorder; private Color m_text; private Color m_back; private Color m_border; private Color m_divider; private Color m_selectedText; private Color m_focusText; public MozPane m_pane; public ColorCollection(MozPane pane) { m_pane = pane; // Default values m_selected = Color.FromArgb(193,210,238); m_selectedBorder = Color.FromArgb(49,106,197); m_focus = Color.FromArgb(224,232,246); m_focusBorder = Color.FromArgb(152,180,226); m_back = Color.White; m_border = Color.Black; m_text = Color.Black; m_selectedText = Color.Black; m_focusText = Color.Black; m_divider = Color.FromArgb(127,157,185); } public void Dispose() { } private void UpdateItems() { // for each item contained in the panel for (int i=0; i<m_pane.Items.Count; i ) { // Refresh item m_pane.Items[i].Invalidate(); } } [Description("Color used for item text.")] [DefaultValue(typeof(Color),"Black")] public Color Text { get { return m_text; } set { if (m_text!=value) { m_text = value; UpdateItems(); if (m_pane.ItemColorChanged!=null) m_pane.ItemColorChanged(this,new ItemColorChangedEventArgs(MozItemColor.Text)); } } } [Description("Text color when item is selected.")] [DefaultValue(typeof(Color),"Black")] public Color SelectedText { get { return m_selectedText; } set { if (m_selectedText!=value) { m_selectedText = value; UpdateItems(); if (m_pane.ItemColorChanged!=null) m_pane.ItemColorChanged(this,new ItemColorChangedEventArgs(MozItemColor.SelectedText)); } } } [Description("Text color when item has focus.")] [DefaultValue(typeof(Color),"Black")] public Color FocusText { get { return m_focusText; } set { if (m_focusText!=value) { m_focusText = value; UpdateItems(); if (m_pane.ItemColorChanged!=null) m_pane.ItemColorChanged(this,new ItemColorChangedEventArgs(MozItemColor.FocusText)); } } } [Description("Background color when item is not selected or has focus.")] [DefaultValue(typeof(Color),"White")] public Color Background { get { return m_back; } set { if (m_back!=value) { m_back = value; UpdateItems(); if (m_pane.ItemColorChanged!=null) m_pane.ItemColorChanged(this,new ItemColorChangedEventArgs(MozItemColor.Background)); } } } [Description("Border color when item is not selected or has focus.")] [DefaultValue(typeof(Color),"Black")] public Color Border { get { return m_border; } set { if (m_border!=value) { m_border = value; UpdateItems(); if (m_pane.ItemColorChanged!=null) m_pane.ItemColorChanged(this,new ItemColorChangedEventArgs(MozItemColor.Border)); } } } [Description("Color used when item style is set to divider.")] [DefaultValue(typeof(Color),"127,157,185")] public Color Divider { get { return m_divider; } set { if (m_divider!=value) { m_divider = value; UpdateItems(); if (m_pane.ItemColorChanged!=null) m_pane.ItemColorChanged(this,new ItemColorChangedEventArgs(MozItemColor.Divider)); } } } [Description("Background color when item is selected.")] [DefaultValue(typeof(Color),"193,210,238")] public Color SelectedBackground { get { return m_selected; } set { if (m_selected!=value) { m_selected = value; UpdateItems(); if (m_pane.ItemColorChanged!=null) m_pane.ItemColorChanged(this,new ItemColorChangedEventArgs(MozItemColor.SelectedBackground)); } } } [Description("Border color when item is selected.")] [DefaultValue(typeof(Color),"49,106,197")] public Color SelectedBorder { get { return m_selectedBorder; } set { if (m_selectedBorder!=value) { m_selectedBorder = value; UpdateItems(); if (m_pane.ItemColorChanged!=null) m_pane.ItemColorChanged(this,new ItemColorChangedEventArgs(MozItemColor.SelectedBorder)); } } } [Description("Background color when item has focus.")] [DefaultValue(typeof(Color),"224,232,246")] public Color FocusBackground { get { return m_focus; } set { if (m_focus!=value) { m_focus = value; UpdateItems(); if (m_pane.ItemColorChanged!=null) m_pane.ItemColorChanged(this,new ItemColorChangedEventArgs(MozItemColor.FocusBackground)); } } } [Description("Border color when item has focus.")] [DefaultValue(typeof(Color),"152,180,226")] public Color FocusBorder { get { return m_focusBorder; } set { if (m_focusBorder!=value) { m_focusBorder = value; UpdateItems(); if (m_pane.ItemColorChanged!=null) m_pane.ItemColorChanged(this,new ItemColorChangedEventArgs(MozItemColor.FocusBorder)); } } } } #endregion #region BorderStyleCollection [TypeConverter(typeof(ItemCollectionTypeConverter))] public class BorderStyleCollection { public MozPane m_pane; private ButtonBorderStyle m_borderStyle; private ButtonBorderStyle m_focusBorderStyle; private ButtonBorderStyle m_selectedBorderStyle; public BorderStyleCollection(MozPane pane) { m_pane = pane; m_borderStyle = ButtonBorderStyle.None; m_focusBorderStyle = ButtonBorderStyle.Solid; m_selectedBorderStyle = ButtonBorderStyle.Solid; } public void Dispose() { } private void UpdateItems() { // for each item contained in the panel for (int i=0; i<m_pane.Items.Count; i ) { // Refresh item m_pane.Items[i].Invalidate(); } } [Description("Border style when item has no focus.")] [DefaultValue(typeof(ButtonBorderStyle),"None")] public ButtonBorderStyle Normal { get { return m_borderStyle; } set { if (m_borderStyle!=value) { m_borderStyle = value; UpdateItems(); if (m_pane.ItemBorderStyleChanged!=null) m_pane.ItemBorderStyleChanged(this,new ItemBorderStyleChangedEventArgs(MozItemState.Normal)); } } } [Description("Border style when item has focus.")] [DefaultValue(typeof(ButtonBorderStyle),"Solid")] public ButtonBorderStyle Focus { get { return m_focusBorderStyle; } set { if (m_focusBorderStyle!=value) { m_focusBorderStyle = value; UpdateItems(); if (m_pane.ItemBorderStyleChanged!=null) m_pane.ItemBorderStyleChanged(this,new ItemBorderStyleChangedEventArgs(MozItemState.Focus)); } } } [Description("Border style when item is selected.")] [DefaultValue(typeof(ButtonBorderStyle),"Solid")] public ButtonBorderStyle Selected { get { return m_selectedBorderStyle; } set { if (m_selectedBorderStyle!=value) { m_selectedBorderStyle = value; UpdateItems(); if (m_pane.ItemBorderStyleChanged!=null) m_pane.ItemBorderStyleChanged(this,new ItemBorderStyleChangedEventArgs(MozItemState.Selected)); } } } } #endregion } #region Designer // ControlDesigner public class MozPaneDesigner : ScrollableControlDesigner { public MozPaneDesigner() { } public override void OnSetComponentDefaults() { base.OnSetComponentDefaults(); } public override SelectionRules SelectionRules { get { // Remove all manual resizing of the control SelectionRules selectionRules = base.SelectionRules; selectionRules = SelectionRules.Visible |SelectionRules.AllSizeable | SelectionRules.Moveable; return selectionRules; } } protected override void PreFilterProperties(System.Collections.IDictionary properties) { base.PreFilterProperties(properties); // Remove obsolete properties properties.Remove("BackgroundImage"); properties.Remove("ForeColor"); properties.Remove("Text"); properties.Remove("RightToLeft"); properties.Remove("ImeMode"); properties.Remove("AutoScroll"); } } #endregion #region ColorChangedEventArgs public class ItemColorChangedEventArgs : EventArgs { #region Class Data /// <summary> /// The color that has changed /// </summary> private MozItemColor m_color; #endregion #region Constructor /// <summary> /// Initializes a new instance of the MozItemEventArgs class with default settings /// </summary> public ItemColorChangedEventArgs() { m_color = 0; } public ItemColorChangedEventArgs(MozItemColor color) { this.m_color = color; } #endregion #region Properties public MozItemColor Color { get { return this.m_color; } } #endregion } #endregion #region ItemBorderStyleChangedEventArgs public class ItemBorderStyleChangedEventArgs : EventArgs { #region Class Data /// <summary> /// The MozItem that generated the event /// </summary> private MozItemState m_state; #endregion #region Constructor /// <summary> /// Initializes a new instance of the MozItemEventArgs class with default settings /// </summary> public ItemBorderStyleChangedEventArgs() { m_state = 0; } public ItemBorderStyleChangedEventArgs(MozItemState state) { this.m_state = state; } #endregion #region Properties public MozItemState State { get { return this.m_state; } } #endregion } #endregion }