using System; using System.Collections; using System.ComponentModel; using System.Drawing; using System.Windows.Forms; namespace WeifenLuo.WinFormsUI.Docking { partial class DockPane { private class SplitterControl : Control, ISplitterDragSource { DockPane m_pane; public SplitterControl(DockPane pane) { SetStyle(ControlStyles.Selectable, false); m_pane = pane; } public DockPane DockPane { get { return m_pane; } } private DockAlignment m_alignment; public DockAlignment Alignment { get { return m_alignment; } set { m_alignment = value; if (m_alignment == DockAlignment.Left || m_alignment == DockAlignment.Right) Cursor = Cursors.VSplit; else if (m_alignment == DockAlignment.Top || m_alignment == DockAlignment.Bottom) Cursor = Cursors.HSplit; else Cursor = Cursors.Default; if (DockPane.DockState == DockState.Document) Invalidate(); } } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); if (DockPane.DockState != DockState.Document) return; Graphics g = e.Graphics; Rectangle rect = ClientRectangle; if (Alignment == DockAlignment.Top || Alignment == DockAlignment.Bottom) g.DrawLine(SystemPens.ControlDark, rect.Left, rect.Bottom - 1, rect.Right, rect.Bottom - 1); else if (Alignment == DockAlignment.Left || Alignment == DockAlignment.Right) g.DrawLine(SystemPens.ControlDarkDark, rect.Right - 1, rect.Top, rect.Right - 1, rect.Bottom); } protected override void OnMouseDown(MouseEventArgs e) { base.OnMouseDown(e); if (e.Button != MouseButtons.Left) return; DockPane.DockPanel.BeginDrag(this, Parent.RectangleToScreen(Bounds)); } #region ISplitterDragSource Members void ISplitterDragSource.BeginDrag(Rectangle rectSplitter) { } void ISplitterDragSource.EndDrag() { } bool ISplitterDragSource.IsVertical { get { NestedDockingStatus status = DockPane.NestedDockingStatus; return (status.DisplayingAlignment == DockAlignment.Left || status.DisplayingAlignment == DockAlignment.Right); } } Rectangle ISplitterDragSource.DragLimitBounds { get { NestedDockingStatus status = DockPane.NestedDockingStatus; Rectangle rectLimit = Parent.RectangleToScreen(status.LogicalBounds); if (((ISplitterDragSource)this).IsVertical) { rectLimit.X += MeasurePane.MinSize; rectLimit.Width -= 2 * MeasurePane.MinSize; } else { rectLimit.Y += MeasurePane.MinSize; rectLimit.Height -= 2 * MeasurePane.MinSize; } return rectLimit; } } void ISplitterDragSource.MoveSplitter(int offset) { NestedDockingStatus status = DockPane.NestedDockingStatus; double proportion = status.Proportion; if (status.LogicalBounds.Width <= 0 || status.LogicalBounds.Height <= 0) return; else if (status.DisplayingAlignment == DockAlignment.Left) proportion += ((double)offset) / (double)status.LogicalBounds.Width; else if (status.DisplayingAlignment == DockAlignment.Right) proportion -= ((double)offset) / (double)status.LogicalBounds.Width; else if (status.DisplayingAlignment == DockAlignment.Top) proportion += ((double)offset) / (double)status.LogicalBounds.Height; else proportion -= ((double)offset) / (double)status.LogicalBounds.Height; DockPane.SetNestedDockingProportion(proportion); } #region IDragSource Members Control IDragSource.DragControl { get { return this; } } #endregion #endregion } private SplitterControl m_splitter; private SplitterControl Splitter { get { return m_splitter; } } internal Rectangle SplitterBounds { set { Splitter.Bounds = value; } } internal DockAlignment SplitterAlignment { set { Splitter.Alignment = value; } } } }