void UpdateCaret(VirtualSnapshotPoint caretPosition)
        {
            var analysisLines = Analysis.GetAllLines();
            var caret         = CaretHandlerBase.FromName(Theme.CaretHandler, caretPosition, Analysis.TabSize);

            foreach (var line in analysisLines)
            {
                int linePos = line.Indent;
                if (!Analysis.Behavior.VisibleUnaligned && (linePos % Analysis.IndentSize) != 0)
                {
                    continue;
                }

                int formatIndex = line.Indent / Analysis.IndentSize;

                if (line.Indent % Analysis.IndentSize != 0)
                {
                    formatIndex = LineFormat.UnalignedFormatIndex;
                }

                caret.AddLine(line, willUpdateImmediately: false);
            }

            foreach (var line in caret.GetModified())
            {
                Line adornment;
                if (Lines.TryGetValue(line, out adornment))
                {
                    UpdateGuide(line, adornment);
                }
            }
        }
        private void SelectItem(string name)
        {
            try {
                lstNames.Enabled       = false;
                lstNames.SelectedIndex = -1;

                for (int i = 0; i < lstNames.Items.Count; ++i)
                {
                    var item = lstNames.Items[i] as CaretHandlerInfo;
                    if (item != null && item.TypeName.Equals(name, StringComparison.Ordinal))
                    {
                        lstNames.SelectedIndex = i;
                        return;
                    }
                }

                var metadata = CaretHandlerBase.MetadataFromName(name);
                for (int i = 0; i < lstNames.Items.Count; ++i)
                {
                    var item = lstNames.Items[i] as CaretHandlerInfo;
                    if (item != null)
                    {
                        var metadata2 = CaretHandlerBase.MetadataFromName(item.TypeName);
                        if (metadata == metadata2)
                        {
                            lstNames.SelectedIndex = i;
                            return;
                        }
                    }
                }

                if (lstNames.Items.Count > 0)
                {
                    lstNames.SelectedIndex = 0;
                }
            } finally {
                lstNames.Enabled = true;
            }
        }
示例#3
0
        void UpdateAdornments_Performance(
            ITextSnapshot snapshot,
            ITextViewModel viewModel,
            ITextViewLine firstVisibleLine,
            IEnumerable <LineSpan> analysisLines
            )
        {
#endif
            double spaceWidth = firstVisibleLine.VirtualSpaceWidth;
            if (spaceWidth <= 0.0)
            {
                return;
            }
            double horizontalOffset = firstVisibleLine.TextLeft;

            var unusedLines = new HashSet <LineSpan>(Lines.Keys);

            var caret = CaretHandlerBase.FromName(Theme.CaretHandler, View.Caret.Position.VirtualBufferPosition, Analysis.TabSize);

            object perfCookie = null;
            PerformanceLogger.Start(ref perfCookie);
#if DEBUG
            var initialCount = Lines.Count;
#endif
            foreach (var line in analysisLines.Concat(GetPageWidthLines()))
            {
                double top    = View.ViewportTop;
                double bottom = View.ViewportBottom;
                double left   = line.Indent * spaceWidth + horizontalOffset;

                Line adornment;
                unusedLines.Remove(line);

                if (line.Type == LineSpanType.PageWidthMarker)
                {
                    line.Highlight = (Analysis.LongestLine > line.Indent);
                    if (!Lines.TryGetValue(line, out adornment))
                    {
                        Lines[line] = adornment = CreateGuide(Canvas);
                    }
                    UpdateGuide(line, adornment, left, top, bottom);
                    continue;
                }

                if (Lines.TryGetValue(line, out adornment))
                {
                    adornment.Visibility = Visibility.Hidden;
                }

                caret.AddLine(line, willUpdateImmediately: true);

                if (line.FirstLine >= 0 && line.LastLine < int.MaxValue)
                {
                    var firstLineNumber = line.FirstLine;
                    var lastLineNumber = line.LastLine;
                    ITextSnapshotLine firstLine, lastLine;
                    try
                    {
                        firstLine = snapshot.GetLineFromLineNumber(firstLineNumber);
                        lastLine  = snapshot.GetLineFromLineNumber(lastLineNumber);
                    }
                    catch (Exception ex)
                    {
                        Trace.TraceError("In GetLineFromLineNumber:\n{0}", ex);
                        continue;
                    }

                    if (firstLine.Start > View.TextViewLines.LastVisibleLine.Start ||
                        lastLine.Start < View.TextViewLines.FirstVisibleLine.Start)
                    {
                        continue;
                    }

                    while (
                        !viewModel.IsPointInVisualBuffer(firstLine.Start, PositionAffinity.Successor) &&
                        ++firstLineNumber < lastLineNumber
                        )
                    {
                        try
                        {
                            firstLine = snapshot.GetLineFromLineNumber(firstLineNumber);
                        }
                        catch (Exception ex)
                        {
                            Trace.TraceError("In GetLineFromLineNumber:\n{0}", ex);
                            firstLine = null;
                            break;
                        }
                    }

                    while (
                        !viewModel.IsPointInVisualBuffer(lastLine.Start, PositionAffinity.Predecessor) &&
                        --lastLineNumber > firstLineNumber
                        )
                    {
                        try
                        {
                            lastLine = snapshot.GetLineFromLineNumber(lastLineNumber);
                        }
                        catch (Exception ex)
                        {
                            Trace.TraceError("In GetLineFromLineNumber:\n{0}", ex);
                            lastLine = null;
                            break;
                        }
                    }
                    if (firstLine == null || lastLine == null || firstLineNumber > lastLineNumber)
                    {
                        continue;
                    }


                    IWpfTextViewLine firstView, lastView;
                    try
                    {
                        firstView = View.GetTextViewLineContainingBufferPosition(firstLine.Start);
                        lastView  = View.GetTextViewLineContainingBufferPosition(lastLine.End);
                    }
                    catch (Exception ex)
                    {
                        Trace.TraceError("UpdateAdornments GetTextViewLineContainingBufferPosition failed\n{0}", ex);
                        continue;
                    }

                    string extentText;
                    if (!string.IsNullOrWhiteSpace((extentText = firstView.Extent.GetText())) &&
                        line.Indent > extentText.LeadingWhitespace(Analysis.TabSize)
                        )
                    {
                        continue;
                    }

                    if (firstView.VisibilityState != VisibilityState.Unattached)
                    {
                        top = firstView.Top;
                    }
                    if (lastView.VisibilityState != VisibilityState.Unattached)
                    {
                        bottom = lastView.Bottom;
                    }
                }

                if (!Lines.TryGetValue(line, out adornment))
                {
                    Lines[line] = adornment = CreateGuide(Canvas);
                }
                UpdateGuide(line, adornment, left, top, bottom);
            }

            PerformanceLogger.End(perfCookie);
#if DEBUG
            Debug.WriteLine("Added {0} guides", Lines.Count - initialCount);
            Debug.WriteLine("Removed {0} guides", unusedLines.Count);
            Debug.WriteLine("{0} guides active", Lines.Count - unusedLines.Count);
            Debug.WriteLine("");
#endif

            foreach (var line in unusedLines)
            {
                Line adornment;
                if (Lines.TryGetValue(line, out adornment))
                {
                    Canvas.Children.Remove(adornment);
                    Lines.Remove(line);
                }
            }
            foreach (var line in caret.GetModified())
            {
                Line adornment;
                if (Lines.TryGetValue(line, out adornment))
                {
                    UpdateGuide(line, adornment);
                }
            }
        }