Пример #1
0
        protected override void onDragLeave(object sender, DragDropEventArgs e)
        {
            DockWindow dw = e.DragSource as DockWindow;

            if (dw != null)
            {
                dw.DockingPosition = Alignment.Undefined;
            }
            base.onDragLeave(sender, e);
            RegisterForGraphicUpdate();
        }
Пример #2
0
        internal void checkAlignments()
        {
            DockWindow dw = Children[0] as DockWindow;

            if (dw != null)
            {
                dw.DockingPosition = (Orientation == Orientation.Horizontal ? Alignment.Left : Alignment.Top);
            }
            dw = Children[Children.Count - 1] as DockWindow;
            if (dw != null)
            {
                dw.DockingPosition = (Orientation == Orientation.Horizontal ? Alignment.Right : Alignment.Bottom);
            }
        }
Пример #3
0
        public void Dock(DockWindow dw)
        {
            DockStack activeStack = this;

            if (Children.Count == 1)
            {
                Orientation = dw.DockingPosition.GetOrientation();
                if (Children [0] is DockWindow)
                {
                    (Children [0] as DockWindow).DockingPosition = dw.DockingPosition.GetOpposite();
                }
            }
            else if (Children.Count > 0 && dw.DockingPosition.GetOrientation() != Orientation)
            {
                activeStack             = new DockStack(IFace);
                activeStack.Orientation = dw.DockingPosition.GetOrientation();
                activeStack.Width       = focusedChild.Width;
                activeStack.Height      = focusedChild.Height;
                int idx = Children.IndexOf(focusedChild);
                RemoveChild(focusedChild);
                focusedChild.Height = Measure.Stretched;
                focusedChild.Width  = Measure.Stretched;
                InsertChild(idx, activeStack);
                activeStack.AddChild(focusedChild);
                activeStack.stretchedChild = focusedChild;
                if (focusedChild is DockWindow)
                {
                    (focusedChild as DockWindow).DockingPosition = dw.DockingPosition.GetOpposite();
                }
                focusedChild = null;
            }

            Rectangle r         = ClientRectangle;
            int       vTreshold = (int)(r.Height * dockThresh);
            int       hTreshold = (int)(r.Width * dockThresh);

            Console.WriteLine("Docking {0} as {2} in {1}", dw.Name, activeStack.Name, dw.DockingPosition);
            switch (dw.DockingPosition)
            {
            case Alignment.Top:
                dw.Height = vTreshold;
                dw.Width  = Measure.Stretched;
                activeStack.InsertChild(0, dw);
                activeStack.InsertChild(1, new Splitter(IFace));
                break;

            case Alignment.Bottom:
                dw.Height = vTreshold;
                dw.Width  = Measure.Stretched;
                activeStack.AddChild(new Splitter(IFace));
                activeStack.AddChild(dw);
                break;

            case Alignment.Left:
                dw.Width  = hTreshold;
                dw.Height = Measure.Stretched;
                activeStack.InsertChild(0, dw);
                activeStack.InsertChild(1, new Splitter(IFace));
                break;

            case Alignment.Right:
                dw.Width  = hTreshold;
                dw.Height = Measure.Stretched;
                activeStack.AddChild(new Splitter(IFace));
                activeStack.AddChild(dw);
                break;

            case Alignment.Center:
                dw.Width = dw.Height = Measure.Stretched;
                AddChild(dw);
                stretchedChild = dw;
                break;
            }
        }
Пример #4
0
        protected override void onDraw(Cairo.Context gr)
        {
            gr.Save();

            Rectangle rBack = new Rectangle(Slot.Size);

            Background.SetAsSource(gr, rBack);
            CairoHelpers.CairoRectangle(gr, rBack, CornerRadius);
            gr.Fill();

            if (ClipToClientRect)
            {
                //clip to client zone
                CairoHelpers.CairoRectangle(gr, ClientRectangle, CornerRadius);
                gr.Clip();
            }

            childrenRWLock.EnterReadLock();

            foreach (GraphicObject g in Children)
            {
                g.Paint(ref gr);
            }

            childrenRWLock.ExitReadLock();


            if (!IsDropTarget)
            {
                gr.Restore();
                return;
            }

            DockWindow dw = IFace.DragAndDropOperation.DragSource as DockWindow;

            if (dw == null)
            {
                return;
            }
            if (!dw.IsDocked)
            {
                Rectangle cb     = ClientRectangle;
                double    minDim = Math.Min(cb.Width, cb.Height);

                Rectangle r = rIn;
                if (Children.Count <= 1 || dw.DockingPosition.GetOrientation() == Orientation)
                {
                    r = cb;
                }

                switch (dw.DockingPosition)
                {
                case Alignment.Top:
                    gr.Rectangle(r.Left, r.Top, r.Width, r.Height * dockThresh);
                    break;

                case Alignment.Bottom:
                    gr.Rectangle(r.Left, r.Bottom - r.Height * dockThresh, r.Width, r.Height * dockThresh);
                    break;

                case Alignment.Left:
                    gr.Rectangle(r.Left, r.Top, r.Width * dockThresh, r.Height);
                    break;

                case Alignment.Right:
                    gr.Rectangle(r.Right - r.Width * dockThresh, r.Top, r.Width * dockThresh, r.Height);
                    break;

                case Alignment.Center:
                    r.Inflate((int)Math.Ceiling(Math.Min(r.Width, r.Height) * -0.05));
                    gr.Rectangle(r);
                    break;
                }
                gr.LineWidth = 1;
                gr.SetSourceRGBA(0.4, 0.4, 0.9, 0.4);
                gr.FillPreserve();
                gr.SetSourceRGBA(0.9, 0.9, 1.0, 0.8);
                gr.Stroke();
            }
            gr.Restore();
        }
Пример #5
0
        public override void onMouseMove(object sender, MouseMoveEventArgs e)
        {
            if (IsDropTarget)
            {
                DockWindow dw = IFace.DragAndDropOperation.DragSource as DockWindow;
                if (dw.IsDocked)
                {
                    base.onMouseMove(sender, e);
                    return;
                }

                Alignment curDockPos = dw.DockingPosition;
                dw.DockingPosition = Alignment.Undefined;

                Rectangle cb = ClientRectangle;
                Point     lm = ScreenPointToLocal(e.Position);

                if (Children.Count == 0)
                {
                    Rectangle r = cb;
                    r.Inflate(r.Width / -5, r.Height / -5);
                    if (r.ContainsOrIsEqual(lm))
                    {
                        dw.DockingPosition = Alignment.Center;
                    }
                }
                else
                {
                    rIn = cb;

                    if (Orientation == Orientation.Horizontal || Children.Count == 1)
                    {
                        if (lm.Y > cb.Top + cb.Height / 3 && lm.Y < cb.Bottom - cb.Height / 3)
                        {
                            if (lm.X < cb.Left + cb.Width / 3)
                            {
                                dw.DockingPosition = Alignment.Left;
                            }
                            else if (lm.X > cb.Right - cb.Width / 3)
                            {
                                dw.DockingPosition = Alignment.Right;
                            }
                        }
                        else
                        {
                            getFocusedChild(lm);
                            if (focusedChild != null)
                            {
                                if (lm.Y < rIn.Top + rIn.Height / 3)
                                {
                                    dw.DockingPosition = Alignment.Top;
                                }
                                else if (lm.Y > rIn.Bottom - rIn.Height / 3)
                                {
                                    dw.DockingPosition = Alignment.Bottom;
                                }
                            }
                        }
                    }
                    if (Orientation == Orientation.Vertical || Children.Count == 1)
                    {
                        if (lm.X > cb.Left + cb.Width / 3 && lm.X < cb.Right - cb.Width / 3)
                        {
                            if (lm.Y < cb.Top + cb.Height / 3)
                            {
                                dw.DockingPosition = Alignment.Top;
                            }
                            else if (lm.Y > cb.Bottom - cb.Height / 3)
                            {
                                dw.DockingPosition = Alignment.Bottom;
                            }
                        }
                        else
                        {
                            getFocusedChild(lm);
                            if (focusedChild != null)
                            {
                                if (lm.X < rIn.Left + rIn.Width / 3)
                                {
                                    dw.DockingPosition = Alignment.Left;
                                }
                                else if (lm.X > rIn.Right - rIn.Width / 3)
                                {
                                    dw.DockingPosition = Alignment.Right;
                                }
                            }
                        }
                    }
                }

                if (curDockPos != dw.DockingPosition)
                {
                    RegisterForGraphicUpdate();
                }
            }
            base.onMouseMove(sender, e);
        }