static void RedisplayHexLines(HexView hexView) { var line = hexView.HexViewLines.FirstVisibleLine; var verticalDistance = line.Top - hexView.ViewportTop; var bufferPosition = line.BufferStart; hexView.DisplayHexLineContainingBufferPosition(bufferPosition, verticalDistance, VSTE.ViewRelativePosition.Top, null, null, DisplayHexLineOptions.CanRecreateBufferLines); }
void EnsureSpanVisibleY(HexBufferSpan span, VSTE.EnsureSpanVisibleOptions options) { bool showStart = (options & VSTE.EnsureSpanVisibleOptions.ShowStart) != 0; bool minimumScroll = (options & VSTE.EnsureSpanVisibleOptions.MinimumScroll) != 0; bool alwaysCenter = (options & VSTE.EnsureSpanVisibleOptions.AlwaysCenter) != 0; var visibleSpan = VisibleSpan; bool spanIsInView = span.Start >= visibleSpan.Start && span.End <= visibleSpan.End; if (!spanIsInView) { ShowSpan(span, options); alwaysCenter = true; visibleSpan = VisibleSpan; spanIsInView = span.Start >= visibleSpan.Start && span.End <= visibleSpan.End; } if (spanIsInView) { var lines = hexView.HexViewLines.GetHexViewLinesIntersectingSpan(span); Debug.Assert(lines.Count > 0); if (lines.Count == 0) { return; } var first = lines[0]; var last = lines[lines.Count - 1]; if (lines.Count > 1 && last.BufferStart == span.End) { last = lines[lines.Count - 2]; } var firstSpan = first.BufferSpan; var lastSpan = last.BufferSpan; bool allLinesFullyVisible = first.VisibilityState == VSTF.VisibilityState.FullyVisible && last.VisibilityState == VSTF.VisibilityState.FullyVisible; if (alwaysCenter || (!allLinesFullyVisible && !minimumScroll)) { double height = last.Bottom - first.Top; double verticalDistance = (hexView.ViewportHeight - height) / 2; hexView.DisplayHexLineContainingBufferPosition(first.BufferStart, verticalDistance, VSTE.ViewRelativePosition.Top); return; } if (first.VisibilityState != VSTF.VisibilityState.FullyVisible) { if (first != last || !minimumScroll || first.VisibilityState != VSTF.VisibilityState.PartiallyVisible) { hexView.DisplayHexLineContainingBufferPosition(first.BufferStart, 0, VSTE.ViewRelativePosition.Top); } else if (first.Bottom > hexView.ViewportBottom) { hexView.DisplayHexLineContainingBufferPosition(first.BufferStart, 0, VSTE.ViewRelativePosition.Bottom); } else { hexView.DisplayHexLineContainingBufferPosition(first.BufferStart, 0, VSTE.ViewRelativePosition.Top); } } else if (last.VisibilityState != VSTF.VisibilityState.FullyVisible) { hexView.DisplayHexLineContainingBufferPosition(last.BufferStart, 0, VSTE.ViewRelativePosition.Bottom); } if (showStart) { var line = hexView.HexViewLines.GetHexViewLineContainingBufferPosition(firstSpan.Start); if (line == null || line.VisibilityState != VSTF.VisibilityState.FullyVisible) { ShowSpan(span, options); } } else { var line = hexView.HexViewLines.GetHexViewLineContainingBufferPosition(lastSpan.Start); if (line == null || line.VisibilityState != VSTF.VisibilityState.FullyVisible) { ShowSpan(span, options); } } } }