コード例 #1
0
        public IDockingPanel InsertPanel(int index)
        {
            if (_panels.Count > index)
            {
                DockControlContainer existingContainer = _panels[index] as DockControlContainer;

                if (existingContainer.DockedControlList.Count == 0)
                {
                    return(existingContainer);
                }
            }

            DockControlContainer container = new DockControlContainer();

            container.MenuStrip = _menuStrip;
            container.Dock      = _dockStyle;
            container.Parent    = _manager;

            _panels.Insert(index, container);

            container.Visible = true;
            _manager.PerformLayout();

            container.Visible = false;
            _manager.PerformLayout();

            return(container);
        }
コード例 #2
0
        public void DockControl(int panelIndex, int index, DockingType direction)
        {
            if (direction == DockingType.Floating)
            {
                throw new ArgumentException("Can't dock to a docking type of floating");
            }
            else
            {
                bool autoHide  = this.AutoHide;
                bool cancelled = this.Cancelled;

                if (this.AutoHide)
                {
                    this.AutoHide = false;
                }

                this.Cancelled = false;

                DockControlContainerCollection panels    = DockControlContainerCollectionHelpers.GetCollection(_manager, direction);
                DockControlContainer           container = panels[panelIndex] as DockControlContainer;

                container.DockControl(this, container.DockedControlList.Count, index);

                RemoveFloatingForm();

                this.AutoHide  = autoHide;
                this.Cancelled = cancelled;
            }
        }
コード例 #3
0
        public AutoResizeControl(DockingControl control, DockControlContainer container)
        {
            InitializeComponent();

            this.Width  = control.Width;
            this.Height = control.Height;

            _animator = new ControlResizeAnimator(this, control.Width);

            _inner     = control;
            _container = container;

            _inner.Parent = this;
            _inner.Dock   = DockStyle.Fill;

            DragHandler dragHandler = new DragHandler(this, new DragHandlerHitTester(HitTestSizeArea));

            _dragHandler = new SplitterDragHandler(dragHandler, SplitterDragHandlerDirection.EastWest);

            _dragHandler.EndSplitterDrag += new SplitterDragEndHandler(_dragHandler_EndSplitterDrag);

            _autoHideHandler       = new AutoHideControlHandler(this);
            _autoHideHandler.Hide += new Darwen.Windows.Forms.General.AutoHideHandler(_autoHideHandler_Hide);

            _paddingDrawHandler = new PaddingDrawHandler(this);
        }
コード例 #4
0
 private void LayoutControls(DockControlContainerCollection container)
 {
     for (int index = 0; index < container.Count; index += 1)
     {
         DockControlContainer control = container[index] as DockControlContainer;
         control.SendToBack();
     }
 }
コード例 #5
0
        internal DockControlContainer GetContainerAtPoint(Point point)
        {
            DockControlContainer container = null;

            container = GetContainerAtPoint(_leftDockControlContainers, point);
            container = (container == null) ? GetContainerAtPoint(_rightDockControlContainers, point) : container;
            container = (container == null) ? GetContainerAtPoint(_topDockControlContainers, point) : container;
            container = (container == null) ? GetContainerAtPoint(_bottomDockControlContainers, point) : container;

            return(container);
        }
コード例 #6
0
        public TabbedDockControlContainerHandler(DockControlContainer container)
        {
            _container = container;

            _dockingControlToPageMap = new Dictionary <DockingControl, TabPage>();

            _tabControl           = new TabControl();
            _tabControl.Dock      = DockStyle.Fill;
            _tabControl.Alignment = TabAlignment.Bottom;
            _tabControl.Parent    = _container;

            _tabControl.SelectedIndexChanged += new EventHandler(_tabControl_SelectedIndexChanged);
        }
コード例 #7
0
        private static DockingControl GetControlBefore(DockControlContainer container, int index)
        {
            DockingControl controlBefore = null;

            for (int indexBefore = index - 1; controlBefore == null && indexBefore >= 0; indexBefore -= 1)
            {
                controlBefore = container.DockedControlList[indexBefore];

                if (controlBefore.AutoHide || controlBefore.Cancelled)
                {
                    controlBefore = null;
                }
            }

            return(controlBefore);
        }
コード例 #8
0
        public void DockControl(DockingControl control, int dockAtIndex, int dimension)
        {
            using (RedrawStopper stopRedraws = new RedrawStopper(this))
            {
                DockControlContainer oldContainer = ControlHelpers.FindParentControl <DockControlContainer>(control);

                if (oldContainer != null && oldContainer != this)
                {
                    oldContainer.RemoveControl(control);
                }

                AddControl(control, dockAtIndex, dimension);
            }

            Invalidate(true);
        }
コード例 #9
0
        private static DockingControl GetControlAfter(DockControlContainer container, int index)
        {
            DockingControl controlAfter = null;

            for (int indexAfter = index + 1; controlAfter == null && indexAfter < container.DockedControlList.Count; indexAfter += 1)
            {
                controlAfter = container.DockedControlList[indexAfter];

                if (controlAfter.AutoHide || controlAfter.Cancelled)
                {
                    controlAfter = null;
                }
            }

            return(controlAfter);
        }
コード例 #10
0
        private Rectangle GetContainerDragDrawRectangle(DockControlContainer container, Point pointInScreen)
        {
            Point     pointInControl     = container.PointToClient(pointInScreen);
            Rectangle clientRectangle    = container.ClientRectangle;
            Rectangle rectangleToDraw    = Rectangle.Empty;
            Rectangle containerRectangle = container.RectangleToScreen(container.ClientRectangle);

            switch (container.Dock)
            {
            case DockStyle.Top:
            case DockStyle.Bottom:
                if (pointInControl.Y > clientRectangle.Y && pointInControl.Y < clientRectangle.Y + DockingBarSize)
                {
                    rectangleToDraw        = containerRectangle;
                    rectangleToDraw.Height = DockingBarSize;
                }
                else if (pointInControl.Y < clientRectangle.Bottom && pointInControl.Y > clientRectangle.Bottom - DockingBarSize)
                {
                    rectangleToDraw        = containerRectangle;
                    rectangleToDraw.Y      = containerRectangle.Bottom - DockingBarSize;
                    rectangleToDraw.Height = DockingBarSize;
                }

                break;

            case DockStyle.Left:
            case DockStyle.Right:
                if (pointInControl.X > clientRectangle.X && pointInControl.X < clientRectangle.X + DockingBarSize)
                {
                    rectangleToDraw       = containerRectangle;
                    rectangleToDraw.Width = DockingBarSize;
                }
                else if (pointInControl.X < clientRectangle.Right && pointInControl.X > clientRectangle.Right - DockingBarSize)
                {
                    rectangleToDraw       = containerRectangle;
                    rectangleToDraw.X     = containerRectangle.Right - DockingBarSize;
                    rectangleToDraw.Width = DockingBarSize;
                }

                break;

            default:
                break;
            }

            return(rectangleToDraw);
        }
コード例 #11
0
        private void DockControl(Point dropPoint, DockControlContainer container, int dimension)
        {
            Point containerLocalDropPoint = container.PointToClient(PointToScreen(dropPoint));

            int index = 0;

            DockedControlCollection controls = container.DockedControls as DockedControlCollection;

            foreach (DockingControl child in controls)
            {
                Rectangle bounds = child.Bounds;

                switch (container.Dock)
                {
                case DockStyle.Top:
                case DockStyle.Bottom:
                    if (bounds.Right >= containerLocalDropPoint.X)
                    {
                        if (containerLocalDropPoint.X < (bounds.Left + bounds.Right) / 2)
                        {
                            container.DockControl(this, index, dimension);
                            return;
                        }
                    }

                    break;

                case DockStyle.Left:
                case DockStyle.Right:
                    if (bounds.Bottom >= containerLocalDropPoint.Y)
                    {
                        if (containerLocalDropPoint.Y < (bounds.Top + bounds.Bottom) / 2)
                        {
                            container.DockControl(this, index, dimension);
                            return;
                        }
                    }

                    break;
                }

                index += 1;
            }

            container.DockControl(this, container.DockedControlList.Count, dimension);
        }
コード例 #12
0
        private void _toolStripCaption_CaptionDrag(object sender, MouseEventArgs e)
        {
            Point pointInScreen            = this.PointToScreen(e.Location);
            DockControlContainer container = _manager.GetContainerAtPoint(_manager.PointToClient(pointInScreen));

            if (container == null)
            {
                Rectangle dragRectangle = DockControlHelpers.GetDropXorDragRect(_manager, pointInScreen, DockingBarSize);

                if (!dragRectangle.IsEmpty)
                {
                    _dragger.SetRectangle(_manager.RectangleToScreen(dragRectangle));
                    return;
                }
            }
            else
            {
                Rectangle rectangleToDraw = GetContainerDragDrawRectangle(container, pointInScreen);

                if (!rectangleToDraw.IsEmpty)
                {
                    _dragger.SetRectangle(rectangleToDraw);
                    return;
                }

                if (container.Tabbed)
                {
                    _dragger.SetRectangle(container.RectangleToScreen(container.ClientRectangle));
                    return;
                }
                else
                {
                    DockingControl control = container.GetDockingControlAtPoint(container.PointToClient(pointInScreen));

                    if (control != null)
                    {
                        Point pointInControl = control.PointToClient(pointInScreen);
                        rectangleToDraw = GetContolDragDrawRectangle(container, control, pointInControl);
                        _dragger.SetRectangle(control.RectangleToScreen(rectangleToDraw));
                        return;
                    }
                }
            }

            _dragger.MoveTo(e.Location);
        }
コード例 #13
0
        static public DockControlContainer GetDropContainer(DockingManagerControl manager, Point screenDropPoint, int dockingBarSize)
        {
            Point managerLocalDropPoint    = manager.PointToClient(screenDropPoint);
            DockControlContainer container = manager.GetContainerAtPoint(managerLocalDropPoint);

            if (container == null)
            {
                Rectangle managerClientBounds = manager.DockingBounds;

                if (!HasVisibleContainer(manager.Panels[DockingType.Left]))
                {
                    if (managerLocalDropPoint.X < managerClientBounds.Left + dockingBarSize)
                    {
                        container = manager.Panels[DockingType.Left][0] as DockControlContainer;
                    }
                }

                if (!HasVisibleContainer(manager.Panels[DockingType.Right]))
                {
                    if (managerLocalDropPoint.X > managerClientBounds.Right - dockingBarSize)
                    {
                        container = manager.Panels[DockingType.Right][0] as DockControlContainer;
                    }
                }

                if (!HasVisibleContainer(manager.Panels[DockingType.Top]))
                {
                    if (managerLocalDropPoint.Y < managerClientBounds.Top + dockingBarSize)
                    {
                        container = manager.Panels[DockingType.Top][0] as DockControlContainer;
                    }
                }

                if (!HasVisibleContainer(manager.Panels[DockingType.Bottom]))
                {
                    if (managerLocalDropPoint.Y > managerClientBounds.Bottom - dockingBarSize)
                    {
                        container = manager.Panels[DockingType.Bottom][0] as DockControlContainer;
                    }
                }
            }

            return(container);
        }
コード例 #14
0
 public void Remove(DockControlContainer container)
 {
     if (_panels.Count == 1)
     {
         throw new InvalidOperationException("You must have at least one panel in each direction");
     }
     else
     {
         if (container.DockedControlList.Count > 0)
         {
             throw new InvalidOperationException("Can only remove empty panels");
         }
         else
         {
             _panels.Remove(container);
             container.Dispose();
         }
     }
 }
コード例 #15
0
        public void FloatControl(Rectangle bounds)
        {
            using (RedrawStopper redrawStopper = new RedrawStopper(_manager.ParentForm, true))
            {
                if (this.AutoHide)
                {
                    this.AutoHide = false;
                }

                DockControlContainer oldContainer = _container;
                Form parentForm = this.ParentForm;

                if (oldContainer != null)
                {
                    oldContainer.RemoveControl(this);
                }

                if (_floatingForm == null || parentForm != _floatingForm)
                {
                    _floatingForm = new FloatingForm(this, _manager);
                    _autoHidetoolStripButton.Visible = false;
                    _tabsToolStripButton.Visible     = false;
                }

                _floatingForm.Bounds = bounds;

                if (_floatingForm.Visible)
                {
                    _floatingForm.Invalidate();
                }
                else if (_floatingForm.Loaded)
                {
                    _floatingForm.Visible = !this.Cancelled;
                }
                else if (!this.Cancelled)
                {
                    _floatingForm.Show(parentForm);
                }
            }
        }
コード例 #16
0
        protected virtual void OnEndCaptionDrag(Point dropPoint, Rectangle endDragBounds)
        {
            using (RedrawStopper stopRedraws = new RedrawStopper(_manager, true))
            {
                DockControlContainer container = GetDropContainer(dropPoint);

                if (container == null)
                {
                    endDragBounds.X      -= FloatingForm.PaddingSize;
                    endDragBounds.Y      -= FloatingForm.PaddingSize;
                    endDragBounds.Width  += 2 * FloatingForm.PaddingSize;
                    endDragBounds.Height += 2 * FloatingForm.PaddingSize;
                    FloatControl(endDragBounds);
                }
                else
                {
                    int dimension = DockControlHelpers.GetDockedDimension(this, container.Dock);
                    container = DockControlHelpers.CreateNewContainerIfNecessary(_manager, container, PointToScreen(dropPoint), DockingBarSize);
                    DockControl(dropPoint, container, dimension);
                    RemoveFloatingForm();
                }
            }
        }
コード例 #17
0
 public int IndexOf(DockControlContainer panel)
 {
     return(_panels.IndexOf(panel));
 }
コード例 #18
0
        public SplitterDockControlContainerHandler(DockControlContainer container)
        {
            _container = container;

            _splitters = new List <Splitter>();
        }
コード例 #19
0
 static private DockControlContainerCollection GetDockControlContainerCollection(DockingManagerControl manager, DockControlContainer container)
 {
     return(DockControlContainerCollectionHelpers.GetCollection(manager, container.Dock));
 }
コード例 #20
0
        static public DockControlContainer CreateNewContainerIfNecessary(DockingManagerControl manager, DockControlContainer container, Point screenDropPoint, int dockingBarSize)
        {
            DockControlContainer result = container;

            if (container.Visible)
            {
                Point managerLocalDropPoint = manager.PointToClient(screenDropPoint);
                DockControlContainerCollection containerCollection = GetDockControlContainerCollection(manager, container);
                int index = containerCollection.IndexOf(container);

                switch (container.Dock)
                {
                case DockStyle.Top:
                    if (managerLocalDropPoint.Y < container.Top + dockingBarSize)
                    {
                        result = containerCollection.InsertPanel(index + 1) as DockControlContainer;
                    }
                    else if (managerLocalDropPoint.Y > container.Bottom - dockingBarSize)
                    {
                        result = containerCollection.InsertPanel(index) as DockControlContainer;
                    }

                    break;

                case DockStyle.Bottom:

                    if (managerLocalDropPoint.Y < container.Top + dockingBarSize)
                    {
                        result = containerCollection.InsertPanel(index) as DockControlContainer;
                    }
                    else if (managerLocalDropPoint.Y > container.Bottom - dockingBarSize)
                    {
                        result = containerCollection.InsertPanel(index + 1) as DockControlContainer;
                    }

                    break;

                case DockStyle.Left:

                    if (managerLocalDropPoint.X < container.Left + dockingBarSize)
                    {
                        result = containerCollection.InsertPanel(index + 1) as DockControlContainer;
                    }
                    else if (managerLocalDropPoint.X > container.Right - dockingBarSize)
                    {
                        result = containerCollection.InsertPanel(index) as DockControlContainer;
                    }

                    break;

                case DockStyle.Right:

                    if (managerLocalDropPoint.X < container.Left + dockingBarSize)
                    {
                        result = containerCollection.InsertPanel(index) as DockControlContainer;
                    }
                    else if (managerLocalDropPoint.X > container.Right - dockingBarSize)
                    {
                        result = containerCollection.InsertPanel(index + 1) as DockControlContainer;
                    }

                    break;

                default:
                    throw new InvalidOperationException("Invalid dock style");
                }
            }

            return(result);
        }
コード例 #21
0
 public DockedControlCollection(DockControlContainer container)
 {
     _container       = container;
     _dockedControls  = new List <DockingControl>();
     _iDockedControls = new List <IDockingControl>();
 }
コード例 #22
0
        private Rectangle GetContolDragDrawRectangle(DockControlContainer container, DockingControl control, Point pointInControl)
        {
            Rectangle rectangleToDraw = Rectangle.Empty;

            Rectangle containerRectangle = control.RectangleToClient(container.RectangleToScreen(container.ClientRectangle));
            Rectangle clientRectangle    = control.ClientRectangle;

            int index = container.DockedControlList.IndexOf(control);

            DockingControl controlBefore = GetControlBefore(container, index);
            DockingControl controlAfter  = GetControlAfter(container, index);

            Rectangle bounds       = control.Bounds;
            Rectangle beforeBounds = (controlBefore == null) ? Rectangle.Empty : controlBefore.Bounds;
            Rectangle afterBounds  = (controlAfter == null) ? Rectangle.Empty : controlAfter.Bounds;

            switch (container.Dock)
            {
            case DockStyle.Left:
            case DockStyle.Right:
                if (container.Tabbed)
                {
                    rectangleToDraw = clientRectangle;
                }
                else if (pointInControl.Y < clientRectangle.Y + (clientRectangle.Height / 2))
                {
                    if (controlBefore == null)
                    {
                        rectangleToDraw         = clientRectangle;
                        rectangleToDraw.Height /= 2;
                    }
                    else
                    {
                        rectangleToDraw = new Rectangle(
                            beforeBounds.Left, beforeBounds.Top + (beforeBounds.Height / 2),
                            beforeBounds.Right, (bounds.Top + (bounds.Height / 2)) - (beforeBounds.Top + (beforeBounds.Height / 2)));

                        rectangleToDraw = control.RectangleToClient(container.RectangleToScreen(rectangleToDraw));
                    }
                }
                else
                {
                    if (controlAfter == null)
                    {
                        rectangleToDraw         = clientRectangle;
                        rectangleToDraw.Y       = clientRectangle.Bottom - (clientRectangle.Height / 2);
                        rectangleToDraw.Height /= 2;
                    }
                    else
                    {
                        rectangleToDraw = new Rectangle(
                            bounds.Left, bounds.Top + (bounds.Height / 2),
                            bounds.Right, (afterBounds.Top + (afterBounds.Height / 2)) - (bounds.Top + (bounds.Height / 2)));

                        rectangleToDraw = control.RectangleToClient(container.RectangleToScreen(rectangleToDraw));
                    }
                }

                break;

            case DockStyle.Bottom:
            case DockStyle.Top:
                if (container.Tabbed)
                {
                    rectangleToDraw = clientRectangle;
                }
                else if (pointInControl.X < clientRectangle.X + (clientRectangle.Width / 2))
                {
                    if (controlBefore == null)
                    {
                        rectangleToDraw        = clientRectangle;
                        rectangleToDraw.Width /= 2;
                    }
                    else
                    {
                        rectangleToDraw = new Rectangle(
                            beforeBounds.Left + (beforeBounds.Width / 2), beforeBounds.Top,
                            (bounds.Left + (bounds.Width / 2)) - (beforeBounds.Left + (beforeBounds.Width / 2)), beforeBounds.Height);

                        rectangleToDraw = control.RectangleToClient(container.RectangleToScreen(rectangleToDraw));
                    }
                }
                else
                {
                    if (controlAfter == null)
                    {
                        rectangleToDraw        = clientRectangle;
                        rectangleToDraw.X      = clientRectangle.Right - (clientRectangle.Width / 2);
                        rectangleToDraw.Width /= 2;
                    }
                    else
                    {
                        rectangleToDraw = new Rectangle(
                            bounds.Left + (bounds.Width / 2), bounds.Top,
                            (afterBounds.Left + (afterBounds.Width / 2)) - (bounds.Left + (bounds.Width / 2)), bounds.Height);

                        rectangleToDraw = control.RectangleToClient(container.RectangleToScreen(rectangleToDraw));
                    }
                }

                break;

            default:
                break;
            }

            return(rectangleToDraw);
        }
コード例 #23
0
 public bool Contains(DockControlContainer panel)
 {
     return(_panels.Contains(panel));
 }