private static JiraIssueTextTag getIssueTagUnderCursor(IWpfTextView view, IViewTagAggregatorFactoryService tagAggregatorFactory) { Point position = Mouse.GetPosition(view.VisualElement); position = relativeToView(view, position); var line = view.TextViewLines.GetTextViewLineContainingYCoordinate(position.Y); if (line == null) { return(null); } var bufferPos = line.GetBufferPositionFromXCoordinate(position.X); if (!bufferPos.HasValue) { return(null); } SnapshotPoint?point = view.BufferGraph.MapDownToFirstMatch( new SnapshotPoint(view.TextSnapshot, bufferPos.Value), PointTrackingMode.Positive, snapshot => true, PositionAffinity.Predecessor); if (point == null) { return(null); } ITagAggregator <JiraIssueTextTag> aggregator = tagAggregatorFactory.CreateTagAggregator <JiraIssueTextTag>(view); IEnumerable <IMappingTagSpan <JiraIssueTextTag> > spans = aggregator.GetTags(new SnapshotSpan(new SnapshotPoint(view.TextSnapshot, 0), view.TextSnapshot.Length - 1)); JiraIssueTextTag textTag = (from span in spans let t = span.Tag where t.Where.Start.Position <= point.Value.Position && t.Where.End.Position >= point.Value.Position select span.Tag).FirstOrDefault(); return(textTag); }
public override void PreprocessMouseLeftButtonUp(MouseButtonEventArgs e) { if (!(Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))) { return; } JiraIssueTextTag textTag = getIssueTagUnderCursor(view, provider.TagAggregatorFactoryService); if (textTag == null) { return; } e.Handled = true; AtlassianPanel.Instance.Jira.findAndOpenIssue(textTag.IssueKey, (success, message, ex) => { if (!success) { PlvsUtils.showError(message, ex); } }); }