756 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			756 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections;
 | |
| using System.ComponentModel;
 | |
| using System.Drawing;
 | |
| using System.Data;
 | |
| using System.Windows.Forms;
 | |
| using System.Xml;
 | |
| using System.Drawing.Drawing2D;
 | |
| 
 | |
| namespace DevComponents.DotNetBar
 | |
| {
 | |
| 	/// <summary>
 | |
| 	/// Represents Outlook 2003 like Navigation Bar.
 | |
| 	/// </summary>
 | |
|     [ToolboxItem(true), System.Runtime.InteropServices.ComVisible(false), Designer("DevComponents.DotNetBar.Design.NavigationBarDesigner, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral,  PublicKeyToken=90f470f34c89ccaf")]
 | |
| 	public class NavigationBar: BarBaseControl,ISupportInitialize
 | |
| 	{
 | |
| 		private NavigationBarContainer m_ItemContainer;
 | |
| 		private bool m_SplitterVisible=false;
 | |
| 		const int SPLITTER_SIZE=6;
 | |
| 		private Cursor m_SavedSplitterCursor=null;
 | |
| 		private bool m_SplitterMouseDown=false;
 | |
|         /// <summary>
 | |
|         /// Occurs after Options dialog which is used to customize control's content has closed by user using OK button.
 | |
|         /// </summary>
 | |
|         public event EventHandler OptionsDialogClosed;
 | |
| 		/// <summary>
 | |
| 		/// Default constructor.
 | |
| 		/// </summary>
 | |
| 		public NavigationBar():base()
 | |
| 		{
 | |
| 			m_ItemContainer=new NavigationBarContainer();
 | |
| 			m_ItemContainer.GlobalItem=false;
 | |
| 			m_ItemContainer.ContainerControl=this;
 | |
| 			m_ItemContainer.Stretch=false;
 | |
| 			m_ItemContainer.Displayed=true;
 | |
| 			m_ItemContainer.Style=eDotNetBarStyle.Office2003;
 | |
| 			m_ItemContainer.SetOwner(this);
 | |
| 			this.SetBaseItemContainer(m_ItemContainer);
 | |
| 
 | |
| 			SetDesignTimeDefaults();
 | |
| 		}
 | |
| 
 | |
|         internal void InvokeOptionsDialogClosed()
 | |
|         {
 | |
|             OnOptionsDialogClosed(new EventArgs());
 | |
|         }
 | |
|         protected virtual void OnOptionsDialogClosed(EventArgs e)
 | |
|         {
 | |
|             EventHandler handler = OptionsDialogClosed;
 | |
|             if (handler != null) handler(this, e);
 | |
|         }
 | |
|         protected override void OnResize(EventArgs e)
 | |
| 		{
 | |
| 			base.OnResize(e);
 | |
|             if (this.Width == 0 || this.Height == 0)
 | |
|                 return;
 | |
| 			this.RecalcSize();
 | |
| 		}
 | |
| 
 | |
| 		protected override void OnHandleCreated(EventArgs e)
 | |
| 		{
 | |
| 			base.OnHandleCreated(e);
 | |
| 			this.RecalcSize();
 | |
| 		}
 | |
| 
 | |
| 		protected override void RecalcSize()
 | |
| 		{
 | |
| 			if(m_Initializing || !BarFunctions.IsHandleValid(this))
 | |
| 				return;
 | |
| 
 | |
| 			base.RecalcSize();
 | |
| 
 | |
| 			if(m_ItemContainer.IsRecalculatingSize)
 | |
| 				return;
 | |
| 
 | |
| 			Rectangle r=this.GetItemContainerRectangle();
 | |
| 			if(m_ItemContainer.HeightInternal>0)
 | |
| 			{
 | |
|                 this.Height = m_ItemContainer.HeightInternal + r.Top + Math.Max(0,this.ClientRectangle.Bottom - r.Bottom);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Returns collection of items on a bar.
 | |
| 		/// </summary>
 | |
| 		[DesignerSerializationVisibility(DesignerSerializationVisibility.Content), Browsable(false)]
 | |
| 		public SubItemsCollection Items
 | |
| 		{
 | |
| 			get
 | |
| 			{
 | |
| 				return m_ItemContainer.SubItems;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Applies design-time defaults to control.
 | |
| 		/// </summary>
 | |
| 		public override void SetDesignTimeDefaults()
 | |
| 		{
 | |
| 			base.SetDesignTimeDefaults();
 | |
| 
 | |
| 			ApplyColorSchemeDefaults();
 | |
| 
 | |
| 			this.BackgroundStyle.BorderColor.ColorSchemePart=eColorSchemePart.PanelBorder;
 | |
| 			this.BackgroundStyle.Border=eBorderType.SingleLine;
 | |
| 		}
 | |
| 
 | |
| 		private void ApplyColorSchemeDefaults()
 | |
| 		{
 | |
| 			// ColorScheme Defaults
 | |
|             this.ColorScheme.ItemHotBorder = Color.Empty;
 | |
|             this.ColorScheme.ItemBackground = this.ColorScheme.BarBackground;
 | |
|             this.ColorScheme.ItemBackground2 = this.ColorScheme.BarBackground2;
 | |
|             this.ColorScheme.ItemHotBorder = Color.Empty;
 | |
|             this.ColorScheme.ItemPressedBorder = Color.Empty;
 | |
|             this.ColorScheme.ItemCheckedBorder = Color.Empty;
 | |
|             this.ColorScheme.ItemExpandedBackground = this.ColorScheme.ItemHotBackground;
 | |
|             this.ColorScheme.ItemExpandedBackground2 = this.ColorScheme.ItemHotBackground2;
 | |
|             this.ColorScheme.ItemExpandedShadow = Color.Empty;
 | |
|             this.ColorScheme.ItemExpandedBorder = Color.Empty;
 | |
|             this.ColorScheme.ResetChangedFlag();
 | |
| 
 | |
| 			this.BackgroundStyle.ApplyColorScheme(this.ColorScheme);
 | |
| 		}
 | |
| 
 | |
| 		protected override void OnSystemColorsChanged(EventArgs e)
 | |
| 		{
 | |
| 			base.OnSystemColorsChanged(e);
 | |
| 			Application.DoEvents();
 | |
| 			this.ColorScheme.Refresh();
 | |
| 			ApplyColorSchemeDefaults();
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Gets or sets whether Configure Buttons button is visible.
 | |
| 		/// </summary>
 | |
| 		[Browsable(true),DevCoBrowsable(true),Category("Behavior"),Description("Indicates Configure Buttons button is visible."),System.ComponentModel.DefaultValue(true)]
 | |
| 		public bool ConfigureItemVisible
 | |
| 		{
 | |
| 			get {return m_ItemContainer.ConfigureItemVisible;}
 | |
| 			set
 | |
| 			{
 | |
| 				m_ItemContainer.ConfigureItemVisible=value;
 | |
| 				this.RecalcLayout();
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Gets or sets whether Show More Buttons and Show Fewer Buttons menu items are visible on Configure buttons menu.
 | |
| 		/// </summary>
 | |
| 		[Browsable(true),DevCoBrowsable(true),Category("Behavior"),Description("Indicates whether Show More Buttons and Show Fewer Buttons menu items are visible on Configure buttons menu."),System.ComponentModel.DefaultValue(true)]
 | |
| 		public bool ConfigureShowHideVisible
 | |
| 		{
 | |
| 			get {return m_ItemContainer.ConfigureShowHideVisible;}
 | |
| 			set
 | |
| 			{
 | |
| 				m_ItemContainer.ConfigureShowHideVisible=value;
 | |
| 				this.RecalcLayout();
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Gets or sets whether Navigation Pane Options menu item is visible on Configure buttons menu.
 | |
| 		/// </summary>
 | |
| 		[Browsable(true),DevCoBrowsable(true),Category("Behavior"),Description("Gets or sets whether Navigation Pane Options menu item is visible on Configure buttons menu."),System.ComponentModel.DefaultValue(true)]
 | |
| 		public bool ConfigureNavOptionsVisible
 | |
| 		{
 | |
| 			get {return m_ItemContainer.ConfigureNavOptionsVisible;}
 | |
| 			set
 | |
| 			{
 | |
| 				m_ItemContainer.ConfigureNavOptionsVisible=value;
 | |
| 				this.RecalcLayout();
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Gets or sets whether Navigation Pane Add/Remove Buttons menu item is visible on Configure buttons menu.
 | |
| 		/// </summary>
 | |
| 		[Browsable(true),DevCoBrowsable(true),Category("Behavior"),Description("Indicates whether Navigation Pane Add/Remove Buttons menu item is visible on Configure buttons menu."),System.ComponentModel.DefaultValue(true)]
 | |
| 		public bool ConfigureAddRemoveVisible
 | |
| 		{
 | |
| 			get {return m_ItemContainer.ConfigureAddRemoveVisible;}
 | |
| 			set
 | |
| 			{
 | |
| 				m_ItemContainer.ConfigureAddRemoveVisible=value;
 | |
| 				this.RecalcLayout();
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Gets or sets whether summary line is visible.
 | |
| 		/// </summary>
 | |
| 		[Browsable(true),DevCoBrowsable(true),Category("Behavior"),Description("Indicates whether summary line is visible."),System.ComponentModel.DefaultValue(true)]
 | |
| 		public bool SummaryLineVisible
 | |
| 		{
 | |
| 			get {return m_ItemContainer.SummaryLineVisible;}
 | |
| 			set
 | |
| 			{
 | |
| 				m_ItemContainer.SummaryLineVisible=value;
 | |
| 				this.RecalcLayout();
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Gets or sets the padding in pixels at the top portion of the item. Height of each item will be increased by padding amount.
 | |
| 		/// </summary>
 | |
| 		[Browsable(true),DevCoBrowsable(true),Category("Layout"),Description("Indicates the padding in pixels at the top portion of the item."),DefaultValue(4)]
 | |
| 		public int ItemPaddingTop
 | |
| 		{
 | |
| 			get {return m_ItemContainer.ItemPaddingTop;}
 | |
| 			set
 | |
| 			{
 | |
| 				m_ItemContainer.ItemPaddingTop=value;
 | |
| 				if(this.DesignMode)
 | |
| 					this.RecalcLayout();
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Gets or sets the padding in pixels for bottom portion of the item. Height of each item will be increased by padding amount.
 | |
| 		/// </summary>
 | |
| 		[Browsable(true),DevCoBrowsable(true),Category("Layout"),Description("Indicates the padding in pixels at the bottom of the item."),DefaultValue(4)]
 | |
| 		public int ItemPaddingBottom
 | |
| 		{
 | |
| 			get {return m_ItemContainer.ItemPaddingBottom;}
 | |
| 			set
 | |
| 			{
 | |
| 				m_ItemContainer.ItemPaddingBottom=value;
 | |
| 				if(this.DesignMode)
 | |
| 					this.RecalcLayout();
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Increases the size of the navigation bar if possible by showing more buttons on the top.
 | |
| 		/// </summary>
 | |
| 		public void ShowMoreButtons()
 | |
| 		{
 | |
| 			m_ItemContainer.ShowMoreButtons();
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Reduces the size of the navigation bar if possible by showing fewer buttons on the top.
 | |
| 		/// </summary>
 | |
| 		public void ShowFewerButtons()
 | |
| 		{
 | |
| 			m_ItemContainer.ShowFewerButtons();
 | |
| 		}
 | |
| 
 | |
| 		protected override Rectangle GetItemContainerRectangle()
 | |
| 		{
 | |
| 			Rectangle r=base.GetItemContainerRectangle();
 | |
| 			if(m_SplitterVisible)
 | |
| 			{
 | |
| 				r.Y+=SPLITTER_SIZE;
 | |
| 				r.Height-=SPLITTER_SIZE;
 | |
| 			}
 | |
| 			return r;
 | |
| 		}
 | |
| 
 | |
|         protected override void PaintContentOnTop(ItemPaintArgs pa)
 | |
| 		{
 | |
|             base.PaintContentOnTop(pa);
 | |
| 			PaintSplitter(pa);
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Returns items container.
 | |
| 		/// </summary>
 | |
| 		[Browsable(false)]
 | |
| 		public NavigationBarContainer ItemsContainer
 | |
| 		{
 | |
| 			get {return m_ItemContainer;}
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Returns reference to currently checked button.
 | |
| 		/// </summary>
 | |
| 		[Browsable(false)]
 | |
| 		public ButtonItem CheckedButton
 | |
| 		{
 | |
| 			get
 | |
| 			{
 | |
| 				foreach(BaseItem item in m_ItemContainer.SubItems)
 | |
| 				{
 | |
|                     if(item is ButtonItem && ((ButtonItem)item).Checked)
 | |
| 						return item as ButtonItem;
 | |
| 				}
 | |
| 				return null;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Gets or sets whether images are automatically resized to size specified in ImageSizeSummaryLine when button is on the bottom summary line of navigation bar.
 | |
| 		/// </summary>
 | |
| 		[Browsable(true),DevCoBrowsable(true),Category("Appearance"),Description("Indicates whether images are automatically resized to size specified in ImageSizeSummaryLine when button is on the bottom summary line of navigation bar."),DefaultValue(true)]
 | |
| 		public bool AutoSizeButtonImage
 | |
| 		{
 | |
| 			get {return m_ItemContainer.AutoSizeButtonImage;}
 | |
| 			set {m_ItemContainer.AutoSizeButtonImage=value;}
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Gets or sets size of the image that will be use to resize images to when button button is on the bottom summary line of navigation bar and AutoSizeButtonImage=true.
 | |
| 		/// </summary>
 | |
| 		[Browsable(true),DevCoBrowsable(true),Category("Appearance"),Description("Indicates size of the image that will be use to resize images to when button button is on the bottom summary line of navigation bar and AutoSizeButtonImage=true.")]
 | |
| 		public Size ImageSizeSummaryLine
 | |
| 		{
 | |
| 			get {return m_ItemContainer.ImageSizeSummaryLine;}
 | |
| 			set {m_ItemContainer.ImageSizeSummaryLine=value;}
 | |
| 		}
 | |
| 		[EditorBrowsable(EditorBrowsableState.Never)]
 | |
| 		public bool ShouldSerializeImageSizeSummaryLine()
 | |
| 		{
 | |
| 			return (m_ItemContainer.ImageSizeSummaryLine.Width!=16 || m_ItemContainer.ImageSizeSummaryLine.Height!=16);
 | |
| 		}
 | |
| 		
 | |
| 		private bool m_Initializing=false;
 | |
| 		void ISupportInitialize.BeginInit()
 | |
| 		{
 | |
| 			m_Initializing=true;
 | |
| 		}
 | |
| 		void ISupportInitialize.EndInit()
 | |
| 		{
 | |
| 			m_Initializing=false;
 | |
| 			this.RecalcLayout();
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Saves current visual layout of navigation bar control to XML based file.
 | |
| 		/// </summary>
 | |
| 		/// <param name="fileName">File name to save layout to.</param>
 | |
| 		public void SaveLayout(string fileName)
 | |
| 		{
 | |
| 			System.Xml.XmlDocument xmlDoc=new System.Xml.XmlDocument();
 | |
| 			XmlElement parent=xmlDoc.CreateElement("navbarlayout");
 | |
| 			xmlDoc.AppendChild(parent);
 | |
| 
 | |
| 			this.SaveLayout(parent);
 | |
| 
 | |
| 			xmlDoc.Save(fileName);
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Saves current visual layout of navigation bar control to XmlElement.
 | |
| 		/// </summary>
 | |
| 		/// <param name="xmlParent">XmlElement object that will act as a parent for the layout definition. Exact same element should be passed into the LoadLayout method to load the layout.</param>
 | |
| 		public void SaveLayout(XmlElement xmlParent)
 | |
| 		{
 | |
| 			if(this.Items.Count==0)
 | |
| 				return;
 | |
| 			XmlElement root=xmlParent.OwnerDocument.CreateElement("navigationbar");
 | |
| 			xmlParent.AppendChild(root);
 | |
| 			root.SetAttribute("height",this.Height.ToString());
 | |
| 			foreach(BaseItem item in this.Items)
 | |
| 			{
 | |
| 				if(item is ButtonItem && item.Name!="")
 | |
| 				{
 | |
| 					XmlElement xmlItem=xmlParent.OwnerDocument.CreateElement("item");
 | |
| 					root.AppendChild(xmlItem);
 | |
| 					xmlItem.SetAttribute("index",this.Items.IndexOf(item).ToString());
 | |
| 					xmlItem.SetAttribute("name",item.Name);
 | |
| 					xmlItem.SetAttribute("visible",XmlConvert.ToString(item.Visible));
 | |
| 					xmlItem.SetAttribute("checked",XmlConvert.ToString(((ButtonItem)item).Checked));
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Gets or sets the navigation bar definition string.
 | |
| 		/// </summary>
 | |
| 		[Browsable(false),DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | |
| 		public string LayoutDefinition
 | |
| 		{
 | |
| 			get
 | |
| 			{
 | |
| 				System.Xml.XmlDocument xmlDoc=new System.Xml.XmlDocument();
 | |
| 				XmlElement parent=xmlDoc.CreateElement("navbarlayout");
 | |
| 				xmlDoc.AppendChild(parent);
 | |
| 				this.SaveLayout(parent);
 | |
| 				return xmlDoc.OuterXml;
 | |
| 			}
 | |
| 			set
 | |
| 			{
 | |
| 				System.Xml.XmlDocument xmlDoc=new System.Xml.XmlDocument();
 | |
| 				xmlDoc.LoadXml(value);
 | |
| 				LoadLayout(xmlDoc.FirstChild as XmlElement);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Loads navigation bar layout that was saved using SaveLayout method. Note that this method must be called after all items are created and added to the control.
 | |
| 		/// </summary>
 | |
| 		/// <param name="fileName">File to load layout from.</param>
 | |
| 		public void LoadLayout(string fileName)
 | |
| 		{
 | |
| 			System.Xml.XmlDocument xmlDoc=new System.Xml.XmlDocument();
 | |
| 			xmlDoc.Load(fileName);
 | |
| 			this.LoadLayout(xmlDoc.FirstChild as XmlElement);
 | |
| 		}
 | |
| 
 | |
| 		/// <summary>
 | |
| 		/// Loads navigation bar layout that was saved using SaveLayout method. Note that this method must be called after all items are created and added to the control.
 | |
| 		/// </summary>
 | |
| 		/// <param name="xmlParent">Parent XML element that is used to load layout from. Note that this must be the same element that was passed into the SaveLayout method.</param>
 | |
| 		public void LoadLayout(XmlElement xmlParent)
 | |
| 		{
 | |
| 			if(this.Items.Count==0)
 | |
| 				return;
 | |
| 
 | |
| 			XmlElement root=xmlParent.FirstChild as XmlElement;
 | |
| 			if(root==null || root.Name!="navigationbar")
 | |
| 				throw new InvalidOperationException("xmlParent parameter in LoadLayout does not contain expected XML child note with name navigationbar. Invalid XML layout file.");
 | |
| 			
 | |
| 			try
 | |
| 			{
 | |
| 				((ISupportInitialize)this).BeginInit();
 | |
| 				this.Height=XmlConvert.ToInt32(root.GetAttribute("height"));
 | |
| 				foreach(XmlElement xmlItem in root.ChildNodes)
 | |
| 				{
 | |
| 					if(!this.Items.Contains(xmlItem.GetAttribute("name")))
 | |
| 						continue;
 | |
| 					BaseItem item=this.Items[xmlItem.GetAttribute("name")];
 | |
| 					if(item is ButtonItem)
 | |
| 					{
 | |
| 						ButtonItem button=item as ButtonItem;
 | |
| 						button.Checked=XmlConvert.ToBoolean(xmlItem.GetAttribute("checked"));
 | |
| 						button.Visible=XmlConvert.ToBoolean(xmlItem.GetAttribute("visible"));
 | |
| 						int i=XmlConvert.ToInt32(xmlItem.GetAttribute("index"));
 | |
| 						if(this.Items.IndexOf(item)!=i)
 | |
| 						{
 | |
| 							this.Items.RemoveAt(this.Items.IndexOf(item));
 | |
| 							this.Items.Insert(i,item);
 | |
| 						}
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 			finally
 | |
| 			{
 | |
| 				((ISupportInitialize)this).EndInit();
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		protected override bool ProcessMnemonic(char charCode)
 | |
| 		{
 | |
| 			string s="&"+charCode.ToString();
 | |
| 			s=s.ToLower();
 | |
| 			foreach(BaseItem item in this.Items)
 | |
| 			{
 | |
| 				string text=item.Text.ToLower();
 | |
| 				if(text.IndexOf(s)>=0)
 | |
| 				{
 | |
| 					if(item is ButtonItem)
 | |
| 					{
 | |
| 						((ButtonItem)item).Checked=true;
 | |
| 						return true;
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets/Sets the visual style for items and color scheme.
 | |
|         /// </summary>
 | |
|         [Browsable(true), DevCoBrowsable(true), Category("Appearance"), Description("Specifies the visual style of the control."), DefaultValue(eDotNetBarStyle.Office2003)]
 | |
|         public eDotNetBarStyle Style
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 return m_ItemContainer.Style;
 | |
|             }
 | |
|             set
 | |
|             {
 | |
|                 this.ColorScheme.Style = value;
 | |
|                 m_ItemContainer.Style = value;
 | |
|                 ApplyColorSchemeDefaults();
 | |
|                 this.RecalcLayout();
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private static RoundRectangleShapeDescriptor _ButtonShape = new RoundRectangleShapeDescriptor();
 | |
|         internal IShapeDescriptor ButtonShape
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 return _ButtonShape;
 | |
|             }
 | |
|         }
 | |
| 
 | |
| 		#region Splitter Support
 | |
|         protected virtual void PaintSplitter(ItemPaintArgs pa)
 | |
|         {
 | |
|             if (m_SplitterVisible)
 | |
|             {
 | |
|                 Rectangle r = this.GetSplitterRectangle();
 | |
|                 eDotNetBarStyle effectiveStyle = m_ItemContainer.EffectiveStyle;
 | |
| 
 | |
|                 if (effectiveStyle == eDotNetBarStyle.Office2010)
 | |
|                 {
 | |
|                     r.Height--;
 | |
|                     r.Inflate(0, 0);
 | |
|                     r.Width -= 2;
 | |
|                 }
 | |
| 
 | |
|                 if (effectiveStyle != eDotNetBarStyle.Office2010)
 | |
|                 {
 | |
|                     using (System.Drawing.Drawing2D.LinearGradientBrush brush = BarFunctions.CreateLinearGradientBrush(r, pa.Colors.SplitterBackground, pa.Colors.SplitterBackground2, 90))
 | |
|                         pa.Graphics.FillRectangle(brush, r);
 | |
| 
 | |
|                     using (SolidBrush brush = new SolidBrush(Color.White))
 | |
|                     {
 | |
|                         int x = r.X + (r.Width - 34) / 2;
 | |
|                         int y = r.Y + 2;
 | |
|                         for (int i = 0; i < 9; i++)
 | |
|                         {
 | |
|                             pa.Graphics.FillRectangle(brush, x, y, 2, 2);
 | |
|                             x += 4;
 | |
|                         }
 | |
|                     }
 | |
| 
 | |
|                     using (SolidBrush brush = new SolidBrush(Color.FromArgb(128, ControlPaint.Dark(pa.Colors.SplitterBackground))))
 | |
|                     {
 | |
|                         int x = r.X + (r.Width - 34) / 2 - 1;
 | |
|                         int y = r.Y + 1;
 | |
|                         for (int i = 0; i < 9; i++)
 | |
|                         {
 | |
|                             pa.Graphics.FillRectangle(brush, x, y, 2, 2);
 | |
|                             x += 4;
 | |
|                         }
 | |
|                     }
 | |
|                     DisplayHelp.DrawLine(pa.Graphics, r.X, r.Bottom - 1, r.Right, r.Bottom - 1, pa.Colors.SplitterBorder, 1);
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     Rectangle fillRect = r;
 | |
|                     fillRect.Height -= 1;
 | |
|                     SmoothingMode sm = pa.Graphics.SmoothingMode;
 | |
|                     pa.Graphics.SmoothingMode = SmoothingMode.None;
 | |
|                     using (System.Drawing.Drawing2D.LinearGradientBrush brush = new LinearGradientBrush(fillRect, pa.Colors.SplitterBackground, pa.Colors.SplitterBackground2, 90))
 | |
|                         pa.Graphics.FillRectangle(brush, fillRect);
 | |
|                     pa.Graphics.SmoothingMode = sm;
 | |
|                     DisplayHelp.DrawRectangle(pa.Graphics, pa.Colors.SplitterBorder, r);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
| 		protected virtual Rectangle GetSplitterRectangle()
 | |
| 		{
 | |
| 			Rectangle r=new Rectangle(this.ClientRectangle.X,this.ClientRectangle.Y,this.Width,SPLITTER_SIZE);
 | |
| 			if(this.BackgroundStyle.Border==eBorderType.SingleLine)
 | |
| 			{
 | |
| 				if((this.BackgroundStyle.BorderSide & eBorderSide.Top)==eBorderSide.Top)
 | |
| 					r.Y++;
 | |
| 				if((this.BackgroundStyle.BorderSide & eBorderSide.Right)==eBorderSide.Right)
 | |
| 					r.Width--;
 | |
| 				if((this.BackgroundStyle.BorderSide & eBorderSide.Left)==eBorderSide.Left)
 | |
| 				{
 | |
| 					r.X++;
 | |
| 					r.Width--;
 | |
| 				}
 | |
| 			}
 | |
| 			else if(this.BackgroundStyle.Border!=eBorderType.None)
 | |
| 			{
 | |
| 				if((this.BackgroundStyle.BorderSide & eBorderSide.Top)==eBorderSide.Top)
 | |
| 					r.Y+=2;
 | |
| 				if((this.BackgroundStyle.BorderSide & eBorderSide.Right)==eBorderSide.Right)
 | |
| 					r.Width-=2;
 | |
| 				if((this.BackgroundStyle.BorderSide & eBorderSide.Left)==eBorderSide.Left)
 | |
| 				{
 | |
| 					r.X+=2;
 | |
| 					r.Width-=2;
 | |
| 				}
 | |
| 			}
 | |
| 			return r;
 | |
| 		}
 | |
| 
 | |
| 		protected override void OnMouseMove(MouseEventArgs e)
 | |
| 		{
 | |
| 			SplitterMouseMove(e);
 | |
| 			if(!m_SplitterMouseDown)
 | |
| 				base.OnMouseMove(e);
 | |
| 		}
 | |
|         [EditorBrowsable(EditorBrowsableState.Never)]
 | |
| 		public void SplitterMouseMove(MouseEventArgs e)
 | |
| 		{
 | |
| 			if(m_SplitterVisible && !m_SplitterMouseDown)
 | |
| 			{
 | |
| 				if(HitTestSplitter(e.X,e.Y))
 | |
| 				{
 | |
| 					if(m_SavedSplitterCursor==null || this.GetDesignMode())
 | |
| 					{
 | |
| 						if(m_SavedSplitterCursor==null)
 | |
| 						{
 | |
| 							if(this.GetDesignMode())
 | |
| 								m_SavedSplitterCursor=Cursor.Current;
 | |
| 							else
 | |
| 								m_SavedSplitterCursor=this.Cursor;
 | |
| 						}
 | |
| 
 | |
| 						if(this.GetDesignMode())
 | |
| 							Cursor.Current=Cursors.SizeNS;
 | |
| 						else
 | |
| 							this.Cursor=Cursors.SizeNS;
 | |
| 					}
 | |
| 				}
 | |
| 				else if(m_SavedSplitterCursor!=null)
 | |
| 				{
 | |
| 					if(this.GetDesignMode())
 | |
| 						Cursor.Current=m_SavedSplitterCursor;
 | |
| 					else
 | |
| 						this.Cursor=m_SavedSplitterCursor;
 | |
| 					m_SavedSplitterCursor=null;
 | |
| 				}
 | |
| 			}
 | |
| 
 | |
| 			if(m_SplitterMouseDown)
 | |
| 			{
 | |
| 				bool reduceSize=false;
 | |
| 				BaseItem firstDisplayed=m_ItemContainer.GetFirstVisibleItem();
 | |
| 				if(firstDisplayed==null)
 | |
| 					reduceSize=false;
 | |
| 				else if(e.Y>=firstDisplayed.DisplayRectangle.Bottom-SPLITTER_SIZE)
 | |
| 					reduceSize=true;
 | |
| 
 | |
| //				BaseItem referenceItem=m_ItemContainer.GetResizeReferenceItem(reduceSize);
 | |
| //				if(referenceItem==null)
 | |
| //					return;
 | |
| //				int itemHeight=referenceItem.HeightInternal;
 | |
| //				if(referenceItem is ButtonItem && m_ItemContainer.AutoSizeButtonImage && !m_ItemContainer.ImageSizeSummaryLine.IsEmpty && !((ButtonItem)referenceItem).ImageFixedSize.IsEmpty)
 | |
| //				{
 | |
| //					Size size=((ButtonItem)referenceItem).ImageFixedSize;
 | |
| //					((ButtonItem)referenceItem).ImageFixedSize=Size.Empty;
 | |
| //					referenceItem.RecalcSize();
 | |
| //					itemHeight=referenceItem.HeightInternal;
 | |
| //					itemHeight+=(m_ItemContainer.ItemPaddingBottom+m_ItemContainer.ItemPaddingTop);
 | |
| //                    ((ButtonItem)referenceItem).ImageFixedSize=size;
 | |
| //					referenceItem.RecalcSize();
 | |
| //				}
 | |
| 
 | |
| 				int itemHeight=m_ItemContainer.GetChangeSizeHeight(reduceSize);
 | |
| 
 | |
| 				if(firstDisplayed!=null && e.Y>=firstDisplayed.DisplayRectangle.Bottom-SPLITTER_SIZE && this.GetItemContainerRectangle().Height>itemHeight+SPLITTER_SIZE)
 | |
| 				{
 | |
| 					//this.Height-=itemHeight;
 | |
| 					m_ItemContainer.ShowFewerButtons();
 | |
| 				}
 | |
| 				else if(e.Y<0 && Math.Abs(e.Y)>=itemHeight+SPLITTER_SIZE)
 | |
| 				{
 | |
| //					itemHeight+=SPLITTER_SIZE;
 | |
| //					this.Height+=itemHeight+1;
 | |
| 					m_ItemContainer.ShowMoreButtons();
 | |
| 				}
 | |
| 				else
 | |
| 					this.RecalcLayout();
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		protected override void OnMouseLeave(EventArgs e)
 | |
| 		{
 | |
| 			SplitterMouseLeave();
 | |
| 			base.OnMouseLeave(e);
 | |
| 		}
 | |
|         [EditorBrowsable(EditorBrowsableState.Never)]
 | |
| 		public void SplitterMouseLeave()
 | |
| 		{
 | |
| 			if(m_SavedSplitterCursor!=null)
 | |
| 			{
 | |
| 				if(this.GetDesignMode())
 | |
| 					Cursor.Current=m_SavedSplitterCursor;
 | |
| 				else
 | |
| 					this.Cursor=m_SavedSplitterCursor;
 | |
| 				m_SavedSplitterCursor=null;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		protected override void OnMouseDown(MouseEventArgs e)
 | |
| 		{
 | |
| 			SplitterMouseDown(e);
 | |
| 
 | |
| 			if(!m_SplitterMouseDown)
 | |
| 				base.OnMouseDown(e);
 | |
| 		}
 | |
| 		[EditorBrowsable(EditorBrowsableState.Never)]
 | |
| 		public void SplitterMouseDown(MouseEventArgs e)
 | |
| 		{
 | |
| 			if(this.Dock==DockStyle.Bottom && HitTestSplitter(e.X,e.Y))
 | |
| 			{
 | |
| 				this.Capture=true;
 | |
| 				m_SplitterMouseDown=true;
 | |
| 			}
 | |
| 		}
 | |
|         [EditorBrowsable(EditorBrowsableState.Never)]
 | |
| 		public bool HitTestSplitter(int x, int y)
 | |
| 		{
 | |
| 			if(m_SplitterVisible)
 | |
| 			{
 | |
| 				Rectangle r=this.GetSplitterRectangle();
 | |
| 				if(r.Contains(x,y))
 | |
| 				{
 | |
| 					return true;
 | |
| 				}
 | |
| 			}
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		protected override void OnMouseUp(MouseEventArgs e)
 | |
| 		{
 | |
| 			SplitterMouseUp(e);
 | |
| 			base.OnMouseUp(e);
 | |
| 		}
 | |
|         [EditorBrowsable(EditorBrowsableState.Never), Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | |
| 		public bool IsSplitterMouseDown
 | |
| 		{
 | |
| 			get {return m_SplitterMouseDown;}
 | |
| 		}
 | |
|         [EditorBrowsable(EditorBrowsableState.Never)]
 | |
| 		public void SplitterMouseUp(MouseEventArgs e)
 | |
| 		{
 | |
| 			if(m_SplitterMouseDown)
 | |
| 			{
 | |
| 				m_SplitterMouseDown=false;
 | |
| 				this.Capture=false;
 | |
| 
 | |
| 				if(m_SavedSplitterCursor!=null)
 | |
| 				{
 | |
| 					this.Cursor=m_SavedSplitterCursor;
 | |
| 					m_SavedSplitterCursor=null;
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		// Internal Splitter sizing logic assumes that control is docked to bottom and it will
 | |
| 		// change height ONLY. It is not capable of handling the generic splitter case!!!!!
 | |
| 		// OnMouseDown is hard-coded to check for Dock=Bottom to prevent any problems
 | |
| 		/// <summary>
 | |
| 		/// Indicates whether splitter on top of the navigation bar is visible. When activated splitter will let user change the height of the
 | |
| 		/// control to show fewer or more buttons. It is recommended to have navigation bar docked to bottom (Dock=Bottom) to maintain
 | |
| 		/// proper layout.
 | |
| 		/// </summary>
 | |
| 		[Browsable(true),DevCoBrowsable(true),Category("Layout"),Description("Indicates whether splitter on top of the navigation bar is visible."),DefaultValue(false)]
 | |
| 		public bool SplitterVisible
 | |
| 		{
 | |
| 			get{return m_SplitterVisible;}
 | |
| 			set
 | |
| 			{
 | |
| 				m_SplitterVisible=value;
 | |
| 				if(this.DesignMode)
 | |
| 					this.RecalcLayout();
 | |
| 			}
 | |
| 		}
 | |
| 		#endregion
 | |
| 	}
 | |
| }
 |