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);
     }
 }
Exemple #5
0
 /// <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);
Exemple #6
0
 /// <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);
Exemple #7
0
 /// <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);
                    }
                }
            }
        }