private static JiraIssueLineGlyphTag getIssueGlyphTagUnderCursor(IWpfTextView view, IViewTagAggregatorFactoryService tagAggregatorFactory) { Point position = Mouse.GetPosition(view.VisualElement); position = relativeToView(view, position); ITextViewLine line = view.TextViewLines.GetTextViewLineContainingYCoordinate(position.Y); if (line == null) { return(null); } SnapshotPoint?bufferPos = line.GetBufferPositionFromXCoordinate(line.Left); if (!bufferPos.HasValue) { return(null); } ITagAggregator <JiraIssueLineGlyphTag> aggregator = tagAggregatorFactory.CreateTagAggregator <JiraIssueLineGlyphTag>(view); IEnumerable <IMappingTagSpan <JiraIssueLineGlyphTag> > spans = aggregator.GetTags(new SnapshotSpan(new SnapshotPoint(view.TextSnapshot, 0), view.TextSnapshot.Length - 1)); JiraIssueLineGlyphTag textTag = (from span in spans let t = span.Tag where t.Where.Start.GetContainingLine().LineNumber == bufferPos.Value.GetContainingLine().LineNumber select span.Tag).FirstOrDefault(); return(textTag); }
private void showToolTipIfOverIssueGlyph() { JiraIssueLineGlyphTag tag = getIssueGlyphTagUnderCursor(textView, provider.TagAggregatorFactoryService); if (tag == null) { margin.VisualElement.ToolTip = null; margin.VisualElement.ContextMenu = null; return; } ContextMenu contextMenu = new ContextMenu(); string txt; IList <string> keys = tag.IssueKeys; if (keys.Count == 1) { txt = "This line contains issue " + keys[0] + RIGHT_CLICK_FOR_CONTEXT_MENU; addMenuItems(contextMenu, keys[0], true); } else { StringBuilder sb = new StringBuilder(); foreach (var key in keys) { sb.Append(key).Append(", "); MenuItem menuItem = new MenuItem { Header = key }; addMenuItems(menuItem, key, false); contextMenu.Items.Add(menuItem); } txt = sb.Length > 0 ? "This line contains issues: " + sb.ToString(0, sb.Length - 2) + RIGHT_CLICK_FOR_CONTEXT_MENU : null; } margin.VisualElement.ToolTip = txt; margin.VisualElement.ContextMenu = contextMenu; }