HexViewLine GetLine(HexColumnPosition position) => hexView.GetHexViewLineContainingBufferPosition(position.ActivePosition.BufferPosition);
void OnScroll(ScrollDirection value, double xCoordinate) { HexViewLine line; HexBufferPoint lineStart; switch (value) { case ScrollDirection.Left: line = wpfHexView.Caret.ContainingHexViewLine; if (line.TextLeft >= wpfHexView.ViewportLeft) { StopScrolling(); } else if (wpfHexView.Caret.Position.Position.ActivePosition.BufferPosition != line.BufferStart) { editorOperations.MoveToPreviousCharacter(true); } else { wpfHexView.ViewportLeft = line.TextLeft; StopScrolling(); } break; case ScrollDirection.Right: line = wpfHexView.Caret.ContainingHexViewLine; if (line.TextRight <= wpfHexView.ViewportRight) { StopScrolling(); } else if (wpfHexView.Caret.Position.Position.ActivePosition.BufferPosition < line.BufferEnd) { editorOperations.MoveToNextCharacter(true); } else { wpfHexView.ViewportLeft = Math.Max(0, line.TextRight - wpfHexView.ViewportWidth); StopScrolling(); } break; case ScrollDirection.Up: line = wpfHexView.HexViewLines.FirstVisibleLine; if (line.VisibilityState == VSTF.VisibilityState.FullyVisible && !line.IsFirstDocumentLine()) { line = wpfHexView.GetHexViewLineContainingBufferPosition(line.BufferStart - 1); } lineStart = line.BufferStart; if (line.VisibilityState != VSTF.VisibilityState.FullyVisible) { wpfHexView.DisplayHexLineContainingBufferPosition(line.BufferStart, 0, VSTE.ViewRelativePosition.Top); } if (!line.IsValid) { line = wpfHexView.GetHexViewLineContainingBufferPosition(lineStart); } if (line.IsFirstDocumentLine()) { StopScrolling(); } editorOperations.MoveCaret(line, xCoordinate, true, hexMoveToFlags); break; case ScrollDirection.Down: line = wpfHexView.HexViewLines.LastVisibleLine; if (line.VisibilityState == VSTF.VisibilityState.FullyVisible && !line.IsLastDocumentLine()) { line = wpfHexView.GetHexViewLineContainingBufferPosition(line.BufferEnd); } lineStart = line.BufferStart; if (line.VisibilityState != VSTF.VisibilityState.FullyVisible) { wpfHexView.DisplayHexLineContainingBufferPosition(line.BufferStart, 0, VSTE.ViewRelativePosition.Bottom); } if (!line.IsValid) { line = wpfHexView.GetHexViewLineContainingBufferPosition(lineStart); } if (line.IsLastDocumentLine()) { StopScrolling(); } editorOperations.MoveCaret(line, xCoordinate, true, hexMoveToFlags); break; default: throw new ArgumentOutOfRangeException(nameof(value)); } wpfHexView.Caret.EnsureVisible(); }