public override void EnsureSpanVisible(HexBufferLine line, VST.Span span, VSTE.EnsureSpanVisibleOptions options) { if (line == null) { throw new ArgumentNullException(nameof(line)); } if (line.Buffer != hexView.Buffer) { throw new ArgumentException(); } EnsureSpanVisibleCore(new HexLineSpan(line, span), options); }
public override void EnsureSpanVisible(HexLineSpan lineSpan, VSTE.EnsureSpanVisibleOptions options) { if (lineSpan.IsDefault) { throw new ArgumentException(); } if (lineSpan.BufferSpan.Buffer != hexView.Buffer) { throw new ArgumentException(); } EnsureSpanVisibleCore(lineSpan, options); }
void EnsureSpanVisibleCore(HexLineSpan lineSpan, VSTE.EnsureSpanVisibleOptions options) { if (lineSpan.BufferSpan.Buffer != hexView.Buffer) { throw new ArgumentException(); } if ((hexView.HexViewLines?.Count ?? 0) == 0) { return; } EnsureSpanVisibleY(lineSpan.BufferSpan, options); EnsureSpanVisibleX(lineSpan, options); }
void ShowSpan(HexBufferSpan bufferSpan, VSTE.EnsureSpanVisibleOptions options) { if ((options & VSTE.EnsureSpanVisibleOptions.ShowStart) != 0) { hexView.DisplayHexLineContainingBufferPosition(bufferSpan.Start, 0, VSTE.ViewRelativePosition.Top); } else { var end = bufferSpan.End; if (end > hexView.BufferLines.BufferStart) { end = end - 1; } hexView.DisplayHexLineContainingBufferPosition(end, 0, VSTE.ViewRelativePosition.Bottom); } }
/// <summary> /// Scrolls a line into view /// </summary> /// <param name="line">Line</param> /// <param name="span">Line span</param> /// <param name="options">Options</param> public abstract void EnsureSpanVisible(HexBufferLine line, VST.Span span, VSTE.EnsureSpanVisibleOptions options);
/// <summary> /// Scrolls a span into view /// </summary> /// <param name="span">Span</param> /// <param name="flags">Flags</param> /// <param name="options">Options</param> public abstract void EnsureSpanVisible(HexBufferSpan span, HexSpanSelectionFlags flags, VSTE.EnsureSpanVisibleOptions options);
/// <summary> /// Scrolls a span into view /// </summary> /// <param name="lineSpan">Line span</param> /// <param name="options">Options</param> public abstract void EnsureSpanVisible(HexLineSpan lineSpan, VSTE.EnsureSpanVisibleOptions options);
void EnsureSpanVisibleX(HexLineSpan lineSpan, VSTE.EnsureSpanVisibleOptions options) { var span = lineSpan.BufferSpan; if (hexView.ViewportWidth == 0) { return; } var lines = hexView.HexViewLines.GetHexViewLinesIntersectingSpan(span); if (lines.Count == 0) { return; } var ispan = span.Intersection(hexView.HexViewLines.FormattedSpan); if (ispan == null) { return; } span = ispan.Value; double left = double.PositiveInfinity, right = double.NegativeInfinity; for (int i = 0; i < lines.Count; i++) { var line = lines[i]; var intersection = line.BufferSpan.Intersection(span); if (intersection == null) { continue; } var bounds = lineSpan.IsTextSpan ? line.GetNormalizedTextBounds(lineSpan.TextSpan.Value) : line.GetNormalizedTextBounds(intersection.Value, lineSpan.SelectionFlags.Value); foreach (var b in bounds) { if (left > b.Left) { left = b.Left; } if (right < b.Right) { right = b.Right; } } } if (double.IsInfinity(left) || double.IsInfinity(right)) { return; } Debug.Assert(left <= right); if (left > right) { right = left; } double width = right - left; double availWidth = Math.Max(0, hexView.ViewportWidth - width); double extraScroll; const double EXTRA_WIDTH = 4; if (availWidth >= EXTRA_WIDTH) { extraScroll = EXTRA_WIDTH; } else { extraScroll = availWidth / 2; } if (hexView.ViewportLeft <= right && right <= hexView.ViewportRight) { } else if (right > hexView.ViewportRight) { hexView.ViewportLeft = right + extraScroll - hexView.ViewportWidth; } else { var newLeft = left - extraScroll; if (newLeft + hexView.ViewportWidth < right) { newLeft = right - hexView.ViewportWidth; } hexView.ViewportLeft = newLeft; } }
public override void EnsureSpanVisible(HexBufferSpan span, HexSpanSelectionFlags flags, VSTE.EnsureSpanVisibleOptions options) { if (span.Buffer != hexView.Buffer) { throw new ArgumentException(); } EnsureSpanVisibleCore(new HexLineSpan(span, flags), options); }
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); } } } }