Ejemplo n.º 1
0
        internal static void PutWindowNear(Window window, Rect rect, PlacementSide side, PlacementInOut inOut)
        {
            Point corner   = SelectPlacementSide(side, rect);
            Rect  workArea = MonitorWorkAreaFromRect(rect);

            Rect windowRect = RectFromPlacementSide(side, inOut, corner, (int)window.ActualWidth, (int)window.ActualHeight);

            if (windowRect.Left < workArea.Left)
            {
                windowRect.X += workArea.Left - windowRect.Left;
            }
            else if (windowRect.Right > workArea.Right)
            {
                windowRect.X -= windowRect.Right - workArea.Right;
            }

            if (windowRect.Top < workArea.Top)
            {
                windowRect.Y += workArea.Top - windowRect.Top;
            }
            else if (windowRect.Bottom > workArea.Bottom)
            {
                windowRect.Y -= windowRect.Bottom - workArea.Bottom;
            }

            window.Left = windowRect.X;
            window.Top  = windowRect.Y;
        }
Ejemplo n.º 2
0
        internal static Rect RectFromPlacementSide(PlacementSide side, PlacementInOut inOut, Point corner, int width, int height)
        {
            Rect rect = new Rect();

            switch (side)
            {
            case PlacementSide.TOP_LEFT:
            case PlacementSide.CENTER_LEFT:
            case PlacementSide.BOTTOM_LEFT:
                rect.X = corner.X;
                break;

            case PlacementSide.TOP_CENTER:
            case PlacementSide.CENTER:
            case PlacementSide.BOTTOM_CENTER:
            default:
                rect.X = corner.X - width / 2;
                break;

            case PlacementSide.TOP_RIGHT:
            case PlacementSide.CENTER_RIGHT:
            case PlacementSide.BOTTOM_RIGHT:
                rect.X = corner.X - width;
                break;
            }

            switch (side)
            {
            case PlacementSide.TOP_LEFT:
            case PlacementSide.TOP_CENTER:
            case PlacementSide.TOP_RIGHT:
                rect.Y = corner.Y;
                break;

            case PlacementSide.CENTER_LEFT:
            case PlacementSide.CENTER:
            case PlacementSide.CENTER_RIGHT:
            default:
                rect.Y = corner.Y - height / 2;
                break;

            case PlacementSide.BOTTOM_LEFT:
            case PlacementSide.BOTTOM_CENTER:
            case PlacementSide.BOTTOM_RIGHT:
                rect.Y = corner.Y - height;
                break;
            }

            rect.Width  = width;
            rect.Height = height;

            /* Change some values for outside placement.  If the placement is
             * on the top or bottom, clamp the opposite side of the Unicodex
             * window to that edge.  Otherwise, if it's center-left or
             * center-right, clamp the opposite side in the left/right
             * direction.  True-center positioning is unchanged. */
            if (inOut == PlacementInOut.OUTSIDE)
            {
                switch (side)
                {
                case PlacementSide.TOP_LEFT:
                case PlacementSide.TOP_CENTER:
                case PlacementSide.TOP_RIGHT:
                    rect.Y -= height;
                    break;

                case PlacementSide.BOTTOM_LEFT:
                case PlacementSide.BOTTOM_CENTER:
                case PlacementSide.BOTTOM_RIGHT:
                    rect.Y += height;
                    break;

                case PlacementSide.CENTER_LEFT:
                    rect.X -= width;
                    break;

                case PlacementSide.CENTER_RIGHT:
                    rect.X += width;
                    break;
                }
            }

            return(rect);
        }