Example #1
0
        private protected Point GetMoveFocusDestinationLocation(double distance)
        {
            Point Origin;

            if (Focus is ILayoutTextFocus AsTextFocus)
            {
                Debug.Assert(CaretPosition >= 0 && CaretPosition <= MaxCaretPosition);

                ILayoutTextFocusableCellView CellView = AsTextFocus.CellView;
                double Position;

                if (CaretMode == CaretModes.Override && CaretPosition < MaxCaretPosition)
                {
                    Position = (CellView.CellSize.Width.Draw * ((CaretPosition * 2) + 1)) / (MaxCaretPosition * 2);
                    Origin   = CellView.CellOrigin.Moved(new Measure()
                    {
                        Draw = Position
                    }, new Measure()
                    {
                        Draw = CellView.CellSize.Height.Draw / 2
                    });
                }
                else
                {
                    Position = (CellView.CellSize.Width.Draw * CaretPosition) / MaxCaretPosition;
                    Origin   = CellView.CellOrigin.Moved(new Measure()
                    {
                        Draw = Position
                    }, new Measure()
                    {
                        Draw = CellView.CellSize.Height.Draw / 2
                    });
                }
            }
            else
            {
                ILayoutFocusableCellView CellView = Focus.CellView;
                Origin = CellView.CellOrigin.Moved(new Measure()
                {
                    Draw = CellView.CellSize.Width.Draw / 2
                }, new Measure()
                {
                    Draw = CellView.CellSize.Height.Draw / 2
                });
            }

            Debug.Assert(RegionHelper.IsValid(Origin));

            Origin = Origin.Moved(Measure.Zero, new Measure()
            {
                Draw = distance
            });

            return(Origin);
        }
Example #2
0
        private void FindClosestFocusVertical(double distance, int oldFocusIndex, ref int newFocusIndex, ref double bestVerticalDistance, ref double bestHorizontalDistance)
        {
            Point Origin = GetMoveFocusDestinationLocation(distance);

            for (int i = 0; i < FocusChain.Count; i++)
            {
                int          CellIndex = distance < 0 ? i : FocusChain.Count - i - 1;
                ILayoutFocus TestFocus = (ILayoutFocus)FocusChain[CellIndex];

                ILayoutFocusableCellView CellView = TestFocus.CellView;

                // If we check against the current focus, it might be the closest cell and then we don't move!
                if (CellIndex == oldFocusIndex)
                {
                    continue;
                }

                // Don't consider cells that are in the wrong direction;
                if ((distance < 0 && CellView.CellOrigin.Y.Draw >= Origin.Y.Draw) || (distance > 0 && CellView.CellOrigin.Y.Draw + CellView.CellSize.Height.Draw <= Origin.Y.Draw))
                {
                    continue;
                }

                if (CellView.CellRect.IsPointInRect(Origin.X.Draw, Origin.Y.Draw))
                {
                    newFocusIndex = CellIndex;
                    break;
                }
                else
                {
                    Point Center = CellView.CellRect.Center;

                    double VerticalDistance   = Math.Abs((Center.Y - Origin.Y).Draw);
                    double HorizontalDistance = Math.Abs((Center.X - Origin.X).Draw);

                    if (newFocusIndex < 0 || bestVerticalDistance > VerticalDistance || (RegionHelper.IsZero(bestVerticalDistance - VerticalDistance) && bestHorizontalDistance > HorizontalDistance))
                    {
                        bestVerticalDistance   = VerticalDistance;
                        bestHorizontalDistance = HorizontalDistance;
                        newFocusIndex          = CellIndex;
                    }
                }
            }
        }
Example #3
0
        private void FindClosestFocusHorizontal(int direction, ref int newFocusIndex, ref double bestSquaredDistance)
        {
            Point FocusCellOrigin = Focus.CellView.CellOrigin;
            Size  FocusCellSize   = Focus.CellView.CellSize;
            Point FocusCellCenter = Focus.CellView.CellRect.Center;

            for (int i = 0; i < FocusChain.Count; i++)
            {
                int          CellIndex = direction < 0 ? i : FocusChain.Count - i - 1;
                ILayoutFocus TestFocus = (ILayoutFocus)FocusChain[CellIndex];

                ILayoutFocusableCellView TestCellView = TestFocus.CellView;
                Point TestCellOrigin = TestCellView.CellOrigin;
                Size  TestCellSize   = TestCellView.CellSize;
                Point TestCellCenter = TestCellView.CellRect.Center;

                // Don't consider cells that are not on the same line;
                if ((TestCellOrigin.Y.Draw + TestCellSize.Height.Draw <= FocusCellOrigin.Y.Draw) || (TestCellOrigin.Y.Draw >= FocusCellOrigin.Y.Draw + FocusCellSize.Height.Draw))
                {
                    continue;
                }

                // Don't consider cells that are in the wrong direction;
                if ((direction < 0 && TestCellOrigin.X.Draw >= FocusCellOrigin.X.Draw + FocusCellSize.Width.Draw) || (direction >= 0 && TestCellOrigin.X.Draw + TestCellSize.Width.Draw <= FocusCellOrigin.X.Draw))
                {
                    continue;
                }

                double SquaredDistance = Point.SquaredDistance(FocusCellCenter, TestCellCenter);

                if (newFocusIndex < 0 || bestSquaredDistance < SquaredDistance)
                {
                    bestSquaredDistance = SquaredDistance;
                    newFocusIndex       = CellIndex;
                }
            }
        }
Example #4
0
 /// <summary>
 /// Initializes a new instance of the <see cref="LayoutFocus"/> class.
 /// </summary>
 public LayoutFocus(ILayoutFocusableCellView cellView)
     : base(cellView)
 {
 }