private void AddBranchAdornment(ITextViewLine line, SnapshotSpan span, LineCoverage coverage, bool isUpToDate) { var diameter = _textView.LineHeight / _branchCoverageSpotHeightDivider; var spacing = _branchCoverageSpotGap + diameter; var top = (line.Height - diameter) / 2d; var brush = _brushesAndPens[coverage.BranchCoverageState].Brush; var pen = _brushesAndPens[coverage.BranchCoverageState].Pen; var groupIndex = 0; var index = 0; var left = _sequenceCoverageLineWidth * 1.5d; foreach (var branchPoint in coverage.BranchesVisited) { foreach (var branch in branchPoint) { var rect = new Rect(left, line.Top + top, diameter, diameter); var geometry = new EllipseGeometry(rect); geometry.Freeze(); var brushOverride = brush; var penOverride = pen; if (branch && coverage.BranchVisitors[groupIndex][index].Any(p => SelectedTests.Contains(p))) { brushOverride = _selectedBrushAndPen.Brush; penOverride = _selectedBrushAndPen.Pen; } var drawing = new GeometryDrawing(branch ? brushOverride : null, penOverride, geometry); drawing.Freeze(); var drawingImage = new DrawingImage(drawing); drawingImage.Freeze(); var image = new Image() { Source = drawingImage, Opacity = isUpToDate ? 1d : _modifiedOpacity }; var testMethod = coverage.BranchVisitors[groupIndex][index].FirstOrDefault(); if (testMethod != null) { image.MouseLeftButtonDown += (o, e) => e.Handled = true; image.MouseLeftButtonUp += (o, e) => _selectTestCommand.Execute(testMethod); image.Cursor = Cursors.Hand; image.Tag = coverage.BranchVisitors[groupIndex][index].ToArray(); image.MouseRightButtonDown += (o, e) => e.Handled = true; image.MouseRightButtonUp += OnTestItemRightButtonUp; SharedDictionaryManager.InitializeDictionaries(image.Resources.MergedDictionaries); } Canvas.SetLeft(image, geometry.Bounds.Left); Canvas.SetTop(image, geometry.Bounds.Top); _adornmentLayer.AddAdornment(AdornmentPositioningBehavior.TextRelative, span, null, image, null); left += spacing; index++; } groupIndex++; index = 0; left += spacing; } }
private void AddSequenceAdornment(ITextViewLine line, SnapshotSpan span, LineCoverage coverage, bool isUpToDate) { var rect = new Rect(0d, line.Top, _sequenceCoverageLineWidth, line.Height); var geometry = new RectangleGeometry(rect); geometry.Freeze(); var brush = _brushesAndPens[coverage.SequenceCoverageState].Brush; if (coverage.SequenceCoverageState == CoverageState.Covered && coverage.LineVisitors.Any(p => SelectedTests.Contains(p))) { brush = _selectedBrushAndPen.Brush; } var drawing = new GeometryDrawing(brush, null, geometry); drawing.Freeze(); var drawingImage = new DrawingImage(drawing); drawingImage.Freeze(); var toolTip = new StackPanel(); var header = new TextBlock() { Text = string.Format(Resources.VisitorCount, coverage.VisitCount), TextWrapping = TextWrapping.Wrap }; toolTip.Children.Add(header); var image = new Image() { Source = drawingImage, ToolTip = toolTip, Opacity = isUpToDate ? 1d : _modifiedOpacity }; Canvas.SetLeft(image, geometry.Bounds.Left); Canvas.SetTop(image, geometry.Bounds.Top); SharedDictionaryManager.InitializeDictionaries(image.Resources.MergedDictionaries); if (coverage.LineVisitors.Count > 0) { var description = new TextBlock() { Text = string.Join("\r\n", coverage.LineVisitors.Select(p => p.ShortName)), TextWrapping = TextWrapping.Wrap, Opacity = 0.7d }; toolTip.Children.Add(description); image.Tag = coverage.LineVisitors.ToArray(); image.MouseRightButtonDown += (o, e) => e.Handled = true; image.MouseRightButtonUp += OnTestItemRightButtonUp; image.MouseLeftButtonDown += (o, e) => e.Handled = true; image.MouseLeftButtonUp += (o, e) => _selectTestCommand.Execute(coverage.LineVisitors.First()); image.Cursor = Cursors.Hand; } _adornmentLayer.AddAdornment(AdornmentPositioningBehavior.TextRelative, span, null, image, null); }