dockpanel.cs

来自「全功能c#编译器」· CS 代码 · 共 1,212 行 · 第 1/3 页

CS
1,212
字号
		private Rectangle DocumentRectangle
		{
			get
			{
				Rectangle rect = DockArea;
				if (DockWindows[DockState.DockLeft].DisplayingList.Count != 0)
				{
					rect.X += (int)(DockArea.Width * DockLeftPortion);
					rect.Width -= (int)(DockArea.Width * DockLeftPortion);
				}
				if (DockWindows[DockState.DockRight].DisplayingList.Count != 0)
					rect.Width -= (int)(DockArea.Width * DockRightPortion);
				if (DockWindows[DockState.DockTop].DisplayingList.Count != 0)
				{
					rect.Y += (int)(DockArea.Height * DockTopPortion);
					rect.Height -= (int)(DockArea.Height * DockTopPortion);
				}
				if (DockWindows[DockState.DockBottom].DisplayingList.Count != 0)
					rect.Height -= (int)(DockArea.Height * DockBottomPortion);

				return rect;
			}
		}

		private DragHandler m_dragHandler;
		internal DragHandler DragHandler
		{
			get	{	return m_dragHandler;	}
		}

		private Control m_dummyControl;
		internal Control DummyControl
		{
			get	{	return m_dummyControl;	}
		}

		protected internal virtual IFloatWindowFactory FloatWindowFactory
		{
			get	{	return DefaultFloatWindowFactory;	}
		}

		private FloatWindowCollection m_floatWindows;
		[Browsable(false)]
		public FloatWindowCollection FloatWindows
		{
			get	{	return m_floatWindows;	}
		}

		private bool m_mdiIntegration = true;
		[LocalizedCategory("Category.Docking")]
		[LocalizedDescription("DockPanel.MdiIntegration.Description")]
		[DefaultValue(true)]
		public bool MdiIntegration
		{
			get	{	return m_mdiIntegration;	}
			set
			{
				if (value == m_mdiIntegration)
					return;

				m_mdiIntegration = value;
				RefreshMdiIntegration();
			}
		}

		protected override void OnLayout(LayoutEventArgs levent)
		{
			CalculateDockPadding();

			int width = ClientRectangle.Width - DockPadding.Left - DockPadding.Right;
			int height = ClientRectangle.Height - DockPadding.Top - DockPadding.Bottom;
			int dockLeftSize = (int)(width * m_dockLeftPortion);
			int dockRightSize = (int)(width * m_dockRightPortion);
			int dockTopSize = (int)(height * m_dockTopPortion);
			int dockBottomSize = (int)(height * m_dockBottomPortion);

			if (dockLeftSize < MeasurePane.MinSize)
				dockLeftSize = MeasurePane.MinSize;
			if (dockRightSize < MeasurePane.MinSize)
				dockRightSize = MeasurePane.MinSize;
			if (dockTopSize < MeasurePane.MinSize)
				dockTopSize = MeasurePane.MinSize;
			if (dockBottomSize < MeasurePane.MinSize)
				dockBottomSize = MeasurePane.MinSize;

			DockWindows[DockState.DockLeft].Width = dockLeftSize;
			DockWindows[DockState.DockRight].Width = dockRightSize;
			DockWindows[DockState.DockTop].Height = dockTopSize;
			DockWindows[DockState.DockBottom].Height = dockBottomSize;

			AutoHideWindow.Bounds = AutoHideWindowBounds;

			DockWindows[DockState.Document].BringToFront();
			AutoHideWindow.BringToFront();

			base.OnLayout(levent);
		}

		protected override void OnMouseDown(MouseEventArgs e)
		{
			base.OnMouseDown(e);

			if (e.Button != MouseButtons.Left)
				return;

			DockContent content = GetHitTest();
			if (content == null)
				return;

			if (content != ActiveAutoHideContent)
				ActiveAutoHideContent = content;

			if (!content.Pane.IsActivated)
				content.Pane.Activate();
		}

		protected override void OnMouseHover(EventArgs e)
		{
			base.OnMouseHover(e);

			DockContent content = GetHitTest();
			if (content != null && ActiveAutoHideContent != content)
			{
				ActiveAutoHideContent = content;
				Invalidate();
			}

			// requires further tracking of mouse hover behavior,
			// call TrackMouseEvent
			Win32.TRACKMOUSEEVENTS tme = new Win32.TRACKMOUSEEVENTS(Win32.TRACKMOUSEEVENTS.TME_HOVER, Handle, Win32.TRACKMOUSEEVENTS.HOVER_DEFAULT);
			User32.TrackMouseEvent(ref tme);
		}

		protected override void OnPaint(PaintEventArgs e)
		{
			base.OnPaint(e);

			CalculateDockPadding();

			Graphics g = e.Graphics;
			g.FillRectangle(SystemBrushes.AppWorkspace, ClientRectangle);

			CalculateTabs(DockState.DockLeftAutoHide);
			CalculateTabs(DockState.DockRightAutoHide);
			CalculateTabs(DockState.DockTopAutoHide);
			CalculateTabs(DockState.DockBottomAutoHide);

			int leftAutoHideWindows = GetCountOfAutoHidePanes(DockState.DockLeftAutoHide);
			int rightAutoHideWindows = GetCountOfAutoHidePanes(DockState.DockRightAutoHide);
			int topAutoHideWindows = GetCountOfAutoHidePanes(DockState.DockTopAutoHide);
			int bottomAutoHideWindows = GetCountOfAutoHidePanes(DockState.DockBottomAutoHide);

			Brush brush = Brushes.WhiteSmoke;
			int height = GetTabStripHeight();
			if (leftAutoHideWindows != 0 && topAutoHideWindows != 0)
				g.FillRectangle(brush, 0, 0, height, height);
			if (leftAutoHideWindows != 0 && bottomAutoHideWindows != 0)
				g.FillRectangle(brush, 0, Height - height, height, height);
			if (topAutoHideWindows != 0 && rightAutoHideWindows != 0)
				g.FillRectangle(brush, Width - height, 0, height, height);
			if (rightAutoHideWindows != 0 && bottomAutoHideWindows != 0)
				g.FillRectangle(brush, Width - height, Height - height, height, height);
			
			DrawTabStrip(e.Graphics, DockState.DockLeftAutoHide);
			DrawTabStrip(e.Graphics, DockState.DockRightAutoHide);
			DrawTabStrip(e.Graphics, DockState.DockTopAutoHide);
			DrawTabStrip(e.Graphics, DockState.DockBottomAutoHide);
		}

		internal void AddContent(DockContent content)
		{
			if (content == null)
				throw(new ArgumentNullException());

			if (!Contents.Contains(content))
			{
				Contents.Add(content);
				OnContentAdded(new DockContentEventArgs(content));
			}
		}

		internal void AddPane(DockPane pane)
		{
			if (Panes.Contains(pane))
				return;

			Panes.Add(pane);
		}

		internal void AddFloatWindow(FloatWindow floatWindow)
		{
			if (FloatWindows.Contains(floatWindow))
				return;

			FloatWindows.Add(floatWindow);
		}

		private void CalculateDockPadding()
		{
			DockPadding.All = 0;

			foreach (DockState state in AutoHideDockStates)
			{
				int countAutoHidePanes = GetCountOfAutoHidePanes(state);

				if (countAutoHidePanes == 0)
					continue;

				Rectangle rectTabStrip = GetTabStripRectangle(state);

				if (state == DockState.DockLeftAutoHide)
					DockPadding.Left = rectTabStrip.Height;
				else if (state == DockState.DockRightAutoHide)
					DockPadding.Right = rectTabStrip.Height;
				else if (state == DockState.DockTopAutoHide)
					DockPadding.Top = rectTabStrip.Height;
				else if (state == DockState.DockBottomAutoHide)
					DockPadding.Bottom = rectTabStrip.Height;
			}
		}

		private void CalculateTabs(DockState dockState)
		{
			Rectangle rectTabStrip = GetTabStripRectangle(dockState);

			int imageHeight = rectTabStrip.Height - MeasureAutoHideTab.ImageGapTop -
				MeasureAutoHideTab.ImageGapBottom;
			int imageWidth = MeasureAutoHideTab.ImageWidth;
			if (imageHeight > MeasureAutoHideTab.ImageHeight)
				imageWidth = MeasureAutoHideTab.ImageWidth * (imageHeight/MeasureAutoHideTab.ImageHeight);

			using (Graphics g = this.CreateGraphics())
			{
				int x = MeasureAutoHideTab.TabGapLeft + rectTabStrip.X;
				foreach (DockPane pane in Panes)
				{
					if (pane.DockState != dockState)
						continue;

					int maxWidth = 0;
					foreach (DockContent content in pane.Contents)
					{
						int width = imageWidth + MeasureAutoHideTab.ImageGapLeft +
							MeasureAutoHideTab.ImageGapRight +
							(int)g.MeasureString(content.TabText, Font).Width + 1 +
							MeasureAutoHideTab.TextGapLeft + MeasureAutoHideTab.TextGapRight;
						if (width > maxWidth)
							maxWidth = width;
					}

					foreach (DockContent content in pane.Contents)
					{
						if (content.IsHidden)
							continue;

						content.TabX = x;
						if (content == pane.ActiveContent)
							content.TabWidth = maxWidth;
						else
							content.TabWidth = imageWidth + MeasureAutoHideTab.ImageGapLeft + MeasureAutoHideTab.ImageGapRight;
						x += content.TabWidth;
					}
					x += MeasureAutoHideTab.TabGapBetween;
				}
			}
		}

		private void DrawTab(Graphics g, DockState dockState, DockPane pane, DockContent content)
		{
			Rectangle rectTab = GetTabRectangle(dockState, content);
			if (rectTab.IsEmpty)
				return;

			g.FillRectangle(SystemBrushes.Control, rectTab);

			g.DrawLine(SystemPens.GrayText, rectTab.Left, rectTab.Top, rectTab.Left, rectTab.Bottom);
			g.DrawLine(SystemPens.GrayText, rectTab.Right, rectTab.Top, rectTab.Right, rectTab.Bottom);
			if (dockState == DockState.DockTopAutoHide || dockState == DockState.DockRightAutoHide)
				g.DrawLine(SystemPens.GrayText, rectTab.Left, rectTab.Bottom, rectTab.Right, rectTab.Bottom);
			else
				g.DrawLine(SystemPens.GrayText, rectTab.Left, rectTab.Top, rectTab.Right, rectTab.Top);


			// Set no rotate for drawing icon and text
			Matrix matrixRotate = g.Transform;
			g.Transform = MatrixIdentity;

			// Draw the icon
			Rectangle rectImage = rectTab;
			rectImage.X += MeasureAutoHideTab.ImageGapLeft;
			rectImage.Y += MeasureAutoHideTab.ImageGapTop;
			int imageHeight = rectTab.Height - MeasureAutoHideTab.ImageGapTop -	MeasureAutoHideTab.ImageGapBottom;
			int imageWidth = MeasureAutoHideTab.ImageWidth;
			if (imageHeight > MeasureAutoHideTab.ImageHeight)
				imageWidth = MeasureAutoHideTab.ImageWidth * (imageHeight/MeasureAutoHideTab.ImageHeight);
			rectImage.Height = imageHeight;
			rectImage.Width = imageWidth;
			rectImage = GetTransformedRectangle(dockState, rectImage);
			g.DrawIcon(content.Icon, rectImage);

			// Draw the text
			if (content == pane.ActiveContent)
			{
				Rectangle rectText = rectTab;
				rectText.X += MeasureAutoHideTab.ImageGapLeft + imageWidth + MeasureAutoHideTab.ImageGapRight + MeasureAutoHideTab.TextGapLeft;
				rectText.Width -= MeasureAutoHideTab.ImageGapLeft + imageWidth + MeasureAutoHideTab.ImageGapRight + MeasureAutoHideTab.TextGapLeft;
				rectText = GetTransformedRectangle(dockState, rectText);
				if (dockState == DockState.DockLeftAutoHide || dockState == DockState.DockRightAutoHide)
					g.DrawString(content.TabText, Font, SystemBrushes.FromSystemColor(SystemColors.ControlDarkDark), rectText, StringFormatTabVertical);
				else
					g.DrawString(content.TabText, Font, SystemBrushes.FromSystemColor(SystemColors.ControlDarkDark), rectText, StringFormatTabHorizontal);
			}

			// Set rotate back
			g.Transform = matrixRotate;
		}

		private void DrawTabStrip(Graphics g, DockState dockState)
		{
			Rectangle rectTabStrip = GetTabStripRectangle(dockState);

			if (rectTabStrip.IsEmpty)
				return;

			Matrix matrixIdentity = g.Transform;
			if (dockState == DockState.DockLeftAutoHide || dockState == DockState.DockRightAutoHide)
			{
				Matrix matrixRotated = new Matrix();
				matrixRotated.RotateAt(90, new PointF((float)rectTabStrip.X + (float)rectTabStrip.Height / 2,
					(float)rectTabStrip.Y + (float)rectTabStrip.Height / 2));
				g.Transform = matrixRotated;
			}

			g.FillRectangle(Brushes.WhiteSmoke, rectTabStrip);

			foreach (DockPane pane in Panes)
			{
				if (pane.DockState != dockState)
					continue;

				foreach (DockContent content in pane.Contents)
				{
					if (!content.IsHidden)
						DrawTab(g, dockState, pane, content);
				}
			}
			g.Transform = matrixIdentity;
		}

		internal Rectangle AutoHideWindowBounds
		{
			get
			{
				DockState state = AutoHideWindow.DockState;
				Rectangle rectDockArea = DockArea;
				if (ActiveAutoHideContent == null)
					return Rectangle.Empty;

				Rectangle rect = Rectangle.Empty;
				if (state == DockState.DockLeftAutoHide)
				{
					int autoHideSize = (int)(rectDockArea.Width * ActiveAutoHideContent.AutoHidePortion);
					rect.X = rectDockArea.X;
					rect.Y = rectDockArea.Y;
					rect.Width = autoHideSize;
					rect.Height = rectDockArea.Height;
				}
				else if (state == DockState.DockRightAutoHide)
				{
					int autoHideSize = (int)(rectDockArea.Width * ActiveAutoHideContent.AutoHidePortion);
					rect.X = rectDockArea.X + rectDockArea.Width - autoHideSize;
					rect.Y = rectDockArea.Y;
					rect.Width = autoHideSize;
					rect.Height = rectDockArea.Height;
				}
				else if (state == DockState.DockTopAutoHide)
				{
					int autoHideSize = (int)(rectDockArea.Height * ActiveAutoHideContent.AutoHidePortion);
					rect.X = rectDockArea.X;
					rect.Y = rectDockArea.Y;
					rect.Width = rectDockArea.Width;
					rect.Height = autoHideSize;
				}
				else if (state == DockState.DockBottomAutoHide)
				{
					int autoHideSize = (int)(rectDockArea.Height * ActiveAutoHideContent.AutoHidePortion);
					rect.X = rectDockArea.X;
					rect.Y = rectDockArea.Y + rectDockArea.Height - autoHideSize;
					rect.Width = rectDockArea.Width;
					rect.Height = autoHideSize;
				}

				return rect;
			}
		}

		private int GetCountOfAutoHidePanes(DockState dockState)
		{
			int result = 0;

			foreach (DockPane pane in Panes)
			{
				if (pane.DockState == dockState)
					result ++;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?