Example #1
0
        //</Snippet22>

        //<Snippet23>
        public void Add(SnapshotSpan span, string author, string text)
        {
            if (span.Length == 0)
            {
                throw new ArgumentOutOfRangeException("span");
            }
            if (author == null)
            {
                throw new ArgumentNullException("author");
            }
            if (text == null)
            {
                throw new ArgumentNullException("text");
            }

            //Create a comment adornment given the span, author and text.
            CommentAdornment comment = new CommentAdornment(span, author, text);

            //Add it to the list of comments.
            this.comments.Add(comment);

            //Raise the changed event.
            EventHandler <CommentsChangedEventArgs> commentsChanged = this.CommentsChanged;

            if (commentsChanged != null)
            {
                commentsChanged(this, new CommentsChangedEventArgs(comment, null));
            }
        }
Example #2
0
        //</Snippet33>

        //<Snippet34>
        private void OnLayoutChanged(object sender, TextViewLayoutChangedEventArgs e)
        {
            //Get all of the comments that intersect any of the new or reformatted lines of text.
            List <CommentAdornment> newComments = new List <CommentAdornment>();

            //The event args contain a list of modified lines and a NormalizedSpanCollection of the spans of the modified lines.
            //Use the latter to find the comments that intersect the new or reformatted lines of text.
            foreach (Span span in e.NewOrReformattedSpans)
            {
                newComments.AddRange(this.provider.GetComments(new SnapshotSpan(this.view.TextSnapshot, span)));
            }

            //It is possible to get duplicates in this list if a comment spanned 3 lines, and the first and last lines were modified but the middle line was not.
            //Sort the list and skip duplicates.
            newComments.Sort(delegate(CommentAdornment a, CommentAdornment b) { return(a.GetHashCode().CompareTo(b.GetHashCode())); });

            CommentAdornment lastComment = null;

            foreach (CommentAdornment comment in newComments)
            {
                if (comment != lastComment)
                {
                    lastComment = comment;
                    this.DrawComment(comment);
                }
            }
        }
Example #3
0
        //</Snippet34>

        //<Snippet35>
        private void DrawComment(CommentAdornment comment)
        {
            SnapshotSpan span = comment.Span.GetSpan(this.view.TextSnapshot);
            Geometry     g    = this.view.TextViewLines.GetMarkerGeometry(span);

            if (g != null)
            {
                //Find the rightmost coordinate of all the lines that intersect the adornment.
                double maxRight = 0.0;
                foreach (ITextViewLine line in this.view.TextViewLines.GetTextViewLinesIntersectingSpan(span))
                {
                    maxRight = Math.Max(maxRight, line.Right);
                }

                //Create the visualization.
                CommentBlock block = new CommentBlock(maxRight, this.view.ViewportRight, g, comment.Author, comment.Text);

                //Add it to the layer.
                this.layer.AddAdornment(span, comment, block);
            }
        }
Example #4
0
 public CommentsChangedEventArgs(CommentAdornment added, CommentAdornment removed)
 {
     this.CommentAdded   = added;
     this.CommentRemoved = removed;
 }