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;
            }