- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Windows.Forms;
- using System.Drawing;
- using System.Drawing.Drawing2D;
- using System.ComponentModel;
- namespace WeifenLuo.WinFormsUI.Docking
- {
- partial class DockPanel
- {
- private sealed class SplitterDragHandler : DragHandler
- {
- private class SplitterOutline
- {
- public SplitterOutline()
- {
- m_dragForm = new DragForm();
- SetDragForm(Rectangle.Empty);
- DragForm.BackColor = Color.Black;
- DragForm.Opacity = 0.7;
- DragForm.Show(false);
- }
- DragForm m_dragForm;
- private DragForm DragForm
- {
- get { return m_dragForm; }
- }
- public void Show(Rectangle rect)
- {
- SetDragForm(rect);
- }
- public void Close()
- {
- DragForm.Close();
- }
- private void SetDragForm(Rectangle rect)
- {
- DragForm.Bounds = rect;
- if (rect == Rectangle.Empty)
- DragForm.Region = new Region(Rectangle.Empty);
- else if (DragForm.Region != null)
- DragForm.Region = null;
- }
- }
- public SplitterDragHandler(DockPanel dockPanel)
- : base(dockPanel)
- {
- }
- public new ISplitterDragSource DragSource
- {
- get { return base.DragSource as ISplitterDragSource; }
- private set { base.DragSource = value; }
- }
- private SplitterOutline m_outline;
- private SplitterOutline Outline
- {
- get { return m_outline; }
- set { m_outline = value; }
- }
- private Rectangle m_rectSplitter;
- private Rectangle RectSplitter
- {
- get { return m_rectSplitter; }
- set { m_rectSplitter = value; }
- }
- public void BeginDrag(ISplitterDragSource dragSource, Rectangle rectSplitter)
- {
- DragSource = dragSource;
- RectSplitter = rectSplitter;
- if (!BeginDrag())
- {
- DragSource = null;
- return;
- }
- Outline = new SplitterOutline();
- Outline.Show(rectSplitter);
- DragSource.BeginDrag(rectSplitter);
- }
- protected override void OnDragging()
- {
- Outline.Show(GetSplitterOutlineBounds(Control.MousePosition));
- }
- protected override void OnEndDrag(bool abort)
- {
- DockPanel.SuspendLayout(true);
- Outline.Close();
- if (!abort)
- DragSource.MoveSplitter(GetMovingOffset(Control.MousePosition));
- DragSource.EndDrag();
- DockPanel.ResumeLayout(true, true);
- }
- private int GetMovingOffset(Point ptMouse)
- {
- Rectangle rect = GetSplitterOutlineBounds(ptMouse);
- if (DragSource.IsVertical)
- return rect.X - RectSplitter.X;
- else
- return rect.Y - RectSplitter.Y;
- }
- private Rectangle GetSplitterOutlineBounds(Point ptMouse)
- {
- Rectangle rectLimit = DragSource.DragLimitBounds;
- Rectangle rect = RectSplitter;
- if (rectLimit.Width <= 0 || rectLimit.Height <= 0)
- return rect;
- if (DragSource.IsVertical)
- {
- rect.X += ptMouse.X - StartMousePosition.X;
- rect.Height = rectLimit.Height;
- }
- else
- {
- rect.Y += ptMouse.Y - StartMousePosition.Y;
- rect.Width = rectLimit.Width;
- }
- if (rect.Left < rectLimit.Left)
- rect.X = rectLimit.X;
- if (rect.Top < rectLimit.Top)
- rect.Y = rectLimit.Y;
- if (rect.Right > rectLimit.Right)
- rect.X -= rect.Right - rectLimit.Right;
- if (rect.Bottom > rectLimit.Bottom)
- rect.Y -= rect.Bottom - rectLimit.Bottom;
- return rect;
- }
- }
- private SplitterDragHandler m_splitterDragHandler = null;
- private SplitterDragHandler GetSplitterDragHandler()
- {
- if (m_splitterDragHandler == null)
- m_splitterDragHandler = new SplitterDragHandler(this);
- return m_splitterDragHandler;
- }
- internal void BeginDrag(ISplitterDragSource dragSource, Rectangle rectSplitter)
- {
- GetSplitterDragHandler().BeginDrag(dragSource, rectSplitter);
- }
- }
- }