コード例 #1
0
        protected override void OnRender(DrawingContext drawingContext)
        {
            base.OnRender(drawingContext);

            BackgroundGeometryBuilder geoBuilder = new BackgroundGeometryBuilder();

            geoBuilder.AlignToMiddleOfPixels = true;
            geoBuilder.CornerRadius          = textArea.SelectionCornerRadius;
            foreach (var segment in textArea.Selection.Segments)
            {
                geoBuilder.AddSegment(textView, segment);
            }
            Geometry geometry = geoBuilder.CreateGeometry();

            if (geometry != null)
            {
                drawingContext.DrawGeometry(textArea.SelectionBrush, textArea.SelectionBorder, geometry);
            }
        }
コード例 #2
0
        /// <summary>
        /// Causes the background renderer to draw.
        /// </summary>
        /// <param name="textView"></param>
        /// <param name="drawingContext"></param>
        public void Draw(TextView textView, DrawingContext drawingContext)
        {
            if (String.IsNullOrWhiteSpace(editor.SelectedText) ||
                !editor.SelectedText.All(Char.IsLetterOrDigit))
            {
                return;
            }
            ISearchStrategy strategy = SearchStrategyFactory.Create(editor.SelectedText, false, true, SearchMode.Normal);

            foreach (ISearchResult result in strategy.FindAll(textView.Document, 0, textView.Document.TextLength))
            {
                BackgroundGeometryBuilder builder = new BackgroundGeometryBuilder()
                {
                    CornerRadius = 1
                };
                builder.AddSegment(textView, result);
                drawingContext.DrawGeometry(BrushStyle, PenStyle, builder.CreateGeometry());
            }
        }
コード例 #3
0
        public void Draw(TextView textView, DrawingContext drawingContext)
        {
            if (textView == null)
            {
                throw new ArgumentNullException("textView");
            }
            if (drawingContext == null)
            {
                throw new ArgumentNullException("drawingContext");
            }
            if (markers == null || !textView.VisualLinesValid)
            {
                return;
            }
            ReadOnlyCollection <VisualLine> visualLines = textView.VisualLines;

            if (visualLines.Count == 0)
            {
                return;
            }
            int viewStart = visualLines.First().FirstDocumentLine.Offset;
            int viewEnd   = visualLines.Last().LastDocumentLine.EndOffset;

            foreach (TextMarker marker in markers.FindOverlappingSegments(viewStart, viewEnd - viewStart))
            {
                if (marker.BackgroundColor != null)
                {
                    var geoBuilder = new BackgroundGeometryBuilder();
                    geoBuilder.AlignToWholePixels = true;
                    geoBuilder.CornerRadius       = 3;
                    geoBuilder.AddSegment(textView, marker);
                    Geometry geometry = geoBuilder.CreateGeometry();
                    if (geometry != null)
                    {
                        Color color = marker.BackgroundColor.Value;
                        var   brush = new SolidColorBrush(color);
                        brush.Freeze();
                        drawingContext.DrawGeometry(brush, null, geometry);
                    }
                }
            }
        }
コード例 #4
0
            /// <summary>
            /// note that this original method only renders from the first visual line to the
            /// last visual line.
            /// </summary>
            /// <param name="textView"></param>
            /// <param name="drawingContext"></param>
            public void Draw(TextView textView, DrawingContext drawingContext)
            {
                if (textView == null)
                {
                    throw new ArgumentNullException("textView");
                }
                if (drawingContext == null)
                {
                    throw new ArgumentNullException("drawingContext");
                }

                if (currentResults == null || !textView.VisualLinesValid)
                {
                    return;
                }

                var visualLines = textView.VisualLines;

                if (visualLines.Count == 0)
                {
                    return;
                }

                int viewStart = visualLines.First().FirstDocumentLine.Offset;
                int viewEnd   = visualLines.Last().LastDocumentLine.EndOffset;

                GetResults(textView, viewStart, viewEnd - viewStart);
                //				foreach (SearchResult result in currentResults.FindOverlappingSegments(viewStart, viewEnd - viewStart)) {
                foreach (TextRange result in currentResults
                         .Where(r => r.Position32 >= viewStart && (int)r.EndPosition <= viewEnd))
                {
                    BackgroundGeometryBuilder geoBuilder = new BackgroundGeometryBuilder();
                    geoBuilder.AlignToMiddleOfPixels = true;
                    geoBuilder.CornerRadius          = 3;
                    geoBuilder.AddSegment(textView, result.GetSegment());
                    Geometry geometry = geoBuilder.CreateGeometry();
                    if (geometry != null)
                    {
                        drawingContext.DrawGeometry(MarkerBrush, markerPen, geometry);
                    }
                }
            }
        public void Draw(TextView textView, DrawingContext drawingContext)
        {
            if (textView == null)
            {
                throw new ArgumentNullException("textView");
            }
            if (drawingContext == null)
            {
                throw new ArgumentNullException("drawingContext");
            }

            if (CurrentResults == null || !textView.VisualLinesValid)
            {
                return;
            }

            var visualLines = textView.VisualLines;

            if (visualLines.Count == 0)
            {
                return;
            }

            var viewStart = visualLines.First().FirstDocumentLine.Offset;
            var viewEnd   = visualLines.Last().LastDocumentLine.EndOffset;

            foreach (var result in CurrentResults.FindOverlappingSegments(viewStart, viewEnd - viewStart))
            {
                var geoBuilder = new BackgroundGeometryBuilder
                {
                    //BorderThickness = markerPen != null ? markerPen.Thickness : 0,
                    AlignToWholePixels = true,
                    CornerRadius       = 3
                };
                geoBuilder.AddSegment(textView, result);
                var geometry = geoBuilder.CreateGeometry();
                if (geometry != null)
                {
                    drawingContext.DrawGeometry(_markerBrush, _markerPen, geometry);
                }
            }
        }
コード例 #6
0
            public void Draw(TextView textView, DrawingContext drawingContext)
            {
                if (textView == null)
                {
                    throw new ArgumentNullException("textView");
                }
                if (drawingContext == null)
                {
                    throw new ArgumentNullException("drawingContext");
                }

                if (_currentResults == null || !textView.VisualLinesValid)
                {
                    return;
                }

                var visualLines = textView.VisualLines;

                if (visualLines.Count == 0)
                {
                    return;
                }

                int viewStart = visualLines.First().FirstDocumentLine.Offset;
                int viewEnd   = visualLines.Last().LastDocumentLine.EndOffset;

                foreach (SearchResult result in _currentResults.FindOverlappingSegments(viewStart, viewEnd - viewStart))
                {
                    BackgroundGeometryBuilder geoBuilder = new BackgroundGeometryBuilder();
                    geoBuilder.AlignToMiddleOfPixels = true;
                    geoBuilder.AddSegment(textView, result);
                    Geometry geometry = geoBuilder.CreateGeometry();
                    if (geometry != null)
                    {
                        drawingContext.DrawGeometry(_markerBrush, _markerPen, geometry);
                    }
                }
            }
コード例 #7
0
        protected override void OnRender(DrawingContext drawingContext)
        {
            base.OnRender(drawingContext);

            BackgroundGeometryBuilder geoBuilder = new BackgroundGeometryBuilder();

            foreach (var segment in textArea.Selection.Segments)
            {
                geoBuilder.AddSegment(textView, segment);
            }
            Geometry geometry = geoBuilder.CreateGeometry();

            if (geometry != null)
            {
                SolidColorBrush lightHighlightBrush = new SolidColorBrush(SystemColors.HighlightColor);
                lightHighlightBrush.Opacity = 0.7;
                lightHighlightBrush.Freeze();
                Pen pen = new Pen(SystemColors.HighlightBrush, 1);
                //pen.LineJoin = PenLineJoin.Round;
                pen.Freeze();
                drawingContext.DrawGeometry(lightHighlightBrush, pen, geometry);
            }
        }
コード例 #8
0
        protected override void OnRender(DrawingContext drawingContext)
        {
            base.OnRender(drawingContext);

            BackgroundGeometryBuilder geoBuilder = new BackgroundGeometryBuilder();

            geoBuilder.AlignToMiddleOfPixels      = true;
            geoBuilder.ExtendToFullWidthAtLineEnd = textArea.Selection.EnableVirtualSpace;
            geoBuilder.CornerRadius = textArea.SelectionCornerRadius;
            foreach (var segment in textArea.Selection.Segments)
            {
                geoBuilder.AddSegment(textView, segment);
            }
            Geometry geometry = geoBuilder.CreateGeometry();

            if (geometry != null)
            {
                // [DIGITALRUNE] Reduce opacity if TextEditor isn't active.
                Opacity = textArea.IsKeyboardFocusWithin ? 1.0 : 0.5;

                drawingContext.DrawGeometry(textArea.SelectionBrush, textArea.SelectionBorder, geometry);
            }
        }
コード例 #9
0
        protected override void OnRender(DrawingContext drawingContext)
        {
            base.OnRender(drawingContext);

            var selectionBorder = textArea.SelectionBorder;

            BackgroundGeometryBuilder geoBuilder = new BackgroundGeometryBuilder();

            geoBuilder.AlignToWholePixels         = true;
            geoBuilder.BorderThickness            = selectionBorder != null ? selectionBorder.Thickness : 0;
            geoBuilder.ExtendToFullWidthAtLineEnd = textArea.Selection.EnableVirtualSpace;
            geoBuilder.CornerRadius = textArea.SelectionCornerRadius;
            foreach (var segment in textArea.Selection.Segments)
            {
                geoBuilder.AddSegment(textView, segment);
            }
            Geometry geometry = geoBuilder.CreateGeometry();

            if (geometry != null)
            {
                drawingContext.DrawGeometry(textArea.SelectionBrush, selectionBorder, geometry);
            }
        }
コード例 #10
0
        public void Draw(TextView textView, DrawingContext drawingContext)
        {
            if (currentReferences == null)
            {
                if (textView.VisualLines.Count == 0)
                {
                    return;
                }
                var start = textView.VisualLines.First().FirstDocumentLine.LineNumber;
                var end   = textView.VisualLines.Last().LastDocumentLine.LineNumber;
                currentReferences = new List <ISegment>();
                FindCurrentReferences(start, end);
            }
            if (currentReferences.Count == 0)
            {
                return;
            }
            BackgroundGeometryBuilder builder = new BackgroundGeometryBuilder();

            builder.CornerRadius          = cornerRadius;
            builder.AlignToMiddleOfPixels = true;
            foreach (var reference in this.currentReferences)
            {
                builder.AddSegment(textView, new TextSegment()
                {
                    StartOffset = reference.Offset,
                    Length      = reference.Length
                });
                builder.CloseFigure();
            }
            Geometry geometry = builder.CreateGeometry();

            if (geometry != null)
            {
                drawingContext.DrawGeometry(backgroundBrush, borderPen, geometry);
            }
        }
コード例 #11
0
        public void Draw(TextView textView, DrawingContext drawingContext)
        {
            if (textView == null)
            {
                throw new ArgumentNullException("textView");
            }
            if (drawingContext == null)
            {
                throw new ArgumentNullException("drawingContext");
            }
            if (this.currentResults == null || !textView.VisualLinesValid)
            {
                return;
            }
            ReadOnlyCollection <VisualLine> visualLines = textView.VisualLines;

            if (visualLines.Count == 0)
            {
                return;
            }
            int offset    = visualLines.First <VisualLine>().FirstDocumentLine.Offset;
            int endOffset = visualLines.Last <VisualLine>().LastDocumentLine.EndOffset;

            foreach (var current in this.currentResults.FindOverlappingSegments(offset, endOffset - offset))
            {
                BackgroundGeometryBuilder backgroundGeometryBuilder = new BackgroundGeometryBuilder();
                backgroundGeometryBuilder.AlignToMiddleOfPixels = true;
                backgroundGeometryBuilder.CornerRadius          = 3.0;
                backgroundGeometryBuilder.AddSegment(textView, current);
                Geometry geometry = backgroundGeometryBuilder.CreateGeometry();
                if (geometry != null)
                {
                    drawingContext.DrawGeometry(this.markerBrush, this.markerPen, geometry);
                }
            }
        }
コード例 #12
0
        public void Draw(TextView textView, DrawingContext drawingContext)
        {
            if (textView == null)
            {
                throw new ArgumentNullException("textView");
            }

            if (drawingContext == null)
            {
                throw new ArgumentNullException("drawingContext");
            }

            if (markers == null || !textView.VisualLinesValid)
            {
                return;
            }

            var visualLines = textView.VisualLines;

            if (visualLines.Count == 0)
            {
                return;
            }

            var viewStart = visualLines.First().FirstDocumentLine.Offset;
            var viewEnd   = visualLines.Last().LastDocumentLine.EndOffset;

            foreach (var marker in markers.FindOverlappingSegments(viewStart, viewEnd - viewStart))
            {
                if (marker.BackgroundColor != null)
                {
                    var geoBuilder = new BackgroundGeometryBuilder();
                    geoBuilder.AlignToWholePixels = true;
                    geoBuilder.CornerRadius       = 3;
                    geoBuilder.AddSegment(textView, marker);
                    var geometry = geoBuilder.CreateGeometry();
                    if (geometry != null)
                    {
                        var color = marker.BackgroundColor.Value;
                        var brush = new SolidColorBrush(color);
                        brush.Freeze();
                        drawingContext.DrawGeometry(brush, null, geometry);
                    }
                }

                var underlineMarkerTypes = TextMarkerTypes.SquigglyUnderline | TextMarkerTypes.NormalUnderline |
                                           TextMarkerTypes.DottedUnderline;
                if ((marker.MarkerTypes & underlineMarkerTypes) != 0)
                {
                    foreach (var r in BackgroundGeometryBuilder.GetRectsForSegment(textView, marker))
                    {
                        var startPoint = r.BottomLeft;
                        var endPoint   = r.BottomRight;

                        Brush usedBrush = new SolidColorBrush(marker.MarkerColor);
                        usedBrush.Freeze();
                        if ((marker.MarkerTypes & TextMarkerTypes.SquigglyUnderline) != 0)
                        {
                            var offset = 2.5;

                            var count = Math.Max((int)((endPoint.X - startPoint.X) / offset) + 1, 4);

                            var geometry = new StreamGeometry();

                            using (var ctx = geometry.Open())
                            {
                                ctx.BeginFigure(startPoint, false, false);
                                ctx.PolyLineTo(CreatePoints(startPoint, endPoint, offset, count).ToArray(), true,
                                               false);
                            }

                            geometry.Freeze();

                            var usedPen = new Pen(usedBrush, 1);
                            usedPen.Freeze();
                            drawingContext.DrawGeometry(Brushes.Transparent, usedPen, geometry);
                        }

                        if ((marker.MarkerTypes & TextMarkerTypes.NormalUnderline) != 0)
                        {
                            var usedPen = new Pen(usedBrush, 1);
                            usedPen.Freeze();
                            drawingContext.DrawLine(usedPen, startPoint, endPoint);
                        }

                        if ((marker.MarkerTypes & TextMarkerTypes.DottedUnderline) != 0)
                        {
                            var usedPen = new Pen(usedBrush, 1);
                            usedPen.DashStyle = DashStyles.Dot;
                            usedPen.Freeze();
                            drawingContext.DrawLine(usedPen, startPoint, endPoint);
                        }
                    }
                }
            }
        }
コード例 #13
0
        public void Draw(TextView textView, DrawingContext drawingContext)
        {
            if (textView == null)
            {
                throw new ArgumentNullException("textView");
            }
            if (drawingContext == null)
            {
                throw new ArgumentNullException("drawingContext");
            }
            if (markers == null || !textView.VisualLinesValid)
            {
                return;
            }
            var visualLines = textView.VisualLines;

            if (visualLines.Count == 0)
            {
                return;
            }
            int viewStart = visualLines.First().FirstDocumentLine.Offset;
            int viewEnd   = visualLines.Last().LastDocumentLine.EndOffset;

            foreach (TextMarker marker in markers.FindOverlappingSegments(viewStart, viewEnd - viewStart))
            {
                if (marker.BackgroundColor != null)
                {
                    BackgroundGeometryBuilder geoBuilder = new BackgroundGeometryBuilder();
                    geoBuilder.AlignToWholePixels = true;
                    geoBuilder.CornerRadius       = 3;
                    geoBuilder.AddSegment(textView, marker);
                    Geometry geometry = geoBuilder.CreateGeometry();
                    if (geometry != null)
                    {
                        Color           color = marker.BackgroundColor.Value;
                        SolidColorBrush brush = new SolidColorBrush(color);
                        brush.Freeze();
                        drawingContext.DrawGeometry(brush, null, geometry);
                    }
                }
                if (marker.MarkerType != TextMarkerType.None)
                {
                    foreach (Rect r in BackgroundGeometryBuilder.GetRectsForSegment(textView, marker))
                    {
                        Point startPoint = r.BottomLeft;
                        Point endPoint   = r.BottomRight;

                        Pen usedPen = new Pen(new SolidColorBrush(marker.MarkerColor), 1);
                        usedPen.Freeze();
                        switch (marker.MarkerType)
                        {
                        case TextMarkerType.SquigglyUnderline:
                            double offset = 2.5;

                            int count = Math.Max((int)((endPoint.X - startPoint.X) / offset) + 1, 4);

                            StreamGeometry geometry = new StreamGeometry();

                            using (StreamGeometryContext ctx = geometry.Open()) {
                                ctx.BeginFigure(startPoint, false, false);
                                ctx.PolyLineTo(CreatePoints(startPoint, endPoint, offset, count).ToArray(), true, false);
                            }

                            geometry.Freeze();

                            drawingContext.DrawGeometry(Brushes.Transparent, usedPen, geometry);
                            break;
                        }
                    }
                }
            }
        }
コード例 #14
0
        /// <summary>
        /// Draws the background of line based on its <see cref="DiffContext"/>
        /// and whether it is imaginary or not.
        /// </summary>
        /// <param name="textView"></param>
        /// <param name="drawingContext"></param>
        public void Draw(TextView textView, DrawingContext drawingContext)
        {
            if (_DiffView == null)
            {
                return;
            }

            // Draw background line diffs only if this is currently in comparing mode
            if (_DiffView.ViewMode != DisplayMode.Comparing)
            {
                return;
            }

            var srcLineDiffs = _DiffView.ItemsSource as IReadOnlyList <IDiffLineInfo>;

            if (srcLineDiffs == null)
            {
                return;
            }

            var toBeRequested = new List <int>();

            foreach (var v in textView.VisualLines)
            {
                var linenum = v.FirstDocumentLine.LineNumber - 1;

                // Find a diff context for a given line
                if (linenum >= srcLineDiffs.Count)
                {
                    continue;
                }

                // Determine change context (delete, insert, change) per line
                //  and color background according to bound brush
                var srcLineDiff = srcLineDiffs[linenum];
                var brush       = GetLineBackgroundDiffBrush(srcLineDiff.Context, srcLineDiff.ImaginaryLineNumber.HasValue == false);

                if (brush != default(SolidColorBrush))
                {
                    foreach (var rc in BackgroundGeometryBuilder.GetRectsFromVisualSegment(textView, v, 0, v.VisualLength))
                    {
                        drawingContext.DrawRectangle(brush, BorderlessPen,
                                                     new Rect(0, rc.Top, textView.ActualWidth, rc.Height));
                    }
                }

                if (srcLineDiff.LineEditScriptSegments != null)
                {
                    foreach (var item in srcLineDiff.LineEditScriptSegments)
                    {
                        // The main line background has already been drawn, so we just
                        // need to draw the deleted or inserted background segments.
                        if (srcLineDiff.FromA)
                        {
                            brush = _DiffView.ColorBackgroundDeleted;
                        }
                        else
                        {
                            brush = _DiffView.ColorBackgroundAdded;
                        }

                        BackgroundGeometryBuilder geoBuilder = new BackgroundGeometryBuilder();
                        geoBuilder.AlignToWholePixels = true;

                        var segment = new Segment(v.StartOffset + item.Offset, item.Length,
                                                  v.StartOffset + item.EndOffset);
                        geoBuilder.AddSegment(textView, segment);

                        Geometry geometry = geoBuilder.CreateGeometry();
                        if (geometry != null)
                        {
                            drawingContext.DrawGeometry(brush, null, geometry);
                        }
                    }
                }
                else
                {
                    // Has this line ever been computed before ?
                    if (srcLineDiff.LineEditScriptSegmentsIsDirty == true &&
                        _DiffView.LineDiffDataProvider != null)
                    {
                        toBeRequested.Add(linenum);
                    }
                }
            }

            // Request matching of additional lines if these appear to be dirty
            if (toBeRequested.Count > 0)
            {
                _DiffView.LineDiffDataProvider.RequestLineDiff(toBeRequested);
            }
        }
コード例 #15
0
        public void Draw(TextView textView, DrawingContext drawingContext)
        {
            if (textView == null)
            {
                throw new ArgumentNullException(nameof(textView));
            }
            if (drawingContext == null)
            {
                throw new ArgumentNullException(nameof(drawingContext));
            }
            if (_markers == null || !textView.VisualLinesValid)
            {
                return;
            }
            var visualLines = textView.VisualLines;

            if (visualLines.Count == 0)
            {
                return;
            }
            var viewStart = visualLines.First().FirstDocumentLine.Offset;
            var viewEnd   = visualLines.Last().LastDocumentLine.EndOffset;

            foreach (var marker in _markers.FindOverlappingSegments(viewStart, viewEnd - viewStart))
            {
                if (marker.BackgroundColor != null)
                {
                    var geoBuilder = new BackgroundGeometryBuilder
                    {
                        AlignToWholePixels = true,
                        CornerRadius       = 3
                    };
                    geoBuilder.AddSegment(textView, marker);
                    var geometry = geoBuilder.CreateGeometry();
                    if (geometry != null)
                    {
                        var color = marker.BackgroundColor.Value;

                        if (IsActiveDebugging && marker.Bookmark != null && marker.Bookmark.BookmarkType == BookmarkType.Breakpoint)
                        {
                            color.A = 0x77;
                        }
                        else
                        {
                            color.A = 0xff;
                        }

                        var brush = new SolidColorBrush(color);
                        brush.Freeze();
                        drawingContext.DrawGeometry(brush, null, geometry);
                    }
                }
                foreach (var r in BackgroundGeometryBuilder.GetRectsForSegment(textView, marker))
                {
                    var startPoint = r.BottomLeft;
                    var endPoint   = r.BottomRight;

                    Brush usedBrush = new SolidColorBrush(marker.MarkerColor);
                    usedBrush.Freeze();
                    var offset = 2.5;

                    var count = Math.Max((int)((endPoint.X - startPoint.X) / offset) + 1, 4);

                    var geometry = new StreamGeometry();

                    using (var ctx = geometry.Open())
                    {
                        ctx.BeginFigure(startPoint, false, false);
                        ctx.PolyLineTo(CreatePoints(startPoint, offset, count).ToArray(), true, false);
                    }

                    geometry.Freeze();

                    var usedPen = new Pen(usedBrush, 1);
                    usedPen.Freeze();
                    drawingContext.DrawGeometry(Brushes.Transparent, usedPen, geometry);
                }
            }
        }
コード例 #16
0
        public void Draw(TextView textView, DrawingContext drawingContext)
        {
            if (_markers == null || !textView.VisualLinesValid)
            {
                return;
            }
            var visualLines = textView.VisualLines;

            if (visualLines.Count == 0)
            {
                return;
            }
            var viewStart = visualLines.First().FirstDocumentLine.Offset;
            var viewEnd   = visualLines.Last().LastDocumentLine.EndOffset;

            foreach (var marker in _markers.FindOverlappingSegments(viewStart, viewEnd - viewStart))
            {
                if (BackgroundColor != null)
                {
                    BackgroundGeometryBuilder geoBuilder = new BackgroundGeometryBuilder
                    {
                        AlignToWholePixels = true,
                        CornerRadius       = 3
                    };
                    geoBuilder.AddSegment(textView, marker);
                    Geometry geometry = geoBuilder.CreateGeometry();
                    if (geometry != null)
                    {
                        drawingContext.DrawGeometry(BackgroundColor, null, geometry);
                    }
                }
                foreach (var r in BackgroundGeometryBuilder.GetRectsForSegment(textView, marker))
                {
                    Point startPoint = r.BottomLeft;
                    Point endPoint   = r.BottomRight;
                    if ((MarkerType & TextMarkerTypes.SquigglyUnderline) != 0)
                    {
                        double         offset   = 2.5;
                        int            count    = Math.Max((int)((endPoint.X - startPoint.X) / offset) + 1, 4);
                        StreamGeometry geometry = new StreamGeometry();
                        using (StreamGeometryContext ctx = geometry.Open())
                        {
                            ctx.BeginFigure(startPoint, false, false);
                            ctx.PolyLineTo(CreatePoints(startPoint, endPoint, offset, count).ToArray(), true, false);
                        }
                        geometry.Freeze();
                        Pen usedPen = new Pen(ForegroundColor, 1);
                        usedPen.Freeze();
                        drawingContext.DrawGeometry(Brushes.Transparent, usedPen, geometry);
                    }
                    if ((MarkerType & TextMarkerTypes.NormalUnderline) != 0)
                    {
                        Pen usedPen = new Pen(ForegroundColor, 1);
                        usedPen.Freeze();
                        drawingContext.DrawLine(usedPen, startPoint, endPoint);
                    }
                    if ((MarkerType & TextMarkerTypes.DottedUnderline) != 0)
                    {
                        Pen usedPen = new Pen(ForegroundColor, 1)
                        {
                            DashStyle = DashStyles.Dot
                        };
                        usedPen.Freeze();
                        drawingContext.DrawLine(usedPen, startPoint, endPoint);
                    }
                    if ((MarkerType & TextMarkerTypes.Rectangle) != 0)
                    {
                        Pen usedPen = new Pen(ForegroundColor, 1);
                        usedPen.Freeze();
                        drawingContext.DrawRectangle(null, usedPen, r);
                    }
                }
            }
        }
コード例 #17
0
        /// <summary>
        /// Нарисовать.
        /// </summary>
        /// <param name="textView">Текстовое представление.</param>
        /// <param name="drawingContext">Контекст отрисовки.</param>
        public void Draw(TextView textView, DrawingContext drawingContext)
        {
            if (textView == null)
            {
                throw new ArgumentNullException(nameof(textView));
            }

            if (drawingContext == null)
            {
                throw new ArgumentNullException(nameof(drawingContext));
            }

            if (this.Markers == null || !textView.VisualLinesValid)
            {
                return;
            }

            var visualLines = textView.VisualLines;

            if (visualLines.Count == 0)
            {
                return;
            }

            var viewStart   = visualLines.First().FirstDocumentLine.Offset;
            var viewEnd     = visualLines.Last().LastDocumentLine.EndOffset;
            var viewMarkers = this.Markers.FindOverlappingSegments(viewStart, viewEnd - viewStart);

            foreach (var marker in viewMarkers)
            {
                // Отрисовка фона.
                if (marker.Background != null)
                {
                    var geometryBuilder = new BackgroundGeometryBuilder
                    {
                        AlignToWholePixels = true,
                        CornerRadius       = 3
                    };
                    geometryBuilder.AddSegment(textView, marker);

                    var geometry = geometryBuilder.CreateGeometry();
                    if (geometry != null)
                    {
                        var brush = new SolidColorBrush(marker.Background.Value);
                        brush.Freeze();
                        drawingContext.DrawGeometry(brush, null, geometry);
                    }
                }

                // Отрисовка маркера.
                var underlineMarkerTypes = TextMarkerType.SquigglyUnderline | TextMarkerType.NormalUnderline | TextMarkerType.DottedUnderline;
                if ((marker.MarkerType & underlineMarkerTypes) != 0)
                {
                    var segmentRects = BackgroundGeometryBuilder.GetRectsForSegment(textView, marker);
                    foreach (var segmentRect in segmentRects)
                    {
                        var startPoint = segmentRect.BottomLeft;
                        var endPoint   = segmentRect.BottomRight;

                        Brush usedBrush = new SolidColorBrush(marker.MarkerColor);
                        usedBrush.Freeze();

                        // Подчеркивание волнистой линией.
                        if ((marker.MarkerType & TextMarkerType.SquigglyUnderline) != 0)
                        {
                            var usedPen = new Pen(usedBrush, 1);
                            usedPen.Freeze();

                            var geometry = CreateSquigglyLine(startPoint, endPoint);
                            drawingContext.DrawGeometry(Brushes.Transparent, usedPen, geometry);
                        }

                        // Подчеркивание сплошной линией.
                        if ((marker.MarkerType & TextMarkerType.NormalUnderline) != 0)
                        {
                            var usedPen = new Pen(usedBrush, 1);
                            usedPen.Freeze();

                            drawingContext.DrawLine(usedPen, startPoint, endPoint);
                        }

                        // Подчеркивание точками.
                        if ((marker.MarkerType & TextMarkerType.DottedUnderline) != 0)
                        {
                            var usedPen = new Pen(usedBrush, 1)
                            {
                                DashStyle = DashStyles.Dot
                            };
                            usedPen.Freeze();

                            drawingContext.DrawLine(usedPen, startPoint, endPoint);
                        }
                    }
                }
            }
        }