217 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			217 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System.Drawing;
 | |
| using System.Drawing.Drawing2D;
 | |
| using System.Drawing.Text;
 | |
| 
 | |
| namespace DevComponents.DotNetBar
 | |
| {
 | |
| 	/// <summary>
 | |
| 	/// Represents class performing the display of tabs with RoundHeader style.
 | |
| 	/// </summary>
 | |
| 	internal class TabStripRoundHeaderDisplay:TabStripBaseDisplay
 | |
| 	{
 | |
| 		#region Methods
 | |
| 		public override void Paint(Graphics g, TabStrip tabStrip)
 | |
| 		{
 | |
| 			base.Paint(g,tabStrip);
 | |
| 
 | |
| 			TabsCollection tabs=tabStrip.Tabs;
 | |
| 			TabColorScheme colorScheme=tabStrip.ColorScheme;
 | |
| 			Rectangle clientRect=tabStrip.ClientRectangle;
 | |
| 			
 | |
| 			Rectangle r=tabStrip.DisplayRectangle;
 | |
| 			r.Inflate(2,2);
 | |
| 			using(SolidBrush brush=new SolidBrush(tabStrip.BackColor))
 | |
| 				g.FillRectangle(brush,r);
 | |
| 			//g.Clear(tabStrip.BackColor);
 | |
| 
 | |
| 			TabItem lastTab=GetLastVisibleTab(tabs);
 | |
| 
 | |
|             Rectangle selectedRect = Rectangle.Empty;
 | |
|             if (tabStrip.SelectedTab != null)
 | |
|                 selectedRect = tabStrip.SelectedTab.DisplayRectangle;
 | |
|             DrawBackground(tabStrip, clientRect, g, colorScheme, GetTabsRegion(tabs, lastTab), tabStrip.TabAlignment, selectedRect);
 | |
| 
 | |
| 			bool bFirstVisible=true;
 | |
| 
 | |
| 			foreach(TabItem tab in tabs)
 | |
| 			{
 | |
| 				if(!tab.Visible)
 | |
| 					continue;
 | |
|                 if(tab.DisplayRectangle.IntersectsWith(clientRect))
 | |
| 				    PaintTab(g,tab,bFirstVisible,(tab==lastTab));
 | |
| 				
 | |
| 				bFirstVisible=false;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		protected override Region GetTabsRegion(TabsCollection tabs, TabItem lastTab)
 | |
| 		{
 | |
| 			bool bFirstVisible=true;
 | |
| 			Region tabRegion=new Region();
 | |
| 			tabRegion.MakeEmpty();
 | |
| 			foreach(TabItem tab in tabs)
 | |
| 			{
 | |
| 				if(!tab.Visible)
 | |
| 					continue;				
 | |
| 				GraphicsPath path=GetTabItemPath(tab,bFirstVisible,(tab==lastTab));
 | |
| 				tabRegion.Union(path);
 | |
| 				bFirstVisible=false;
 | |
| 			}
 | |
| 			return tabRegion;
 | |
| 		}
 | |
| 
 | |
| 		protected override LinearGradientBrush CreateTabGradientBrush(Rectangle r,Color color1,Color color2,int gradientAngle)
 | |
| 		{
 | |
| 			LinearGradientBrush brush=base.CreateTabGradientBrush(r,color1,color2,gradientAngle);
 | |
| 			
 | |
| 			Blend blend=new Blend(5);
 | |
| 			blend.Factors=new float[]{0,.6f,1f,.6f,0f};
 | |
| 			blend.Positions=new float[]{0,.3f,.5f,.7f,1f};
 | |
| 			brush.Blend=blend;
 | |
| 
 | |
| 			return brush;
 | |
| 		}
 | |
| 
 | |
|         protected override void DrawBackground(TabStrip tabStrip, Rectangle tabStripRect, Graphics g, TabColorScheme colors, Region tabsRegion, eTabStripAlignment tabAlignment, Rectangle selectedTabRect)
 | |
| 		{
 | |
| 			int cornerDiameter=5;
 | |
| 			Rectangle br;
 | |
| 			GraphicsPath path=new GraphicsPath();
 | |
| 			if(tabAlignment==eTabStripAlignment.Top)
 | |
| 			{
 | |
| 				br=new Rectangle(tabStripRect.X,tabStripRect.Y+tabStripRect.Height/2,tabStripRect.Width-1,tabStripRect.Height-tabStripRect.Height/2);
 | |
| 				path.AddLine(br.X,br.Bottom,br.X,br.Top+cornerDiameter);
 | |
| 				ArcData ad=GetCornerArc(br,cornerDiameter,eCornerArc.TopLeft);
 | |
| 				path.AddArc(ad.X,ad.Y,ad.Width,ad.Height,ad.StartAngle,ad.SweepAngle);
 | |
| 				path.AddLine(br.X+cornerDiameter,br.Y,br.Right-cornerDiameter,br.Y);
 | |
| 				ad=GetCornerArc(br,cornerDiameter,eCornerArc.TopRight);
 | |
| 				path.AddArc(ad.X,ad.Y,ad.Width,ad.Height,ad.StartAngle,ad.SweepAngle);
 | |
| 				path.AddLine(br.Right,br.Y+cornerDiameter,br.Right,br.Bottom);
 | |
| 			}
 | |
| 			else if(tabAlignment==eTabStripAlignment.Bottom)
 | |
| 			{
 | |
| 				br=new Rectangle(tabStripRect.X,tabStripRect.Y,tabStripRect.Width-1,tabStripRect.Height/2);
 | |
| 				path.AddLine(br.Right,br.Y,br.Right,br.Bottom-cornerDiameter);
 | |
| 				ArcData ad=GetCornerArc(br,cornerDiameter,eCornerArc.BottomRight);
 | |
| 				path.AddArc(ad.X,ad.Y,ad.Width,ad.Height,ad.StartAngle,ad.SweepAngle);
 | |
| 				path.AddLine(br.Right-cornerDiameter,br.Bottom,br.X+cornerDiameter,br.Bottom);
 | |
| 				ad=GetCornerArc(br,cornerDiameter,eCornerArc.BottomLeft);
 | |
| 				path.AddArc(ad.X,ad.Y,ad.Width,ad.Height,ad.StartAngle,ad.SweepAngle);
 | |
| 				path.AddLine(br.X,br.Bottom-cornerDiameter,br.X,br.Y);
 | |
| 			}
 | |
| 			else if(tabAlignment==eTabStripAlignment.Left)
 | |
| 			{
 | |
| 				br=new Rectangle(tabStripRect.X+tabStripRect.Width/2,tabStripRect.Y,tabStripRect.Width/2+1,tabStripRect.Height-1);
 | |
| 				path.AddLine(br.Right,br.Bottom,br.X+cornerDiameter,br.Bottom);
 | |
| 				ArcData ad=GetCornerArc(br,cornerDiameter,eCornerArc.BottomLeft);
 | |
| 				path.AddArc(ad.X,ad.Y,ad.Width,ad.Height,ad.StartAngle,ad.SweepAngle);
 | |
| 				path.AddLine(br.X,br.Bottom-cornerDiameter,br.X,br.Y+cornerDiameter);
 | |
| 				ad=GetCornerArc(br,cornerDiameter,eCornerArc.TopLeft);
 | |
| 				path.AddArc(ad.X,ad.Y,ad.Width,ad.Height,ad.StartAngle,ad.SweepAngle);
 | |
| 				path.AddLine(br.X+cornerDiameter,br.Y,br.Right,br.Y);
 | |
| 			}
 | |
| 			else if(tabAlignment==eTabStripAlignment.Right)
 | |
| 			{
 | |
| 				br=new Rectangle(tabStripRect.X,tabStripRect.Y,tabStripRect.Width/2,tabStripRect.Height-1);
 | |
| 				path.AddLine(br.X,br.Y,br.Right-cornerDiameter,br.Y);
 | |
| 				ArcData ad=GetCornerArc(br,cornerDiameter,eCornerArc.TopRight);
 | |
| 				path.AddArc(ad.X,ad.Y,ad.Width,ad.Height,ad.StartAngle,ad.SweepAngle);
 | |
| 				path.AddLine(br.Right,br.Y+cornerDiameter,br.Right,br.Bottom-cornerDiameter);
 | |
| 				ad=GetCornerArc(br,cornerDiameter,eCornerArc.BottomRight);
 | |
| 				path.AddArc(ad.X,ad.Y,ad.Width,ad.Height,ad.StartAngle,ad.SweepAngle);
 | |
| 				path.AddLine(br.Right-cornerDiameter,br.Bottom,br.X,br.Bottom);
 | |
| 			}
 | |
| 
 | |
| 			// Paint background of the tab control
 | |
| 			GraphicsPath backPath=path.Clone() as GraphicsPath;
 | |
| 			backPath.CloseAllFigures();
 | |
| 			g.SetClip(backPath,CombineMode.Replace);
 | |
| 			g.SetClip(tabsRegion,CombineMode.Exclude);
 | |
| 			g.Clear(colors.TabPanelBackground);
 | |
| 			g.ResetClip();
 | |
| 			backPath.Dispose();
 | |
| 
 | |
| 			g.SetClip(tabsRegion,CombineMode.Exclude);
 | |
| 			
 | |
| 			using(Pen pen=new Pen(colors.TabBorder,1))
 | |
| 				g.DrawPath(pen,path);
 | |
| 			path.Dispose();
 | |
| 			g.ResetClip();
 | |
| 		}
 | |
| 		#endregion
 | |
| 
 | |
| 		#region Tab Path Functions
 | |
| 		protected override GraphicsPath GetTabItemPath(TabItem tab, bool bFirst, bool bLast)
 | |
| 		{
 | |
| 			GraphicsPath path=new GraphicsPath();
 | |
| 			int cornerDiameter=3;
 | |
| 			
 | |
| 			Rectangle clientRectangle=tab.DisplayRectangle;
 | |
| 
 | |
| 			if(!bFirst && !bLast)
 | |
| 				path.AddRectangle(clientRectangle);
 | |
| 			else
 | |
| 			{
 | |
| 				if(bFirst)
 | |
| 				{
 | |
| 					if(tab.Parent.TabAlignment==eTabStripAlignment.Top || tab.Parent.TabAlignment==eTabStripAlignment.Bottom)
 | |
| 					{
 | |
| 						path.AddLine(clientRectangle.Right-(bLast?cornerDiameter:0),clientRectangle.Bottom,clientRectangle.X+cornerDiameter,clientRectangle.Bottom);
 | |
| 						ArcData ad=GetCornerArc(clientRectangle,cornerDiameter,eCornerArc.BottomLeft);
 | |
| 						path.AddArc(ad.X,ad.Y,ad.Width,ad.Height,ad.StartAngle,ad.SweepAngle);
 | |
| 						path.AddLine(clientRectangle.X,clientRectangle.Bottom-cornerDiameter,clientRectangle.X,clientRectangle.Y+cornerDiameter);
 | |
| 						ad=GetCornerArc(clientRectangle,cornerDiameter,eCornerArc.TopLeft);
 | |
| 						path.AddArc(ad.X,ad.Y,ad.Width,ad.Height,ad.StartAngle,ad.SweepAngle);
 | |
| 						path.AddLine(clientRectangle.X+cornerDiameter,clientRectangle.Y,clientRectangle.Right-(bLast?cornerDiameter:0),clientRectangle.Y);
 | |
| 					}
 | |
| 					else
 | |
| 					{
 | |
| 						ArcData ad=GetCornerArc(clientRectangle,cornerDiameter,eCornerArc.TopLeft);
 | |
| 						path.AddArc(ad.X,ad.Y,ad.Width,ad.Height,ad.StartAngle,ad.SweepAngle);
 | |
| 						path.AddLine(clientRectangle.X+cornerDiameter,clientRectangle.Y,clientRectangle.Right-cornerDiameter,clientRectangle.Y);
 | |
| 						ad=GetCornerArc(clientRectangle,cornerDiameter,eCornerArc.TopRight);
 | |
| 						path.AddArc(ad.X,ad.Y,ad.Width,ad.Height,ad.StartAngle,ad.SweepAngle);
 | |
| 						path.AddLine(clientRectangle.Right,clientRectangle.Y+cornerDiameter,clientRectangle.Right,clientRectangle.Bottom-(bLast?cornerDiameter:0));
 | |
| 					}
 | |
| 				}
 | |
| 				else
 | |
| 					path.AddLine(clientRectangle.X,clientRectangle.Y,clientRectangle.Right,clientRectangle.Y);
 | |
| 				if(bLast)
 | |
| 				{
 | |
| 					if(tab.Parent.TabAlignment==eTabStripAlignment.Top || tab.Parent.TabAlignment==eTabStripAlignment.Bottom)
 | |
| 					{
 | |
| 						if(!bFirst)
 | |
| 							path.AddLine(clientRectangle.X,clientRectangle.Y,clientRectangle.Right-cornerDiameter,clientRectangle.Y);
 | |
| 						ArcData ad=GetCornerArc(clientRectangle,cornerDiameter,eCornerArc.TopRight);
 | |
| 						path.AddArc(ad.X,ad.Y,ad.Width,ad.Height,ad.StartAngle,ad.SweepAngle);
 | |
| 						path.AddLine(clientRectangle.Right,clientRectangle.Y+cornerDiameter,clientRectangle.Right,clientRectangle.Bottom-cornerDiameter);
 | |
| 						ad=GetCornerArc(clientRectangle,cornerDiameter,eCornerArc.BottomRight);
 | |
| 						path.AddArc(ad.X,ad.Y,ad.Width,ad.Height,ad.StartAngle,ad.SweepAngle);
 | |
| 						if(!bFirst)
 | |
| 							path.AddLine(clientRectangle.Right-cornerDiameter,clientRectangle.Bottom,clientRectangle.X,clientRectangle.Bottom);
 | |
| 					}
 | |
| 					else
 | |
| 					{
 | |
| 						if(!bFirst)
 | |
| 							path.AddLine(clientRectangle.Right,clientRectangle.Y,clientRectangle.Right,clientRectangle.Bottom-cornerDiameter);
 | |
| 						ArcData ad=GetCornerArc(clientRectangle,cornerDiameter,eCornerArc.BottomRight);
 | |
| 						path.AddArc(ad.X,ad.Y,ad.Width,ad.Height,ad.StartAngle,ad.SweepAngle);
 | |
| 						path.AddLine(clientRectangle.Right-cornerDiameter,clientRectangle.Bottom,clientRectangle.X+cornerDiameter,clientRectangle.Bottom);
 | |
| 						ad=GetCornerArc(clientRectangle,cornerDiameter,eCornerArc.BottomLeft);
 | |
| 						path.AddArc(ad.X,ad.Y,ad.Width,ad.Height,ad.StartAngle,ad.SweepAngle);
 | |
| 						if(!bFirst)
 | |
| 							path.AddLine(clientRectangle.X,clientRectangle.Bottom-cornerDiameter,clientRectangle.X,clientRectangle.Y);
 | |
| 					}
 | |
| 				}
 | |
| 				else
 | |
| 					path.AddLine(clientRectangle.Right,clientRectangle.Bottom,clientRectangle.X,clientRectangle.Bottom);
 | |
| 				path.CloseAllFigures();
 | |
| 
 | |
| 			}
 | |
| 
 | |
| 			return path;
 | |
| 		}
 | |
| 		#endregion
 | |
| 	}
 | |
| }
 |