예제 #1
0
        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);
        }
예제 #2
0
        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);
                    }
                }
            }
        }