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); }
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; } } } }
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; } } }
/// <summary> /// Initializes a new instance of the <see cref="LayoutFocus"/> class. /// </summary> public LayoutFocus(ILayoutFocusableCellView cellView) : base(cellView) { }