コード例 #1
0
ファイル: TextView.cs プロジェクト: danwalmsley/AvalonStudio
        private void RenderCaret(DrawingContext context)
        {
            var backgroundColor = (((Control)TemplatedParent).GetValue(BackgroundProperty) as SolidColorBrush)?.Color;
            var caretBrush      = Brushes.Black;

            if (backgroundColor.HasValue)
            {
                var red   = (byte)~backgroundColor.Value.R;
                var green = (byte)~backgroundColor.Value.G;
                var blue  = (byte)~backgroundColor.Value.B;

                caretBrush = new SolidColorBrush(Color.FromRgb(red, green, blue));
            }

            if (_caretBlink && CaretIndex != -1)
            {
                if (CaretIndex > TextDocument.TextLength)
                {
                    CaretIndex = TextDocument.TextLength;
                }

                var charPos = VisualLineGeometryBuilder.GetViewPortPosition(this, CaretIndex);
                var x       = Math.Floor(charPos.X) + 0.5;
                var y       = Math.Floor(charPos.Y) + 0.5;
                var b       = Math.Ceiling(charPos.Bottom) - 0.5;

                context.DrawLine(
                    new Pen(caretBrush, 1),
                    new Point(charPos.TopLeft.X, charPos.TopLeft.Y),
                    new Point(charPos.TopLeft.X, charPos.BottomLeft.Y));
            }
        }
コード例 #2
0
        public void Draw(TextView textView, DrawingContext drawingContext)
        {
            if (textView.SelectionStart != textView.SelectionEnd && textView.SelectionEnd >= 0 && textView.SelectionStart >= 0)
            {
                TextSegment selection;

                if (textView.SelectionEnd > textView.SelectionStart)
                {
                    selection = new TextSegment {
                        StartOffset = textView.SelectionStart, EndOffset = textView.SelectionEnd
                    };
                }
                else
                {
                    selection = new TextSegment {
                        StartOffset = textView.SelectionEnd, EndOffset = textView.SelectionStart
                    };
                }

                var rects = VisualLineGeometryBuilder.GetRectsForSegment(textView, selection);

                foreach (var rect in rects)
                {
                    drawingContext.FillRectangle(selectionBrush, rect);
                }
            }
        }
コード例 #3
0
        public void TransformLine(TextView textView, DrawingContext drawingContext, VisualLine line)
        {
            if (!string.IsNullOrEmpty(SelectedWord) && line.RenderedText.Text.Contains(SelectedWord))
            {
                var startIndex = 0;

                while (startIndex != -1)
                {
                    startIndex = line.RenderedText.Text.IndexOf(SelectedWord, startIndex);

                    if (startIndex != -1)
                    {
                        var rect =
                            VisualLineGeometryBuilder.GetRectsForSegment(textView,
                                                                         new TextSegment
                        {
                            StartOffset = startIndex + line.Offset,
                            EndOffset   = startIndex + line.Offset + SelectedWord.Length
                        }).First();

                        drawingContext.FillRectangle(highlightBrush, rect);

                        startIndex += SelectedWord.Length;
                    }
                }
            }
        }
コード例 #4
0
        public void TransformLine(TextView textView, DrawingContext drawingContext, VisualLine line)
        {
            if (markers == null)
            {
                return;
            }

            var markersInLine = markers.FindOverlappingSegments(line);

            foreach (var marker in markersInLine)
            {
                if (marker.Length == 0)
                {
                    var endoffset = TextUtilities.GetNextCaretPosition(textView.TextDocument, marker.StartOffset,
                                                                       TextUtilities.LogicalDirection.Forward, TextUtilities.CaretPositioningMode.WordBorderOrSymbol);

                    if (endoffset == -1)
                    {
                        marker.Length = line.Length;
                    }
                    else
                    {
                        marker.EndOffset = endoffset;
                    }
                }

                if (marker.EndOffset < textView.TextDocument.TextLength)
                {
                    foreach (var r in VisualLineGeometryBuilder.GetRectsForSegment(textView, marker))
                    {
                        var startPoint = r.BottomLeft;
                        var endPoint   = r.BottomRight;

                        var usedPen = new Pen(new SolidColorBrush(marker.MarkerColor), 1);

                        const double 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);

                            foreach (var point in CreatePoints(startPoint, endPoint, offset, count))
                            {
                                ctx.LineTo(point);
                            }

                            ctx.EndFigure(false);
                        }

                        drawingContext.DrawGeometry(Brushes.Transparent, usedPen, geometry);
                        break;
                    }
                }
            }
        }
コード例 #5
0
        public void Draw(TextView textView, DrawingContext drawingContext)
        {
            if (line > 0 && line < textView.TextDocument.LineCount)
            {
                var currentLine = textView.TextDocument.GetLineByNumber(line);

                var rects = VisualLineGeometryBuilder.GetRectsForSegment(textView, currentLine);

                foreach (var rect in rects)
                {
                    var drawRect = new Rect(rect.TopLeft.X, rect.TopLeft.Y, textView.Bounds.Width, rect.Height);
                    drawingContext.FillRectangle(selectedLineBg, drawRect);
                }
            }
        }
コード例 #6
0
        public void Draw(TextView textView, DrawingContext drawingContext)
        {
            if (textView.SelectionStart == textView.SelectionEnd && textView.CaretIndex != -1 &&
                textView.CaretIndex <= textView.TextDocument.TextLength)
            {
                var currentLine = textView.TextDocument.GetLineByOffset(textView.CaretIndex);

                var rects = VisualLineGeometryBuilder.GetRectsForSegment(textView, currentLine);

                foreach (var rect in rects)
                {
                    var drawRect = new Rect(rect.TopLeft.X, rect.TopLeft.Y, textView.Bounds.Width, rect.Height);
                    drawingContext.FillRectangle(selectedLineBg, drawRect);
                }
            }
        }