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); } }
/// <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()); } }
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); } } } }
/// <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); } } }
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); } } }
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); } }
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); } }
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); } }
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); } }
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); } } }
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); } } } } }
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; } } } } }
/// <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); } }
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); } } }
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); } } } }
/// <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); } } } } }